Merge missed changeset 11 (raptor v2.14 and helium 10.0)
authorjjkang
Wed, 30 Jun 2010 11:35:58 +0800
changeset 607 378360dbbdba
parent 591 22486c9c7b15 (current diff)
parent 606 30b30f9da0b7 (diff)
child 608 690cd13b97a9
Merge missed changeset 11 (raptor v2.14 and helium 10.0)
bintools/elftools/group/bld.inf
bintools/elftools/group/release.txt
e32tools/e32lib/e32image/Makefile.elftran.bak
e32tools/elf2e32/group/elf2e32.mmp
e32tools/elf2e32/group/release.txt
e32tools/elf2e32/include/h_ver.h
e32tools/elf2e32/source/e32imagefile.cpp
e32tools/elf2e32/source/h_utl.h.bak
e32tools/elf2e32/source/parametermanager.cpp
imgtools/buildrom/group/release.txt
imgtools/buildrom/tools/buildrom.pm
imgtools/buildrom/tools/cdf.dtd.bak
imgtools/buildrom/tools/datadriveimage.pm
imgtools/buildrom/tools/featuredatabase.dtd.bak
imgtools/buildrom/tools/featureuids.dtd.bak
imgtools/buildrom/tools/imageContent.dtd.bak
imgtools/imaker/doc/iMaker_User_Guide.pdf
imgtools/imaker/src/imaker.pm
imgtools/imaker/src/imaker_public.mk
imgtools/imglib/group/bld.inf
imgtools/romtools/group/release.txt
imgtools/romtools/rofsbuild/r_driveimage.cpp
imgtools/romtools/rofsbuild/r_driveimage.h
imgtools/romtools/rofsbuild/r_obey.cpp
imgtools/romtools/rofsbuild/r_obey.h
imgtools/romtools/rofsbuild/rofsbuild.cpp
imgtools/romtools/rofsbuild/rofsbuild.mmp
sbsv2/raptor/python/raptor_version.py.bak
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/bin2coff/bin2coff.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,149 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Add a simple coff header to a binary file
+// optionally strip off the first 256 bytes
+// This is primarily for generating an image
+// file that can be downloaded via the ether
+// to cogent using the SmartFirmWare boot rom
+// 
+//
+
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <io.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+// little error functionet
+void error(const char* p)
+{
+	fprintf(stderr, "%s\n", p);
+	exit(1);
+}
+
+// little usage functionet
+void usage(const char* p)
+{
+	fprintf(stderr, "%s\n", p);
+	exit(EXIT_FAILURE);
+}
+
+
+int main(int argc, char* argv[])
+{
+	// check for usage
+	if (argc < 3 || argc > 4)
+		{
+		usage("Usage: bin2coff infile outfile nostrip\nOption nostrip: don't strip off the first 256 bytes");
+		}
+
+	// make sure we are not operating on only one file
+	if (!strcmp(argv[1], argv[2]))
+		{
+		usage("Usage: bin2coff must specify different input and output files");
+		}
+
+	// try to open the input file
+	FILE *pInFile;
+	if((pInFile  = fopen(argv[1], "rb" )) == NULL)
+   		{
+   		error("Cannot open input file");
+   		}
+
+	// open output file
+	FILE *pOutFile;
+	if((pOutFile = fopen(argv[2], "wb") ) == NULL)
+		{
+   		error("Cannot open output file");
+		}
+
+	// strip the 256 long header?
+	// ok, so it's simple, so what
+	bool stripheader = (argc == 3);
+
+	// how big is the input file
+	struct stat filelength;
+	stat(argv[1], &filelength);
+	unsigned long fsize = filelength.st_size;
+	if (stripheader)
+		{
+		fsize -= 256;
+		}
+
+	// write out the coff header to the new file
+	// somewhere to put a simple coff header
+	unsigned char coffhead[0x58] = {0};  // zero all the elements
+
+	// fill in the constant bits
+	// this is supposed to be simple, remember
+	coffhead[1] = 0x0a;
+	coffhead[2] = 0x01;
+	coffhead[0x10] = 0x1c;
+	coffhead[0x12] = 0x0f;
+	coffhead[0x13] = 0xa1;
+	coffhead[0x14] = 0x0b;
+	coffhead[0x15] = 0x01;
+	coffhead[0x26] = 0x40; // entry point 0x00400000
+	coffhead[0x2a] = 0x40;
+	coffhead[0x30] = 0x2e;
+	coffhead[0x31] = 0x74;
+	coffhead[0x32] = 0x65;
+	coffhead[0x33] = 0x78;
+	coffhead[0x34] = 0x74;
+	coffhead[0x3a] = 0x40;
+	coffhead[0x3e] = 0x40;
+	coffhead[0x44] = 0x58;
+	coffhead[0x54] = 0x20;
+
+	// now fill in the text segment size
+	*(int *) (&coffhead[0x18]) = fsize;
+	*(int *) (&coffhead[0x40]) = fsize;
+
+	// write out the new file
+	// first the header
+	int numwritten=0;
+	numwritten = fwrite(coffhead, sizeof(char), 0x58, pOutFile);
+	if (numwritten < 0x58)
+		{
+   		error("The number of items written is less than 0x58");
+		}
+
+	// now the rest of the file
+	if (stripheader)
+		{
+		fpos_t filePositionIndicator = 0x100;
+		if (fsetpos(pInFile, &filePositionIndicator) !=0)
+			{
+			error("The file is not accessible ");
+			}
+		}
+	
+	static const int buffsize = 1024;
+	unsigned char fbuff[buffsize];
+	while (!feof(pInFile))
+	        {
+			int nread = fread(fbuff,sizeof(unsigned char), sizeof(fbuff), pInFile);
+			int nwritten = fwrite(fbuff, sizeof(unsigned char), nread, pOutFile);
+			if (nwritten < nread)
+		        {
+				error("The number of items written is less than number of items read");
+				}
+			}
+   
+	fclose(pOutFile);
+	fclose(pInFile);
+
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/bin2coff/group/bin2coff.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			bin2coff.exe
+TARGETTYPE		exe
+SOURCEPATH	..\..\bin2coff
+SOURCE			bin2coff.cpp
+
+OPTION	GCC -O2
+
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/bin2coff/group/bin2coff.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_bintools_bin2coff
+
+source	\src\tools\build\bintools\bin2coff
+binary	\src\tools\build\bintools\bin2coff\group	all
+exports	\src\tools\build\bintools\bin2coff\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/bin2coff/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+bin2coff.mmp
+
+PRJ_TESTMMPFILES
+
--- a/bintools/elftools/def2dll.pl	Wed Jun 23 17:27:59 2010 +0800
+++ b/bintools/elftools/def2dll.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -33,6 +33,11 @@
 	}	
 }
 
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
 use lib $PerlLibPath;
 use Defutl;
 
@@ -66,6 +71,14 @@
 my $interworking = "${oP}apcs /nointer";
 $interworking = "${oP}apcs /inter" if ($interworkingp);
 
+my $gDelim;
+if ($^O eq "MSWin32") {
+	$gDelim = '\\';
+}
+else {
+	$gDelim = '/';
+}
+
 my @objectFiles;
 
 &main;
@@ -91,7 +104,7 @@
 sub usage( )
 {
         print "\n";
-        print "DEF2DLL -Creates binary objects used to implement the Symbian OS DLL model\n";
+        print "DEF2DLL -Creates binary objects used to implement the Symbian OS DLL model v$MajorVersion.$MinorVersion.$PatchVersion\n";
         print "\n";
         print "Usage: def2dll --deffile=<file> [--path=<dir>] [--bldpath=<dir>] [--import=<file>]  [--linkas=<file>] [--inter] [--export=<file>] [--sym_name_lkup]\n";
 
@@ -103,7 +116,7 @@
         print "\t--linkas=<file>     		: linkas to file name specified\n";
         print "\t--inter                 	: enables interworking on ARM and THUMB\n";
         print "\t--export=<file>			: export to filename\n";
-        print "\t--sym_name_lkup         	: symbol name ordinal number lookupç\n";
+        print "\t--sym_name_lkup         	: symbol name ordinal number lookup\n";
         print "\n";
         exit 1;
 }
@@ -148,8 +161,8 @@
     my $numkeys = keys %symbolIndexMap;
     my $failed = 0;
 
-    open EXPFILE, ">$path\\$expFile.s" or
-		die "Error: can't create $path\\$expFile.s\n";
+    open EXPFILE, ">$path$gDelim$expFile.s" or
+		die "Error: can't create $path$gDelim$expFile.s\n";
 
     print EXPFILE "\tEXPORT __DLL_Export_Table__\n\n";
     print EXPFILE "\tEXPORT |DLL\#\#ExportTable|\n\n";
@@ -204,9 +217,9 @@
     print EXPFILE "\tEND";
     close EXPFILE;
 
-    $failed = system "armasm $floatingpointmodel $interworking -o $path\\$expFile.exp $path\\$expFile.s";
-    unlink ("$path\\$expFile.s") unless $failed;
-    die "Error: cant create $path\\$expFile.exp\n" if $failed;
+    $failed = system "armasm $floatingpointmodel $interworking -o $path$gDelim$expFile.exp $path$gDelim$expFile.s";
+    unlink ("$path$gDelim$expFile.s") unless $failed;
+    die "Error: cant create $path$gDelim$expFile.exp\n" if $failed;
 }
 
 my %DataSymbols = ();
@@ -216,8 +229,8 @@
     my ($bldpath, $dllName) = @_;
     my $FileName = "VtblExports";
 
-    open VTBLFILE, ">$bldpath\\$FileName.s" or
-		die "Error: can't create $bldpath\\$FileName.s\n";
+    open VTBLFILE, ">$bldpath$gDelim$FileName.s" or
+		die "Error: can't create $bldpath$gDelim$FileName.s\n";
 
     print VTBLFILE "\tAREA |.directive|, NOALLOC, READONLY, ALIGN=2\n";
     printf VTBLFILE "\tDCB \"\#\<SYMEDIT\>\#\\n\"\n";
@@ -233,23 +246,23 @@
     print VTBLFILE "\tEND";
     close VTBLFILE;
 
-    my $failed = system "armasm $floatingpointmodel $interworking -o $bldpath\\$FileName.o $bldpath\\$FileName.s";
-    unlink ("$bldpath\\$FileName.s");
-    die "Error: cant create $bldpath\\$FileName.o\n" if $failed;
-    push @objectFiles, "$bldpath\\$FileName.o";
+    my $failed = system "armasm $floatingpointmodel $interworking -o $bldpath$gDelim$FileName.o $bldpath$gDelim$FileName.s";
+    unlink ("$bldpath$gDelim$FileName.s");
+    die "Error: cant create $bldpath$gDelim$FileName.o\n" if $failed;
+    push @objectFiles, "$bldpath$gDelim$FileName.o";
 }
 
 sub genLibFile ($$$$)
 {
     my ($path, $bldpath, $libFile, $dllName) = @_;
-    my $tempFileName = "$bldpath\\$compName";
-    my $viaFileName = sprintf("$bldpath\\_t%x_via_.txt", time);
+    my $tempFileName = "$bldpath$gDelim$compName";
+    my $viaFileName = sprintf("$bldpath${gDelim}_t%x_via_.txt", time);
     my $keyz = keys %symbolIndexMap;
     my $failed = 0;
     my $key;
 
     if ($keyz > 0) {
-		open STUBGEN, "|$ENV{'EPOCROOT'}/epoc32/tools/genstubs" if $exports;
+		open STUBGEN, "|genstubs" if $exports;
 		foreach $key (sort keys %symbolIndexMap) {
 			my $symbol = $symbolIndexMap{$key};
 			my $stubFileName = "$tempFileName-$key";
@@ -263,7 +276,7 @@
 		genVtblExportFile($bldpath, $dllName);
     } else {
 		# create dummy stub so armar creates a .lib for us
-		open STUBGEN, "|$ENV{'EPOCROOT'}/epoc32/tools/genstubs";
+		open STUBGEN, "|genstubs";
 		print STUBGEN "$tempFileName-stub.o $tempFileName##stub $dllName##dummy\n";
 		push @objectFiles, "$tempFileName-stub.o";
     }
@@ -272,7 +285,7 @@
     open VIAFILE, ">$viaFileName" or
 		die "Error: can't create VIA fie $viaFileName\n";
 
-    print VIAFILE "${oP}create \"$path\\$libFile\"\n";
+    print VIAFILE "${oP}create \"$path$gDelim$libFile\"\n";
     my $objectFile;
     foreach $objectFile (@objectFiles) {
 		print VIAFILE "\"$objectFile\"\n";
@@ -282,7 +295,7 @@
     $failed = system( "armar ${oP}via $viaFileName");
     push @objectFiles, $viaFileName;
     unlink @objectFiles;
-    die "Error: can't create $path\\$libFile\n" if $failed;
+    die "Error: can't create $path$gDelim$libFile\n" if $failed;
 }
 
 __END__
--- a/bintools/elftools/group/bld.inf	Wed Jun 23 17:27:59 2010 +0800
+++ b/bintools/elftools/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -25,19 +25,20 @@
 #ifndef TOOLS2_LINUX
 ../elf2inf.pl		/epoc32/tools/elf2inf.pl
 ../def2dll.bat		/epoc32/tools/def2dll.bat
-../def2dll.pl		/epoc32/tools/def2dll.pl
+A
 ../deputil.pl		/epoc32/tools/deputil.pl
 ../deputil.pm		/epoc32/tools/deputil.pm
 #endif
+../def2dll.pl		/epoc32/tools/def2dll.pl
 ../inc/elfdefs.h	SYMBIAN_OS_LAYER_PLATFORM_EXPORT_PATH(tools/elfdefs.h)
 
 
 PRJ_MMPFILES
 #ifndef TOOLS2_LINUX
+getexports
+#endif
+elftran
 genstubs
-getexports
-elftran
-#endif
 elfdump
 
 
--- a/bintools/elftools/group/release.txt	Wed Jun 23 17:27:59 2010 +0800
+++ b/bintools/elftools/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -4,6 +4,11 @@
 NOTESRC_RELEASE_REASON
 ELFtools Release
 
+Version v1.1.0 - def2dll.pl
+===============
+Released by Zheng Shen, 12/06/2010
+    Minor: port def2dll.pl to Linux
+
 Version V02.02 (Build 002)
 ===============
 Released by Zheng Shen, 10/03/2010
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/evalid_test_notes.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,63 @@
+evalid_test_notes.txt
+
+testfiles.zip contains two matching trees, each divided into 
+three sub-trees:
+
+left\ok\...
+left\missing\...
+left\fail\...
+
+right\ok\...
+right\missing\...
+right\fail\...
+
+Running "evalid left\ok right\ok" should produce 100% OK.
+The "ok" trees contain at least one example of each type of file,
+and should grow to illustrate any new form of non-significant
+difference. 
+
+Running "evalid left\missing right\missing" should report
+only failures in the shape of the tree.
+
+Running "evalid left\fail right\fail" should report differences
+in all pairs of files.
+The "fail" trees should grow whenever a new form of significant
+difference is found, so that we can avoid making EVALID too
+tolerant.
+
+
+-------------
+Significant Difference test cases
+
+Most examples are synthetic test cases obtained by copying one or more pairs from
+the ok tree into the fail tree, then modifying the right\fail file to introduce
+a specific type of difference. The files are usually renamed to indicate the
+nature of the difference. Using the pair of files from the ok tree means that the
+files have a collection of non-significant differences in addition to the extra
+difference introduced.
+
+Other cases are copies of real examples which showed a signficant difference.
+
+unknown_format\data\BuildInfo.txt
+
+- simple example of a text file with different contents
+
+unknown_format\ksa\layout.bin
+
+- simple example of a binary file with different contents
+
+SIS_file\release\armi\urel\gdbstub.sis
+
+- stub SIS file, currently not correctly recognised?
+
+Intel_DLL\wins\udeb\C32.dll
+
+- ??? not recorded why this is different yet
+
+Intel_DLL\wins\urel\BAFL.dll
+
+- Compiler generated thunks are laid out in a different order.
+  This is a known problem with Developer Studio which is triggered
+  by building the source from a different location.
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/left_right.reference.log	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+PROBLEM: Directory right\missing\leftonlydir does not exist
+OK: left\ok\ARM_library\arm4\udeb\EEXE.LIB	and right\ok\ARM_library\arm4\udeb\EEXE.LIB  (ARM library)
+OK: left\ok\ARM_library\arm4\urel\ALARMSHARED.LIB	and right\ok\ARM_library\arm4\urel\ALARMSHARED.LIB  (ARM library)
+OK: left\ok\ARM_library\arm4\urel\EEXE.LIB	and right\ok\ARM_library\arm4\urel\EEXE.LIB  (ARM library)
+OK: left\ok\ARM_library\thumb\udeb\EEXE.LIB	and right\ok\ARM_library\thumb\udeb\EEXE.LIB  (ARM library)
+OK: left\ok\ARM_library\thumb\urel\ALARMSHARED.LIB	and right\ok\ARM_library\thumb\urel\ALARMSHARED.LIB  (ARM library)
+OK: left\ok\ARM_library\thumb\urel\EEXE.LIB	and right\ok\ARM_library\thumb\urel\EEXE.LIB  (ARM library)
+OK: left\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL	and right\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL	and right\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL	and right\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL	and right\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: left\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE	and right\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE	and right\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE	and right\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: left\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE	and right\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: left\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL	and right\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL  (E32 DLL)
+OK: left\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL	and right\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL  (E32 DLL)
+OK: left\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL	and right\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL  (E32 DLL)
+OK: left\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL	and right\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL  (E32 DLL)
+OK: left\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE	and right\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE  (E32 EXE)
+OK: left\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE	and right\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE  (E32 EXE)
+OK: left\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE	and right\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE  (E32 EXE)
+OK: left\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE	and right\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE  (E32 EXE)
+OK: left\ok\identical\console.ini	and right\ok\identical\console.ini  (identical)
+OK: left\ok\Intel_DLL\wins\udeb\ALARMSHARED.DLL	and right\ok\Intel_DLL\wins\udeb\ALARMSHARED.DLL  (Intel DLL)
+OK: left\ok\Intel_DLL\wins\urel\ALARMSHARED.DLL	and right\ok\Intel_DLL\wins\urel\ALARMSHARED.DLL  (Intel DLL)
+OK: left\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL	and right\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL  (Intel DLL)
+OK: left\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL	and right\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL  (Intel DLL)
+OK: left\ok\Intel_exe\wins\udeb\E32STRT.EXE	and right\ok\Intel_exe\wins\udeb\E32STRT.EXE  (Intel EXE)
+OK: left\ok\Intel_exe\wins\urel\E32STRT.EXE	and right\ok\Intel_exe\wins\urel\E32STRT.EXE  (Intel EXE)
+OK: left\ok\Intel_exe\winscw\udeb\E32STRT.EXE	and right\ok\Intel_exe\winscw\udeb\E32STRT.EXE  (Intel EXE)
+OK: left\ok\Intel_exe\winscw\urel\E32STRT.EXE	and right\ok\Intel_exe\winscw\urel\E32STRT.EXE  (Intel EXE)
+OK: left\ok\Intel_library\wins\udeb\ALARMSHARED.LIB	and right\ok\Intel_library\wins\udeb\ALARMSHARED.LIB  (Intel library)
+OK: left\ok\Intel_library\wins\udeb\EEXE.LIB	and right\ok\Intel_library\wins\udeb\EEXE.LIB  (Intel library)
+OK: left\ok\Intel_library\wins\urel\EEXE.LIB	and right\ok\Intel_library\wins\urel\EEXE.LIB  (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB	and right\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB  (Intel library)
+OK: left\ok\Intel_library\winscw\udeb\EEXE.LIB	and right\ok\Intel_library\winscw\udeb\EEXE.LIB  (Intel library)
+OK: left\ok\Intel_library\winscw\urel\EEXE.LIB	and right\ok\Intel_library\winscw\urel\EEXE.LIB  (Intel library)
+OK: left\ok\Intel_object\FNTTRAN.exp	and right\ok\Intel_object\FNTTRAN.exp  (Intel object)
+OK: left\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map	and right\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map  (MAP file)
+OK: left\ok\MAP_file\arm4\udeb\E32STRT.EXE.map	and right\ok\MAP_file\arm4\udeb\E32STRT.EXE.map  (MAP file)
+OK: left\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map	and right\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map  (MAP file)
+OK: left\ok\MAP_file\arm4\urel\E32STRT.EXE.map	and right\ok\MAP_file\arm4\urel\E32STRT.EXE.map  (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map	and right\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map  (MAP file)
+OK: left\ok\MAP_file\thumb\udeb\E32STRT.EXE.map	and right\ok\MAP_file\thumb\udeb\E32STRT.EXE.map  (MAP file)
+OK: left\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map	and right\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map  (MAP file)
+OK: left\ok\MAP_file\thumb\urel\E32STRT.EXE.map	and right\ok\MAP_file\thumb\urel\E32STRT.EXE.map  (MAP file)
+OK: left\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map	and right\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map  (identical)
+OK: left\ok\MAP_file\winscw\urel\E32STRT.EXE.map	and right\ok\MAP_file\winscw\urel\E32STRT.EXE.map  (identical)
+OK: left\ok\Preprocessed_text\IRCOMM.rpp	and right\ok\Preprocessed_text\IRCOMM.rpp  (Preprocessed text)
+OK: left\ok\SGML_file\allclasses-frame.html	and right\ok\SGML_file\allclasses-frame.html  (SGML file)
+OK: left\ok\ZIP_file\aifapp_ResourceBundles.jar	and right\ok\ZIP_file\aifapp_ResourceBundles.jar  (ZIP file)
+
+Results of evalid  left  right
+
+1 missing files
+
+MISSING: right\missing\leftonlyfile.txt
+
+30 failed comparisons
+
+FAILED: left\fail\ARM_library\ARM4_symbol.lib	and right\fail\ARM_library\ARM4_symbol.lib  (ARM library)
+FAILED: left\fail\ARM_library\Thumb_symbol.lib	and right\fail\ARM_library\Thumb_symbol.lib  (ARM library)
+FAILED: left\fail\Intel_DLL\wins\udeb\C32.DLL	and right\fail\Intel_DLL\wins\udeb\C32.DLL  (Intel DLL)
+FAILED: left\fail\Intel_DLL\wins\urel\BAFL.DLL	and right\fail\Intel_DLL\wins\urel\BAFL.DLL  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_data.dll	and right\fail\Intel_DLL\winscw_data.dll  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_export.dll	and right\fail\Intel_DLL\winscw_export.dll  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_import.dll	and right\fail\Intel_DLL\winscw_import.dll  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_rdata.dll	and right\fail\Intel_DLL\winscw_rdata.dll  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_text.dll	and right\fail\Intel_DLL\winscw_text.dll  (Intel DLL)
+FAILED: left\fail\Intel_DLL\winscw_uid.dll	and right\fail\Intel_DLL\winscw_uid.dll  (Intel DLL)
+FAILED: left\fail\Intel_EXE\winscw_data.exe	and right\fail\Intel_EXE\winscw_data.exe  (Intel EXE)
+FAILED: left\fail\Intel_EXE\winscw_import.exe	and right\fail\Intel_EXE\winscw_import.exe  (Intel EXE)
+FAILED: left\fail\Intel_EXE\winscw_rdata.exe	and right\fail\Intel_EXE\winscw_rdata.exe  (Intel EXE)
+FAILED: left\fail\Intel_EXE\winscw_text.exe	and right\fail\Intel_EXE\winscw_text.exe  (Intel EXE)
+FAILED: left\fail\Intel_EXE\winscw_uid.exe	and right\fail\Intel_EXE\winscw_uid.exe  (Intel EXE)
+FAILED: left\fail\Intel_library\symbol.lib	and right\fail\Intel_library\symbol.lib  (Intel library)
+FAILED: left\fail\Intel_object\symbol.obj	and right\fail\Intel_object\symbol.obj  (Intel object)
+FAILED: left\fail\MAP_file\offset.map	and right\fail\MAP_file\offset.map  (MAP file)
+FAILED: left\fail\MAP_file\size.map	and right\fail\MAP_file\size.map  (MAP file)
+FAILED: left\fail\MAP_file\symbol.map	and right\fail\MAP_file\symbol.map  (MAP file)
+FAILED: left\fail\MAP_file\winscw_offset.map	and right\fail\MAP_file\winscw_offset.map  (MAP file)
+FAILED: left\fail\MAP_file\winscw_symbol.map	and right\fail\MAP_file\winscw_symbol.map  (MAP file)
+FAILED: left\fail\Preprocessed_text\content.rpp	and right\fail\Preprocessed_text\content.rpp  (Preprocessed text)
+FAILED: left\fail\SGML_file\content.html	and right\fail\SGML_file\content.html  (SGML file)
+FAILED: left\fail\SIS_file\release\armi\urel\gdbstub.sis	and right\fail\SIS_file\release\armi\urel\gdbstub.sis  (SIS file)
+FAILED: left\fail\unknown_format\data\BuildInfo.txt	and right\fail\unknown_format\data\BuildInfo.txt  (unknown format)
+FAILED: left\fail\unknown_format\ksa\layout.bin	and right\fail\unknown_format\ksa\layout.bin  (unknown format)
+FAILED: left\fail\ZIP_file\content.zip	and right\fail\ZIP_file\content.zip  (ZIP file)
+FAILED: left\fail\ZIP_file\order.zip	and right\fail\ZIP_file\order.zip  (ZIP file)
+FAILED: left\fail\ZIP_file\size.zip	and right\fail\ZIP_file\size.zip  (ZIP file)
+
+----------------
+16:03 06/10/2003
+evalid  left  right
+Failed 32 of 83 comparisons
+----------------
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/evalid/right_left.reference.log	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+PROBLEM: Directory left\missing\rightonlydir does not exist
+OK: right\ok\ARM_library\arm4\udeb\EEXE.LIB	and left\ok\ARM_library\arm4\udeb\EEXE.LIB  (ARM library)
+OK: right\ok\ARM_library\arm4\urel\ALARMSHARED.LIB	and left\ok\ARM_library\arm4\urel\ALARMSHARED.LIB  (ARM library)
+OK: right\ok\ARM_library\arm4\urel\EEXE.LIB	and left\ok\ARM_library\arm4\urel\EEXE.LIB  (ARM library)
+OK: right\ok\ARM_library\thumb\udeb\EEXE.LIB	and left\ok\ARM_library\thumb\udeb\EEXE.LIB  (ARM library)
+OK: right\ok\ARM_library\thumb\urel\ALARMSHARED.LIB	and left\ok\ARM_library\thumb\urel\ALARMSHARED.LIB  (ARM library)
+OK: right\ok\ARM_library\thumb\urel\EEXE.LIB	and left\ok\ARM_library\thumb\urel\EEXE.LIB  (ARM library)
+OK: right\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL	and left\ok\Compressed_E32_DLL\arm4\udeb\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: right\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL	and left\ok\Compressed_E32_DLL\arm4\urel\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: right\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL	and left\ok\Compressed_E32_DLL\thumb\udeb\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: right\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL	and left\ok\Compressed_E32_DLL\thumb\urel\ALARMSHARED.DLL  (Uncompressed E32 DLL)
+OK: right\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE	and left\ok\Compressed_E32_EXE\arm4\udeb\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: right\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE	and left\ok\Compressed_E32_EXE\arm4\urel\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: right\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE	and left\ok\Compressed_E32_EXE\thumb\udeb\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: right\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE	and left\ok\Compressed_E32_EXE\thumb\urel\E32STRT.EXE  (Uncompressed E32 EXE)
+OK: right\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL	and left\ok\E32_DLL\arm4\udeb\ALARMSHARED.DLL  (E32 DLL)
+OK: right\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL	and left\ok\E32_DLL\arm4\urel\ALARMSHARED.DLL  (E32 DLL)
+OK: right\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL	and left\ok\E32_DLL\thumb\udeb\ALARMSHARED.DLL  (E32 DLL)
+OK: right\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL	and left\ok\E32_DLL\thumb\urel\ALARMSHARED.DLL  (E32 DLL)
+OK: right\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE	and left\ok\E32_EXE\arm4\udeb\ALARMSERVER.EXE  (E32 EXE)
+OK: right\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE	and left\ok\E32_EXE\arm4\urel\ALARMSERVER.EXE  (E32 EXE)
+OK: right\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE	and left\ok\E32_EXE\thumb\udeb\ALARMSERVER.EXE  (E32 EXE)
+OK: right\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE	and left\ok\E32_EXE\thumb\urel\ALARMSERVER.EXE  (E32 EXE)
+OK: right\ok\identical\console.ini	and left\ok\identical\console.ini  (identical)
+OK: right\ok\Intel_DLL\wins\udeb\ALARMSHARED.DLL	and left\ok\Intel_DLL\wins\udeb\ALARMSHARED.DLL  (Intel DLL)
+OK: right\ok\Intel_DLL\wins\urel\ALARMSHARED.DLL	and left\ok\Intel_DLL\wins\urel\ALARMSHARED.DLL  (Intel DLL)
+OK: right\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL	and left\ok\Intel_DLL\winscw\udeb\ALARMSHARED.DLL  (Intel DLL)
+OK: right\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL	and left\ok\Intel_DLL\winscw\urel\ALARMSHARED.DLL  (Intel DLL)
+OK: right\ok\Intel_EXE\wins\udeb\E32STRT.EXE	and left\ok\Intel_EXE\wins\udeb\E32STRT.EXE  (Intel EXE)
+OK: right\ok\Intel_EXE\wins\urel\E32STRT.EXE	and left\ok\Intel_EXE\wins\urel\E32STRT.EXE  (Intel EXE)
+OK: right\ok\Intel_EXE\winscw\udeb\E32STRT.EXE	and left\ok\Intel_EXE\winscw\udeb\E32STRT.EXE  (Intel EXE)
+OK: right\ok\Intel_EXE\winscw\urel\E32STRT.EXE	and left\ok\Intel_EXE\winscw\urel\E32STRT.EXE  (Intel EXE)
+OK: right\ok\Intel_library\wins\udeb\ALARMSHARED.LIB	and left\ok\Intel_library\wins\udeb\ALARMSHARED.LIB  (Intel library)
+OK: right\ok\Intel_library\wins\udeb\EEXE.LIB	and left\ok\Intel_library\wins\udeb\EEXE.LIB  (Intel library)
+OK: right\ok\Intel_library\wins\urel\EEXE.LIB	and left\ok\Intel_library\wins\urel\EEXE.LIB  (Intel library)
+OK: right\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB	and left\ok\Intel_library\winscw\udeb\ALARMSHARED.LIB  (Intel library)
+OK: right\ok\Intel_library\winscw\udeb\EEXE.LIB	and left\ok\Intel_library\winscw\udeb\EEXE.LIB  (Intel library)
+OK: right\ok\Intel_library\winscw\urel\EEXE.LIB	and left\ok\Intel_library\winscw\urel\EEXE.LIB  (Intel library)
+OK: right\ok\Intel_object\FNTTRAN.exp	and left\ok\Intel_object\FNTTRAN.exp  (Intel object)
+OK: right\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map	and left\ok\MAP_file\arm4\udeb\ALARMSHARED.DLL.map  (MAP file)
+OK: right\ok\MAP_file\arm4\udeb\E32STRT.EXE.map	and left\ok\MAP_file\arm4\udeb\E32STRT.EXE.map  (MAP file)
+OK: right\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map	and left\ok\MAP_file\arm4\urel\ALARMSHARED.DLL.map  (MAP file)
+OK: right\ok\MAP_file\arm4\urel\E32STRT.EXE.map	and left\ok\MAP_file\arm4\urel\E32STRT.EXE.map  (MAP file)
+OK: right\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map	and left\ok\MAP_file\thumb\udeb\ALARMSHARED.DLL.map  (MAP file)
+OK: right\ok\MAP_file\thumb\udeb\E32STRT.EXE.map	and left\ok\MAP_file\thumb\udeb\E32STRT.EXE.map  (MAP file)
+OK: right\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map	and left\ok\MAP_file\thumb\urel\ALARMSHARED.DLL.map  (MAP file)
+OK: right\ok\MAP_file\thumb\urel\E32STRT.EXE.map	and left\ok\MAP_file\thumb\urel\E32STRT.EXE.map  (MAP file)
+OK: right\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map	and left\ok\MAP_file\winscw\urel\ALARMSHARED.DLL.map  (identical)
+OK: right\ok\MAP_file\winscw\urel\E32STRT.EXE.map	and left\ok\MAP_file\winscw\urel\E32STRT.EXE.map  (identical)
+OK: right\ok\Preprocessed_text\IRCOMM.rpp	and left\ok\Preprocessed_text\IRCOMM.rpp  (Preprocessed text)
+OK: right\ok\SGML_file\allclasses-frame.html	and left\ok\SGML_file\allclasses-frame.html  (SGML file)
+OK: right\ok\ZIP_file\aifapp_ResourceBundles.jar	and left\ok\ZIP_file\aifapp_ResourceBundles.jar  (ZIP file)
+
+Results of evalid  right  left
+
+1 missing files
+
+MISSING: left\missing\rightonlyfile.txt
+
+30 failed comparisons
+
+FAILED: right\fail\ARM_library\ARM4_symbol.lib	and left\fail\ARM_library\ARM4_symbol.lib  (ARM library)
+FAILED: right\fail\ARM_library\Thumb_symbol.lib	and left\fail\ARM_library\Thumb_symbol.lib  (ARM library)
+FAILED: right\fail\Intel_DLL\wins\udeb\C32.DLL	and left\fail\Intel_DLL\wins\udeb\C32.DLL  (Intel DLL)
+FAILED: right\fail\Intel_DLL\wins\urel\BAFL.DLL	and left\fail\Intel_DLL\wins\urel\BAFL.DLL  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_data.dll	and left\fail\Intel_DLL\winscw_data.dll  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_export.dll	and left\fail\Intel_DLL\winscw_export.dll  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_import.dll	and left\fail\Intel_DLL\winscw_import.dll  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_rdata.dll	and left\fail\Intel_DLL\winscw_rdata.dll  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_text.dll	and left\fail\Intel_DLL\winscw_text.dll  (Intel DLL)
+FAILED: right\fail\Intel_DLL\winscw_uid.dll	and left\fail\Intel_DLL\winscw_uid.dll  (Intel DLL)
+FAILED: right\fail\Intel_EXE\winscw_data.exe	and left\fail\Intel_EXE\winscw_data.exe  (Intel EXE)
+FAILED: right\fail\Intel_EXE\winscw_import.exe	and left\fail\Intel_EXE\winscw_import.exe  (Intel EXE)
+FAILED: right\fail\Intel_EXE\winscw_rdata.exe	and left\fail\Intel_EXE\winscw_rdata.exe  (Intel EXE)
+FAILED: right\fail\Intel_EXE\winscw_text.exe	and left\fail\Intel_EXE\winscw_text.exe  (Intel EXE)
+FAILED: right\fail\Intel_EXE\winscw_uid.exe	and left\fail\Intel_EXE\winscw_uid.exe  (Intel EXE)
+FAILED: right\fail\Intel_library\symbol.lib	and left\fail\Intel_library\symbol.lib  (Intel library)
+FAILED: right\fail\Intel_object\symbol.obj	and left\fail\Intel_object\symbol.obj  (Intel object)
+FAILED: right\fail\MAP_file\offset.map	and left\fail\MAP_file\offset.map  (MAP file)
+FAILED: right\fail\MAP_file\size.map	and left\fail\MAP_file\size.map  (MAP file)
+FAILED: right\fail\MAP_file\symbol.map	and left\fail\MAP_file\symbol.map  (MAP file)
+FAILED: right\fail\MAP_file\winscw_offset.map	and left\fail\MAP_file\winscw_offset.map  (MAP file)
+FAILED: right\fail\MAP_file\winscw_symbol.map	and left\fail\MAP_file\winscw_symbol.map  (MAP file)
+FAILED: right\fail\Preprocessed_text\content.rpp	and left\fail\Preprocessed_text\content.rpp  (Preprocessed text)
+FAILED: right\fail\SGML_file\content.html	and left\fail\SGML_file\content.html  (SGML file)
+FAILED: right\fail\SIS_file\release\armi\urel\gdbstub.sis	and left\fail\SIS_file\release\armi\urel\gdbstub.sis  (SIS file)
+FAILED: right\fail\unknown_format\data\BuildInfo.txt	and left\fail\unknown_format\data\BuildInfo.txt  (unknown format)
+FAILED: right\fail\unknown_format\ksa\layout.bin	and left\fail\unknown_format\ksa\layout.bin  (unknown format)
+FAILED: right\fail\ZIP_file\content.zip	and left\fail\ZIP_file\content.zip  (ZIP file)
+FAILED: right\fail\ZIP_file\order.zip	and left\fail\ZIP_file\order.zip  (ZIP file)
+FAILED: right\fail\ZIP_file\size.zip	and left\fail\ZIP_file\size.zip  (ZIP file)
+
+----------------
+16:03 06/10/2003
+evalid  right  left
+Failed 32 of 83 comparisons
+----------------
+
Binary file bintools/evalid/testfiles.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+pe_dump.mmp 
+pediff.mmp
+petran.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/group/pe_dump.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+TARGET			pe_dump.exe
+TARGETTYPE		exe
+SOURCEPATH		../pe_dump
+SOURCE			pe_dump.cpp
+
+USERINCLUDE ../../../imgtools/imglib/inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+OPTION MSVC /GX
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/group/pediff.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,38 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+target			pediff.exe
+targettype		exe
+sourcepath	../../../imgtools/imglib/e32uid
+source			e32uid.cpp
+sourcepath	../../../imgtools/imglib/host
+source			h_mem.cpp h_utl.cpp
+sourcepath	../pediff
+source			pediff.cpp
+sourcepath	../../../imgtools/imglib/e32image
+source			e32image.cpp
+sourcepath	../../../imgtools/imglib/e32image/deflate
+source			decode.cpp encode.cpp deflate.cpp inflate.cpp panic.cpp
+source			compress.cpp
+sourcepath	../../../imgtools/imglib/compress
+source			pagedcompress.cpp byte_pair.cpp
+
+userinclude     ../../../imgtools/imglib/compress
+USERINCLUDE ../../../imgtools/imglib/inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+ 
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/group/petools.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_bintools_petools
+
+source          /src/tools/build/bintools/petools
+exports         /src/tools/build/bintools/petools/group
+binary          /src/tools/build/bintools/petools/group all
+
+notes_source	\component_defs\release.src
+
+ipr T 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/group/petran.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+macro		__SUPPORT_PE_FILES__
+
+target			petran.exe
+targettype		exe
+sourcepath	../../../imgtools/imglib/e32uid
+source			e32uid.cpp
+sourcepath	../../../imgtools/imglib/host
+source			h_file.cpp h_mem.cpp h_utl.cpp
+sourcepath	../pefile
+source			pe_file.cpp pe_imp.cpp pe_reloc.cpp pe_tran.cpp pe_utl.cpp
+sourcepath	../../../imgtools/imglib/e32image
+source			e32image.cpp tr_main.cpp imgdump.cpp
+sourcepath	../../../imgtools/imglib/e32image/deflate
+source			decode.cpp encode.cpp deflate.cpp inflate.cpp panic.cpp compress.cpp
+sourcepath  	../../../imgtools/imglib/compress
+source			byte_pair.cpp pagedCompress.cpp
+
+userinclude     ../../../imgtools/imglib/compress
+USERINCLUDE ../../../imgtools/imglib/inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+USERINCLUDE ../compress
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pe_dump/pe_dump.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,460 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32def.h>
+#include <e32def_private.h>
+#include <e32err.h>
+
+#include "h_ver.h"
+#include "pe_defs.h"
+#include <sys/stat.h>
+
+#if defined(__MSVCDOTNET__) || defined (__TOOLS2__)
+ #include <iostream>
+ #include <iomanip>
+ #include <fstream>
+ #include <string>
+ using namespace std;
+#else //__MSVCDOTNET__
+ #include <iostream.h>
+ #include <iomanip.h>
+ #include <fstream.h>
+ #include <string.h>
+#endif //__MSVCDOTNET__
+
+#include <stdio.h>
+
+const int KDiffIdentical=0;
+const int KDiffDifferent=2;
+
+class PeFile
+	{
+public:
+	PeFile();
+	~PeFile();
+	int Open(char *aFileName);
+	void Close();
+	PIMAGE_DOS_HEADER DosHeader();
+	PIMAGE_NT_HEADERS Headers();
+	PIMAGE_SECTION_HEADER SectionHeaders();
+	char *LoadSection(PIMAGE_SECTION_HEADER aSectionHeader);
+	int NumberOfSections();
+	char *LoadExtraData(int aOffsetToExtraData, TUint aFileSize);
+	
+	int Errno();  // Should be invoked only if previous call of PeFile's 
+	              // member function returns incorrectly
+	int Errno(int aErrno);  // Assign error number for special purpose.
+public:
+	fstream iFile;
+	PIMAGE_DOS_HEADER iDosHeader;
+	PIMAGE_NT_HEADERS iHeaders;
+	PIMAGE_SECTION_HEADER iSectionHeaders;
+private:
+	int errnumber;
+	};
+
+PeFile::PeFile()
+	//: iDosHeader(NULL), iHeaders(NULL), iSectionHeaders(NULL), errno(KErrNone)
+	//commented out as SBSv2 reports error: anachronistic old-style base class initializer
+{
+	iDosHeader      = NULL    ;
+	iHeaders        = NULL    ;
+	iSectionHeaders = NULL    ;
+	errnumber           = KErrNone;
+
+	return;
+}
+
+PeFile::~PeFile()
+	{
+	delete iDosHeader;
+	delete iHeaders;
+	delete [] iSectionHeaders;
+	}
+
+int PeFile::Open(char *aFileName)
+{
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+	iFile.open(aFileName, ios::in | ios::binary);
+#else //!__MSVCDOTNET__
+	iFile.open(aFileName, ios::in | ios::binary | ios::nocreate);
+#endif //__MSVCDOTNET__
+	if (!iFile.is_open())
+	{
+		errnumber = KErrNotFound;
+		return KErrNotFound;
+	}
+	return KErrNone;
+}
+
+void PeFile::Close()
+	{
+	iFile.close();
+	}
+
+
+PIMAGE_DOS_HEADER PeFile::DosHeader()
+	{
+	if (iDosHeader)
+		return iDosHeader;
+
+	iDosHeader=new IMAGE_DOS_HEADER;
+	if (!iDosHeader) {
+		errnumber = KErrNoMemory;
+		return NULL;
+	}
+
+	memset(iDosHeader, 0, sizeof(IMAGE_DOS_HEADER));
+
+	iFile.seekg(0);
+	iFile.read((char *)iDosHeader, sizeof(IMAGE_DOS_HEADER));
+	if (iDosHeader->e_magic!=IMAGE_DOS_SIGNATURE) {
+		errnumber = KErrCorrupt;
+		return NULL;
+	}
+	return iDosHeader;
+	}
+
+PIMAGE_NT_HEADERS PeFile::Headers()
+	{
+	if (iHeaders)
+		return iHeaders;
+	PIMAGE_DOS_HEADER d=DosHeader();
+	if (d==NULL)
+		return NULL;
+
+	iHeaders=new IMAGE_NT_HEADERS;
+	if (!iHeaders) {
+		errnumber = KErrNoMemory;
+		return NULL;
+	}
+
+	memset(iHeaders, 0, sizeof(IMAGE_NT_HEADERS));
+
+	iFile.seekg(d->e_lfanew);
+	if (iFile.eof()) {
+		errnumber = KErrCorrupt;  // File size is too small.
+		return NULL;
+	}
+
+	iFile.read((char *)iHeaders, sizeof(IMAGE_NT_HEADERS));
+	return iHeaders;
+	}
+
+PIMAGE_SECTION_HEADER PeFile::SectionHeaders()
+	{
+	if (iSectionHeaders)
+		return iSectionHeaders;
+	PIMAGE_NT_HEADERS h=Headers();
+	if (h==NULL) {
+		errnumber = KErrNoMemory;
+		return NULL;
+	}
+
+	int numSec;
+	if ((numSec = NumberOfSections()) < 0) {
+		return NULL;
+	}
+	else {
+		iSectionHeaders=new IMAGE_SECTION_HEADER [numSec];
+		if (!iSectionHeaders) {
+			errnumber = KErrNoMemory;
+			return NULL;
+		}
+	}
+
+	iFile.seekg(DosHeader()->e_lfanew+sizeof(IMAGE_NT_HEADERS));
+	int i=sizeof(IMAGE_SECTION_HEADER)*numSec;
+	iFile.read((char *)iSectionHeaders, i);
+	if (iFile.gcount() != i) {  // The size of header is incorrect.
+		printf("Error: Cannot load section headers in offset: 0x%x \n", 
+			(int) (DosHeader()->e_lfanew + sizeof(IMAGE_NT_HEADERS)));
+		errnumber = KErrCorrupt;
+		return NULL;
+	}
+
+	return iSectionHeaders;
+	}
+
+int PeFile::NumberOfSections()
+	{
+	if (Headers()) 
+		return iHeaders->FileHeader.NumberOfSections;
+	else
+		return -1;
+	}
+
+char *PeFile::LoadSection(PIMAGE_SECTION_HEADER h)
+	{
+	char *section=new char [h->SizeOfRawData];
+	if (section==NULL){
+		errnumber = KErrNoMemory;
+		return NULL;
+	}
+
+	try
+	{
+	memset(section, 0, h->SizeOfRawData);
+	}
+	catch(...)
+	{
+	}
+
+	iFile.seekg(h->PointerToRawData);
+	iFile.read(section, h->SizeOfRawData);
+	
+	// Guarantee we have loaded the section correctly.
+	unsigned int actNum = iFile.gcount();
+	if (actNum != h->SizeOfRawData) { // The size of section is incorrect.
+		printf("Error: Cannot load section in offset: 0x%x \n", 
+			(int)h->PointerToRawData);
+		errnumber = KErrCorrupt;
+		return NULL;
+	}
+
+	return section;
+	}
+
+char* PeFile::LoadExtraData(int aOffset, TUint aFileSize)
+	{
+	TUint sizeOfExtraData = 0;
+	if(aFileSize >= (TUint)aOffset)
+		sizeOfExtraData=aFileSize-aOffset;
+	if(sizeOfExtraData>0){
+		char* buffer=new char [sizeOfExtraData];
+		if (!buffer) {
+			errnumber = KErrNoMemory;
+			return NULL;
+		}
+
+		memset(buffer, 0, sizeOfExtraData);
+		iFile.seekg(aOffset);
+		iFile.read(buffer, sizeOfExtraData); // Should be OK if the file size is correct.
+
+		// Guarantee we have loaded the data correctly.
+		unsigned int actNum = iFile.gcount();
+		if (actNum != sizeOfExtraData){ // Shouldn't be here is the file size is correct.
+			printf("Error: Cannot load extra section in offset: 0x%x \n", aOffset);
+			errnumber = KErrCorrupt;
+			return NULL;
+		}
+
+		return buffer;
+	}
+	else {
+		errnumber = KErrCorrupt;
+		return NULL;
+	}
+		
+}
+
+int PeFile::Errno() {
+	return errnumber;
+}
+
+int PeFile::Errno(int aErrno) {
+	return (errnumber = aErrno);
+}
+
+
+void dump(TUint *aData, TInt aLength)
+	{
+	TUint *p=aData;
+	TInt i=0;
+	char line[256];
+	unsigned char *cp=(unsigned char*)aData;
+	TInt j=0;
+	memset(line,' ',sizeof(line));
+	while (i<aLength)
+		{
+		TInt ccount=0;
+		char* linep=&line[8*9+2];
+		printf("%06x:", i);
+		while (i<aLength && ccount<8)
+			{
+			printf(" %08x", *p++);
+			i+=4;
+			ccount++;
+			for (j=0; j<4; j++)
+				{
+				unsigned char c=*cp++;
+				if (c<32 || c>127)
+					{
+					c = '.';
+					}
+				*linep++ = c;
+				}
+			}
+		*linep='\0';
+		printf("%s\n", line+(ccount*9));
+		}
+	}
+
+int pecmp(char *aFileName)
+	{
+
+	PeFile peFile;
+	if (peFile.Open(aFileName)!=KErrNone)
+		{
+		cout << "Cannot open file '"<<aFileName<<"' for input.\n";
+		return KErrNotFound;
+		}
+
+	PIMAGE_DOS_HEADER dosHeader=peFile.DosHeader();
+	if (dosHeader==NULL)
+	{
+		switch(peFile.Errno()){
+		case KErrNoMemory:
+			cout << "Error:  Out of memory\n";
+			return KErrNoMemory;
+		default:
+			cout << aFileName << " does not have a valid DOS header.\n";
+		}
+		return KErrGeneral;
+	}
+
+	PIMAGE_NT_HEADERS headers=peFile.Headers();
+	if (headers==NULL)
+	{
+		switch(peFile.Errno()){
+		case KErrNoMemory:
+			cout << "Error:  Out of memory\n";
+			return KErrNoMemory;
+		default:
+			cout << aFileName << " is too small to be a PE file.\n";
+		}
+		return KErrGeneral;
+	}
+
+	headers->FileHeader.TimeDateStamp=0;
+	headers->OptionalHeader.CheckSum = 0; // Fix for TOOLS2 
+
+	printf("NT Headers:\n");
+	dump((TUint*)headers, sizeof(IMAGE_NT_HEADERS));
+
+	int numberofsections=peFile.NumberOfSections();
+	if (numberofsections==-1)
+		{
+		cout << "Not a valid PE file.\n";
+		return KErrGeneral;
+		}
+
+	PIMAGE_SECTION_HEADER sectionheaders=peFile.SectionHeaders();
+
+	printf("Section Headers:\n");
+	dump((TUint*)sectionheaders, sizeof(IMAGE_SECTION_HEADER)*peFile.NumberOfSections());
+
+	TUint exportDirVa=headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
+	TUint debugDirVa=headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
+	int SizeOfHeaders=headers->OptionalHeader.SizeOfHeaders;
+	int offsetToExtraData=0;
+	int i;
+	for (i=0; i<numberofsections; i++)
+		{
+		PIMAGE_SECTION_HEADER h=&sectionheaders[i];
+		if(h->SizeOfRawData == 0)
+		{
+			continue;
+		}
+		char *section=peFile.LoadSection(h);
+		if (section==NULL)
+		{
+			switch(peFile.Errno()){
+			case KErrNoMemory:
+				cout << "Error:  Out of memory\n";
+				return KErrNoMemory;
+			default:
+				cout << "Not a valid PE file.\n";
+			}
+			return KErrGeneral;
+		}
+		char name[9];
+		for (int j=0; j<9; j++)
+			name[j]=h->Name[j];
+		name[8]=0;
+
+		if (debugDirVa>=h->VirtualAddress && debugDirVa<h->VirtualAddress+h->SizeOfRawData)
+			{
+			// Debug data in this section
+			PIMAGE_DEBUG_DIRECTORY dd=(PIMAGE_DEBUG_DIRECTORY)(section+debugDirVa-h->VirtualAddress);
+			TInt debugDirSize=headers->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
+			while (debugDirSize>0)
+				{
+				dd->TimeDateStamp=0;
+				// size & location in file of debug data is not significant
+				// unless it's also mapped (AddressOfRawData != 0). If that's
+				// true, then the data will be visible in one of the sections
+				// anyway...
+				dd->SizeOfData=0;
+				dd->PointerToRawData=0;
+				dd++;
+				debugDirSize-=sizeof(IMAGE_DEBUG_DIRECTORY);
+				}
+			}
+		if (exportDirVa>=h->VirtualAddress && exportDirVa<h->VirtualAddress+h->SizeOfRawData)
+			{
+			// Export directory in this section
+			PIMAGE_EXPORT_DIRECTORY ed=(PIMAGE_EXPORT_DIRECTORY)(section+exportDirVa-h->VirtualAddress);
+			ed->TimeDateStamp=0;
+			}
+		if (strcmp(".rsrc",name)==0)
+			{
+			int *t=(int *)(section+4);
+			*t=0;
+			}
+
+		offsetToExtraData=offsetToExtraData+h->SizeOfRawData;
+		printf("Raw data:\n");
+		dump((TUint*)section, h->SizeOfRawData);
+
+		delete section;
+		}
+	struct stat buf;
+	stat (aFileName,&buf);
+	TUint fileSize=buf.st_size;
+	offsetToExtraData=offsetToExtraData+SizeOfHeaders;
+	TUint sizeOfExtraData = 0;
+	if(buf.st_size >= offsetToExtraData)
+		sizeOfExtraData=buf.st_size-offsetToExtraData;
+	char* extraData=peFile.LoadExtraData(offsetToExtraData, fileSize);
+	if(sizeOfExtraData>0){
+		char* nsisSign;
+		nsisSign=extraData+8;
+		if(strncmp (nsisSign,"NullsoftInst",12) == 0){
+			printf("\n\n Extra Data:\n");
+			dump((TUint*)extraData, sizeOfExtraData);
+		}
+	}
+	peFile.Close();
+	return KErrNone;
+	}
+
+int main(int argc, char *argv[])
+	{
+	int r=KErrArgument;
+	if (argc==2)
+		{
+		r=pecmp(argv[1]);
+		}
+	if (r==KErrArgument)
+		{
+		cout << "\nPE_DUMP - PE file dumper V";
+		cout << MajorVersion << '.' << setfill('0') << setw(2) << MinorVersion;
+		cout << '(' << setw(3) << Build << ")\n";
+		cout << Copyright;
+		cout << "Syntax: "<<argv[0]<<" pefile\n";
+		}
+	return r;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pediff/pediff.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,388 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "e32image.h"
+
+#include "h_ver.h"
+#include "h_utl.h"
+#include "pe_defs.h"
+
+#ifdef __MSVCDOTNET__
+ #include <fstream>
+ #include <iomanip>
+ #include <string>
+ using namespace std;
+#else //!__MSVCDOTNET__
+ #include <fstream.h>
+ #include <iomanip.h>
+ #include <string.h>
+#endif //__MSVCDOTNET__
+
+const int KDiffIdentical=0;
+const int KDiffDifferent=2;
+
+class PeFile
+	{
+public:
+	PeFile();
+	~PeFile();
+	int Open(char *aFileName);
+	void Close();
+	PIMAGE_DOS_HEADER DosHeader();
+	PIMAGE_NT_HEADERS Headers();
+	PIMAGE_SECTION_HEADER SectionHeaders();
+	char *LoadSection(PIMAGE_SECTION_HEADER aSectionHeader);
+	int NumberOfSections();
+public:
+	fstream iFile;
+	PIMAGE_DOS_HEADER iDosHeader;
+	PIMAGE_NT_HEADERS iHeaders;
+	PIMAGE_SECTION_HEADER iSectionHeaders;
+	};
+
+PeFile::PeFile()
+	: iDosHeader(NULL), iHeaders(NULL), iSectionHeaders(NULL)
+	{}
+
+PeFile::~PeFile()
+	{
+	
+	delete iDosHeader;
+	delete iHeaders;
+	delete [] iSectionHeaders;
+	}
+
+int PeFile::Open(char *aFileName)
+	{
+	iFile.open(aFileName, ios::in | ios::binary);
+	if (!iFile.is_open())
+		return KErrNotFound;
+	return KErrNone;
+	}
+
+void PeFile::Close()
+	{
+
+	iFile.close();
+	}
+
+
+PIMAGE_DOS_HEADER PeFile::DosHeader()
+	{
+	if (iDosHeader)
+		return iDosHeader;
+	iDosHeader=new IMAGE_DOS_HEADER;
+	iFile.seekg(0);
+	iFile.read((char *)iDosHeader, sizeof(IMAGE_DOS_HEADER));
+	if (iDosHeader->e_magic!=IMAGE_DOS_SIGNATURE)
+		return NULL;
+	return iDosHeader;
+	}
+
+PIMAGE_NT_HEADERS PeFile::Headers()
+	{
+	if (iHeaders)
+		return iHeaders;
+	PIMAGE_DOS_HEADER d=DosHeader();
+	if (d==NULL)
+		return NULL;
+	iHeaders=new IMAGE_NT_HEADERS;
+	iFile.seekg(d->e_lfanew);
+	if (iFile.eof())
+		return NULL;
+	iFile.read((char *)iHeaders, sizeof(IMAGE_NT_HEADERS));
+	return iHeaders;
+	}
+
+PIMAGE_SECTION_HEADER PeFile::SectionHeaders()
+	{
+	if (iSectionHeaders)
+		return iSectionHeaders;
+	PIMAGE_NT_HEADERS h=Headers();
+	if (h==NULL)
+		return NULL;
+	iSectionHeaders=new IMAGE_SECTION_HEADER [NumberOfSections()];
+	iFile.seekg(DosHeader()->e_lfanew+sizeof(IMAGE_NT_HEADERS));
+	int i=sizeof(IMAGE_SECTION_HEADER)*NumberOfSections();
+	iFile.read((char *)iSectionHeaders, i);
+	return iSectionHeaders;
+	}
+
+int PeFile::NumberOfSections()
+	{
+	if (Headers())
+		return iHeaders->FileHeader.NumberOfSections;
+	else
+		return -1;
+	}
+
+char *PeFile::LoadSection(PIMAGE_SECTION_HEADER h)
+	{
+	char *section=new char [h->SizeOfRawData];
+	memset(section, 0, h->SizeOfRawData);
+	if (section==NULL)
+		return NULL;
+	iFile.seekg(h->PointerToRawData);
+	iFile.read(section, h->SizeOfRawData);
+	return section;
+	}
+
+int pecmp(char *aFileName1, char *aFileName2)
+	{
+
+	PeFile file1, file2;
+	if (file1.Open(aFileName1)!=KErrNone)
+		{
+		cout << "Cannot open file '"<<aFileName1<<"' for input.\n";
+		return KErrNotFound;
+		}
+	if (file2.Open(aFileName2)!=KErrNone)
+		{
+		cout << "Cannot open file '"<<aFileName2<<"' for input.\n";
+		return KErrNotFound;
+		}
+
+	PIMAGE_DOS_HEADER dosheader1=file1.DosHeader();
+	if (dosheader1==NULL)
+		{
+		cout << aFileName1 << " does not have a valid DOS header.\n";
+		return KErrGeneral;
+		}
+	PIMAGE_DOS_HEADER dosheader2=file2.DosHeader();
+	if (dosheader2==NULL)
+		{
+		cout << aFileName2 << " does not have a valid DOS header.\n";
+		return KErrGeneral;
+		}
+
+	PIMAGE_NT_HEADERS headers1=file1.Headers();
+	if (headers1==NULL)
+		{
+		cout << aFileName1 << " is too small to be a PE file.\n";
+		return KErrGeneral;
+		}
+	PIMAGE_NT_HEADERS headers2=file2.Headers();
+	if (headers2==NULL)
+		{
+		cout << aFileName2 << " is too small to be a PE file.\n";
+		return KErrGeneral;
+		}
+
+	int sameTime=(headers1->FileHeader.TimeDateStamp==headers2->FileHeader.TimeDateStamp);
+	headers1->FileHeader.TimeDateStamp=0;
+	headers2->FileHeader.TimeDateStamp=0;
+
+	int r=memcmp(headers1, headers2, sizeof(IMAGE_NT_HEADERS));
+	if (r)
+		{
+		cout << "PE file headers are different.\n";
+		return KDiffDifferent;
+		}
+
+	PIMAGE_SECTION_HEADER sectionheaders1=file1.SectionHeaders();
+	PIMAGE_SECTION_HEADER sectionheaders2=file2.SectionHeaders();
+	// file one and two have the same number of sections
+	int numberofsections=file1.NumberOfSections();
+	if (numberofsections==-1)
+		{
+		cout << "Not a valid PE file.\n";
+		return KErrGeneral;
+		}
+	r=memcmp(sectionheaders1, sectionheaders2, sizeof(IMAGE_SECTION_HEADER)*file1.NumberOfSections());
+	if (r)
+		{
+		cout << "The files are different:  PE section headers are different.\n";
+		return KDiffDifferent;
+		}
+
+	TUint exportDirVa=headers1->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
+	TUint debugDirVa=headers1->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].VirtualAddress;
+
+	int i;
+	for (i=0; i<numberofsections; i++)
+		{
+		PIMAGE_SECTION_HEADER h=&sectionheaders1[i];
+		char *section1=file1.LoadSection(h);
+		char *section2=file2.LoadSection(h);
+		if ((section1==NULL) || (section2==NULL))
+			{
+			cout << "Error:  Out of memory\n";
+			return KErrNoMemory;
+			}
+		char name[9];
+		for (int j=0; j<9; j++)
+			name[j]=h->Name[j];
+		name[8]=0;
+
+		if (debugDirVa>=h->VirtualAddress && debugDirVa<h->VirtualAddress+h->SizeOfRawData)
+			{
+			// Debug data in this section
+			PIMAGE_DEBUG_DIRECTORY dd1=(PIMAGE_DEBUG_DIRECTORY)(section1+debugDirVa-h->VirtualAddress);
+			PIMAGE_DEBUG_DIRECTORY dd2=(PIMAGE_DEBUG_DIRECTORY)(section2+debugDirVa-h->VirtualAddress);
+			TInt debugDirSize=headers1->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_DEBUG].Size;
+			while (debugDirSize>0)
+				{
+				if (sameTime)
+					sameTime=(dd1->TimeDateStamp==dd2->TimeDateStamp);
+				dd1->TimeDateStamp=0;
+				dd2->TimeDateStamp=0;
+				// size & location in file of debug data is not significant
+				// unless it's also mapped (AddressOfRawData != 0). If that's
+				// true, then the data will be visible in one of the sections
+				// anyway...
+				dd1->SizeOfData=0;
+				dd2->SizeOfData=0;
+				dd1->PointerToRawData=0;
+				dd2->PointerToRawData=0;
+				dd1++;
+				dd2++;
+				debugDirSize-=sizeof(IMAGE_DEBUG_DIRECTORY);
+				}
+			}
+		if (exportDirVa>=h->VirtualAddress && exportDirVa<h->VirtualAddress+h->SizeOfRawData)
+			{
+			// Export directory in this section
+			PIMAGE_EXPORT_DIRECTORY ed1=(PIMAGE_EXPORT_DIRECTORY)(section1+exportDirVa-h->VirtualAddress);
+			PIMAGE_EXPORT_DIRECTORY ed2=(PIMAGE_EXPORT_DIRECTORY)(section2+exportDirVa-h->VirtualAddress);
+			if (sameTime)
+				sameTime=(ed1->TimeDateStamp==ed2->TimeDateStamp);
+			ed1->TimeDateStamp=0;
+			ed2->TimeDateStamp=0;
+			}
+		if (strcmp(".rsrc",name)==0)
+			{
+			int *t1=(int *)(section1+4);
+			int *t2=(int *)(section2+4);
+			if (sameTime)
+				sameTime=(*t1==*t2);
+			*t1=0;
+			*t2=0;
+			}
+
+		r=memcmp(section1, section2, h->SizeOfRawData);
+		if (r)
+			{
+			cout << name << " sections are different.\n";
+			return KDiffDifferent;
+			}
+		delete section1;
+		delete section2;
+		}
+
+	if (sameTime)
+		cout << "PE files are identical (time/data stamps also identical).\n";
+	else
+		cout << "PE files are identical except for time/date stamps.\n";
+	file1.Close();
+	file2.Close();
+	return KDiffIdentical;
+	}
+
+int e32cmp(char *aFileName1, char *aFileName2)
+	{
+	char* f1 = NormaliseFileName(aFileName1);
+	char* f2 = NormaliseFileName(aFileName2);
+	
+	E32ImageFile e32image1;
+	E32ImageFile e32image2;
+	TInt r = e32image1.Open(f1);
+	if (r != KErrNone)
+		{
+		if (r<0)
+			fprintf(stderr, "%s is not a valid E32Image file (error %d)\n", f1, r);
+		else
+			r = -1;
+		return r;
+		}
+	r = e32image2.Open(f2);
+	if (r != KErrNone)
+		{
+		if (r<0)
+			fprintf(stderr, "%s is not a valid E32Image file (error %d)\n", f2, r);
+		else
+			r = -1;
+		return r;
+		}
+
+
+
+	int sametime=(e32image1.iHdr->iTimeLo==e32image2.iHdr->iTimeLo)
+		&&(e32image1.iHdr->iTimeHi==e32image2.iHdr->iTimeHi);
+	e32image1.iHdr->iTimeLo=0;
+	e32image1.iHdr->iTimeHi=0;
+	e32image1.iOrigHdr->iTimeLo=0;
+	e32image1.iOrigHdr->iTimeHi=0;
+	e32image2.iHdr->iTimeLo=0;
+	e32image2.iHdr->iTimeHi=0;
+	e32image2.iOrigHdr->iTimeLo=0;
+	e32image2.iOrigHdr->iTimeHi=0;
+	e32image1.iHdr->iToolsVersion=e32image2.iHdr->iToolsVersion;
+	e32image1.iOrigHdr->iToolsVersion=e32image2.iOrigHdr->iToolsVersion;
+	e32image1.iHdr->iHeaderCrc=0;
+	e32image2.iHdr->iHeaderCrc=0;
+
+	int ohs1 = e32image1.iOrigHdr->TotalSize();
+	int ohs2 = e32image2.iOrigHdr->TotalSize();
+	int orighdrcmp = (ohs1==ohs2) ? memcmp(e32image1.iOrigHdr, e32image2.iOrigHdr, ohs1) : 1;
+
+	int hs1 = e32image1.iHdr->TotalSize();
+	int hs2 = e32image2.iHdr->TotalSize();
+	int hdrcmp = (hs1==hs2) ? memcmp(e32image1.iHdr, e32image2.iHdr, hs1) : 1;
+
+	int rs1 = e32image1.iSize - ohs1;
+	int rs2 = e32image2.iSize - ohs2;
+	int rcmp = (rs1==rs2) ? memcmp(e32image1.iData + ohs1, e32image2.iData + ohs2, rs1) : 1;
+
+	if (orighdrcmp==0 && rcmp==0)
+		{
+		if (sametime)
+			printf("E32 image files are identical\n");
+		else
+			printf("E32 image files are identical apart from timestamps and Header CRC \n");
+		return KDiffIdentical;
+		}
+	if (hdrcmp==0 && rcmp==0)
+		{
+		printf("E32 image files are functionally equivalent but have different headers\n");
+		return KDiffDifferent;
+		}
+	printf("E32 image files are different\n");
+	return KDiffDifferent;
+	}
+
+
+int main(int argc, char *argv[])
+	{
+	cout << "\nPEDIFF - PE file compare V";
+	cout << MajorVersion << '.' << setfill('0') << setw(2) << MinorVersion;
+	cout << '(' << setw(3) << Build << ")\n";
+	cout << Copyright;
+	
+	int r=KErrArgument;
+	if ((argc==3) || (argc==4))
+		{
+		if (argc==3)
+			r=pecmp(argv[1], argv[2]);
+		else if (strcmp("-e32", argv[1])==0)
+			r=e32cmp(argv[2], argv[3]);
+		}
+	if (r==KErrArgument)
+		{
+		cout << "Syntax: "<<argv[0]<<" pefile pefile\n";
+		cout << "        "<<argv[0]<<" -e32 e32imagefile e32imagefile\n";
+		}
+	return r;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_file.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1054 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#include <string.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32rom.h>
+#include "e32image.h"
+#include "pe_defs.h"
+#include "pe_file.h"
+#include "h_utl.h"
+
+TBool hadText, hadReloc = EFalse;
+TUint32 PEFile::iRomMemBase=0;
+TUint32 PEFile::iRomLinearBase=0;
+
+extern char* gX86imp;
+extern int gX86num_imp_dlls;
+
+PEFile::PEFile()
+	:iMemBase(0),iEntryPoint(0),iImageSize(0),iCodeSize(0),iDataSize(0),
+	iHeapReservedSize(0),iHeapCommittedSize(0),iStackReservedSize(0),iStackCommittedSize(0),
+	iBssSize(0),iBssOffset(0),iSectionAlign(0),iExpDirectoryOffset(0),iDataOffset(0),
+	iImageIsDll(EFalse),
+	iHeader(0),iExpDirectory(0),iImpDescriptor(0),iFileName(0),iFileHandle(0),
+	iLinkedBase(0),iStartOfHeaders(0),iSizeOfHeaders(0),iNumSections(0),
+	iRomRunAddr(0),iRamRunAddr(0),iRomDelta(0),iRamDelta(0),iHadDataSection(EFalse),
+	iBssSectionLinkedAddr(0),iBssSectionAddr(0),iBssSectionSize(0),
+	iDataSectionLinkedAddr(0),iDataSectionAddr(0),iDataSectionSize(0),
+	iCodeSectionAddr(0),iCodeSectionSize(0),
+	iRDataSectionAddr(0),iRDataSectionSize(0),
+	iCRTSectionAddr(0),iCRTSectionSize(0),
+	iExportDataDir(0)
+//
+// Constructor
+//
+	{
+
+	for (TInt i=0; i<KNumberOfSections; i++)
+		{
+		iSectionHeader[i]=NULL;
+		iSectionData[i]=NULL;
+		}
+	}
+
+
+PEFile::~PEFile()
+//
+// Destructor
+//
+	{
+
+	delete [] iFileName;
+	for (TInt i=0; i<KNumberOfSections; i++)
+		{
+		delete iSectionHeader[i];
+		delete iSectionData[i];
+		}
+	}
+
+
+TBool PEFile::Init(const char * const aFileName)
+//
+// Reads the PE headers to fill in lots of nice instance variables with info about the file
+//
+ 	{
+
+ 	delete [] iFileName;	
+	iFileName = new char[strlen((const char *)aFileName)+1];
+	strcpy ((char *)iFileName, (const char *)aFileName);
+
+	iHeader = (PIMAGE_NT_HEADERS)(HMem::Alloc(0,sizeof(IMAGE_DOS_HEADER)+sizeof(IMAGE_NT_HEADERS)));
+	if (!iHeader)
+		{
+		Print(EPeError,"Failed to allocate memory for headers.\n");
+		return EFalse;
+		}
+
+	TInt error = HFile::Open(iFileName, &iFileHandle);
+	if (error!=0)
+		return EFalse;
+
+	if (!HFile::Read(iFileHandle,iHeader,sizeof(IMAGE_DOS_HEADER)))
+		{
+		Print(EPeError,"Unable to read file %s.\n",iFileName);
+		HFile::Close(iFileHandle);
+		return EFalse;
+		}
+
+	if (IsValidDOSHeader((PIMAGE_DOS_HEADER)iHeader)) // read in the rest, overwriting the DOS header
+		iStartOfHeaders = ((PIMAGE_DOS_HEADER)iHeader)->e_lfanew;
+	else
+		iStartOfHeaders = 0;
+
+	if (!HFile::Seek(iFileHandle, iStartOfHeaders))
+		{
+		Print(EPeError,"File %s is not large enough to contain valid headers.\n",iFileName);
+		HFile::Close(iFileHandle);
+		return EFalse;
+		}
+
+ 	if (!HFile::Read(iFileHandle,iHeader,sizeof(IMAGE_NT_HEADERS)))
+		{
+		Print(EPeError,"Unable to read NT headers.\n");
+		HFile::Close(iFileHandle);
+		return EFalse;
+		}
+
+	if (!IsValidNTHeader(iHeader))
+		{
+		Print(EPeError,"Invalid NT header.\n");
+		HFile::Close(iFileHandle);
+		return EFalse;
+		}
+
+	if (!(IsValidFileHeader((PIMAGE_FILE_HEADER)&iHeader->FileHeader)))
+		{
+		Print(EPeError,"Invalid file header.\n");
+		HFile::Close(iFileHandle);
+		return EFalse;
+		}
+
+//	PIMAGE_NT_HEADERS pNTHeader = iHeader;
+	PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)&iHeader->FileHeader;
+	PIMAGE_OPTIONAL_HEADER pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)&iHeader->OptionalHeader;
+//	PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)(iHeader+1);
+
+	iImageSize = pOptionalHeader->SizeOfImage;
+	iCodeSize = pOptionalHeader->SizeOfCode;
+	iDataSize = pOptionalHeader->SizeOfInitializedData;
+	iEntryPoint = pOptionalHeader->AddressOfEntryPoint;
+	iHeapReservedSize = pOptionalHeader->SizeOfHeapReserve;
+	iHeapCommittedSize = pOptionalHeader->SizeOfHeapCommit;
+	iStackReservedSize = 0x2000;
+	iStackCommittedSize = 0x2000;
+	iBssSize = pOptionalHeader->SizeOfUninitializedData;
+    iSectionAlign =	pOptionalHeader->SectionAlignment;
+ 	if (pFileHeader->Characteristics & IMAGE_FILE_DLL)
+		iImageIsDll = ETrue;
+	else
+		iImageIsDll = EFalse;
+ 	iLinkedBase=pOptionalHeader->ImageBase;
+	iNumSections = pFileHeader->NumberOfSections;
+	iSizeOfHeaders = pOptionalHeader->SizeOfHeaders;
+	iExportDataDir=pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;
+	iExportDirSize=pOptionalHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].Size;
+//
+	iCpu=pFileHeader->Machine;
+	HMem::Free(iHeader);
+	iHeader=0;
+	return ETrue;
+	}
+
+void PEFile::Close()
+//
+// close the pe file
+//
+	{
+	HFile::Close(iFileHandle);
+	}
+
+TInt PEFile::ReadExportDirectory()
+//
+// Read in just the export directory
+//
+	{
+
+	if (iExportDataDir==0)
+		return KErrNotFound;
+	TInt r=ReadSectionHeaders();
+	if (r!=KErrNone)
+		return r;
+	iSectionData[KConstSection]=ReadSectionData(iSectionHeader[KConstSection]);
+	iExpDirectoryOffset=iSectionHeader[KConstSection]->VirtualAddress;
+	iExpDirectory=(PIMAGE_EXPORT_DIRECTORY)(iSectionData[KConstSection]+iExportDataDir-iExpDirectoryOffset);
+	return KErrNone;
+	}
+
+TInt PEFile::ReadSectionHeaders()
+//
+// Read in the section headers
+//
+	{
+	
+	TInt i;
+	for (i=0; i<KNumberOfSections; i++)
+		iSectionHeader[i]=NULL;
+	HFile::Seek(iFileHandle, iStartOfHeaders+sizeof(IMAGE_NT_HEADERS));
+	for (i=0; i<(TInt)iNumSections; i++)
+		{
+		PIMAGE_SECTION_HEADER header = new IMAGE_SECTION_HEADER;
+		if (!HFile::Read(iFileHandle, header, sizeof(IMAGE_SECTION_HEADER)))
+			return Print(EError, "Cannot read section header.\n");
+
+		if (CmpSectionName(header, ".text"))
+			iSectionHeader[KTextSection]=header;
+		else if (CmpSectionName(header, ".rdata"))
+			iSectionHeader[KConstSection]=header;
+		else if (CmpSectionName(header, ".edata"))
+			iSectionHeader[KExportSection]=header;
+		else if (CmpSectionName(header, ".data"))
+			iSectionHeader[KDataSection]=header;
+		else if (CmpSectionName(header, ".bss"))
+			iSectionHeader[KBssSection]=header;
+		else if (CmpSectionName(header, ".idata"))
+			iSectionHeader[KImportSection]=header;
+		else if (CmpSectionName(header, ".reloc"))
+			iSectionHeader[KRelocSection]=header;
+		else if (CmpSectionName(header, ".CRT"))
+			iSectionHeader[KCrtSection]=header;
+		else if (CmpSectionName(header, ".stab"))
+			delete header;
+		else if (CmpSectionName(header, ".stabstr"))
+			delete header;
+		else if (CmpSectionName(header,".E32_UID"))
+			delete header;
+		else if (CmpSectionName(header,".rsrc"))
+			delete header;
+		else
+			{
+			Print(EWarning, "Section '%.8s' removed.\n", header->Name);
+			delete header;
+			}
+		}
+	return KErrNone;
+	}
+
+char *PEFile::ReadSectionData(PIMAGE_SECTION_HEADER aPeHeader)
+//
+// Read in the data for this section
+//
+	{
+	char *section=NULL;
+	if (aPeHeader)
+		{
+		section=(char *)HMem::Alloc(NULL, aPeHeader->SizeOfRawData);
+		if (section==NULL)
+			return NULL;
+		HFile::Seek(iFileHandle, aPeHeader->PointerToRawData);
+		HFile::Read(iFileHandle, section, aPeHeader->SizeOfRawData);
+		}
+	return section;
+	}
+
+TInt PEFile::ReadData()
+//
+//
+//
+	{
+
+	TInt i;
+	for (i=0; i<KNumberOfSections; i++)
+		{
+		if (iSectionHeader[i])
+			{
+			iSectionData[i]=ReadSectionData(iSectionHeader[i]);
+			if (iSectionData[i]==NULL)
+				return Print(EError, "Cannot read %s section data.\n", iSectionHeader[i]->Name);
+			}
+		else
+			iSectionData[i]=NULL;
+		}
+	return KErrNone;
+	}
+
+TInt PEFile::NumberOfImports() const
+//
+// Count the total number of imports for this image
+//
+	{
+	
+//	if (gX86imp)
+//		return gX86num_imp_dlls;
+	char *importData=iSectionData[KImportSection];
+	PIMAGE_SECTION_HEADER importHeader=iSectionHeader[KImportSection];
+	if (importData==NULL)
+		return 0;
+	TInt n=0;
+	TUint *src=(TUint *)importData;
+	while (*src)
+		{
+		TUint vaoffset=src[4];
+		if (!gLittleEndian) ByteSwap(vaoffset);
+		TUint offset=vaoffset-importHeader->VirtualAddress; // find the offset into the section of import addr table
+		TUint *p=(TUint *)(importData+offset);
+		while (*p++)
+			n++;
+		src+=5; // sizeof pe import block/4
+		}
+	return n;
+	}
+
+TInt PEFile::NumberOfImportDlls() const
+//
+// Count the number of referenced Dlls
+//
+	{
+
+	char *importData=iSectionData[KImportSection];
+//	PIMAGE_SECTION_HEADER importHeader=iSectionHeader[KImportSection];
+	if (importData==NULL)
+		return 0;
+	TInt n=0;
+	while (*(TUint *)importData)
+		{
+		n++;
+		importData+=5*4; // size of pe import block
+		}
+	return n;
+	}
+
+TInt PEFile::NumberOfExports() const
+//
+// Count the number of exported symbols
+//
+	{
+
+	if (iExportDataDir==0)
+		return 0;
+	return ((PIMAGE_EXPORT_DIRECTORY)iSectionData[KExportSection])->NumberOfFunctions;
+	}
+
+TInt PEFile::NumberOfRelocs()
+//
+// Count the number of reloctions
+//
+	{
+
+	if (iSectionData[KRelocSection]==NULL)
+		return 0;
+	char *relocs=iSectionData[KRelocSection];
+	TInt n=0;
+	TInt dudrelocs=0;
+	TInt blocksize;
+	TUint page;
+	TInt size=iSectionHeader[KRelocSection]->Misc.VirtualSize;
+
+	TUint *rrelocs=(TUint *)relocs;
+	TUint ssize=size;
+	if (!gLittleEndian) ByteSwap(rrelocs, ssize);
+
+	while (size>0)
+		{
+		page=*(TUint *)relocs;
+		blocksize=*(TInt *)(relocs+4);
+		if (blocksize==0)
+			break;
+		size-=blocksize;
+		TUint16 *p=(TUint16 *)(relocs+8);
+		relocs+=blocksize;
+		blocksize-=8;
+		while (blocksize>0)
+			{
+			TInt rtype=(*p&0xf000)>>12;
+			if (rtype==IMAGE_REL_BASED_HIGHLOW)
+				{
+				TUint va=page+(*p&0xfff);
+
+				// va is the address requiring relocation, so it must be in a section and can't have been offset
+				TInt section=FindSectionByVa(va+iLinkedBase);
+				if (section==KTextSection || section==KConstSection || section==KDataSection || section==KCrtSection)
+					n++;
+				else
+					dudrelocs++;
+				}
+			else if (rtype!=IMAGE_REL_BASED_ABSOLUTE)	// used for padding
+				Print(EWarning, "Relocation type other than IMAGE_REL_BASED_HIGHLOW has been ignored.\n");
+			*p++;
+			blocksize-=2;
+			}
+		}
+#if defined(_DEBUG)
+	if (dudrelocs>0)
+		Print(EWarning, "Image '%s' has %d relocations pointing at uninitialised data.\n", iFileName, dudrelocs);
+#endif
+
+	if (!gLittleEndian) ByteSwap(rrelocs, ssize);
+	return n;
+	}
+
+void PEFile::GetRelocs(TUint *aReloc, TUint *aRelocSection, TInt /*aNumberOfRelocs*/)
+//
+// load the relocs from the reloc section into relocation and relocsection arrays
+//
+	{
+
+	TUint *relocation=aReloc;
+	TUint *relocsection=aRelocSection;
+	char *aRelocData=iSectionData[KRelocSection];
+
+	TUint16 *relocs=(TUint16 *)aRelocData;
+	TInt relocsize=iSectionHeader[KRelocSection]->Misc.VirtualSize;
+	TUint offset;
+	TUint page;
+	TInt i=0;
+
+	TUint *rrelocs=(TUint *)aRelocData;
+	TUint ssize=relocsize;
+	if (!gLittleEndian) ByteSwap(rrelocs, ssize);
+
+	while (relocsize>0)
+		{
+		page=*(TUint *)relocs;
+		relocs+=2;
+		TInt size=*(TUint *)relocs;
+		if (size==0)
+			break;
+		relocsize-=size;
+		relocs+=2;
+		size-=8;
+		while (size>0)
+			{
+			offset=*relocs++;
+			TInt type=offset&0xf000;
+			if (type==0x3000)
+				{
+				TUint va=page+(offset&0xfff);
+
+				// va is the address requiring relocation, so it must be in a section and can't have been offset
+				TInt section=FindSectionByVa(va+iLinkedBase);
+				if (section==KTextSection || section==KConstSection || section==KDataSection || section==KCrtSection)
+					{
+					relocsection[i]=section;
+					relocation[i++]=va;
+					}
+				}
+			size-=2;
+			}
+		}
+
+	if (!gLittleEndian) ByteSwap(rrelocs, ssize);
+	}
+
+TInt PEFile::Normalise()
+//
+// Remove the MSVC anomalies
+//
+	{
+
+	// MSVC puts export data in with .rdata
+	if (iExportDataDir && iSectionHeader[KExportSection]==NULL)
+		{
+		if (!PEFile::VirtualAddressInSection(iExportDataDir+iLinkedBase, iSectionHeader[KConstSection]))
+			return Print(EError, "Can't find exports in this PE file.\n");
+		else
+			{
+			iSectionHeader[KExportSection]=new IMAGE_SECTION_HEADER;
+			iSectionHeader[KExportSection]->VirtualAddress=iExportDataDir;
+			iSectionHeader[KExportSection]->Misc.VirtualSize=iExportDirSize;
+			iSectionHeader[KExportSection]->SizeOfRawData=iExportDirSize;
+			iSectionData[KExportSection]=new char [iExportDirSize];
+			if (iSectionData[KExportSection]==NULL)
+				return Print(EError, "Out of memory.\n");
+			memcpy(iSectionData[KExportSection], iSectionData[KConstSection]+iExportDataDir-iSectionHeader[KConstSection]->VirtualAddress, iExportDirSize);
+			// adjust .rdata so it does not include .edata
+			iSectionHeader[KConstSection]->Misc.VirtualSize-=iExportDirSize;
+			iSectionHeader[KConstSection]->SizeOfRawData-=iExportDirSize;
+			char *c=new char [iSectionHeader[KConstSection]->SizeOfRawData];
+			if (c==NULL)
+				return Print(EError, "Out of memory.\n");
+			memcpy(c, iSectionData[KConstSection], iSectionHeader[KConstSection]->SizeOfRawData);
+			delete iSectionData[KConstSection];
+			iSectionData[KConstSection]=c;
+			}
+		}
+	// Stupid compilers generate .idata sections even when there are no imports
+	if (iSectionHeader[KImportSection])
+		{
+		if (NumberOfImports()==0)
+			{
+			delete iSectionHeader[KImportSection];
+			delete iSectionData[KImportSection];
+			iSectionHeader[KImportSection]=NULL;
+			iSectionData[KImportSection]=NULL;
+			}
+		}
+	return KErrNone;
+	}
+
+
+TInt PEFile::HasInitialisedData(PIMAGE_SECTION_HEADER aHeader)
+//
+// Returns true if the pe file section contains any initialised data
+//
+	{
+
+	if (aHeader==NULL)
+		return FALSE;
+	if (aHeader->SizeOfRawData==0)
+		return FALSE;
+	return TRUE;
+	}
+
+void PEFile::CopySectionData(TAny *source, TAny *dest, TUint32 fileLength, TUint32 memLength)
+	{
+
+	if (fileLength <= memLength)
+		{
+		Print(EScreen,"   Copying %08x bytes from file at %08x to memory at %08x\n", fileLength, source, dest);
+		HMem::Copy(dest,source,fileLength);
+		dest = (TAny *)((TUint32)dest + fileLength);
+		TUint32 remainingSize = memLength - fileLength;
+		Print(EScreen,"   Zeroing remaining %08x bytes at %08x\n", remainingSize, dest);
+		HMem::Set(dest, 0, remainingSize);
+		}
+	else
+		{
+		Print(EScreen,"   Copying %08x bytes from file at %08x to memory at %08x\n", memLength, source, dest);
+		HMem::Copy(dest,source,memLength);
+		}
+	}		
+
+
+TBool PEFile::ProcessRelocData(TAny *relocData,TInt dataSize)
+	{
+
+	TBool hadBadRelocs=EFalse;
+	PIMAGE_BASE_RELOCATION pRelocData = (PIMAGE_BASE_RELOCATION)((TUint32)relocData);
+	Print(ELog,"   Info on .reloc section...\n");
+
+	while (pRelocData->SizeOfBlock != 0)
+		{
+		TUint16 relocType;
+		TUint32 relocOffset;
+		TUint32 *relocAddr;
+
+		Print(ELog,"      Virtual address: %08x  size: %08x\n",pRelocData->VirtualAddress, pRelocData->SizeOfBlock);
+			
+		TUint numEntries = (pRelocData->SizeOfBlock-sizeof(*pRelocData))/sizeof(TUint16);
+		TUint16 *pEntry = (TUint16 *)((TUint32)pRelocData+sizeof(*pRelocData));
+		
+		for (TUint i=0; i<numEntries; i++)
+			{
+			// Extract the top 4 bits of the relocation entry. This is the type
+			relocType = (TUint16)((*pEntry & 0xF000)>>12);
+			// The rest of the field is the offset
+			relocOffset = (*pEntry & 0x0FFF);
+			switch (relocType)
+				{
+				case 0: // Just padding
+					pEntry++;
+					break;
+
+				case 1:
+				case 2:
+				case 4:
+				case 5:
+					Print(EPeError,".reloc section, relocation type not handled.\n");
+					return EFalse;
+					break;
+
+				case 3:
+					{
+					if (pRelocData->VirtualAddress==0) // Defect in .reloc section of arm ekern.exe
+						{
+						pEntry++;
+						break;
+						}
+					TUint thisReloc=0;
+					relocAddr = (TUint32 *)((TUint32)iMemBase + (TUint32)pRelocData->VirtualAddress + relocOffset);
+					TUint32 reloc = *relocAddr;
+
+					if (IsInCode((TUint32)relocAddr) || IsInData((TUint32)relocAddr))
+						{
+						if (IsInDataReloc(reloc))
+					   		{
+							if (iImageIsDll)
+								{
+								Print(EPeError,"Dlls should have no RAM (data) relocations.\n");
+								return(EFalse);
+								}
+							thisReloc=reloc+iRamDelta;
+							}
+						else
+							thisReloc=reloc+iRomDelta;
+						*relocAddr = thisReloc; // this line here to enable breaking on values of thisReloc 
+						}
+					else
+						hadBadRelocs=ETrue;
+					pEntry++;
+					}
+					break;
+				default:
+					Print(EPeError,".reloc section, invalid relocation type.\n");
+					return(EFalse);
+				}
+			}
+		dataSize-=pRelocData->SizeOfBlock;
+		if(dataSize<=0)
+			break;
+		pRelocData = (PIMAGE_BASE_RELOCATION)((TUint32)pRelocData+pRelocData->SizeOfBlock);
+		}
+
+	if (hadBadRelocs)
+		Print(EPeError,"File %s has relocation in invalid section\n",iFileName);
+	return(ETrue);
+	}
+
+TBool PEFile::IsInCode(TUint32 anAddr)
+	{
+	if ((anAddr>=iCodeSectionAddr) && (anAddr<(iCodeSectionAddr+iCodeSectionSize)))
+		return(ETrue);
+	if ((anAddr>=iRDataSectionAddr) && (anAddr<(iRDataSectionAddr+iRDataSectionSize)))
+		return(ETrue);
+	if ((anAddr>=iCRTSectionAddr) && (anAddr<(iCRTSectionAddr+iCRTSectionSize)))
+		return(ETrue);
+	return(EFalse);
+	}
+
+TBool PEFile::IsInData(TUint32 anAddr)
+	{
+	if ((anAddr>=iDataSectionAddr) && (anAddr<(iDataSectionAddr+iDataSectionSize)))
+		return(ETrue);
+	if ((anAddr>=iBssSectionAddr) && (anAddr<(iBssSectionAddr+iBssSectionSize)))
+		return(ETrue);
+	return(EFalse);
+	}
+
+TBool PEFile::IsInDataReloc(TUint32 anAddr)
+	{
+	if ((anAddr>=iDataSectionLinkedAddr) && (anAddr<(iDataSectionLinkedAddr+iDataSectionSize)))
+		return(ETrue);
+	if ((anAddr>=iBssSectionLinkedAddr) && (anAddr<(iBssSectionLinkedAddr+iBssSectionSize)))
+		return(ETrue);
+	return(EFalse);
+	}
+ 
+
+TBool PEFile::IsValidDOSHeader(PIMAGE_DOS_HEADER aDOSHeader)
+ 	{
+	if (aDOSHeader->e_magic!=IMAGE_DOS_SIGNATURE)
+		{
+		Print(EPeError,"File does not have valid DOS MZ signature.\n");
+		return EFalse;
+		}
+	else
+		return ETrue;
+	}			  
+
+
+
+TBool PEFile::IsValidNTHeader(PIMAGE_NT_HEADERS aNTHeader)
+ 	{
+ 	if (aNTHeader->Signature != IMAGE_NT_SIGNATURE )
+		{
+		Print(EPeError,"File does not have valid NT PE signature.\n");
+		return EFalse;
+		}
+	else
+	 return ETrue;
+	}  
+
+
+TBool PEFile::IsValidFileHeader(PIMAGE_FILE_HEADER aFileHeader)
+ 	{
+	if ((aFileHeader->Machine != IMAGE_FILE_MACHINE_I386) 
+		&& (aFileHeader->Machine != 0xa00) 
+		&& (aFileHeader->Machine != 0xb00) 
+		&& (aFileHeader->Machine !=IMAGE_FILE_MACHINE_ALPHA))
+		{
+		Print(EPeError,"File is not a valid i386, ARM, M*Core or ALPHA executable.\n");
+		return EFalse;
+		}
+
+	if (aFileHeader->SizeOfOptionalHeader == 0)
+		{
+		Print(EPeError,"Optional header is 0 bytes in length - this is probably an object, not an executable\n");
+		return EFalse;
+		}
+
+  	if (!(aFileHeader->Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))
+		{
+		Print(EPeError,"File is not a valid executable - probably linker error\n");
+		return EFalse;
+		}
+
+	return ETrue;
+	}
+
+
+// Get details of the next import to fix-up in the current file. Fill in the name of the dll 
+//it is imported from, the ordinal number and the address to write back to.
+#define ORDINAL_DONE 0x40000000
+
+TImportStat PEFile::GetNextImport(char * &aDllName, TUint16 &aOrdinal, TUint32 * &aThunk)
+	{
+	PIMAGE_THUNK_DATA pLookupTable = 0;
+	TUint32 *pThunk = 0;
+	TUint32 rawOrdinal = ORDINAL_DONE;
+	TImportStat res = EImpDone;
+	PIMAGE_IMPORT_DESCRIPTOR impDesc = iImpDescriptor;
+	char *expDllName = 0;
+
+	if (impDesc == 0)
+		return EImpDone; // This file imports nothing
+		
+ 	while ((rawOrdinal & ORDINAL_DONE) && ((impDesc->TimeDateStamp!=0 ) || (impDesc->Name!=0)))
+		{
+		expDllName = (char *)(iMemBase + impDesc->Name);
+		pLookupTable = (PIMAGE_THUNK_DATA)(iMemBase + impDesc->Characteristics);
+ 		pThunk = (TUint32 *)(iMemBase + (TUint32)impDesc->FirstThunk);
+		while ((rawOrdinal & ORDINAL_DONE) && (pLookupTable->u1.AddressOfData != 0))
+ 			{
+ 			if (pLookupTable->u1.Ordinal & IMAGE_ORDINAL_FLAG )
+				rawOrdinal = pLookupTable->u1.Ordinal;
+			else
+				{
+				Print(EPeError,"in file %s\n",iFileName);
+				Print(EPeError,"It is importing a symbol by name from %s\n",expDllName);
+				return EImpError;
+				}
+			pThunk++;
+			pLookupTable++;
+			}	
+		impDesc++;
+		}
+
+	if (!(rawOrdinal & ORDINAL_DONE))
+		{
+		pThunk--;
+		pLookupTable--;
+		res = EImpSuccess;
+		aDllName = expDllName;
+		aThunk = pThunk;
+		aOrdinal = (TUint16)(rawOrdinal & 0xFFFF);
+		pLookupTable->u1.Ordinal |= ORDINAL_DONE;
+		}
+
+	return res;
+	}
+
+TUint32 PEFile::GetFixUp(const TUint16 aOrdinal)
+//
+// Look through export directory to find fix-up for given ordinal
+//
+	{
+
+	TUint32 ordBase = iExpDirectory->Base;
+	TUint32 *functions = (TUint32 *)((TUint32)iExpDirectory->AddressOfFunctions + iMemBase);
+	TUint32 fixupAddr = functions[aOrdinal-ordBase] + iRomRunAddr;
+	return fixupAddr;
+	}
+
+TUint PEFile::GetNumberOfExportedFunctions()
+	{
+
+	return iExpDirectory->NumberOfFunctions;
+	}
+
+
+TUint PEFile::GetOrdinalBase()
+	{
+
+	return iExpDirectory->Base;
+	}
+
+
+TBool PEFile::ExportSectionExists()
+	{
+
+	if (iExpDirectory)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+
+TBool PEFile::ImportSectionExists()
+	{
+
+	if (iImpDescriptor)
+		return ETrue;
+	else
+		return EFalse;
+	}
+
+
+TUint PEFile::RoundToSectionSize(TUint aSize)
+//
+// Round to the nearest size in sections
+//
+	{
+	TUint sAlign = iSectionAlign;
+	return ((aSize+sAlign-1)/sAlign)*sAlign ;
+	}
+
+
+void PEFile::DumpPeHeaders()
+//
+// Print out loads of stuff from the PE header
+//
+	{
+	TInt err = HFile::Open(iFileName, &iFileHandle);
+	if (err!=0) 
+		return;
+
+	iHeader = (PIMAGE_NT_HEADERS)(HMem::Alloc(0,iSizeOfHeaders-iStartOfHeaders));
+	if (!iHeader)
+		return;
+
+	if (!HFile::Seek(iFileHandle, iStartOfHeaders))
+		return;
+
+ 	if (!HFile::Read(iFileHandle, iHeader, iSizeOfHeaders-iStartOfHeaders))
+		return;
+
+	PIMAGE_FILE_HEADER pFileHeader = (PIMAGE_FILE_HEADER)&iHeader->FileHeader;
+	PIMAGE_OPTIONAL_HEADER pOptionalHeader = (PIMAGE_OPTIONAL_HEADER)&iHeader->OptionalHeader;
+	PIMAGE_SECTION_HEADER pSectionHeader = (PIMAGE_SECTION_HEADER)(iHeader+1);
+
+ 	printf("File header\n");
+ 	printf("-----------\n\n");
+	char *szMachine=0;
+	switch( pFileHeader->Machine )
+		{
+		case 0xa00:
+			szMachine = (char *)"ARM"; break;
+		case 0xb00:
+			szMachine = (char *)"M*Core"; break;
+		case IMAGE_FILE_MACHINE_I386:
+			szMachine = (char *)"i386"; break;
+		case IMAGE_FILE_MACHINE_I860:
+			szMachine = (char *)"i860"; break;
+		case IMAGE_FILE_MACHINE_R3000:
+			szMachine = (char *)"R3000"; break;
+		case IMAGE_FILE_MACHINE_R4000:
+			szMachine = (char *)"R4000"; break;
+		case IMAGE_FILE_MACHINE_ALPHA:
+			szMachine = (char *)"Alpha"; break;
+		case IMAGE_FILE_MACHINE_POWERPC:
+			szMachine = (char *)"IBM PowerPC"; break;
+		default:
+			printf ("ERROR - machine not specified.\n");
+			szMachine = (char *)"unknown";
+			break;
+		}
+
+	printf("\n    Machine: %s (Id=%04x)",szMachine, pFileHeader->Machine);
+	if ((pFileHeader->Machine != 0xa00)		// ARM
+		&& (pFileHeader->Machine != 0xb00))	// M*Core
+		printf("..........ERROR!!");
+    printf("\n    Number of sections : %04x",pFileHeader->NumberOfSections);
+    printf("\n    Time date stamp : %08lx",pFileHeader->TimeDateStamp);
+	if (pFileHeader->TimeDateStamp == 0)
+		printf("..........ERROR!!");
+    printf("\n    Pointer to symbol table : %08lx",pFileHeader->PointerToSymbolTable);
+    printf("\n    Number of symbols : %08lx",pFileHeader->NumberOfSymbols);
+    printf("\n    Size of optional header : %08x",pFileHeader->SizeOfOptionalHeader);
+	if (pFileHeader->SizeOfOptionalHeader == 0)
+		printf("..........ERROR!!");
+    printf("\n    Characteristics : %08x\n",pFileHeader->Characteristics);
+	if (pFileHeader->Characteristics & IMAGE_FILE_RELOCS_STRIPPED)
+		printf("\n      Relocations stripped..........ERROR!!");
+	if (pFileHeader->Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE)
+		printf("\n      Executable image.");
+	else
+		printf("\n      Not executable image..........ERROR!!");
+	if (pFileHeader->Characteristics & IMAGE_FILE_CHAR_REVERSED_LO)
+		printf("\n      Bytes reversed lo..........ERROR!!");
+ 	if (pFileHeader->Characteristics & IMAGE_FILE_32BIT_MACHINE)
+		printf("\n      32bit image.");
+	else
+		printf("\n      Not 32bit image..........ERROR!!");
+ 	if (pFileHeader->Characteristics & IMAGE_FILE_SYSTEM)
+		printf("\n      System file.");
+ 	if (pFileHeader->Characteristics & IMAGE_FILE_DLL)
+		printf("\n      Dll file.");
+	if (pFileHeader->Characteristics & IMAGE_FILE_CHAR_REVERSED_HI)
+		printf("\n      Bytes reversed hi..........ERROR!!");
+
+
+  	printf ("\n\n\nOptional Header\n");
+  	printf ("------------------");
+
+	printf("\n    Magic = %04x", pOptionalHeader->Magic);
+	printf("\n    Major Linker Version = %02x", pOptionalHeader->MajorLinkerVersion);
+	printf("\n    Minor Linker Version = %02x", pOptionalHeader->MinorLinkerVersion);
+	printf("\n    Size of code (bytes) = %08lx", pOptionalHeader->SizeOfCode);
+	printf("\n    Size of initialized data (bytes) = %08lx", pOptionalHeader->SizeOfInitializedData);
+	printf("\n    Size of uninitialized data (bytes) = %08lx", pOptionalHeader->SizeOfUninitializedData);
+	printf("\n    Entrypoint RVA = %08lx", pOptionalHeader->AddressOfEntryPoint);
+	if (pOptionalHeader->AddressOfEntryPoint & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Base of code = %08lx", pOptionalHeader->BaseOfCode);
+	if (pOptionalHeader->BaseOfCode & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Base of data = %08lx", pOptionalHeader->BaseOfData);
+	if (pOptionalHeader->BaseOfData & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Image base = %08lx", pOptionalHeader->ImageBase);
+	if (pOptionalHeader->ImageBase & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Section alignment (bytes) = %08lx",pOptionalHeader->SectionAlignment);
+	if (pOptionalHeader->SectionAlignment & 0x80000000)
+		printf("..........ERROR!!\n");
+	printf("\n    File alignment (bytes) = %08lx", pOptionalHeader->FileAlignment);
+	if (pOptionalHeader->FileAlignment & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Major Operating System Version = %04x", pOptionalHeader->MajorOperatingSystemVersion);
+	printf("\n    Minor Operating System Version = %04x", pOptionalHeader->MinorOperatingSystemVersion);
+	printf("\n    Major Image Version = %04x", pOptionalHeader->MajorImageVersion);
+	printf("\n    Minor Image Version = %04x", pOptionalHeader->MinorImageVersion);
+	printf("\n    Major Subsystem Version = %04x", pOptionalHeader->MajorSubsystemVersion);
+	printf("\n    Minor Subsystem Version = %04x", pOptionalHeader->MinorSubsystemVersion);
+
+	printf("\n    Size of image (bytes) = %08lx", pOptionalHeader->SizeOfImage);
+	if (pOptionalHeader->SizeOfImage & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Size of headers (bytes) = %08lx",pOptionalHeader->SizeOfHeaders);
+	if (pOptionalHeader->SizeOfHeaders & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    CheckSum = %04lx", pOptionalHeader->CheckSum);
+	printf("\n    Subsystem = %04x", pOptionalHeader->Subsystem);
+	printf("\n    Dll Characteristics = %04x", pOptionalHeader->DllCharacteristics);
+	printf("\n    Size Of Stack Reserve = %04lx", pOptionalHeader->SizeOfStackReserve);
+	printf("\n    Size Of Stack Commit = %04lx", pOptionalHeader->SizeOfStackCommit);
+	printf("\n    Size Of Heap Reserve = %04lx", pOptionalHeader->SizeOfHeapReserve);
+	printf("\n    Size Of Heap Commit = %04lx", pOptionalHeader->SizeOfHeapCommit);
+	printf("\n    Loader Flags = %04lx", pOptionalHeader->LoaderFlags);
+	printf("\n    Number Of Rva and Sizes = %04lx", pOptionalHeader->NumberOfRvaAndSizes);
+
+	printf("\n\n\nSection Headers\n");
+ 	printf("---------------\n\n");
+
+ 	for (TUint i=0;i<iNumSections;i++)
+		{
+		DumpNextSectionInFile(pSectionHeader);
+		pSectionHeader++;
+		}
+
+	if (!hadText)
+ 		printf("\nERROR - missing code section.");
+	if (!hadReloc)
+ 		printf("\nERROR - missing reloc section. (All images must be relocatable.)");
+	HMem::Free(iHeader);
+ 	}
+
+
+void PEFile::DumpNextSectionInFile(PIMAGE_SECTION_HEADER pSectionHeader)
+//
+// Print out loads of stuff from the section header
+//
+	{
+	printf("\nSection name %-8.8s\n",pSectionHeader->Name);
+	printf("\n    Virtual size            : %08lx", pSectionHeader->Misc.VirtualSize);
+	printf("\n    RVA of section data     : %08lx", pSectionHeader->VirtualAddress);
+	if (pSectionHeader->VirtualAddress & 0x80000000)
+		printf("..........ERROR!!");
+	printf("\n    Size of raw data        : %08lx", pSectionHeader->SizeOfRawData);
+	printf("\n    Pointer to raw data     : %08lx", pSectionHeader->PointerToRawData);
+	printf("\n    Characteristics: %08lx\n", pSectionHeader->Characteristics);
+ 	if (pSectionHeader->Characteristics & IMAGE_SCN_LNK_REMOVE)
+		printf("\nERROR - Section should have been removed by linker.\n");
+
+	// read the section in
+	TUint32 filePos = pSectionHeader->PointerToRawData;
+ 	TUint32 fileLength = pSectionHeader->SizeOfRawData;
+//	TUint32 memLength = pSectionHeader->Misc.VirtualSize;
+	TAny *sectionFile = HMem::Alloc((TAny *)0, fileLength); // get a buffer
+	HFile::Seek(iFileHandle, filePos);
+	HFile::Read(iFileHandle, sectionFile, fileLength); // and read the file into the buffer
+//	TAny *sectionMem = (TAny *)((TUint32)iMemBase + pSectionHeader->VirtualAddress);
+
+	if (strnicmp((const char *)pSectionHeader->Name, ".text", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		hadText = ETrue;
+		if (!(pSectionHeader->Characteristics & IMAGE_SCN_CNT_CODE))
+			printf("\nERROR - Code section has incorrect characteristics.\n");
+		else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_EXECUTE))
+			printf("\nERROR - Code section has incorrect characteristics.\n");
+		else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_READ))
+			printf("\nERROR - Code section has incorrect characteristics.\n");
+		}
+	else if (strnicmp((const char *)pSectionHeader->Name, ".data", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		if (iImageIsDll)
+			{
+			printf ("\nERROR - DLL has data section.\n");
+			}
+		else
+			{
+			if (!(pSectionHeader->Characteristics & IMAGE_SCN_CNT_INITIALIZED_DATA))
+				printf("\nERROR - data section has incorrect characteristics.\n");
+			else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_WRITE))
+				printf("\nERROR - data section has incorrect characteristics.\n");
+			else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_READ))
+				printf("\nERROR - data section has incorrect characteristics.\n");
+			}
+		}
+	else if (strnicmp((const char *)pSectionHeader->Name, ".rdata", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		}							
+	else if (strnicmp((const char *)pSectionHeader->Name, ".bss", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		if (iImageIsDll)
+			{
+			printf ("\nERROR - DLL has bss section.\n");
+			}
+		else
+			{
+			if (!(pSectionHeader->Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA))
+				printf("\nERROR - BSS section has incorrect characteristics.\n");
+			else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_WRITE))
+				printf("\nERROR - BSS section has incorrect characteristics.\n");
+			else if (!(pSectionHeader->Characteristics & IMAGE_SCN_MEM_READ))
+				printf("\nERROR - BSS section has incorrect characteristics.\n");
+			}
+		}
+ 	else if (strnicmp((const char *)pSectionHeader->Name, ".reloc", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		hadReloc = ETrue;
+		}
+	else if (strnicmp((const char *)pSectionHeader->Name, ".idata", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		}
+	else if (strnicmp((const char *)pSectionHeader->Name, ".edata", IMAGE_SIZEOF_SHORT_NAME) == 0)
+		{
+		iExpDirectory = (PIMAGE_EXPORT_DIRECTORY)(sectionFile);
+		if (iImageIsDll)
+			{
+			printf("\n      Ordinal base = %08lx", iExpDirectory->Base);
+			printf("\n      Number of functions = %08lx", iExpDirectory->NumberOfFunctions);
+			printf("\n      Number of names = %08lx", iExpDirectory->NumberOfNames);
+			printf("\n      Export address table RVA = %08lx", (TUint32)iExpDirectory->AddressOfFunctions);
+			printf("\n      Name pointer RVA = %08lx", (TUint32)iExpDirectory->AddressOfNames);
+			printf("\n      Ordinal table RVA = %08lx", (TUint32)iExpDirectory->AddressOfNameOrdinals);
+			}
+		else
+			{
+			printf("\nERROR - non-DLL with export section.");
+			}
+ 		}
+	else
+		{
+		printf("\nERROR - unexpected section.");
+		}
+
+	HMem::Free(sectionFile);
+	return;
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_imp.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,235 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <stdlib.h>
+#include <string.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include "h_utl.h"
+#include "pe_file.h"
+
+TInt E32ImageFile_PE::CopyImportAddrTable(char *aPtr, PEFile &aPeFile)
+//
+// Copy the import address table entries
+//
+	{
+
+	TUint *ptr=(TUint *)aPtr;
+	char *importsection=aPeFile.iSectionData[KImportSection];
+	TUint *src=(TUint *)importsection;
+	while (*src)
+		{
+		TUint vaoffset=src[4];
+		if (!gLittleEndian) ByteSwap(vaoffset);
+		TUint offset=vaoffset-aPeFile.iSectionHeader[KImportSection]->VirtualAddress; // find the offset into the section of import addr table
+		vaoffset=src[3];
+		if (!gLittleEndian) ByteSwap(vaoffset);
+		TUint exportername=vaoffset-aPeFile.iSectionHeader[KImportSection]->VirtualAddress;
+		TUint *p=(TUint *)(importsection+offset);
+		while (*p)
+			{
+			if ((*p&0x80000000)==0)
+				{
+				Print(EError, "%s exporting symbol by name\n", importsection+exportername);
+				return KErrGeneral;
+				}
+			*ptr++=(*p++)&0x7fffffff; // mask out the high bit (- indicates export by ordinal)
+			}
+		src+=5;
+		}
+	*ptr++=0;
+	return KErrNone;
+	}
+
+extern char* gX86imp;
+extern int gX86num_imports;
+extern int gX86num_imp_dlls;
+extern int gX86imp_size;
+int* gX86imp_relocs=NULL;
+
+TInt CrunchImportSection(TAny* aSection, TInt aNumImpDlls, TInt aNumImports)
+	{
+	// Remove lists of ordinals from import section
+	TInt* d = (TInt*)aSection;
+	TInt orig_size = *d;
+	TInt offset_correction = aNumImports*sizeof(TUint);
+	*d -= offset_correction;	// reduce total section size
+	TInt *dd = d+1;
+	TInt *ss = d+1;
+
+	TInt i;
+	for (i=0; i<aNumImpDlls; ++i)
+		{
+		*dd++ = *ss++ - offset_correction;	// copy name offset and reduce it appropriately
+		TInt nimp = *ss++;					// number of imports from this DLL
+		*dd++ = nimp;						// copy it
+		ss += nimp;							// skip the ordinals in the original list
+		}
+	TInt used_size = (ss - d) * sizeof(TInt);
+	memcpy(dd, ss, orig_size - used_size);	// copy name strings
+
+	return *d;	// return new total section size
+	}
+
+char *E32ImageFile_PE::CreateImportSection(const PEFile &aPeFile, TInt &aSize)
+//
+// Create a new format import section
+//
+	{
+
+	int total_imports = 0;
+	if (gX86imp)
+		{
+		TUint *rdata=(TUint*)aPeFile.iSectionData[KConstSection];
+		TInt bytecount=gX86imp_size;
+		char* section=new char[bytecount];
+		memcpy(section,gX86imp,bytecount);
+		int i;
+		int j=0;
+		int* s=(int*)section;
+		s++;
+		gX86imp_relocs=new int[gX86num_imports+gX86num_imp_dlls];
+		for (i=0; i<gX86num_imp_dlls; ++i)
+			{
+			++s;
+			int n=*s++;
+			total_imports += n;
+			while (n--)
+				{
+				int rdata_int_offset=*s>>2;
+				*s=rdata[rdata_int_offset]&0x7fffffffu;	// rdata offset to ordinal
+				gX86imp_relocs[rdata_int_offset]=j<<2;
+				++j;
+				++s;
+				}
+			}
+		*(TInt*)section = bytecount;
+		aSize = CrunchImportSection(section, gX86num_imp_dlls, total_imports);
+		return section;
+		}
+	PIMAGE_SECTION_HEADER aHeader=aPeFile.iSectionHeader[KImportSection];
+	TUint *aSrc=(TUint *)aPeFile.iSectionData[KImportSection];
+
+	TInt nimportdlls=aPeFile.NumberOfImportDlls();
+	if (nimportdlls==0)
+		{
+		aSize=0;
+		return NULL;
+		}
+	E32ImportBlock *block=new E32ImportBlock [nimportdlls];
+	char **name=new char* [nimportdlls];
+	TUint **import=new TUint* [nimportdlls];
+
+	TInt bytecount=sizeof(E32ImportSection)+sizeof(E32ImportBlock)*nimportdlls;
+	TUint *src=aSrc;
+	TInt i;
+	for (i=0; i<nimportdlls; i++)
+		{
+		TUint vaoffset=src[4];
+		if (!gLittleEndian) ByteSwap(vaoffset);
+		TUint offset=vaoffset-aHeader->VirtualAddress; // find the offset into the section of import addr table
+		TUint *p=aSrc+offset/4;
+		block[i].iNumberOfImports=0;
+		while (*p++)
+			block[i].iNumberOfImports++;
+		total_imports += block[i].iNumberOfImports;
+		import[i]=new TUint [block[i].iNumberOfImports];
+		TInt j;
+		p=aSrc+offset/4;
+		for (j=0; j<block[i].iNumberOfImports; j++)
+			{
+			import[i][j]=(*p++)&0x7fffffffu;
+			bytecount+=4;
+			}
+		// name
+		vaoffset=src[3];
+		if (!gLittleEndian) ByteSwap(vaoffset);
+		offset=vaoffset-aHeader->VirtualAddress;
+		name[i]=((char *)aSrc)+offset;
+		bytecount+=strlen(name[i])+1;
+		src+=5;
+		}
+
+	bytecount=ALIGN4(bytecount);
+	char *section=new char [bytecount];
+	char *s=section+sizeof(E32ImportSection);
+	for (i=0; i<nimportdlls; i++)
+		{
+		memcpy(s, (char *)&block[i], sizeof(E32ImportBlock));
+		s+=sizeof(E32ImportBlock);
+		memcpy(s, (char *)import[i], block[i].iNumberOfImports*4);
+		s+=block[i].iNumberOfImports*4;
+		}
+	char *t=section+sizeof(E32ImportSection);
+	for (i=0; i<nimportdlls; i++)
+		{
+		((E32ImportBlock *)t)->iOffsetOfDllName=s-section;
+		strcpy(s, name[i]);
+		s+=strlen(name[i])+1;
+		t += ((E32ImportBlock *)t)->iNumberOfImports * sizeof(TUint) + sizeof(E32ImportBlock);
+		}
+	while ((s-section)<bytecount)
+		*s++=0;
+
+	// free mem
+	for (i=0; i<nimportdlls; i++)
+		delete import[i];
+	delete block;
+	delete import;
+	delete name;
+
+	*(TInt*)section = bytecount;
+	aSize = CrunchImportSection(section, nimportdlls, total_imports);
+	return section;
+	}
+
+TUint E32ImageFile_PE::FixImportThunk(PEFile &aPeFile, TUint va)
+//
+// Fix an access to the import address table
+//
+	{
+
+	TUint *imports=(TUint *)aPeFile.iSectionData[KImportSection];
+	TUint n=0;
+	TUint importoffset=imports[4];
+	if (!gLittleEndian) ByteSwap(importoffset);
+	TUint iat=importoffset-aPeFile.iSectionHeader[KImportSection]->VirtualAddress;
+
+	while (iat<va)
+		{
+		if (*((TUint *)(aPeFile.iSectionData[KImportSection]+iat))==0)
+			{
+			imports+=5;
+			importoffset=imports[4];
+			if (!gLittleEndian) ByteSwap(importoffset);
+			iat=importoffset-aPeFile.iSectionHeader[KImportSection]->VirtualAddress;
+			}
+		else
+			{
+			n++;
+			iat+=4;
+			}
+		}
+
+	// Flag errors brought about by a corrupt input binary
+	if (iat>va)
+		{
+		Print(EError, "%s is corrupt - problem processing import address table.\n", this->iFileName);
+		return (TUint)KErrGeneral;
+		}
+		
+	return iHdr->iTextSize+n*sizeof(TUint);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_reloc.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,374 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <stdlib.h>
+#include <string.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include "pe_file.h"
+#include "h_utl.h"
+#include <stdio.h>
+
+extern char* gX86imp;
+extern int gX86num_imp_dlls;
+extern int gX86imp_size;
+extern int gX86num_imports;
+extern int* gX86imp_relocs;
+
+TInt sizeOfCodeRelocs(TUint *relocs, TUint *relocsection, TInt nrelocs)
+	{
+
+	TInt bytecount=0;
+	TInt page=-1;
+	TInt i;
+	for (i=0; i<nrelocs; i++)
+		{
+		if ((TInt)relocsection[i]==KTextSection || (TInt)relocsection[i]==KConstSection || (TInt)relocsection[i]==KCrtSection)
+			{
+			TInt p=relocs[i]&0xfffff000;
+			if (page!=p)
+				{
+				if (bytecount%4!=0)
+					bytecount+=2;
+				bytecount+=8; // page, block size
+				page=p;
+				}
+			bytecount+=2;
+			}
+		}
+	if (bytecount%4!=0)
+		bytecount+=2;
+	return bytecount;
+	}
+
+TInt sizeOfDataRelocs(TUint *relocs, TUint *relocsection, TInt nrelocs)
+	{
+
+	TInt bytecount=0;
+	TInt page=-1;
+	TInt i;
+	for (i=0; i<nrelocs; i++)
+		{
+		if ((TInt)relocsection[i]==KDataSection)
+			{
+			TInt p=relocs[i]&0xfffff000;
+			if (page!=p)
+				{
+				if (bytecount%4!=0)
+					bytecount+=2;
+				bytecount+=8; // page, block size
+				page=p;
+				}
+			bytecount+=2;
+			}
+		}
+	if (bytecount%4!=0)
+		bytecount+=2;
+	return bytecount;
+	}
+
+void reorderRelocs(TUint aReloc[], TUint aRelocSection[], TInt aNumberOfRelocs)
+//
+// sort the relocations in section order
+//
+	{
+	TUint *temp=new TUint [aNumberOfRelocs];
+	TUint *tempsection=new TUint [aNumberOfRelocs];
+	TInt idx=0;
+	TUint section=0;
+	while (idx<aNumberOfRelocs)
+		{
+		for (TInt i=0; i<aNumberOfRelocs; i++)
+			{
+			if (aRelocSection[i]==section)
+				{
+				temp[idx]=aReloc[i];
+				tempsection[idx]=aRelocSection[i];
+				idx++;
+				}
+			}
+		section++;
+		}
+	memcpy((char *)aReloc, (char *)temp, aNumberOfRelocs*sizeof(TUint));
+	memcpy((char *)aRelocSection, (char *)tempsection, aNumberOfRelocs*sizeof(TUint));
+	delete [] temp;
+	delete [] tempsection;
+	}
+
+char *E32ImageFile_PE::CreateCodeRelocs(TUint *relocs, TUint *relocsection, TInt nrelocs, TInt &aSize)
+	{
+
+	TInt bytecount=sizeOfCodeRelocs(relocs, relocsection, nrelocs);
+	aSize=0;
+	if (bytecount==0)
+		return NULL;
+	aSize=bytecount+sizeof(E32RelocSection);
+
+	char *section=new char [bytecount+sizeof(E32RelocSection)];
+	char *data=section+sizeof(E32RelocSection);
+	char *startofblock=data;
+
+	TInt ncoderelocs=0;
+	TInt page=-1;
+	TInt pagesize=8;
+	TInt i;
+	for (i=0; i<nrelocs; i++)
+		{
+		if ((TInt)relocsection[i]==KTextSection || (TInt)relocsection[i]==KConstSection || (TInt)relocsection[i]==KCrtSection)
+			{
+			TInt p=relocs[i]&0xfffff000;
+			if (page!=p)
+				{
+				if (pagesize%4!=0)
+					{
+					*(TUint16 *)data=0;
+					data+=2;
+					pagesize+=2;
+					}
+				*(TUint *)startofblock=page;
+				*(TUint *)(startofblock+4)=pagesize;
+				pagesize=8;
+				page=p;
+				startofblock=data;
+				data+=8;
+				}
+			*(TUint16 *)data=(TUint16)((relocs[i]&0xfff)|0x3000);
+			data+=2;
+			pagesize+=2;
+			ncoderelocs++;
+			}
+		}
+	if (pagesize%4!=0)
+		{
+		*(TUint16 *)data=0;
+		data+=2;
+		pagesize+=2;
+		}
+	*(TUint *)startofblock=page;
+	*(TUint *)(startofblock+4)=pagesize;
+	((E32RelocSection *)section)->iNumberOfRelocs=ncoderelocs;
+	((E32RelocSection *)section)->iSize=bytecount;
+	return section;
+	}
+
+char *E32ImageFile_PE::CreateDataRelocs(TUint *relocs, TUint *relocsection, TInt nrelocs, TInt &aSize)
+	{
+
+	TInt bytecount=sizeOfDataRelocs(relocs, relocsection, nrelocs);
+	aSize=0;
+	if (bytecount==0)
+		return NULL;
+	aSize=bytecount+sizeof(E32RelocSection);
+
+	char *section=new char [bytecount+sizeof(E32RelocSection)];
+	char *data=section+sizeof(E32RelocSection);
+	char *startofblock=data;
+
+	TInt ndatarelocs=0;
+	TInt page=-1;
+	TInt pagesize=8;
+	TInt i;
+	for (i=0; i<nrelocs; i++)
+		{
+		if ((TInt)relocsection[i]==KDataSection)
+			{
+			TInt p=relocs[i]&0xfffff000;
+			if (page!=p)
+				{
+				if (pagesize%4!=0)
+					{
+					*(TUint16 *)data=0;
+					data+=2;
+					pagesize+=2;
+					}
+				*(TUint *)startofblock=page;
+				*(TUint *)(startofblock+4)=pagesize;
+				pagesize=8;
+				page=p;
+				startofblock=data;
+				data+=8;
+				}
+			*(TUint16 *)data=(TUint16)((relocs[i]&0xfff)|0x3000);
+			data+=2;
+			pagesize+=2;
+			ndatarelocs++;
+			}
+		}
+	if (pagesize%4!=0)
+		{
+		*(TUint16 *)data=0;
+		data+=2;
+		pagesize+=2;
+		}
+	*(TUint *)startofblock=page;
+	*(TUint *)(startofblock+4)=pagesize;
+
+	((E32RelocSection *)section)->iNumberOfRelocs=ndatarelocs;
+	((E32RelocSection *)section)->iSize=bytecount;
+	return section;
+	}
+
+void checkreloc(PEFile &aPeFile, TUint va, TUint reloc)
+	{
+
+	// Allow the section find routine to use heuristics to resolve addresses
+	// which have been offset by the compiler
+	TInt s = aPeFile.FindSectionByVa(va, 1);
+	switch(s)
+		{
+		case KTextSection:
+		case KConstSection:
+		case KDataSection:
+		case KCrtSection:
+		case KBssSection:
+		case KImportSection:
+			return;
+		default:
+			break;
+		}
+	Print(EAlways, "bad relocation:  [%08x] = %08x\n", reloc, va);
+	}
+
+void E32ImageFile_PE::FixRelocs(PEFile &aPeFile, TUint *relocation, TUint *relocsection, TInt aNumberOfRelocs)
+	{
+
+	TUint *data;
+	TInt i;
+#if 0
+	Print(EAlways, "Linked base %08x\n", aPeFile.iLinkedBase);
+	for (i=0; i<KNumberOfSections; i++)
+		{
+		if (!aPeFile.iSectionHeader[i])
+			continue;
+		TUint start = aPeFile.iSectionHeader[i]->VirtualAddress;
+		TUint finish = start + aPeFile.iSectionHeader[i]->Misc.VirtualSize;
+		Print(EAlways, "Section %d %08x-%08x\n", i, start, finish);
+		}
+#endif
+	for (i=0; i<aNumberOfRelocs; i++)
+		{
+		switch (relocsection[i])
+			{
+		case KTextSection:
+			relocation[i]-=aPeFile.iSectionHeader[KTextSection]->VirtualAddress;
+			data=(TUint *)(aPeFile.iSectionData[KTextSection]+relocation[i]);
+			if (!gLittleEndian) ByteSwap(*data);
+			checkreloc(aPeFile, *data, relocation[i]+aPeFile.iSectionHeader[KTextSection]->VirtualAddress);
+			*data=FixAddress(aPeFile, *data);
+			if (!gLittleEndian) ByteSwap(*data);
+			break;
+		case KConstSection:
+			relocation[i]-=aPeFile.iSectionHeader[KConstSection]->VirtualAddress;
+			data=(TUint *)(aPeFile.iSectionData[KConstSection]+relocation[i]);
+			if (!gLittleEndian) ByteSwap(*data);
+			checkreloc(aPeFile, *data, relocation[i]+aPeFile.iSectionHeader[KConstSection]->VirtualAddress);
+			relocation[i]+=ConstOffset();
+			*data=FixAddress(aPeFile, *data);
+			if (!gLittleEndian) ByteSwap(*data);
+			break;
+		case KCrtSection:
+			relocation[i]-=aPeFile.iSectionHeader[KCrtSection]->VirtualAddress;
+			data=(TUint *)(aPeFile.iSectionData[KCrtSection]+relocation[i]);
+			if (!gLittleEndian) ByteSwap(*data);
+			checkreloc(aPeFile, *data, relocation[i]+aPeFile.iSectionHeader[KCrtSection]->VirtualAddress);
+			relocation[i]+=iCrtOffset;
+			*data=FixAddress(aPeFile, *data);
+			if (!gLittleEndian) ByteSwap(*data);
+			break;
+		case KDataSection:
+			relocation[i]-=aPeFile.iSectionHeader[KDataSection]->VirtualAddress;
+			data=(TUint *)(aPeFile.iSectionData[KDataSection]+relocation[i]);
+			if (!gLittleEndian) ByteSwap(*data);
+			checkreloc(aPeFile, *data, relocation[i]+aPeFile.iSectionHeader[KDataSection]->VirtualAddress);
+			*data=FixAddress(aPeFile, *data);
+			if (!gLittleEndian) ByteSwap(*data);
+			break;
+		default:
+			Print(EWarning, "Relocation in invalid section.\n");
+			break;
+			}
+		}
+	reorderRelocs(relocation, relocsection, aNumberOfRelocs);
+	}
+
+TUint E32ImageFile_PE::FixAddress(PEFile &aPeFile, TUint va)
+//
+// Fix the given virtual address for the new headers
+//
+	{
+
+	// Allow the section find routine to use heuristics to resolve addresses
+	// which have been offset by the compiler
+	TInt section=aPeFile.FindSectionByVa(va, 1);
+	switch(section)
+		{
+		case KTextSection:
+			va-=aPeFile.iLinkedBase;
+			va-=aPeFile.iSectionHeader[KTextSection]->VirtualAddress;
+			va+=iHdr->iCodeBase;
+			break;
+		case KConstSection:
+			va-=aPeFile.iLinkedBase;
+			va-=aPeFile.iSectionHeader[KConstSection]->VirtualAddress;
+			if (gX86imp)
+				{
+				TUint old_iat_size=(gX86num_imports+gX86num_imp_dlls)<<2;
+				if (va<old_iat_size)
+					{
+					TInt offset=iHdr->iTextSize;
+//					fprintf(stderr,"IAT OFF %x ",va);
+					va=gX86imp_relocs[va>>2]+iHdr->iCodeBase+offset;
+//					fprintf(stderr,"-> %x\n",va);
+					break;
+					}
+				}
+			va+=iHdr->iCodeBase+ConstOffset();
+//			fprintf(stderr,"const reloc -> %x\n",va);
+			break;
+		case KDataSection:
+			va-=aPeFile.iLinkedBase;
+			va-=aPeFile.iSectionHeader[KDataSection]->VirtualAddress;
+			va+=iHdr->iDataBase; //DataOffset();
+			break;
+		case KCrtSection:
+			va-=aPeFile.iLinkedBase;
+			va-=aPeFile.iSectionHeader[KCrtSection]->VirtualAddress;
+			va+=iHdr->iCodeBase+iCrtOffset;
+			break;
+		case KBssSection:
+			va-=aPeFile.iLinkedBase;
+			va-=aPeFile.iSectionHeader[KBssSection]->VirtualAddress;
+			va+=iHdr->iDataBase+iHdr->iDataSize;
+			break;
+		case KImportSection:
+			va-=aPeFile.iLinkedBase;
+			va=FixImportThunk(aPeFile, va-aPeFile.iSectionHeader[KImportSection]->VirtualAddress);
+			va+=iHdr->iCodeBase;
+			break;
+		default:
+			if (va < 0x10000u)
+				{
+				// assume it's a relocation relative to an omitted section
+				break;
+				}
+			Print(EWarning, "Address to relocate cannot be resolved to .text, .rdata, .idata or data sections\n");
+			Print(EWarning, "Problem address = %08x (section %d)\n", va, section);
+			break;
+		}
+	// va is now an offset from the start of the text
+	return va;
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_tran.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,453 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <time.h>
+#include <malloc.h>
+#include <string.h>
+#include "e32image.h"
+#include <e32std.h>
+#include <e32std_private.h>
+#include "pe_defs.h"
+#include "pe_file.h"
+#include "h_ver.h"
+#include "h_utl.h"
+
+int gAlignConstSection=FALSE;
+TUint gConstSectionAddressMask=0;
+static TUint gRequiredConstPadding;
+
+extern char* gX86imp;
+extern int gX86num_imp_dlls;
+extern int gX86imp_size;
+extern int gX86num_imports;
+
+E32ImageFile* E32ImageFile::New()
+	{
+	return new E32ImageFile_PE;
+	}
+
+E32ImageFile_PE::E32ImageFile_PE()
+	{
+	}
+
+E32ImageFile_PE::~E32ImageFile_PE()
+	{
+	}
+
+TUint E32ImageFile_PE::ImportAddressTableOffset()
+//
+// Return the offset of the iat
+//
+	{
+	return iHdr->iTextSize;
+	}
+
+TUint E32ImageFile_PE::ConstOffset()
+//
+// return the offset of the const data
+//
+	{
+	return iConstOffset;
+	}
+
+void E32ImageFile_PE::CreateExportDirectory(char *aPtr, PEFile &aPeFile)
+//
+// create a new format export directory
+//
+	{
+	
+	if (iHdr->iExportDirCount==0)
+		return;
+	TUint *src=(TUint *)aPeFile.iSectionData[KExportSection];
+	TUint *dst=(TUint *)aPtr;
+	PIMAGE_EXPORT_DIRECTORY dir=(PIMAGE_EXPORT_DIRECTORY)src;
+	src+=(((TInt)dir->AddressOfFunctions)-((TInt)aPeFile.iSectionHeader[KExportSection]->VirtualAddress))/4;
+	TUint i;
+	for (i=0; i<dir->NumberOfFunctions; i++)
+		{
+		TUint va=*src++;
+		dst[i]=va;
+		}
+	FixExportDirectory(dst, aPeFile);
+	}
+
+void E32ImageFile_PE::FixExportDirectory(TUint *aExportDir, PEFile &aPeFile)
+//
+// Fix the export directory
+//
+	{
+
+	TUint lb = aPeFile.iLinkedBase;
+	TUint *exportdir=aExportDir;
+	TInt n;
+	for (n=0; n<(TInt)iHdr->iExportDirCount; n++)
+		{
+		TUint va=*exportdir;
+		if (!gLittleEndian) ByteSwap(va);
+
+		// va is the address of an exported item, so assume it can't have been offset
+		TInt i=aPeFile.FindSectionByVa(va+lb);
+		if (i==KTextSection)
+			va=va-aPeFile.iSectionHeader[i]->VirtualAddress;
+		else if (i==KConstSection)
+			va=va-aPeFile.iSectionHeader[i]->VirtualAddress+ConstOffset();
+		else if (i==KDataSection)
+			va=va-aPeFile.iSectionHeader[i]->VirtualAddress+DataOffset();
+		else if (i==KBssSection)
+			va=va-aPeFile.iSectionHeader[i]->VirtualAddress+BssOffset();
+		else
+			{
+			if (va == 0)
+				Print(EWarning, "No export specified for ordinal %d\n", n+1, va);
+			else
+				Print(EError, "Export %d (address %08x) is not from .text, .rdata, or data sections\n", n+1, va);
+			}
+		if (!gLittleEndian) ByteSwap(va);
+		*exportdir++=va;
+		}
+	}
+
+TInt E32ImageFile_PE::DoCodeHeader(PEFile &aPeFile)
+//
+// Calculate the code parts of the pefile
+//
+	{
+
+	// .text
+	TInt size=ALIGN4(aPeFile.iSectionHeader[KTextSection]->Misc.VirtualSize);
+
+	// .rdata
+	iConstOffset=0;
+	if (gAlignConstSection)
+		{
+	    // Compute the amount of padding to put before the
+	    // const section to align it correctly
+	    TUint   oldAddressBits = aPeFile.iSectionHeader[KConstSection]->VirtualAddress & gConstSectionAddressMask;
+	    TUint   oldConstAddress = size;
+	    TUint   newConstAddress = oldConstAddress;
+	    // slow but sure
+	    while ((newConstAddress & gConstSectionAddressMask) != oldAddressBits)
+	    	{
+			newConstAddress++;
+			}
+	    gRequiredConstPadding = newConstAddress - oldConstAddress;
+	    size += gRequiredConstPadding;
+		}
+	if (aPeFile.iSectionHeader[KConstSection])
+		{
+		iConstOffset = size;
+		size += ALIGN4(aPeFile.iSectionHeader[KConstSection]->Misc.VirtualSize);
+		}
+
+	// .crt
+	iCrtOffset=0;
+	if (aPeFile.iSectionHeader[KCrtSection])
+		{
+		iCrtOffset = size;
+		size += ALIGN4(aPeFile.iSectionHeader[KCrtSection]->Misc.VirtualSize);
+		}
+
+	iHdr->iTextSize=size; // The "text" part of the E32 code section combines PE's .text + .rdata + .crt.
+						  // The remainder of the E32 code section is the IAT + export directory.
+
+	// Import Address Table (IAT)
+	TInt nimports=gX86imp?gX86num_imports:aPeFile.NumberOfImports();
+	if (nimports!=0)
+		size+=nimports*4+4; // null terminated
+	
+	// Export Dir
+	if (iHdr->iExportDirCount)
+		{
+		iHdr->iExportDirOffset = iHdr->iCodeOffset + size;
+		size += ALIGN4(iHdr->iExportDirCount*4);
+		}
+	iHdr->iCodeSize=size;
+	return size;
+	}
+
+TInt E32ImageFile_PE::DoDataHeader(PEFile &aPeFile, TUint aDataBase)
+//
+//
+//
+	{
+
+	if (aDataBase == (TUint)0)
+		aDataBase=iHdr->iCodeBase+iHdr->iCodeSize;
+	TInt size=0;
+	if (PEFile::HasInitialisedData(aPeFile.iSectionHeader[KDataSection]))
+		{
+		size=ALIGN4(aPeFile.iSectionHeader[KDataSection]->Misc.VirtualSize);
+		iHdr->iDataBase=aDataBase;
+		iHdr->iDataOffset = iHdr->iCodeOffset + iHdr->iCodeSize;
+		TInt bsssize=aPeFile.iSectionHeader[KDataSection]->Misc.VirtualSize-aPeFile.iSectionHeader[KDataSection]->SizeOfRawData;
+		// drop any uninitialised data
+		if (bsssize>0)
+			{
+			iHdr->iBssSize+=bsssize;
+			size=ALIGN4(aPeFile.iSectionHeader[KDataSection]->SizeOfRawData);
+			}
+		iHdr->iDataSize=size;
+		}
+	else if (aPeFile.iSectionHeader[KDataSection])
+		{ // just .bss
+		iHdr->iDataBase=aDataBase;
+		TInt bsssize=aPeFile.iSectionHeader[KDataSection]->Misc.VirtualSize;
+		iHdr->iBssSize+=bsssize;
+		}
+	if (aPeFile.iSectionHeader[KBssSection])
+		{
+		iHdr->iBssSize+=ALIGN4(aPeFile.iSectionHeader[KBssSection]->Misc.VirtualSize);
+		if (iHdr->iDataBase==0) // .bss but no .data
+			iHdr->iDataBase=aDataBase;
+		}
+	return size;
+	}
+
+TInt E32ImageFile_PE::CopyCode(char *p, PEFile &aPeFile)
+//
+// Copies the files code sections to p
+// returns the number of bytes copied or KErrGeneral
+//
+	{
+
+	// text
+	TInt size=aPeFile.iSectionHeader[KTextSection]->Misc.VirtualSize;
+	memcpy(p, aPeFile.iSectionData[KTextSection], size);
+	TInt text_offset=ALIGN4(size);
+	p+=text_offset;
+
+	// rdata
+	if (aPeFile.iSectionData[KConstSection])
+		{
+		if (gAlignConstSection)
+			{
+			// add padding ahead of const section
+			p += gRequiredConstPadding;
+			}
+		TInt size=ALIGN4(aPeFile.iSectionHeader[KConstSection]->Misc.VirtualSize);
+		memcpy(p, aPeFile.iSectionData[KConstSection], size);
+		p+=size;
+		}
+	if (aPeFile.iSectionData[KCrtSection])
+		{
+		TInt size=ALIGN4(aPeFile.iSectionHeader[KCrtSection]->Misc.VirtualSize);
+		memcpy(p, aPeFile.iSectionData[KCrtSection], size);
+		p+=size;
+		}
+
+	// iat
+	TInt nimports=gX86imp?gX86num_imports:aPeFile.NumberOfImports();
+//	TInt nimports=aPeFile.NumberOfImports();
+	if (nimports)
+		{
+		if (gX86imp)
+			{
+			TUint *rdata=(TUint*)aPeFile.iSectionData[KConstSection];
+			int i;
+			int* s=(int*)gX86imp;
+			s++;
+			for (i=0; i<gX86num_imp_dlls; ++i)
+				{
+				++s;
+				int n=*s++;
+				while (n--)
+					{
+					*(int*)p=rdata[(*s)>>2]&0x7fffffffu;	// rdata offset to ordinal
+					++s;
+					p+=4;
+					}
+				}
+			*(int*)p=0;
+			p+=4;
+			}
+		else
+			{
+			TInt r=CopyImportAddrTable(p, aPeFile);
+			p+=ALIGN4(nimports*4+4);
+			if (r!=KErrNone)
+				return Print(EError, "%s is importing symbols by name.\n", iFileName);
+			}
+		}
+	// export dir
+	CreateExportDirectory(p, aPeFile);
+	p+=iHdr->iExportDirCount*4;
+	return iHdr->iCodeSize;
+	}
+
+TInt E32ImageFile_PE::CopyData(char *p, PEFile &aPeFile)
+	{
+	
+	if (iHdr->iDataSize)
+		memcpy(p, aPeFile.iSectionData[KDataSection], iHdr->iDataSize);
+	return iHdr->iDataSize;
+	}
+
+TInt E32ImageFile_PE::Translate(const char* aFileName, TUint aDataBase, TBool aAllowDllData, TBool /*aSymLkupEnabled*/)
+//
+// Translate a PE format file to a E32Image file
+//
+	{
+	iSource = EPeFile;
+	PEFile pefile;
+	if (!pefile.Init((const char * const)aFileName))
+		return KErrGeneral;
+	TInt r=pefile.ReadSectionHeaders();
+	if (r!=KErrNone) return r;
+	r=pefile.ReadData();
+	if (r!=KErrNone) return r;
+	pefile.Close();
+	r=pefile.Normalise();
+	if (r!=KErrNone) return r;
+	iFileName = strdup(aFileName);
+
+	Adjust(ALIGN4(sizeof(E32ImageHeaderV)));	// fixed for now because holes not supported
+	SetDefaultHeader();
+	if (gX86imp)
+		iHdr->iDllRefTableCount=gX86num_imp_dlls;
+	else
+		iHdr->iDllRefTableCount=pefile.NumberOfImportDlls();
+	iHdr->iExportDirCount=pefile.NumberOfExports();
+	iHdr->iCodeBase=pefile.iLinkedBase;
+	TInt nimports=gX86imp?gX86num_imports:pefile.NumberOfImports();
+
+	TInt importSectionSize;
+	char *newImportSection=CreateImportSection(pefile, importSectionSize);
+
+	TInt size = ALIGN4(sizeof(E32ImageHeaderV));	// fixed for now because holes not supported
+	iHdr->iCodeOffset = size;
+	TInt pos = size;
+	size+=DoCodeHeader(pefile);
+	TInt t=DoDataHeader(pefile, aDataBase);
+	if (t>0)
+		{
+		iHdr->iDataOffset = size;
+		size += t;
+		}
+	if (importSectionSize!=0)
+		{
+		iHdr->iImportOffset = size;
+		size += importSectionSize;
+		}
+
+	char *newCodeRelocs=NULL;
+	char *newDataRelocs=NULL;
+	TInt codeRelocSize=0, dataRelocSize=0;
+	TInt nrelocs=pefile.NumberOfRelocs();
+	if (nrelocs)
+		{
+		TUint *relocs=new TUint [nrelocs];
+		TUint *relocsection=new TUint [nrelocs];
+		pefile.GetRelocs(relocs, relocsection, nrelocs);
+		FixRelocs(pefile, relocs, relocsection, nrelocs);
+		newCodeRelocs=CreateCodeRelocs(relocs, relocsection, nrelocs, codeRelocSize);
+		newDataRelocs=CreateDataRelocs(relocs, relocsection, nrelocs, dataRelocSize);
+		if (codeRelocSize)
+			{
+			iHdr->iCodeRelocOffset = size;
+			size += codeRelocSize;
+			}
+		if (dataRelocSize)
+			{
+			iHdr->iDataRelocOffset = size;
+			size += dataRelocSize;
+			}
+		delete [] relocs;
+		delete [] relocsection;
+		}
+
+	Adjust(size);
+	t=CopyCode(iData + pos, pefile);
+	if (t<0)
+		return KErrGeneral;
+	pos += t;
+	pos += CopyData(iData + pos, pefile);
+	if (nimports)
+		{
+		memcpy(iData + pos, newImportSection, importSectionSize);
+		pos += importSectionSize;
+		}
+	if (codeRelocSize)
+		{
+		memcpy(iData + pos, newCodeRelocs, codeRelocSize);
+		pos += codeRelocSize;
+		}
+	if (dataRelocSize)
+		{
+		memcpy(iData + pos, newDataRelocs, dataRelocSize);
+		pos += dataRelocSize;
+		}
+
+	// locate the entry point
+	// entry point must be in the text section
+	TInt entryPointSectionIndex=pefile.FindSectionByVa(pefile.iEntryPoint+pefile.iLinkedBase);
+	TUint entryPointOffset=pefile.iEntryPoint-pefile.iSectionHeader[entryPointSectionIndex]->VirtualAddress;
+	if (entryPointSectionIndex!=KTextSection)
+		return Print(EError, "Entry Point not in code section\n");
+
+	// Arrange a header for this E32 Image
+	switch (pefile.iCpu)
+		{
+	case IMAGE_FILE_MACHINE_I386:
+		iHdr->iCpuIdentifier = (TUint16)ECpuX86;
+		break;
+	case 0x0a00:
+		iHdr->iCpuIdentifier = (TUint16)ECpuArmV4;
+		break;
+	case 0x0b00:
+		iHdr->iCpuIdentifier = (TUint16)ECpuMCore;
+		break;
+	default:
+		iHdr->iCpuIdentifier = (TUint16)ECpuUnknown;
+		break;
+		}
+
+	// Import format is PE-derived without redundant ordinal lists
+	// ABI is GCC98r2 ABI (on ARM)
+	iHdr->iFlags |= KImageImpFmt_PE2;
+
+	if (pefile.iImageIsDll)
+		{
+		iHdr->iFlags|=KImageDll;
+		if (iHdr->iDataSize && !aAllowDllData)
+			return Print(EError, "Dll '%s' has initialised data.\n", iFileName);
+		if (iHdr->iBssSize  && !aAllowDllData)
+			return Print(EError, "Dll '%s' has uninitialised data.\n", iFileName);
+		}
+	iHdr->iHeapSizeMin=pefile.iHeapCommittedSize;
+	iHdr->iHeapSizeMax=pefile.iHeapReservedSize;
+	iHdr->iStackSize=pefile.iStackCommittedSize;
+	iHdr->iEntryPoint=entryPointOffset;
+	r = DetermineEntryPointType();
+	if (r == KErrCorrupt)
+		return Print(EError, "File '%s': Bad Entry Point.\n", iFileName);
+	else if (r == KErrNotSupported)
+		return Print(EError, "File '%s': Bad Entry Point Type.\n", iFileName);
+
+	delete [] newImportSection;
+	delete [] newCodeRelocs;
+	delete [] newDataRelocs;
+
+	return KErrNone;
+	}
+
+TBool E32ImageFile_PE::Translate(PEFile &aPeFile)
+//
+//
+//
+	{
+
+	return Translate((const char*)aPeFile.iFileName, (TUint)0, EFalse, EFalse);
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bintools/petools/pefile/pe_utl.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,94 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <e32std.h>
+#include <e32std_private.h>
+#include "pe_file.h"
+#include <string.h>
+#include "e32image.h"
+#include "h_utl.h"
+
+TInt PEFile::CmpSectionName(PIMAGE_SECTION_HEADER apSectionHeader, char *aName)
+//
+// Returns true if the name of the pe section is the same as aName
+//
+	{
+
+	return (strnicmp((const char *)apSectionHeader->Name, aName, IMAGE_SIZEOF_SHORT_NAME)==0);
+	}
+
+TInt PEFile::VirtualAddressInSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader)
+//
+// Returns true if the virtual address is in the section
+//
+	{
+
+	TUint start = iLinkedBase + aHeader->VirtualAddress;
+	TUint finish = start + aHeader->Misc.VirtualSize;
+	return (aVA>=start) && (aVA<finish);
+	}
+
+TUint PEFile::DistanceFromSection(TUint aVA, PIMAGE_SECTION_HEADER aHeader)
+//
+// Returns the minimum distance from aVA to any address in the specified section
+//
+	{
+
+	TUint start = iLinkedBase + aHeader->VirtualAddress;
+	TUint finish = start + aHeader->Misc.VirtualSize;
+	if (aVA>=start)
+		{
+		if (aVA<finish)
+			return 0;
+		return aVA - finish + 1;
+		}
+	return start - aVA;
+	}
+
+TInt PEFile::FindSectionByVa(TUint aVA, TUint aTryToBeClever)
+	{
+	TInt i;
+	TInt s = -1;
+	if (aTryToBeClever == 0)
+		{
+		for (i=0; i<KNumberOfSections; i++)
+			if (iSectionHeader[i])
+				if (VirtualAddressInSection(aVA, iSectionHeader[i]))
+					s=i;
+		}
+	if (aTryToBeClever == 1)
+		{
+		// Find the minimum distance from the specified address to any section
+		TUint dist = KMaxTUint;
+		for (i=0; i<KNumberOfSections; i++)
+			{
+			if (!iSectionHeader[i])
+				continue;
+			TUint d = DistanceFromSection(aVA, iSectionHeader[i]);
+			if (d < dist)
+				{
+				dist = d;
+				s = i;
+				}
+			else if (d == dist)
+				{
+				s = -1;	// Ambiguous :-(
+				}
+			}
+		if (dist >= 0x1000u)
+			s = -1;		// too far for comfort
+		}
+	return s;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/cpp-2.9-psion-98r2/Copying	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,340 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
+	    How to Apply These Terms to Your New Programs
+
+  If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+  To do so, attach the following notices to the program.  It is safest
+to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+    <one line to give the program's name and a brief idea of what it does.>
+    Copyright (C) 19yy  <name of author>
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this
+when it starts in an interactive mode:
+
+    Gnomovision version 69, Copyright (C) 19yy name of author
+    Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+    This is free software, and you are welcome to redistribute it
+    under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License.  Of course, the commands you use may
+be called something other than `show w' and `show c'; they could even be
+mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the program, if
+necessary.  Here is a sample; alter the names:
+
+  Yoyodyne, Inc., hereby disclaims all copyright interest in the program
+  `Gnomovision' (which makes passes at compilers) written by James Hacker.
+
+  <signature of Ty Coon>, 1 April 1989
+  Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into
+proprietary programs.  If your program is a subroutine library, you may
+consider it more useful to permit linking proprietary applications with the
+library.  If this is what you want to do, use the GNU Library General
+Public License instead of this License.
Binary file cpptoolsplat/cpp-2.9-psion-98r2/c++filt.exe has changed
Binary file cpptoolsplat/cpp-2.9-psion-98r2/cpp.exe has changed
Binary file cpptoolsplat/cpp-2.9-psion-98r2/cygwin1.dll has changed
Binary file cpptoolsplat/cpp-2.9-psion-98r2/diff.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/cpp-2.9-psion-98r2/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_EXPORTS
+
+../tail.exe     /epoc32/gcc/bin/tail.exe
+../c++filt.exe     /epoc32/gcc/bin/c++filt.exe
+../Copying     /epoc32/gcc/bin/Copying
+../cpp.exe     /epoc32/gcc/bin/cpp.exe
+../cygwin1.dll     /epoc32/gcc/bin/cygwin1.dll
+../diff.exe     /epoc32/gcc/bin/diff.exe
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/cpp-2.9-psion-98r2/group/cpp-2.9-psion-98r2.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component	dev_build_cpptoolsplat_cpp-2.9-psion-98r2
+
+source		\src\tools\build\cpptoolsplat\cpp-2.9-psion-98r2
+exports		\src\tools\build\cpptoolsplat\cpp-2.9-psion-98r2\group
+notes_source	\component_defs\release.src
+
+ipr T
+ipr O  \src\tools\build\cpptoolsplat\cpp-2.9-psion-98r2
+
Binary file cpptoolsplat/cpp-2.9-psion-98r2/tail.exe has changed
Binary file cpptoolsplat/gcce-3.4.3/arm-none-symbianelf-2005-q1c.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-3.4.3/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_EXPORTS
+
+../arm-none-symbianelf-2005-q1c.exe     /epoc32/tools/distrib/arm-none-symbianelf-2005-q1c.exe
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-3.4.3/group/gcce-3.4.3.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	    dev_build_cpptoolsplat_gcce-3.4.3
+
+source          /src/tools/build/cpptoolsplat/gcce-3.4.3
+exports         /src/tools/build/cpptoolsplat/gcce-3.4.3/group
+
+notes_source    ./release.txt   
+
+ipr T
+ipr O           /src/tools/build/cpptoolsplat/gcce-3.4.3
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-3.4.3/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+NOTESRC_RELEASER
+Nokia Corporation
+
+NOTESRC_RELEASE_REASON
+gcce-3.4.3 Release
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-4.3.2/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_EXPORTS
+
+../arm-none-symbianelf-2008-q3-67.exe   /epoc32/tools/distrib/arm-none-symbianelf-2008-q3-67.exe
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-4.3.2/group/gcce-4.3.2.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	    dev_build_cpptoolsplat_gcce-4.3.2
+
+source          /src/tools/build/cpptoolsplat/gcce-4.3.2
+exports         /src/tools/build/cpptoolsplat/gcce-4.3.2/group
+
+notes_source    ./release.txt   
+
+ipr T
+ipr O           /src/tools/build/cpptoolsplat/gcce-4.3.2
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/gcce-4.3.2/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,7 @@
+NOTESRC_RELEASER
+Symbian Software Ltd. (kits.notify@symbian.com)
+
+NOTESRC_RELEASE_REASON
+gcce-4.3.2 Release
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/mingw-gcc-3.4.5/gcc_mingw.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,79 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This is the preinclude file for the MinGW GCC compiler
+// 
+//
+
+/**
+ @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
+#if !defined __WINS__ && defined _WIN32 /* VC++ Browser Hack */
+#define EXPORT_C
+/** @internalTechnology */
+#define asm(x)
+#else
+#define EXPORT_C __declspec(dllexport)
+#endif
+#define NONSHARABLE_CLASS(x) class x
+#define NONSHARABLE_STRUCT(x) struct x
+#define __NO_THROW
+#define __DOUBLE_WORDS_SWAPPED__
+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
+typedef wchar_t __TText;
+
+
+#include <exception>
+
+// A few extras for compiling on Windows
+//#ifdef __TOOLS2_WINDOWS__
+//#define _STLP_LITTLE_ENDIAN
+//#define __MINGW__
+//#endif
+
+// 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
+#define _MINGW_INL
+
+// the end of the pre-include
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/mingw-gcc-3.4.5/gcc_mingw_3_4_2.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,79 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This is the preinclude file for the MinGW GCC compiler
+// 
+//
+
+/**
+ @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
+#if !defined __WINS__ && defined _WIN32 /* VC++ Browser Hack */
+#define EXPORT_C
+/** @internalTechnology */
+#define asm(x)
+#else
+#define EXPORT_C __declspec(dllexport)
+#endif
+#define NONSHARABLE_CLASS(x) class x
+#define NONSHARABLE_STRUCT(x) struct x
+#define __NO_THROW
+#define __DOUBLE_WORDS_SWAPPED__
+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
+typedef wchar_t __TText;
+
+
+#include <exception>
+
+// A few extras for compiling on Windows
+//#ifdef __TOOLS2_WINDOWS__
+//#define _STLP_LITTLE_ENDIAN
+//#define __MINGW__
+//#endif
+
+// 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
+#define _MINGW_INL
+
+// the end of the pre-include
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/mingw-gcc-3.4.5/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_EXPORTS
+
+../gcc_mingw_3_4_2.h             /epoc32/include/gcc_mingw/gcc_mingw_3_4_2.h
+../gcc_mingw.h                   /epoc32/include/gcc_mingw/gcc_mingw.h
+:zip ../mingw-symbian-001.zip    /epoc32/gcc_mingw
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/mingw-gcc-3.4.5/group/mingw-gcc-3.4.5.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component	dev_build_cpptoolsplat_mingw-gcc-3.4.5
+
+source		\src\tools\build\cpptoolsplat\mingw-gcc-3.4.5
+exports		\src\tools\build\cpptoolsplat\mingw-gcc-3.4.5\group
+notes_source	\component_defs\release.src
+
+ipr T
+ipr O  \src\tools\build\cpptoolsplat\mingw-gcc-3.4.5
+
Binary file cpptoolsplat/mingw-gcc-3.4.5/mingw-symbian-001.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/stlport/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,29 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXTENSIONS
+START EXTENSION tools/stlport
+  OPTION STLPORT_VERSION  5.1.0
+  OPTION STL_REL_LIB_NAME  libstlport.5.1.a
+  OPTION STL_DEB_LIB_NAME  libstlportg.5.1.a
+  OPTION SOURCE_ARCHIVE ../source/STLport-5.1.0.zip
+END
+
+PRJ_EXPORTS
+
+:zip ../source/STLport-5.1.0_exports.zip				/epoc32/include/tools/stlport
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/stlport/group/stlport.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+component	dev_build_cpptoolsplat_stlport
+
+source		\src\tools\build\cpptoolsplat\stlport
+binary		\src\tools\build\cpptoolsplat\stlport\group all
+exports		\src\tools\build\cpptoolsplat\stlport\group
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cpptoolsplat/stlport/source/README.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+The File <STLport-5.1.0\stlport\stl\config\stl_mycomp.h> has been manually configured, in order for it to recognise the g++ compiler.
+
+The Change is made to the _STLP_NATIVE_INCLUDE_PATH macro, by uncommenting it, and removing the path (../include) being pointed to by it.
\ No newline at end of file
Binary file cpptoolsplat/stlport/source/STLport-5.1.0.zip has changed
Binary file cpptoolsplat/stlport/source/STLport-5.1.0_exports.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/eruntest/eruntest.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,327 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <windows.h>
+
+#ifdef __MSVCDOTNET__
+ #include <iostream>
+ #include <fstream>
+ using namespace std;
+#else //!__MSVCDOTNET__
+ #include <iostream.h>
+ #include <fstream.h>
+#endif //__MSVCDOTNET__
+
+#include <stdio.h>
+#include <errno.h>
+
+#if defined(__VC32__) && !defined(__MSVCDOTNET__)
+#pragma warning( disable : 4710 )	// 'fn': function not inlined
+#endif // old MSVC
+
+const unsigned int KMaxLineLen=256;
+const unsigned int KTimeout=600000; // 10 minutes
+
+
+void NumFileLines(ifstream& inStream, unsigned int &aNumLines)
+	{
+	// finds out how many lines are in the file specified
+
+	aNumLines=0;
+	inStream.clear();
+	inStream.seekg(0);
+
+	char str[KMaxLineLen];
+	while (!inStream.eof())
+		{
+		inStream.getline(str, KMaxLineLen);
+		aNumLines++;
+		}
+	}
+
+void GetTestData(ifstream& inStream, char (*aDataArray)[KMaxLineLen], unsigned int &aNumTests)
+	{
+	// fill the test data structure from the file stream
+
+	aNumTests=0;
+	inStream.clear();
+	inStream.seekg(0);
+
+	char str[KMaxLineLen]="";
+	while (!inStream.eof())
+		{
+		bool charsPresent=0;
+		inStream.getline(str, KMaxLineLen);
+		if (strlen(str))
+			{
+			unsigned int len=strlen(str);
+			for (unsigned int i=0; i<len; i++)
+				{
+				if (!isspace(str[i]))
+					{
+					charsPresent=1;
+					break;
+					}
+				}
+			if (charsPresent)
+				{
+				strcpy(aDataArray[aNumTests], str);
+				aNumTests++;
+				}
+			}
+		}
+	}
+
+int GetTestOutFileName(char* aOutFile)
+	{
+	// Gets the temporary file in which RTest puts its output
+		
+	const char KTestOutFileName[16]="epocwind.out";
+	char tmpDir[KMaxLineLen]="";
+	int r=0;
+
+	aOutFile[0]='\0';
+	int len=GetTempPath(KMaxLineLen, tmpDir);
+	if (len==0||len>KMaxLineLen)
+		r=1;
+	
+	if (!r)
+		if (KMaxLineLen > (strlen(KTestOutFileName)+strlen(tmpDir)))
+			{
+			strcpy(aOutFile, tmpDir);
+			strcat(aOutFile, KTestOutFileName);
+			}
+		else
+			r=1;
+	return(r);
+	}
+
+void RemoveLeadingSpaces(char* aStr)
+	{
+	// removes leading whitespace from a string
+
+	int spaces=0;
+	while (isspace(aStr[spaces]))
+		spaces++;
+	int newLen=strlen(aStr)-spaces;
+	for (int j=0;j<=newLen;j++)
+		aStr[j]=aStr[j+spaces];
+	}
+
+int TestSucceeded(char* aLastLineBut1)
+	{
+	// checks whether an EPOC RTest has succeeded by comparing the
+	// last line but 1 in the EPOCWIND.OUT file with a template success
+	// string
+
+	int r=0;
+	const char KSuccessResult[20]="RTEST: SUCCESS :";
+
+	char testStr[KMaxLineLen];
+	strcpy(testStr,aLastLineBut1);
+	RemoveLeadingSpaces(testStr);
+	testStr[strlen(KSuccessResult)]='\0';
+	if (strcmp(testStr, KSuccessResult)==0)
+		r=1;
+	return(r);
+	}
+
+int GetPenultimateLines(char* aFile, char* aLastLineBut1, char* aLastLineBut2)
+	{
+	// Gets the two penultimate lines in a file.
+	// Returns 0 if successful, 1 otherwise.
+
+	int r=0;
+
+	aLastLineBut1[0]='\0';
+	aLastLineBut2[0]='\0';
+
+	ifstream fileStream(aFile);
+	if (!fileStream)
+		r=1;
+
+	if (!r)
+		{
+		char lastLine[KMaxLineLen]="";
+		while (!fileStream.eof())
+			{
+			strcpy(aLastLineBut2, aLastLineBut1);
+			strcpy(aLastLineBut1, lastLine);
+			fileStream.getline(lastLine, KMaxLineLen);
+			}
+		}
+	return(r);	
+	}
+
+int main(int argc, char *argv[])
+	{
+	FILE *stream = NULL;
+	if (argc != 2)
+		{
+		cerr << "Syntax: eruntest <batch_file>" << endl;
+		return(1);
+		}
+	// Check if input file exists
+	if( (stream  = fopen(argv[1], "r" )) == NULL)
+		{
+		cerr << "ERROR: Cannot open input file " << argv[1] << endl;
+		return(1);
+		}
+	else 
+		fclose(stream); 
+//	stream the input file
+	ifstream inFile(argv[1]);
+	
+	// get the number of lines in the input file
+	unsigned int numLines=0;
+	NumFileLines(inFile, numLines);
+	
+	// allocate space for the tests names
+	char (*pTests)[KMaxLineLen];
+	pTests = new char[numLines][KMaxLineLen];
+	if (!pTests)
+		{
+		cerr << "ERROR: Out of memory" << endl;
+		return(1);
+		}
+
+	// populate the data structure for the tests
+	unsigned int numTests=0;
+	GetTestData(inFile, pTests, numTests);
+
+	// Get the test output file name
+	char testOutFile[KMaxLineLen];
+	if (GetTestOutFileName(testOutFile)!=0)
+		{
+		cerr << "Error getting temporary path" << endl;
+		return(1);
+		}
+
+	// Get the current directory
+	char currentDir[KMaxLineLen]="";
+	GetCurrentDirectory(KMaxLineLen, currentDir);
+	strcat(currentDir, "\\");
+
+	// Retrieve the STARTUPINFO structure for the current process
+	STARTUPINFO startUpInfo;
+	PROCESS_INFORMATION procInfo;
+	GetStartupInfo(&startUpInfo);
+	
+	unsigned failCount=0;
+	unsigned timeoutCount=0;
+	unsigned cantStartCount=0;
+	unsigned unknownCount=0;
+
+	// run each test in turn
+	for (unsigned int i=0; i<numTests; i++)
+		{
+
+		// remove epocwind.out
+		remove(testOutFile);
+		if (errno==EACCES)
+			{
+			cerr << "Cannot remove " << testOutFile << endl;
+			return(1);
+			}
+
+		// Create the child process
+		if (!CreateProcess(0, pTests[i], 0, 0, FALSE, 0,0, 0, &startUpInfo, &procInfo))
+			{
+			// int error=GetLastError();
+			cout << "CAN'T START: " << currentDir << pTests[i] << endl;
+			cantStartCount++;
+			continue;
+			}
+
+		// Wait for the child process to complete
+		int ret=WaitForSingleObject(procInfo.hProcess, KTimeout);
+		ifstream testOutFileStream(testOutFile);
+
+		char lastLineBut1[KMaxLineLen]="";
+		char lastLineBut2[KMaxLineLen]="";
+		switch (ret)
+			{
+			case WAIT_OBJECT_0:
+				// find out if the test terminated successfully
+				if (GetPenultimateLines(testOutFile, lastLineBut1, lastLineBut2)!=0)
+					{
+					cout << "UNKNOWN: " << currentDir << pTests[i] << endl;
+					cout << "  <no test output file>" << endl;
+					unknownCount++;
+					}
+				else
+					{
+					// make the comparison
+					if (TestSucceeded(lastLineBut1))
+						cout << "PASSED: " << currentDir << pTests[i] << endl;
+					else
+						{
+						cout << "FAILED(RTest): " << currentDir << pTests[i] << endl;
+						cout << "  " << lastLineBut2 << endl;
+						cout << "  " << lastLineBut1 << endl;
+						cout << endl;
+						failCount++;
+						}
+					}
+				break;
+			case WAIT_FAILED:
+				cout << "FAILED: " << currentDir << pTests[i] << endl;
+				if (GetPenultimateLines(testOutFile, lastLineBut1, lastLineBut2)!=0)
+					{
+					cout << "  <no test output file>" << endl;
+					}
+				else
+					{
+					cout << "  " << lastLineBut2 << endl;
+					cout << "  " << lastLineBut1 << endl;
+					cout << endl;
+					}
+				failCount++;
+				break;
+			case WAIT_TIMEOUT:
+				cout << "TIMED OUT: " << currentDir << pTests[i] << endl;
+				if (GetPenultimateLines(testOutFile, lastLineBut1, lastLineBut2)!=0)
+					{
+					cout << "  <no test output file>" << endl;
+					}
+				else
+					{
+					cout << "  " << lastLineBut2 << endl;
+					cout << "  " << lastLineBut1 << endl;
+					cout << endl;
+					}
+				timeoutCount++;
+				if (!TerminateProcess(procInfo.hProcess, 1))
+					{
+					cout << "FROZEN: " << currentDir << endl;
+					cout << "  Cannot terminate - kill via Task Manager"  << endl;
+					cout << endl;
+					}
+				break;
+			}
+		}
+
+	delete [] pTests;
+
+	cout << endl;
+	cout << "TotalErrors   " << dec << (failCount+timeoutCount+unknownCount+cantStartCount) << endl;
+	cout << "  Failures    " << dec << failCount << endl;
+	cout << "  Timeouts    " << dec << timeoutCount << endl;
+	cout << "  Unknown     " << dec << unknownCount << endl;
+	cout << "  Can't start " << dec << cantStartCount << endl;
+	cout << endl;
+
+	return(0);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/eruntest/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+eruntest.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/eruntest/group/eruntest.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			eruntest.exe
+TARGETTYPE		exe
+SOURCEPATH	../../eruntest
+SOURCE			 eruntest.cpp
+
+ 
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/eruntest/group/eruntest.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_deprecated_eruntest
+
+source          /src/tools/build/deprecated/eruntest
+exports         /src/tools/build/deprecated/eruntest/group
+binary          /src/tools/build/deprecated/eruntest/group all
+
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/etouch/etouch.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,46 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#if defined(__MSVCDOTNET__) || defined (__TOOLS2__)
+ #include <iostream>
+ using namespace std;
+#else //!__MSVCDOTNET__
+ #include <iostream.h>
+#endif //__MSVCDOTNET__
+
+#if defined(__VC32__) || defined(__TOOLS2__)
+ #include <sys\utime.h>
+#else
+ #include <utime.h>
+#endif
+
+#if defined(__VC32__) && !defined(__MSVCDOTNET__)
+#pragma warning( disable : 4710 )	// 'fn': function not inlined
+#endif // old MSVC
+
+int main(int argc,char *argv[])
+//
+// Collect the filename from the command line
+// and change its date/time stamp to the current date/time
+//
+	{
+
+	if (argc!=2)
+		{
+		cout << "Syntax: etouch filename" << endl;
+		return(1);
+		}
+	return(utime(argv[1],NULL)==(-1) ? 1 : 0);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/etouch/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+etouch.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/etouch/group/etouch.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			etouch.exe
+TARGETTYPE		exe
+SOURCEPATH	../../etouch
+SOURCE			 etouch.cpp
+ 
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/etouch/group/etouch.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_deprecated_etouch
+
+source          /src/tools/build/deprecated/etouch
+exports         /src/tools/build/deprecated/etouch/group
+binary          /src/tools/build/deprecated/etouch/group all
+
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/fix_eabi_think_offsets/fix_eabi_thunk_offsets.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,427 @@
+:: 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 "Eclipse Public License v1.0"
+:: which accompanies this distribution, and is available
+:: at the URL "http://www.eclipse.org/legal/epl-v10.html".
+::
+:: Initial Contributors:
+:: Nokia Corporation - initial contribution.
+::
+:: Contributors:
+::
+:: Description:
+::
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+goto endofperl
+@rem ';
+#!perl
+#line 28
+
+use strict;
+use Getopt::Long;
+
+my $toolVersion = "1.0";
+
+my $update = 0;
+my $use_perforce = 0;
+my $verbose = 0;
+my $defFile;
+
+# 1. Check arguments, output help etc.
+
+GetOptions (
+	'update' => \$update,			# modify the files
+	'perforce' => \$use_perforce,	# apply "p4 edit" to changed files
+	'v+' => \$verbose,				# print extra diagnostic info
+	'match=s' => \$defFile			# only process DEF files matching a pattern
+	);
+
+if (@ARGV == 0)
+	{
+	print STDERR "\nfix_eabi_thunk_offsets.bat - Version $toolVersion\n";
+
+	print STDERR << 'END_OF_HELP';
+
+Usage: fix_eabi_think_offsets [-update] [-perforce] [-match exp] build_log ... 
+
+Parse the output from one or more build logs, extracting MAKEDEF errors and
+warnings which relate to EABI virtual function override thunks. Using this
+information, prepare modified DEF files in which each "missing" export is 
+replaced by a corresponding "unfrozen" export.
+
+-update     Overwrite the existing .def files with the modified versions
+-perforce   Apply "p4 edit" to each of the modified .def files
+-match exp  Process only .def files with names that contain "\exp"
+
+NOTE: The tool assumes that the original build source layout is replicated on 
+the drive where it is being executed.
+
+Build logs will sometimes contain corrupted warning messages, in which case
+the tool will probably report that there is nothing to replace some missing
+symbol. It may help to edit the log file and try again: it is always safe to 
+run this tool more than once on the same log file.
+
+END_OF_HELP
+
+	exit(1);
+	}
+
+my $parseWarnings = 1;
+my $parseErrors = 1;
+
+
+# 2. Parse the build logs, extracting the Makedef warnings & errors
+
+my $line;
+my $header;
+my $parseWarning = 0;
+my $parseError = 0;
+my $variant;
+my $component;
+my $sourceDefFile;
+my @errorOutput;
+my @warningOutput;
+
+my %DefFiles;
+my %TempDefFiles;
+
+sub newDefFile($)
+	{
+	my ($defFile) = @_;
+	if (!defined $DefFiles{$defFile})
+		{
+		@{$DefFiles{$defFile}} = \();
+		}
+	}
+
+while ($line = <>)
+	{
+	if ($line =~ /^Chdir /)
+		{
+		$component = $line;
+		$component =~ s/^Chdir //;
+		$component =~ s/\s//g;
+		next;
+		}
+		
+	if (($line =~ /^  make/) && ($line =~ / CFG\=/))
+		{
+		$variant = $line;
+		$variant =~ s/^.*CFG\=//;
+		$variant =~ s/ .*$//;
+		$variant =~ s/\s//g;
+		next;
+		}
+
+	if ($parseWarnings && ($line =~ /MAKEDEF WARNING:/))
+		{
+		$parseWarning =  1;
+		$parseError = 0;
+		$header = $line;
+		next;		
+		}
+		
+	if ($parseErrors && ($line =~ /MAKEDEF ERROR:/))
+		{
+		$parseWarning =  0;
+		$parseError = 1;
+		$header = $line;
+		next;		
+		}
+
+	if ($line !~ /^  /)
+		{
+		$parseWarning = 0;
+		$parseError = 0;
+		next;
+		}
+
+	if ($parseWarning)
+		{
+		if ($header)
+			{
+			if ($defFile && ($header !~ /\\$defFile/i))
+				{
+				$parseWarning = 0;
+				$parseError = 0;
+				next;
+				}
+			
+			$sourceDefFile = $header;
+			$sourceDefFile =~ s/^.*not yet Frozen in//;
+			$sourceDefFile =~ s/://;
+			$sourceDefFile =~ s/\s//g;
+			
+			push @warningOutput, "--\n$sourceDefFile ($variant)\n$component\n$header";
+			newDefFile($sourceDefFile);
+			$header = "";
+			}
+
+		next if ($line =~ /\*\*\*/);
+		if ($line =~ /^  (\S.*}\.def)(\(\d+\) : \S+.*)$/)
+			{
+			push @{$DefFiles{$sourceDefFile}}, "W$2";
+			$TempDefFiles{$1} = $sourceDefFile;
+			}
+		push @warningOutput, $line;
+		
+		next;		
+		}
+
+	if ($parseError)
+		{
+		if ($defFile && ($line !~ /\\$defFile/i))
+			{
+			$parseWarning = 0;
+			$parseError = 0;
+			next;
+			}
+			
+		if ($header)
+			{
+			$sourceDefFile = $line;
+			$sourceDefFile =~ s/\(.*$//;
+			$sourceDefFile =~ s/\s//g;
+
+			push @errorOutput, "--\n$sourceDefFile ($variant)\n$component\n$header";
+			newDefFile($sourceDefFile);
+			$header = "";
+			}
+
+		next if ($line =~ /\*\*\*/);
+		if ($line =~ /(\(\d+\) : \S+.*)$/)
+			{
+			push @{$DefFiles{$sourceDefFile}}, "E$1";
+			}
+		push @errorOutput, $line;
+		
+		next;
+		}
+
+	# Catch a orphaned warning line...
+	
+	if ($line =~ /^  (\S.*}\.def)(\(\d+\) : \S+.*)$/)
+		{
+		my $tempDefFile = $1;
+		my $newline = $2;
+		
+		next if ($defFile && ($tempDefFile !~ /\\$defFile/i));
+
+		my $sourceDefFile = $TempDefFiles{$tempDefFile};
+		push @{$DefFiles{$sourceDefFile}}, "W$newline";
+		push @warningOutput, $line;
+		}
+
+	}
+
+close BUILD_LOG;
+
+# 3. Process the information for each DEF file
+
+my %Classes;
+my @DefFileList;
+
+foreach my $def (sort keys %DefFiles)
+	{
+	my @replacements;
+	my @errors;
+	my @warnings;
+	my $problems = 0;
+	
+	print "\n----\n$def\n";
+	if ($verbose > 1)
+		{
+		print "Information extracted from Makedef warnings and errors:\n";
+		# printed inside the following loop...
+		}
+
+	# Process into lists of errors and warnings which can be sorted
+	
+	my $previousline = "";
+	foreach $line (sort @{$DefFiles{$def}})
+		{
+		next if ($line eq $previousline);	# skip duplicates
+		$previousline = $line;
+		print "\t$line\n" if ($verbose > 1);
+			
+		if ($line =~ /^(.)\((\d+)\) : (((_ZTh|_ZTv)([n0-9_]+)_(NK?(\d+)(\S+)))\s.*)$/)
+			{
+			my $msgtype = $1;
+			my $lineno = $2;
+			my $defline = $3;
+			my $symbol = $4;
+			my $thunkprefix = $5;
+			my $thunkoffset = $6;
+			my $unthunked = $7;
+			my $topnamelen = $8;
+			my $restofsymbol = $9;
+			
+			if ($msgtype eq "E")
+				{
+				push @errors, "$unthunked\@$thunkprefix $thunkoffset $lineno $symbol";
+				}
+			else
+				{
+				push @warnings, "$unthunked\@$thunkprefix $thunkoffset $symbol";
+				}
+				
+			my $class = substr $restofsymbol, 0, $topnamelen;
+			$Classes{$class} = 1;
+			}
+		else
+			{
+			print "WARNING: Ignored - not a thunk: $line\n";
+			}
+		}
+	
+	# Match up the errors and warnings for related symbols
+	
+	@errors = sort @errors;
+	@warnings = sort @warnings;
+	my $error;
+	my $warning;
+	while (scalar @errors && scalar @warnings)
+		{
+		# Unpack the first entry in each of the lists
+		
+		$error = shift @errors;
+		my ($ekey, $eoffset, $eline, $esymbol) = split / /, $error;
+		$warning = shift @warnings;
+		my ($wkey, $woffset, $wsymbol) = split / /, $warning;
+		
+		# Are they for the same thunk?
+		
+		if ($ekey lt $wkey) 
+			{
+			# no - unmatched error, so put back the warning
+			unshift @warnings, $warning;
+			print "Nothing to replace missing symbol on $eline : $esymbol\n";
+			$problems += 1;
+			next;
+			}
+		
+		if ($ekey gt $wkey)
+			{
+			# no - unmatched warning, so put back the error
+			unshift @errors, $error;
+			print "Nothing missing for replacement symbol : $wsymbol\n";
+			$problems += 1;
+			next;
+			}
+		
+		# Yes - create replacement instruction
+		
+		push @replacements, "$eline $esymbol => $wsymbol";
+		}
+	
+	# drain remaining problems, if any
+	
+	foreach my $error (@errors)
+		{
+		my ($ekey, $eoffset, $eline, $esymbol) = split / /, $error;
+		print "Nothing to replace missing symbol on $eline : $esymbol\n";
+		$problems += 1;
+		}
+	foreach my $warning (@warnings)
+		{
+		my ($wkey, $woffset, $wsymbol) = split / /, $warning;
+		print "Nothing missing for replacement symbol : $wsymbol\n";
+		$problems += 1;
+		}
+		
+	if ($verbose)
+		{
+		print "\nSubstitions identified:\n\t";
+		print join("\n\t", sort @replacements);
+		print "\n";
+		}
+	
+	open DEFFILE, "<$def" or print "Can't open $def: $!\n" and next;
+	my @deflines = <DEFFILE>;
+	close DEFFILE;
+	my $changedlines = 0;
+
+	foreach my $fix (@replacements)
+		{
+		my ($lineno, $before, $to, $after) = split ' ', $fix;
+
+		my $line = @deflines[$lineno-1];
+		if ($line =~ /\s($after)\s/)
+			{
+			print "$lineno - already fixed\n";
+			next;
+			}
+		if ($line =~ /\s($before)\s/)
+			{
+			$line =~ s/(\s)$before(\s)/$1$after$2/;
+			@deflines[$lineno-1] = $line;
+			print "Changed $lineno to $line" if ($verbose > 1);
+			$changedlines += 1;
+			next;
+			}
+		print "$lineno doesn't contain $before\n";
+		$problems += 1;
+		}
+	print "\n";
+	
+	if ($problems != 0)
+		{
+		print "WARNING: $problems thunks could not be repaired\n";
+		}
+
+	if ($changedlines == 0)
+		{
+		print "Nothing to change\n";
+		next;
+		}
+	print "Will change $changedlines lines\n\n";
+
+	# Now update the file (and edit in Perforce if required)
+		
+	if ($update)
+		{
+		chmod 0666, $def;	# make it writeable
+		
+		open DEFFILE, ">$def" or print "Can't open $def for writing: $!\n" and next;
+		print DEFFILE @deflines;
+		close DEFFILE;
+		
+		print "Updated $def\n";
+		push @DefFileList, $def;
+		
+		if ($use_perforce)
+			{
+			print "* p4 edit $def\n";
+			system "p4 edit $def";
+			print "\n";
+			}
+		}
+	}
+
+# 5. More diagnostic information
+
+if (scalar @DefFileList)
+	{
+	print "\nList of updated def files\n";
+	print join("\n", @DefFileList);
+	print "\n";
+	}
+
+if ($verbose && scalar keys %Classes != 0)
+	{
+	print "\nList of affected classes:\n";
+	print join("\n", sort keys %Classes), "\n";
+	}
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/fix_eabi_think_offsets/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/fix_eabi_think_offsets/group/fix_eabi_thunk_offsets.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_sbsv1_fix_eabi_thunk_offsets
+
+source	\src\tools\build\sbsv1\fix_eabi_thunk_offsets
+binary	\src\tools\build\sbsv1\fix_eabi_thunk_offsets\group	all
+exports	\src\tools\build\sbsv1\fix_eabi_thunk_offsets\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/rommask/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+rommask.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/rommask/group/rommask.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			rommask.exe
+TARGETTYPE		exe
+SOURCEPATH	../../rommask
+SOURCE			 rommask.cpp
+USERINCLUDE ../../../imgtools/imglib/inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/rommask/group/rommask.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_deprecated_rommask
+
+source          /src/tools/build/deprecated/rommask
+exports         /src/tools/build/deprecated/rommask/group
+binary          /src/tools/build/deprecated/rommask/group all
+
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/rommask/rommask.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,395 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <string.h>
+#include <io.h>
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+#include <iomanip>
+#else //!__MSVCDOTNET__
+#include <iomanip.h>
+#endif //__MSVCDOTNET__
+
+#include "h_utl.h"
+#include "h_ver.h"
+
+// ROMMASK.EXE cl parameters
+char *gRomImage=NULL;
+char *gOutputRom=NULL;
+int	gRomSize=0;
+char gFormat='P';
+const int KMaxSections=8;
+int gNumberOfSections=0;
+int gSectionSize[KMaxSections];
+int gHeader=ETrue;
+int gVerbose=EFalse;
+
+
+TInt MaskPlain(TInt aRomSize,ifstream& aPsionImageFile,ofstream& aMaskRomImageFile)
+//
+// Create a plain mask rom image file
+//
+	{
+
+	const char KMaskRomFillCharacter='\377';
+	const TInt KBufferSize=1024;
+	char empty[KBufferSize];
+	for (TInt y=0;y<KBufferSize;y++)
+		empty[y]=KMaskRomFillCharacter;
+	char buffer[KBufferSize];
+	TUint checksum32=0;
+	TUint checksum8=0;
+	for (TInt x=0;x<aRomSize;x+=KBufferSize)
+		{
+		memcpy(buffer,empty,KBufferSize);
+		aPsionImageFile.read(buffer,KBufferSize);
+		aMaskRomImageFile.write(buffer,KBufferSize);
+		TInt z;
+		for (z=0;z<KBufferSize;z+=4)
+			checksum32+=*(TUint32*)&buffer[z];
+		for (z=0;z<KBufferSize;z++)
+			checksum8+=(TUint8)buffer[z];
+		}
+
+	if (gVerbose)
+		{
+		cout << dec;
+		cout << aRomSize << " byte PLAIN\r\n";
+		cout << "32 bit checksum 0x";
+		cout << setw(8);
+		cout << hex;
+		cout << setfill('0');
+		cout << checksum32 << "\r\n";
+		cout << " 8 bit checksum 0x";
+		cout << setw(8);
+		cout << hex;
+		cout << setfill('0');
+		cout << checksum8 << "\r\n";
+		}
+	return(KErrNone);
+	}
+
+TInt MaskMotorola(TInt /*aRomSize*/,ifstream& /*aPsionImageFile*/,ofstream& /*aMaskRomImageFile*/)
+//
+// Create a motorola s-record mask rom image file
+//
+	{
+	return(KErrNone);
+	}
+
+TInt MaskRom(TInt aRomSize,ifstream& aPsionImageFile,const char* aMaskRomImageFileName,const char* aMaskRomFormat)
+	{
+	ofstream MaskRomImageFile;
+
+	TInt r;
+	if (!MaskRomImageFile)
+		{
+		cout << "Error:  Cannot create mask rom image file (" << aMaskRomImageFileName << ")\r\n";
+		r=KErrArgument;
+		}
+	else
+		{
+		if (gVerbose)
+			{
+			cout << "\r\nMask ROM image file: ";
+			cout << aMaskRomImageFileName << "\r\n"; 
+			}
+		switch (aMaskRomFormat[0])
+			{
+		case 'P':
+			MaskRomImageFile.open(aMaskRomImageFileName, ios::in | ios::binary);
+			r=MaskPlain(aRomSize,aPsionImageFile,MaskRomImageFile);
+			break;
+		case 'M':
+			MaskRomImageFile.open(aMaskRomImageFileName, ios::in);
+			r=MaskMotorola(aRomSize,aPsionImageFile,MaskRomImageFile);
+			break;
+		default:
+			cerr << "Error:  Rom format not recognised\r\n";
+			r=KErrGeneral;
+			break;
+			}
+		MaskRomImageFile.close();
+		}
+	return r;
+	}
+
+
+TInt getIntegerArg(int argc, char *argv[], int param)
+	{
+
+	int error=KErrNone;
+	if (param>=argc)
+		error=KErrArgument;
+	if (error==KErrNone)
+		{
+		int val;
+//		if (!isNumber(argv[param]))
+//			return KErrArgument;
+
+#ifdef __TOOLS2__
+istringstream s(argv[param]);
+#else
+istrstream s(argv[param], strlen(argv[param]));
+#endif
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+		s >> setbase(0);
+#endif //__MSVCDOTNET__
+
+		s>>val;
+		if (!s.fail())
+			return val;
+		}
+	cerr << "Error:  Integer argument required for ";
+	cerr << argv[param-1];
+	cerr << "\r\n";
+	return -1;
+	}
+
+char *getStringArg(int argc, char *argv[], int param)
+	{
+
+	if (param>=argc)
+		{
+		cerr << "Error:  String argument required for ";
+		cerr << argv[param-1];
+		cerr << "\r\n";
+		return NULL;
+		}
+	return argv[param];
+	}
+
+char getCharArg(int argc, char *argv[], int param)
+	{
+	
+	char *p=getStringArg(argc,argv,param);
+	if (p!=NULL)
+		return p[0];
+	return '\000';
+	}
+
+TInt processCommandLine(int argc, char *argv[])
+	{
+
+	if (argc==1)
+		return KErrArgument;
+	int param=1;
+	while (param<argc)
+		{
+		switch (argv[param][1])
+			{
+		case 'r':
+		case 'R':
+			// rom name
+			param++;
+			gRomImage=getStringArg(argc, argv, param);
+			break;
+		case 's':
+		case 'S':
+			if (argv[param][2]=='i')
+				{
+				// rom size
+				param++;
+				gRomSize=getIntegerArg(argc, argv, param);
+				if (gRomSize==-1)
+					return KErrGeneral;
+				}
+			else
+				{
+				// section
+				if (gNumberOfSections>=KMaxSections)
+					{
+					cerr << "Error:  Too many sections\r\n";
+					return KErrGeneral;
+					}
+				param++;
+				gSectionSize[gNumberOfSections]=getIntegerArg(argc, argv, param);
+				if (gSectionSize[gNumberOfSections]==-1)
+					return KErrGeneral;
+				if (gSectionSize[gNumberOfSections]==0)
+					{
+					cerr << "Error:  Section is zero bytes long\r\n";
+					return KErrGeneral;
+					}
+				if (gSectionSize[gNumberOfSections]>64)
+					{
+					cerr << "Error: Section too big\r\n";
+					return KErrGeneral;
+					}
+				gNumberOfSections++;
+				}
+				break;
+			case 'f':
+			case 'F':
+				param++;
+				gRomSize=getCharArg(argc, argv, param);
+				break;
+			case 'l':
+			case 'L':
+				cerr << "Error:  Use -verbose instead of -log";
+				break;
+			case 'v':
+			case 'V':
+				gVerbose=ETrue;
+				break;
+			case 'o':
+			case 'O':
+				param++;
+				gOutputRom=getStringArg(argc, argv, param);
+				break;
+			case 'n':
+			case 'N':
+				// -no-header
+				gHeader=EFalse;
+				break;
+			default:
+				cout << "Error:  Unrecognised switch '"<<argv[param]<<"'\r\n";
+				return KErrArgument;
+			}
+		param++;
+		}
+	if (gRomImage==NULL)
+		{
+		cerr << "Error:  No rom image specified\r\n";
+		return KErrArgument;
+		}
+	if (gOutputRom==NULL)
+		{
+		cerr << "Error:  No output rom file specified\r\n";
+		return KErrArgument;
+		}
+	if (gRomSize>64)
+		{
+		cerr << "Error:  Rom too big\r\n";
+		return KErrGeneral;
+		}
+	if (gRomSize==0)
+		{
+		cerr << "Error: No rom size specified\r\n";
+		return KErrArgument;
+		}
+	if (gFormat!='P' && gFormat!='M')
+		{
+		cerr << "Error:  Invalid mask rom format specified\r\n";
+		return KErrArgument;
+		}
+
+	return KErrNone;
+	}
+
+TInt Align1M(TInt aVal)
+	{
+	return (aVal+0xfffff) & 0x7ff00000;
+	}
+
+TInt main(int argc, char *argv[])
+	{
+
+	const TInt KPsionImageFileHeaderSize=0x100;
+
+	cout << "\r\nROMMASK - Rom masker V" << MajorVersion << "." << MinorVersion << "(Build " << Build << ")\r\n";
+	cout << Copyright;
+
+	char HelpText[] = 
+		"Syntax: ROMMASK -romimage <psion img file> -output <rom img name>\r\n"
+		"                [-verbose] [-size <total rom size>]\r\n"
+		"                [-no-header] [-format <format>] [-section <size>]*\r\n"
+		"Format: MOTOROLA (ascii s-record format)\r\n"
+		"        PLAIN (plain binary format) default\r\n";
+	int r=processCommandLine(argc, argv);
+	if (r==KErrArgument)
+		{
+		cout << HelpText;
+		return(KErrArgument);
+		}
+
+// Open the psion image file
+
+	ifstream PsionImageFile;
+	char*& PsionImageFileName=gRomImage;
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+	PsionImageFile.open(PsionImageFileName, ios::in | ios::binary);
+#else //!__MSVCDOTNET__
+	PsionImageFile.open(PsionImageFileName, ios::nocreate | ios::binary);
+#endif //__MSVCDOTNET__
+
+	if (!PsionImageFile)
+		{
+		cerr << "Error:  Cannot open psion image file (" << PsionImageFileName << ")\r\n";
+		return(KErrArgument);
+		}
+	
+	gRomSize*=1024*1024; // in Mb
+	// resolve sections to cover whole rom
+	int size=0;
+	int i;
+	for (i=0; i<gNumberOfSections; i++)
+		{
+		gSectionSize[i]*=1024*1024; // in Mb
+		size+=gSectionSize[i];
+		}
+	if (size<gRomSize)
+		gSectionSize[gNumberOfSections++]=gRomSize-size;
+	if (size>gRomSize)
+		{
+		cerr << "Error:  Sections too big for rom";
+		return KErrGeneral;
+		}
+
+// Create the mask rom image file
+
+	ofstream MaskRomImageFile;
+	char*& MaskRomImageFileName=gOutputRom;
+
+ 	MaskRomImageFile.open(MaskRomImageFileName);
+	if (!MaskRomImageFile)
+		{
+		cerr << "Error:  Cannot create mask rom image file (" << MaskRomImageFileName << ")\r\n";
+		PsionImageFile.close();
+		return(KErrArgument);
+		}
+
+	if (gHeader)
+		{
+		PsionImageFile.ignore(KPsionImageFileHeaderSize);
+		int count=PsionImageFile.gcount();
+		if (count!=KPsionImageFileHeaderSize)
+			{
+			cerr << "Error:  Corrupt Psion image file\r\n";
+			return(KErrGeneral);
+			}
+		}
+
+	r=KErrNone;
+	for (i=0; i<gNumberOfSections; i++)
+		{
+		r=MaskRom(gSectionSize[i],PsionImageFile,MaskRomImageFileName,&gFormat);
+		if (r!=KErrNone)
+			{
+			cerr << "Error:  An error occured while processing Rom image\r\n";
+			return r;
+			}
+		// next section
+		char* ptr=MaskRomImageFileName;
+		while (*++ptr!=0)
+			;
+		*--ptr=(char)(i+'2');
+		}
+
+	PsionImageFile.close();
+	return(r);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/w32repro/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+w32repro.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/w32repro/group/w32repro.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,35 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			w32repro.exe
+TARGETTYPE		exe
+SOURCEPATH	../../w32repro
+SOURCE			 w32repro.cpp
+SOURCEPATH	../../../imgtools/imglib/host
+SOURCE			h_utl.cpp
+USERINCLUDE ../../../imgtools/imglib/inc
+USERINCLUDE ../../../imgtools/imglib/boostlibrary
+USERINCLUDE ../../../imgtools/romtools/rombuild
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+#ifdef TOOLS2_LINUX
+OPTION    GCC -O2 -Wno-uninitialized -pthread
+#else
+OPTION    GCC -O2 -Wno-uninitialized -mthreads
+#endif
+
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/w32repro/group/w32repro.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_deprecated_w32repro
+
+source          /src/tools/build/deprecated/w32repro
+exports         /src/tools/build/deprecated/w32repro/group
+binary          /src/tools/build/deprecated/w32repro/group all
+
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/w32repro/w32repro.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,428 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Based on PREPRO.CPP and ROMBUILD.CPP
+// 
+//
+
+#define WIN32_LEAN_AND_MEAN
+#pragma warning( disable : 4201 ) // nonstandard extension used : nameless struct/union
+#include <windows.h>
+#include <winbase.h>
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "h_utl.h"
+#include "h_ver.h"
+
+// need to pretend we've done e32image.h, to avoid clashes with winnt.h
+#define __E32IMAGE_H__
+struct E32ImageFile
+	{
+	};
+class CBytePair;
+#include "r_rom.h"
+
+#define READ_BUFFER_SIZE 0x1000		// allows for exuberant T_REPRO without delays in it
+#define WRITE_BUFFER_SIZE 0x1000
+
+TRomLoad TheRomHeader;
+TUint ImageDataSize=0;
+TUint FileSize=0;
+TText PortNumber='1';
+TUint BaudRate=115200;
+TBool Kick=EFalse;
+TBool UseHex=EFalse;
+TBool Verbose=EFalse;
+TBool RawImage=EFalse;
+TText* BootstrapName=NULL;
+
+const TUint KReproWrapperSize = 0x100;	// REPRO protocol assumes a wrapper size of 256 bytes
+
+HANDLE comPort;
+TUint32 BytesWritten;
+
+TText *processCommandLine(int argc, char *argv[])
+//
+// Process the command line arguments, printing a helpful message if none are supplied
+//
+	{
+
+	char HelpText[] = 
+		"* Syntax: W32REPRO [options] filename[.bin]\n"
+		"* \n"
+		"* Option: -P<n>        port number, defaults to COM1,\n"
+		"* Option: -K           kick the other end, to force another repro attempt\n"
+		"* Option: -B<rate>     baud rate, minimum 9600, defaults to 115200\n"
+		"* Option: -RAW         raw image with no header\n"
+		"* Option: -BOOT <file> bootstrap with <file> transmitted at 9600 baud\n"
+		"* Option: -HEX         use base 16 (for use with ReproC)\n"
+		"* Option: -V           display raw protocol messages\n"
+		"* \n"
+		"* All messages from W32REPRO begin with '*', every thing else comes from the\n"
+		"* machine being reprogrammed.\n";
+
+	TText *filename=NULL;
+	if (argc == 1)
+		{
+		cout << HelpText;
+		return NULL;
+		}
+	for (int i=1; i<argc; i++)
+		{
+		strupr(argv[i]);
+		if ((argv[i][0] == '-') || (argv[i][0] == '/'))
+			{
+			if (strcmp(argv[i],"-RAW")==0)
+				{
+				RawImage=ETrue;
+				}
+			else if (strcmp(argv[i],"-HEX")==0)
+				{
+				UseHex=ETrue;
+				}
+			else if (strcmp(argv[i],"-BOOT")==0)
+				{
+				if (++i==argc)
+					{
+					cout << "**** Missing argument for -BOOT\n*\n";
+					cout << HelpText;
+					return NULL;
+					}
+				BootstrapName=(TText*)argv[i];
+				}
+			else if (argv[i][1] == 'P')
+				{
+				PortNumber=argv[i][2];
+				}
+			else if (argv[i][1] == 'K')
+				{
+				Kick=ETrue;
+				}
+			else if (argv[i][1] == 'V')
+				{
+				Verbose=ETrue;
+				}
+			else if (argv[i][1] == 'B')
+				{
+				TInt rate=atoi(argv[i]+2);
+				if (rate>=9600)
+					{
+					BaudRate=rate;
+					}
+				else
+					{
+					cout << "**** Invalid baud rate: " << argv[i] << "\n*\n";
+					cout << HelpText;
+					return NULL;
+					}
+				}
+			else if (argv[i][1] == '?')
+				{
+				cout << HelpText;
+				return NULL;
+				}
+			else
+				{
+				cout << "**** Unrecognised argument " << argv[i] << "\n*\n";
+				cout << HelpText;
+				return NULL;
+				}
+			}
+		else // Must be the image filename
+			filename=(TText *)argv[i];
+		}
+	if (filename==NULL)
+		{
+		cout << "**** Missing image filename\n*\n";
+		cout << HelpText;
+		}
+	return filename;
+	}
+
+TInt openComPort()
+//
+// Open the com port and configure it
+//
+	{
+	char port[5]="COM1";
+	port[3]=PortNumber;
+	comPort=CreateFile(port,GENERIC_READ+GENERIC_WRITE,0,0,OPEN_EXISTING,0,NULL);
+	if (comPort==INVALID_HANDLE_VALUE)
+		return Print(EError,"* Cannot open %s\n",port);
+
+	DCB settings;
+	if (!GetCommState(comPort,&settings))
+		return Print(EError,"* Cannot read settings for %s\n",port);
+
+	if (!SetupComm(comPort,READ_BUFFER_SIZE,WRITE_BUFFER_SIZE))
+		return Print(EError,"* Cannot set buffer sizes for %s\n",port);
+
+	settings.fBinary=TRUE;
+	settings.fParity=FALSE;
+	settings.fAbortOnError=TRUE;	// overrides EV_ERR
+	settings.BaudRate=BaudRate;
+	settings.ByteSize=8;
+	settings.Parity=NOPARITY;
+	settings.StopBits=ONESTOPBIT;
+	settings.fRtsControl=RTS_CONTROL_ENABLE;
+	settings.fDtrControl=DTR_CONTROL_ENABLE;
+	settings.fOutxCtsFlow=FALSE;
+	settings.fOutxDsrFlow=FALSE;
+	settings.fDsrSensitivity=FALSE;
+	settings.fOutX=FALSE;		// no XON/XOFF for transmission
+	settings.fInX=FALSE;		// no XON/XOFF for reception
+	settings.fNull=FALSE;		// don't discard null bytes
+
+	settings.EvtChar='\001';	// REPRO command separator
+
+	if (!SetCommState(comPort,&settings))
+		return Print(EError,"* Cannot configure %s\n",port);
+	
+	if (!SetCommMask(comPort,EV_RXFLAG+EV_ERR))
+		return Print(EError,"* Cannot set CommMask for %s\n",port);
+
+	COMMTIMEOUTS timeouts = {
+		//20,0,0,	// allow up to 20 milliseconds between characters, i.e. buffer them properly
+		MAXDWORD,0,0,	// return immediately
+		0,0	// no write timeouts
+		};
+	if (!SetCommTimeouts(comPort,&timeouts))
+		return Print(EError,"* Cannot set timeouts for %s\n",port);
+
+	if (!SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST))
+		Print(EError,"* Failed to raise priority of this thread err=%d\n",GetLastError());
+	if (!SetPriorityClass(GetCurrentProcess(),HIGH_PRIORITY_CLASS))
+		Print(EError,"* Failed to raise priority of this process err=%d\n",GetLastError());
+
+	Print(EScreen,"* Using %s at %d baud\n\n",port,BaudRate);
+	return KErrNone;
+	}
+
+BOOL WriteToComPort(char* data, DWORD length, char* comment)
+	{
+	if (Verbose)
+		{
+		if (comment==NULL)
+			Print(EScreen, "* TX=%*s\n", length, data);
+		else
+			Print(EScreen, "* TX <%d bytes of %s>\n", length, comment);
+		}
+	return WriteFile(comPort, data, length, &BytesWritten, NULL);
+	}
+
+TInt Bootstrap9600()
+	{
+	DCB settings;
+	if (!GetCommState(comPort,&settings))
+		return Print(EError,"* Cannot read COM settings\n");
+
+	settings.BaudRate=9600;
+	if (!SetCommState(comPort,&settings))
+		return Print(EError,"* Cannot reconfigure to 9600 baud\n");
+	
+	FILE* bootstrapFile=fopen((const char*)BootstrapName,"rb");
+	if (bootstrapFile==NULL)
+		return Print(EError,"* Cannot open bootstrap file %s for input (errno=%d)\n",BootstrapName,errno);
+
+	Print(EScreen,"* Sending bootstrap %s at 9600 baud\n",BootstrapName,BaudRate);
+
+	char bootdata[WRITE_BUFFER_SIZE];
+	TUint32 imageBytes=0;
+
+	while (!feof(bootstrapFile))
+		{
+		imageBytes=fread(bootdata,1,WRITE_BUFFER_SIZE,bootstrapFile);
+		if (imageBytes==0 && feof(bootstrapFile))
+			break;
+		if (imageBytes!=WRITE_BUFFER_SIZE && ferror(bootstrapFile))
+			{
+			return Print(ESevereError,"* Read only %d bytes of bootstrap err=%d\n",imageBytes,ferror(bootstrapFile));
+			}
+		if (!WriteToComPort(bootdata,imageBytes,"bootstrap data"))
+			return Print(ESevereError,"* Wrote only %d of %d bytes of bootstrap err=%d\n",
+				BytesWritten,imageBytes,GetLastError());
+		}
+	fclose(bootstrapFile);
+
+	settings.BaudRate=BaudRate;
+	if (!SetCommState(comPort,&settings))
+		return Print(EError,"* Cannot reconfigure to %d baud\n",BaudRate);
+	
+	Print(EScreen,"* Bootstrap downloaded\n\n");
+
+	return KErrNone;
+	}
+
+TInt main(int argc, char *argv[])
+	{
+	TInt err=KErrNone;
+
+	Print(EScreen,"\n* W32REPRO - Win32 version of PREPRO");
+  	Print(EScreen," V%02d.%02d (Build %03d)\n",MajorVersion,MinorVersion,Build);
+  	Print(EScreen,"* %s",Copyright);
+
+	TText *imageFileName = processCommandLine(argc, argv);
+	if (imageFileName==NULL)
+		return KErrGeneral;
+
+	FILE* romFile=fopen((const char*)imageFileName,"rb");
+	if (romFile==NULL)
+		return Print(EError,"* Cannot open ROM Image file %s for input (errno=%d)\n",imageFileName,errno);
+
+	if (RawImage)
+		TheRomHeader.wrapSize=0;
+	else
+		{
+		if (fread(&TheRomHeader,sizeof(TheRomHeader),1,romFile)!=1)
+			return Print(EError,"* Cannot read ROM Image header\n");
+		if (TheRomHeader.wrapSize!=KRomWrapperSize)
+			return Print(EError,"* Incorrect ROM header - wrong wrapper size\n");
+		}
+	if (fseek(romFile,0,SEEK_END)!=0)
+		return Print(EError,"* Cannot seek in ROM Image file\n");
+	FileSize=ftell(romFile);
+	ImageDataSize=FileSize-TheRomHeader.wrapSize;
+
+	Print(EAlways,"\n* ROM Image %s - 0x%06x bytes\n",imageFileName,ImageDataSize);
+
+	err=openComPort();
+	if (err!=KErrNone)
+		return err;
+
+	if (BootstrapName != NULL)
+		{
+		err=Bootstrap9600();
+		if (err!=KErrNone)
+			return err;
+		}
+
+	char romdata[WRITE_BUFFER_SIZE];
+	if (Kick)
+		{
+		memset(romdata,'!',64);		// string of non-numeric characters, won't harm old REPRO
+		WriteToComPort(romdata,64,NULL);
+		}
+	//
+	// Wait around for REPRO on the other end to send us commands
+	//
+	char command[READ_BUFFER_SIZE+1];
+	char* cp=command;
+	TInt length=READ_BUFFER_SIZE;
+	TUint expectedOffset=0;
+	TInt done=0;
+	while (!done)
+		{
+		TUint32 bytesRead=0,imageBytes=0,offset=0;
+
+		TUint32 event;
+		if (!WaitCommEvent(comPort,&event,NULL))
+			{
+			if (GetLastError()!=ERROR_OPERATION_ABORTED)
+				Print(EAlways,"\n* Unexpected WaitCommEvent failure %d event %x\n",GetLastError(),event);
+			TUint32 commError;
+			if (!ClearCommError(comPort,&commError,NULL))
+				{
+				Print(ESevereError,"\n* Failed to clear CommError - give up now!\n");
+				return KErrGeneral;
+				}
+			if (commError!=CE_OVERRUN)
+				Print(EAlways,"\n* Unexpected comms error %x\n",commError);
+			}
+		if (!ReadFile(comPort,cp,length,&bytesRead,NULL))
+			{
+			if (GetLastError()!=ERROR_OPERATION_ABORTED)
+				Print(EAlways,"\n* Unexpected ReadFile failure %d bytes %d\n",GetLastError(),bytesRead);
+			}
+		if (bytesRead==0)
+			continue;
+
+		char* next;
+		char* end = cp+bytesRead;
+		*end='\0';	// stick a terminator on the end, just in case
+
+		for (cp=(char*)command; (next=(char*)memchr(cp,'\001',end-cp))!=NULL ;cp=next+1)
+			{
+			*next='\0';	// drop the terminator
+			if (Verbose)
+				Print(EScreen, " * RX=%s\n", cp);
+			switch (cp[0])
+				{
+			case 'D':	// disconnect after successful REPRO
+				Print(EScreen,"* Disconnect\n");
+				done=1;
+				break;
+			case 'M':	// print message
+				Print(EScreen,"%s",cp+1);
+				break;
+			case 'P':	// panic
+				Print(ESevereError,"%s",cp+1);
+				break;
+			case 'R':	// request for data from the image at specified address
+				if (end-next>1)
+					break;	// must be the last command in the buffer
+				offset=strtoul(cp+1,NULL,UseHex?16:10)-KReproWrapperSize; // REPRO assumes wrapSize=256	
+				if ((offset&4095)!=0)
+					{
+					Print(ESevereError,"* Image offset %x not a multiple of 4k (%s)\n", offset,cp);
+					break;
+					}
+				if (offset>expectedOffset)
+					{
+					Print(ESevereError,"* Image offset %x should have been %x\n", offset,expectedOffset);
+					break;
+					}
+				Print(EScreen,"%x       \r",offset);		// in case we lost the message
+				expectedOffset=offset+WRITE_BUFFER_SIZE;	// what we expect next time
+				offset+=TheRomHeader.wrapSize;	// offset into the file
+				if (fseek(romFile,offset,SEEK_SET)!=0)
+					{
+					Print(ESevereError,"* Can't seek to file offset %x", offset);
+					break;
+					}
+
+				memset(romdata,0xff,WRITE_BUFFER_SIZE);
+				imageBytes=fread(romdata,1,WRITE_BUFFER_SIZE,romFile);
+				if (imageBytes!=WRITE_BUFFER_SIZE && offset+imageBytes!=FileSize)
+					{
+					Print(ESevereError,"* Read only %d bytes of image data err=%d\n",imageBytes,ferror(romFile));
+					break;
+					}
+				if (!WriteToComPort(romdata,WRITE_BUFFER_SIZE,"image data"))
+					Print(ESevereError,"* Wrote only %d bytes of image data err=%x\n",BytesWritten,GetLastError());
+				break;
+			case 'S':	// request for the size of the image
+				if (end-next>1)
+					break;	// must be the last command in the buffer
+				if (next-cp==1)
+					{
+					sprintf((char*)romdata,"%010d\n",ImageDataSize+KReproWrapperSize);
+					if (!WriteToComPort(romdata,strlen(romdata),NULL) 
+							|| BytesWritten!=strlen(romdata))
+						Print(ESevereError,"* Failed to write file size\n");
+					expectedOffset=0;	// because we are starting again
+					break;
+					}
+				// otherwise fall through
+			default:
+				Print(EAlways,"\n* Unrecognised command >%s<\n", cp);
+				}
+			}
+		if (cp<end)	// copy trailing characters back to the start of the buffer
+			memmove(command,cp,end-cp);
+		cp=command+(end-cp);
+		length=command+READ_BUFFER_SIZE-cp;
+		}
+	return KErrNone;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/winc/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS
+
+PRJ_EXPORTS
+:zip winc\winc.zip
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/winc/tools_redistribution_cedar.history.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<relnotes name="REDISTRIBUTION_WINC_EKA2">
+  <purpose>
+  </purpose>
+</relnotes>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/winc/tools_redistribution_cedar.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,15 @@
+component	tools_redistribution_cedar
+
+source	\sf\os\buildtools\dist_os\redistributionwinceka2\winc
+
+source	\sf\os\buildtools\dist_os\redistributionwinceka2\bld.inf
+source	\sf\os\buildtools\dist_os\redistributionwinceka2\tools_redistribution_cedar.mrp
+
+binary	\sf\os\buildtools\dist_os\redistributionwinceka2 all
+#binary	\sf\os\buildtools\dist_os\redistributionwinceka2 cwtools
+#exports	\sf\os\buildtools\dist_os\redistributionwinceka2
+
+notes_source	\component_defs\release.src
+
+ipr T 
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/winc/tools_redistribution_winc.history.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<relnotes name="REDISTRIBUTION">
+  <purpose>
+  </purpose>
+</relnotes>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/winc/tools_redistribution_winc.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,389 @@
+component	tools_redistribution_winc
+
+# IainW: Workaround - the following are all exported from winc.zip, but we can't yet have more than one exported file from the same place
+#        They are all IPR category E
+
+source  \sf\os\buildtools\dist_os\redistributionwinceka2\tools_redistribution_winc.mrp
+
+binary	\epoc32\release\winc\udeb\accesspointmonitor.exe
+binary	\epoc32\release\winc\udeb\agnmodel.dll
+binary	\epoc32\release\winc\udeb\agnversit.dll
+binary	\epoc32\release\winc\udeb\aiftool.exe
+binary	\epoc32\release\winc\udeb\alarmclient.dll
+binary	\epoc32\release\winc\udeb\alarmserver.dll
+binary	\epoc32\release\winc\udeb\alarmshared.dll
+binary	\epoc32\release\winc\udeb\apgrfx.dll
+binary	\epoc32\release\winc\udeb\apmime.dll
+binary	\epoc32\release\winc\udeb\apparc.dll
+binary	\epoc32\release\winc\udeb\bafl.dll
+binary	\epoc32\release\winc\udeb\bifu.dll
+binary	\epoc32\release\winc\udeb\big5.cpl
+binary	\epoc32\release\winc\udeb\big5_shared.dll
+binary	\epoc32\release\winc\udeb\bitgdi.dll
+binary	\epoc32\release\winc\udeb\bmtran.dll
+binary	\epoc32\release\winc\udeb\charconv.dll
+binary	\epoc32\release\winc\udeb\cnftool.exe
+binary	\epoc32\release\winc\udeb\conarc.dll
+binary	\epoc32\release\winc\udeb\connmngmntbox.exe
+binary	\epoc32\release\winc\udeb\connmngmntbox.tlb
+binary	\epoc32\release\winc\udeb\connmngmnthelpbox.dll
+binary	\epoc32\release\winc\udeb\connmngmnthelpbox.lib
+binary	\epoc32\release\winc\udeb\connmngmnthelpbox.tlb
+binary	\epoc32\release\winc\udeb\connmngmntres.dll
+binary	\epoc32\release\winc\udeb\contprosap.dll
+binary	\epoc32\release\winc\udeb\contprosap.lib
+binary	\epoc32\release\winc\udeb\contprosap.tlb
+binary	\epoc32\release\winc\udeb\contprosapres.dll
+binary	\epoc32\release\winc\udeb\contprosapres.lib
+binary	\epoc32\release\winc\udeb\contprotest.exe
+binary	\epoc32\release\winc\udeb\convnames.dll
+binary	\epoc32\release\winc\udeb\convutils.dll
+binary	\epoc32\release\winc\udeb\csbmsto.dll
+binary	\epoc32\release\winc\udeb\csdbcust.dll
+binary	\epoc32\release\winc\udeb\csdbi.dll
+binary	\epoc32\release\winc\udeb\csdbw.dll
+binary	\epoc32\release\winc\udeb\cshlpwtr.exe
+binary	\epoc32\release\winc\udeb\cssup.dll
+binary	\epoc32\release\winc\udeb\dbwriter.dll
+binary	\epoc32\release\winc\udeb\dlog.dll
+binary	\epoc32\release\winc\udeb\dlogfl.dll
+binary	\epoc32\release\winc\udeb\dlogsr.dll
+binary	\epoc32\release\winc\udeb\dlogwn.dll
+binary	\epoc32\release\winc\udeb\ealm.dll
+binary	\epoc32\release\winc\udeb\ealwl.dll
+binary	\epoc32\release\winc\udeb\ecdrv.pdd
+binary	\epoc32\release\winc\udeb\ecomm.ldd
+binary	\epoc32\release\winc\udeb\econs.dll
+binary	\epoc32\release\winc\udeb\edbms.dll
+binary	\epoc32\release\winc\udeb\edev.lib
+binary	\epoc32\release\winc\udeb\edll.lib
+binary	\epoc32\release\winc\udeb\eexe.lib
+binary	\epoc32\release\winc\udeb\efile.dll
+binary	\epoc32\release\winc\udeb\efsrv.dll
+binary	\epoc32\release\winc\udeb\ehwa.ldd
+binary	\epoc32\release\winc\udeb\ehwac.pdd
+binary	\epoc32\release\winc\udeb\ekdata.dll
+binary	\epoc32\release\winc\udeb\ekern.dll
+binary	\epoc32\release\winc\udeb\ektran.dll
+binary	\epoc32\release\winc\udeb\elocal.fsy
+binary	\epoc32\release\winc\udeb\elocl.01
+binary	\epoc32\release\winc\udeb\elocl.02
+binary	\epoc32\release\winc\udeb\elocl.03
+binary	\epoc32\release\winc\udeb\elocl.04
+binary	\epoc32\release\winc\udeb\elocl.05
+binary	\epoc32\release\winc\udeb\elocl.10
+binary	\epoc32\release\winc\udeb\elocl.18
+binary	\epoc32\release\winc\udeb\elocl.19
+binary	\epoc32\release\winc\udeb\elocl.29
+binary	\epoc32\release\winc\udeb\elocl.31
+binary	\epoc32\release\winc\udeb\elocl.32
+binary	\epoc32\release\winc\udeb\elocl.dll
+binary	\epoc32\release\winc\udeb\elocl.loc
+binary	\epoc32\release\winc\udeb\elocl.sc
+binary	\epoc32\release\winc\udeb\esock.dll
+binary	\epoc32\release\winc\udeb\estor.dll
+binary	\epoc32\release\winc\udeb\etext.dll
+binary	\epoc32\release\winc\udeb\eucjp_packed.cpl
+binary	\epoc32\release\winc\udeb\euniw.dll
+binary	\epoc32\release\winc\udeb\euser.dll
+binary	\epoc32\release\winc\udeb\exdll.lib
+binary	\epoc32\release\winc\udeb\fbscli.dll
+binary	\epoc32\release\winc\udeb\fbserv.dll
+binary	\epoc32\release\winc\udeb\field.dll
+binary	\epoc32\release\winc\udeb\fntstr.dll
+binary	\epoc32\release\winc\udeb\form.dll
+binary	\epoc32\release\winc\udeb\form_and_etext_editor.dll
+binary	\epoc32\release\winc\udeb\gb12345.cpl
+binary	\epoc32\release\winc\udeb\gb2312.cpl
+binary	\epoc32\release\winc\udeb\gb2312_shared.dll
+binary	\epoc32\release\winc\udeb\gbk.cpl
+binary	\epoc32\release\winc\udeb\gbk_shared.dll
+binary	\epoc32\release\winc\udeb\gdi.dll
+binary	\epoc32\release\winc\udeb\general.pdl
+binary	\epoc32\release\winc\udeb\hal.dll
+binary	\epoc32\release\winc\udeb\hz.cpl
+binary	\epoc32\release\winc\udeb\iso2022jp.cpl
+binary	\epoc32\release\winc\udeb\iso2022jp1.cpl
+binary	\epoc32\release\winc\udeb\iso885910.cpl
+binary	\epoc32\release\winc\udeb\iso885913.cpl
+binary	\epoc32\release\winc\udeb\iso885914.cpl
+binary	\epoc32\release\winc\udeb\iso885915.cpl
+binary	\epoc32\release\winc\udeb\iso88592.cpl
+binary	\epoc32\release\winc\udeb\iso88593.cpl
+binary	\epoc32\release\winc\udeb\iso88594.cpl
+binary	\epoc32\release\winc\udeb\iso88595.cpl
+binary	\epoc32\release\winc\udeb\iso88596.cpl
+binary	\epoc32\release\winc\udeb\iso88597.cpl
+binary	\epoc32\release\winc\udeb\iso88598.cpl
+binary	\epoc32\release\winc\udeb\iso88599.cpl
+binary	\epoc32\release\winc\udeb\iwzlib.dll
+binary	\epoc32\release\winc\udeb\iwzlib.lib
+binary	\epoc32\release\winc\udeb\jis.cpl
+binary	\epoc32\release\winc\udeb\jisbase_shared.dll
+binary	\epoc32\release\winc\udeb\jisx0201.dll
+binary	\epoc32\release\winc\udeb\jisx0208.dll
+binary	\epoc32\release\winc\udeb\jisx0212.dll
+binary	\epoc32\release\winc\udeb\linebreak.dll
+binary	\epoc32\release\winc\udeb\listcomportsbox.dll
+binary	\epoc32\release\winc\udeb\listcomportsbox.lib
+binary	\epoc32\release\winc\udeb\listcomportsbox.tlb
+binary	\epoc32\release\winc\udeb\mednand.pdd
+binary	\epoc32\release\winc\udeb\mrouterdeveloper.exe
+binary	\epoc32\release\winc\udeb\mroutersocket.dll
+binary	\epoc32\release\winc\udeb\mroutersocket.lib
+binary	\epoc32\release\winc\udeb\mroutersocket.tlb
+binary	\epoc32\release\winc\udeb\palette.dll
+binary	\epoc32\release\winc\udeb\pccustomservertest2.exe
+binary	\epoc32\release\winc\udeb\pdrstr.dll
+binary	\epoc32\release\winc\udeb\plp.prt
+binary	\epoc32\release\winc\udeb\plpcli.dll
+binary	\epoc32\release\winc\udeb\plpconfig.dll
+binary	\epoc32\release\winc\udeb\plpexe.dll
+binary	\epoc32\release\winc\udeb\plplog.dll
+binary	\epoc32\release\winc\udeb\plpremlink.dll
+binary	\epoc32\release\winc\udeb\plprfs.rsy
+binary	\epoc32\release\winc\udeb\plpsvr.dll
+binary	\epoc32\release\winc\udeb\plpvariant.dll
+binary	\epoc32\release\winc\udeb\powermgrcli.dll
+binary	\epoc32\release\winc\udeb\print.dll
+binary	\epoc32\release\winc\udeb\rpcs.rsy
+binary	\epoc32\release\winc\udeb\rtsock.dll
+binary	\epoc32\release\winc\udeb\rtsock.lib
+binary	\epoc32\release\winc\udeb\rtsock.tlb
+binary	\epoc32\release\winc\udeb\scdv.dll
+binary	\epoc32\release\winc\udeb\scrfs.exe
+binary	\epoc32\release\winc\udeb\scrfs.tlb
+binary	\epoc32\release\winc\udeb\scrfsproxy.dll
+binary	\epoc32\release\winc\udeb\scrfsproxy.lib
+binary	\epoc32\release\winc\udeb\shiftjis.cpl
+binary	\epoc32\release\winc\udeb\shiftjis_shared.dll
+binary	\epoc32\release\winc\udeb\socktest.exe
+binary	\epoc32\release\winc\udeb\tagma.dll
+binary	\epoc32\release\winc\udeb\testaccesspointlists.exe
+binary	\epoc32\release\winc\udeb\undo.dll
+binary	\epoc32\release\winc\udeb\vcal.dll
+binary	\epoc32\release\winc\udeb\vcard.dll
+binary	\epoc32\release\winc\udeb\versit.dll
+binary	\epoc32\release\winc\udeb\wldcomp.exe
+binary	\epoc32\release\winc\udeb\worldclient.dll
+binary	\epoc32\release\winc\udeb\worldserver.dll
+binary	\epoc32\release\winc\udeb\wpeng.dll
+binary	\epoc32\release\winc\udeb\ws32.dll
+binary	\epoc32\release\winc\udeb\xmllx.dll
+binary	\epoc32\release\winc\udeb\z\system\charconv\big5.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\builtin.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\eucjp_packed.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\gb12345.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\gb2312.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\gbk.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\hz.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso2022jp.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso2022jp1.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso885910.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso885913.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso885914.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso885915.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88592.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88593.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88594.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88595.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88596.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88597.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88598.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\iso88599.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\jis.rsc
+binary	\epoc32\release\winc\udeb\z\system\charconv\shiftjis.rsc
+binary	\epoc32\release\winc\udeb\z\system\printers\general.pdr
+binary	\epoc32\release\winc\udeb\z\system\printers\general.r01
+binary	\epoc32\release\winc\udeb\z\system\printers\general.r10
+binary	\epoc32\release\winc\urel\agnmodel.dll
+binary	\epoc32\release\winc\urel\agnversit.dll
+binary	\epoc32\release\winc\urel\aiftool.exe
+binary	\epoc32\release\winc\urel\alarmclient.dll
+binary	\epoc32\release\winc\urel\alarmserver.dll
+binary	\epoc32\release\winc\urel\alarmshared.dll
+binary	\epoc32\release\winc\urel\apgrfx.dll
+binary	\epoc32\release\winc\urel\apmime.dll
+binary	\epoc32\release\winc\urel\apparc.dll
+binary	\epoc32\release\winc\urel\bafl.dll
+binary	\epoc32\release\winc\urel\bifu.dll
+binary	\epoc32\release\winc\urel\big5.cpl
+binary	\epoc32\release\winc\urel\big5_shared.dll
+binary	\epoc32\release\winc\urel\bitgdi.dll
+binary	\epoc32\release\winc\urel\bmtran.dll
+binary	\epoc32\release\winc\urel\charconv.dll
+binary	\epoc32\release\winc\urel\cnftool.exe
+binary	\epoc32\release\winc\urel\conarc.dll
+binary	\epoc32\release\winc\urel\connmngmntbox.exe
+binary	\epoc32\release\winc\urel\connmngmntbox.tlb
+binary	\epoc32\release\winc\urel\connmngmnthelpbox.dll
+binary	\epoc32\release\winc\urel\connmngmnthelpbox.lib
+binary	\epoc32\release\winc\urel\connmngmnthelpbox.tlb
+binary	\epoc32\release\winc\urel\connmngmntres.dll
+binary	\epoc32\release\winc\urel\contprosap.dll
+binary	\epoc32\release\winc\urel\contprosap.lib
+binary	\epoc32\release\winc\urel\contprosap.tlb
+binary	\epoc32\release\winc\urel\contprosapres.dll
+binary	\epoc32\release\winc\urel\contprosapres.lib
+binary	\epoc32\release\winc\urel\convnames.dll
+binary	\epoc32\release\winc\urel\convutils.dll
+binary	\epoc32\release\winc\urel\csbmsto.dll
+binary	\epoc32\release\winc\urel\csdbcust.dll
+binary	\epoc32\release\winc\urel\csdbi.dll
+binary	\epoc32\release\winc\urel\csdbw.dll
+binary	\epoc32\release\winc\urel\cshlpwtr.exe
+binary	\epoc32\release\winc\urel\cssup.dll
+binary	\epoc32\release\winc\urel\dbwriter.dll
+binary	\epoc32\release\winc\urel\dlog.dll
+binary	\epoc32\release\winc\urel\dlogfl.dll
+binary	\epoc32\release\winc\urel\dlogsr.dll
+binary	\epoc32\release\winc\urel\dlogwn.dll
+binary	\epoc32\release\winc\urel\ealm.dll
+binary	\epoc32\release\winc\urel\ealwl.dll
+binary	\epoc32\release\winc\urel\ecdrv.pdd
+binary	\epoc32\release\winc\urel\ecomm.ldd
+binary	\epoc32\release\winc\urel\econs.dll
+binary	\epoc32\release\winc\urel\edbms.dll
+binary	\epoc32\release\winc\urel\edev.lib
+binary	\epoc32\release\winc\urel\edll.lib
+binary	\epoc32\release\winc\urel\eexe.lib
+binary	\epoc32\release\winc\urel\efile.dll
+binary	\epoc32\release\winc\urel\efsrv.dll
+binary	\epoc32\release\winc\urel\ehwa.ldd
+binary	\epoc32\release\winc\urel\ehwac.pdd
+binary	\epoc32\release\winc\urel\ekdata.dll
+binary	\epoc32\release\winc\urel\ekern.dll
+binary	\epoc32\release\winc\urel\ektran.dll
+binary	\epoc32\release\winc\urel\elocal.fsy
+binary	\epoc32\release\winc\urel\elocl.01
+binary	\epoc32\release\winc\urel\elocl.02
+binary	\epoc32\release\winc\urel\elocl.03
+binary	\epoc32\release\winc\urel\elocl.04
+binary	\epoc32\release\winc\urel\elocl.05
+binary	\epoc32\release\winc\urel\elocl.10
+binary	\epoc32\release\winc\urel\elocl.18
+binary	\epoc32\release\winc\urel\elocl.19
+binary	\epoc32\release\winc\urel\elocl.29
+binary	\epoc32\release\winc\urel\elocl.31
+binary	\epoc32\release\winc\urel\elocl.32
+binary	\epoc32\release\winc\urel\elocl.dll
+binary	\epoc32\release\winc\urel\elocl.loc
+binary	\epoc32\release\winc\urel\elocl.sc
+binary	\epoc32\release\winc\urel\esock.dll
+binary	\epoc32\release\winc\urel\estor.dll
+binary	\epoc32\release\winc\urel\etext.dll
+binary	\epoc32\release\winc\urel\eucjp_packed.cpl
+binary	\epoc32\release\winc\urel\euniw.dll
+binary	\epoc32\release\winc\urel\euser.dll
+binary	\epoc32\release\winc\urel\exdll.lib
+binary	\epoc32\release\winc\urel\fbscli.dll
+binary	\epoc32\release\winc\urel\fbserv.dll
+binary	\epoc32\release\winc\urel\field.dll
+binary	\epoc32\release\winc\urel\fntstr.dll
+binary	\epoc32\release\winc\urel\form.dll
+binary	\epoc32\release\winc\urel\form_and_etext_editor.dll
+binary	\epoc32\release\winc\urel\gb12345.cpl
+binary	\epoc32\release\winc\urel\gb2312.cpl
+binary	\epoc32\release\winc\urel\gb2312_shared.dll
+binary	\epoc32\release\winc\urel\gbk.cpl
+binary	\epoc32\release\winc\urel\gbk_shared.dll
+binary	\epoc32\release\winc\urel\gdi.dll
+binary	\epoc32\release\winc\urel\general.pdl
+binary	\epoc32\release\winc\urel\hal.dll
+binary	\epoc32\release\winc\urel\hz.cpl
+binary	\epoc32\release\winc\urel\iso2022jp.cpl
+binary	\epoc32\release\winc\urel\iso2022jp1.cpl
+binary	\epoc32\release\winc\urel\iso885910.cpl
+binary	\epoc32\release\winc\urel\iso885913.cpl
+binary	\epoc32\release\winc\urel\iso885914.cpl
+binary	\epoc32\release\winc\urel\iso885915.cpl
+binary	\epoc32\release\winc\urel\iso88592.cpl
+binary	\epoc32\release\winc\urel\iso88593.cpl
+binary	\epoc32\release\winc\urel\iso88594.cpl
+binary	\epoc32\release\winc\urel\iso88595.cpl
+binary	\epoc32\release\winc\urel\iso88596.cpl
+binary	\epoc32\release\winc\urel\iso88597.cpl
+binary	\epoc32\release\winc\urel\iso88598.cpl
+binary	\epoc32\release\winc\urel\iso88599.cpl
+binary	\epoc32\release\winc\urel\iwzlib.dll
+binary	\epoc32\release\winc\urel\iwzlib.lib
+binary	\epoc32\release\winc\urel\jis.cpl
+binary	\epoc32\release\winc\urel\jisbase_shared.dll
+binary	\epoc32\release\winc\urel\jisx0201.dll
+binary	\epoc32\release\winc\urel\jisx0208.dll
+binary	\epoc32\release\winc\urel\jisx0212.dll
+binary	\epoc32\release\winc\urel\linebreak.dll
+binary	\epoc32\release\winc\urel\listcomportsbox.dll
+binary	\epoc32\release\winc\urel\listcomportsbox.lib
+binary	\epoc32\release\winc\urel\listcomportsbox.tlb
+binary	\epoc32\release\winc\urel\mednand.pdd
+binary	\epoc32\release\winc\urel\mroutersocket.dll
+binary	\epoc32\release\winc\urel\mroutersocket.lib
+binary	\epoc32\release\winc\urel\mroutersocket.tlb
+binary	\epoc32\release\winc\urel\palette.dll
+binary	\epoc32\release\winc\urel\pdrstr.dll
+binary	\epoc32\release\winc\urel\plp.prt
+binary	\epoc32\release\winc\urel\plpcli.dll
+binary	\epoc32\release\winc\urel\plpconfig.dll
+binary	\epoc32\release\winc\urel\plpexe.dll
+binary	\epoc32\release\winc\urel\plplog.dll
+binary	\epoc32\release\winc\urel\plpremlink.dll
+binary	\epoc32\release\winc\urel\plprfs.rsy
+binary	\epoc32\release\winc\urel\plpsvr.dll
+binary	\epoc32\release\winc\urel\plpvariant.dll
+binary	\epoc32\release\winc\urel\powermgrcli.dll
+binary	\epoc32\release\winc\urel\print.dll
+binary	\epoc32\release\winc\urel\rpcs.rsy
+binary	\epoc32\release\winc\urel\rtsock.dll
+binary	\epoc32\release\winc\urel\rtsock.lib
+binary	\epoc32\release\winc\urel\rtsock.tlb
+binary	\epoc32\release\winc\urel\scdv.dll
+binary	\epoc32\release\winc\urel\scrfs.exe
+binary	\epoc32\release\winc\urel\scrfs.tlb
+binary	\epoc32\release\winc\urel\scrfsproxy.dll
+binary	\epoc32\release\winc\urel\scrfsproxy.lib
+binary	\epoc32\release\winc\urel\shiftjis.cpl
+binary	\epoc32\release\winc\urel\shiftjis_shared.dll
+binary	\epoc32\release\winc\urel\tagma.dll
+binary	\epoc32\release\winc\urel\undo.dll
+binary	\epoc32\release\winc\urel\vcal.dll
+binary	\epoc32\release\winc\urel\vcard.dll
+binary	\epoc32\release\winc\urel\versit.dll
+binary	\epoc32\release\winc\urel\wldcomp.exe
+binary	\epoc32\release\winc\urel\worldclient.dll
+binary	\epoc32\release\winc\urel\worldserver.dll
+binary	\epoc32\release\winc\urel\wpeng.dll
+binary	\epoc32\release\winc\urel\ws32.dll
+binary	\epoc32\release\winc\urel\xmllx.dll
+binary	\epoc32\release\winc\urel\z\system\charconv\big5.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\builtin.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\eucjp_packed.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\gb12345.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\gb2312.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\gbk.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\hz.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso2022jp.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso2022jp1.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso885910.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso885913.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso885914.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso885915.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88592.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88593.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88594.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88595.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88596.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88597.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88598.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\iso88599.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\jis.rsc
+binary	\epoc32\release\winc\urel\z\system\charconv\shiftjis.rsc
+binary	\epoc32\release\winc\urel\z\system\printers\general.pdr
+binary	\epoc32\release\winc\urel\z\system\printers\general.r01
+binary	\epoc32\release\winc\urel\z\system\printers\general.r10
+notes_source	\component_defs\release.src
+
+
+
+ipr T 
+
Binary file deprecated/winc/winc/winc.zip has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/wveconv/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+wveconv.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/wveconv/group/wveconv.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			wveconv.exe
+TARGETTYPE		exe
+SOURCEPATH	../../wveconv
+SOURCE			 wveconv.cpp
+
+			
+
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/wveconv/group/wveconv.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+component       dev_build_deprecated_wveconv
+
+source          /src/tools/build/deprecated/wveconv
+exports         /src/tools/build/deprecated/wveconv/group
+binary          /src/tools/build/deprecated/wveconv/group all
+
+notes_source	\component_defs\release.src
+
+ipr T
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/deprecated/wveconv/wveconv.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,250 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Psion3a WVE to Series5 sound file convertor
+// 
+//
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+#include <iostream>
+#include <fstream>
+using namespace std;
+#else  //!__MSVCDOTNET__
+#include <iostream.h>
+#include <fstream.h>
+#ifdef __CW32__
+using std::streampos;
+#endif //__CW32__
+#endif //__MSVCDOTNET__
+
+#include <string.h>
+
+#if defined(__VC32__) && !defined(__MSVCDOTNET__)
+#pragma warning( disable : 4710 )	// 'fn': function not inlined
+#endif // old MSVC
+
+#define KUidRecordApp 0x1000007e
+
+#define KUid1 0x10000037
+#define KUid2 0x1000006d
+#define KUid3 KUidRecordApp
+#define KUidCheckSum 0x5508accf
+
+#define KUidAppStream 0x10000089
+#define KUidSampleStream 0x10000052
+
+
+int ErrorNotWveFile()
+	{
+	cout << "The specified input file is not a Series 3a WVE file" << endl ;
+	return(0);
+	}
+
+int ErrorNotFound()
+	{
+	cout << "Unable to open input file" << endl ;
+	return(0);
+	}
+
+int ReadInt32(ifstream& inStream)
+	{
+    char ch[4];
+    inStream.read(&ch[0],4);
+    return *(int*)&ch[0];
+	}
+
+int ReadInt16(ifstream& inStream)
+	{
+    char ch[4];
+    inStream.read(&ch[0],2);
+    ch[2]=0;
+    ch[3]=0;
+    return *(int*)&ch[0];
+	}
+
+int WriteWord(ofstream& outStream,unsigned int aWord)
+	{
+    outStream.write((char*)&aWord,4);
+	return 0;
+	}
+
+int WriteByte(ofstream& outStream,const char aByte)
+	{
+    outStream.write((char*)&aByte,1);
+	return 0;
+	}
+
+int WriteText(ofstream& outStream,const char* aText)
+	{
+	char ch;
+	while((ch=*aText++)!=0)
+		outStream << ch;
+	return 0;
+	}
+
+void ShowHelp()
+	{
+	cout << "WveConv 0.04";
+	cout << endl ;
+	cout << "Converts a Psion 3a WVE file to an EPOC sound file" << endl ;
+	cout << endl ;
+	cout << "Usage: WVECONV S3AFILE.WVE [EPOCFILE]" << endl ;
+	cout << endl ;
+	cout << "If [EPOCFILE] is omitted, the input filename" << endl ;
+    cout << "without the extension will be used" << endl ;
+	}
+
+int ConvertFile(const char* inputFile,const char* outputFile)
+	{
+	ifstream inStream(inputFile,ios::in|ios::binary);
+	ofstream outStream(outputFile,ios::out|ios::binary);
+
+	if(!inStream.is_open())
+		return(ErrorNotFound());
+
+	const char* appName="Record.app";
+	char header[16];
+	
+	inStream.read(&header[0],16);
+
+	if(strcmp(header,"ALawSoundFile**")!=0)
+		return(ErrorNotWveFile());
+
+	int compressedLength=0;
+	int trailingSilence=0;
+	int compressorUid=0;
+	int sampleLength=0;
+	int repeatCount=0;
+    int versionNumber=0;
+//
+// extract the sample length, repeat count and trailing silence...
+//
+	versionNumber=ReadInt16(inStream);
+	sampleLength=ReadInt32(inStream);
+	trailingSilence=ReadInt16(inStream);
+	repeatCount=ReadInt16(inStream);
+    if(repeatCount==0) // 0 and 1 are the same on Series 3 
+        repeatCount=1; 
+
+	trailingSilence*=31250;
+
+	compressedLength=sampleLength;
+
+	cout << "Converting " << inputFile << " to " << outputFile << endl << endl;
+    cout << "Version number  :" << versionNumber << endl ;
+	cout << "Sample length   :" << sampleLength << " bytes" << endl ;
+	cout << "Repeat count    :" << repeatCount << endl ;
+	cout << "Trailing silence:" << trailingSilence << " uS" << endl ;
+
+	inStream.seekg((streampos)0x20);
+//
+// Write out the header...
+//
+	unsigned int rootstreamid=0x14;
+	unsigned int appstreamid=0x25;
+	unsigned int samplestreamid=0x34;
+
+// checked uid header
+
+	WriteWord(outStream,KUid1);
+	WriteWord(outStream,KUid2);
+	WriteWord(outStream,KUidRecordApp);
+	WriteWord(outStream,KUidCheckSum);
+
+// root stream id
+
+	WriteWord(outStream,rootstreamid);
+
+//stream dictionary @ 0x14 root stream
+
+	WriteByte(outStream,4);		// two entries in dictionary
+	WriteWord(outStream,KUidSampleStream);	// sample stream
+	WriteWord(outStream,samplestreamid);
+	WriteWord(outStream,KUidAppStream);	// appid stream
+	WriteWord(outStream,appstreamid);
+
+// record app identifier stream @ 0x25
+
+	WriteWord(outStream,KUidRecordApp);
+	WriteByte(outStream,42);
+	WriteText(outStream,appName);
+
+//  sample header @ 0x34
+
+	WriteWord(outStream,sampleLength);
+	WriteWord(outStream,compressorUid);
+	WriteWord(outStream,repeatCount-1); // repeats are zero based on Series 5 
+	WriteWord(outStream,trailingSilence);
+	WriteWord(outStream,compressedLength);
+//
+// Copy the sample data...
+//
+	streampos newPos=0x20; // start of sample data in 3a file...
+	inStream.seekg(newPos);
+
+	char buffer[256];
+	int count;
+	int actualLength=0;
+	do
+		{
+		inStream.read(&buffer[0],256);
+		if((count=inStream.gcount())!=0)
+			{
+			outStream.write(&buffer[0],count);
+			actualLength+=count;
+			}
+		} while(count);
+//
+// should check actualLength==sampleLength...but what the heck
+//
+	outStream.close();
+	inStream.close();
+	return 0;
+	}
+
+int main(int aNumArgs,char* aArgs[])
+	{
+	if(aNumArgs<=1 || aArgs[1][0]=='?' || aArgs[1][0]=='/')
+		{
+		ShowHelp();
+		return 0;
+		}
+	char inputFile[255];
+	char outputFile[255];
+
+	strcpy(inputFile,aArgs[1]);
+
+	if(aNumArgs==3)
+		strcpy(outputFile,aArgs[2]);
+
+	if(aNumArgs==2 || outputFile[0]==0)
+		{
+		strcpy(outputFile,inputFile);
+//
+// remove the extension
+//
+		int len=strlen(outputFile);
+		for(;;)
+			{
+			if(--len<0)
+				break;
+			if(outputFile[len]=='.')
+				{
+				outputFile[len]=0;
+				break;
+				}
+			}
+		}
+	return(ConvertFile(inputFile,outputFile));
+	}
+
--- a/e32tools/e32lib/e32image/Makefile.elftran.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,46 +0,0 @@
-# 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:
-#
-
-CXX	 = g++296
-CXXFLAGS = -D__SUPPORT_ELF_FILES__ -D__LINUX__ -D__GCC32__ -D__TOOLS__ -D EKA2 \
-		-I $(EPOCROOT)epoc32/include -I ../inc -I ../elftools/inc
-SOURCE	 = elf_file.cpp elf_dlld.cpp elf_imp.cpp elf_reloc.cpp elf_tran.cpp \
-	   e32uid.cpp \
-	   h_file.cpp h_mem.cpp h_utl.cpp \
-	   e32image.cpp tr_main.cpp imgdump.cpp \
-	   decode.cpp encode.cpp deflate.cpp inflate.cpp panic.cpp compress.cpp
-BLDDIR	 = ../build-elftran
-OBJECT   = $(addprefix $(BLDDIR)/, $(notdir $(SOURCE:.cpp=.o)))
-TARGET	 = $(BLDDIR)/elftran
-
-VPATH	 = ../host ../e32uid ../e32image ../e32image/deflate ../elftools/elftran
-
-_dummy := $(shell mkdir -p $(BLDDIR))
-
-all: $(TARGET)
-
-$(TARGET): $(OBJECT)
-	$(CXX) $^ -o $@
-	strip $@
-	
-$(OBJECT): $(BLDDIR)/%.o: %.cpp
-	$(CXX) $(CXXFLAGS) -c $< -o $@
-
-clean:
-	rm -f $(OBJECT) $(TARGET)
-	-rmdir $(BLDDIR)
-
-.PHONY: all clean
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/e32lib/seclib/seclib.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// e32tools/inc/seclib.h
+// Get the capabilities of an emulator / e32image.
+// Image security information structure.
+// 
+//
+
+/**
+ @internalTechnology
+ @prototype
+*/
+struct SBinarySecurityInfo
+	{
+	TUint32			iSecureId;
+	TUint32			iVendorId;
+	TUint8			iCapabilities[KCapabilitySetMaxSize];
+	TBool			iE32Image;
+	};
+
+/**
+ * Extracts security information from an image.
+ *
+ * @internalTechnology
+ * @prototype
+ */
+TInt GetSecurityInfo(const char* aFileName, SBinarySecurityInfo& aInfo);
+#ifndef __LINUX__
+TInt GetSecurityInfo(const wchar_t* aFileName, SBinarySecurityInfo& aInfo);
+#endif
--- a/e32tools/elf2e32/group/elf2e32.mmp	Wed Jun 23 17:27:59 2010 +0800
+++ b/e32tools/elf2e32/group/elf2e32.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -19,15 +19,21 @@
 
 sourcepath	../source
 source 	    deffile.cpp  deflatecompress.cpp  dll_fb_target.cpp  dll_rebuild_target.cpp  e32exporttable.cpp 
-source	 	filedump.cpp  e32imagefile.cpp elf2e32.cpp  elffilesupplied.cpp errorhandler.cpp exetarget.cpp exexp_fb_target.cpp 
-source	 	exexp_rebuild_target.cpp  export_type_fb_target.cpp  export_type_rebuild_target.cpp  export_type_target.cpp  h_utl.cpp 
+source	 	filedump.cpp  elf2e32.cpp  elffilesupplied.cpp errorhandler.cpp exetarget.cpp exexp_fb_target.cpp 
+source	 	exexp_rebuild_target.cpp  export_type_fb_target.cpp  export_type_rebuild_target.cpp  export_type_target.cpp 
 source	 	huffman.cpp  imgdump.cpp  inflate.cpp  librarytarget.cpp  main.cpp  messagehandler.cpp  messageimplementation.cpp 
 source	 	parameterlistinterface.cpp  parametermanager.cpp  pl_common.cpp  pl_dllsymbol.cpp 	pl_dso_handler.cpp  pl_elfconsumer.cpp 
 source	 	pl_elfexecutable.cpp  pl_elfexports.cpp  pl_elfimportrelocation.cpp  pl_elfimports.cpp  pl_elflocalrelocation.cpp  pl_elfproducer.cpp 
 source	 	pl_elfrelocation.cpp  pl_elfrelocations.cpp  pl_symbol.cpp  polydll_fb_target.cpp  polydll_rebuild_target.cpp  usecasebase.cpp 
-source	 	byte_pair.cpp  pagedcompress.cpp checksum.cpp stdexe_target.cpp
+source	 	checksum.cpp stdexe_target.cpp e32imagefile.cpp
+
+sourcepath ../../../imgtools/imglib/host
+source	 	h_utl.cpp
+sourcepath ../../../imgtools/imglib/compress
+source	 	byte_pair.cpp pagedcompress.cpp
 
 userinclude		../source ../include ../../../bintools/elftools/inc
+userinclude   ../../../imgtools/imglib/compress ../../../imgtools/imglib/inc
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
 option 	GCC -O2 -w
--- a/e32tools/elf2e32/group/release.txt	Wed Jun 23 17:27:59 2010 +0800
+++ b/e32tools/elf2e32/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -4,6 +4,11 @@
 NOTESRC_RELEASE_REASON
 Postlinker(elf2e32) Release
 
+version 2.2 build(004)
+===============
+Released by Lorence Wang, 11/06/2010
+    1) elf2e32 use new bytepair in imglib
+
 version 2.2 build(003)
 ===============
 Released by Lorence Wang, 26/04/2010
--- a/e32tools/elf2e32/include/h_ver.h	Wed Jun 23 17:27:59 2010 +0800
+++ b/e32tools/elf2e32/include/h_ver.h	Wed Jun 30 11:35:58 2010 +0800
@@ -18,7 +18,7 @@
 
 const TInt MajorVersion=2;
 const TInt MinorVersion=2;
-const TInt Build=3;
+const TInt Build=4;
 
 #endif
 
--- a/e32tools/elf2e32/source/e32imagefile.cpp	Wed Jun 23 17:27:59 2010 +0800
+++ b/e32tools/elf2e32/source/e32imagefile.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -33,6 +33,7 @@
 #include "h_ver.h"
 #include "checksum.h"
 #include "errorhandler.h"
+#include "byte_pair.h"
 
 #include <string>
 #include <vector>
@@ -57,25 +58,6 @@
 	return (T)res;
 }
 
-// Need a default constructor for TVersion, but don't want all the other stuff in h_utl.cpp
-/**
-Default constructor for TVersion class.
-@internalComponent
-@released
-*/
-TVersion::TVersion(){}
-
-/**
-Constructor for TVersion class.
-@internalComponent
-@released
-*/
-TVersion::TVersion(TInt aMajor, TInt aMinor, TInt aBuild): 
-	iMajor((TInt8)aMajor), iMinor((TInt8)aMinor), iBuild((TInt16)aBuild)
-{
-}
-
-
 /**
 Constructor for E32ImageChunkDesc class.
 @internalComponent
@@ -1406,7 +1388,7 @@
 @internalComponent
 @released
 */
-void CompressPages(TUint8 * bytes, TInt size, ofstream& os);
+void CompressPages(TUint8 * bytes, TInt size, ostream& os, CBytePair *aBPE);
 
 
 /**
@@ -1436,15 +1418,16 @@
 			os->write(iE32Image, aHeaderSize);
 			
 			// Compress and write out code part
+			CBytePair bpe;
 			int srcStart = GetExtendedE32ImageHeaderSize();
-			CompressPages( (TUint8*)iE32Image + srcStart, iHdr->iCodeSize, *os);
+			CompressPages( (TUint8*)iE32Image + srcStart, iHdr->iCodeSize, *os, &bpe);
 			
 			
 			// Compress and write out data part
 			srcStart += iHdr->iCodeSize;
 			int srcLen = GetE32ImageSize() - srcStart;
 			
-			CompressPages((TUint8*)iE32Image + srcStart, srcLen, *os);		
+			CompressPages((TUint8*)iE32Image + srcStart, srcLen, *os, &bpe);		
 
 		}
 		else if (compression == 0)
@@ -1702,7 +1685,7 @@
 }
 
 
-int  DecompressPages(TUint8 * bytes, ifstream& is);
+int DecompressPages(TUint8 * bytes, istream& is, CBytePair *aBPE);
 
 
 /**
@@ -1773,13 +1756,13 @@
 		oh = aImage.iOrigHdr;
 
 		// Read and decompress code part of the image
-
-		unsigned int uncompressedCodeSize = DecompressPages((TUint8 *) (aImage.iData + orighdrsz), is);
+		CBytePair bpe;
+		unsigned int uncompressedCodeSize = DecompressPages((TUint8 *) (aImage.iData + orighdrsz), is, &bpe);
 
 		
 		// Read and decompress data part of the image
 
-		unsigned int uncompressedDataSize = DecompressPages((TUint8 *) (aImage.iData + orighdrsz + uncompressedCodeSize), is);
+		unsigned int uncompressedDataSize = DecompressPages((TUint8 *) (aImage.iData + orighdrsz + uncompressedCodeSize), is, &bpe);
 
 		if (uncompressedCodeSize + uncompressedDataSize != uncompsize)
 			MessageHandler::GetInstance()->ReportMessage(WARNING, BYTEPAIRINCONSISTENTSIZEERROR);
--- a/e32tools/elf2e32/source/h_utl.h.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,128 +0,0 @@
-// 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 "Eclipse Public License v1.0"
-// which accompanies this distribution, and is available
-// at the URL "http://www.eclipse.org/legal/epl-v10.html".
-//
-// Initial Contributors:
-// Nokia Corporation - initial contribution.
-//
-// Contributors:
-//
-// Description:
-// 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:
-// 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:
-//
-
-
- #ifndef __H_UTL_H__
- #define __H_UTL_H__
-
-#include "e32defwrap.h"
-#include <e32err.h>
-#include <iostream>
-
-#ifdef __TOOLS2__
-#include <sstream>
-#include <fstream>
-using namespace std;
-#else
-#include <strstream.h>
-#endif
-
- /**
- Convert string to number.
- @internalComponent
- @released
- */
- template <class T>
- TInt Val(T& aVal, char* aStr)
- {
- 
- 
-	T x;
-	#ifdef __TOOLS2__
-	istringstream val(aStr);
-	#else
-	istrstream val(aStr,strlen(aStr));
-	#endif
-	val >> x;
-	if (!val.eof() || val.fail())
-		return KErrGeneral;
-	aVal=x;
-	return KErrNone;
-	
-     /*T x;
-     istrstream val(aStr,strlen(aStr));
-     val >> x;
-     if (!val.eof() || val.fail())
-         return KErrGeneral;
-     aVal=x;
-     return KErrNone;*/
- }
- 
- 
- //enum for decompose flag
- enum TDecomposeFlag
- {
-     EUidPresent=1,
-     EVerPresent=2
- };
- 
- /**
- class for FileNameInfo
- @internalComponent
- @released
- */
- class TFileNameInfo
- {
-     public:
-         TFileNameInfo(const char* aFileName, TBool aLookForUid);
-     public:
-         const char* iFileName;
-         TInt iTotalLength;
-         TInt iBaseLength;
-         TInt iExtPos;
-         TUint32 iUid3;
-         TUint32 iModuleVersion;
-         TUint32 iFlags;
- };
- 
- extern char* NormaliseFileName(const char* aName);
- 
- 
- 
- #ifdef __LINUX__ 
- // Case insensitive comparison functions are named differently on Linux
- #define stricmp strcasecmp 
- #define strnicmp strncasecmp 
- 
- // Convert the provided string to Uppercase
- char* strupr(char *a);
- #endif // __LINUX__
- 
- #endif // __H_UTL_H__
- 
- 
- 
- 
- 
-
-
-
-
--- a/e32tools/elf2e32/source/parametermanager.cpp	Wed Jun 23 17:27:59 2010 +0800
+++ b/e32tools/elf2e32/source/parametermanager.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -18,7 +18,7 @@
 //
 
 // This must go before ParameterManager.h
-#define __INCLUDE_CAPABILITY_NAMES__
+#define __REFERENCE_CAPABILITY_NAMES__
 #include <e32capability.h>
 
 #include "pl_common.h"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/uidcrc/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* Base tools (e.g. petran)
+*
+*/
+
+
+/**
+ @file
+*/
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_MMPFILES
+uidcrc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/uidcrc/group/uidcrc.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+TARGET			uidcrc.exe
+TARGETTYPE		exe
+SOURCEPATH	../src
+SOURCE			uidcrc.cpp e32uid.cpp
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+VENDORID 0x70000001
+
+option GCC -O2 -Wno-uninitialized
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/uidcrc/group/uidcrc.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+component       dev_build_e32tools_uidcrc
+
+source          /src/tools/build/e32tools/uidcrc
+binary          /src/tools/build/e32tools/uidcrc/group all
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/uidcrc/src/e32uid.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,253 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+#if defined(__MSVCDOTNET__) || defined(__TOOLS2__)
+	#include <iostream>
+	using namespace std;
+#endif
+
+typedef unsigned char  BYTE;	// TUint8
+typedef unsigned short WORD;	// TUint16
+typedef unsigned int   UINT;	// TUint
+
+#include <string.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include "e32uid.h"
+
+const UINT 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
+    };
+
+void Crc(WORD& aCrc,const void* aPtr,int aLength)
+//
+// Perform a CCITT CRC checksum.
+//
+	{
+
+	const BYTE* pB=(const BYTE*)aPtr;
+	const BYTE* pE=pB+aLength;
+	UINT crc=aCrc;
+    while (pB<pE)
+		crc=(crc<<8)^crcTab[((crc>>8)^*pB++)&0xff];
+	aCrc=(WORD)crc;
+	}
+
+UINT checkSum(const void* aPtr)
+//
+// Checksum every other byte
+//
+	{
+
+	const BYTE* pB=(const BYTE*)aPtr;
+	const BYTE* pE=pB+(KMaxCheckedUid*sizeof(TUid));
+	BYTE buf[(KMaxCheckedUid*sizeof(TUid))>>1];
+	BYTE* pT=(&buf[0]);
+	while (pB<pE)
+		{
+		*pT++=(*pB);
+		pB+=2;
+		}
+	WORD crc=0;
+	Crc(crc,&buf[0],(KMaxCheckedUid*sizeof(TUid))>>1);
+	return(crc);
+	}
+	
+int TUid::operator==(const TUid& aUid) const
+//
+// Compare UID's for equality
+//
+	{
+
+	return(iUid==aUid.iUid);
+	}
+
+int TUid::operator!=(const TUid& aUid) const
+//
+// Compare UID's for equality
+//
+	{
+
+	return(iUid!=aUid.iUid);
+	}
+
+TUidType::TUidType()
+//
+// Constructor
+//
+    {
+
+	memset(this,0,sizeof(TUidType));
+    }
+
+TUidType::TUidType(TUid aUid1)
+//
+// Constructor
+//
+    {
+
+
+	memset(this,0,sizeof(TUidType));
+    iUid[0]=aUid1;
+    }
+
+TUidType::TUidType(TUid aUid1,TUid aUid2)
+//
+// Constructor
+//
+    {
+
+    iUid[0]=aUid1;
+    iUid[1]=aUid2;
+    iUid[2]=KNullUid;
+    }
+
+TUidType::TUidType(TUid aUid1,TUid aUid2,TUid aUid3)
+//
+// Constructor
+//
+    {
+
+
+    iUid[0]=aUid1;
+    iUid[1]=aUid2;
+    iUid[2]=aUid3;
+    }
+
+int TUidType::operator==(const TUidType& aUidType) const
+//
+// TRUE if equal.
+//
+    {
+
+    return(iUid[0]==aUidType.iUid[0] &&
+           iUid[1]==aUidType.iUid[1] &&
+           iUid[2]==aUidType.iUid[2]);
+    }
+
+int TUidType::operator!=(const TUidType& aUidType) const
+//
+// TRUE if not equal.
+//
+    {
+
+
+    return(!(*this==aUidType));
+    }
+
+const TUid& TUidType::operator[](int anIndex) const
+//
+// Array operator.
+//
+    {
+
+	return(iUid[anIndex]);
+    }
+
+TUid TUidType::MostDerived() const
+//
+// Return the most derived type
+//
+    {
+
+    if (iUid[2]!=KNullUid)
+        return(iUid[2]);
+    if (iUid[1]!=KNullUid)
+        return(iUid[1]);
+    return(iUid[0]);
+    }
+
+int TUidType::IsPresent(TUid aUid) const
+//
+// TRUE if aUid is present as any type.
+//
+    {
+
+	return(iUid[0]==aUid || iUid[1]==aUid || iUid[2]==aUid);
+    }
+
+int TUidType::IsValid() const
+//
+// TRUE if one of the type is not NULL.
+//
+    {
+
+    return(MostDerived()!=KNullUid);
+    }
+
+TCheckedUid::TCheckedUid()
+//
+// Constructor
+//
+	{
+
+	memset(this,0,sizeof(TCheckedUid));
+	}
+
+TCheckedUid::TCheckedUid(const TUidType& aUidType)
+//
+// Constructor
+//
+	{
+
+    Set(aUidType);
+    }
+
+void TCheckedUid::Set(const TUidType& aUidType)
+//
+// Set from a aUidType
+//
+	{
+
+    iType=aUidType;
+    iCheck=Check();
+    }
+
+UINT TCheckedUid::Check() const
+//
+// Return the checksum of the UIDs
+//
+	{
+
+	return((checkSum(((BYTE*)this)+1)<<16)|checkSum((BYTE*)this));
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/e32tools/uidcrc/src/uidcrc.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,91 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include <iostream>
+using namespace std;
+ 
+#include <stdio.h>
+#include <stdlib.h>
+#include <e32std.h>
+#include <e32std_private.h>
+#include <e32uid.h>
+
+// Get round the privateness of the checksum etc.
+// See also PE_TRAN.CPP TE32ImageUids
+
+class TCheckedUidX : public TCheckedUid
+	{
+public:
+	inline TCheckedUidX(TUint uids[3])
+		: TCheckedUid(TUidType(TUid::Uid(uids[1]),TUid::Uid(uids[2]),TUid::Uid(uids[3]))) 
+		{}
+	inline TUint CRC() 
+		{ return Check(); }
+	};
+
+int usage()
+	{
+	fprintf(stderr, "uidcrc <uid1> <uid2> <uid3> [ <outputfile> ]\n");
+	return -1;
+	}
+
+int main(int argc, char* argv[])
+	{
+	if (argc<4 || argc>5)
+		return usage();
+
+	TUint uids[5];
+	int i=0;
+
+	for (i=1; i<4; i++)
+		{
+		char* endptr = "failed";
+		uids[i] = strtoul(argv[i],&endptr,0);
+		if (*endptr!='\0')
+			{
+			fprintf(stderr, "invalid uid%d >%s<\n",i,argv[i]);
+			return -1;
+			}
+		}
+
+	TCheckedUidX checked(uids);
+	uids[4] = checked.CRC();
+
+	if (argc==5)
+		{
+		FILE* fp=fopen(argv[4], "wb");
+		if (fp==0)
+			{
+			fprintf(stderr, "cannot open %s for writing\n", argv[4]);
+			return -1;
+			}
+		for (i=1; i<5; i++)
+			{
+			TUint word=uids[i];
+			unsigned char bytes[4];
+			bytes[0] = (unsigned char)( word     &0xFF);
+			bytes[1] = (unsigned char)((word>> 8)&0xFF);
+			bytes[2] = (unsigned char)((word>>16)&0xFF);
+			bytes[3] = (unsigned char)((word>>24)&0xFF);
+			fwrite(bytes, 4, 1, fp);
+			}
+		fclose(fp);
+		return 0;
+		}
+
+	printf("0x%08x 0x%08x 0x%08x 0x%08x\n", uids[1], uids[2], uids[3], uids[4]);
+	return 0;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/unzip-5.40/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../unzip.exe	   /tools/unzip-5.40/unzip.exe
+
+PRJ_MMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/unzip-5.40/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian Software Ltd.
+
+NOTESRC_RELEASE_REASON
+Unzip tools.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/unzip-5.40/group/unzip-5.40.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_hostenv_unzip-5.40
+
+source \src\tools\build\hostenv\unzip-5.40
+exports \src\tools\build\hostenv\unzip-5.40\group
+
+notes_source \src\tools\build\hostenv\unzip-5.40\group\release.txt
+
+ipr T
\ No newline at end of file
Binary file hostenv/unzip-5.40/unzip.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/zip-2.2/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../zip.exe	   /tools/zip-2.2/zip.exe
+
+PRJ_MMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/zip-2.2/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian Software Ltd.
+
+NOTESRC_RELEASE_REASON
+Zip tools.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/hostenv/zip-2.2/group/zip-2.2.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_hostenv_zip-2.2
+
+source \src\tools\build\hostenv\zip-2.2
+exports \src\tools\build\hostenv\zip-2.2\group
+
+notes_source \src\tools\build\hostenv\zip-2.2\group\release.txt
+
+ipr T
\ No newline at end of file
Binary file hostenv/zip-2.2/zip.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/group/configpaging.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			configpaging.exe
+TARGETTYPE		exe
+SOURCEPATH		../src
+SOURCE			configpaging.cpp
+SYSTEMINCLUDE	/epoc32/include
+SYSTEMINCLUDE	/epoc32/include/tools/stlport
+SYSTEMINCLUDE	../../imglib/boostlibrary
+
+STATICLIBRARY   boost_regex-1.39
+STATICLIBRARY   stlport.5.1 
+#ifdef TOOLS2_LINUX
+OPTION    GCC -pthread -O2 -Wno-uninitialized
+#else
+OPTION    GCC -mthreads -O2 -Wno-uninitialized
+#endif 
+
+ 
+VENDORID 0x70000001
--- a/imgtools/buildrom/group/release.txt	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/buildrom/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -1,3 +1,24 @@
+Version 3.26.0 (BUILDROM)
+===============
+Released by Lorence Wang 28/06/2010
+	1) Prepend EPOCROOT to epoc32 feature
+
+Version 3.25.2 (BUILDROM)
+===============
+Reoleased by Jason Cui 11/06/2010
+	1) Empty Directory Support in FAT Image
+
+Version 3.24.2 (BUILDROM)
+===============
+Reoleased by Jason Cui 09/06/2010
+	1) DPDEF145499: buildrom cannot support romname <name>
+
+Version 3.24.1 (buildrom)
+===============
+Released by Lorence Wang, 31/05/2010
+	1) DPDEF145359 Buildrom cannot find dso file in linux
+	2) DPDEF145470 buildrom with "-wordir=pathname" has error
+
 Version 3.24.0 (buildrom)
 ===============
 Released by Lorence Wang, 20/05/2010
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/src/configpaging.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,478 @@
+/*
+* Copyright (c) 2009 - 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* @internalComponent * @released
+* configpaging mainfile to do configpaging in buildrom.
+*
+*/
+
+#include <boost/regex.hpp>
+#include <string>
+#include <iostream>
+#include <map>
+#include <vector>
+#include <fstream>
+#include <malloc.h>
+
+using namespace std;
+using namespace boost ;
+
+typedef const char* const_str ;
+
+static const string NULL_STRING("");
+static const char CONSTANT_UNPAGED[] = "unpaged";
+static const char CONSTANT_PAGED[] = "paged";
+static const char CONSTANT_UNPAGEDCODE[] = "unpagedcode";
+static const char CONSTANT_PAGEDCODE[]	= "pagedcode";
+static const char CONSTANT_UNPAGEDDATA[] = "unpageddata";
+static const char CONSTANT_PAGEDDATA[] = "pageddata";
+#ifdef WIN32 
+static const char CONSTANT_CONFIG_PATH[] = "epoc32\\rom\\configpaging\\";
+static string epocroot("\\");
+static const char SLASH_CHAR = '\\';
+#else
+#include <strings.h>
+#define strnicmp strncasecmp
+#define _alloca alloca
+static const char CONSTANT_CONFIG_PATH[] = "epoc32/rom/configpaging/";
+static string epocroot("/");
+static const char SLASH_CHAR = '/';
+#endif 
+static const char CONSTANT_CONFIG_FILE[] = "configpaging.cfg" ;
+#define is_undef(s)		(0 == s.length())
+static const int MAJOR_VERSION = 1;
+static const int MINOR_VERSION = 2;
+static const int BUILD_NUMBER  = 0;
+static const char COPYRIGHT[]="Copyright (c) 2010 Nokia Corporation.";
+struct ListElement{  
+	const_str code ;
+	const_str data ;	 
+}; 
+
+
+static string configlist ;
+static regex e0("^(file|data|dll|secondary)(=|\\s+)",regex::perl|regex::icase);
+static regex e1("^(code|data)?pagingoverride=(.*)\\s*",regex::perl);
+static regex e2("^(un)?paged(code|data)?(\\s+(un)?paged(code|data)?)?:",regex::perl);
+static regex e3("^include\\s*\"(.*)\"",regex::perl);
+static regex e4("(\\S+)(\\s+(un)?paged(code|data)?(\\s+(un)?paged(code|data)?)?)?",regex::perl);
+static regex e5("\\b(un)?paged(data)?\\b\\s*$",regex::perl|regex::icase);
+static regex e6("\\b(un)?paged(code)?\\b\\s*$",regex::perl|regex::icase); 
+static regex e7("\\b(un)?paged(code|data)?\\b",regex::perl|regex::icase); 
+//static regex e8("tool=|\\s+)",regex::perl|regex::icase);
+
+ 
+
+static bool is_obystatement(const char* aLine) {	 
+	if(!strnicmp(aLine,"file",4)|| !strnicmp(aLine,"data",4))
+		aLine += 4 ;
+	else if(!strnicmp(aLine,"dll",3))
+		aLine += 3;
+	else if(!strnicmp(aLine,"secondary",9))
+		aLine += 9 ;
+	else
+		return false ;
+
+	return (*aLine =='=' || *aLine == ' '|| *aLine == '\t');
+ 
+}
+static void trim(string& aStr){
+
+	char* data = const_cast<char*>(aStr.data());
+	int length = aStr.length();
+	int firstIndex = 0 ;
+	int lastIndex = length - 1;
+	// remove ending blanks	
+	while(lastIndex >= 0 && (data[lastIndex] == ' ' || data[lastIndex] == '\t')){
+		lastIndex -- ;
+	}
+
+	// remove heading blanks	
+	while((firstIndex < lastIndex ) && (data[firstIndex] == ' ' || data[firstIndex] == '\t')){
+		firstIndex ++ ;
+	}	
+	lastIndex++ ;
+	if(lastIndex < length){
+		aStr.erase(lastIndex,length - lastIndex);
+	}
+	if(firstIndex > 0){
+		aStr.erase(0,firstIndex);
+	}
+}
+static void make_lower(char* aStr,size_t aLength){
+
+	for(size_t i = 0 ; i < aLength ; i++){
+		if(aStr[i] >= 'A' && aStr[i] <= 'Z')
+			aStr[i] |= 0x20 ;
+	}
+}
+static bool readConfigFile(const_str& aCodePagingRef, const_str& aDataPagingRef,
+		map<string,ListElement>& aListRef, const_str aFileName ) {
+	ifstream is(aFileName, ios_base::binary | ios_base::in);
+	if(!is.is_open()){
+		cerr<< "Can not open \""<< aFileName << "\" for reading.\n";
+		return false ;
+	}
+	const_str filecodepaging = "";
+	const_str filedatapaging = "";
+	match_results<string::const_iterator> what;
+
+	is.seekg(0,ios::end);
+	size_t size = is.tellg();
+	is.seekg(0,ios::beg);
+
+	char *buf = new char[size + 1];
+	is.read(buf,size);
+	buf[size] = '\n' ;
+
+	char* end = buf + size ;
+	char* lineStart = buf ;
+	int lfcr ;
+	string line ;
+
+	while(lineStart < end ){
+		// trim left ;
+		while(*lineStart == ' ' || *lineStart == '\t' ){
+			lineStart++ ;
+		}
+		char* lineEnd = lineStart;
+		while(*lineEnd != '\r' && *lineEnd != '\n'){
+			lineEnd++ ;
+		}
+		if(*lineEnd == '\r' && lineEnd[1] == '\n')
+			lfcr = 2 ;
+		else
+			lfcr = 1 ;
+
+		*lineEnd = 0 ;
+		// empty line or comment
+		if(lineEnd == lineStart || *lineStart == '#' ){
+			lineStart = lineEnd + lfcr ;
+			continue ;
+		}
+		size_t lenOfLine = lineEnd - lineStart;
+		make_lower(lineStart,lenOfLine);
+		line.assign(lineStart,lenOfLine);
+			
+		if(regex_search(line, what, e1)){
+			string r1 = what[1].str();
+			string r2 = what[2].str(); 
+			if(is_undef(r1)){ //if ($1 eq undef)
+				if(r2 == "defaultpaged"){
+					aCodePagingRef = CONSTANT_PAGED ;
+				} else if(r2 == "defaultunpaged"){
+					aCodePagingRef = CONSTANT_UNPAGED ;
+					aDataPagingRef = CONSTANT_UNPAGED;
+				}else{
+					cerr << "Configpaging Warning: invalid pagingoverride setting: "<< r2 <<"\n" ;
+				}
+			}else if(r1 == "code"){
+				if(r2 == "defaultpaged"){
+					aCodePagingRef = CONSTANT_PAGED ; 
+				} else if(r2 == "defaultunpaged"){
+					aCodePagingRef = CONSTANT_UNPAGED ; 
+				}else{
+					cerr << "Configpaging Warning: invalid codepagingoverride setting: "<< r2 <<"\n" ;
+				}
+			}
+			else if(r1 == "data" ){
+				if(r2 == "defaultpaged"){
+					aDataPagingRef = CONSTANT_PAGED ; 
+				} else if(r2 == "defaultunpaged"){
+					aDataPagingRef = CONSTANT_UNPAGED ; 
+				}else{
+					cerr << "Configpaging Warning: invalid datapagingoverride setting: "<< r2 <<"\n" ;
+				}
+			}
+		}// check e1
+		else if(regex_search(line, what, e2)){
+			string r1 = what[1].str();
+			string r2 = what[2].str();	
+			string r3 = what[3].str();	
+			string r4 = what[4].str();	
+			string r5 = what[5].str();   
+			filecodepaging = "";
+			filedatapaging = "";
+			if (is_undef(r1)) {
+				if (is_undef(r2)) {
+					filecodepaging = CONSTANT_PAGED;
+				}else if (r2 == "code") {
+					filecodepaging = CONSTANT_PAGED;
+				} else if(r2 == "data") {
+					filedatapaging = CONSTANT_PAGED;
+				} else {
+					cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+				}
+			} else if (r1 == "un"){
+				if (is_undef(r2)) { //$2 eq undef
+					filecodepaging = CONSTANT_UNPAGED;
+					filedatapaging = CONSTANT_UNPAGED;
+				}else if (r2 == "code") {
+					filecodepaging = CONSTANT_UNPAGED;
+				} else if(r2 == "data") {
+					filedatapaging = CONSTANT_UNPAGED;
+				} else {
+					cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+				}
+			} else {
+				cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+			}
+			if (r3.length() > 0){		//$3 ne undef
+				if (is_undef(r4)) {
+					if (is_undef(r5)) {
+						filecodepaging = CONSTANT_PAGED;
+					}else if (r5 == "code") {
+						filecodepaging = CONSTANT_PAGED;
+					} else if(r5 == "data") {
+						filedatapaging = CONSTANT_PAGED;
+					} else {
+						cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+					}
+				} else if (r4 == "un") {
+					if (is_undef(r5)) {
+						filecodepaging = CONSTANT_UNPAGED;
+						filedatapaging = CONSTANT_UNPAGED;
+					}else if (r5 == "code") {
+						filecodepaging = CONSTANT_UNPAGED;
+					} else if(r5 == "data") {
+						filedatapaging = CONSTANT_UNPAGED;
+					} else {
+						cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+					}
+				} else {
+					 cerr << "Configpaging Warning: unrecognized line: "<< lineStart << "\n";
+				}
+			}
+		}
+		else if(regex_search(line, what, e3)){
+			string filename = epocroot + CONSTANT_CONFIG_PATH;
+			filename += what[1].str();
+			readConfigFile(aCodePagingRef, aDataPagingRef, aListRef, filename.c_str()); 
+		}
+		else if(regex_search(line, what, e4)){
+			string r1 = what[1].str();
+			string r2 = what[2].str();	
+			string r3 = what[3].str();	
+			string r4 = what[4].str();	
+			string r5 = what[5].str();	
+			string r6 = what[6].str();	
+			string r7 = what[7].str(); 
+			ListElement element = {aCodePagingRef, aDataPagingRef};
+			if (is_undef(r2)){ //($2 eq undef){
+				if (0 != *filecodepaging){//filecodepaging ne "") 
+					element.code = filecodepaging;	//$element{code} = $filecodepaging;
+				}
+				if ( 0 != *filedatapaging){//$filedatapaging ne "") 
+					element.data = filedatapaging ;//element.data = $filedatapaging;
+				}
+			} else {
+				if (is_undef(r4)){//$4 eq undef
+					if (is_undef(r3)) {//$3 eq undef
+						element.code = CONSTANT_PAGED; 
+					} else if (r3 == "un") {
+						element.code = CONSTANT_UNPAGED; 
+						element.data = CONSTANT_UNPAGED; 
+					}
+				} else if (r4 == "code") {
+					if (is_undef(r3)) {
+						element.code = CONSTANT_PAGED;
+					} else if (r3 == "un") {
+						element.code = CONSTANT_UNPAGED;
+					}
+				} else if (r4 == "data") {
+					if (is_undef(r3)) {
+						element.data = CONSTANT_PAGED;
+					} else if (r3 == "un") {
+						element.data = CONSTANT_UNPAGED;
+					}
+				} else {
+					cerr << "Configpaging Warning: unrecognized attribute in line: "<< lineStart << "\n";
+				}
+				if (r5.length() > 0){//$5 ne undef
+					if (is_undef(r7)){ //$7 eq undef
+						if (is_undef(r6)) { //$6 eq undef
+							element.code = CONSTANT_PAGED; 
+						} else if (r6 == "un") {
+							element.code = CONSTANT_UNPAGED; 
+							element.data = CONSTANT_UNPAGED; 
+						}
+					} else if (r7 == "code") {
+						if (is_undef(r6)) {
+							element.code = CONSTANT_PAGED;
+						} else if (r6 == "un") {
+							element.code = CONSTANT_UNPAGED;
+						}
+					} else if (r7 == "data") {
+						if (is_undef(r6)) {
+							element.data = CONSTANT_PAGED;
+						} else if (r6 == "un") {
+							element.data = CONSTANT_UNPAGED;
+						}
+					} else {
+						cerr << "Configpaging Warning: unrecognized attribute in line: "<< lineStart << "\n";
+					}
+				}
+			}	
+			//$$listref{$1} = \%element;
+			aListRef.insert(pair<string,ListElement>(r1,element));
+		}
+		lineStart = lineEnd + lfcr ;
+	}
+
+	delete []buf ;
+	is.close(); 
+	
+	return true ;
+}
+
+static bool match_icase(const string& a, const string& b){
+	int la = a.length();
+	int lb = b.length();
+	char *copyOfA = (char*)_alloca(la+2);
+	*copyOfA = ' ';
+	copyOfA++ ;
+	memcpy(copyOfA ,a.c_str(),la);
+	copyOfA[la] = 0;
+	char* end = &copyOfA[la];
+	make_lower(copyOfA,la);
+	while(copyOfA < end){
+		char *found = strstr(copyOfA,b.c_str()); 
+		if(0 == found)
+			return false ;
+		if((found[-1] == ' ' || found[-1] == '\\'|| found[-1] == '/'|| found[-1] == '\t' || found[-1] == '"'|| found[-1] == '=') &&
+					( found[lb] == ' '|| found[lb] == '\t' || found[lb] == '"'|| found[lb] == '\0'))
+			return true ;
+		copyOfA = found + lb ;		 
+	}
+
+	return false ;
+}
+
+static void configpaging_single(){
+
+	const_str codepaging="";
+	const_str datapaging="";
+	map<string, ListElement> list ;
+	vector<string> keys ;//my @keys;
+    string line ;
+
+	cerr << "configpaging.exe: Modifying demand paging configuration using "<< configlist <<"\n";
+	readConfigFile(codepaging, datapaging, list, configlist.c_str());
+	match_results<string::const_iterator> what;
+	string codepagingadd ,datapagingadd ;
+	while(true){
+		getline(cin,line); 		 
+		if(cin.eof()) break ;
+		if(line == ":q") break ;
+		trim(line);
+		const char* lineData = line.data();
+		if(*lineData == '#' ){
+			cout << lineData << "\n" ;
+			continue ;
+		}		 
+		int length = line.length();
+		if( length > 2){
+			//check rem 			
+			if((lineData[0] == 'R' || lineData[0] == 'r' ) && (lineData[1] == 'E' || lineData[1] == 'e' ) && (lineData[2] == 'M' || lineData[2] == 'm' )){
+				cout << lineData << "\n" ;
+				continue ;
+			}
+		}
+		codepagingadd = "";
+		datapagingadd = ""; 
+
+		if(is_obystatement(lineData)){
+			for( map<string,ListElement>::iterator it  = list.begin() ; it != list.end() ; it++){
+				if(match_icase(line,it->first) ){
+					if (it->second.code == CONSTANT_PAGED ){ 
+						codepagingadd += " " ;
+						codepagingadd += CONSTANT_PAGEDCODE;
+					} else if (it->second.code == CONSTANT_UNPAGED) {  
+						codepagingadd += " " ;
+						codepagingadd += CONSTANT_UNPAGEDCODE;
+					} 
+					if (it->second.data == CONSTANT_PAGED) {  
+						datapagingadd += " " ;
+						datapagingadd += CONSTANT_PAGEDDATA;
+					} else if  (it->second.data == CONSTANT_UNPAGED) {  
+						datapagingadd += " " ;
+						datapagingadd += CONSTANT_UNPAGEDDATA;
+					}
+					break ;
+				}
+			}//for 
+			if (codepagingadd.length() == 0 && 0 != *codepaging) {//!$codepagingadd and $codepaging
+				codepagingadd = " " ;
+				codepagingadd += codepaging ;
+				codepagingadd += "code";
+			}
+			if (datapagingadd.length() == 0 &&  0 != *datapaging) { //!$datapagingadd and $datapaging
+				datapagingadd = " " ;
+				datapagingadd += datapaging ;
+				datapagingadd += "data";
+					}
+			if (codepagingadd.length() > 0 && datapagingadd.length() == 0){ //$codepagingadd and !$datapagingadd
+				if (regex_search(line,what,e5)){  //$line =~ /\b(un)?paged(data)?\b\s*$/) { //$line =~ /\b(un)?paged(data)?\b\s*$/
+					datapagingadd = " " ;
+					if(what[1].length() > 0)
+					{
+						datapagingadd += what[1].str();
+						datapagingadd += "pageddata";
+					}
+				}
+			} else if (datapagingadd.length() > 0 && codepagingadd.length() == 0) {//$datapagingadd and !$codepagingadd
+				if (regex_search(line,what,e6)){
+					codepagingadd = " " ;
+					codepagingadd += what[1].str();
+					codepagingadd += "pagedcode";
+				}
+			}
+			if (datapagingadd.length() > 0 || datapagingadd.length() > 0) { // $datapagingadd or $datapagingadd
+				line = regex_replace(line,e7,NULL_STRING);
+			} 
+		}
+		cout << line << codepagingadd << datapagingadd  << "\n";
+
+	}
+}
+// 
+int main(int argc , char* argv[]) {
+ 
+	char* tmp = getenv("EPOCROOT"); 
+	if(tmp && *tmp)
+		epocroot = string(tmp);
+	char ch = epocroot.at(epocroot.length() - 1);
+	if(ch != '\\' && ch != '/')
+		epocroot += SLASH_CHAR;
+	
+	if(argc > 1 ){
+		char* arg = argv[1];
+		if('-' == *arg && (arg[1] | 0x20) == 'v'){
+			cout << "configpaging - The paging configuration plugin for BUILDROM V" ;
+			cout << MAJOR_VERSION << "."<< MINOR_VERSION << "." << BUILD_NUMBER<< endl;			
+			cout << COPYRIGHT << endl << endl; 
+			return 0;
+		}
+		configlist = epocroot + CONSTANT_CONFIG_PATH; 
+		configlist += string(arg);
+	}
+	else{
+		configlist = epocroot + CONSTANT_CONFIG_PATH;
+		configlist += CONSTANT_CONFIG_FILE;
+	}
+	configpaging_single(); 	
+
+	return 0;
+}
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/buildrom	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+#!/bin/sh
+perl -S buildrom.pl $@
--- a/imgtools/buildrom/tools/buildrom.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/buildrom/tools/buildrom.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -65,7 +65,7 @@
 my $enforceFeatureManager = 0; # Flag to make Feature Manager mandatory if SYMBIAN_FEATURE_MANAGER macro is defined. 
 
 my $BuildromMajorVersion = 3 ;
-my $BuildromMinorVersion = 24;
+my $BuildromMinorVersion = 26;
 my $BuildromPatchVersion = 0;
 
 
@@ -150,7 +150,7 @@
    -I<directory>                    -- Use <directory> for the referenced IBY/OBY files
    -argfile=xxx                     -- specify argument-file name containing list of command-line arguments to buildrom   
    -lowmem                          -- use memory-mapped file for image build to reduce physical memory consumption   
-   -chechcase                       -- check character case of path/name in oby/iby files, 
+   -checkcase                       -- check character case of path/name in oby/iby files, 
                                     the result will be checkcase.log, this option is only valid on windows.
    -workdir=xxx                     -- specify a directory to contain generated files.   
 
@@ -226,7 +226,7 @@
 my $thisdir=cwd;
 $thisdir=~s-\\-\/-go;		    # separator from Perl 5.005_02+ is forward slash
 $thisdir.= "\/" unless $thisdir =~ /\/$/;
-$thisdir=~s-^(.:)?\/--o;		    # remove drive letter and leading backslash
+$thisdir =~ s-\/-\\-g if (&is_windows);
 
 my $rominclude = $epocroot."epoc32\/rom\/include\/";
 $rominclude = &get_epocdrive().$rominclude unless $rominclude =~ /^.:/;
@@ -341,7 +341,7 @@
 my $checkcase = 0;
 my $checkcase_platform = "";
 my $checkcase_test = 0;
-my $invokecmddir = "";
+my $opt_workdir = 0;
 
 sub match_obyfile
 {
@@ -354,7 +354,6 @@
 
 	# search for the oby file in the list of include directories
 	my @otherDirs = ($rominclude);
-	push (@otherDirs, $invokecmddir) if ($invokecmddir ne "");
 
 	if ($featureVariant{'VALID'})
 	{
@@ -762,28 +761,7 @@
 		if ( $arg =~ /^-k$/i || $arg =~ /^-keepgoing$/i )
 	  {
 			$opt_k = 1;		
-			next;
-	  }elsif ($arg =~ /^-workdir=(.*)/)
-		{
-			my $workdir=$1;
-			if( $workdir =~ m/ / )
-			{
-				print "* Warning: $workdir contains whitespace, hence the files will be created in default location \n";
-				$workdir = "";
-			}
-			if ($workdir ne "")
-			{
-				$invokecmddir = cwd;
-				$invokecmddir=~s-\\-\/-go;		    # separator from Perl 5.005_02+ is forward slash
-				$invokecmddir.= "\/" unless $invokecmddir =~ /\/$/;
-				$workdir =~ s-\\-\/-g;
-				chdir "$workdir" or die "cannot change to directory $workdir\n";
-				$thisdir=cwd;
-				$thisdir=~s-\\-\/-go;		    # separator from Perl 5.005_02+ is forward slash
-				$thisdir.= "\/" unless $thisdir =~ /\/$/;
-				$thisdir=~s-^(.:)?\/--o;		    # remove drive letter and leading backslash
-			}
-			next;	
+  		last;	
 		}
 	}
 	foreach my $arg (@argList)
@@ -1023,6 +1001,22 @@
 		}
 		if ($arg =~ /^-workdir=(.*)/)
 		{
+			my $workdir = $1;
+			if (!-d $workdir)
+			{
+				die "directory $workdir does not exist\n";
+			}
+			my $currentdir = cwd;
+			chdir "$workdir" or die "cannot change to directory $workdir\n";
+			$thisdir=cwd;
+			$thisdir=~s-\\-\/-go;		    # separator from Perl 5.005_02+ is forward slash
+			$thisdir.= "\/" unless $thisdir =~ /\/$/;
+			if(&is_windows)
+			{
+				$thisdir =~ s-\/-\\-g;
+			}
+			$opt_workdir = 1;
+			chdir "$currentdir";
 			next;	
 		}
         if($arg =~/^-c(.*)/)
@@ -1253,7 +1247,8 @@
 
 sub preprocessing_phase
 {
-	unlink "tmp1.oby";
+	my $temp1OBYFile = $thisdir."tmp1.oby";
+	unlink "$temp1OBYFile";
 
 #	Macro "ROM_FEATURE_MANAGEMENT" is defined when "-f|fr" or "-fm" is used
 	if (defined ($featureXml))
@@ -1283,14 +1278,13 @@
 	{
 		# no feature variant so use the standard includes
 		$cppargs .= " -I. -I \"$rominclude\"";
-		$cppargs .= " -I \"$invokecmddir\"" if ($invokecmddir ne "");
 	}
 
-	print "* cpp -Wno-endif-labels -o tmp1.oby $cppargs\n" if ($opt_v);
+	print "* cpp -Wno-endif-labels -o $temp1OBYFile $cppargs\n" if ($opt_v);
 	
 	is_existinpath("cpp", romutl::DIE_NOT_FOUND);
 	$errors = 0;
-	open CPP, "| cpp -Wno-endif-labels -o tmp1.oby $cppargs" or die "* Can't execute cpp";
+	open CPP, "| cpp -Wno-endif-labels -o $temp1OBYFile $cppargs" or die "* Can't execute cpp";
 	foreach my $arg (@obyfiles)
 	{
 		print CPP "\n#line 1 \"$arg\"\n";
@@ -1312,9 +1306,8 @@
 	}
 	close CPP;
 	my $cpp_status = $?;
-	die "* cpp failed\n" if ($cpp_status != 0 || !-f "tmp1.oby");
-
-	my $temp1OBYFile = "tmp1.oby";
+	die "* cpp failed\n" if ($cpp_status != 0 || !-f "$temp1OBYFile");
+
 	if( defined ($image_content))
 	{
 		#Read the OBY file that was generated by the pre-processor
@@ -1400,11 +1393,11 @@
 		@substitutionOrder = ("TODAY", "RIGHT_NOW", "EPOCROOT");
 	}
 
+	my $temp1OBYFile = $thisdir."tmp1.oby";
 	
-	open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n");
+	open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
 	while ($line=<TMP1>)
 	{
-
 		if(($line =~ /^\s*romsize\s*=/i) || ( $line=~ /^\s*rom_image/i) || ($line =~ /^\s*data_image/i))
 		{
 			$onlysmrimage = 0;
@@ -1415,7 +1408,7 @@
 	if ($enforceFeatureManager && (!$featuremanager) && (!$noFeatureManager) )
 	{
 		my $defaultFeatureDbFlag = 0;
-		open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n");
+		open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
 		while ($line=<TMP1>)
 		{
 			if ($line=~/^\s*defaultfeaturedb\s*=?\s*(\S+)/i)
@@ -1439,11 +1432,20 @@
 		}
 	}
 
-	open TMP1, "tmp1.oby" or die("* Can't open tmp1.oby\n");
+	open TMP1, "$temp1OBYFile" or die("* Can't open $temp1OBYFile\n");
 	while ($line=<TMP1>)
 	{
 		track_source($line);
 		$line =~ s-\\-\/-g;
+
+		my $tempstring = $epocroot."epoc32";
+		if(($line !~ /^\s*\#/) && ($line =~ /\/epoc32/i) 
+		 && ($line !~ /EPOCROOT##\/?epoc32/i) && ($line !~ /$tempstring/i))
+		{
+			print "add EPOCROOT for line: $line\n" if ($opt_v);
+	  	$line =~ s-\/epoc32-EPOCROOT##epoc32-ig;
+		}
+
 		#
 		# Recognise keywords in lines that we process before substitution
 		#
@@ -1802,6 +1804,7 @@
 sub dump_obydata
 {
 	my ($dumpfile, $comment) = @_;
+	$dumpfile = $thisdir.$dumpfile;
 	unlink($dumpfile);
 	open DUMPFILE, ">$dumpfile" or die("* Can't create $dumpfile\n");
 	print "* Writing $dumpfile - $comment\n";
@@ -2536,7 +2539,7 @@
 			}
 		}
 		my @spiargs; #arguments passed to createSpi
-		push @spiargs, ("-t$targetspi", "-d\/$thisdir", "-hide@hidedatainspi");
+		push @spiargs, ("-t$targetspi", "-d$thisdir", "-hide@hidedatainspi");
 		if($existingspi ne "") { push @spiargs, $existingspi; }
 		&spitool::createSpi(@spiargs, @dataforspi); # external call to 
 	}
@@ -2702,7 +2705,7 @@
                                         while(defined $spiarray[$imageIdx][$spiIdx]) {
                                                 if($spiarray[$imageIdx][$spiIdx]{spifile} =~ /(.+)\.(.*)$/) {
                                                         my $targetspi="$1-$imageIdx-$spiIdx\.$2";
-                                                        push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[$imageIdx][$spiIdx]{spi} . "\"\n";
+                                                        push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[$imageIdx][$spiIdx]{spi} . "\"\n";
                                                 }
                                                 $spiIdx++;
                                         }
@@ -2729,7 +2732,7 @@
 					while(defined $spiarray[0][$k]) {
 						if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) {
 							my $targetspi="$1-0-$k\.$2";
-							push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi .  "\"\n";
+							push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi .  "\"\n";
 						}
 						$k++;
 					}
@@ -2739,7 +2742,7 @@
 				while(defined $spiarray[$romimage][$j]) { #put in SPI files for current ROM_IMAGE
 					if($spiarray[$romimage][$j]{spifile} =~ /(.+)\.(.*)$/) {
 						my $targetspi="$1-$romimage-$j\.$2";
-						push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[$romimage][$j]{spidir} . $targetspi .  "\"\n";
+						push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[$romimage][$j]{spidir} . $targetspi .  "\"\n";
 					}
 					$j++;
 				}
@@ -2749,7 +2752,7 @@
 					while(defined $spiarray[0][$k]) {
 						if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) {
 							my $targetspi="$1-0-$k\.$2";
-							push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n";
+							push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n";
 						}
 						$k++;
 					}
@@ -2766,7 +2769,7 @@
 			while(defined $spiarray[0][$k]) {
 				if($spiarray[0][$k]{spifile} =~ /(.+)\.(.*)$/) {
 					my $targetspi="$1-0-$k\.$2";
-					push @newobydata, "data=" . "\/$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n";
+					push @newobydata, "data=" . "$thisdir" . $targetspi . " \"" . $spiarray[0][$k]{spidir} . $targetspi . "\"\n";
 				}
 				$k++;
 			}
@@ -2940,7 +2943,7 @@
 			my $j=0;
 			while(defined $featurefilearray[$i][$j])
 			{
-				my $targetfeaturefile = $featurefilearray[$i][$j]{cfgfile};
+				my $targetfeaturefile = $thisdir.$featurefilearray[$i][$j]{cfgfile};
 				if (!(&featuresutil::createFeatureFile($i,$j,$targetfeaturefile,\@featureslist,$featuremanager))) 
 				{
 					$featurefilearray[$i][$j]{cfgfile}= undef;
@@ -2971,7 +2974,7 @@
 						my $targetfeaturefile=$featurefilearray[0][$k]{cfgfile};
 						if (defined $targetfeaturefile) 
 						{
-							push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile .  "\"\n";							
+							push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile .  "\"\n";							
 						}
 						$k++;
 					}
@@ -2994,7 +2997,7 @@
 
 					if (defined $targetfeaturefile)
 					{
-						push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[$romimage][$j]{cfgdir} . $destinationfeaturefile .  "\"\t\t" . $exattribute . "\n";
+						push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[$romimage][$j]{cfgdir} . $destinationfeaturefile .  "\"\t\t" . $exattribute . "\n";
 					}
 					$j++;
 				}
@@ -3015,7 +3018,7 @@
 				my $targetfeaturefile = $featurefilearray[0][$k]{cfgfile};
 				if (defined $targetfeaturefile)
 				{
-					push @newobydata, "data=" . "\/$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n";
+					push @newobydata, "data=" . "$thisdir" . $targetfeaturefile . " \"" . $featurefilearray[0][$k]{cfgdir} . $targetfeaturefile . "\"\n";
 				}
 				$k++;
 			}
@@ -3128,14 +3131,6 @@
 				}
 				last if $fileExists;
 			}
-			# for -workdir option, to support relative path to the call path
-			if (!$fileExists && ($invokecmddir ne "") && ($filename !~ /^([\\\/]|.:)/))
-			{
-				if (-e $invokecmddir.$filename)
-				{
-					$fileExists = $invokecmddir.$filename;
-				}
-			}
 			
 			# edit the OBY line to use the actual file name which we found.
 			# (maybe) warn if an alternative to the original was selected.
@@ -3160,7 +3155,7 @@
 				# it is a manatory ROMBUILD keyword, in which case it is better
 				# to let ROMBUILD report the missing file rather than report the
 				# missing keyword.
-   				if ($what !~ /^bootbinary|variant|primary|secondary|hide/i)
+   				if ($what !~ /^bootbinary|variant|primary|secondary|hide|dir/i)
 				{
    					$line = "REM MISSING " . $line;
    					print_source_error("Missing file: '$filename' in statement '$what='");
@@ -3502,6 +3497,10 @@
 	{
 		return $line;
 	}
+	elsif($line =~ /^\s*dir\s*=.*/i)
+	{
+		return $line;
+	}
 	elsif($line =~ /^\s*bootbinary\s*=(.*)/i)
 	{
 	}
@@ -3521,7 +3520,8 @@
 		$romfile = $4;
 		$tail = $5;
 	}
-	elsif ($line =~ /(\S+)\s*=\s*"([^"]+)"\s+"\/?(.*)"(.*)$/)
+	elsif ($line =~ /(\S+)\s*=\s*"([^"]+)"\s+"\/?(.*)"(.*)$/ 
+			|| $line =~ /(\S+)\s*=\s*"([^"]+)"\s+\/?(\S+)(.*)$/)
 	{
 		if ($line !~ /^REM MISSING/i)
 		{
@@ -3810,8 +3810,8 @@
 	
     if($opt_v)
     {
-	  my $logWin = "logwin.oby";
-	  my $logLinux = "loglinux.oby";
+	  my $logWin = $thisdir."logwin.oby";
+	  my $logLinux = $thisdir."loglinux.oby";
 	  unlink($logWin);
 	  unlink($logLinux);
 	  open LOGWIN, ">$logWin" or die("* Can't create $logWin\n");
@@ -3847,7 +3847,7 @@
 		#
 		# Track ROMNAME, allowing overrides
 		#
-		if ($line=~/romname\s*=\s*"?(\S+)\.(\S+)"?\s*/i)
+		if ($line=~/romname\s*[=\s]\s*"?(\S+)\.(\S+)"?\s*/i)
 		{
 			if ($romname ne "" && $opt_o eq "")
 			{
@@ -3855,6 +3855,11 @@
 			}
 			$rombasename = $1;
 			$romname = "$1.$2";
+			if ($opt_workdir)
+			{
+				$rombasename = $thisdir.$rombasename;
+				$romname = $thisdir.$romname;
+			}
 			next;
 		}
 		#
@@ -3899,6 +3904,17 @@
 	# Handle ROMNAME and possible -o override
 	if ($opt_o ne "")
 	{
+		if ($opt_workdir && $opt_o !~ /^[\\\/]/ && $opt_o !~ /^.:/)
+		{
+			$opt_o = $thisdir.$opt_o;
+		}
+		if (&is_windows)
+		{
+			$opt_o =~ s-\/-\\-g;
+		}else
+		{
+			$opt_o =~ s-\\-\/-g;
+		}
 		$romname=$opt_o;
 		if ($opt_o=~/(\S+)\.(\S+)/)
 		{
@@ -4669,7 +4685,7 @@
 			}
 			if( $aDllFile =~ /(.*)\.[^.]+$/ ){
 				my $proxydsofile = "$1.dso";
-				$proxydsofile =~ s-$abiDir\/(.*)\/-armv5\/LIB\/-ig;
+				$proxydsofile =~ s-$abiDir\/(.*)\/-armv5\/lib\/-ig;
 				open PIPE, "getexports -d $proxydsofile|" or die "Can't open file $proxydsofile\n";
 				while (<PIPE>){
 					my $line = $_;
--- a/imgtools/buildrom/tools/cdf.dtd.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,62 +0,0 @@
-<!--
- 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:
-
--->
-<!ELEMENT component     (localisation?,file+)>
-<!ATTLIST component id  CDATA #REQUIRED >
-
-<!ELEMENT file          (source,        destination,
-                         localisation?, options? ,
-                         features?,     dynamicDependencies?)>
-<!ATTLIST file
-        id              CDATA #REQUIRED
-        customisable    (true|false) #IMPLIED
-        addressable     (xip|nonxip|dontcare) #IMPLIED
-        compress        (unchanged|compress|uncompress) #IMPLIED
-        type            (normal|bitmap|compressedbitmap|autobitmap|aif|plugin) #IMPLIED
-	plugin_name	CDATA #IMPLIED>
-
-<!ELEMENT source        (#PCDATA)>
-<!ELEMENT destination   (#PCDATA)>
-<!ELEMENT features      (supports?,prevents?)>
-<!ELEMENT supports      (feature+)>
-<!ELEMENT prevents      (feature+)>
-
-<!ELEMENT feature       EMPTY>
-<!ATTLIST feature uid   CDATA #IMPLIED
-                  name  CDATA #IMPLIED>
-
-<!ELEMENT dynamicDependencies (depend+)>
-<!ELEMENT depend        (#PCDATA)>
-<!ELEMENT localisation  (default, language*)>
-<!ELEMENT default       (#PCDATA)>
-<!ELEMENT language      (#PCDATA)>
-<!ELEMENT options       ((multilinguify | stack         | heapmin  |
-                          heapmax       | fixed         | priority |
-                          uid1          | uid2          | uid3     | 
-                          dll           | dlldatatop )+)>
-
-<!ELEMENT multilinguify (#PCDATA)>
-
-<!ELEMENT stack         (#PCDATA)>
-<!ELEMENT heapmin       (#PCDATA)>
-<!ELEMENT heapmax       (#PCDATA)>
-<!ELEMENT fixed         (#PCDATA)>
-<!ELEMENT priority      (#PCDATA)>
-<!ELEMENT uid1          (#PCDATA)>
-<!ELEMENT uid2          (#PCDATA)>
-<!ELEMENT uid3          (#PCDATA)>
-<!ELEMENT dll           (#PCDATA)>
-<!ELEMENT dlldatatop    (#PCDATA)>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/checkepocroot.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,118 @@
+#!/usr/bin/perl
+
+use Getopt::Long;
+
+use constant TOOL_VERSION=>"0.1";
+
+my $help;
+my $dir;
+my $convert;
+my $logfile;
+&processcmdline();
+
+open (LOG, ">$logfile") or die "cannot open log file $logfile\n";
+&checkdir($dir);
+close LOG;
+
+sub processcmdline
+{
+	GetOptions("h" => \$help, "l=s" => \$logfile, "c" => \$convert);
+	
+	if ($help)
+	{
+		print_usage();
+		exit 0;
+	}
+	$logfile = "checkepocroot.log" if (!defined $logfile);
+	
+	$dir = shift @ARGV;
+	if (!defined $dir || !-d $dir)
+	{
+		print_usage();
+		die "\nERROR: directory missing!!\n" if (!defined $dir);
+		die "\nERROR: directory $dir does not exist!!\n" if (!-d $dir);
+	}
+}
+
+sub checkdir 
+{
+  my $path = shift;
+  return if (!-d $path);
+  opendir(DIR,$path);   
+  my @entries = readdir(DIR);   
+  closedir(DIR);   
+  my $entry;   
+  foreach $entry (@entries) {   
+	  next if (($entry eq ".") || ($entry eq ".."));
+	  my $item = "$path/$entry";
+  	if (-d $item) {
+ 	 		&checkdir($item);
+	  }else {
+	  	next if ($entry !~ /.*\.[a-z]by$/i);
+	  	
+		  &convobyfile($item, "$item.bak");
+  	}   
+  } 
+}   
+
+sub convobyfile
+{
+	my $src = shift;
+	my $dst = shift;
+	open (SRC, "<$src");
+	open (DST, ">$dst") if($convert);
+
+	my $line;
+	while($line = <SRC>)
+	{
+		if ($line =~ /[\\\/]epoc32/)
+		{
+	  	print "Found content in file $src\n";
+	  	print LOG "Found content in file $src\n";
+	  	print "current line is $line";
+	  	print LOG "current line is $line";
+			if ($line =~ /EPOCROOT##[\\\/]?epoc32/)
+			{
+				print "Error: this line already contain EPOCROOT\n";
+				next;
+			}
+	  	if($convert)
+	  	{
+		  	$line =~ s-[\\\/]epoc32-EPOCROOT##epoc32-g;
+		  	print "converted line is $line";
+		  	print LOG "converted line is  $line";
+		  }
+	  	print "\n";
+	  	print LOG "\n";
+		}
+		print DST $line  if($convert);
+	}
+	close SRC;
+	if($convert)
+	{
+		close DST;
+
+	  unlink "$src";
+  	rename ("$dst", "$src");
+  }
+}
+
+sub print_usage
+{
+	print "\nCheckepocroot - Check epocroot tool V".TOOL_VERSION."\n";
+	print "Copyright (c) 2010 Nokia Corporation.\n\n";
+	print <<USAGE_EOF;
+Usage:
+  checkepocroot.pl [-h] [-c] [-l <logfile>] <directory>
+
+Check oby/iby files cursively in the <directory>. 
+When it find epoc32 without EPOCROOT## in the files, it will report the line in log file. If with -c option it will add EPOCROOT## to the epoc32.
+The <directory> is the directory contain all the oby/iby files. Usually it should be /epoc32/rom/ and it will be checked cursively.
+
+Options:
+   -l <logfile>       - the log file to record the log, 
+                        if not specfied it is \"checkepocroot.log\"
+   -h                 - displays this help
+   -c                 - convert the back slash to forward slash.
+USAGE_EOF
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/checkincludeslash.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,120 @@
+#!/usr/bin/perl
+
+use Getopt::Long;
+
+use constant TOOL_VERSION=>"0.1";
+
+my $help;
+my $dir;
+my $convert;
+my $logfile;
+&processcmdline();
+
+open (LOG, ">$logfile") or die "cannot open log file $logfile\n";
+&checkdir($dir);
+close LOG;
+
+sub processcmdline
+{
+	GetOptions("h" => \$help, "l=s" => \$logfile, "c" => \$convert);
+	
+	if ($help)
+	{
+		print_usage();
+		exit 0;
+	}
+	$logfile = "checkincludeslash.log" if (!defined $logfile);
+	
+	$dir = shift @ARGV;
+	if (!defined $dir || !-d $dir)
+	{
+		print_usage();
+		die "\nERROR: directory missing!!\n" if (!defined $dir);
+		die "\nERROR: directory $dir does not exist!!\n" if (!-d $dir);
+	}
+}
+
+sub checkdir 
+{
+  my $path = shift;
+  return if (!-d $path);
+  opendir(DIR,$path);   
+  my @entries = readdir(DIR);   
+  closedir(DIR);   
+  my $entry;   
+  foreach $entry (@entries) {   
+	  next if (($entry eq ".") || ($entry eq ".."));
+	  my $item = "$path/$entry";
+  	if (-d $item) {
+ 	 		&checkdir($item);
+	  }else {
+	  	next if ($entry !~ /.*\.[a-z]by$/i);
+	  	
+		  &convobyfile($item, "$item.bak");
+  	}   
+  } 
+}   
+
+sub convobyfile
+{
+	my $src = shift;
+	my $dst = shift;
+	open (SRC, "<$src");
+	open (DST, ">$dst") if($convert);
+
+	my $line;
+	while($line = <SRC>)
+	{
+		if ($line =~ /#\s*include\s*(<|\")(.*\\.*)(>|\")/)
+		{
+	  	print "Found content in file $src\n";
+	  	print LOG "Found content in file $src\n";
+	  	print "current line is $line";
+	  	print LOG "current line is $line";
+	  	if($convert)
+	  	{
+		  	my $path = $2;
+		  	my $pathorg = $path;
+		  	$pathorg =~ s-\\-\\\\-g;
+		  	$path =~ s-\\-\/-g;
+		  	$line =~ s-$pathorg-$path-g;
+		  	print "converted line is $line";
+		  	print LOG "converted line is  $line";
+		  }
+	  	print "\n";
+	  	print LOG "\n";
+		}
+		print DST $line  if($convert);
+	}
+	close SRC;
+	if($convert)
+	{
+		close DST;
+
+	  unlink "$src";
+  	rename ("$dst", "$src");
+  }
+}
+
+sub print_usage
+{
+	print "\nCheckincludeslash - Check back slash tool V".TOOL_VERSION."\n";
+	print "Copyright (c) 2010 Nokia Corporation.\n\n";
+	print <<USAGE_EOF;
+Usage:
+  checkincludeslash.pl [-h] [-c] [-l <logfile>] <directory>
+
+Check oby/iby files cursively in the <directory>. 
+When it find back slash in include line in the files like \"\#include <dir\\file>\", 
+it will report the line in log file. If with -c option it will convert the back slash
+to forward slash like \"\#include <dir/file>\".
+The <directory> is the directory contain all the oby/iby files.
+Usually it should be /epoc32/rom/ and it will be checked cursively.
+
+Options:
+   -l <logfile>       - the log file to record the log, 
+                        if not specfied it is \"checkincludeslash.log\"
+   -h                 - displays this help
+   -c                 - convert the back slash to forward slash.
+USAGE_EOF
+}
\ No newline at end of file
--- a/imgtools/buildrom/tools/datadriveimage.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/buildrom/tools/datadriveimage.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -229,7 +229,7 @@
 	else
 	{
 		print "$source copied to $destfile\n" if($verboseOpt);
-		return $destfile;
+		return "\"".$destfile."\"";
 	}
 }
 
@@ -288,21 +288,23 @@
 	open (OBEY ,$obyfile) or die($obyfile."\n");
 	while(my $line =<OBEY>) 
 	{
-		if( $line =~ /^(file|data)\s*=\s*(\S+)\s+(\S+)/i )
+		if( $line =~ /^(file|data)\s*=\s*(\"[^"]+\")\s+(\"[^"]+\")/i || 
+				$line =~ /^(file|data)\s*=\s*(\"[^"]+\")\s+(\S+)/i || 
+				$line =~ /^(file|data)\s*=\s*(\S+)\s+(\"[^"]+\")/i || 
+				$line =~ /^(file|data)\s*=\s*(\S+)\s+(\S+)/i )
 		{
 			my $keyWord=$1;
 			my $source=$2;
 			my $dest=$3;
 
-			if( $source !~ /(\S+):(\S+)/ )
+			if( $source !~ /(\S+):([^"]+)/ )
 			{ 
 				$source = get_drive().$2;
 			}
 			my $var = &copyFilesToFolders( $source,$dest,$dir,$verboseOpt);
 			if($var)
 			{
-				$var = $keyWord."=".$var;
-				$line =~ s/^(\S+)=(\S+)/$var/;
+				$line = $keyWord."=".$var."\t".$dest."\n";
 				push(@$nonsisFileArray,$line);
 			}
 			else
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/directory.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+@echo off
+
+cd %1
+echo %cd%
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/experimental/metarombuild.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,298 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+#! perl
+
+# This script builds ROMs which are specified in a supplied XML file
+# To use this script \epoc32\tools\buildrom must be installed on the drive
+# with \epoc32\tools in the path
+
+# Note: The TargetBoard attribute is no longer used but is still needed because of the structure of this script!
+
+use strict;
+use XML::Simple;
+use Getopt::Long;
+use Cwd;
+use Cwd 'abs_path';
+use File::Copy;
+use File::Path;
+
+# Get command line arguments
+my ($romspec, $boards, $roms, $logdir, $buildnum, $publish, $help, $version) = ProcessCommandLine();
+
+Usage() if ($help);
+Version() if ($version);
+
+die "Romspec xml file must be specified using the -romspec option\n" if (!$romspec);
+
+# Construct arrays of boards and roms if they were specified
+my @boards = split /,/, $boards if ($boards);
+my @roms = split /,/, $roms if ($roms);
+
+# Use the XML::Simple module to parse the romspec and pass the result
+# into the $Roms hash reference
+my $xml = new XML::Simple;
+my $Roms = $xml->XMLin($romspec);
+
+my $RomList = %$Roms->{'Rom'};
+
+my $RomBuildStage = 1;
+
+foreach my $rom (sort keys %$RomList)
+{
+    my $board = $RomList->{$rom}->{'TargetBoard'};
+    if( (@boards == 0 and @roms == 0) or grep $rom, @roms or grep $board, @boards)
+    {
+        BuildRom($RomBuildStage, $RomList, $rom, $logdir, $buildnum ,$publish);
+        $RomBuildStage++;
+    }
+}
+
+#####################################################
+#### Run buildrom on the specified ROM using ########
+#### info from the romspec.xml               ########
+#####################################################
+sub BuildRom
+{
+    my $Stage = shift;  # BuildRom stage
+    my $RomList = shift;  # Hash of the romspec.xml
+    my $rom = shift;   # Rom to be built
+    my $logdir = shift;  # logs directory
+    my $buildnum = shift;  # build number
+    my $publish = shift;   # Publish Location
+    my $type = $ENV{Type}; # type of Build Master or Release
+    my $builddir = $ENV{BuildDir}; # Build Directory
+    my $Epocroot = $ENV{EPOCROOT}; # EpocRoot;
+    my $InFileList="";  # i.e. Platsec, Techview, obyfiles
+    my $XmlFileList="";
+    my $MacroList="";   # for the buildrom -D option
+    my $TargetBoard = $RomList->{$rom}->{'TargetBoard'};
+    my $ImageFile = " -o".$RomList->{$rom}->{'ImageFile'}->{'name'}; # for the buildrom -o option
+ 
+    # Construct the list of InFiles to pass to buildrom
+    my $InFiles = %$RomList->{$rom}->{'InFile'};
+    foreach my $infile (sort keys %$InFiles)
+    {
+        if ($infile eq "name")
+        {
+            $InFileList = " ".$InFiles->{'name'} unless (lc($InFiles->{'name'}) eq lc($TargetBoard));
+        }
+        else
+        {
+            $InFileList .= " ".$infile unless(lc($infile) eq lc($TargetBoard));
+        }
+    }
+    my $RomXmlFlag='-f';
+    my $XmlFiles = %$RomList->{$rom}->{'XMLFile'};
+    foreach my $XmlFlags (keys %$XmlFiles)
+    {
+        if ($XmlFlags eq "flag")
+        {
+          $RomXmlFlag= $XmlFiles->{'flag'};
+        }
+    }
+    foreach my $XmlFile (keys %$XmlFiles)
+    {
+        if ($XmlFile eq "name")
+        {
+            $XmlFileList = "$RomXmlFlag"."$Epocroot"."epoc32\\rom\\include\\".$XmlFiles->{'name'};
+        }
+        else
+        {
+            $XmlFileList .= "$RomXmlFlag"."$Epocroot"."epoc32\\rom\\include\\".$XmlFile unless(lc($XmlFile) eq lc($TargetBoard));
+        }
+    }
+    
+    # Get the ROM macro if one is defined
+    if ( defined $RomList->{$rom}->{'Macro'} )
+    {
+        if (defined $RomList->{$rom}->{'Macro'}->{'name'} )
+        {
+            if ( $RomList->{$rom}->{'Macro'}->{'value'} ne "" )
+            {
+                $MacroList = " -D".$RomList->{$rom}->{'Macro'}->{'name'}."=".$RomList->{$rom}->{'Macro'}->{'value'};
+            }
+            else
+            {
+                $MacroList = " -D".$RomList->{$rom}->{'Macro'}->{'name'};
+            }
+        }
+        else
+        {
+            my $Macros = %$RomList->{$rom}->{'Macro'};
+            foreach my $macro (keys %$Macros)
+            {
+                if ( $Macros->{$macro}->{'value'} ne "" )
+                {
+                    $MacroList .= " -D".$macro."=".$Macros->{$macro}->{'value'};
+                }
+                else
+                {
+                    $MacroList .= " -D".$macro;
+                }
+            }
+        }
+    }
+    
+    # Call buildrom
+        my $buildrom_command = "buildrom $InFileList $MacroList $XmlFileList $ImageFile 2>&1";
+        my $gHiResTimer = 0;
+        if (eval "require Time::HiRes;")
+        {
+            $gHiResTimer = 1;
+        }
+        else
+        {
+            print "Cannot load HiResTimer Module\n";
+        }
+        open TVROMLOG, ">> $logdir\\techviewroms$buildnum.log";
+        print TVROMLOG "===------------------------------------------------\n";
+        print TVROMLOG "-- Stage=$Stage\n";
+        print TVROMLOG "===----------------------------------------------\n";
+        print TVROMLOG "-- Stage=$Stage started ".localtime()."\n";
+        print TVROMLOG "=== Stage=$Stage == Build $rom\n";
+        print TVROMLOG "-- Stage=$Stage == $TargetBoard $InFileList\n";
+        print TVROMLOG "-- $buildrom_command\n";
+        print TVROMLOG "-- MetaromBuild Executed ID $Stage $buildrom_command \n";
+        print TVROMLOG "++ Started at ".localtime()."\n";
+        if ($gHiResTimer == 1)
+        {
+            print TVROMLOG "+++ HiRes Start ".Time::HiRes::time()."\n";
+        }
+        else
+        {
+            # Add the HiRes timer unavailable statement
+            print TVROMLOG "+++ HiRes Time Unavailable\n";
+        }
+        my $command_output = `$buildrom_command`;
+        print TVROMLOG $command_output;
+        if ($?)
+        {
+            print TVROMLOG "ERROR: $buildrom_command returned an error code $?\n";
+        }
+        if (($command_output =~m/\d\sFile/g) and ($command_output!~/Failed/ig) and ($command_output!~/Unsucessful/ig))
+        {
+            print TVROMLOG "Rom Built Sucessfully\n";
+        }
+        else
+        {
+            print TVROMLOG "ERROR: $buildrom_command failed .Please check log techviewroms$buildnum.log for details\n";
+        }
+        if ($gHiResTimer == 1)
+        {
+            print TVROMLOG "+++ HiRes End ".Time::HiRes::time()."\n";
+        }
+        else
+        {
+            # Add the HiRes timer unavailable statement
+            print TVROMLOG "+++ HiRes Time Unavailable\n";
+        }
+        print TVROMLOG "++ Finished at ".localtime()."\n";
+        print TVROMLOG "=== Stage=$Stage finished ".localtime()."\n";
+        close TVROMLOG;
+        
+        # Publishing of Logs and Roms#####################
+        my $ImageFileXML = $ImageFile ;
+        $ImageFileXML =~s/^\s-o//i;
+        $ImageFileXML =~/(.*\d.techview)/;
+        my $ImageFileXMLresult = $1;
+        my $cwdir = abs_path ( $ENV { 'PWD' } );
+        $cwdir =~s/\//\\/g;
+        $rom =~ /(\w+).*/;
+        my $data = $1;
+        if(($publish ne ""))
+        {
+            if($rom =~ /(\w+).*/)
+            {   
+                my $data = $1;
+                if(not -d "$publish\\$1")
+                    {
+                        mkpath "$publish\\$1" || die "ERROR: Cannot create $publish\\$1"; # If folder doesnt exist create it 
+                    }
+                    opendir(DIR, $cwdir) || die "can't opendir $cwdir: $!";
+                    my @file_array =readdir(DIR);
+                foreach ($ImageFileXMLresult)
+                {
+                    foreach my $ImageFileConcat (@file_array)
+                    {
+                        $ImageFileConcat =~/(.*\d.techview)/;
+                        my  $Image = $1;
+                        
+                        if ($ImageFileXMLresult eq $Image)
+                        {
+                            copy ("$cwdir\\$ImageFileConcat" , "$publish\\$data\\");# or die "Cannot copy file:$!";
+                        }                   
+                    }
+                    closedir DIR;
+                }   
+            }
+        }
+        else
+        {
+            print"Publish Option not used \n";
+        }
+}
+
+########################################
+##### Process the command line #########
+########################################
+sub ProcessCommandLine
+{
+    my ($romspec, $boards, $roms, $publish, $help, $version);
+
+    GetOptions('romspec=s' => \$romspec,
+               'roms=s' => \$roms,
+               'boards=s' => \$boards,
+               'logdir=s' => \$logdir,
+               'buildnum=s' => \$buildnum,
+               'publish=s' => \$publish,
+               'help' => \$help,
+               'version' => \$version)|| die Usage();
+    
+    return ($romspec, $boards, $roms, $logdir, $buildnum, $publish, $help, $version);
+}
+
+
+sub Usage
+{
+    print <<USAGE_EOF;
+
+Usage
+-----
+perl metarombuild.pl -romspec <romspec xml file> [options]
+
+ When no options are specified, all ROMs specified in the romspec wil be built.
+ 
+ Options:
+    -logdir <path to logs directory>
+    -buildnum <build number>
+    -publish <location of path where rom logs will be published >
+    -help
+    -version
+
+USAGE_EOF
+exit 0;
+}
+
+sub Version
+{
+    print <<VERSION_EOF;
+
+metarombuild.pl v1.0
+Copyright (c) 2005-2009 Nokia Corporation. All rights reserved.
+    
+VERSION_EOF
+exit 0;
+}
--- a/imgtools/buildrom/tools/featuredatabase.dtd.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,47 +0,0 @@
-<!--
- 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:
-
--->
-<!ELEMENT hrhmacro EMPTY>
-<!ATTLIST hrhmacro
-	exclude CDATA #IMPLIED
-	include CDATA #IMPLIED
-	infeaturesetiby CDATA #IMPLIED>
-	
-<!ELEMENT hfileheader (#PCDATA)>
-<!ATTLIST hfileheader
-	interfacestatus CDATA #REQUIRED
-	interfacevisibility CDATA #REQUIRED>
-	
-<!ELEMENT featureset ((hfileheader?, feature+))>
-<!ATTLIST featureset
-	hfilename CDATA #IMPLIED
-	ibyname CDATA #IMPLIED
-	namespace CDATA #IMPLIED>
-	
-<!ELEMENT featuredatabase ((featureset+, defaultfeaturerange*))>
-<!ELEMENT feature ((hrhmacro?, comment?))>
-<!ATTLIST feature
-	name CDATA #REQUIRED
-	statusflags CDATA #REQUIRED
-	uid CDATA #REQUIRED
-	userdata CDATA #IMPLIED>
-	
-<!ELEMENT defaultfeaturerange ((comment?))>
-<!ATTLIST defaultfeaturerange
-	higheruid CDATA #REQUIRED
-	loweruid CDATA #REQUIRED>
-	
-<!ELEMENT comment (#PCDATA)>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/features	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+#!/bin/sh
+perl -S features.pl $@
--- a/imgtools/buildrom/tools/featureuids.dtd.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,33 +0,0 @@
-<!--
- 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:
-
--->
-
-<!ELEMENT featureuids   (features,default)>
-<!ELEMENT features      (feature+)>
-<!ELEMENT feature       EMPTY>
-
-<!ATTLIST feature
-        name            CDATA #REQUIRED
-        uid             CDATA #REQUIRED
-        installable     (true|false) #IMPLIED>
-
-<!ELEMENT default       (range+)>
-<!ELEMENT range         EMPTY>
-<!ATTLIST range
-        min             CDATA #REQUIRED
-        max             CDATA #REQUIRED
-        support         (include|exclude) #REQUIRED>
-        
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/flexmodload.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,45 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Runtime module-loading routine for loading e32toolp modules into 'main' module
+# 
+#
+
+
+package flexmodload;
+
+use romutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	FlexLoad_ModuleL
+);
+
+sub FlexLoad_ModuleL (@) {
+# Loads a module into the 'main' package, including all the functions the module defines for export
+
+	my @ModBaseList=@_;
+	my $ModBase;
+	foreach $ModBase (@ModBaseList) {
+		$ModBase=lc $ModBase;
+
+		package main;
+		require $ModBase.".pm" or die "ERROR: Can't load function from \"$ModBase.pm\"\n";
+		my $Package=ucfirst lc $ModBase;
+		$Package->import;
+	}
+}
+
+1;
--- a/imgtools/buildrom/tools/imageContent.dtd.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,89 +0,0 @@
-<!--
- 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:
-
--->
-<!ELEMENT imageContent  (version?, romchecksum?, time?, 
-                         options?, romgeometry, romtarget, romscope?)+>
-
-<!ELEMENT version       (#PCDATA)>
-<!ELEMENT romchecksum   (#PCDATA)>
-<!ELEMENT time          (#PCDATA)>
-<!ELEMENT romgeometry   (image+)>
-<!ELEMENT romtarget     (target+)>
-<!ELEMENT romscope      ((obyFile|cdf)+)>
-
-<!ELEMENT options       ((binaryselectionorder | trace       | bootbinary    |
-                          dataaddress          | debugport   | 
-                          defaultstackreserve  | device      | 
-                          wrapper              | kernel      | primary+      | 
-                          secondary+           | romalign    | romlinearbase | 
-                          variant              | autosize    | extension     | coreimage)+)>
-
-<!ELEMENT binaryselectionorder (#PCDATA)>
-<!ELEMENT trace         (#PCDATA)>
-<!ELEMENT bootbinary    (#PCDATA)>
-<!ELEMENT wrapper       (#PCDATA)>
-<!ATTLIST wrapper type  (none|epoc|coff) #REQUIRED>
-
-<!ELEMENT kernel        (dataaddress, heapmax, heapmin, name, trace?)>
-<!ATTLIST kernel number (single|multi) #IMPLIED>
-
-<!ELEMENT heapmax   (#PCDATA)>
-<!ELEMENT heapmin   (#PCDATA)>
-<!ELEMENT name   (#PCDATA)>
-
-<!ELEMENT dataaddress   (#PCDATA)>
-<!ELEMENT debugport     (#PCDATA)>
-<!ELEMENT defaultstackreserve   (#PCDATA)>
-<!ELEMENT device        (file+)>
-<!ELEMENT primary       (file+)>
-<!ELEMENT secondary     (file+)>
-<!ELEMENT variant       (file+)>
-<!ELEMENT extension     (file+)>
-<!ELEMENT romalign      (#PCDATA)>
-<!ELEMENT romlinearbase (#PCDATA)>
-<!ELEMENT autosize      (#PCDATA)>
-<!ELEMENT coreimage     (#PCDATA)>
-
-<!ELEMENT file       (source,destination,fixed?)>
-<!ATTLIST file
-	   id CDATA #REQUIRED>
-<!ELEMENT source       (#PCDATA)>
-<!ELEMENT destination  (#PCDATA)>
-<!ELEMENT fixed	       (#PCDATA)>
-
-
-<!ELEMENT image         (partition?)>
-<!ATTLIST image
-        id              CDATA #REQUIRED
-        name            CDATA #REQUIRED
-        type            (xip|nonxip) #REQUIRED
-        compression     (compress|nocompress) #IMPLIED
-        extension       (yes|no) "no"
-        size            CDATA #REQUIRED>
-
-<!ELEMENT target        (include,exclude?)>
-<!ATTLIST target imageid CDATA #REQUIRED>
-<!--- target imageid of any allowed where it there is no constraints on 
-      which image the files should be placed. -->
-<!ELEMENT include       ((feature|obyFile|cdf)+)>
-<!ELEMENT exclude       (feature+)>
-<!ELEMENT partition     (#PCDATA)>
-<!ELEMENT feature       EMPTY>
-<!ATTLIST feature name  CDATA #IMPLIED
-                  uid   CDATA #IMPLIED>
-<!ELEMENT obyFile       (#PCDATA)>
-<!ELEMENT cdf           (#PCDATA)>
-<!ATTLIST cdf type      (file|dir) "file">
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/romosvariant.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Collection of utilitiy functions which is copied from Symbian OS perl modules. 
+# It provides platform related information to ROM Tools including buildrom, 
+# features.pl, etc.
+# 
+
+package romosvariant;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	os_name
+	is_windows
+	is_linux
+	env_delimiter
+	path_delimiter
+);
+
+use strict;
+
+sub os_name
+{
+	return $^O;
+}
+
+sub is_windows
+{
+	if ($^O =~ /^MSWin32$/i){
+		return 1;
+	}else{
+		return 0;
+	}	
+}
+
+sub is_linux
+{
+	if ($^O =~ /^MSWin32$/i){
+		return 0;
+	}else{
+		return 1;
+	}	
+}
+
+sub env_delimiter
+{
+	if ($^O =~ /^MSWin32$/i){
+		return ";";
+	}else{
+		return ":";
+	}
+}
+
+sub path_delimiter
+{
+	if ($^O =~ /^MSWin32$/i){
+		return "\\";
+	}else{
+		return "\/";
+	}
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/buildrom/tools/romutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1697 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Collection of utilitiy functions which is copied from Symbian OS perl modules. 
+# It provides platform related information to ROM Tools including buildrom, 
+# features.pl, etc.
+# 
+
+package romutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+  init_plat
+  init_bsfs
+  init_platwithbpabi
+  
+  get_epocroot
+  get_drive
+  get_epocdrive
+  get_versionedname
+  get_bpabiplatlist
+  get_platlist
+  get_platcustomizes
+  get_platroot
+  get_makeeabspath
+  get_variantmacrolist  
+  get_variantmacroHRHfile
+  get_abiv2mode
+  get_variantfullpath
+  get_BVbinname
+  get_variant
+  
+  is_existinpath
+  
+  set_verbose
+  
+  check_varfile
+  split_path
+  append_driveandquote  
+  write_32bit
+);
+
+
+# EPOCROOT with proper format 
+my $epocroot;
+my $epocdrive = "";
+my $drive = "";
+
+BEGIN {
+    require 5.005_03;       # check user has a version of perl that will cope
+    
+    $epocroot = $ENV{EPOCROOT};
+    $epocroot = "\/" if (!$epocroot); # use "\" if EPOCROOT is not specified
+    $epocroot =~ s/\\/\//g;
+    $epocroot .= "\/" unless $epocroot =~ /\/$/;
+}
+
+use strict;
+use Cwd;
+use File::Spec;
+use romosvariant;
+
+my $verbose=0;
+
+########################
+#Init
+#
+
+#die "ERROR: EPOCROOT must specify an existing directory." if (!-d $epocroot);
+#die "ERROR: EPOCROOT must not be a UNC path\n" if ($epocroot =~ /^\\\\/);
+
+$drive=$1 if (cwd =~ /^(.:)/);
+
+if ($epocroot =~ /^(.:)/)
+{
+    $epocdrive=$1;
+}
+else
+{
+# current working directory is different to SDK's
+    $epocdrive=$drive
+}
+
+#####################################
+# General functions
+#
+
+sub get_epocroot
+{
+    return $epocroot;
+}
+
+sub get_epocdrive
+{
+    return $epocdrive;
+}
+
+sub get_drive
+{
+    return $drive;
+}
+
+sub set_verbose
+{
+    $verbose = shift;
+}
+
+use constant QUIET_NOT_FOUND => 0; #  return 0 if file not found in the PATH
+use constant DIE_NOT_FOUND => 1; #  issue error and die if file not found in the PATH
+use constant ERROR_NOT_FOUND => 2; #  issue error and return 0 if file not found in the PATH
+
+# Simulate shell to locate executable file in the PATH
+#
+# WARNING: don't use this func in a deep loop because of the
+#          less efficient implementation
+#
+# usage:  is_existinpath <filename> [<flag>]
+#
+#   flag == DIE_NOT_FOUND    die and display error when not found
+#   flag == ERROR_NOT_FOUND  display error and return 0 when not found
+#   else return 0 when not found
+#   return 1 when found     
+
+sub is_existinpath
+{
+    my ($filename, $flag)=@_;
+    return 0 unless defined $filename;
+    return 0 if ($filename =~ /\\/);
+    return 0 if ($filename =~ /\//); 
+    
+    my @paths;
+    my $delimiter = &env_delimiter;
+ 		@paths = split(/$delimiter/, $ENV{PATH});
+    unshift @paths, "\.";
+    
+    foreach my $path (@paths)
+    {
+        next if ($path =~ /^\s*$/);
+        chomp $path;
+        $path =~ s/\\/\//g;
+        $path .= "\/" unless ($path =~ /\/$/);
+        $path = $path.$filename;
+        foreach my $ext ("", ".bat", ".cmd", ".exe", ".com", ".pl", ".py")
+        {
+            return 1 if (-e $path.$ext);
+        }
+    }
+    die "Error: Cannot found \"$filename\" in the PATH.\n" if ($flag == DIE_NOT_FOUND);
+    print "Error: Cannot found \"$filename\" in the PATH.\n" if ($flag == ERROR_NOT_FOUND);
+    return 0;
+} 
+
+#########################################
+# Symbian variant functions and variables
+# 
+# copy from e32variant.pm
+#
+
+my $toolspath = $epocroot . "epoc32\/tools\/";
+# SPPR begin
+# enable includation of spp_variant.cfg if it exist
+my $spp_cfgFile = $toolspath . "variant\/spp_variant.cfg";
+my $cfgFile = $toolspath . "variant\/variant.cfg"; # default location
+$cfgFile = $spp_cfgFile if -e $spp_cfgFile; # use spp_variant.cfg
+# SPPR End
+
+my $variantABIV2Keyword = &get_abiv2mode;    # if variant ABIv2 mode enabled
+
+my $hrhdrive = $epocdrive;   # variant hrh drive
+my $hrhfile;    # variant hrh file
+my @macros;     # variant macros
+
+if ($cfgFile =~ /^(.:)/i)
+{
+   $hrhdrive = lc($1); 
+}
+
+# returns the variant specific macro definitions as a list
+sub get_variantmacrolist{
+    
+    return @macros if (@macros);
+    
+    my $vfile = get_variantmacroHRHfile();
+    
+    if($vfile)
+    {
+        my $VariantFilePath = split_path('Path',$vfile);
+        chop( $VariantFilePath );
+        $VariantFilePath = &append_driveandquote($VariantFilePath);
+        $vfile = &append_driveandquote($vfile);
+        my $e32Path = &append_driveandquote($epocroot."epoc32\/include");
+        
+        open CPPPIPE,"cpp -I $e32Path -I $VariantFilePath -undef -dM $vfile |" or die "ERROR: Can't invoke CPP.EXE\n";
+        while(<CPPPIPE>){
+            if($_ =~ /(\#define)(\s+)(.+)/){
+                push @macros, $3;
+            }
+        }
+        close CPPPIPE;
+    }
+    return @macros;
+}
+
+# return hrh filename defined in variant cfg file
+# notice: abort if hrh file located in different drive to cfg file
+sub get_variantmacroHRHfile{
+    
+    return $hrhfile if ($hrhfile);
+    if(-e $cfgFile){
+        open(FILE, $cfgFile) || die "\nCould not open: " . $cfgFile ."\n";
+        while (<FILE>) {
+            # strip comments
+            s/^([^#]*)#.*$/$1/o;
+            # skip blank lines
+            if (/^\s*$/o) {
+                next;
+            }
+            # get the hrh file
+            if($_ =~ /\.hrh/xi){
+                $hrhfile = $_; 
+                last;
+            }
+        }
+        close FILE;
+        die "\nERROR: No variant file specified in $cfgFile!\n" unless $hrhfile;
+        $hrhfile =~ s/\s+//g;
+        $hrhfile=~s/^(.:)//io;    # remove drive letter
+        my $paths_drive = lc($1);
+        
+        chomp $hrhfile;
+        $hrhfile = get_makeeabspath($epocroot."epoc32\/", $epocroot, $hrhfile); # assume relative to EPOCROOT
+        
+        
+        if($paths_drive){
+            die "\nERROR: Variant file specified in $cfgFile is not on the same drive as \/epoc32\/\n" 
+            unless ($paths_drive eq $hrhdrive);
+        }
+        die "\nERROR: $cfgFile specifies $hrhfile which doesn't exist!\n" unless (-e $hrhfile);
+        
+        # make sure it is in unix syntax
+        $hrhfile=~ s/\\/\//g;
+    }
+    return $hrhfile;
+}
+
+# get status of EANBLE_ABIV2_MODE
+# 1=enabled 0=disabled
+sub get_abiv2mode{
+
+    return $variantABIV2Keyword if (defined $variantABIV2Keyword);
+
+    $variantABIV2Keyword=0;
+    if(-e $cfgFile){
+        open(FILE, $cfgFile) || die "\nCould not open: " . $cfgFile ."\n";
+        while (<FILE>) {
+            # strip comments
+            s/^([^#]*)#.*$/$1/o;
+            # skip blank lines
+            if (/^\s*$/o) {
+            next;
+            }
+            # get the hrh file
+            if($_ =~ /^ENABLE_ABIV2_MODE$/xi){
+                $variantABIV2Keyword=1;
+                last;
+            }
+        }
+        close FILE;
+    }
+
+    return $variantABIV2Keyword;
+}
+
+#############################
+# Path utilities
+#
+# copy from pathutl.pm
+#
+
+#args: $_[0] Start EPOCPath Abs FilePath/Path $_[1]... list of (Abs/Rel FilePath/Path)
+# Variant of MakAbs which also maps "+\\" to "${EPOCPath}"
+sub get_makeeabspath ($@) {    
+    return undef unless $_[0]=~m-^(.:)?[\\\/]-o;
+    my ($EPOCPath,$Path,@List)=@_;
+    my $BasePath=&split_path("Path",$Path);
+    undef $Path;
+    my $p;
+    foreach $p (@List) {
+    		$p =~ s-\\-\/-g;
+        if ($p=~m-^\/?epoc32\/(.*)$-io) {    # change - special case for existing \\epoc32 references
+            $p=$EPOCPath.$1;
+            next;
+        }
+        if ($p=~m-^\s*\+\/(.*)$-o) {
+            $p=$EPOCPath.$1;
+            next;
+        }
+        if ($p=~m-^\.{2}-o) {
+            $p=&strip_path($BasePath.$p);
+            next;
+        }
+        if ($p=~m-^[^\.\/]-o) {
+            $p=$BasePath.$p unless ($p =~ m-^.:-o);
+            next;
+        }
+        if ($p=~m-^(.:)?\/-o) {
+            next;
+        }
+        if ($p=~m-^\.\/(.*)$-o) {
+            $p=&strip_path($BasePath.$1);
+            next;
+        }
+        return undef;
+    }
+    return wantarray ? @List : $List[0];
+}
+
+#args: $_[0] Abs FilePath/Path
+# Remove excess occurrences of '..' and '.' from a path
+sub strip_path ($) {   
+    return undef unless $_[0]=~m-^(.:)?[\/\\]-o;
+    my $P=$_[0];
+    while ($P=~s-([\/\\])\.[\/\\]-$1-go) { }
+    while ($P=~s-[\\](?!\.{2}\\)[^\\]*\\\.{2}(?=\\)--go) { }
+    $P;
+}
+
+#args: $_[0] 'Path' or 'Base' or 'Ext' $_[1] Abs/Rel FilePath/Path
+# return the section of a file path required - Path, Base, Ext or File
+sub split_path ($$) { 
+    my ($Sect,$P)=@_;
+    
+    return '' if !$P;    
+    $Sect= ucfirst lc $Sect;
+    if ($Sect eq 'Path') {
+        if ($P=~/^(.*[\\\/])/o) {
+            return $1;
+        }
+        return '';
+    }
+    undef;
+}
+
+sub append_driveandquote ($) {
+# Take a path, or list of paths, and prefix with drive based on 1. epocroot, 2.CWD.
+# Relative paths are just quoted.
+    my @List=@_;
+    my $Path;
+
+    
+    foreach $Path (@List) {
+        next if ($Path !~ /^[\/\\]/); # skip prefix with drive letter or relative path
+        $Path=$epocdrive.$Path;
+    }
+
+    foreach $Path (@List) {
+        chomp $Path;
+        $Path="\"".$Path."\"";
+    }
+    
+    return wantarray ? @List : $List[0];
+}
+
+
+###############################
+# General Utilities
+#
+# copy from genutl.pm
+#
+
+# return name with well formated version id in hex
+sub get_versionedname($) {
+    my ($name) = @_;
+    if ($name =~ /(.*)\{\s*(\d+)\s*\.\s*(\d+)\s*\}(.*?)$/i) {
+        my $a = $1;
+        my $b = $4;
+        my $major = $2;
+        my $minor = $3;
+        return $a.sprintf("{%04x%04x}",$major,$minor).$b if ($major<32768 and $minor<32768);
+    }
+    return $name;
+}
+
+
+###############################
+# BPABI Platform Utilities
+#
+# copy from bpabiutl.pm
+#
+
+my @BPABIPlats;
+
+
+# Identify the BPABI platforms to be supported based on the compiler configuration files
+# present in the location specified by the environment variable "SYMBIAN_COMPILATION_CONFIG_DIR"
+# and in the directory $EPOCROOT\epoc32\tools\compilation_config
+sub get_bpabiplatlist 
+{
+    return @BPABIPlats if (scalar(@BPABIPlats));
+    
+    my @CompilerConfigPath;
+
+    if (exists($ENV{'SYMBIAN_COMPILATION_CONFIG_DIR'})) 
+    {
+        my $Path = $ENV{SYMBIAN_COMPILATION_CONFIG_DIR};
+        @CompilerConfigPath = split(/;/, $Path);
+    }
+
+    push @CompilerConfigPath, "${epocroot}epoc32\/tools\/compilation_config";
+
+    my $ConfigDir;
+
+    foreach $ConfigDir (@CompilerConfigPath)
+    {
+        opendir DIR, "$ConfigDir";
+        my @Plats=grep /\.mk$/i, readdir DIR;
+        my $Plat;
+        foreach $Plat (@Plats) 
+        {
+# The platform name will be same as the name of the configuration file <config.mk>
+# with the suffix '.mk' removed
+            $Plat =~ s/\.mk//;
+            if ($variantABIV2Keyword) {
+                if ($Plat =~ /^armv5_abiv2$/i) {
+                    $Plat = "ARMV5";
+                }
+            }
+            else {
+                if ($Plat =~ /^armv5$/i) {
+                    $Plat = "ARMV5_ABIV2";
+                }
+            }
+            unless (grep /$Plat$/i, @BPABIPlats) {
+                $Plat = uc $Plat;
+                push @BPABIPlats, $Plat;
+            }
+        }
+    }
+    closedir DIR;
+    return @BPABIPlats;
+}
+
+#############################
+# Platform Utilities
+#
+# copy from e32plat.pm
+#
+my %Plat=(
+    ARM4=>{
+        ABI=>'ARM4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+    },
+    ARM4SMP=>{
+        ABI=>'ARM4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        SMP=>1,
+        StatLink=>'ARM4SMP',
+    },
+    ARM4T=>{
+        ABI=>'ARM4T',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+    },
+    ARMI=>{
+        ASSP=>'MARM',
+        Generic=>1,
+        ASSPABI=>'',
+    },
+    SARM4=>{
+        ABI=>'ARM4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        Single=>1,
+    },
+    SARMI=>{
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        Single=>1,
+    },
+    STHUMB=>{
+        ABI=>'THUMB',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        Single=>1,
+    },
+    THUMB=>{
+        ABI=>'THUMB',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+    },
+    TOOLS=>{
+        ABI=>'TOOLS',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'TOOLS',
+        OS=>'TOOLS',
+        MakeMod=>'Cl_win',
+        MakeCmd=>'nmake',
+    },
+    TOOLS2=>{
+        ABI=>'TOOLS2',
+        ASSPABI=>'',
+        Compiler=>'GCC32',
+        CPU=>'TOOLS2',
+        OS=>'TOOLS2',
+        MakeMod=>'Cl_mingw',
+        MakeCmd=>'make',
+    },
+    CWTOOLS=>{
+        ABI=>'TOOLS',
+        ASSPABI=>'',
+        Compiler=>'CW32',
+        CPU=>'TOOLS',
+        OS=>'TOOLS',
+        MakeMod=>'Cl_tools',
+        MakeCmd=>'make',
+    },
+    VC6TOOLS=>{
+        ABI=>'TOOLS',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'TOOLS',
+        Ext=>'.DSP',
+        MakeMod=>'Ide_vc6',
+        MakeCmd=>'nmake',
+        OS=>'TOOLS',
+        Real=>'TOOLS',
+        UsrHdrsOnly=>1,
+    },
+    WINS=>{
+        ABI=>'WINS',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'WINS',
+        MakeMod=>'Cl_win',
+        MakeCmd=>'nmake',
+        OS=>'WINS',
+    },
+    VC6=>{
+        ABI=>'WINS',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'WINS',
+        Ext=>'.DSP',
+        MakeMod=>'Ide_vc6',
+        MakeCmd=>'nmake',
+        OS=>'WINS',
+        Real=>'WINS',
+        UsrHdrsOnly=>1,
+    },
+    WINSCW=>{
+        ABI=>'WINSCW',
+        ASSPABI=>'',
+        Compiler=>'CW32',
+        CPU=>'WINS',
+        MakeMod=>'Cl_codewarrior',
+        OS=>'WINS',
+        DefFile=>'WINS',    # use the MSVC def files
+    },
+    CW_IDE=>{
+        ABI=>'WINSCW',
+        ASSPABI=>'',
+        Compiler=>'CW32',
+        CPU=>'WINS',
+        Ext=>'.xml',
+        MakeMod=>'Ide_cw',
+        MakeCmd=>'make',
+        OS=>'WINS',
+        Real=>'WINSCW',
+        DefFile=>'WINS',    # use the MSVC def files
+        UsrHdrsOnly=>1,
+        SupportsMultiplePlatforms=>1,   # supports more than one real platform
+    },
+    X86=>{
+        ABI=>'X86',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'X86',
+        MakeMod=>'Cl_x86',
+        MakeCmd=>'nmake',
+        OS=>'EPOC32',
+        DefFile=>'X86',
+        Generic=>1,
+    },
+    X86SMP=>{
+        ABI=>'X86',
+        ASSPABI=>'',
+        Compiler=>'VC32',
+        CPU=>'X86',
+        MakeMod=>'Cl_x86',
+        MakeCmd=>'nmake',
+        OS=>'EPOC32',
+        DefFile=>'X86',
+        Generic=>1,
+        SMP=>1,
+        StatLink=>'X86SMP',
+    },
+    X86GCC=>{
+        ABI=>'X86gcc',
+        ASSPABI=>'',
+        Compiler=>'X86GCC',
+        CPU=>'X86',
+        MakeMod=>'Cl_x86gcc',
+        OS=>'EPOC32',
+        DefFile=>'x86gcc',
+        Generic=>1,
+    },  
+    X86GMP=>{
+        ABI=>'X86gcc',
+        ASSPABI=>'',
+        Compiler=>'X86GCC',
+        CPU=>'X86',
+        MakeMod=>'Cl_x86gcc',
+        OS=>'EPOC32',
+        DefFile=>'x86gcc',
+        Generic=>1,
+        SMP=>1,
+        StatLink=>'X86GMP',
+    },  
+    ARMV4=>{
+        ABI=>'ARMV4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'Cl_arm',
+        Compiler=>'ARMCC',
+        DefFile=>'EABI',
+        EABI=>1,
+    },
+    ARMV4SMP=>{
+        ABI=>'ARMV4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'Cl_arm',
+        Compiler=>'ARMCC',
+        DefFile=>'EABI',
+        EABI=>1,
+        SMP=>1,
+        StatLink=>'ARMV4SMP',
+    },
+    ARMV5_ABIV1=>{
+        ABI=>'ARMV5',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'Cl_arm',
+        Compiler=>'ARMCC',
+        DefFile=>'EABI',
+        EABI=>1,
+        SupportsFeatureVariants=>1,
+    },
+    ABIV2=>{
+        ABI=>'ARMV5',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'Cl_bpabi',
+        DefFile=>'EABI',
+        EABI=>1,
+        SupportsFeatureVariants=>1,
+    },
+    GCCXML=>{
+        ABI=>'ARM4',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'cl_gccxml',
+    },
+    VS6=>{
+        ABI=>'WINSCW',
+        ASSPABI=>'',
+        Compiler=>'CW32',
+        CPU=>'WINS',
+        MakeMod=>'Cl_vscw',
+        OS=>'WINS',
+        Real=>'WINSCW',
+        DefFile=>'WINS',    # use the MSVC def files
+        Ext=>'.mak'     
+    },
+    VS2003=>{
+        ABI=>'WINSCW',
+        ASSPABI=>'',
+        Compiler=>'CW32',
+        CPU=>'WINS',
+        MakeMod=>'Cl_vscw',
+        OS=>'WINS',
+        Real=>'WINSCW',
+        DefFile=>'WINS',    # use the MSVC def files
+        Ext=>'.mak'
+    },
+    EDG=>{
+        ABI=>'ARMV5',
+        ASSP=>'MARM',
+        ASSPABI=>'',
+        Generic=>1,
+        MakeMod=>'cl_edg',
+    },
+
+    # ASSP platforms should be described using .ASSP files
+    # Do not add additional ASSP platforms to this file.
+);
+
+my $init_bsfs_done = 0;
+my $init_plat_done = 0;
+my @PlatList;       # Platlist returned by list_plat()
+
+# initialize BSF platforms into %Plat
+sub init_bsfs($) {
+    return $init_bsfs_done if ($init_bsfs_done);
+        
+    my ($Path)=@_;  
+#   get a list of modules
+    opendir DIR, $Path;
+    my @BSFs=grep s/^([^\.].*)\.BSF$/$1/, map { uc $_ } sort readdir DIR;
+    closedir DIR;
+
+    my $BSF;
+    foreach $BSF (@BSFs) {
+        my $File=$Path.lc($BSF).'.bsf';
+#       check whether the assp is already defined
+        if (defined %{$Plat{$BSF}}) {
+            warn(
+                "$File : warning: Platform \"$BSF\" already defined\n",
+                " ... skipping this spec\n"
+            );
+            delete $Plat{$BSF};
+            next;
+        }
+#       open the module
+        unless (open FILE, $File) {
+            delete $Plat{$BSF};
+            warn "warning: Can't open BSF specification \"$File\"\n";
+            next;
+        }
+        my $line1 = <FILE>;
+        $line1 = uc($line1);
+        unless ($line1 =~ /^\#\<BSF\>\#/) {
+            warn "warning: \"$File\" Invalid BSF specification - missing #<bsf>#\n";
+            delete $Plat{$BSF};
+            close FILE;
+                  next;
+        }
+        my $custom;
+        while ($custom = <FILE>) {
+            #skip blank lines and comments
+            delete $Plat{$BSF};
+            last unless ($custom =~ /^$|^\#/);
+        }
+        $custom = uc $custom;
+        unless ($custom =~ /^\s*CUSTOMIZES\s+(\S+)/) {
+            warn "warning: \"$File\" Invalid BSF specification - 'customizes' missing\n";
+            delete $Plat{$BSF};
+            close FILE;
+            next;
+        }
+        my $root = $1;
+        my $platname = '';
+        my $CustomizedPlatName = '';        
+
+        # In v1 mode, ARMV5 platform implies ARMV5_ABIV1 platform listed in the platlist        
+        my $Armv5Flag = 0;
+        if (!$variantABIV2Keyword && $root =~ /^ARMV5$/i) {
+            $Armv5Flag = 1;
+        }
+
+        # Support for Hierarchy of Customizations (BSF file customization of another BSF file)
+        # 1. Check whether the BSF file customizes another BSF file.
+        # 2. If so, check whether the root BSF file has already been read.
+        # 3. If not read, then defer the current BSF file reading until the root file is read.
+        my $rootPlatFound = 0;
+        if (defined %{$Plat{$root}} || $Armv5Flag) 
+        {
+            # BSF platform customizes another valid BSF platform
+            if (defined $Plat{$root}{'CUSTOMIZES'}) 
+            {
+                $rootPlatFound = 1;
+                $platname = $root;
+                $CustomizedPlatName = $root;
+
+                # Set the root platform name which is same as of customizes platform
+                $Plat{$BSF}{'ROOTPLATNAME'} = $Plat{$root}{'ROOTPLATNAME'};
+            }
+            # BSF platform customizes to one of the existing ABI platforms
+            else
+            {
+                # All BPABI platforms inherits from ABIV2 platform listed in the platlist
+                if (grep /^$root$/i, @BPABIPlats) {
+                    $platname = "ABIV2";
+                }
+                elsif ($Armv5Flag) {
+                # In v1 mode, ARMV5 platform implies ARMV5_ABIV1 platform listed in the platlist
+                    $platname = "ARMV5_ABIV1";  
+                }
+                else {
+                    $platname = $root;
+                }
+                
+                $CustomizedPlatName=$root;
+
+                # BSF File check Begins 
+                # The following check is included to handle the existing BSF files which has to behave in different manner
+                # in default v1 mode and v2 mode. The following code changes the BSF name and the custmoized platform name
+                # to the implied names. This is done to support switching between v1 and v2 modes by enabling the keyword in
+                # the variant configuration file.
+                # In v1 mode, the ARMV6_ABIV1 => ARMV6 platform and ARMV6 => ARMV6_ABIV2 platform.
+                if (!$variantABIV2Keyword) {
+                    if ($BSF =~ /^ARMV6_ABIV1$/i) {
+                        $BSF = "ARMV6"; 
+                        $CustomizedPlatName = "ARMV5";  
+                    }
+                    elsif ($BSF =~ /^ARMV6$/i) {
+                        $BSF = "ARMV6_ABIV2";   
+                        $CustomizedPlatName = "ARMV5_ABIV2";
+                        $platname = "ABIV2";
+                    }
+                }
+                # BSF File check Ends
+
+                # Set the root platform name
+                $Plat{$BSF}{'ROOTPLATNAME'} = $CustomizedPlatName;
+            }           
+        }
+        else
+        {
+            my $rootbsf = $Path.$root.".bsf";           
+            if ( -e $rootbsf ) {
+                # BSF file customizes another BSF file which has not been read yet.
+                # So defer current BSF file reading until the root BSF file is read.                
+                delete $Plat{$BSF};
+                push(@BSFs, $BSF);
+                next;       
+            }
+        }
+        # If the customizes platform is not a valid BSF platform or BPABI platorm or ARMV5 or ARMV5_ABIV1,
+        # then throw warning.
+        unless ($rootPlatFound || $root =~ /^ARMV5(_ABIV1)?$/ || (grep /^$root$/i, @BPABIPlats)) {
+            warn "warning: \"$File\" Invalid BSF specification - customization restricted to ARMV5, ABIv2 and valid BSF platforms\n";
+            close FILE;
+            delete $Plat{$BSF};
+            next;
+        }
+            
+        my ( $key, $value);
+        while (($key, $value) = each %{$Plat{$platname}}) {
+            $Plat{$BSF}{$key}=$value;
+        }
+        
+        push @{$Plat{$CustomizedPlatName}{'CUSTOMIZATIONS'}}, $BSF;
+        $Plat{$BSF}{'CUSTOMIZES'} = $CustomizedPlatName;
+        while (<FILE>) {
+            next if (/^$|^\#/);
+            if (/^\s*SMP\s*$/i) {
+                $Plat{$BSF}{'SMP'} = 1;
+                $Plat{$BSF}{'StatLink'} = lc $BSF;
+                next;
+            }
+            $Plat{$BSF}{'CUSTOMIZATION_DATA'} .= $_;
+        }
+        # BSF file statements will have newline character("\n") at the end, except for the last statement.
+        # So append "\n" for the last BSF file statement.
+        # "\n" will be used to split BSF statements to support hierarchy of customizations.
+        $Plat{$BSF}{'CUSTOMIZATION_DATA'} .= "\n";
+        close FILE;
+    }
+    $init_bsfs_done = 1;
+}
+
+# setup Plat with bpabi platforms
+sub init_platwithbpabi() 
+{
+    foreach my $Candidate (&get_bpabiplatlist)
+    {
+# All BPABI platforms inherit from ABIV2 properties as listed in the platlist
+# and Platlist is updated to include the BPABI platforms.
+        my ( $key, $value);
+        while (($key, $value) = each %{$Plat{ABIV2}}) {
+            $Plat{$Candidate}{$key}=$value;
+        }
+    }
+}
+
+# initialize %Plat with BSF/Bpabi/ASSP
+sub init_plat ($) { # takes path to ASSP modules
+    
+    return $init_plat_done if ($init_plat_done);
+    
+    my ($Path)=@_;
+
+    my %PlatHashKeys=(
+        ABI=>1,
+        ASSPABI=>1,
+        SINGLE=>1,
+        Compiler=>1,
+        CPU=>1,
+        MakeMod=>1,
+        MakeCmd=>1,
+        OS=>1,
+        DefFile=>1,
+        ASSP=>1,
+    );
+
+#   Include the list of BPABI platforms
+    &init_platwithbpabi;
+
+    init_bsfs($Path);
+
+#   get a list of modules
+    opendir DIR, $Path;
+    my @_ASSPs=grep s/^([^\.].*)\.ASSP$/$1/, map { uc $_ } readdir DIR;
+    closedir DIR;
+
+    my @ASSPs;
+    foreach (@_ASSPs) {
+        next if (!$ENV{USEARMCC} and /EDG$/i);
+        push @ASSPs, $_;
+    }
+
+#   open each module in turn, and add it to the array
+    my $ASSP;
+    foreach $ASSP (@ASSPs) {
+        my $File=$Path.$ASSP.'.assp';
+#       check whether the assp is already defined
+        if (defined %{$Plat{$ASSP}}) {
+            warn(
+                "$File : warning: ASSP \"$ASSP\" already defined\n",
+                " ... skipping this module\n"
+            );
+
+            next;
+        }
+#       open the module
+        unless (open FILE, $File) {
+            warn "warning: Can't open assp module \"$File\"\n";
+            next;
+        }
+        my %Data=();
+        my %SingleData=();
+        my $MatchingSingle="";
+        my @Errors=();
+        while (<FILE>) {
+#           strip comments
+            s/^([^#]*)#.*$/$1/o;
+#           skip blank lines
+            if (/^\s*$/o) {
+                next;
+            }
+#           get the key-value pair
+            unless (/^\s*(\w+)\s+(\w+)\s*$/o) {
+                push @Errors, "$File($.) : warning: syntax error - only key-value pairs allowed\n";
+                next;
+            }
+            my ($Key, $Val)=($1, $2);
+            if ($PlatHashKeys{$Key}!=1) {
+                push @Errors, "$File($.) : warning: unrecognized keyword - $Key\n";
+                next;
+            }
+            if ($Key eq "SINGLE") {
+                $SingleData{Single} = 1;
+                $SingleData{ASSP} = $ASSP;
+                $MatchingSingle = uc $2;
+            } else {
+                $Data{$Key}=$Val;
+                $SingleData{$Key}=$Val;
+            }
+        }
+        close FILE;
+        if (@Errors) {
+            warn(
+                @Errors,
+                " ... skipping this module\n"
+            );
+            next;
+        }
+# change -  Allow ASSPs to pick up all the options of the ABI they specify, 
+# in particular the compiler they need.
+            $Data{'ASSP'} = $ASSP unless $Data{'ASSP'};
+            if ($Plat{$Data{'ABI'}}) {
+            foreach (keys %{$Plat{$Data{'ABI'}}}) {
+            $Data{$_} = $Plat{$Data{'ABI'}}{$_} unless ($_ =~ /^GENERIC$/i) or $Data{$_};
+            }
+        }
+
+        %{$Plat{$ASSP}}=%Data;
+        if ($MatchingSingle ne "") {
+            foreach (keys %Data) {
+            $SingleData{$_} = $Data{$_} unless ($_ =~ /^GENERIC$/i) or $SingleData{$_};
+            }
+            %{$Plat{$MatchingSingle}}=%SingleData;
+        }           
+    }
+    $init_plat_done=1;
+}
+
+#   return list of supported platforms
+#   should be invoked atfer init_plat
+sub get_platlist () {
+
+    return @PlatList if (scalar(@PlatList));
+
+    &init_plat;
+
+    my $Key;
+    foreach $Key (keys %Plat) {
+        if (!$variantABIV2Keyword && $Key =~ /^armv5_abiv1$/i) {
+            $Key = 'ARMV5';
+        }
+        unless (grep /^$Key$/i, @PlatList) {
+            push @PlatList, $Key;
+        }
+    }
+    return @PlatList
+}
+
+# return customizes BSF plat if any
+sub get_platcustomizes($) {
+    my ($plat) = @_;
+    return $Plat{$plat}{'CUSTOMIZES'} ? $Plat{$plat}{'CUSTOMIZES'} : "";
+}
+
+# return root of a specific plat
+sub get_platroot($) {
+    my ($plat) = @_;
+
+    my $RootName = $Plat{$plat}{'ROOTPLATNAME'};
+
+    if ($RootName) {
+        return $RootName;
+    }
+    else {
+        # A non-BSF platform is its own root.
+        return $plat;
+    }
+}
+
+#################################
+# featurevariant map functions
+#
+# copy from featurevariantmap.pm
+
+my $featureListDir = "${epocroot}epoc32\/include\/variant\/featurelists";
+
+# Usage:    get_BVbinname("my.dll", "myvar")
+#
+# Look for a binary using its "final" name. We will use the feature
+# variant map and the feature variant name to deduce the "variant"
+# binary name and test for its existence.
+#
+# "my.dll"  - the final target (full path)
+# "myvar"   - the feature variant name
+#
+# returns the file name if found, or "" otherwise.
+
+sub get_BVbinname
+{
+    my $binName = shift;
+    my $varName = shift;
+
+    # look for the vmap file
+    my $vmapFile = "$binName.$varName.vmap";
+    
+    if (! -e $vmapFile)
+    {
+    	# compatible to old BV
+    	$vmapFile = "$binName.vmap";
+    }
+    
+    if (-e $vmapFile)
+    {
+        my $key = get_vmapkey($varName, $vmapFile);
+
+        if ($key)
+        {
+            $binName =~ /^(.*)\.([^\.]*)$/;
+            $binName = "$1.$key.$2";
+        }
+        else
+        {
+            print "ERROR: No \'$varName\' variant for $binName in $vmapFile\n";
+            return "";  # file not found
+        }
+    }
+
+    # check that the actual binary exists
+    if (-e $binName)
+    {
+        return $binName;
+    }
+    return "";  # file not found
+}
+
+# internal functions
+sub get_vmapkey
+{
+    my @res = get_vmapdata(@_);
+    return $res[0];
+}
+
+# Usage:    featurevariantmap->GetDataFromVMAP("myvar", "mydll.vmap")
+#
+# Opens the vmap file indicated and returns the data for the requested variant
+#
+# "myvar"   - the feature variant name
+# "my.vmap" - the final target vmap file (full path)
+#
+# Returns a list ( hash, features ) for the variant in the vmap or undef if not found
+
+sub get_vmapdata
+{
+    my $varName = shift;
+    my $fileName = shift;
+
+    if (!open(VMAP, $fileName))
+    {
+        print "ERROR: Could not read VMAP from $fileName\n";
+        return "";
+    }
+    while (<VMAP>)
+    {
+        chomp;
+        if (/(\w{32})\s+$varName\s+(.*)$/i or /(\w{32})\s+$varName$/i)
+        {
+            my ( $hash, $features ) = ( $1, $2 ? $2 : '' );
+            close(VMAP);
+            return ( $hash, $features );
+        }
+    }
+    close(VMAP);
+    return;
+}
+
+######################################
+# Feature variant parser
+#
+# copy from featurevariantparser.pm
+#
+
+
+# Parses .VAR files and returns key variables.
+# The following hashes can be used with this module:
+# NAME              -> Returns the name of the variant file (without the extension)
+# FULLPATH          -> Returns the full path of the variant file (including the extension)
+# VALID             -> Set to 1 if the variant file is valid, otherwise set to 0
+# VIRTUAL           -> Set to 1 if the variant is a grouping node, otherwise set to 0
+# ROM_INCLUDES      -> Returns a pointer to the list of ROM_INCLUDES (including Parent nodes).
+# VARIANT_HRH       -> Returns the full VARIANT_HRH file path used by the VAR file.
+
+
+my $defaultDir = "${epocroot}epoc32\/tools\/variant";
+my $pathregex = '.+[^\s]'  ;   # Regex to match all characters (including \ or /), excluding whitespaces.
+
+my @rominclude;
+my @parents;
+my @childNodes;
+my $virtual;
+my $childNodeStatus;
+my $varianthrh;
+
+my $dir;        #var directory
+my $fullpath;   #full path of var file
+my $fulldir;    #
+
+# Wrapper function to return all the correct variables
+# Arguments : (Variant Name, Variant Directory(optional))
+# Returns a Hash.
+sub get_variant
+{
+    @rominclude      = ();
+    @parents         = ();
+    @childNodes      = ();
+    $dir             = "";
+    $fullpath        = "";
+    $varianthrh      = "";
+    $virtual         = 0;
+    $childNodeStatus = 0;
+    
+    
+    my %data;
+    my $romincs   = "";
+    
+    $data{'VALID'} = 0;
+
+    my ( $varname, $dirname ) = @_;
+
+    my $fullvarpath = get_variantfullpath( $varname, $dirname );
+
+    if ( $dirname )
+    {
+        $fulldir = $dirname;
+    }
+    else
+    {
+        $fulldir = $defaultDir;
+    }
+
+    $data{'FULLPATH'} = "$fullvarpath";
+    $data{'NAME'}     = "$varname";
+
+    # If the variant file exists, check the syntax and setup variables.
+    if ( -e $fullvarpath )
+    {
+        if ( check_varfile( $fullvarpath, $varname ) )
+        {
+            $data{'VALID'} = 1;
+        }
+    }
+    else
+    {
+        print "ERROR: $fullvarpath" . " does not exist\n";
+    }
+
+    my $count = 0;
+
+    # If VAR file is valid, setup all other variables.
+    if ( $data{'VALID'} )
+    {
+
+        $romincs   = find_varrominc($fullvarpath);
+        
+        # Remove empty elements from the ROM_INCLUDE list
+        @$romincs = grep /\S/, @$romincs;
+
+        # Fix paths for all ROM_INCLUDES
+        for ( my $i = 0 ; $i < scalar(@$romincs) ; $i++ )
+        {
+            @$romincs[$i] = get_fixpath( @$romincs[$i] );
+        }
+
+        $data{'ROM_INCLUDES'}   = clone_list($romincs);
+        $data{'VARIANT_HRH'}    = $varianthrh;
+        $data{'VIRTUAL'}        = $virtual;
+    }
+
+    # If variant file is not valid, return reference to a blank array
+    else
+    {
+        $data{'ROM_INCLUDES'}   = [];
+        $data{'VARIANT_HRH'}    = "";
+    }
+
+    return %data;
+}
+
+# Method to construct a full variant path from the variant file and directory
+sub get_variantfullpath
+{
+
+    my $vardirectory = $_[1];
+    my $varname      = $_[0];
+    
+    my $dir;
+    
+    # Check if a directory is supplied
+    if ($vardirectory)
+    {
+        $dir = "$vardirectory";
+    }
+
+    else
+    {
+        $dir = $defaultDir;
+    }
+    my $filename = "$varname" . "\.var";
+    $fullpath = File::Spec->catfile( File::Spec->rel2abs($dir), $filename );
+
+    if ( !File::Spec->file_name_is_absolute($fullpath) )
+    {
+        $fullpath = File::Spec->rel2abs($fullpath);
+    }
+
+    return $fullpath;
+}
+
+# Checks the variant file for the correct syntax and reports any errors
+# Also sets up some variables(VIRTUAL ,VARIANT_HRH and VARIANT) whilst file is being parsed.
+
+# Usage: check_varfile(<fullpath>,<varfile>) . Note: <varfile> without .var
+sub check_varfile
+{
+
+    my $fullpath          = $_[0];
+    my $varname           = $_[1];
+    my $varianthrhpresent = 0;
+
+    open( READVAR, "<$fullpath" );
+    my $exp  = "#";
+    my $line = "";
+
+    while (<READVAR>)
+    {
+        s/\r\n/\n/g;
+
+        $line = $.;
+
+    # Checks for a valid argument supplied to EXTENDS keyword. Checks for one and only one argument supplied.
+        if (/^EXTENDS/)
+        {
+            if ( !m/^EXTENDS\s+./ )
+            {
+                print "\nERROR: Invalid format supplied to argument EXTENDS on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+            my $str = get_extends($_);
+            if ( $str =~ /\s+/ )
+            {
+                print "\nERROR: Cannot extend from two nodes. Error in line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            $childNodeStatus = 1;
+        }
+
+        # Checks for the grammar of BUILD_INCLUDE, i.e. KEYWORD MODIFIER VALUE
+        elsif (/^BUILD_INCLUDE/)
+        {
+            # skip build inc checking
+        }
+
+        # Checks for the grammar of ROM_INCLUDE, i.e. KEYWORD MODIFIER VALUE
+        elsif (/^ROM_INCLUDE/)
+        {
+
+            if (!m/^ROM_INCLUDE\s+(append|prepend|set)\s+$pathregex/)
+            {
+                print "\nERROR: Invalid syntax supplied to keyword ROM_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            if (m/^ROM_INCLUDE\s+(append|prepend|set)\s+$pathregex\s+$pathregex/)
+            {
+                print "\nERROR: Too many arguments supplied to keyword ROM_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+        }
+
+        # Checks for a valid VARIANT name
+        elsif (/^VARIANT[^_HRH]/)
+        {
+            if ( !m/^VARIANT\s+\w+/ )
+            {
+                print "\nERROR: VARIANT name not specified on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+            if ( uc("$varname") ne uc( get_variantname($_) ) )
+            {
+                print "\nERROR: VARIANT filename does not match variant name specified on line "
+                  . "$line"
+                  . " in file "
+                  . "$fullpath"
+                  . "\nVariant value extracted from the VAR file is " . "$_";
+            }
+
+        }
+
+        # Checks that keyword VIRTUAL is declared correctly
+        elsif (/^VIRTUAL/)
+        {
+            if (m/^VIRTUAL\s+\w+/)
+            {
+                print "\nERROR: Invalid declaration of VIRTUAL on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            $virtual = 1;
+        }
+
+        # Checks if VARIANT_HRH is declared correctly.
+        elsif (/^VARIANT_HRH/)
+        {
+            $varianthrhpresent = 1;
+            my $lineno = $.;
+            if ( !m/^VARIANT_HRH\s+./ )
+            {
+                print "\nERROR: Invalid format supplied to argument VARIANT_HRH on line "
+                  . "$lineno"
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            my $str = get_hrhname($_);
+            if ( $str =~ /\s+/ )
+            {
+                print "\nERROR: Cannot have 2 or more hrh files. Error in line "
+                  . "$lineno"
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            unless( -e get_fixpath($str) )
+            {
+                print "\nERROR: VARIANT HRH file : "
+                  . get_fixpath($str)
+                  . " specified on line "
+                  . "$lineno"
+                  . " does not exist";
+                return 0;
+            }
+
+            $varianthrh = get_fixpath( get_hrhname($_) );
+
+        }
+        
+        # If none of the valid keywords are found
+        else
+        {
+
+            # Do nothing if a comment or blank line is found
+            if ( (m/$exp\s+\S/) || (m/$exp\S/) || ( !m/./ ) || (m/^\n/) )
+            {
+            }
+
+            # Unsupported keyword
+            else
+            {
+
+                print "\nERROR: Invalid keyword " . '"' . "$_" . '"'
+                  . " found on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+        }
+    }
+
+    close(READVAR);
+
+    # If no HRH file defined, check if the default one exists
+    if ( !$varianthrhpresent )
+    {
+        print "\nINFO: No VARIANT_HRH defined in VAR file, using ${epocroot}epoc32\/include\/variant\/$varname\.hrh" if ($verbose);
+        my $str =
+          get_hrhname(
+            "VARIANT_HRH ${epocroot}epoc32\/include\/variant\/$varname\.hrh"
+          );
+
+        if ( ! -e $str )
+        {
+            print "\nERROR: VARIANT HRH file : " . "$str " . "does not exist\n";
+            return 0;
+        }
+        else
+        {
+            $varianthrh = $str;
+        }
+    }
+    return 1;
+}
+
+# Extract the value of the VARIANT keyword
+sub get_variantname
+{
+
+    $_[0] =~ m/^VARIANT\s+(\w+)/i;
+    return $1;
+}
+
+# Extracts the value of the HRH file from the VARIANT_HRH line supplied
+sub get_hrhname
+{
+
+    $_[0] =~ m/^VARIANT_HRH\s+($pathregex)/;
+    return $1;
+
+}
+
+# Method to find the immediate parent node of a child node
+sub get_extends
+{
+
+    $_[0] =~ m/^EXTENDS\s+(\w+)/;
+    return $1;
+}
+
+
+# Method to correct all the slashes, and also append EPOCROOT if the path begins with a \ or /
+# If path doesn't start with \ or /, returns an abosulte canonical path
+sub get_fixpath
+{
+
+    my $arr = $_[0];
+
+    if ( $arr =~ m/^\// )
+    {
+       $arr =~ s/^\/?//;
+        return File::Spec->canonpath( "$epocroot" . "$arr" );
+    }
+
+    elsif ( $arr =~ m/^\\/ )
+    {
+        $arr =~ s/^\\?//;
+        return File::Spec->canonpath( "$epocroot" . "$arr" );
+    }
+
+    else
+    {
+        return File::Spec->rel2abs( File::Spec->canonpath("$arr") );
+    }
+
+}
+
+# Method to find the ROMINCLUDE values of the VAR file.
+sub find_varrominc
+{
+
+    my $filename = $_[0];
+
+    my $parentNodes;
+
+    # Construct a list of parent nodes if node is a child
+    if ($childNodeStatus)
+    {
+        $parentNodes = find_varparentnode("$filename");
+    }
+
+    if ($parentNodes)
+    {
+
+        # Go through and build the list of all parent ROM_INCLUDES
+        for ( my $i = scalar(@$parentNodes) - 1 ; $i >= 0 ; $i-- )
+        {
+            my $t = get_variantfullpath( @$parentNodes[$i], $fulldir );
+            open( NEWHANDLE, "<$t" );
+
+            while (<NEWHANDLE>)
+            {
+                if (/ROM_INCLUDE/)
+                {
+                    get_varrominc($_);
+                }
+            }
+            close(NEWHANDLE);
+        }
+    }
+
+    # Append the ROM_INCLUDES of the VAR file in the end
+    open( NEWHANDLE, "<$filename" );
+
+    while (<NEWHANDLE>)
+    {
+        if (/ROM_INCLUDE/)
+        {
+            get_varrominc($_);
+        }
+    }
+
+    undef(@parents);    # Flush out parent array;
+    return \@rominclude;
+
+}
+
+# Constructs a list of Parent nodes for a given Child node.
+sub find_varparentnode
+{
+
+    my $filename   = $_[0];
+    my $hasparents = 0;
+
+    open( READHANDLE, "<$filename" );
+    while (<READHANDLE>)
+    {
+        if (/EXTENDS/)
+        {
+            $hasparents = 1;
+            push( @parents, get_extends($_) );
+
+        }
+    }
+
+    close(READHANDLE);
+
+    if ( $hasparents == 1 )
+    {
+        find_varparentnode(
+            get_variantfullpath( @parents[ scalar(@parents) - 1 ], $fulldir )
+        );
+    }
+    else
+    {
+        return \@parents;
+    }
+
+}
+
+# Method to extract the ROM_INCLUDE value of a node.
+sub get_varrominc
+{
+
+# If modifier append is found, push the rominclude to the end of the array list.
+    if (/^ROM_INCLUDE\s+append\s+($pathregex)/)
+    {
+        push( @rominclude, ($1) );
+    }
+
+# If modifier prepend is found, push the rominclude to the beginning of the array list.
+    if (/^ROM_INCLUDE\s+prepend\s+($pathregex)/)
+    {
+        unshift( @rominclude, ($1) );
+    }
+
+# If keyword set is found, then empty the rominclude variable and push the new value
+    if (/^ROM_INCLUDE\s+set\s+($pathregex)/)
+    {
+        undef(@rominclude);
+        push( @rominclude, ($1) );
+    }
+
+}
+
+# Helper method that clones a reference to a simple list
+sub clone_list
+    {
+    my $ref = shift;
+    
+    # Check the reference is a list
+    die "Not a list ref" if ref($ref) ne 'ARRAY';
+    
+    # Create a new list object
+    my @list;
+    foreach my $entry ( @$ref )
+        {
+        # Only clone lists of scalars
+        die "Not a scalar" if ref($entry);
+        
+        # Add the entry to the new list
+        push @list, $entry;
+        }
+    
+    # return a reference to the copy    
+    return \@list;
+    }
+    
+##############################
+#  write helper
+#
+# copy from writer.pm
+sub write_32bit # little-endian
+{
+    my $fileHandle=shift;
+    my $integer=shift;
+    &write_8bit($fileHandle, $integer&0x000000ff);
+    &write_8bit($fileHandle, ($integer>>8)&0x000000ff);
+    &write_8bit($fileHandle, ($integer>>16)&0x000000ff);
+    &write_8bit($fileHandle, ($integer>>24)&0x000000ff);
+}
+
+sub write_8bit
+{
+    my $fileHandle=shift;
+    my $integer=shift;
+    if ($integer&0xffffff00)
+    {
+        die("Error: the integer ".sprintf("0x%08x", $integer)." is too large to write into 8 bits\n");
+    }
+    printf $fileHandle "%c", $integer;
+}
+
+
+1;
+
Binary file imgtools/imaker/bin/mingw_make.exe has changed
--- a/imgtools/imaker/buildrom_plugins/group/bld.inf	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -18,11 +18,12 @@
 
 PRJ_EXPORTS
 
-../plugincommon.pm                              +/tools/ //
-../hide.pm                                      +/tools/ //
-../localise.pm                                  +/tools/ //
-../localise_all_resources.pm                    +/tools/ //
-../obyparse.pm                                  +/tools/ //
-../override.pm                                  +/tools/ //
+../plugincommon.pm                      +/tools/rom/imaker/ //
+../hide.pm                              +/tools/rom/imaker/ //
+../localise.pm                          +/tools/rom/imaker/ //
+../localise_all_resources.pm            +/tools/rom/imaker/ //
+../obyparse.pm                          +/tools/rom/imaker/ //
+../override.pm                          +/tools/rom/imaker/ //
+../stubsischeck.pm                      +/tools/rom/imaker/ //
 
 // END OF BLD.INF
--- a/imgtools/imaker/buildrom_plugins/localise.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/localise.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -13,7 +13,7 @@
 #
 # Description:
 # Adds a LOCALISE macro that enables configuration of localised files.
-# The localised language selection is done with a ADD_LANGUAGE macro.
+# The localised language selection is done with a LANGUAGE_CODE macro.
 #
 
 
@@ -26,14 +26,14 @@
 #   target => the target file. The section that needs to be localised should be marked with ??.
 #   languages => a space delimited list of language codes
 #
-# Syntax: ADD_LANGUAGE
-#   ADD_LANGUAGE lang
+# Syntax: LANGUAGE_CODE
+#   LANGUAGE_CODE lang
 #
 # Example:
 # Add languages
-# ADD_LANGUAGE 01
-# ADD_LANGUAGE 02
-# ADD_LANGUAGE 03
+# LANGUAGE_CODE 01
+# LANGUAGE_CODE 02
+# LANGUAGE_CODE 03
 #
 # Use Case 1:
 # Localises a App resoure file.
@@ -45,9 +45,9 @@
 #
 # Use Case 2:
 # Localise all resource files under a section
-# ADD_LANGUAGE 01
-# ADD_LANGUAGE 02
-# ADD_LANGUAGE 03
+# LANGUAGE_CODE 01
+# LANGUAGE_CODE 02
+# LANGUAGE_CODE 03
 #
 # LOCALISE_ALL_RESOURCES_BEGIN
 # // All resource files will be localised
@@ -107,6 +107,7 @@
 my $verbose=0;
 my $errors=0;
 my $localise_all_resource=0;
+my %qt_langs = ();
 
 sub localise_info
   {
@@ -120,17 +121,10 @@
   my $obydata = shift;
   do_localise_all_resources_extension(\@{$obydata});
 
-
   undef @newobydata;
   foreach $line (@{$obydata})
   {
-    # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
-    if ($line =~ /^\s*REM/i)
-    {
-      push @newobydata, $line;
-      next;
-    }
-    # ADD_LANGUAGE xx
+    # LANGUAGE_CODE xx
     if (is_addlanguage_entry($line))
     {
       my $code = get_lang_from_addlanguage_entry($line);
@@ -144,10 +138,28 @@
       {
         print "adding language $code\n" if $verbose;
         $languages{$code} = 1;
-        push @newobydata, "REM handled $line";
+        push @newobydata, $line;
         next;
       }
     }
+    # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+    if ($line =~ /^\s*REM/i)
+    {
+      push @newobydata, $line;
+      next;
+    }
+    # Read QT to Symbian language id mappings
+    if ($line =~ /^\s*QT_TO_SYMBIAN_LANGID\s+(.+?)\s*$/i)
+    {
+      push(@newobydata, "REM handled $line");
+      open(FILE, $1) or
+          die("ERROR: localise.pm can't open QT to Symbian language id mapping file `$1'\n");
+      map {
+          $qt_langs{$2} = $1 if (!/^\s*#/ && /^\s*(\S+?)\s*=\s*(\d+)\s*$/);
+      } <FILE>;
+      close(FILE);
+      next;
+    }
     # LOCALISE macro
     if (is_localise_entry($line))
     {
@@ -245,14 +257,23 @@
   for (my $i=0; $i<$count; $i++) {
     push(@data, $lang);
   }
-  my $output = sprintf($res,@data);
+
+  my $output;
+  if (($res =~ m/\.qm["']?$/i) && %qt_langs)
+        {
+                $output = sprintf($res, $qt_langs{sprintf("%s", @data)});
+        }
+  else
+  {
+        $output = sprintf($res,@data);
+        }
   return $output;
 }
-# match ADD_LANGUAGE 01
+# match LANGUAGE_CODE 01
 sub is_addlanguage_entry($)
 {
   my $entry = shift;
-  if ( $entry =~ m/^\s*ADD_LANGUAGE\s+(\S+)\s*/i )
+  if ( $entry =~ m/^\s*REM\s+handled\s+LANGUAGE_CODE\s+(\S+)\s*$/i )
   {
     return 1;
   }
@@ -262,7 +283,7 @@
 sub get_lang_from_addlanguage_entry($)
 {
   my $entry = shift;
-  if ( $entry =~ m/^\s*ADD_LANGUAGE\s+(\S+)/i )
+  if ( $entry =~ m/^\s*REM\s+handled\s+LANGUAGE_CODE\s+(\S+)\s*$/i )
   {
     return $1;
   }
--- a/imgtools/imaker/buildrom_plugins/localise_all_resources.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/localise_all_resources.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -13,7 +13,7 @@
 #
 # Description:
 # Adds a LOCALISE macro that enables configuration of localised files.
-# The localised language selection is done with a ADD_LANGUAGE macro.
+# The localised language selection is done with a LANGUAGE_CODE macro.
 #
 
 
@@ -26,14 +26,14 @@
 #   target => the target file. The section that needs to be localised should be marked with ??.
 #   languages => a space delimited list of language codes
 #
-# Syntax: ADD_LANGUAGE
-#   ADD_LANGUAGE lang
+# Syntax: LANGUAGE_CODE
+#   LANGUAGE_CODE lang
 #
 # Example:
 # Add languages
-# ADD_LANGUAGE 01
-# ADD_LANGUAGE 02
-# ADD_LANGUAGE 03
+# LANGUAGE_CODE 01
+# LANGUAGE_CODE 02
+# LANGUAGE_CODE 03
 #
 # Use Case 1:
 # Localises a App resoure file.
@@ -45,9 +45,9 @@
 #
 # Use Case 2:
 # Localise all resource files under a section
-# ADD_LANGUAGE 01
-# ADD_LANGUAGE 02
-# ADD_LANGUAGE 03
+# LANGUAGE_CODE 01
+# LANGUAGE_CODE 02
+# LANGUAGE_CODE 03
 #
 # LOCALISE_ALL_RESOURCES_BEGIN
 # // All resource files will be localised
@@ -64,19 +64,6 @@
 #
 ###############################################################################
 
-#
-# Version 4
-# Path corrections to widget support.
-#
-# Version 3
-# Support for Idle widgets.
-#
-# Version 2
-# Localises also *.hlp to *.h%s.
-#
-# Version 1
-# Initial version.
-
 
 package localise_all_resources;
 use strict;
@@ -169,6 +156,15 @@
         push @newobydata, "$line\n";
         next;
       }
+      # localise all qm files inside the localise_all_resources section
+      # qt resource files .ts
+      if ( is_qt_resource_entry($line) )
+      {
+        # match data/file=foobar.qm resource/foobar.qm
+        $line = create_localise_entry_from_qt_resource($line);
+        push @newobydata, "$line\n";
+        next;
+      }
       # help files .hlp
       if ( is_help_entry_hlp($line) )
       {
@@ -262,6 +258,19 @@
   return 0;
 }
 
+sub is_qt_resource_entry($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  if ($source =~ m/\.qm[\"|\']?$/i &&
+      $target =~ m/\.qm[\"|\']?$/i )
+  {
+    return 1;
+  }
+  return 0;
+}
 #
 # match
 sub is_help_entry_xhtml($)
@@ -270,8 +279,8 @@
   my $type = get_type_from_entry($entry);
   my $source = get_source_from_entry($entry);
   my $target = get_target_from_entry($entry);
-  if ($source =~ m/\\01\\/i &&
-      $target =~ m/\\01\\/i )
+  if ($source =~ m/[\/\\]01[\/\\]/i &&
+      $target =~ m/[\/\\]01[\/\\]/i )
   {
     return 1;
   }
@@ -301,10 +310,10 @@
   my $type = get_type_from_entry($entry);
   my $source = get_source_from_entry($entry);
   my $target = get_target_from_entry($entry);
-  if (($source =~ m/\\01\\.*\.dtd/i &&
-      $target =~ m/\\01\\.*\.dtd/i ) ||
-    ($source =~ m/\\00\\.*\.dtd/i &&
-      $target =~ m/\\00\\.*\.dtd/i ))
+  if (($source =~ m/[\/\\]01[\/\\].*\.dtd/i &&
+      $target =~ m/[\/\\]01[\/\\].*\.dtd/i ) ||
+    ($source =~ m/[\/\\]00[\/\\].*\.dtd/i &&
+      $target =~ m/[\/\\]00[\/\\].*\.dtd/i ))
   {
     return 1;
   }
@@ -390,6 +399,20 @@
   return "$type=LOCALISE($source, $target)";
 }
 
+# create localise entry from qt resource entry
+sub create_localise_entry_from_qt_resource($)
+{
+  my $entry = shift;
+  my $type = get_type_from_entry($entry);
+  my $source = get_source_from_entry($entry);
+  my $target = get_target_from_entry($entry);
+  #convert the .qm to _xx.qm
+  $source =~ s/\.qm/\_%s.qm/i;
+  $target =~ s/\.qm/\_%s.qm/i;
+  #print "create_localise_entry_from_resource: $source\n";
+  return "$type=LOCALISE($source, $target)";
+}
+
 # create localise entry from resource entry
 sub create_localise_entry_from_help($)
 {
@@ -398,8 +421,8 @@
   my $source = get_source_from_entry($entry);
   my $target = get_target_from_entry($entry);
   #convert the \\01\\ to \\%02d\\
-  $source =~ s/\\01\\/\\%02d\\/i;
-  $target =~ s/\\01\\/\\%02d\\/i;
+  $source =~ s/([\/\\])01([\/\\])/$1%02d$2/i;
+  $target =~ s/([\/\\])01([\/\\])/$1%02d$2/i;
   #print "create_localise_entry_from_resource: $source\n";
   return "$type=LOCALISE($source, $target)";
 }
@@ -468,8 +491,8 @@
 {
   my $entry = shift;
 
-  $entry =~ s/\\01\\/\\%02d\\/ig;
-  $entry =~ s/\\00\\/\\%02d\\/ig;
+  $entry =~ s/([\/\\])01([\/\\])/$1%02d$2/ig;
+  $entry =~ s/([\/\\])00([\/\\])/$1%02d$2/ig;
 
   #print "create_localise_entry_from_resource: $source\n";
   return $entry;
--- a/imgtools/imaker/buildrom_plugins/obyparse.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/obyparse.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -33,87 +33,92 @@
     @EXPORT  = qw(&obyparse_info &obyparse_init &obyparse_process);
 }
 
-my $conf = "";
+my $conf;
 
 sub obyparse_info()
 {
     return({
         name       => "obyparse",
-        invocation => "InvocationPoint2",
+        invocation => "InvocationPoint2",  # tmp6.oby
         initialize => "obyparse::obyparse_init",
         single     => "obyparse::obyparse_process"});
 }
 
 sub obyparse_init($)
 {
-    plugin_init("obyparse.pm", $conf = shift());
+    plugin_init(&obyparse_info, $conf = shift(), 0);
 }
 
 sub obyparse_readconffile($$$$$);
-
+sub obyparse_findincfiles();
+sub obyparse_findspifiles();
 
 sub obyparse_process($)
 {
-    plugin_start("obyparse.pm", $conf);
+    plugin_start(&obyparse_info, $conf);
 
-    my $obydata = shift();
-    my %targets = ();
-    my %patchdata = ();
-    my ($romfiles, $rofs1files, $udebfiles, $urelfiles) = (undef, undef, "", "");
-    my $fname = "";
+    my ($obydata, $romfiles, $rofs1files, $udebfiles, $urelfiles, $fname) = (shift(), undef, undef, "", "", "");
+    my %targets = my %patchdata = ();
+
+    obyparse_findincfiles();
+    obyparse_findspifiles();
+    plugin_reset();
 
     foreach (@$obydata)
     {
-        next if (my $parse = parse_obyline($_)) < 0;
+        next if !(my $parse = parse_obyline($_));
 
-        if (($parse == 1) && ($gKeyword =~ FILEBITMAPSPECKEYWORD)) {
-            ($fname = lc($gTarget)) =~ /^(?:.*\\)?(.+?)$/;
-            my $tname = $1;
-            $targets{$fname} = $targets{$tname} = [$gLnum - 1, !$gRomid && ($gKeyword =~ ROFSBITMAPFILESPECKEYWORD)];
+        if (($parse == 2) && ($gKeyword =~ FILEBITMAPSPECKEYWORD)) {
+            $targets{$gTgtCmp} = $targets{File::Basename::basename($gTgtCmp)} = [$gLnum - 1,
+                !$gRomid && ($gKeyword =~ ROFSBITMAPFILESPECKEYWORD) && ($gAttrib !~ /paging_unmovable/i)]
+                    if ($gImgid == $gRomidCmp);
+            dprint(2, "Removed attribute paging_unmovable: `$_'")
+                if ($gAttrib =~ /paging_unmovable/i) && (s/\s+paging_unmovable\s*(?=\s|^)//i);
             next;
         }
 
         next if !/^\s*OBYPARSE_(ROM|ROFS1|UDEB|UREL)\s+(.+?)\s*$/i;
 
         (my $rule, $fname) = (uc($1), $2);
+        $_ = "$gHandlestr $_";
+        next if $gRomid && ($gImgid != $gRomidCmp);
+
+        dprint(2, "#$gLnum: `$gLine'");
         my $files = ($rule eq "ROM" ? \$romfiles : ($rule eq "ROFS1" ? \$rofs1files :
             ($rule eq "UDEB" ? \$udebfiles : \$urelfiles)));
         $$files = "" if !defined($$files);
-        dprint(2, "#$gLnum: `$gLine'");
 
         if ($fname ne "*") {
             my $basedir = "";
             ($basedir, $fname) = ($1, $2) if $fname =~ /^(.*[\/\\])(.+?)$/;
             dprint(3, "Found " . obyparse_readconffile($basedir, $fname, $rule, $files, 0) . " entries");
-        }
-        else {
+        } else {
+            dprint(3, "Move/change all possible components to $rule");
             $$files = ".*";
-            dprint(3, "Move/change all possible components to $rule");
         }
-        $_ = "$gHandlestr $_";
     }
 
     $romfiles   = qr/^($romfiles)$/i   if defined($romfiles);
     $rofs1files = qr/^($rofs1files)$/i if defined($rofs1files);
     ($udebfiles, $urelfiles) = (qr/^($udebfiles)$/i, qr/^($urelfiles)$/i);
 
-    ($gLnum, $gRomid) = (0, 0);
-    my ($rofs1cnt, $udebcnt, $urelcnt, $offset, @torofs1) = (0, 0, 0, 0, ());
+    my ($rofs1ofs, $udebcnt, $urelcnt, @torofs1) = (0, 0, 0, ());
+    plugin_reset();
 
     foreach (@$obydata)
     {
         my $parse = parse_obyline($_);
-        $offset++ if $gRomid < 2;
-        next if $parse != 1;
+        $rofs1ofs++ if ($gRomid < 2);
+        next if ($parse != 2) || ($gImgid != $gRomidCmp);
 
         if ($gKeyword =~ /^patchdata$/i) {
-            $gSource =~ /^(.+?)(?:@.+)?$/;
-            $fname = lc($1);
+            $gSrcCmp =~ /^(.+?)(?:@.+)?$/;
+            next if !exists($targets{$fname = $1});
             $patchdata{$fname} = $targets{$fname}[0] if !exists($patchdata{$fname});
+            next if !$targets{$fname}[1];
         }
-        else {
-            $gTarget =~ /^(?:.*\\)?(.+?)$/;
-            $fname = $1;
+        elsif ($gKeyword =~ FILEBITMAPSPECKEYWORD) {
+            $fname = File::Basename::basename($gTgtCmp);
             if ($fname =~ $urelfiles && s/(?<=[\/\\])udeb(?=[\/\\])/urel/i) {
                 $urelcnt++;
                 dprint(2, "Changed to UREL: `$_'");
@@ -122,67 +127,105 @@
                 $udebcnt++;
                 dprint(2, "Changed to UDEB: `$_'");
             }
-        }
-
-        next if $gRomid || !defined($romfiles) && !defined($rofs1files);
-
-        if (($gKeyword =~ ROFSBITMAPFILESPECKEYWORD) ||
-            ($gKeyword =~ /^patchdata$/i) && exists($targets{$fname}) && $targets{$fname}[1]) {
+            next if !$targets{$gTgtCmp}[1];
         }
-        elsif ($gKeyword =~ /^(?:alias|rename)/i && exists($targets{lc($gSource)}) && $targets{lc($gSource)}[1]) {
-            $gSource =~ /^(?:.*\\)?(.+?)$/;
-            $fname = $1;
+        elsif ($gKeyword =~ DIRECTORYKEYWORD) {
+            $fname = File::Basename::basename($gTgtCmp);
+            next if !(exists($targets{$gTgtCmp}) && $targets{$gTgtCmp}[1]) &&
+                !(exists($targets{$fname}) && $targets{$fname}[1]);
         }
-        else {
-            next;
-        }
-        if (defined($rofs1files) && ($fname =~ $rofs1files) || defined($romfiles) && ($fname !~ $romfiles)) {
-            $rofs1cnt++;
+        else { next }
+
+        if (!$gRomid && (defined($rofs1files) && ($fname =~ $rofs1files) || defined($romfiles) && ($fname !~ $romfiles))) {
             push(@torofs1, $_);
-            $_ = "$gHandlestr =>ROFS1 $_";
+            $_ = "$gHandlestr $_";
         }
     }
 
-    dprint(3, "Moved $rofs1cnt entries to ROFS1")    if $rofs1cnt;
+    dprint(3, "Moved " . scalar(@torofs1) . " entries to ROFS1") if @torofs1;
     dprint(3, "Changed $udebcnt components to UDEB") if $udebcnt;
     dprint(3, "Changed $urelcnt components to UREL") if $urelcnt;
 
-    dprint(2, "Found " . keys(%patchdata) . " ROM-patched components:") if %patchdata;
+    dprint(3, "Finding ROM-patched components");
     foreach (sort({$a <=> $b} values(%patchdata))) {
-        ${$obydata}[$_] =~ /^(?:$gHandlestr =>ROFS1 )?(.+)$/;
+        ${$obydata}[$_] =~ /^(?:$gHandlestr )?(.+)$/;
         parse_keyline($1);
         dprint(2, "`$gSource'");
     }
+    dprint(3, "Found " . keys(%patchdata) . " ROM-patched components");
 
-    splice(@$obydata, $offset, 0, @torofs1) if @torofs1;
+    splice(@$obydata, $rofs1ofs, 0, @torofs1) if @torofs1;
 
     plugin_end();
 }
 
+sub obyparse_findincfiles()
+{
+    my ($drive, $indent, $prev, $tmpoby, %files) =
+        (Cwd::cwd() =~ /^([a-z]:)/i ? $1 : "", -2, "", "$gWorkdir/tmp1.oby", ());
+
+    dprint(3, "Finding include hierarchy from `$tmpoby'");
+    open(FILE, $tmpoby) or dprint(-3, "$gPluginname can't open `$tmpoby'"), return;
+
+    while (my $line = <FILE>) {
+        next if ($line !~ /^#\s+\d+\s+"(.+?)"(?:\s+(\d))?$/);
+        my ($file, $flag) = ($1, defined($2) ? $2 : 0);
+        next if ($file =~ /^<.*>$/);
+        $indent -= 2, $prev = $file, next if ($flag == 2);
+        next if (!$flag && $file eq $prev || $flag > 1);
+        $indent += 2 if $flag;
+        ($prev = $file) =~ /^(.*[\/\\])?(.+?)$/;
+        (my $dir, $file) = ("", $2);
+        $dir = abspath(defined($1) ? $1 : ".");
+        dprint(2, ("." x $indent) . "`$prev' !!!"), next if ($dir eq "");
+        $dir =~ s/^$drive|\/$//gi;
+        $files{lc($file = "$dir/$file")} = 1;
+        dprint(2, ("." x $indent) . "`$file'");
+    }
+    close(FILE);
+    dprint(3, "Found " . keys(%files) . " different include files");
+}
+
+sub obyparse_findspifiles()
+{
+    my ($spicnt, $tmpoby) = (0, "$gWorkdir/tmp5.oby");
+
+    dprint(3, "Finding SPI input files from `$tmpoby'");
+    open(FILE, $tmpoby) or dprint(-3, "$gPluginname can't open `$tmpoby'"), return;
+
+    while (my $line = <FILE>) {
+        next if (parse_obyline($line) != 2) || ($gKeyword !~ /^spidata/i);
+        $spicnt++;
+        dprint(2, "`$gSource'" . ($gKeyword =~ /^spidata$/i ? "" : " ($gKeyword)"));
+    }
+    close(FILE);
+    dprint(3, "Found $spicnt SPI input files");
+}
 
 sub obyparse_readconffile($$$$$)
 {
     my ($basedir, $file, $type, $files, $indent) = @_;
-    $file = $basedir . $file;
+    $file = "$basedir$file";
     my $filecnt = 0;
 
-    dprint(3, "Reading $type files") if $type;
-    dprint(3, ("." x $indent) . "`$file'");
+    dprint(3, "Reading $type files from $file") if $type;
+    dprint(2, ("." x $indent) . "`$file'");
 
-    open(FILE, $file) or die("ERROR: Can't open `$file'\n");
+    open(FILE, $file) or dprint(3, "Error: $gPluginname can't open $file", 1), die("\n");
+    my @files = <FILE>;
+    close(FILE);
 
-    foreach my $line (<FILE>) {
-        if ($line =~ /^\s*#include\s+(.+?)\s*$/i) {
+    foreach (@files) {
+        if (/^\s*#include\s+(.+?)\s*$/i) {
             $filecnt += obyparse_readconffile($basedir, $1, "", $files, $indent + 2);
             next;
         }
-        next if ($line =~ /^\s*$/) || ($line =~ /^\s*(?:#|\/\/|REM\s)/i);
+        next if (/^\s*$/) || (/^\s*(?:#|\/\/|REM\s)/i);
         $filecnt++;
-        (my $fname = $line) =~ s/^\s+|\s+$//g;
-        $fname =~ s/(.)/{'*' => '.*', '?' => '.', '[' => '[', ']' => ']'}->{$1} || "\Q$1\E"/ge;
+        (my $fname = $_) =~ s/^\s+|\s+$//g;
+        $fname =~ s/(.)/{"*" => ".*", "?" => "."}->{$1} || "\Q$1\E"/eg;
         $$files .= ($$files eq "" ? "" : "|") . $fname;
     }
-    close(FILE);
     return($filecnt);
 }
 
--- a/imgtools/imaker/buildrom_plugins/override.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/override.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -53,6 +53,7 @@
 
 use strict;
 use warnings;
+use File::Basename;
 use plugincommon;
 
                                  # OVERRIDE TARGET FOUND  OVERRIDE TARGET NOT FOUND
@@ -70,31 +71,30 @@
     @EXPORT  = qw(&override_info &override_init &override_process);
 }
 
-my $conf = "";
+my $conf;
 
 sub override_info
 {
     return({
         name       => "override",
-        invocation => "InvocationPoint2",
+        invocation => "InvocationPoint2",  # tmp6.oby
         initialize => "override::override_init",
         single     => "override::override_process"});
 }
 
 sub override_init
 {
-    plugin_init("override.pm", $conf = shift());
+    plugin_init(&override_info, $conf = shift(), 0);
 }
 
 sub override_process
 {
-    plugin_start("override.pm", $conf);
+    plugin_start(&override_info, $conf);
 
     my $obydata    = shift();
     my %targets    = ();
     my @overrides  = ();
     my @oconfstack = (REPLACE_WARN);
-    my @romelemcnt = (0, 0, 0, 0, 0, 0, 0, 0);
 
     # Go through all the tmp6.oby (InvocationPoint2) lines and store
     # normal targets' data to %targets and override targets' data to @overrides
@@ -103,34 +103,35 @@
 
     foreach (@{$obydata})
     {
-        my $parse = parse_obyline($_);
+        next if !(my $parse = parse_obyline($_));
 
-        if ($parse == 2) {
-            # REM ROM_IMAGE[id]
+        if (($parse == 2) && ($gKeyword =~ /-?override$/i)) {
+            # Override entry
+            $_ = "$gHandlestr $_", next if ($gImgid != $gRomidCmp);
             dprint(2, "#$gLnum: `$gLine'");
+            push(@overrides, [$gLnum - 1, $oconfstack[$#oconfstack]]);
+            next;
+        }
+        if (($parse == 2) && ($gKeyword =~ FILEBITMAPSPECKEYWORD)) {
+            # Normal file specification entry
+            $targets{$gTgtCmp} = $targets{File::Basename::basename($gTgtCmp)} = $gLnum - 1
+                if ($gImgid == $gRomidCmp);
+            next;
         }
-        elsif (/^\s*OVERRIDE_(?:(END)|(REPLACE\/ADD)|(REPLACE\/SKIP)|(REPLACE\/WARN)|SKIP\/ADD)\s*$/i) {
-            # Override configuration keyword
-            if (defined($1)) {
-                # OVERRIDE_END
-                pop(@oconfstack);
-            } else {
-                # OVERRIDE_REPLACE/ADD|REPLACE/SKIP|REPLACE/WARN|SKIP/ADD
-                push(@oconfstack, defined($2) ? REPLACE_ADD : (defined($3) ? REPLACE_SKIP : (defined($4) ? REPLACE_WARN : SKIP_ADD)));
-            }
-            dprint(2, "#$gLnum: `$gLine'");
-            $_ = "$gHandlestr $gLine";
+
+        next if !/^\s*OVERRIDE_(?:(END)|(REPLACE\/ADD)|(REPLACE\/SKIP)|(REPLACE\/WARN)|SKIP\/ADD)\s*$/i;
+
+        # Override configuration keyword
+        $_ = "$gHandlestr $_";
+        next if $gRomid && ($gImgid != $gRomidCmp);
+        if (defined($1)) {
+            # OVERRIDE_END
+            pop(@oconfstack);
+        } else {
+            # OVERRIDE_REPLACE/ADD|REPLACE/SKIP|REPLACE/WARN|SKIP/ADD
+            push(@oconfstack, defined($2) ? REPLACE_ADD : (defined($3) ? REPLACE_SKIP : (defined($4) ? REPLACE_WARN : SKIP_ADD)));
         }
-        elsif ($parse == 1 && $gKeyword =~ /-override/i) {
-            # Override entry
-            dprint(2, "#$gLnum: `$gLine'");
-            push(@overrides, [$gLnum - 1, $gRomid, $oconfstack[$#oconfstack]]);
-        }
-        elsif ($parse == 1 && $gKeyword =~ FILESPECKEYWORD) {
-            # Normal file specification entry
-            $targets{lc("$gTarget/$gRomid")} = $gLnum - 1;
-            $romelemcnt[$gRomid]++;
-        }
+        dprint(2, "#$gLnum: `$gLine'");
     }
 
     # Loop through all overrides and handle them
@@ -138,64 +139,50 @@
 
     foreach (@overrides)
     {
-        my ($lnum, $romid, $type) = @{$_};
-        parse_keyline(${$obydata}[$lnum], 1);
-        dprint(2, "Handling    : `$gLine' ($romid, " . ("REPLACE/ADD", "REPLACE/SKIP", "REPLACE/WARN", "SKIP/ADD")[$type] . ")");
-        ${$obydata}[$lnum] = "$gHandlestr $gLine";
-        (my $target = $gTarget) =~ s/^"(.*)"$/$1/;
+        my ($tlnum, $olnum, $type) = (0, @$_);
+        parse_keyline(${$obydata}[$olnum]);
+        dprint(2, "Handling    : `$gLine' (" . ("REPLACE/ADD", "REPLACE/SKIP", "REPLACE/WARN", "SKIP/ADD")[$type] . ")");
+        ${$obydata}[$olnum] = "$gHandlestr ${$obydata}[$olnum]";
 
-        if (exists($targets{lc("$target/$romid")})) {
+        if (defined($tlnum = $targets{$gTgtCmp}) || defined($tlnum = $targets{File::Basename::basename($gTgtCmp)})) {
             # Override target found
-
             my ($line, $keyword, $source, $attrib) = ($gLine, $gKeyword, $gSource, $gAttrib);
-            parse_keyline(${$obydata}[$lnum = $targets{lc("$target/$romid")}], 1);
-            dprint(2, "Target      : `$gLine' ($romid, #" . ($lnum + 1) . ")");
+            parse_keyline(${$obydata}[$tlnum]);
+            dprint(2, "Target      : `$gLine' (#" . ($tlnum + 1) . ")");
 
             if ($type == SKIP_ADD) {
                 dprint(2, "Do nothing  : Target found and override type SKIP");
             }
-            elsif ($source =~ /^"?empty"?$/i) {
+            elsif ($source =~ /^empty$/i) {
                 # Empty keyword -> comment line out
-                ${$obydata}[$lnum] = "$gHandlestr $gLine";
-                dprint(1, "Remove ROM_IMAGE[$romid] `$gLine' due to `$line'");
-                dprint(2, "Replace with: `${$obydata}[$lnum]' (Override source EMPTY)");
+                ${$obydata}[$tlnum] = "$gHandlestr ${$obydata}[$tlnum]";
+                dprint(1, "Remove `$gLine' due to `$line'");
+                dprint(2, "Replace with: `${$obydata}[$tlnum]' (Override source EMPTY)");
             }
             else {
                 # Replace existing line with new line
-                $keyword =~ s/-override//i;
+                $keyword =~ s/-?override$//i;
                 $attrib = ($attrib eq "" ? $gAttrib : ($attrib =~ /^\s*empty$/i ? "" : $attrib));
-                $line = ${$obydata}[$lnum] = "$keyword=$source  $gTarget$attrib\n";
-                dprint(1, "Replace ROM_IMAGE[$romid] `$gLine' with `$line'");
+                $line = ${$obydata}[$tlnum] = ($keyword ne "" ? $keyword : $gKeyword) .
+                    ($source  =~ /\s/ ? "=\"$source\"" : "=$source") . "  " .
+                    ($gTarget =~ /\s/ ? "\"$gTarget\"" : $gTarget) . "$attrib\n";
+                dprint(1, "Replace `$gLine' with `$line'");
                 dprint(2, "Replace with: `$line'");
             }
         }
-        else {
-            # Override target not found
-
-            if (!$romelemcnt[$romid] && $type != REPLACE_ADD && $type != SKIP_ADD) {
-                # Ignore override non-XXX/ADD targets on empty ROM_IMAGE sections
-                dprint(2, "Do nothing  : Target not found, override target's ROM_IMAGE[$romid] section is empty");
-                next;
-            }
-            # Check if override target exists in different ROM section
-            my $warn = "";
-            foreach my $tromid (0 .. 7) {
-                $warn = "Override target `$target' found from ROM_IMAGE[$tromid] while override is for ROM_IMAGE[$romid]", last
-                    if exists($targets{lc("$target/$tromid")});
-            }
+        else { # Override target not found
             if ($type == REPLACE_SKIP) {
-                dprint(2, "Do nothing  : Target not found " . ($warn ? "from ROM_IMAGE[$romid] " : "") . "and override type SKIP");
+                dprint(2, "Do nothing  : Target not found and override type SKIP");
             }
             elsif ($type == REPLACE_WARN) {
-                dprint(-3, $warn ? "$warn, ignoring `$target'" : "Ignoring override target `$target', target not found");
+                dprint(-3, "Ignoring override target `$gTarget', target not found");
                 dprint(2, "Do nothing  : Target not found and override type WARN");
             }
             else {
                 # OVERRIDE_XXX/ADD
-                (my $line = $gLine) =~ s/^(\S+?)-override/$1/i;
-                ${$obydata}[$lnum] = $line;
-                dprint(-3, $warn) if $warn;
-                dprint(1, "Add ROM_IMAGE[$romid] `$line' from `$gLine'");
+                (my $line = $gLine) =~ s/^(\S*?)-?override/$1/i;
+                $line = ${$obydata}[$olnum] = ($1 ne "" ? "" : "data") . $line;
+                dprint(1, "Add `$line' from `$gLine'");
                 dprint(2, "Add new     : `$line' (Target not found, override type ADD)");
             }
         }
--- a/imgtools/imaker/buildrom_plugins/plugincommon.pm	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/buildrom_plugins/plugincommon.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -21,6 +21,8 @@
 
 use strict;
 use warnings;
+use Cwd;
+use File::Basename;
 
 use constant FILESPECSTATEMENT => qr/^\s*(\S+?)\s*[=\s]\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))(\s+.+?)?\s*$/;
 
@@ -34,6 +36,10 @@
 
 use constant ROFSBITMAPFILESPECKEYWORD => qr/^(?:data|file|filecompress|fileuncompress|BITMAP|AUTO-BITMAP|COMPRESSED-BITMAP)/i;
 
+use constant HIDESTATEMENT => qr/^\s*(hide\S*?)\s*[=\s]\s*(?:"(.+?)"|(\S+))()\s*$/;
+
+use constant DIRECTORYKEYWORD => qr/^(?:alias|hide|rename)/i;
+
 
 BEGIN
 {
@@ -43,38 +49,62 @@
     @ISA     = qw(Exporter);
     @EXPORT  = qw(
         FILESPECSTATEMENT FILESPECKEYWORD FILEBITMAPSPECKEYWORD ROFSFILESPECKEYWORD ROFSBITMAPFILESPECKEYWORD
-        &dprint &plugin_init &plugin_start &plugin_end &parse_keyline &parse_obyline
+        HIDESTATEMENT DIRECTORYKEYWORD
+        &abspath &dprint &plugin_reset &plugin_init &plugin_start &plugin_end &parse_keyline &parse_obyline
         &is_entry &get_type_from_entry &get_source_from_entry &get_target_from_entry
-        $gPluginname $gLogfile $gDebug $gHandlestr
-        $gLine $gLnum $gRomid $gKeyword $gSource $gTarget $gAttrib);
+        $gPluginname $gImgid $gLogfile $gWorkdir $gDebug $gFeatvar $gHandlestr
+        $gLine $gLnum $gRomid $gRomidCmp $gKeyword $gSource $gTarget $gAttrib $gSrcCmp $gTgtCmp);
     $| = 1;
 }
 
-our ($gPluginname, $gLogfile, $gDebug, $gHandlestr) = ("", "", "", 0);
-our ($gLine, $gLnum, $gRomid, $gKeyword, $gSource, $gTarget, $gAttrib) = ("", 0, 0, "", "", "", "");
+our ($gPluginname, $gImgid, $gLogfile, $gWorkdir, $gDebug, $gFeatvar, $gHandlestr);
+our ($gLine, $gLnum, $gRomid, $gRomidCmp, $gKeyword, $gSource, $gTarget, $gAttrib, $gSrcCmp, $gTgtCmp);
 my  $duration = 0;
 
-sub dprint($$)
+sub abspath($)
 {
-    my ($log, $str) = @_;
-    $str =~ s/\n//g;
-    $str = ($log < 0 ? "Warning: " : "") . "$str\n";
+    my $path = shift();
+    eval { local $SIG{__DIE__}; $path = Cwd::abs_path($path) };
+    return($path);
+}
+
+sub dprint($$;$)
+{
+    my ($log, $str, $nonl) = @_;
+    ($str = ($log < 0 ? "Warning: " : "") . $str) =~ s/\n//g;
+    $str .= "\n" if !$nonl;
     $log = abs($log);
     print($str) if (($log == 1) && !$gDebug) || (($log == 2) && $gDebug) || ($log > 2);
     print(LOG $str) if $gLogfile && ($log > 1);
 }
 
-sub plugin_init($$;$)
+sub plugin_reset()
+{
+    ($gLine, $gLnum, $gRomid, $gRomidCmp, $gKeyword, $gSource, $gTarget, $gAttrib, $gSrcCmp, $gTgtCmp) =
+        ("", 0, 0, 0, "", "", "", "", "", "");
+}
+
+sub plugin_init($$$)
 {
-    ($gPluginname, $gDebug, my $start) = @_;
-    $gDebug = "" if !defined($gDebug);
-    $gDebug =~ s/^(?:(.*?);|(.*))//;
-    $gLogfile = (defined($1) ? $1 : $2);
-    my $warn = "";
+    my ($pluginfo, $opt, $start) = @_;
+    $gPluginname = "$pluginfo->{name}.pm";
+    plugin_reset();
+    ($gImgid, $gLogfile, $gWorkdir, $gDebug, $gFeatvar, my $warn) = (0, "", undef, 0, "", "");
+    foreach (split(/;+/, $opt)) {
+        if    (s/^\s*-i//i) { $gImgid   = (/^CORE$/ ? 0 : (/^ROFS(\d)$/ ? $1 : -1)) }
+        elsif (s/^\s*-l//i) { $gLogfile = abspath(File::Basename::dirname($_)) . "/" . File::Basename::basename($_) }
+        elsif (s/^\s*-w//i) { $gWorkdir = abspath($_)  }
+        elsif (s/^\s*-d//i) { $gDebug   = ($_ ? 1 : 0) }
+        elsif (s/^\s*-f//i) { $gFeatvar = $_ }
+        else  { $warn .= ", `$_'" }
+    }
+    $warn = "Unknown parameter(s):$warn." if ($warn =~ s/^,//);
     (open(LOG, ">>$gLogfile") or
-        ($warn = "Can't write to `$gLogfile'.", $gLogfile = "")) if $gLogfile;
+        (($warn .= ($warn ? " " : "") . "Can't write to `$gLogfile'."), $gLogfile = "")) if $gLogfile;
     dprint(3, "$gPluginname: " . ($start ? "-" x (77 - length($gPluginname)) :
-        "Initializing; logfile = `$gLogfile', debug = " . ($gDebug ? 1 : 0)));
+        "Initializing; $pluginfo->{invocation}, image id = " . ($gImgid < 0 ? "d" : $gImgid) .
+        ", logfile = `$gLogfile'" . (defined($gWorkdir) ? ", workdir = `$gWorkdir'" : "") .
+        ", debug = $gDebug" . ($gFeatvar ne "" ? ", feature variant = `$gFeatvar'" : "")));
     dprint(-3, $warn) if $warn;
     close(LOG) if !$start;
 }
@@ -83,7 +113,7 @@
 {
     $duration = time();
     plugin_init(shift(), shift(), 1);
-    ($gHandlestr, $gLnum, $gRomid) = ("REM handled $gPluginname:", 0, 0);
+    $gHandlestr = "REM handled $gPluginname:";
 }
 
 sub plugin_end()
@@ -93,27 +123,29 @@
     close(LOG);
 }
 
-sub get_keyline($)
+sub parse_keyline(;$)
 {
-    my $quote = shift();
+    ($gLine = shift()) =~ s/^\s+|\s+$//g if defined($_[0]);
+    return(-1) if ($gLine !~ FILESPECSTATEMENT) && ($gLine !~ HIDESTATEMENT);
     ($gKeyword, $gSource, $gTarget, $gAttrib) =
-        ($1, defined($2) ? ($quote ? "\"$2\"" : $2) : $3, defined($4) ? ($quote ? "\"$4\"" : $4) : $5, defined($6) ? $6 : "");
+        ($1, defined($2) ? $2 : $3, defined($4) ? $4 : $5, defined($6) ? $6 : "");
+    ($gSrcCmp, $gTgtCmp) = (lc($gSource), lc($gTarget));
+    ($gTgtCmp = ($gKeyword =~ DIRECTORYKEYWORD ? $gSrcCmp : $gTgtCmp)) =~ tr/\\/\//;
+    $gTgtCmp =~ s/^\/+//;
+    return(2);
 }
 
-sub parse_keyline($;$)
-{
-    ($gLine = shift()) =~ s/^\s+|\s+$//g;
-    get_keyline(shift()), return(1) if $gLine =~ FILESPECSTATEMENT;
-    return(0);
-}
-
-sub parse_obyline($;$)
+sub parse_obyline($)
 {
     ($gLine = shift()) =~ s/^\s+|\s+$//g;
     $gLnum++;
-    $gRomid = $1, return(2) if $gLine =~ /^REM\s+ROM_IMAGE\[(\d+)\]/i;
-    return(-1) if $gLine eq "" || $gLine =~ /^(?:#|REM\s)/i;
-    return(parse_keyline($gLine, shift()));
+    if ($gLine =~ /^REM\s+(ROM|DATA)_IMAGE\[(\d+)\]/i) {
+        $gRomid = $2;
+        $gRomidCmp = ($gImgid >= 0 ? ($1 eq "ROM" ? ($2 != 1 ? $2 : 0) : 99) : ($1 eq "DATA" ? -$2 - 1 : 99));
+        return(1);
+    }
+    return(0) if ($gLine =~ /^(?:#|REM\s)/i) || ($gLine eq "");
+    return(parse_keyline());
 }
 
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/s60ibymacros.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,123 @@
+# ============================================================================
+#  Name        : s60ibymacros.pm
+#  Part of     : build_RnD
+#  Description : S60 specific IBY file macro handling
+#  Version     : %version: 1 %
+#
+#  Copyright © 2006 Nokia.  All rights reserved.
+#  This material, including documentation and any related computer
+#  programs, is protected by copyright controlled by Nokia.  All
+#  rights are reserved.  Copying, including reproducing, storing,
+#  adapting or translating, any or all of this material requires the
+#  prior written consent of Nokia.  This material also contains
+#  confidential information which may not be disclosed to others
+#  without the prior written consent of Nokia.
+# ============================================================================
+#
+# 07.08.2006 Juha Ristimäki
+# Initial version.
+#
+
+package s60ibymacros;
+
+BEGIN
+  {
+  use Exporter ();
+  our ( $VERSION, @ISA, @EXPORT );
+  # set the version for version checking
+  $VERSION     = 1.00;
+
+  @ISA         = qw( Exporter );
+  @EXPORT      = qw( &s60ibymacros_info &DoS60IbyModifications );
+  }
+
+my %s60ibymacros_infostruct =
+  (
+  name => "s60ibymacros",
+  invocation => "InvocationPoint1",
+  single => "s60ibymacros::DoS60IbyModifications"
+  );
+
+my @newobydata;
+
+sub s60ibymacros_info
+  {
+  return \%s60ibymacros_infostruct;
+  }
+
+sub DoS60IbyModifications
+  {
+  my $obydata = shift;
+
+  undef @newobydata;
+  foreach $line (@{$obydata})
+    {
+    if ($line =~ /^\s*REM/i)
+      {
+      # Ignore REM statements, to avoid processing "REM __SCALABLE_IMAGE( ... )"
+      push @newobydata, $line;
+      }
+    elsif( ! ( HandleIconMacros($line) || HandleCenrepMacros($line) ) )
+      {
+      push @newobydata, $line;
+      }
+    }
+  @{$obydata} = @newobydata;
+  }
+
+sub HandleCenrepMacros
+  {
+  my $line = shift;
+  if ( $line =~ m/^.*__CENREP_TXT_FILES\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/i )
+  # __CENREP_TXT_FILES(dataz_, source dir, target dir)
+    {
+    my $sourcepath="$1\\$2";
+    my $targetpath=$3;
+    my $s60extras_export_list_filename = "$sourcepath"."\\s60extras_export_list.txt";
+
+    open(DH, $s60extras_export_list_filename);
+    my @dlist = <DH>;
+    chop @dlist;
+    close(DH);
+
+    my $cenreptxtfile;
+    foreach $cenreptxtfile (@dlist)
+      {
+      if ($cenreptxtfile =~ /^\S+\.txt/)
+        {
+        push @newobydata, "data=$sourcepath\\$cenreptxtfile $targetpath\\$cenreptxtfile\n";
+        }
+      }
+    return 1;
+    }
+  }
+
+sub HandleIconMacros
+  {
+  my $line = shift;
+  if ( $line =~ m/^.*__SCALABLE_IMAGE\(\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*,\s*(\S+)\s*\)/i )
+  # __SCALABLE_IMAGE(emulator directory, file rom dir, dataz_, resource rom dir,
+  #                  filename, resource filename)
+    {
+      
+    my $sourcepath="$1\\$2";
+    my $targetpath=$3;
+    my $filename=$4;
+
+    if( -e "$sourcepath\\$filename.mbm" )
+      {
+      push @newobydata, "AUTO-BITMAP=$sourcepath\\$filename.mbm $targetpath\\$filename.mbm\n";
+      }
+    if( -e "$sourcepath\\$filename.mif" )
+      {
+      push @newobydata, "data=$sourcepath\\$filename.mif $targetpath\\$filename.mif\n";
+      }
+    elsif( ! -e "$sourcepath\\$filename.mbm ")
+      {
+      print STDERR "* Invalid image file name: $sourcepath\\$filename.mbm or .mif\n";
+      }
+    return 1;
+    }
+  }
+
+1;  # Return a true value from the file
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/buildrom_plugins/stubsischeck.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,101 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Check included sis/sisx file validity.
+#
+
+
+
+package stubsischeck;
+
+use strict;
+use warnings;
+use File::Basename;
+use plugincommon;
+
+BEGIN
+{
+    use Exporter();
+    our($VERSION, @ISA, @EXPORT);
+    $VERSION = 1.00;
+    @ISA     = qw(Exporter);
+    @EXPORT  = qw(&stubsischeck_info &stubsischeck_init &stubsischeck_process);
+}
+
+my $conf;
+
+sub stubsischeck_info()
+{
+    return({
+        name       => "stubsischeck",
+        invocation => "InvocationPoint3",  # tmp9.oby
+        initialize => "stubsischeck::stubsischeck_init",
+        single     => "stubsischeck::stubsischeck_process"});
+}
+
+sub stubsischeck_init($)
+{
+    plugin_init(&stubsischeck_info, $conf = shift(), 0);
+}
+
+sub stubsischeck_process($)
+{
+    plugin_start(&stubsischeck_info, $conf);
+    my $obydata = shift();
+    my %uids = ();
+
+    dprint(3, "Finding and checking stub sis files...");
+
+    foreach (@{$obydata}) {
+        next if (parse_obyline($_) != 2)   || ($gImgid != $gRomidCmp)  ||
+            ($gKeyword !~ FILESPECKEYWORD) || ($gSrcCmp !~ /\.sisx?$/) || !-e($gSource);
+
+        my ($basename, $uiddata) = (File::Basename::basename($gSrcCmp), "");
+        dprint(2, "Checking `$gSource'", 1);
+
+        # Find out whether or not this is stub sis file
+        open(FILE, $gSource) or
+            dprint(2, ""), dprint(-3, "$gPluginname can't open `$gSource'"), next;
+        binmode(FILE);
+        sysread(FILE, $uiddata, 0x1C);
+        close(FILE);
+
+        my $uid = unpack("V", substr($uiddata, 0x00, 4));
+        if ($uid == 0x0000000D) {
+            my $puid = sprintf("0x%08X", unpack("V", substr($uiddata, 0x18, 4)));
+            dprint(2, ", pUID: $puid");
+
+            # Quick-and-dirty way to check duplicate UIDs
+            if (exists($uids{$puid}) && ($basename ne $uids{$puid})) {
+                dprint(3, "Error: `$gSource': Duplicate pUID $puid, see `$uids{$puid}'");
+            } else {
+                $uids{$puid} = $basename;
+            }
+        } elsif ($uid == 0x10201A7A) {
+            dprint(2, ": Normal (non-stub) sis file");
+        } else {
+            dprint(2, "");
+            if (unpack("V", substr($uiddata, 0x08, 4)) == 0x10000419) { # UID3
+                dprint(-3, "`$gSource': Legacy (pre Symbian 9.x) sis file");
+            } else {
+                dprint(3, "Error: `$gSource': Sis file with unknown UID ($uid)");
+            }
+        }
+    }
+    plugin_end();
+}
+
+1;
+
+__END__ # OF STUBSISCHECK.PM
--- a/imgtools/imaker/config/example_image_conf_naming.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/config/example_image_conf_naming.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -21,4 +21,4 @@
 ROFS2_DIR  = $(WORKDIR)/$(TYPE)/langpack/$(LANGPACK_NAME)
 ROFS2_NAME = $(PRODUCT_TYPE).$(BUILD_NUMBER)_$(LANGPACK_ID)_$(TYPE)
 
-LANGPACK_SWVERINFO = $(CORE_VERSION).$(LANGPACK_ID)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n(c) $(PRODUCT_MANUFACT)
+LANGPACK_SWVERINFO = $(CORE_VERSION).$(LANGPACK_ID)\n$(DAY)-$(MONTH)-$(YEAR2)\n(c) $(PRODUCT_MANUFACT)
Binary file imgtools/imaker/doc/S60_iMaker_User_Guide.pdf has changed
Binary file imgtools/imaker/doc/iMaker_User_Guide.pdf has changed
--- a/imgtools/imaker/group/bld.inf	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -18,26 +18,29 @@
 
 PRJ_EXPORTS
 
+../src/imaker                                           +/tools/ //
 ../src/imaker.cmd                                       +/tools/ //
 ../src/imaker.mk                                        +/tools/rom/imaker/ //
 ../src/imaker.pl                                        +/tools/rom/imaker/ //
-../src/imaker.pm                                        +/tools/rom/imaker/ //
-../src/imaker_public.mk                                 +/tools/rom/imaker/ //
-../src/imaker_version.mk                                +/tools/rom/imaker/ //
-
 ../src/imaker_core.mk                                   +/tools/rom/imaker/ //
+../src/imaker_emmc.mk                                   +/tools/rom/imaker/ //
+../src/imaker_fat.mk                                    +/tools/rom/imaker/ //
 ../src/imaker_help.mk                                   +/tools/rom/imaker/ //
 ../src/imaker_image.mk                                  +/tools/rom/imaker/ //
+../src/imaker_memcard.mk                                +/tools/rom/imaker/ //
 ../src/imaker_minienv.mk                                +/tools/rom/imaker/ //
 ../src/imaker_odp.mk                                    +/tools/rom/imaker/ //
+../src/imaker_rofs.mk                                   +/tools/rom/imaker/ //
 ../src/imaker_rofs2.mk                                  +/tools/rom/imaker/ //
 ../src/imaker_rofs3.mk                                  +/tools/rom/imaker/ //
 ../src/imaker_rofs4.mk                                  +/tools/rom/imaker/ //
+../src/imaker_smr.mk                                    +/tools/rom/imaker/ //
 ../src/imaker_tools.mk                                  +/tools/rom/imaker/ //
 ../src/imaker_uda.mk                                    +/tools/rom/imaker/ //
 ../src/imaker_variant.mk                                +/tools/rom/imaker/ //
+../src/imaker_version.mk                                +/tools/rom/imaker/ //
 
-// GNU make port to mingw32 (http://www.mingw.org/)
+// GNU make port to mingw32 (http://sourceforge.net/projects/mingw/files/ -> GNU Make)
 ../bin/mingw_make.exe                                   +/tools/rom/imaker/ //
 
 // Buildrom plugins
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+#!/bin/bash
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker wrapper for Linux (Bash)
+#
+
+
+export IMAKER_CMDARG=
+for arg in "$@"; do
+    if [ -z "$IMAKER_CMDARG" ]; then IMAKER_CMDARG="'$arg'"
+    else IMAKER_CMDARG="$IMAKER_CMDARG '$arg'"; fi
+done
+if [ -z "$IMAKER_DIR" ]; then
+    export IMAKER_DIR="`dirname "$0"`/rom/imaker"
+    if [ -e "`dirname "$0"`/imaker.pl" ]; then IMAKER_DIR="`dirname "$0"`"; fi
+fi
+export IMAKER_TOOL="$0"
+
+if [ -z "$PERL" ]; then export PERL="perl"; fi
+$PERL -x "$IMAKER_DIR/imaker.pl"
+IMAKER_ERROR=$?
+
+if [ $IMAKER_ERROR -ne 0 ]; then
+    $PERL -v >/dev/null 2>&1
+    if [ $? -ne 0 ]; then
+        echo "Perl is not properly installed! Environment variable PERL can be used to set the Perl exe."
+    fi
+fi
+
+exit $IMAKER_ERROR
+
+# END OF IMAKER
--- a/imgtools/imaker/src/imaker.cmd	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker.cmd	Wed Jun 30 11:35:58 2010 +0800
@@ -1,39 +1,40 @@
-@echo off
-rem
-rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
-rem All rights reserved.
-rem This component and the accompanying materials are made available
-rem under the terms of the License "Eclipse Public License v1.0"
-rem which accompanies this distribution, and is available
-rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
-rem
-rem Initial Contributors:
-rem Nokia Corporation - initial contribution.
-rem
-rem Contributors:
-rem
-rem Description: iMaker wrapper for Windows
-rem
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of the License "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description: iMaker wrapper for Windows
+@rem
 
 
+@echo off
 setlocal
-set MAKE=
 set IMAKER_CMDARG=%*
-if "%EPOCROOT%"==""         set EPOCROOT=\
-if "%CONFIGROOT%"==""       set CONFIGROOT=%EPOCROOT%epoc32\rom\config
-if "%ITOOL_DIR%"==""        set ITOOL_DIR=%EPOCROOT%epoc32\tools\rom
-if "%IMAKER_DIR%"==""       set IMAKER_DIR=%ITOOL_DIR%\imaker
-if "%IMAKER_MAKE%"==""      set IMAKER_MAKE=%IMAKER_DIR%\mingw_make.exe
-if "%IMAKER_MAKESHELL%"=="" set IMAKER_MAKESHELL=%COMSPEC%
-if "%IMAKER_MAKESHELL%"=="" set IMAKER_MAKESHELL=cmd.exe
-if "%IMAKER_CYGWIN%"==""    set IMAKER_CYGWIN=0
-if "%PERL%"==""             set PERL=perl
+if "%IMAKER_DIR%"=="" (
+    set IMAKER_DIR=%~dp0rom\imaker
+    if exist %~dp0imaker.pl set IMAKER_DIR=%~dp0
+)
+set IMAKER_TOOL=%~f0
+
+if "%PERL%"=="" set PERL=perl
 call %PERL% -x %IMAKER_DIR%\imaker.pl
 set IMAKER_ERROR=%errorlevel%
-if %IMAKER_ERROR% geq 1 (
+
+if %IMAKER_ERROR% neq 0 (
     call %PERL% -v >nul 2>&1
-    if errorlevel 1 echo Perl is not properly installed! Environment variable PERL can be used to set the Perl exe.
+    if errorlevel 1 (
+        echo Perl is not properly installed! Environment variable PERL can be used to set the Perl exe.
+    )
 )
+
 if 0%IMAKER_EXITSHELL% equ 0 exit /b %IMAKER_ERROR%
 exit %IMAKER_ERROR%
 endlocal
--- a/imgtools/imaker/src/imaker.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -32,8 +32,6 @@
 empty    :=
 space    := $(empty) #
 $(space) := $(space)
-squot    := '\''
-'        := '\''
 \t       := $(empty)	# Tabulator!
 
 # Newline
@@ -71,10 +69,11 @@
 firstwords  = $(if $2,$(wordlist 1,$(words $(wordlist $1,$(words $2),$2)),$2),$(wordlist 1,$(words $(wordlist 2,$(words $1),$1)),$1))
 restwords   = $(if $2,$(wordlist $1,$(words $2),$2),$(wordlist 2,$(words $1),$1))
 restelems   = $(call restoreelem,$(subst $( ),|,$(call restwords,$1,$(call getwords,$2))))
+findword    = $(and $1,$2,$(if $(filter $1,$(word 1,$2)),$(words $3 +),$(call findword,$1,$(call restwords,$2),$3 +)))
 substm      = $(eval __i_str := $3)$(strip $(foreach w,$1,$(eval __i_str := $(subst $w,$2,$(__i_str)))))$(__i_str)
 substs      = $(subst $(ichar)\,$2,$(subst $1,$2,$(subst $2,$(ichar)\,$3)))
-quote       = $(call substs,\t,\\\t,$(call substs,\n,\\\n,$1))
-quoteval    = $(subst \#,\\\#,$(subst $$,$$$$,$1))
+quote       = $(call substs,\t,\\t,$(call substs,\n,\\n,$1))
+quoteval    = $(subst \#,\\#,$(subst $$,$$$$,$1))
 sstrip      = $(subst $( ),,$(strip $1))
 
 strlen = $(call _str2chars,$1)$(words $(__i_str))
@@ -84,43 +83,44 @@
   $(foreach c,$(charset)$(ichar),$(eval __i_str := $(subst $c,$c ,$(__i_str)))))
 
 tr =\
-  $(strip $(eval __i_tr := $3)\
-  $(foreach c,\
-    $(join $(addsuffix :,$1),$2),\
-    $(eval __i_tr := $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__i_tr))))$(__i_tr))
+  $(strip $(eval __i_tr := $(subst $( ),$(ichar),$3))\
+  $(foreach c,$(join $(addsuffix :,$1),$2),\
+    $(eval __i_tr := $(subst $(word 1,$(subst :, ,$c)),$(word 2,$(subst :, ,$c)),$(__i_tr)))))$(subst $(ichar),$( ),$(__i_tr))
 
-pquote      = q$(pchar)$1$(pchar)
-peval       = @PEVAL{$(call substs,|,\|,$1)}LAVEP@
-phex        = $(call peval,sprintf(q(%0$(if $2,$2,8)X),$(subst 0x0x,0x,$1)))
-pabs2rel    = $(call peval,GetRelFname($(call pquote,$1$), $(call pquote,$2)))
-pfilesize   = $(call peval,-s $(call pquote,$1) || 0)
-prepeat     = $(call peval,$(call pquote,$2) x ($1))
-pstr2xml    = $(call peval,Str2Xml($(call pquote,$1)))
-pmatch      = $(call peval,$(call pquote,$1) =~ m$(pchar)$2$(pchar)m $(if $3,$3,&& $$1 || q(???)))
-pgrep       = $(call peval,\
+pquote    = q$(pchar)$1$(pchar)
+peval     = @PEVAL{$(call substs,|,\|,$1)}LAVEP@
+phex      = $(call peval,Int2Hex($(subst 0x0x,0x,$1),$2))
+pfilesize = $(call peval,-s $(call pquote,$1) || 0)
+prepeat   = $(call peval,$(call pquote,$2) x ($1))
+pstr2xml  = $(call peval,Str2Xml(Quote($(call pquote,$1))))
+pmatch    = $(call peval,$(call pquote,$1) =~ m$(pchar)$(subst \\,\,$2)$(pchar)m $(if $3,$3,&& $$1 || q(???)))
+pgrep     = $(call peval,\
   $(eval __i_notfound := $(call pquote,$(if $4,$4,???)))\
   open(F, $(call pquote,$1)) or return($(__i_notfound));\
   $$_ = $(if $2,Uni2Ascii)(join(q(), <F>));\
   $$_ = Quote($(if $3,m$(pchar)$3$(pchar)m ? $$1 : $(__i_notfound),$$_));\
-  s/\n/\\\n/g; s/\t/\\\t/g;\
   close(F); return($$_))
 
-getlastdir = $(foreach file,$1,$(notdir $(patsubst %/,%,$(file))))
-upddrive   = $(if $2,$2,$(EPOCDRIVE))$(if $(filter %:,$(call substr,1,2,$1)),$(call substr,3,,$1),$1)
-dir2inc    = $(foreach dir,$1,-I$(call upddrive,$(dir)))
-findfile   = $(foreach file,$1,$(eval __i_ffile := $(call _findfile,$(addsuffix /$(file),$2)))$(if $(__i_ffile),$(__i_ffile),$(file)))
-_findfile  = $(if $1,$(eval __i_ffile := $(wildcard $(word 1,$1)))$(if $(__i_ffile),$(__i_ffile),$(call _findfile,$(call restwords,$1))))
+getlastdir  = $(foreach file,$1,$(notdir $(patsubst %/,%,$(file))))
+upddrive    = $(if $2,$2,$(EPOCDRIVE))$(if $(filter %:,$(call substr,1,2,$1)),$(call substr,3,,$1),$1)
+updoutdrive = $(call upddrive,$1,$(OUTDRIVE))
+dir2inc     = $(foreach dir,$1,-I$(call upddrive,$(dir)))
+findfile    = $(foreach file,$1,$(eval __i_ffile := $(call _findfile,$(addsuffix /$(file),$(if $2,$2,$(FEATVAR_IDIR)))))$(if $(__i_ffile),$(__i_ffile),$(if $3,,$(file))))
+_findfile   = $(if $1,$(eval __i_ffile := $(wildcard $(word 1,$1)))$(if $(__i_ffile),$(__i_ffile),$(call _findfile,$(call restwords,$1))))
+isabspath   = $(if $(filter / \,$(if $(filter %:,$(call substr,1,2,$1)),$(call substr,3,3,$1),$(call substr,1,1,$1))),$1)
+includechk  = $(foreach file,$(subst \ ,$(ichar),$1),\
+  $(if $(wildcard $(subst $(ichar),\ ,$(file))),$(eval include $(subst $(ichar),\ ,$(file))),\
+    $(error File `$(subst $(ichar), ,$(file))' not found.$(\n)MAKEFILE_LIST =$(MAKEFILE_LIST))))
 
 filterwcard = $(shell $(PERL) -Xe '\
   (my $$re = q$(ichar)$1$(ichar)) =~ s/(.)/{q(*)=>q(.*),q(?)=>q(.),q([)=>q([),q(])=>q(])}->{$$1} || qq(\Q$$1\E)/ge;\
     print(map(qq( $$_), sort({lc($$a) cmp lc($$b)} grep(/^$$re$$/, split(/\s+/, q$(ichar)$2$(ichar))))))')
 
-cppdef2var =\
-  $(if $(wildcard $1),\
-    $(eval __i_def2var := $(shell $(PERL) -Xe '\
-      print(join(q(|), map(/^\s*\#define\s+(\S+)\s*(.*?)\s*$$/ ? qq($$1?=) . ($$2 eq q() ? 1 : $$2) : (),\
-        sort({lc($$a) cmp lc($$b)} qx$(pchar)$(CPP) -nostdinc -undef -dM $(call dir2inc,$2) $(call upddrive,$1)$(pchar)))))'))\
-    $(foreach assign,$(call getwords,$(__i_def2var)),$(eval $(call restoreelem,$(assign)))),\
+cppdef2var = $(if $(wildcard $1),\
+  $(foreach assign,$(call getwords,$(shell $(CPP) -nostdinc -undef -dM $(call dir2inc,$2) $(call upddrive,$1) |\
+    $(PERL) -Xne $(call iif,$(USE_UNIX),',")print(qq($$1?=) . ($$2 eq q() ? 1 : $$2) . q(|))\
+      if /^\s*\#define\s+($(or $(call sstrip,$3),\S+))\s*(.*?)\s*$$/$(call iif,$(USE_UNIX),',"))),\
+        $(eval $(call restoreelem,$(assign)))),\
   $(eval include $1))
 
 mac2cppdef = $(foreach def,$1,$(if\
@@ -128,8 +128,14 @@
     $(\n)$(if $(filter -D%,$(def)),\#undef  $(word 1,$(__i_def))$(\n)\#define,define ) $(word 1,$(__i_def)) $(word 2,$(__i_def)),\
   $(if $(filter -U%,$(def)),$(\n)\#undef $(patsubst -U%,%,$(def)))))
 
-EPOCDRIVE   := $(eval EPOCDRIVE := $(call substr,1,2,$(CURDIR)))$(if $(filter %:,$(EPOCDRIVE)),$(EPOCDRIVE))
-EPOC32      := $(patsubst %/,%,$(subst \,/,$(EPOCROOT)))/epoc32
+USE_UNIX    := $(if $(findstring cmd.exe,$(call lcase,$(SHELL)))$(findstring mingw,$(call lcase,$(MAKE))),0,1)
+DONOTHING   := $(call iif,$(USE_UNIX),\#,rem)
+NULL        := $(call iif,$(USE_UNIX),/dev/null,nul)
+PATHSEPCHAR := $(call iif,$(USE_UNIX),:,;)
+CURDIR      := $(CURDIR:/=/.)
+EPOCDRIVE   := $(or $(filter %:,$(call substr,1,2,$(EPOCROOT))),$(filter %:,$(call substr,1,2,$(CURDIR))))
+EPOC_ROOT   := $(patsubst %/,%,$(subst \,/,$(if $(filter %:,$(call substr,1,2,$(EPOCROOT))),,$(EPOCDRIVE))$(EPOCROOT)))
+EPOC32      := $(EPOC_ROOT)/epoc32
 E32ROM      := $(EPOC32)/rom
 E32ROMCFG   := $(E32ROM)/config
 E32ROMINC   := $(E32ROM)/include
@@ -138,18 +144,15 @@
 E32INCCFG   := $(E32INC)/config
 E32TOOLS    := $(EPOC32)/tools
 E32GCCBIN   := $(EPOC32)/gcc/bin
-
-ITOOL_DIR   ?= $(E32TOOLS)/rom
-ITOOL_PATH  :=
-IMAKER_DIR  ?= $(ITOOL_DIR)/imaker
-IMAKER_TOOL := $(IMAKER_DIR)/imaker.pl
+E32DATA     := $(EPOC32)/data
+E32DATAZ    := $(E32DATA)/z
 
-CPP       ?= $(if $(wildcard $(E32TOOLS)/scpp.exe),$(E32TOOLS)/scpp.exe,cpp)
-PERL      ?= perl
-PYTHON    ?= python
-USE_UNIX  := $(if $(findstring cmd.exe,$(call lcase,$(SHELL)))$(findstring mingw,$(call lcase,$(MAKE))),0,1)
-NULL      := $(call iif,$(USE_UNIX),/dev/null,nul)
-DONOTHING := $(call iif,$(USE_UNIX),\#,rem)
+IMAKER_TOOL     := $(IMAKER_DIR)/imaker.pl
+IMAKER_CONFMK    =
+IMAKER_DEFAULTMK = $(call findfile,image_conf_default.mk,,1)
+
+CPP    ?= cpp
+PYTHON ?= python
 
 YEAR  := $(call substr,1,4,$(TIMESTAMP))
 YEAR2 := $(call substr,3,4,$(TIMESTAMP))
@@ -157,18 +160,33 @@
 DAY   := $(call substr,7,8,$(TIMESTAMP))
 WEEK  := $(call substr,15,,$(TIMESTAMP))
 
-CURDIR := $(call substr,$(call select,$(call substr,1,2,$(CURDIR)),$(EPOCDRIVE),3,1),,$(CURDIR))
-CURDIR := $(CURDIR:/=/.)
-USER   := $(or $(USERNAME),$(shell $(PERL) -Xe 'print(getlogin())'))
+.DEFAULT_GOAL = help
+DEFAULT_GOALS =
 
-MAKECMDGOALS ?= $(.DEFAULT_GOAL)
-TARGET        = $(word 1,$(MAKECMDGOALS))
-TARGETNAME    = $(word 1,$(subst -, ,$(TARGET)))
-TARGETID      = $(subst $( ),_,$(call restwords,$(subst _, ,$(TARGETNAME))))
-TARGETEXT     = $(findstring -,$(TARGET))$(subst $( ),-,$(call restwords,$(subst -, ,$(TARGET))))
+TARGET      = $(word 1,$(subst [, [,$(MAKECMDGOALS)))
+TARGETNAME  = $(word 1,$(subst -, ,$(TARGET)))
+TARGETID    = $(subst $( ),_,$(call restwords,$(subst _, ,$(TARGETNAME))))
+TARGETID1   = $(word 2,$(subst _, ,$(TARGETNAME)))
+TARGETID2   = $(word 3,$(subst _, ,$(TARGETNAME)))
+TARGETID2-  = $(subst $( ),_,$(call restwords,3,$(subst _, ,$(TARGETNAME))))
+TARGETID3   = $(word 4,$(subst _, ,$(TARGETNAME)))
+TARGETID3-  = $(subst $( ),_,$(call restwords,4,$(subst _, ,$(TARGETNAME))))
+TARGETEXT   = $(addprefix -,$(subst $( ),-,$(call restwords,$(subst -, ,$(TARGET)))))
+TARGETEXT2  = $(word 3,$(subst -, ,$(TARGET)))
+TARGETEXT2- = $(addprefix -,$(subst $( ),-,$(call restwords,3,$(subst -, ,$(TARGET)))))
+TARGETEXT3  = $(word 4,$(subst -, ,$(TARGET)))
+TARGETEXT3- = $(addprefix -,$(subst $( ),-,$(call restwords,4,$(subst -, ,$(TARGET)))))
+
+TOPTARGET     = $(TARGET)
+TOPTARGETNAME = $(word 1,$(subst -, ,$(TOPTARGET)))
+TOPTARGETID   = $(subst $( ),_,$(call restwords,$(subst _, ,$(TOPTARGETNAME))))
+TOPTARGETEXT  = $(addprefix -,$(subst $( ),-,$(call restwords,$(subst -, ,$(TOPTARGET)))))
+
+TARGET_EXPORT = TOPTARGET? IMAGE_TYPE
 
 CLEAN     = 1
 BUILD     = 1
+FILTERCMD =
 KEEPGOING = 0
 KEEPTEMP  = 0
 PRINTCMD  = 0
@@ -177,35 +195,38 @@
 SKIPPOST  = 0
 VERBOSE   = 1
 
-CONFIGROOT ?= $(E32ROMCFG)
+NAME       = imaker
+WORKDIR    = $(CURDIR)
+WORKTMPDIR = $($(or $(addsuffix _,$(IMAGE_TYPE)),WORK)DIR)/temp# To be removed!
 
-LABEL      =
-NAME       = $(PRODUCT_NAME)$(LABEL)
-WORKDIR    = $(if $(PRODUCT_NAME),$(E32ROMBLD)/$(PRODUCT_NAME),$(CURDIR))
-WORKPREFIX = $(WORKDIR)/$(NAME)
-WORKNAME   = $(WORKPREFIX)
+OUTDIR     = $(WORKDIR)
+OUTPREFIX  = $(OUTDIR)/$(NAME)# Temporary?
+OUTDRIVE   = $(or $(filter %:,$(call substr,1,2,$(OUTDIR))),$(filter %:,$(call substr,1,2,$(CURDIR))))
+OUTTMPDIR  = $($(or $(addsuffix _,$(IMAGE_TYPE)),OUT)DIR)/temp
 
-CLEAN_WORKAREA  = del | $(WORKDIR)/* | deldir | $(WORKDIR)/*
-ALL.CLEAN.STEPS = $(ALL.IMAGE.STEPS) WORKAREA
+ALL.CLEAN.STEPS = $(ALL.IMAGE.STEPS)
 
 
 ###############################################################################
 #
 
-CMDFILE = $(WORKPREFIX)$(if $(notdir $(WORKPREFIX)),_)$(call substm,* : ?,@,$(TARGET)).icmd
-#LOGFILE = $(if $(IMAGE_TYPE),$($(IMAGE_TYPE)_PREFIX)_$(call lcase,$(IMAGE_TYPE))_imaker,$(WORKDIR)/log/$(basename $(notdir $(CMDFILE)))).log
-export LOGFILE ?= $(WORKDIR)/log/$(basename $(notdir $(CMDFILE))).log
+LOGFILE = $($(or $(addsuffix _,$(IMAGE_TYPE)),WORK)PREFIX)_imaker_$(call substm,* / : ? \,@,$(TARGET)).log
 
 BUILD_EMPTY = echo-q | Empty target, nothing to build.
 
-CLEAN_IMAKERPRE = $(CLEAN_IMAKEREVAL) | del | "$(CMDFILE)" "$(IMAKER_VARXML)"
 BUILD_IMAKERPRE =\
-  $(call testnewapi,$(strip $(API_TEST))) |\
-  $(if $(filter help% print-%,$(MAKECMDGOALS)),,$(if $(and $(IMAKER_VARXML),$(IMAKER_VARLIST)),\
-    write | $(IMAKER_VARXML) | $(call def2str,$(IMAKER_XMLINFO))))
+  $(BUILD_TOOLSET) |\
+  logfile   | "$(LOGFILE)" |\
+  filtercmd | $(FILTERCMD)
 
-IMAKER_VARXML  = $(if $(IMAGE_TYPE),$($(IMAGE_TYPE)_PREFIX)_$(TARGET)_config.xml)
-IMAKER_VARLIST = NAME WORKDIR
+CLEAN_IMAKERPOST = $(call iif,$(KEEPTEMP),,deldir | "$(OUTTMPDIR)" |) del | "$(IMAKER_VARXML)"
+BUILD_IMAKERPOST = $(and $(subst IMAKERPRE EMPTY IMAKERPOST,,$(IMAKER_STEPS)),$(IMAKER_VARXML),$(IMAKER_VARLIST),\
+  write | "$(IMAKER_VARXML)" | $(call def2str,$(IMAKER_XMLINFO))\n)
+
+IMAKER_VARXML  = $(if $(IMAGE_TYPE),$($(IMAGE_TYPE)_PREFIX)_$(TARGET).iconfig.xml)
+IMAKER_VARLIST = PRODUCT_NAME TYPE\
+  $(and $(IMAGE_TYPE),$(filter $(call lcase,$(IMAGE_TYPE) $(IMAGE_TYPE))-%,$@),\
+    $(addprefix $(IMAGE_TYPE)_,NAME ID VERSION DIR IMG))
 
 define IMAKER_XMLINFO
   <?xml version="1.0" encoding="utf-8"?>
@@ -217,101 +238,64 @@
   </build>
 endef
 
-BUILD_PRINTVAR = $(call peval,DPrint(1,\
-  $(foreach var1,$(subst $(,), ,$(subst print-,,$(filter print-%,$(MAKECMDGOALS)))),\
-    $(foreach var2,$(call filterwcard,$(var1),$(filter-out BUILD_PRINTVAR,$(filter $(word 1,$(call substm,* ? [, ,$(var1)))%,$(.VARIABLES)))),\
-      $(call pquote,$(var2) = `$(call def2str,$($(var2)))$').qq(\n),))); return(q()))
-
 IMAKER_EVAL = $(strip\
-  $(foreach file,$(call getwords,$(value MKFILE_LIST)),$(eval __i_file := $(call restoreelem,$(file)))$(eval -include $(__i_file)))\
-  $(foreach file,$(call getwords,$(value CPPFILE_LIST)),$(eval __i_file := $(call restoreelem,$(file)))$(call cppdef2var,$(__i_file),$(FEATVAR_IDIR)))\
   $(LANGUAGE_EVAL)\
-  $(eval ITOOL_PATH := $(if $(ITOOL_PATH),$(ITOOL_PATH)$(,))$(ITOOL_DIR)$(,))\
-  $(eval ITOOL_PATH := $(ITOOL_PATH)$(call iif,$(USE_IINTPRSIS),$(USE_IINTPRSIS)$(,))$(call iif,$(USE_IREADIMG),$(USE_IREADIMG)$(,))$(call iif,$(USE_IROMBLD),$(USE_IROMBLD)$(,)))\
-  $(eval ITOOL_PATH := $(call pathconv,$(subst $(,),$(call iif,$(USE_UNIX),:,;),$(ITOOL_PATH)$(call upddrive,$(E32TOOLS))$(,)$(call upddrive,$(E32GCCBIN)))))\
-  $(eval PATH := $(ITOOL_PATH)$(call iif,$(USE_UNIX),:,;)$(PATH)))
+  $(foreach file,$(call getwords,$(value CPPFILE_LIST)),$(eval __i_file := $(call restoreelem,$(file)))$(call cppdef2var,$(__i_file),$(FEATVAR_IDIR),$(CPPFILE_FILTER))))
 
-IMAKER_CMDARG  := $(value IMAKER_CMDARG)
-IMAKER_MAKECMD := $(value IMAKER_MAKECMD)
-IMAKER_PERLCMD :=
-IMAKER_SUBMAKE :=
+IMAKER_EXPORT   = PATH
+IMAKER_PRINTVAR = 17 $$@|@ IMAKER_STEPS IMAKER_MKLEVEL IMAKER_MKRESTARTS MAKELEVEL MAKE_RESTARTS MAKEFILE_LIST CPPFILE_LIST FEATVAR_IDIR
+
+__i_evaled :=
+__i_tgtind :=
 
 define IMAKER
-  $(if $(and $(filter-out help-config,$(filter help-% print-%,$(MAKECMDGOALS))),$(IMAKER_PERLCMD)),-$(DONOTHING),
-    $(if $(IMAKER_PERLCMD),,$(IMAKER_EVAL))
-    $(eval __i_steps := $1)
-    $(if $(findstring |,$(__i_steps)),
-      $(eval IMAKER_PERLCMD := -)
-      $(foreach target,$(call getwords,$(__i_steps)),$(if $(call restoreelem,$(target)),
-        $(eval IMAKER_SUBMAKE += $(words $(IMAKER_SUBMAKE) x))
-        $(subst $(MAKECMDGOALS) |,,$(IMAKER_MAKECMD) |)IMAKER_SUBMAKE="$(IMAKER_SUBMAKE)" $(call restoreelem,$(target)) $(call restwords,$(MAKECMDGOALS))$(\n))),
-      $(eval __i_steps := $(if $(strip $(__i_steps)),$(foreach step,$(__i_steps),\
-        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(word 2,$(subst :, ,$(step))))\
-        $(if $(call defined,STEPS_$(__i_step)),\
-          $(foreach step2,$(STEPS_$(__i_step)),$(if $(__i_attrib),$(word 1,$(subst :, ,$(step2))):$(__i_attrib),$(step2))),\
-          $(step))),EMPTY:b))
-      $(eval __i_steps := IMAKERPRE:cbk$(call sstrip,$(foreach step,$(__i_steps),\
-        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(word 2,$(subst :, ,$(step))))\
-        -$(__i_step):$(or $(findstring c,$(__i_attrib)),$(call iif,$(CLEAN),c))$(or $(findstring b,$(__i_attrib)),$(call iif,$(BUILD),b))\
-        $(or $(findstring k,$(__i_attrib)),$(call iif,$(KEEPGOING),k)))))
-      $(eval IMAKER_STEPS := $(__i_steps))
-      $(eval __i_steps :=\
-        $(if $(filter print-%,$(MAKECMDGOALS)),IMAKERPRE:cbk-PRINTVAR:b,\
-          $(if $(filter-out help-config,$(filter help-%,$(MAKECMDGOALS))),IMAKERPRE:cbk-HELPDYNAMIC:b-HELP:b,$(__i_steps))))
-      $(eval IMAKER_PERLCMD := $(PERL) -x $(IMAKER_TOOL)\
-        --cmdfile "$(CMDFILE)"\
-        $(if $(LOGFILE),--logfile "$(if $(word 2,$(IMAKER_SUBMAKE))$(IMAKER_PERLCMD)$(MAKE_RESTARTS),>>$(LOGFILE:>>%=%),$(LOGFILE))")\
-        $(call iif,$(PRINTCMD),--printcmd)\
-        --step "$(__i_steps)"\
-        $(if $(VERBOSE),--verbose "$(call select,$(VERBOSE),debug,127,$(VERBOSE))")\
-        $(if $(WORKDIR),--workdir "$(WORKDIR)"))
-      -$(PERL) -Xe '$(if $(wildcard $(WORKDIR)),,use File::Path; eval { mkpath(q$(ichar)$(WORKDIR)$(ichar)) };)\
-        open(ICMD, q$(ichar)>$(CMDFILE)$(ichar));\
-        $(eval __i_submake := $(words $(IMAKER_SUBMAKE)))\
-        print(ICMD $(foreach var,IMAKER_VERSION IMAKER_CMDARG IMAKER_MAKECMD IMAKER_PERLCMD $(if $(IMAKER_SUBMAKE),IMAKER_SUBMAKE|__i_submake)\
-          IMAKER_EXITSHELL SHELL MAKE MAKEFLAGS MAKECMDGOALS $$@|@ MAKELEVEL MAKE_RESTARTS MAKEFILE_LIST .INCLUDE_DIRS FEATVAR_IDIR CPPFILE_LIST\
-          EPOCROOT ITOOL_DIR IMAKER_DIR ITOOL_PATH PATH,\
-          sprintf(qq(\# %-17s),q($(word 1,$(subst |, ,$(var))))).q$(ichar)= `$($(or $(word 2,$(subst |, ,$(var))),$(var)))$'$(ichar).qq(\n),));\
-        close(ICMD)'
-      $(foreach step,$(subst -, ,$(__i_steps)),\
-        $(eval __i_step := $(word 1,$(subst :, ,$(step))))$(eval __i_attrib := $(subst $(__i_step),,$(step)))\
-        $(eval __i_clean := $(findstring c,$(__i_attrib)))$(eval __i_build := $(findstring b,$(__i_attrib)))\
-        -$(PERL) -Xe 'open(ICMD, q$(ichar)>>$(CMDFILE)$(ichar));\
-          print(ICMD qq(\n)\
-            $(if $(eval __i_imgtype := $(IMAGE_TYPE))$(__i_imgtype),,\
-              $(eval IMAGE_TYPE += $(foreach type,CORE ROFS2 ROFS3 ROFS4 ROFS5 ROFS6 UDA,$(findstring $(type),$(step))))\
-              $(eval IMAGE_TYPE := $(word 1,$(IMAGE_TYPE))))\
-            $(if $(__i_clean),.q$(ichar)CLEAN_$(__i_step)=$(CLEAN_$(__i_step))$(ichar).qq(\n))\
-            $(if $(__i_build),.q$(ichar)BUILD_$(__i_step)=$(BUILD_$(__i_step))$(ichar).qq(\n)));\
-            $(eval IMAGE_TYPE := $(__i_imgtype))\
-          close(ICMD)'$(\n))
-      $(IMAKER_PERLCMD)
-      $(eval IMAKER_CMDARG :=))
-  )
+  $(if $(and $(filter-out help-config,$(filter help-% print-%,$(MAKECMDGOALS))),$(__i_evaled)),,
+    $(info #iMaker$(ichar)BEGIN)
+    $(if $(__i_evaled),,$(IMAKER_EVAL))
+    $(eval __i_evaled := 1)
+    $(eval __i_steps := $(if $(MAKECMDGOALS),$1,$(or\
+      $(if $(DEFAULT_GOALS),$(if $(PRODUCT_NAME),,$(TARGET_PRODUCT)) $(DEFAULT_GOALS)),$(filter help,$(.DEFAULT_GOAL)))))
+    $(if $(call restoreelem,$(call getwords,$(__i_steps))),,$(eval __i_steps :=))
+    $(if $(__i_tgtind),$(eval __i_steps := $(call getelem,$(__i_tgtind),$(__i_steps))))
+    $(eval __i_tgts := $(subst $(__i_steps),,$(call ucase,$(__i_steps))))
+    $(if $(or $(filter-out help-config,$(filter help-% print-%,$(MAKECMDGOALS))),$(call not,$(__i_tgts))),
+      $(eval IMAKER_STEPS := $(if $(filter help% print-%,$(TARGET))$(__i_tgts),,IMAKERPRE )$(or $(strip\
+        $(eval __i_ind := $(call findword,RESTART,$(__i_steps)))$(if $(__i_ind),$(call iif,$(IMAKER_MKRESTARTS),\
+          $(call restwords,$(call restwords,$(__i_ind),$(__i_steps))),$(wordlist 1,$(__i_ind),$(__i_steps))),$(__i_steps))),EMPTY))
+      $(if $(filter-out IMAKERPRE,$(word 1,$(IMAKER_STEPS)))$(filter RESTART,$(lastword $(IMAKER_STEPS))),,
+        $(eval IMAKER_STEPS += IMAKERPOST))
+      $(eval __i_steps := $(if $(filter print-%,$(MAKECMDGOALS)),PRINTVAR,\
+        $(if $(filter-out help-config,$(filter help-%,$(MAKECMDGOALS))),HELP,$(IMAKER_STEPS))))
+      ,
+      $(if $(and $(__i_tgts),$(__i_tgtind)),$(eval IMAKER_STEPS := $(__i_steps)),
+        $(eval __i_ind :=)
+        $(eval IMAKER_STEPS :=)
+        $(foreach step,$(call getwords,$(__i_steps)),
+          $(eval __i_ind += +)
+          $(eval __i_steps := $(call restoreelem,$(step)))
+          $(if $(__i_steps),$(eval IMAKER_STEPS += $(if $(IMAKER_STEPS),|)\
+            $(if $(subst $(__i_steps),,$(call ucase,$(__i_steps))),$(__i_steps),$(TARGETNAME)[$(words $(__i_ind))])))))
+      $(eval __i_steps :=)
+    )
+    $(foreach var,VERBOSE IMAGE_TYPE KEEPGOING PRINTCMD,$(info #iMaker$(ichar)$(var)=$($(var))))
+    $(foreach var,$(sort $(IMAKER_EXPORT)),$(info #iMaker$(ichar)env $(var)=$($(var))))
+    $(foreach var,$(TARGET_EXPORT),$(info #iMaker$(ichar)var $(var)=$($(patsubst %?,%,$(or $(word 2,$(subst :, ,$(var))),$(var))))))
+    $(foreach var,$(call restwords,$(IMAKER_PRINTVAR)),$(info #iMaker$(ichar)print $(word 1,$(IMAKER_PRINTVAR))\
+      $(word 1,$(subst |, ,$(var)))=$($(or $(word 2,$(subst |, ,$(var))),$(var)))))
+    $(info #iMaker$(ichar)STEPS=$(or $(__i_steps),target:$(IMAKER_STEPS)))
+    $(foreach step,$(__i_steps),
+      $(if $(call defined,INIT_$(step)),$(info #iMaker$(ichar)INIT_$(step)=$(INIT_$(step))))
+      $(if $(call true,$(CLEAN)),$(info #iMaker$(ichar)CLEAN_$(step)=$(CLEAN_$(step))))
+      $(if $(call true,$(BUILD)),
+        $(info #iMaker$(ichar)BUILD_$(step)=$(BUILD_$(step)))
+        $(if $(REPORT_$(step)),$(info #iMaker$(ichar)REPORT_$(step)=$(REPORT_$(step)))))
+    )
+    $(info #iMaker$(ichar)END)
+  )-@$(DONOTHING)
 endef
 
 
 ###############################################################################
-# Test if old variables are in use
-
-define API_TEST
-#  OLD_VARIABLE1     NEW_VARIABLE1
-#  OLD_VARIABLEn     NEW_VARIABLEn
-
-  CUSTVARIANT_MKNAME  VARIANT_MKNAME
-  CUSTVARIANT_CONFML  VARIANT_CONFML
-  CUSTVARIANT_CONFCP  VARIANT_CONFCP
-endef
-
-testnewapi = $(if $1,\
-  $(if $(call defined,$(word 1,$1)),\
-    warning | 1 | ***************************************\n |\
-    warning | 1 | Old-style variable found: $(word 1,$1) ($(origin $(word 1,$1)))\n |\
-    warning | 1 | Instead$(,) start using $(word 2,$1)\n |)\
-  $(call testnewapi,$(call restwords,3,$1)))
-
-
-###############################################################################
 # Targets
 
 .PHONY: version clean
@@ -326,25 +310,36 @@
 clean:\
   ;@$(call IMAKER,$$(ALL.CLEAN.STEPS))
 
-print-%: ;@$(call IMAKER)
-
-step-% : ;@$(call IMAKER,$(subst -, ,$*))
+step-%: ;@$(call IMAKER,$(subst -, ,$*))
 
 #==============================================================================
 
-include $(addprefix $(IMAKER_DIR)/imaker_,$(addsuffix .mk,help image minienv public tools version))
+$(call includechk,$(addprefix $(IMAKER_DIR)/imaker_,$(addsuffix .mk,help image minienv tools version)))
+include $(wildcard $(IMAKER_DIR)/imaker_extension.mk)
+include $(wildcard $(IMAKER_EXPORTMK))
 
--include $(IMAKER_DIR)/imaker_extension.mk
-
+$(call includechk,$(LANGPACK_SYSLANGMK))
+$(call includechk,$(IMAKER_DEFAULTMK))
+$(call includechk,$(IMAKER_CONFMK))
+$(call includechk,$(BUILD_INFOMK))
+$(call includechk,$(BUILD_NAMEMK))
+$(call includechk,$(LANGPACK_MK))
+$(call includechk,$(VARIANT_MK))
+$(call includechk,$(call select,$(USE_CONE),mk,$(if $(filter cone-pre,$(TARGET)),,$(subst $( ),\ ,$(CONE_MK)))))
 
-###############################################################################
-#
+.DEFAULT_GOAL := $(if $(DEFAULT_GOALS),help,$(.DEFAULT_GOAL))
+
+%-dir: FILTERCMD = ^cd\|mkcd\|mkdir$$
+%-dir: $$* ;
 
-else
-ifeq ($(__IMAKER_MK__),1)
-__IMAKER_MK__ := 2
+$(foreach ind,1 2 3 4 5 6 7 8 9,\
+  $(eval %[$(ind)]: __i_tgtind = $(ind))\
+  $(eval %[$(ind)]: $$$$* ;))
 
--include $(IMAKER_DIR)/imaker_extension.mk
+include $(wildcard $(IMAKER_DIR)/imaker_extension.mk)
+include $(wildcard $(IMAKER_EXPORTMK))
+
+$(sort $(MAKEFILE_LIST)): ;
 
 
 ###############################################################################
@@ -352,8 +347,8 @@
 
 else
 $(error Do not include imaker.mk, it is handled by iMaker!)
-endif
 
 endif # __IMAKER_MK__
 
+
 # END OF IMAKER.MK
--- a/imgtools/imaker/src/imaker.pl	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -11,157 +11,2183 @@
 #
 # Contributors:
 #
-# Description: iMaker main Perl script
+# Description: iMaker main Perl script & common routines
 #
 
 
 
 #
-$(error >>>MAKECMDGOALS=$(MAKECMDGOALS)<<<)
+$(error |MAKE=$(MAKE)|MAKE_VERSION=$(MAKE_VERSION)|SHELL=$(SHELL)|MAKECMDGOALS=$(MAKECMDGOALS)|)
 #
 #!perl
+#line 24
+
+use subs qw(CORE::GLOBAL::die);
 
 use strict;
 use warnings;
-use Getopt::Long qw(:config pass_through no_auto_abbrev);
+use Cwd;
+use Digest::MD5 qw(md5_hex);
+use File::Basename;
+use File::Copy;
+use File::Find;
+use File::Path;
+use File::Spec;
+use File::Temp qw(tempfile);
+use POSIX qw(strftime);
+use Text::ParseWords;
+use Time::Local;
 
-my $error = "";
-my $perlver;
-my $start;
+sub InitMkglobals();
+sub PrintEnv($);
+sub Max(@);
+sub Min(@);
+sub Trim($;$);
+sub Quote($);
+sub Unquote($);
+sub Int2Hex($;$);
+sub Byte2Str($@);
+sub Str2Byte($);
+sub Str2Xml($);
+sub Ascii2Uni($);
+sub Uni2Ascii($);
+sub GetTimestamp();
+sub Sec2Min($);
+sub Wcard2Restr($);
+sub Wcard2Regex($);
+sub ParseCmdWords($);
+sub DPrint($@);
+sub Echo($$$);
+sub PathConv($;$$$);
+sub ParseFiles($);
+sub GlobFiles($;$);
+sub GetBasename($);
+sub GetDirname($);
+sub GetAbsDirname($;$$$);
+sub GetAbsFname($;$$$);
+sub GetRelFname($;$$);
+sub GetWriteFname($);
+sub GetFreeDrive(;$);
+sub SubstDrive($$);
+sub UnsubstDrive($);
+sub Search($$$$$$\@\$);
+sub Find($$$$$\$);
+sub ChangeDir($);
+sub DeleteDir($;$);
+sub FindDir($$$$);
+sub MakeDir($);
+sub MakeChangeDir($);
+sub SetWorkdir($);
+sub OpenFile(*$$;$);
+sub Test($);
+sub CutFile($$$$$);
+sub Copy($$;$);
+sub CopyIby($$);
+sub DeleteFile($;$);
+sub FindFile($$$$);
+sub HeadFile($$$);
+sub TailFile($$$);
+sub TypeFile($;$);
+sub ReadFile($$);
+sub WriteFile($$$;$$);
+sub UnzipFile($$);
+sub Zip($$$$@);
+sub Move($$);
+sub Touch($@);
+sub SetLogfile($);
+sub RunSystemCmd($;$$$);
+sub ParseSystemCmd($$$$$);
+sub GenExclfile($$$$$);
+sub GenIbyfile($$$);
+sub GenObyfile($$$$@);
+sub GenMakefile($$$$$);
+sub GenWidgetConf($$$$);
+sub AddImageHeader($$$$$);
+sub Sleep($);
+sub FindSOSFiles($$$$);
+sub CheckTool(@);
+sub OpCacheInstall($$$);
+sub SisInstall($$$$$$$$);
+sub GetIPar(;$);
+sub PEval($);
+sub PeekICmd($);
+sub SkipICmd();
+sub GetICmd();
+sub EndICmd();
+sub SplitStep($);
+sub RunStep($);
+sub RunIExtCmd($);
+sub GetConfmkList(;$);
+sub GetFeatvarIncdir($);
+sub SetVerbose($;$);
+sub CloseLog();
+sub RunIMakerCmd($$$$$@);
+sub RunMakeCmd($$);
+sub HandleCmdArg($);
+sub HandleExtCmdArg($);
+sub MenuRuncmd($);
+sub Menu($);
+sub Install($$$);
+
+use constant READBUFSIZE => 2097152;  # 2 MB
+use constant STARTSTR => '>>>[START]=========8<==========8<==========8<==========8<==========8<==========';
+use constant ENDSTR   => '==========>8==========>8==========>8==========>8==========>8===========[END]<<<';
+
+# device[VARID]==... !!
+#
+use constant BOOTBINARYSTATEMENT => qr/^\s*bootbinary\s*(?:=+|\s)\s*(?:"(.+?)"|(\S+))/i;
+
+use constant FILESPECSTATEMENT =>
+    qr/^\s*(?:data|device|dll|extension|file|primary|secondary|variant)\S*?\s*(?:=+|\s)\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))(\s+.+?)?\s*$/i;
+
+our ($gArgv, $gCmdcnt, @gCmdoutbuf, %gConfmkList, $gEpocdrive, $gEpocroot, $gError, $gErrwarn, $gEvalerr,
+    %gExportvar, $gFiltercmd, @gFindresult, $gICmd, @gIcmd, $gImakerext, $gImgtype, $gKeepgoing, @gLogbuf,
+    $gLogfile, %gLogfiles, $gMakecmd, @gMakeinfo, $gOutfilter, $gParamcnt, $gPrintcmd, @gReport, $gStartmk,
+    $gStarttime, $gStep, @gStepDur, %gStepIcmd, %gSubstdrv, $gTgterr, %gTool, $gVerbose, $gWinOS, $gWorkdir,
+    $gWorkdrive, @iVar);
+
+
+###############################################################################
+#
+
+sub InitMkglobals()
+{
+    $gCmdcnt     = 0;
+    @gCmdoutbuf  = ();
+    $gFiltercmd  = qr/\S/;
+    @gFindresult = ();
+    $gICmd       = "";
+    @gIcmd       = ();
+    $gImgtype    = "";
+    $gOutfilter  = "";
+    $gParamcnt   = 0;
+    $gPrintcmd   = 0;
+    $gStep       = "";
+    @gStepDur    = ();
+    %gStepIcmd   = ();
+    @iVar        = ();  # General purpose variable to be used from $(call peval,...)
+}
 
 BEGIN {
-    ($start, $perlver) = (time(), sprintf("%vd", $^V));
+    ($gArgv, $gEvalerr, $gStarttime, $gWinOS) = (scalar(@ARGV), 0, time(), $^O =~ /MSWin/i);
+    $_ = "default input and pattern-searching space";
+    eval("use Archive::Zip qw(:ERROR_CODES)");
+    eval("use constant AZ_OK => -1") if $@;
+    eval("use Archive::Zip::Tree");
+    if ($gWinOS) { eval("
+        use Win32API::File qw(:DDD_);
+        use Win32::File;
+        use constant WIN32_FILE_HIDDEN => Win32::File::HIDDEN");
+    } else { eval("
+        use constant DDD_REMOVE_DEFINITION => -1;
+        use constant WIN32_FILE_HIDDEN => -1");
+    }
+}
+
+INIT {
+    $gWorkdir   = Cwd::cwd();
+    $gWorkdrive = ($gWorkdir =~ /^([a-z]:)/i ? uc($1) : "");
+    $ENV{EPOCROOT} = ($gWinOS ? "\\" : "$gWorkdir/") if !$ENV{EPOCROOT};
+    $ENV{IMAKER_CMDARG} = "" if !defined($ENV{IMAKER_CMDARG});
+    $ENV{IMAKER_CYGWIN} = 0 if !$ENV{IMAKER_CYGWIN};
+
+    InitMkglobals();
+    %gConfmkList = ();
+    $gEpocdrive  = ($ENV{EPOCROOT} =~ /^([a-z]:)/i ? uc($1) : $gWorkdrive);
+    ($gEpocroot  = GetAbsDirname($ENV{EPOCROOT})) =~ s/\/+$//;
+    $gError      = 0;
+    $gErrwarn    = 0;
+    %gExportvar  = (); $gExportvar{""} = 0;
+    $gKeepgoing  = 0;
+    @gLogbuf     = ();
+    $gLogfile    = "";
+    %gLogfiles   = ();
+    $gMakecmd    = "";
+    @gMakeinfo   = ("?", "?", "?");
+    @gReport     = ();
+    $gStartmk    = 0;
+    %gSubstdrv   = ();
+    $gTgterr     = 0;
+    %gTool       = (); map{ $gTool{$_} => $_ } ("cpp", "elf2e32", "interpretsis", "opcache", "unzip");
+    $gVerbose    = 1;
+
     select(STDERR); $|++;
     select(STDOUT); $|++;
-    if (!@ARGV) {
-        warn("Warning: iMaker is running under Cygwin!\n")
+
+    # Overload die
+    *CORE::GLOBAL::die = sub {
+        $gError = 1 if !$gEvalerr;
+        return if (PeekICmd("iferror") && !$gEvalerr);
+        CORE::die(@_) if ($gEvalerr || !$gKeepgoing);
+        $gErrwarn = 1;
+        warn(@_);
+    };
+
+    # Handler for __DIE__ signal
+    $SIG{__DIE__} = sub {
+        return if $gEvalerr;
+        $gErrwarn = 1;
+        warn(@_);
+        exit(1);
+    };
+
+    # Handler for __WARN__ signal
+    $SIG{__WARN__} = sub {
+        if (($gEvalerr != 1) && ($gKeepgoing < 3) && ($_[0] ne "\n")) {
+            select(STDERR);
+            my $msg = ($gStep ? "($gStep): " : "") . $_[0];
+            if ($gErrwarn && ($gKeepgoing < 2)) {
+                   DPrint(0, "*** Error: $msg") }
+            else { DPrint(127, "Warning: $msg") }
+            select(STDOUT);
+        }
+        $gErrwarn = 0;
+    };
+
+    if (!$gArgv) {
+        warn("iMaker is running under Cygwin!\n")
             if (!$ENV{IMAKER_CYGWIN} && $^O =~ /cygwin/i);
-        warn("Warning: iMaker uses Perl version $perlver! Recommended versions are 5.6.1 and 5.8.8.\n")
-            if ($perlver !~ /^5\.(6\.1|8\.8)$/);
+        my $perlver = sprintf("%vd", $^V);
+        warn("iMaker uses Perl version $perlver! Recommended versions are 5.6.1, 5.8.x and 5.10.x.\n")
+            if ($perlver !~ /^5\.(?:6\.1|(?:8|10)\.\d+)$/);
     }
-    unshift(@INC, defined($ENV{IMAKER_DIR}) ? $ENV{IMAKER_DIR} : ($0 =~ /^(.*)[\/\\]/ ? $1 : "."));
 }
 
-use imaker;
-
 
 ###############################################################################
 # Main program
 
 {
-    if (!@ARGV) {
-        $ENV{CONFIGROOT} = imaker::GetAbsDirname($ENV{CONFIGROOT});
-        $ENV{ITOOL_DIR}  = imaker::GetAbsDirname($ENV{ITOOL_DIR}, 0, 1);
-        $ENV{IMAKER_DIR} = imaker::GetAbsDirname($ENV{IMAKER_DIR}, 0, 1);
-        $ENV{PATH} = join(";", grep(!/[\\\/]cygwin[\\\/]/i, split(/;+/, $ENV{PATH})))
-            if $imaker::gWinOS && !$ENV{IMAKER_CYGWIN};
+    if ($gArgv) {
+        my $iopt = shift(@ARGV);
+        print(map("$_\n", GetFeatvarIncdir("@ARGV"))), exit(0) if ($iopt eq "--incdir");
+        print(map("$_\n", @ARGV)), exit(0) if ($iopt eq "--splitarg");
+        die("Unknown internal imaker.pl option: `$iopt'.\n");
+    }
+
+    delete($ENV{MAKE}) if $gWinOS;
+    map { delete($ENV{$_}) } qw(MAKECMDGOALS MAKEFILES MAKEFLAGS MAKELEVEL MAKE_VERSION);
+
+    $ENV{CONFIGROOT} = GetAbsDirname($ENV{CONFIGROOT} || "$gEpocroot/epoc32/rom/config");
+    $ENV{ITOOL_DIR}  = GetAbsDirname($ENV{ITOOL_DIR}  || "$gEpocroot/epoc32/tools/rom");
+    $ENV{IMAKER_DIR} = GetAbsDirname($ENV{IMAKER_DIR});
+
+    $ENV{IMAKER_EXPORTMK}  = "";
+    $ENV{IMAKER_MAKE}      = ($gWinOS ? "$ENV{IMAKER_DIR}/mingw_make.exe" : $ENV{MAKE} || "make") if !$ENV{IMAKER_MAKE};
+    $ENV{IMAKER_MAKESHELL} = ($ENV{COMSPEC} || "cmd.exe") if (!$ENV{IMAKER_MAKESHELL} && $gWinOS);
+    $ENV{IMAKER_MKCONF}    = $ENV{CONFIGROOT} . ',image_conf_(.+?)\.mk$,_(?:ncp)?\d+\.mk$,1' if !$ENV{IMAKER_MKCONF};
+
+    my $pathsep = ($gWinOS ? ";" : ":");
+    $ENV{PATH}  = join(";", grep(!/[\\\/]cygwin[\\\/]/i, split(/;+/, $ENV{PATH}))) if (!$ENV{IMAKER_CYGWIN} && $gWinOS);
+    ($ENV{PATH} = Trim($ENV{PATH})) =~ s/"$/";/ if $gWinOS;  # http://savannah.gnu.org/bugs/index.php?25412
+    $ENV{PATH}  = PathConv("$ENV{ITOOL_DIR}", $gWinOS) . $pathsep . PathConv("$gEpocroot/epoc32/tools", $gWinOS) .
+        $pathsep . ($gWinOS ? PathConv("$gEpocroot/epoc32/gcc/bin", 1) . ";" : "") . $ENV{PATH};
+
+    $ENV{PERL5LIB} = $ENV{IMAKER_DIR} . ($ENV{PERL5LIB} ? "$pathsep$ENV{PERL5LIB}" : "");
+
+    die($@) if !defined($gImakerext = do("$ENV{IMAKER_DIR}/imaker_extension.pm")) && $@;
+
+    my ($version, $verfile) = ("", "$ENV{IMAKER_DIR}/imaker_version.mk");
+    open(FILE, "<$verfile") and map { $version = $1 if /^\s*IMAKER_VERSION\s*[+:?]?=\s*(.*?)\s*$/ } <FILE>;
+    close(FILE);
+    if ($version) { DPrint(1, "$version\n") }
+    else { warn("Can't read iMaker version from `$verfile'.\n") }
+
+    if ($ENV{IMAKER_CMDARG} =~ /^\s*--?(install|clean)=?(.*?)\s*$/i) {
+        Install(lc($1) eq "clean", "$ENV{IMAKER_DIR}/../group/bld.inf", $2);
+        exit(0);
+    }
+
+    $gMakecmd = "$ENV{IMAKER_MAKE} -R --no-print-directory" .
+        ($ENV{IMAKER_MAKESHELL} ? " SHELL=\"$ENV{IMAKER_MAKESHELL}\"" : "");
+    my $cmdout = qx($gMakecmd -f "$0" 2>&1);
+    ($cmdout = (defined($cmdout) ? $cmdout : "")) =~ s/\n+$//;
+    die("Can't run Make properly: `$cmdout'\n")
+        if ($cmdout !~ /\|MAKE=(.*?)\|MAKE_VERSION=(.*?)\|SHELL=(.*?)\|/);
+    @gMakeinfo = ($1, $2, $3);
+    warn(($gMakeinfo[1] eq "" ? "Can't resolve Make version" : "iMaker uses Make version $gMakeinfo[1]") .
+        ", recommended version is 3.81.\n") if ($gMakeinfo[1] !~ /^\s*3\.81/);
+
+    RunIMakerCmd("$gMakecmd TIMESTAMP=" . GetTimestamp() .
+        " -I \"$ENV{CONFIGROOT}\" -f \"$ENV{IMAKER_DIR}/imaker.mk\"", $ENV{IMAKER_CMDARG}, "", 0, 0, ());
+}
+
+
+###############################################################################
+#
+
+sub PrintEnv($)
+{
+    return if !@gMakeinfo;
+    DPrint(shift(), "=" x 79 . "\n" .
+        "User        : " . (getlogin() || "?") . "@" . ($ENV{HOSTNAME} || $ENV{COMPUTERNAME} || "?") . " on $^O\n" .
+        "Time        : " . localtime() . "\n" .
+        "Current dir : `$gWorkdir'\n" .
+        "iMaker tool : `$ENV{IMAKER_TOOL}' -> `$0'\n" .
+        "Cmdline args: `$ENV{IMAKER_CMDARG}'\n" .
+        "Perl        : `$^X' version " . sprintf("%vd\n", $^V) .
+        "PERL5LIB    : `$ENV{PERL5LIB}'\n" .
+        "PERL5OPT    : `" . (defined($ENV{PERL5OPT}) ? "$ENV{PERL5OPT}'\n" : "'\n") .
+        "Make        : `$gMakeinfo[0]' version $gMakeinfo[1]\n" .
+        "Make shell  : `$gMakeinfo[2]'\n" .
+        "EPOCROOT    : `$ENV{EPOCROOT}'\n" .
+        "CONFIGROOT  : `$ENV{CONFIGROOT}'\n" .
+        "PATH        : `$ENV{PATH}'\n");
+    @gMakeinfo = ();
+}
+
+sub Max(@)
+{
+    my $max = (shift() || 0);
+    map { $max = $_ if $_ > $max } @_;
+    return($max);
+}
+
+sub Min(@)
+{
+    my $min = (shift() || 0);
+    map { $min = $_ if $_ < $min } @_;
+    return($min);
+}
+
+sub Trim($;$)
+{
+    (my $str = shift()) =~ s/^\s+|\s+$//g;
+    $str =~ s/\s+(?=\s)//g if shift();
+    return($str);
+}
+
+sub Quote($)
+{
+    local $_ = shift();
+    return("") if !defined();
+    s/\\( |n|t)/\\\\$1/g;
+    return($_);
+}
+
+sub Unquote($)
+{
+    local $_ = shift();
+    return("") if !defined();
+    s/(?<!\\)(?<=\\n)\s+(\\n)?//g;
+    s/(?<!\\)\s+(?=\\n)//g;
+    s/(?<!\\)\\ / /g;
+    s/(?<!\\)\\n/\n/g;
+    s/(?<!\\)\\t/\t/g;
+    s/\\\\( |n|t)/\\$1/g;
+    s/\x00//g;
+    return($_);
+}
+
+sub Int2Hex($;$)
+{
+    my ($int, $len) = @_;
+    return((defined($len) ? $len : ($len = ($int < 4294967296 ? 8 : 16))) < 9 ? sprintf("%0${len}X", $int) :
+        sprintf("%0" . ($len - 8) . "X%08X", int($int / 4294967296), $int % 4294967296));  # 4294967296 = 4 G
+}
+
+sub Byte2Str($@)
+{
+    my ($base, @byte) = @_;
+    return(join("", map(($_ % 16 ? "" : sprintf("%04X:", $base + $_)) . sprintf(" %02X", $byte[$_]) .
+        (!(($_ + 1) % 16) || ($_ == (@byte - 1)) ? "\n" : ""), (0 .. (@byte - 1)))));
+}
+
+sub Str2Byte($)
+{
+    my ($str, $ind, @byte) = (shift(), 0, ());
+    $str =~ s/,$/, /;
+    map {
+        $ind++;
+        s/^\s+|\s+$//g;
+        if (/^\d+$/ && $_ < 256) {
+            push(@byte, $_);
+        } elsif (/^0x[0-9A-F]+$/i && hex() < 256) {
+            push(@byte, hex());
+        } else {
+            die("Invalid $ind. byte: `$_'.\n");
+            return;
+        }
+    } split(/,/, $str);
+    return(@byte);
+}
+
+sub Str2Xml($)
+{
+    my $str = shift();
+    $str =~ s/(.)/{'"'=>'&quot;', '&'=>'&amp;', "'"=>'&apos;', '<'=>'&lt;', '>'=>'&gt;'}->{$1} || $1/ge;
+    return($str);
+}
+
+sub Ascii2Uni($)
+{
+    (local $_ = shift()) =~ s/(?<!\r)\n/\r\n/g;  # Use CR+LF newlines
+    s/(.)/$1\x00/gs;
+    return("\xFF\xFE$_");
+}
+
+sub Uni2Ascii($)
+{
+    (local $_ = shift()) =~ s/(.)\x00/$1/gs;
+    s/\r\n/\n/g;
+    return(substr($_, 2));
+}
+
+sub GetTimestamp()
+{
+    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = localtime();
+    return(sprintf("%04d%02d%02d%02d%02d%02d%02d",
+        $year + 1900, $mon + 1, $mday, $hour, $min, $sec, int(($yday + ($year == 109 ? 3 : -3)) / 7) + 1));
+}
+
+sub Sec2Min($)
+{
+    my $sec = shift();
+    return(sprintf("%02d:%02d", $sec / 60, $sec % 60));
+}
+
+sub Wcard2Restr($)
+{
+    (my $wcard = shift()) =~ s/(.)/{"*"=>".*", "?"=>"."}->{$1} || "\Q$1\E"/ge;
+    return($wcard);
+}
+
+sub Wcard2Regex($)
+{
+    my $restr = Wcard2Restr(shift());
+    return(qr/$restr/i);
+}
+
+sub ParseCmdWords($)
+{
+    my $line = Trim(shift());
+    $line =~ s/\\/\\\\/g if $gWinOS;
+    return(Text::ParseWords::parse_line('\s+', 0, $line));
+}
+
+
+###############################################################################
+#
+
+sub DPrint($@)
+{
+    my ($verbose, @outlist) = @_;
+    map { tr/\x00\x1F/#/ } @outlist;
+    print(@outlist) if !$verbose || ($verbose & $gVerbose);
+    push(@gLogbuf, @outlist) if ($verbose < 32) || ($verbose & $gVerbose);
+    return if ($gLogfile eq "" || !@gLogbuf);
+    print(LOG @gLogbuf);
+    @gLogbuf = ();
+}
 
-        my ($version, $verfile) = ("", "$ENV{IMAKER_DIR}/imaker_version.mk");
-        open(FILE, "<$verfile") and map { $version = $1 if /^\s*IMAKER_VERSION\s*[+:?]?=\s*(.*?)\s*$/ } <FILE>;
-        close(FILE);
-        $version and print("$version\n") or
-            warn("Can't read iMaker version from `$verfile'.\n");
+sub Echo($$$)
+{
+    return if SkipICmd();
+    my ($verbose, $str) = (shift(), shift());
+    DPrint($verbose, shift() ? "$str\n" : Unquote($str));
+}
+
+
+###############################################################################
+# File operations
+
+sub PathConv($;$$$)
+{
+    my $path = shift();
+    if (shift()) { $path =~ tr-\/-\\- }
+    else { $path =~ tr-\\-\/- }
+    return($path) if (!$gWinOS || $path =~ /^(?:\/\/|\\\\)/);
+    my $drive = shift();
+    return(ucfirst(($path =~ /^[a-z]:/i ? "" : ($_[0] ? $_[0] : $gWorkdrive)) . $path))
+        if !$drive;
+    $drive = $gWorkdrive if !($drive = shift());
+    $path =~ s/^$drive//i;
+    return($path);
+}
+
+sub ParseFiles($)
+{
+    my ($file, @files) = (" " . shift() . " ", ());
+    push(@files, defined($1) ? $1 : (defined($2) ? $2 : ())) while ($file =~ /\s(?:"\s*"|"+(.+?)"+|((\\\s|\S)+))(?=\s)/g);
+    return(@files);
+}
+
+sub GlobFiles($;$)
+{
+    return(@gFindresult) if (my $file = shift()) =~ /^__find__$/i;
+    return(map(/[\*\?]/ ? sort({lc($a) cmp lc($b)} grep(!/[\/\\]\.\.?$/,
+        glob(scalar(s/\*/\{\.\*\,\*\}/g, /\s/) ? "\"$_\"" : $_))) : $_, (shift() ? $file : ParseFiles($file))));
+}
+
+sub GetBasename($)
+{
+    return((File::Basename::fileparse(shift()))[0]);
+}
+
+sub GetDirname($)
+{
+    (my $dir = shift()) =~ s/^>>?(?!>)//;
+    return((File::Basename::fileparse($dir))[1]);
+}
+
+sub GetAbsDirname($;$$$)
+{
+    (my $dir = shift()) =~ s/^>>?(?!>)//;
+    $dir = "." if ($dir eq "");
+    my $absdir = "";
+    eval { local $gEvalerr = 1; $absdir = Cwd::abs_path($dir) };
+    return(PathConv($absdir || File::Spec->rel2abs($dir,
+        $dir !~ /^$gWorkdrive/i && $dir =~ /^([a-z]:)/i ? "$1/" : ""), shift(), shift(), shift()));
+}
+
+sub GetAbsFname($;$$$)
+{
+    my $file = shift();
+    return($file) if ($file eq "" || $file =~ /STD(IN|OUT|ERR)$/);
+    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
+    return($append . PathConv(File::Spec->catpath("", GetAbsDirname(GetDirname($file)), GetBasename($file)), shift(), shift(), shift()));
+}
+
+sub GetRelFname($;$$)
+{
+    my ($file, $base) = (shift(), shift());
+    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
+    ($file = PathConv(File::Spec->abs2rel($file, GetAbsDirname(defined($base) && ($base ne "") ? $base : ".")),
+        shift(), 1, "[a-z]:")) =~ s/^[\/\\]+//;
+    return("$append$file");
+}
+
+sub GetWriteFname($)
+{
+    (my $file = shift()) =~ s/^>?/>/;
+    return($file);
+}
+
+sub GetFreeDrive(;$)
+{
+    my $drives = Win32API::File::GetLogicalDrives();
+    for my $drive ("F".."Z", "A".."E") {
+        return("$drive:") if !($drives & (2 ** (ord($drive) - ord("A"))));
+    }
+    return("") if shift();
+    die("GetFreeDrive: No free drive available.\n");
+}
+
+sub SubstDrive($$)
+{
+    my ($drive, $path) = (uc(shift()), GetAbsDirname(shift()));
+    DPrint(16, "SubstDrive: `$drive' => `$path'\n");
+    $gSubstdrv{$drive} = 1, return if !(Win32API::File::GetLogicalDrives() & (2 ** (ord($drive) - ord("A")))) &&
+        Win32API::File::DefineDosDevice(0, $drive, $path);
+    die("Can't substitute `$drive' => `$path'\n");
+}
+
+sub UnsubstDrive($)
+{
+    return if (my $drive = uc(shift())) eq "";
+    DPrint(16, "UnsubstDrive: `$drive'\n");
+    delete($gSubstdrv{$drive}), return if Win32API::File::DefineDosDevice(DDD_REMOVE_DEFINITION, $drive, []) &&
+        !(Win32API::File::GetLogicalDrives() & (2 ** (ord($drive) - ord("A"))));
+    warn("Can't remove substituted drive `$drive'\n");
+}
 
-        my $cmdarg  = " " . imaker::HandleCmdArg($ENV{IMAKER_CMDARG}) . " ";
-        my $makecmd = "$ENV{IMAKER_MAKE} -R --no-print-directory" .
-            ($ENV{IMAKER_MAKESHELL} ? " SHELL=\"$ENV{IMAKER_MAKESHELL}\"" : "");
-        my $cmdout  = qx($makecmd -f $0 $cmdarg 2>&1);
-        my $targets = ($cmdout =~ />>>MAKECMDGOALS=(.*?)<<</ ? $1 : undef);
+sub Search($$$$$$\@\$)
+{
+    my ($dir, $basere, $inclre, $exclre, $subdir, $finddir, $files, $total) = @_;
+    my @dir = my @file = ();
+
+    opendir(SDIR, $dir) or warn("Can't open directory `$dir'.\n");
+    while (local $_ = readdir(SDIR)) {
+        next if ($_ eq ".") || ($_ eq "..");
+        push(@dir, $_) if ((my $isdir  = !(my $isfile = -f($_ = "$dir/$_")) && -d()) && $subdir);
+        next if ($finddir ? $isfile : $isdir);
+        ++$$total;
+        (my $fname = $_) =~ s/$basere//;
+        push(@file, $_) if ($fname =~ /$inclre/) && ($fname !~ /$exclre/) &&
+            (($finddir != 2) || !@{[glob((/\s/ ? "\"$_\"" : $_) . "/{[^.],.[^.],.??*,*}")]});
+    }
+    closedir(SDIR);
+    push(@$files, sort({lc($a) cmp lc($b)} @file));
+
+    foreach (sort({lc($a) cmp lc($b)} @dir)) {
+        Search($_, $basere, $inclre, $exclre, 1, $finddir, @$files, $$total);
+    }
+}
+
+sub Find($$$$$\$)
+{
+    my ($dur, $dir, $inclpat, $exclpat, $subdir, $finddir, $total) = (time(), @_);
+    ($dir, $$total) = (GetAbsDirname($dir), 0);
+    my ($inclre, $exclre, @files) = ("", "", ());
+    if ($inclpat =~ /^\//) {
+        $inclre = eval("qr$inclpat");
+        $inclpat = "";
+    } else {
+        $inclre = join("|", map(Wcard2Restr($_), split(/\s+/, $inclpat)));
+        $inclre = qr/\/(?:$inclre)$/i;
+    }
+    if ($exclpat =~ /^\//) {
+        $exclre = eval("qr$exclpat");
+        $exclpat = "";
+    } else {
+        $exclre = join("|", map(Wcard2Restr($_), split(/\s+/, $exclpat)));
+        $exclre = qr/\/(?:$exclre)$/i;
+    }
+    DPrint(16, "Find" . ($finddir == 2 ? "EmptyDir" : ($finddir ? "Dir" : "File")) . ": Directory `$dir'" .
+        ($subdir ? " and subdirectories" : "") . ", pattern `" . ($inclpat ne "" ? "$inclpat' $inclre" : "$inclre'") .
+        ($exclre eq qr/\/(?:)$/i ? "" : " excluding `" . ($exclpat ne "" ? "$exclpat' $exclre" : "$exclre'")));
+    foreach (GlobFiles($dir, 1)) {
+        Search($_, qr/^$_/i, $inclre, $exclre, $subdir, $finddir, @files, $$total) if -d();
+    }
+    DPrint(16, ", found " . @files . "/$$total " . ($finddir ? "directories" : "files") .
+        ", duration: " . Sec2Min(time() - $dur) . "\n");
+    return(@files);
+}
+
+sub ChangeDir($)
+{
+    if ((my $dir = GetAbsDirname(shift())) ne GetAbsDirname(".")) {
+        DPrint(16, "ChangeDir: `$dir'\n");
+        chdir($dir) or die("Can't change to directory `$dir'.\n");
+    }
+}
+
+sub DeleteDir($;$)
+{
+    return if !-d(my $dir = GetAbsDirname(shift()));
+    DPrint(16, "DeleteDir: `$dir'\n");
+    for my $sec (0, 2, 5) {
+        warn("Can't delete directory `$dir', retrying in $sec seconds...\n"), sleep($sec) if $sec;
+        eval { local $gEvalerr = 1; File::Path::rmtree($dir) };
+        return if !-d($dir);
+        RunSystemCmd($gWinOS ? 'rmdir /q /s "' . PathConv($dir, 1) . '"' :
+            "rm -fr '$dir'", 2);
+        sleep(1);
+        return if !-d($dir);
+    }
+    $dir = "Can't delete directory `$dir'.\n";
+    shift() ? warn($dir) : die($dir);
+}
+
+sub FindDir($$$$)
+{
+    my ($dir, $inclpat, $exclpat, $opt) = @_;
+    $opt = "" if !defined($opt);
+    push(@gFindresult, Find($dir, $inclpat, $exclpat, $opt =~ /r/, 1, local $_));
+}
+
+sub MakeDir($)
+{
+    return if -d(my $dir = shift());
+    eval { local $gEvalerr = 1; File::Path::mkpath($dir = GetAbsDirname($dir)) };
+    if (-d($dir)) {
+        DPrint(16, "MakeDir: `" . GetAbsDirname($dir) ."'\n");
+    } else {
+        DPrint(16, "MakeDir: `$dir'\n");
+        die("Can't create directory `$dir'.\n");
+    }
+}
+
+sub MakeChangeDir($)
+{
+    MakeDir(my $dir = shift());
+    ChangeDir($dir);
+}
+
+sub SetWorkdir($)
+{
+    MakeChangeDir(shift());
+    $gWorkdrive = (Cwd::cwd() =~ /^([a-z]:)/i ? uc($1) : "");
+    $gWorkdir   = GetAbsDirname(".");
+}
+
+sub OpenFile(*$$;$)
+{
+    my ($fhandle, $file, $binmode, $print) = @_;
+    MakeDir(GetDirname($file)) if $file =~ /^>/;
+    DPrint(16, defined($print) ? $print : ($file =~ /^>/ ? "Write" : "Read") . "File: `$file'\n");
+    return(open($fhandle, $file)) if !$binmode;
+    return(open($fhandle, $file) and binmode($fhandle));
+}
 
-        die("Can't run `$ENV{IMAKER_MAKE}' properly:\n$cmdout") if !defined($targets);
-        map { $cmdarg =~ s/\s+\Q$_\E\s+/ / } split(/\s+/, $targets);
+sub Test($)
+{
+    if (-d(my $file = shift())) {
+        DPrint(16, "TestDir: `" . GetAbsDirname($file) . "'\n");
+    } elsif (-f($file)) {
+        DPrint(16, "TestFile: `" . GetAbsFname($file) . "'\n");
+    } else {
+        DPrint(16, "Test: `$file'\n");
+        die("File or directory `$file' doesn't exist.\n");
+    }
+}
+
+sub CutFile($$$$$)
+{
+    my ($msg, $src, $dest, $head, $len) = @_;
+    my ($buf, $srctmp) = (undef, "$src.tmp");
+
+    OpenFile(*INFILE, $src, 1, $msg) or
+        die("Can't read file `$src'.\n"), return;
+
+    my $out = GetWriteFname($head ? $dest : $srctmp);
+    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
+    while ($len > 0) {
+        read(INFILE, $buf, $len < READBUFSIZE ? $len : READBUFSIZE);
+        print(OUTFILE $buf);
+        $len -= READBUFSIZE;
+    }
+    close(OUTFILE);
+
+    $out = GetWriteFname($head ? $srctmp : $dest);
+    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
+    print(OUTFILE $buf) while read(INFILE, $buf, READBUFSIZE);
+    close(OUTFILE);
+    close(INFILE);
+    Move($srctmp, $src);
+}
+
+sub Copy($$;$)
+{
+    my ($src, $dest, $dir) = @_;
+    $dir = defined($dir) && $dir;
+    my $file = !($dir || -d($src));
+    $src  = ($file ? GetAbsFname($src) : GetAbsDirname($src));
+    $dest = ($file ? GetAbsFname(-d($dest) ? "$dest/" . GetBasename($src) : $dest) :
+        GetAbsDirname($dir ? $dest : "$dest/" . GetBasename($src)));
+    if ($file && ($dest =~ /^>>[^>]/)) {
+        OpenFile(*FILE, $dest, 1, "AppendFile: `$src' => `$dest'\n")
+            or die("Can't append to `$dest'.\n"), return;
+        File::Copy::copy($src, *FILE) and
+            close(FILE) and return;
+    }
+    elsif ($file) {
+        MakeDir(GetDirname($dest));
+        DPrint(16, "CopyFile: `$src' => `$dest'\n");
+        warn("CopyFile: Destination file `$dest' already exists\n") if -f($dest);
+        File::Copy::copy($src, $dest) and return;
+    } else {
+        DPrint(16, "CopyDir: `$src' => `$dest'\n");
+        return if !RunSystemCmd(!$gWinOS ? "cp \"$src\"/* \"$dest\" -frv" :
+            'xcopy "' . PathConv($src, 1) . '" "' . PathConv($dest, 1) . '" /e /h /i /q /y /z', 2);
+    }
+    die("Can't copy `$src' to `$dest'.\n");
+}
+
+sub CopyIby($$)
+{
+    my ($file, $dir) = (GetAbsFname(shift()), shift());
+    OpenFile(*FILE, $file, 0) or die("Can't read file `$file'.\n"), return;
+    map {
+        Copy(defined($1) ? $1 : $2, "$dir/" . (defined($3) ? $3 : $4)) if $_ =~ FILESPECSTATEMENT;
+    } <FILE>;
+    close(FILE);
+}
+
+sub DeleteFile($;$)
+{
+    return if !-f(my $file = GetAbsFname(shift()));
+    DPrint(16, "DeleteFile: `$file'\n");
+    for my $sec (0, 1, 2) {
+        warn("Can't delete file `$file', retrying in $sec second(s)...\n"), sleep($sec) if $sec;
+        unlink($file);
+        return if !-f($file);
+    }
+    $file = "Can't delete file `$file'.\n";
+    shift() ? warn($file) : die($file);
+}
+
+sub FindFile($$$$)
+{
+    my ($dir, $inclpat, $exclpat, $opt) = @_;
+    $opt = "" if !defined($opt);
+    my @find = Find($opt !~ /f/ ? $dir : GetDirname($dir), $opt !~ /f/ ? $inclpat : GetBasename($dir),
+        $exclpat, $opt =~ /r/, 0, local $_);
+    push(@gFindresult, $opt !~ /f/ ? @find : map("|$_|$inclpat", @find));
+}
+
+sub HeadFile($$$)
+{
+    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
+    $len = hex($len) if $len =~ /^0x/;
+    CutFile("HeadFile: Cut first $len bytes from `$src' => `$dest'\n", $src, $dest, 1, $len);
+}
 
-        my $tmptarg = $targets = " $targets";
-        my $hptarg  = 0;
-        while ($tmptarg =~ /(\s+(help-\S+))/g) {
-            $hptarg = $1, $targets =~ s/\Q$hptarg\E(.*)$/ $1$hptarg/ if $2 ne "help-config";
+sub TailFile($$$)
+{
+    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
+    $len = hex($len) if $len =~ /^0x/;
+    CutFile("TailFile: Cut last $len bytes from `$src' => `$dest'\n", $src, $dest, 0, (-s($src) ? -s($src) : 0) - $len);
+}
+
+sub TypeFile($;$)
+{
+    my ($file, $str, $mode) = (GetAbsFname(shift()), "", shift() || "");
+    OpenFile(*FILE, $file, $mode, "TypeFile: `$file'" .
+        ($gOutfilter && ($mode ne "b") ? ", filter: `/$gOutfilter/i'" : "") . "\n") or
+            die("Can't read file `$file'.\n"), return;
+    DPrint(8, STARTSTR . "\n");
+    read(FILE, $str, -s($file));
+    if ($mode eq "b") {
+        DPrint(1, Byte2Str(0, map(ord(), split(//, $str))));
+    } else {
+        $str = Uni2Ascii($str) if $mode eq "u";
+        DPrint(1, map("$_\n", grep(!$gOutfilter || /$gOutfilter/i, split(/\n/, $str))));
+        $gOutfilter = "";
+    }
+    DPrint(8, ENDSTR . "\n");
+    close(FILE);
+}
+
+sub ReadFile($$)
+{
+    my ($file, $warn) = (GetAbsFname(shift()), shift());
+    OpenFile(*RFILE, $file, 0) or
+        ($warn ? (warn("Can't read file `$file'.\n"), return(())) : die("Can't read file `$file'.\n"));
+    my @file = map(chomp() ? $_ : $_, grep(!/^\s*$/, <RFILE>));
+    close(RFILE);
+    return(@file);
+}
+
+sub WriteFile($$$;$$)
+{
+    my ($file, $str, $mode, $opt) = (GetAbsFname(shift()), shift(), shift() || "", shift());
+    OpenFile(*WFILE, GetWriteFname($file), $mode) or
+        die("Can't write to `$file'.\n"), return;
+    if ($mode eq "b") {
+        my @byte = Str2Byte($str);
+        DPrint(64, Byte2Str($file =~ s/^>>(?!>)// ? -s($file) : 0, @byte));
+        print(WFILE map(chr(), @byte));
+    } else {
+        $opt = "" if !defined($opt);
+        $str = Unquote($str) if ($opt !~ /q/);
+        $str =~ s/(?<=\S)\/\//\//g if ($opt =~ /c/);
+        DPrint(16, $str) if shift();
+        $str = Ascii2Uni($str) if ($mode eq "u");
+        print(WFILE $str);
+    }
+    close(WFILE);
+}
+
+sub UnzipFile($$)
+{
+    my ($zipfile, $dir) = (GetAbsFname(shift()), GetAbsDirname(shift()));
+    DPrint(16, "UnzipFile: `$zipfile'");
+    Archive::Zip::setErrorHandler(sub{});
+    my ($error, $zip) = (0, Archive::Zip->new());
+    if ($zip->read($zipfile) != AZ_OK) {
+        DPrint(16, " to directory `$dir'\n");
+        die("Can't read zip archive `$zipfile'.\n");
+        return;
+    }
+    my @files = map($_->fileName(), grep(!$_->isDirectory(), $zip->members()));
+    DPrint(16, ", " . @files . " files to directory `$dir'\n");
+    foreach my $file (@files) {
+        DPrint(16, "ExtractFile: `$dir/$file'");
+        eval { local $gEvalerr = 1; $error = ($zip->extractMember($file, "$dir/$file") != AZ_OK) };
+        DPrint(16, $error ? " Failed\n" : "\n");
+        die("Can't extract file `$file' to directory `$dir'.\n") if $error;
+        $error = 0;
+    }
+}
+
+sub Zip($$$$@)
+{
+    my ($zipfile, $dir, $opt, $prefix) = (GetAbsFname(shift()), shift(), shift(), shift());
+
+    $opt = (defined($opt) ? ", options: `$opt'" : "");
+    $prefix = GetAbsDirname($prefix) if $prefix ne "";
+    my %files = ();
+    foreach my $file (@_) {
+        my $zname = "";
+        ($file, $zname) = ($1, $2) if ($file =~ /^\|(.*)\|(.*)$/);
+        next if !($file = (!$dir ? (-f($file) ? GetAbsFname($file) : "") : (-d($file) ? GetAbsDirname($file) : "")));
+        ($zname = ($zname eq "" ? $file : (!$dir ?
+            GetAbsFname($zname) : GetAbsDirname($zname)))) =~ s/^(?:$gEpocroot|[a-z]:)?\/+//i;
+        if ($opt !~ /j/) {
+            $zname =~ s/^.*?\/+/$prefix\// if ($prefix ne "");
+        } else {
+            $zname = ($dir ? "" : GetBasename($file)) if ($prefix eq "") || !s/^$prefix//;
         }
-        $hptarg = $1, $targets =~ s/\Q$hptarg\E(.*)$/ $1$hptarg/ while $tmptarg =~ /(\s+print-\S+)/g;
-        $targets =~ s/^\s+|\s+(?=\s)|\s$//g;
+        $files{lc($zname)} = [$file, $zname];
+    }
+
+    DPrint(16, ($dir ? "ZipDir: `$zipfile'$opt, " . keys(%files) . " directories" :
+        "ZipFile: `$zipfile'$opt, " . keys(%files) . " files") . ($prefix ? ", prefix: $prefix\n" : "\n"));
+
+    Archive::Zip::setErrorHandler(sub{});
+    my ($error, $zip) = (0, Archive::Zip->new());
+    $zip->read($zipfile) if (my $ziptmp = ($zipfile =~ s/^>>(?!>)// ? "$zipfile.tmp" : ""));
+    $zip->zipfileComment("iMaker-generated zip archive `$zipfile'$opt.");
 
-        my $mainmk = "-f $ENV{IMAKER_DIR}/imaker.mk";
-        $makecmd .= " -I " . imaker::GetAbsDirname($ENV{CONFIGROOT}, 0, 1) . " $mainmk";
+    foreach my $file (sort({lc($$a[0]) cmp lc($$b[0])} values(%files))) {
+        DPrint(16, "Add" . ($dir ? "Dir" : "File") . ": `$$file[0]' => `$$file[1]'") if ($opt !~ /q/);
+        eval {
+            my $warn = 0;
+            local $gEvalerr = 1; local $SIG{__WARN__} = sub{ $warn = 1 };
+            $error = ($dir ? $zip->addTree($$file[0], $$file[1]) != AZ_OK :
+                !$zip->addFile($$file[0], $$file[1])) || $warn;
+        };
+        DPrint(16, $error ? " Failed\n" : "\n") if ($opt !~ /q/);
+        warn("Can't add " . ($dir ? "directory tree" : "file") . "`$$file[0]' to zip archive `$zipfile'.\n") if $error;
+        $error = 0;
+    }
+    ($zip->writeToFileNamed($ziptmp ? $ziptmp : $zipfile) == AZ_OK) or
+        die("Can't create zip archive `$zipfile'.\n");
+    Move($ziptmp, $zipfile) if $ziptmp;
+}
+
+sub Move($$)
+{
+    my ($src, $dest) = @_;
+    my $dir = -d($src);
+    $src = ($dir ? GetAbsDirname($src) : GetAbsFname($src));
+    MakeDir(GetDirname($dest));
+    $dest = ($dir ? GetAbsDirname($dest) : GetAbsFname($dest));
+    DPrint(16, "Move" . ($dir ? "Dir" : "File") . ": `$src' => `$dest'\n");
+    File::Copy::move($src, $dest) or
+        die("Can't move `$src' to `$dest'.\n");
+}
+
+sub Touch($@)
+{
+    my $time = (shift() =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/ ?
+        Time::Local::timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900) : time);
+    if (@_ != 1) {
+        DPrint(16, "Touch: " . scalar(@_) . " files/dirs, " .
+            POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($time)) . "\n");
+        utime($time, $time, @_) == @_ or
+            die("Can't touch all the " . scalar(@_) . " files/dirs.\n");
+        return;
+    }
+    my $file = shift();
+    my $dir = -d($file);
+    $file = ($dir ? GetAbsDirname($file) : GetAbsFname($file));
+    DPrint(16, "Touch" . ($dir ? "Dir" : "File") . ": `$file', " .
+        POSIX::strftime("%Y-%m-%d %H:%M:%S", localtime($time)) . "\n");
+    utime($time, $time, $file) == 1 or
+        die("Can't touch " . ($dir ? "directory" : "file") . " `$file'.\n");
+}
+
+sub SetLogfile($)
+{
+    return if !(my $file = GetAbsFname(shift()));
+    my $append = (($file =~ s/^>>(?!>)//) || exists($gLogfiles{$file}) ? ">>" : "");
+    CloseLog();
+    OpenFile(*LOG, GetWriteFname($file = "$append$file"), 0) or
+        warn("Can't log to file `$file'.\n"), return;
+    $gLogfiles{$gLogfiles{__prev__} = $gLogfile = $file} = 1;
+}
+
+
+###############################################################################
+#
+
+sub RunSystemCmd($;$$$)
+{
+    return if ($gICmd !~ $gFiltercmd);
+    my ($cmd, $keepgoing, $null, $file) = @_;
+    DPrint(1, "$cmd\n"), return if $gPrintcmd;
+    local $gError = 0 if ($keepgoing = (defined($keepgoing) && ($keepgoing =~ /^[123]$/) ? $keepgoing : 0));
+    local $gKeepgoing = Max($gKeepgoing, $keepgoing) if $keepgoing;
+    $file = (defined($file) ? GetAbsFname($file) : "");
+    @gCmdoutbuf = ();
+    DPrint(4, local $_ = "RunSystemCmd(" . GetAbsDirname(".") . "): `$cmd'" .
+        ($keepgoing ? ", keep going" . ($keepgoing > 1 ? "($keepgoing)" : "") : "") .
+        ($file ? ", redirect to `$file'" : "") . ($null ? ", redirect stdout to null" : "") .
+        ($gOutfilter ? ", filter: `/$gOutfilter/i'" : "") . "\n");
+    OpenFile(*CMDFILE, GetWriteFname($file), 0) or
+        (die("Can't write to `$file'.\n"), $file = "") if $file;
+    print(CMDFILE $_) if $file;
+    my $dur = time();
+    open(CMD, "$cmd 2>&1 |");
+    DPrint(8, STARTSTR . "\n");
+    while ($_ = <CMD>) {
+        chomp();
+        push(@gCmdoutbuf, $_);
+        next if ($gOutfilter && !/$gOutfilter/i);
+        DPrint(8, "$_\n") if !$null;
+        print(CMDFILE "$_\n") if $file;
+    }
+    close(CMD);
+    my $error = ($? >> 8);
+    close(CMDFILE) if $file;
+    push(@gStepDur, $dur = time() - $dur);
+    $gOutfilter = "";
+    print(map("$_\n", @gCmdoutbuf)) if ($error && !$gKeepgoing && !$null && $gVerbose && !($gVerbose & 8));
+    $dur = Sec2Min($dur);
+    DPrint(8, substr(ENDSTR, 0, -16) . $dur . substr(ENDSTR, length($dur) - 16) . "\n");
+    die("Command `$cmd' failed ($error) in `" . GetAbsDirname(".") . "'.\n") if $error;
+    return($error);
+}
+
+
+###############################################################################
+#
+
+sub ParseSystemCmd($$$$$)
+{
+    return if SkipICmd();
+    my ($title, $inclre, $exclre, $file, $lines) = @_;
+    ($inclre, $exclre) = (eval("qr$inclre"), $exclre ne "" ? eval("qr$exclre") : qr/^$/);
+    $lines = ($lines ? $lines - 1 : 0);
 
-        foreach my $target ($hptarg || $targets eq "" ? $targets : split(/\s/, $targets)) {
-            ($cmdarg, $target) = imaker::Menu($makecmd, $mainmk, $cmdarg) if $target eq "menu";
-            system($ENV{IMAKER_MAKECMD} = "$makecmd TIMESTAMP=" . imaker::GetTimestamp() . " $cmdarg $mainmk $target")
-                if $target ne "menu";
-            $error = ($? >> 8) if ($? >> 8);
+    my @parse = ();
+    for (my $i = 0; $i < @gCmdoutbuf; $i++) {
+        next if ($gCmdoutbuf[$i] !~ $inclre);
+        push(@parse, join(" | ", @gCmdoutbuf[$i .. $i + $lines])) if ($gCmdoutbuf[$i] !~ $exclre);
+        $i += $lines;
+    }
+    return if !@parse;
+    if (!$file) {
+        DPrint(1, "$title\n", map(sprintf("%" . length(@parse) . "s", $_) . ") $parse[$_ - 1]\n", 1 .. @parse));
+    } else {
+        WriteFile($title, join("\n", @parse), "", "q");
+    }
+}
+
+
+###############################################################################
+#
+
+sub GenExclfile($$$$$)
+{
+    return if SkipICmd();
+
+    my ($exclfile, $base, $prefix, $exclfiles, @exclfiles) = (shift(), GetAbsDirname(shift()), shift(), "", ());
+
+    if (!-f($exclfile)) {
+        WriteFile($exclfile, "", "");
+    } else {
+        OpenFile(*FILE, $exclfile, 1) or die("Can't read file `$exclfile'.\n"), return;
+        read(FILE, $exclfiles, -s($exclfile));
+        close(FILE);
+        @exclfiles = split(/\n/, Uni2Ascii($exclfiles));
+    }
+
+    my $findfiles = 0;
+    my @addfiles = map($_ ne "**" ? $_ : "*", grep(!(($_ eq "*") && ++$findfiles),
+        map(Trim(Unquote(Trim($_))), grep(!/^\s*(?:#.*)?$/, split(/(?<!\\)\\n/, shift())))));
+
+    if ($findfiles) {
+        $exclfiles = "";
+        foreach (@exclfiles, @addfiles, map(Trim(Unquote(Trim($_))), grep(!/^\s*(?:#.*)?$/, split(/(?<!\\)\\n/, shift())))) {
+            (my $file = $_) =~ tr/\\/\//;
+            $file =~ s/^(?:[a-z]:)?\/*//i;
+            $exclfiles .= ($exclfiles ne "" ? "|" : "") . Wcard2Restr($file);
         }
+        push(@addfiles, map(GetRelFname($_, $base), Find($base, "*", "/^\\/(?:$exclfiles)\$/i", 1, 0, local $_)));
+    }
 
-#        imaker::DPrint(1, "\nTotal duration: " . imaker::Sec2Min(time() - $start) . "\n");
-        exit($error || 0);
+    $prefix =~ s/[\/\\]+$//;
+    WriteFile($exclfile, join("", map("$_\n", @exclfiles,
+        map(s/^(?:[a-z]:)?\\*/$prefix\\/i ? $_ : $_, map(tr/\//\\/ ? $_ : $_, @addfiles)))), "u", "q");
+}
+
+sub GenIbyfile($$$)
+{
+    return if SkipICmd();
+    my ($ibyfile, $ibystr, $oride, $prevoride) = (shift(), "", "", "");
+
+    map {
+        die("GenIbyfile: Invalid file list configuration: `$_'\n"), return
+            if !/^\s*(?:"(.+?)"|(\S+))\s+(?:"(.+?)"|(\S+))\s*$/;
+        $_ = [defined($1) ? $1 : $2, defined($3) ? $3 : $4];
+    } (my @files = map(Unquote($_), grep(!/^\s*(?:#.*)?$/, split(/(?<!\\)\\n/, shift()))));
+
+    my @ibyconf = map(Unquote($_), grep(!/^\s*(?:#.*)?$/, split(/(?<!\\)\\n/, shift())));
+
+    foreach (@ibyconf) {
+        die("GenIbyfile: Invalid configuration: `$_'\n"), return
+            if !/^\s*(?:"(.+?)"|(\S+))\s+(hide|remove|(?:replace|udeb|urel)(?:-add)?)\s+(\*|core|rofs[2-6])\s*$/i;
+        next if ($4 ne "*") && (uc($4) ne $gImgtype);
+        my $action = lc($3);
+        my $file = Wcard2Restr(defined($1) ? $1 : $2);
+        $file = qr/(?:^|\\|\/)$file$/i;
+        foreach (@files) {
+            next if (@$_[1] !~ $file);
+            $oride = ($action =~ /add$/ ? "ADD" : ($action eq "hide" ? "" : "SKIP"));
+            my $src = ($action eq "remove" ? "empty" : @$_[0]);
+            if ($action =~ /^udeb/) {
+                $src =~ s/(?<=[\/\\])urel(?=[\/\\])/udeb/i;
+            } elsif ($action =~ /^urel/) {
+                $src =~ s/(?<=[\/\\])udeb(?=[\/\\])/urel/i;
+            }
+            $ibystr .= ($prevoride && ($oride ne $prevoride) ? "OVERRIDE_END\n" : "") .
+                ($oride && ($oride ne $prevoride) ? "OVERRIDE_REPLACE/$oride\n" : "") .
+                ($oride ? "override=\"$src\"  " : "hide=") . "\"@$_[1]\"\n";
+            $prevoride = $oride;
+        }
+    }
+    WriteFile($ibyfile, ($ibyfile =~ /^>>([^>].*)$/ && -f($1) ? "" : "// Generated `$ibyfile'") .
+        "\n\n/* Custom override configuration\n" . join("\n", @ibyconf) . "\n*/\n$ibystr" .
+        ($oride ? "OVERRIDE_END\n" : ""), "", "q");
+}
+
+sub GenObyfile($$$$@)
+{
+    return if SkipICmd();
+
+    my ($ibyfile, $srcdir, $subdir, $finddir) = (GetAbsFname(shift()), shift(), shift(), shift());
+    my ($header, $footer, $body, %files) = ("", "", "", ());
+
+    foreach my $dir (split(/\s+/, $srcdir)) {
+        $dir = GetAbsDirname($dir);
+        my ($found, $total, $lines) = (0, 0, "");
+        my @param = @_;
+        while (@param) {
+            my ($filepat, $format, @lines) = (shift(@param), shift(@param), ());
+            $header = $format, next if $filepat =~ /^__header__$/i;
+            $footer = $format, next if $filepat =~ /^__footer__$/i;
+            foreach my $src (Find($dir, $filepat, "", $subdir, $finddir, $total)) {
+                next if $files{$src};
+                $files{$src} = 1;
+                (my $line = $format) =~ s/%1/$src/g;
+                $line =~ s/%2/GetRelFname($src, $dir, 1)/ge;
+                $line =~ s/%3/GetAbsFname($src)/ge;
+                if ($line =~ /%4/) {
+                    my $attrib = "";
+                    if ($gWinOS) {
+                        Win32::File::GetAttributes($src, $attrib);
+                        $attrib = (($attrib & WIN32_FILE_HIDDEN) ? "attrib=H" : "");
+                    }
+                    $line =~ s/%4/$attrib/ge;
+                }
+                push(@lines, Trim($line));
+            }
+            $found += @lines;
+            $lines .= "//\n// Format: `$format', " . @lines . ($finddir ? " empty directories" : " files") .
+                 ": `$filepat'\n" . (@lines ? "//\n" . join("\n", @lines) . "\n" : "");
+        }
+        $body .= "\n// Collected entries $found/$total from directory `$dir'" .
+            ($subdir ? " and subdirectories" : "") . "\n$lines";
     }
 
-    #==========================================================================
+    my $append = ($ibyfile =~ s/^>>(?!>)// && -f($ibyfile) && ">>" || "");
+    (my $fname = "__" . uc(GetBasename($ibyfile)) . "__") =~ s/\W/_/g;
+    my @previby = ();
+
+    if ($append) {
+        OpenFile(*FILE, $ibyfile, 0) or die("Can't read file `$ibyfile'.\n"), return;
+        @previby = <FILE>;
+        close(FILE);
+        $previby[0] =~ s/(, collected )(\d+)( entries)$/$1.($2 + keys(%files)).$3/e;
+        $previby[@previby - 1] = "";
+    }
+    WriteFile($ibyfile, join("", @previby) . ($append ? "// Appended" : "// Generated") .
+        " `$append$ibyfile', collected " . keys(%files) . " entries\n" .
+        ($append ? "" : "\n#ifndef $fname\n#define $fname\n") .
+        ($header ? Unquote("\\n$header\\n") : "") . $body . ($footer ? Unquote("\\n$footer\\n") : "") .
+        "\n#endif // $fname\n", "", "q");
+}
+
+sub GenWidgetConf($$$$)
+{
+    return if SkipICmd();
+    my ($wgzini, $ini, $dir) = (shift(), GetAbsFname(shift()), GetAbsDirname(shift()));
+    my @ini   = ($ini eq "" ? () : ReadFile($ini,  0));
+    my $files = ($dir eq "" ? "" : join("\n", Find($dir, "*", '/\/(?:' . join("|",
+        map(GetBasename($_), ($ini, map(!/^\s*[#[]/ && /^\s*(?:"(.+?)"|(\S+))/ &&
+            -e(local $_ = (defined($1) ? $1 : $2)) ? $_ : (), @ini)))) . ')$/i', 0, 0, local $_)));
+
+    WriteFile($wgzini, Unquote(shift()) .
+        (@ini ? "# Copied lines from `$ini':\n" . join("\n", @ini) : "") . "\n" .
+        ($files ? (@ini ? "\n" : "") . "# Collected files from `$dir':\n$files\n" : ""), "", "q");
+}
+
+
+###############################################################################
+#
+
+sub GenMakefile($$$$$)
+{
+    return if SkipICmd();
+    my ($hdrfile, $mkfile, $filter, $prepros, $assignop) =
+        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
+    ChangeDir(GetDirname($hdrfile));
+    RunSystemCmd("$prepros " . GetBasename($hdrfile));
+    my $maxdef = Max(map(/^\s*\#define\s+($filter)/ && length($1), @gCmdoutbuf));
+    WriteFile($mkfile, join('\n',
+        map(/^\s*\#define\s+($filter)\s*(.*?)\s*$/ ? sprintf("%-${maxdef}s $assignop %s", $1, $2 eq "" ? 1 : $2) : (), sort(@gCmdoutbuf))) . '\n', "");
+}
+
+
+###############################################################################
+#
+
+sub AddImageHeader($$$$$)
+{
+    return if SkipICmd();
+    my ($file, $hdrfile, $hdrstr, $hdrsize, $align) =
+        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
+
+    $hdrstr =~ s/\/\*.*?\*\///g;
+    $hdrstr =~ s/,\s*$//;
+    WriteFile($hdrfile, $hdrstr, "b");
+    die("Invalid image header size: " . sprintf("0x%X", -s($hdrfile)) . " (!=$hdrsize).\n"), return
+        if -s($hdrfile) ne hex($hdrsize);
+
+    $align = Max(hex($align), hex($hdrsize)) - hex($hdrsize);
+    WriteFile(">>$hdrfile", ("0," x ($align - 1)) . "0", "b") if $align;
+    Copy($file, ">>$hdrfile") if $file ne "";
+}
+
+
+###############################################################################
+#
 
-    my ($opt_cmdfile, $opt_incdir, $opt_logfile, $opt_printcmd, $opt_step, $opt_verbose, $opt_workdir) =
-       ( "",           "",          "",           0,             "",        1,            ".");
-    Getopt::Long::GetOptions(
-        "cmdfile=s" => \$opt_cmdfile,
-        "incdir=s"  => \$opt_incdir,
-        "logfile=s" => \$opt_logfile,
-        "printcmd"  => \$opt_printcmd,
-        "step=s"    => \$opt_step,
-        "verbose=s" => \$opt_verbose,
-        "workdir=s" => \$opt_workdir,
-        "<>"        => sub { $error .= ($error ? ", `@_'" : "Unknown imaker.pl option: `@_'") });
+sub Sleep($)
+{
+    return if SkipICmd();
+    sleep(shift());
+}
+
+
+###############################################################################
+#
+
+sub FindSOSFiles($$$$)
+{
+    return if SkipICmd();
+
+    my ($dirs, $imgoby, $pluglog, $opt) = @_;
+    my ($file, %files) = ("", ());
+    local $_;
+
+    foreach my $dir (GlobFiles($dirs)) {
+        my ($featvar, @pluglog) = ("", Find($dir = GetAbsDirname($dir), $pluglog, "", 1, 0, $_));
+
+        foreach $file (@pluglog) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            while (<FILE>) {
+                last if !/^.+?\.pm: Initializing; /;
+                $featvar = $1, last if / feature variant = `(.+)'$/;
+            }
+            close(FILE);
+            last if ($featvar ne "");
+        }
 
-    if ($opt_incdir) {
-        my $bsf = ($opt_incdir =~ s/:bsf$//);
-        print(map("$_\n", imaker::GetFeatvarIncdir($opt_incdir, $bsf)));
-        exit;
+        foreach $file (Find($dir, $imgoby, "", 1, 0, $_)) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            while (<FILE>) {
+                next if ($_ !~ FILESPECSTATEMENT) && ($_ !~ BOOTBINARYSTATEMENT);
+                $file = GetAbsFname(defined($1) ? $1 : $2);
+                $files{lc($file)} = $file if !exists($files{lc($file)});
+                next if ($file !~ s/\.[0-9a-f]{32}\./\./i);
+                $file .= (-f("$file.$featvar.vmap") ? ".$featvar.vmap" : ".vmap");
+                $files{lc($file)} = $file if !exists($files{lc($file)});
+            }
+            close(FILE);
+        }
+
+        my ($incfile, $spifile, $plugfile, $patchfile) = (0, 0, 0, 0);
+        foreach $file (@pluglog) {
+            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
+            while (<FILE>) {
+                $incfile   = 1, next if /^Finding include hierarchy from /;
+                $incfile   = 0, next if ($incfile && /^Found \d+ different include files$/);
+                $spifile   = 1, next if /^Finding SPI input files from /;
+                $spifile   = 0, next if ($spifile && /^Found \d+ SPI input files$/);
+                $plugfile  = 1, next if /^Reading (ROM|ROFS1|UDEB|UREL) files from /;
+                $plugfile  = 0, next if ($plugfile && /^Found \d+ entries$/);
+                $patchfile = 1, next if /^Finding ROM-patched components$/;
+                $patchfile = 0, next if ($patchfile && /^Found \d+ ROM-patched components$/);
+                $files{lc($file)} = $file, next
+                    if (($incfile || $spifile || $plugfile) && /`(.+)'$/ && !exists($files{lc($file = GetAbsFname($1))}));
+                next if (!$patchfile || !/^`(.+)'$/);
+                $file = GetAbsFname($1) . ".map";
+                $files{lc($file)} = $file, next if -f($file);
+                $file =~ s/(\..*?\.map)$/\.\*$1/;
+                foreach (glob($file =~ /\s/ ? "\"$file\"" : $file)) {
+                    ($file = lc()) =~ s/\.map$//;
+                    $files{lc()} = $_, last if exists($files{$file});
+                }
+            }
+            close(FILE);
+        }
+
+        $dir .= "/" if $dir !~ /\/$/;
+        foreach $file (keys(%files)) {
+            delete($files{$file}) if ($file =~ /^$dir/i);
+        }
     }
 
-    $opt_verbose = imaker::SetVerbose($opt_verbose);
+    @gFindresult = () if (!defined($opt) || $opt !~ /a/);
+    push(@gFindresult, values(%files));
+}
+
+
+###############################################################################
+#
+
+sub CheckTool(@)
+{
+    return if SkipICmd();
+    my ($maxtlen, $maxvlen, @tools) = (4, 9, ());
+    while (@_) {
+        my ($tool, $vquery, $getver, $version, $md5sum) = (shift(), shift(), shift(), " -", " ?");
+        if (length($vquery) > 1) {
+            RunSystemCmd($vquery, 3, 1);
+            $version = (join("\n", @gCmdoutbuf) =~ eval($getver =~ /^\// ? "qr$getver" : "qr/$getver/ims") ?
+                (defined($1) && defined($2) && "`$1 $2'" || defined($1) && "`$1'" || " ?") : " ?");
+        }
+        OpenFile(*FILE, $tool, 1) and $md5sum = "`" . md5_hex(<FILE>) . "'";
+        close(FILE);
+        $maxtlen = Max($maxtlen, length($tool));
+        $maxvlen = Max($maxvlen, length($version));
+        push(@tools, "`$tool'", $version, $md5sum);
+    }
+    $maxtlen += 2;
+    @_ = (" Tool", " Version", " MD5 Checksum", "-" x $maxtlen, "-" x $maxvlen, "-" x 34, @tools);
+    DPrint(1, sprintf("%-${maxtlen}s %-${maxvlen}s ", shift(), shift()) . shift() . "\n") while(@_);
+}
+
+
+###############################################################################
+#
+
+sub OpCacheInstall($$$)
+{
+    return if SkipICmd();
+    my ($ini, $conf, $tmpdir) = @_;
+    my %opt = (-e => "", -i => "", -m => "", -o => "", -u => "");
 
-    imaker::DPrint(2, "=" x 79 . "\nTIME: " . localtime() . ", USER: " . getlogin() .
-        ", HOST: " . ($ENV{HOSTNAME} || $ENV{COMPUTERNAME} || "?") . "\n$^X (v$perlver-$^O)\n");
+    foreach $conf ("opcache_config=$conf", ($ini ne "" ? grep(!/^\s*#/, ReadFile($ini, 0)) : ())) {
+        (local $_, my $error, my %tmpopt) = ($conf, 0, %opt);
+        if (!($error = !(s/^\s*opcache_config\s*[=\s]//i || s/^\s*opcache_content\s*[=\s]/-i /i))) {
+            my @opt = ParseCmdWords($_);
+            while (@opt) {
+                last if ($error = ((($_ = shift(@opt)) !~ /^-[eimou]$/i) ||
+                    !defined($tmpopt{$_} = shift(@opt))));
+                $tmpopt{$_} =~ s/EPOCROOT/$gEpocroot/g;
+            }
+        }
+        die("OpCacheInstall: Invalid configuration entry: `$conf'\n"), next if $error;
+        %opt = %tmpopt;
+    }
+    if (-d($opt{-i})) {
+        $opt{-i} = GetAbsDirname($opt{-i});
+    } elsif (-f($opt{-i})) {
+        DeleteDir($tmpdir);
+        MakeDir($tmpdir);
+        RunSystemCmd("$gTool{unzip} x -y \"" . GetAbsFname($opt{-i}) . "\"" .
+            " -o\"" . ($tmpdir = GetAbsDirname($tmpdir)) . "\"", 0, 1);
+        $opt{-i} = $tmpdir;
+    }
+    RunSystemCmd("$gTool{opcache} -u \"$opt{-u}\" -e \"$opt{-e}\" -m \"" .
+        GetAbsFname($opt{-m}) . "\" -i \"$opt{-i}\" -o \"" . GetAbsDirname($opt{-o}) . "\"");
+}
+
+
+###############################################################################
+#
+
+sub SisInstall($$$$$$$$)
+{
+    return if SkipICmd();
+
+    my ($ini, $intini, $conf, $hda, $hdata, $idata, $outdir, $log) =
+        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), GetAbsFname(shift()),
+            shift(), shift(), GetAbsDirname(shift()), shift());
+    my %gopt = (-d => "C", -k => "5.4", -w => "info", '--ignore-err' => 0);
 
-    imaker::SetLogfile($opt_logfile);
-    die("$error.\n") if $error;
+    my %haldata = ();
+    map { $haldata{uc($1)} = $2 if /^\s*(\S+)\s+(\S+)\s*$/ } split(/(?<!\\)\\n/, $hdata);
+    $gOutfilter = '\S';
+    RunSystemCmd("$gTool{cpp} -nostdinc -undef \"$hda\"", 1, 1, $log) if ($hda ne "");
+
+    local @_ = (map(!/^\s*E(\S+)\s*=\s*(\S+)\s*$/ ? () : (uc($1) . " = " .
+        (exists($haldata{uc($2)}) ? $haldata{uc($2)} : (exists($haldata{uc("E$1_$2")}) ?
+            $haldata{uc("E$1_$2")} : $2)) . "\n"), @gCmdoutbuf),
+        map(/^\s*$/ ? () : Trim($_) . "\n", split(/(?<!\\)\\n/, $idata)));
+
+    WriteFile($intini, join("", @_), "", "q");
+    RunSystemCmd("$gTool{interpretsis} -i \"$intini\"", 3, 1);
+    map { $_[$1 - 1] = undef if /Unsupported keyword.+?(\d+)/i } @gCmdoutbuf;
+    WriteFile($intini, join("", grep(defined(), @_)), "", "q");
+
+    my ($clean, @dir) = (0, Find($outdir, "*", "", 1, 1, $_));
+    @_ = ("sis_config=$conf", ($ini ne "" ? grep(!/^\s*#/, ReadFile($ini, 0)) : ()), "sis_content=");
+
+    for (my $i = 0; $i < @_; $i++) {
+        local $_ = $_[$i];
+        my ($error, $global, $runtool, %opt) = (0, 0, 0, %gopt);
+        if (!($error = !(s/^\s*sis_(config)\s*[=\s]//i || s/^\s*sis_(content)\s*[=\s]/-s /i))) {
+            $global = ($1 =~ /config/i);
+            my @opt = ParseCmdWords($_);
+            while (@opt) {
+                $_ = shift(@opt);
+                shift(@opt) if ((my $next = (@opt ? ($opt[0] !~ /^!?[-+]/ ? $opt[0] : "") : "")) ne "");
+                next if /^!?-[cilwx]$/;
+                if (s/^!//) { delete($opt{$_}) }
+                else {
+                    $_[$#_]  .= "\"$next\"", next if (!$i && /^-s$/);
+                    ($opt{$_} = $next) =~ s/EPOCROOT/$gEpocroot/g;
+                    $runtool  = ($next !~ /^\s*$/) if /^-s$/;
+                }
+            }
+        }
+        die("SisInstall: Invalid configuration entry: `$_[$i]'\n"), next if $error;
+        %gopt = %opt if $global;
+        next if !$runtool;
 
-    foreach (split(/-+/, $opt_step)) {
-        $error .= ($error ? ", `$_'" : "Unknown imaker.pl step: `$_'")
-            if (!/^\w+:?([cbk\d]+)?$/i) || $1 && ($1 =~ /c.*c|b.*b|k.*k|\d[^\d]+\d/i);
+        foreach (-d($opt{-s}) ? Find($opt{-s}, '/\.sisx?$/i', "", 0, 0, $_) : (GetAbsFname($opt{-s}))) {
+            ($opt{-s}, my $puid) = ($_, "?");
+            OpenFile(*SISFILE, $_, 1, "") and sysread(SISFILE, $puid, 3 * 4) and
+                $puid = sprintf("%08X", unpack("V", substr($puid, 8, 4)));
+            close(SISFILE);
+            DPrint(16, "SisInstall: `$_', pUID: $puid" . ($opt{'--ignore-err'} ? ", ignore errors\n" : "\n"));
+
+            my $icmd = $gTool{interpretsis} . (join("", map(($opt{$_} ne "" ? " $_ \"$opt{$_}\"" : " $_"),
+                sort({lc($a) cmp lc($b)} grep(/^-[^s]/ && !/^--ignore-err$/, keys(%opt)))))) .
+                " -c \"" . (GetAbsDirname($outdir)) . "\" -i \"" . (GetAbsFname($intini)) . "\"";
+            $error = RunSystemCmd("$icmd -s \"$opt{-s}\"" . join("", map(" $_",
+                sort({lc($a) cmp lc($b)} grep(/^\+/, keys(%opt))))), 1, 1, ">>$log");
+            my $errmsg = join(" | ", grep(s/^ERR\s*:\s*//, @gCmdoutbuf));
+
+            $_ = join(", ", map(/^INFO:\s+Installing file:\s+\w:\\sys\\bin\\(.+?.exe)\s*$/io &&
+                ($_ = $1) && (qx($gTool{elf2e32} --dump=h --e32input "$outdir/sys/bin/$_") =~
+                    /^Uids:\s+.+?\s+([0-9a-f]+)\s+\(/imo) ? "$_: " . uc($1) : (), @gCmdoutbuf));
+            DPrint(16, "SisInstall: `" . GetBasename($opt{-s}) . "', exe UIDs: $_\n")
+                if ($_ && (!($error ||= $errmsg) || $opt{'--ignore-err'}));
+
+            warn("Installation of SIS file `$opt{-s}' failed" . ($errmsg ? ": `$errmsg'.\n" : ".\n"))
+                if ($gErrwarn = $error);
+            next if (!$error || $opt{'--ignore-err'});
+            $clean = 1;
+            warn("Removing installation of SIS file `$opt{-s}'.\n");
+            RunSystemCmd("$icmd -x $puid", 3, 1, ">>$log");
+        }
     }
-    die("$error.\n") if $error;
+    return if !$clean;
+    my $i = 0;
+    foreach (Find($outdir, "*", "", 1, 1, $_)) {
+        if (($i <= $#dir) && ($_ eq $dir[$i])) { $i++ }
+        else { DeleteDir($_) }
+    }
+}
+
+
+###############################################################################
+#
+
+sub GetIPar(;$)
+{
+    my $par = shift(@gIcmd);
+    $par = ((my $empty = !defined($par)) ? "<UNDEFINED>" : PEval($par));
+    $gParamcnt = 0 if shift();
+    DPrint(32, "iPar: $gParamcnt. `$par'\n") if $gParamcnt && ($gICmd =~ $gFiltercmd);
+    $gParamcnt++;
+    return($empty ? undef : $par);
+}
 
-    imaker::SetWorkdir($opt_workdir);
-    imaker::ReadICmdFile($opt_cmdfile);
+sub PEval($)
+{
+    local $_ = shift();
+    while (/\@PEVAL{.*}LAVEP\@/) {
+        my $start = rindex($_, '@PEVAL{', my $end = index($_, '}LAVEP@') + 7);
+        my ($expr, $eval, $evalerr) = (substr($_, $start + 7, $end - $start - 14), undef, "");
+        eval {
+            local $_;
+            local $gEvalerr = (SkipICmd() ? 1 : 2);
+            $eval = eval($expr);
+            ($evalerr = $@) =~ s/^(.+?) at .*/$1/s;
+        };
+#        DPrint(64, "PEval: Evaluate `$expr' = `" . (defined($eval) ? $eval : "") . "'\n");
+        if (!defined($eval)) {
+            $eval = "";
+            warn("PEval: Evaluation of `$expr' failed: $evalerr.\n") if !SkipICmd();
+        }
+        substr($_, $start, $end - $start) = $eval;
+    }
+    return($_);
+}
+
+sub PeekICmd($)
+{
+    return(defined($gIcmd[0]) && $gIcmd[0] =~ /^$_[0]$/i);
+}
+
+sub SkipICmd()
+{
+    return($gPrintcmd || defined($gICmd) && ($gICmd !~ $gFiltercmd));
+}
 
-    my (@step, @stepdur) = (split(/-+/, lc($opt_step)), ());
-    my ($durstr, $maxslen, $maxdlen) = ("", 6, 8);
+sub GetICmd()
+{
+    $gICmd = GetIPar(1);
+    DPrint(32, "iCmd: " . ++$gCmdcnt . ". `$gICmd'\n") if defined($gICmd) && ($gICmd ne "") && ($gICmd =~ $gFiltercmd);
+}
+
+sub EndICmd()
+{
+    GetICmd(), return(1) if !defined($gIcmd[0]) || PeekICmd("end");
+    return(0);
+}
+
+
+###############################################################################
+#
+
+sub SplitStep($)
+{
+    (my $step = shift()) =~ s/(?<!(\\|\s))\|/ \|/g;  # ???
+    return(map((s/^\s+|(?<!\\)\s+$//g, s/\\\|/\|/g) ? $_ : $_, split(/(?<!\\)\|/, "$step ")));
+}
+
+sub RunStep($)
+{
+    ($gStep, my $dur, @gStepDur) = (shift(), time(), ());
+    ChangeDir($gWorkdir);
+    DPrint(2, "=" x 79 . "\nENTER: `$gStep'\n");
+
+    push(@gReport, $gLogfile ? ("iMaker log", $gLogfile =~ /^>>?([^>].*)$/ ? $1 : $gLogfile, "f") : (),
+        SplitStep($gStepIcmd{"REPORT_$gStep"})) if exists($gStepIcmd{"REPORT_$gStep"});
+
+    foreach my $step ("INIT_$gStep", "CLEAN_$gStep", "BUILD_$gStep") {
+        next if (!exists($gStepIcmd{$step}) || $gStepIcmd{$step} =~ /^\s*$/);
+        DPrint(64, "$step = `$gStepIcmd{$step}'\n");
+        @gIcmd = SplitStep($gStepIcmd{$step});
+        my ($file, $iferror, @iffi) = ("", 0, ());
 
-    foreach my $stepnum (0 .. $#step) {
-        $step[$stepnum] =~ /^(\w+):?([cbk\d]+)?$/;
-        my $step = uc($1);
-        $_ = (defined($2) ? $2 : "");
-        my @dur = imaker::MakeStep($step, /c/, /b/, /k/, /(\d+)/ ? $1 : $opt_verbose, $opt_printcmd);
-        imaker::SetVerbose($opt_verbose);
-        my ($cmddur, $stepdur) = (0, pop(@dur));
-        $durstr = imaker::Sec2Min($stepdur);
-        if (@dur) {
-            $durstr .= " (";
-            foreach my $dur (@dur) {
-                $cmddur += $dur;
-                $durstr .= imaker::Sec2Min($dur) . " + ";
+        while (GetICmd(), defined($gICmd)) {
+            next if (local $_ = lc($gICmd)) eq "";
+            if (/^if$/) {
+                push(@iffi, (my $if = GetIPar()), $gFiltercmd);
+                $gFiltercmd = qr/^X$/ if !$if;
+            }
+            elsif (/^else$/) {
+                $gFiltercmd = ($iffi[$#iffi - 1] ? qr/^X$/ : $iffi[$#iffi]);
+            }
+            elsif (/^fi$/) {
+                $gFiltercmd = pop(@iffi);
+                pop(@iffi);
+            }
+            elsif (/^(error|warning)$/) {
+                my ($errwarn, $msg) = (GetIPar(), GetIPar() . "\n");
+                next if SkipICmd();
+                die($msg)  if $errwarn && /e/;
+                warn($msg) if $errwarn && /w/;
+            }
+            elsif (/^echo(\d+)?(-q)?$/) {
+                Echo((defined($1) && ($1 < 128) ? $1 : 1), GetIPar(), defined($2));
+            }
+            elsif (/^filter$/) {
+                $gOutfilter = GetIPar();
+            }
+            elsif (/^cmd(tee)?(-(k[0123]?|n)+)?$/) {
+                RunSystemCmd(GetIPar(), (/k(\d)/ ? int($1) : (/k/ ? 1 : 0)), /n/, /tee/ ? GetIPar() : "");
+            }
+            elsif (/^parse(f)?(?:-(\d+))?$/) {
+                ParseSystemCmd(GetIPar(), GetIPar(), GetIPar(), $1, $2);
+            }
+            elsif (/^(cd|copy(dir|iby)?|del(dir)?|find(dir)?(-[afr]+)?|headb|logfile|mkcd|mkdir|move|tailb|test|touch|type[bu]?|unzip|workdir|write[bu]?(-[cq]+)?|zip(dir)?(-[jq]+)?)$/) {
+                my @files = GlobFiles(GetIPar());
+                my $par1 = GetIPar() if /^(?:copy|find|head|move|tail|touch|(un)?zip|write)/;
+                my $par2 = GetIPar() if /^(?:find|head|tail|zip)/;
+                next if SkipICmd();
+                @gFindresult = () if /find(?:dir)?(-[afr]+)?/ && (!defined($1) || ($1 !~ /a/));
+                Touch($par1, @files), next                     if /touch/;
+                foreach $file (@files) {
+                    ChangeDir($file)                           if /^cd/;
+                    DeleteDir($file)                           if /deldir/;
+                    FindDir($file, $par1, $par2, $1)           if /finddir(-[ar]+)?/;
+                    MakeDir($file)                             if /mkdir/;
+                    MakeChangeDir($file)                       if /mkcd/;
+                    SetWorkdir($file)                          if /workdir/;
+                    Zip($file, 1, $1, $par2, GlobFiles($par1)) if /zipdir(-[jq]+)?/;
+                    DeleteFile($file)                          if /del/;
+                    FindFile($file, $par1, $par2, $1)          if /find(-[afr]+)?$/;
+                    HeadFile($file, $par1, $par2)              if /headb/;
+                    SetLogfile($file)                          if /logfile/;
+                    TailFile($file, $par1, $par2)              if /tailb/;
+                    TypeFile($file, $1)                        if /type(b|u)?/;
+                    UnzipFile($file, $par1)                    if /unzip/;
+                    WriteFile($file, $par1, $1, $2)            if /write(b|u)?(-[cq]+)?/;
+                    Zip($file, 0, $1, $par2, GlobFiles($par1)) if /^zip(-[jq]+)?$/;
+                    Copy($file, $par1, $1)                     if /copy(dir)?$/;
+                    CopyIby($file, $par1)                      if /copyiby/;
+                    Move($file, $par1)                         if /move/;
+                    Test($file)                                if /test/;
+                }
+            }
+            elsif (/^filtercmd$/) {
+                $gFiltercmd = GetIPar();
+                $gFiltercmd = ($gFiltercmd eq "" ? qr/\S/ : qr/$gFiltercmd/i);
+            }
+            elsif (/^genexclst$/) {
+                GenExclfile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^geniby(-[dr]+)?$/) {
+                my ($opt, $iby, $dir, @par) = ($1 || "", GetIPar(), GetIPar(), ());
+                push(@par, GetIPar(), GetIPar()) while !EndICmd();
+                GenObyfile($iby, $dir, $opt =~ /r/, $opt =~ /d/ ? 2 : 0, @par);
+            }
+            elsif (/^genorideiby$/) {
+                GenIbyfile(GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^genmk$/) {
+                GenMakefile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^genwgzcfg$/) {
+                GenWidgetConf(GetIPar(), GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^iferror$/) {
+                $iferror++;
+                $gError = 0, next if $gError;
+                while (defined($gIcmd[0])) {
+                    GetICmd(), last if PeekICmd("endif") && !--$iferror;
+                    $iferror++ if shift(@gIcmd) =~ /^iferror$/i;
+                }
+            }
+            elsif (/^endif$/ && $iferror--) {
+            }
+            elsif (/^imghdr$/) {
+                AddImageHeader(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^pause$/) {
+                DPrint(0, "Press Enter to continue...\n");
+                getc();
+            }
+            elsif (/^sleep$/) {
+                Sleep(GetIPar());
+            }
+            elsif (/^sosfind(-a)?$/) {
+                my $opt = $1;
+                FindSOSFiles(GetIPar(), GetIPar(), GetIPar(), $opt);
+            }
+            elsif (/^tool-(\w+)$/) {
+                $gTool{$1} = GetIPar();
+#                DPrint(2, "SetTool: $1: `$gTool{$1}'\n");
+            }
+            elsif (/^toolchk$/) {
+                my @tools = ();
+                push(@tools, GetIPar(), GetIPar(), GetIPar()) while !EndICmd();
+                CheckTool(@tools);
+            }
+            elsif (/^opcache$/) {
+                OpCacheInstall(GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (/^sisinst$/) {
+                SisInstall(GetIPar(), GetIPar(), GetIPar(), GetIPar(),
+                    GetIPar(), GetIPar(), GetIPar(), GetIPar());
+            }
+            elsif (!$gImakerext || !RunIExtCmd($_)) {
+                die("Unknown iMaker command `$gICmd'.\n");
             }
-            $durstr .= imaker::Sec2Min($stepdur - $cmddur) . ")";
+        }
+    }
+    DPrint(2, "EXIT: `$gStep', duration: " . Sec2Min($dur = time() - $dur) . "\n");
+    push(@gStepDur, $dur);
+}
+
+
+###############################################################################
+#
+
+sub GetConfmkList(;$)
+{
+    if (!%gConfmkList) {
+        my ($dir, $incl, $excl, $depth) = split(/,/, $ENV{IMAKER_MKCONF});
+        $dir = GetAbsDirname($dir, 0, 1, $gEpocdrive);
+        ($incl, $excl) = (qr/$incl/, qr/$excl/);
+        local $_;
+        DPrint(16, "FindFile: GetConfmkList: `$ENV{IMAKER_MKCONF}'");
+        find(sub { $gConfmkList{$1} = $File::Find::name
+            if (/$incl/ && !/$excl/ && (($File::Find::name =~ tr/\///) > (($dir =~ tr/\///) + $depth)));
+        }, $dir);
+        DPrint(16, ", found " . keys(%gConfmkList) . " files\n");
+        $gConfmkList{""} = "" if !%gConfmkList;
+    }
+    return(sort({lc($a) cmp lc($b)} grep($_ ne "", values(%gConfmkList)))) if shift();
+}
+
+sub GetFeatvarIncdir($)
+{
+    open(FILE, "$gEpocroot/epoc32/tools/variant/" . shift() . ".var") or
+        return("Invalid SBV feature variant");
+    my @featdata = <FILE>;
+    close(FILE);
+    my @incdir = ("@featdata" =~ /^\s*EXTENDS\s+(.+?)\s*$/m ? GetFeatvarIncdir($1) : ());
+    @incdir = () if ("@incdir" =~ /^Invalid/);
+    foreach (@featdata) {
+        next if !/^\s*ROM_INCLUDE\s+(\S+)\s+(.+?)\s*$/;
+        if ($1 eq "set")        { @incdir = ($2) }
+        elsif ($1 eq "prepend") { unshift(@incdir, $2) }
+        elsif ($1 eq "append")  { push(@incdir, $2) }
+    }
+    return(map("$_/" =~ /^$gEpocroot\// ? $_ : $gEpocroot . PathConv($_, 0, 1, $gEpocdrive),
+        map(PathConv($_, 0, 0, $gEpocdrive), @incdir)));
+}
+
+
+###############################################################################
+#
+
+sub SetVerbose($;$)
+{
+    my $verbose = Trim(shift());
+    $verbose = 127 if $verbose =~ /^debug$/i;
+    $gVerbose = int($1), return if ($verbose =~ /^(\d+)$/) && ($1 < 128);
+    $gVerbose = 1;
+    warn("Verbose level `$verbose' is not integer between 0 - 127\n") if !shift();
+}
+
+sub CloseLog()
+{
+    close(LOG) if $gLogfile;
+    $gLogfile = "";
+}
+
+
+###############################################################################
+#
+
+sub RunIMakerCmd($$$$$@)
+{
+    my ($makecmd, $cmdarg, $tgtext, $mklevel, $skipsteps, %prevtgt) = @_;
+    $ENV{IMAKER_MKLEVEL} = $mklevel;
+
+    ($cmdarg, my $hptgt, my @targets) = HandleCmdArg($cmdarg);
+
+    foreach my $tgt (@targets) {
+        my $skipstep = ($tgt =~ s/#$//) || $skipsteps;
+        (my $target = "$tgt$tgtext") =~ s/(\[\d+\])(.+)$/$2$1/;
+        if ($target eq "menu") {
+            ($cmdarg, $target) = Menu($cmdarg);
+            next if ($target eq "menu");
+            ($cmdarg) = HandleCmdArg($cmdarg);
         }
-        $step = sprintf("%" . length(@step."") . "s", $stepnum + 1) . ". $step";
-        push(@stepdur, $step, $durstr);
-        $maxslen = imaker::Max($maxslen, length($step));
-        $maxdlen = imaker::Max($maxdlen, length($durstr));
+        $prevtgt{$target =~ /^([^-]+)/ ? $1 : $target} = 1;
+        push(@gReport, Trim((($target !~ /^(.+)\[\d+\]$/) || ($gVerbose & 64) ? $target : $1) .
+            ($skipstep ? "#" : "") . " $hptgt"), -1, -$mklevel - 1);
+        my $tgtind  = $#gReport;
+        my @targets = RunMakeCmd("$makecmd $cmdarg" . ($target eq "defaultgoals" ? "" : " \"$target\"") .
+            join("", map(" \"$_\"", split(/\s+/, $hptgt))), $skipstep);
+        $gReport[$tgtind - 2] .= " (intermediate)" if @targets;
+        $gReport[$tgtind - 1] = pop(@gStepDur);
+        $gReport[$tgtind] = $mklevel + 1 if !$gError;
+        delete(@gReport[$tgtind - 2 .. $tgtind]) if (@targets && !$gError && !($gVerbose & 64));
+        map {
+            RunIMakerCmd($makecmd, "$cmdarg $_ $hptgt", $target =~ /(-.*)$/ ? $1 : "", $mklevel + 1, $skipstep, %prevtgt)
+                if !exists($prevtgt{$_});
+        } @targets;
+    }
+}
+
+sub RunMakeCmd($$)
+{
+    ($gStartmk, $gMakecmd, $gError) = (time(), Trim(shift()), 0);
+    my ($skipstep, $mkstart, $start, $restart, $cwd, %env) = (shift(), 0, 0, 0, Cwd::cwd(), %ENV);
+    my @stepdur = my @targets = ();
+    $ENV{IMAKER_MKRESTARTS} = -1;
+
+    do {
+        InitMkglobals();
+        ($gTgterr, my $printvar, my @steps) = (1, "", ());
+        $ENV{IMAKER_MKRESTARTS}++;
+
+        if ($gExportvar{""}) {
+            if (!$ENV{IMAKER_EXPORTMK}) {
+                (my $tmpfh, $ENV{IMAKER_EXPORTMK}) = File::Temp::tempfile(
+                    File::Spec->tmpdir() . "/imaker_temp_XXXXXXXX", SUFFIX => ".mk", UNLINK => 1);
+                close($tmpfh);
+                $ENV{IMAKER_EXPORTMK} =~ tr-\\-\/-;
+            }
+            WriteFile($ENV{IMAKER_EXPORTMK}, "# Generated temporary makefile `$ENV{IMAKER_EXPORTMK}'\n" .
+                "ifndef __IMAKER_EXPORTMK__\n__IMAKER_EXPORTMK__ := 1\n" .
+                join("", map(/^([^:]+)(?:\:(.+))?$/ && !defined($2) ? "$1=$gExportvar{$_}\n" :
+                    "ifeq (\$(filter $1,\$(TARGETNAME)),)\n$2=$gExportvar{$_}\nendif\n",
+                        sort({($a =~ /([^:]+)$/ && uc($1)) cmp ($b =~ /([^:]+)$/ && uc($1))}
+                            grep(!/^(?:|.*[+:?])$/, keys(%gExportvar))))) .
+                "else\n" .
+                join("", map(/^\d{3}(.+[+:?])$/ ? "$1=$gExportvar{$_}\n" : (), sort({$a cmp $b} keys(%gExportvar)))) .
+                "endif # __IMAKER_EXPORTMK__\n", "", "q", 1);
+            $gExportvar{""} = 0;
+        }
+
+        open(MCMD, "$gMakecmd 2>&1 |");
+        while (local $_ = <MCMD>) {
+            chomp();
+            DPrint(1, "$_\n"), next if !s/^#iMaker\x1E//;
+#           DPrint(64, "#iMaker#$_\n");
+
+            if (/^BEGIN$/) {
+                $mkstart = time();
+                $start = $mkstart if !$start;
+                next;
+            }
+            if (/^STEPS=(.*)$/) {
+                my $steps = $1;
+                @steps = split(/\s+/, $steps), next if ($steps !~ s/^target://);
+                @targets = grep($_ ne "", map(Trim($_), split(/(?<!\\)\|/, $steps)));
+                next;
+            }
+            $gImgtype   = $1,    next if /^IMAGE_TYPE=(.*)$/;
+            $gKeepgoing = $1,    next if /^KEEPGOING=(.*)$/;
+            $gPrintcmd  = $1,    next if /^PRINTCMD=(.*)$/;
+            SetVerbose($1),      next if /^VERBOSE=(.*)$/;
+            $gStepIcmd{$1} = $2, next if /^((?:BUILD|CLEAN|INIT|REPORT)_\S+?)=(.*)$/;
+
+            if (/^env (\S+?)=(.*)$/) {
+                DPrint(64, "$1 = `" . ($ENV{$1} = $2) . "'\n")
+                    if (!defined($ENV{$1}) || ($ENV{$1} ne $2));
+                next;
+            }
+            if (/^var (\S+?)=(.*)$/) {
+                my ($var, $val) = ($1, $2);
+                my $upd = ($var !~ s/\?$//);
+                $gExportvar{$var} = $val, $gExportvar{""}++
+                    if (!exists($gExportvar{$var}) || ($upd && $gExportvar{$var} ne $val));
+                next;
+            }
+            if (/^print (\d+) (\S+?)=(.*)$/) {
+                $printvar  = ("=" x 79) . sprintf("\n%-$1s = `$gMakecmd'\n", "Make command") if ($printvar eq "");
+                $printvar .= sprintf("%-$1s = `$3'\n", $2);
+                next;
+            }
+
+            push(@stepdur, [$restart ? "ReMake" : "Make", Sec2Min(time() - $mkstart)]) if /^END$/;
+            PrintEnv(2);
+            DPrint(2, $printvar);
+            die("Unknown iMaker entry: `$_'\n"), next if !/^END$/;
+
+            pop(@steps) if ($restart = (@steps && $steps[$#steps] eq "RESTART"));
+            my $durstr = "";
+            foreach my $step (@steps) {
+                next if $skipstep;
+                RunStep($step);
+                my ($cmddur, $stepdur) = (0, pop(@gStepDur));
+                $durstr = Sec2Min($stepdur);
+                if (@gStepDur) {
+                    $durstr .= " (";
+                    foreach my $dur (@gStepDur) {
+                        $cmddur += $dur;
+                        $durstr .= Sec2Min($dur) . " + ";
+                    }
+                    $durstr .= Sec2Min($stepdur - $cmddur) . ")";
+                }
+                push(@stepdur, [$step, $durstr]);
+            }
+
+            $printvar = "";
+            my @env = ($ENV{IMAKER_EXPORTMK}, $ENV{IMAKER_MKRESTARTS});
+            %ENV = %env;
+            ($ENV{IMAKER_EXPORTMK}, $ENV{IMAKER_MKRESTARTS}) = @env;
+            InitMkglobals();
+            ChangeDir($cwd);
+
+            last if $restart;
+
+            my ($maxilen, $maxslen, $maxdlen) = (length(@stepdur . ""),
+                Max(map(length(@$_[0]), @stepdur)), Max(8, map(length(@$_[1]), @stepdur)));
+            DPrint(2, "=" x 79 . "\nStep" . " " x ($maxilen + $maxslen - 1) . "Duration\n" .
+                "=" x ($maxilen + $maxslen + 2) . " " . "=" x $maxdlen . "\n",
+                map(sprintf("%${maxilen}s. %-${maxslen}s", $_ + 1, $stepdur[$_][0]) .
+                    " $stepdur[$_][1]\n", 0 .. $#stepdur),
+                "-" x ($maxilen + $maxslen + 2) . " " . "-" x $maxdlen . "\n" .
+                "Total" . " " x ($maxilen + $maxslen - 2) . Sec2Min(time() - $start) . "\n");
+            ($start, @stepdur) = (time(), ());
+        }
+        close(MCMD);
+        die("\n") if ($? >> 8);
+        die("Command `$gMakecmd' failed in `" . GetAbsDirname(".") . "'.\n") if ($gTgterr = $gError);
+        CloseLog();
+    } until !$restart;
+    push(@gStepDur, time() - $gStartmk);
+    return(@targets);
+}
+
+
+###############################################################################
+#
+
+sub HandleCmdArg($)
+{
+    my $cmdarg = shift();
+    my $origarg = $cmdarg = (defined($cmdarg) ? $cmdarg : "");
+
+    my @cmdout = qx($ENV{PERL} -x $0 --splitarg $cmdarg);
+    die("Can't parse Make arguments: `$cmdarg'.\n") if $?;
+
+    map {
+        chomp();
+        s/ /\x1E/g;
+        s/\"/\\\"/g;
+        s/(\\+)$/$1$1/;
+    } @cmdout;
+    $cmdarg = " " . join(" ", @cmdout) . " ";
+
+    if ($cmdarg =~ /^.* VERBOSE\x1E*=(\S*) /) {
+        (my $verbose = $1) =~ s/\x1E/ /g;
+        SetVerbose($verbose, 1);
     }
 
-    imaker::DPrint(2, "=" x 79 . "\n");
-    @stepdur = ("Step", "Duration", "=" x $maxslen, "=" x $maxdlen, @stepdur,
-        "-" x $maxslen, "-" x $maxdlen, "Total", imaker::Sec2Min(time() - $start));
-    imaker::DPrint(2, sprintf("%-${maxslen}s %-${maxdlen}s ", shift(@stepdur), shift(@stepdur)) . "\n")
-        while(@stepdur);
+    if ($cmdarg =~ /\s+--?conf=(\S*)\s+/) {
+        (my $prj = $1) =~ /(.*?)(?:;(.*))?$/;
+        ($prj, my $conf) = ($1, defined($2) ? $2 : "");
+        $cmdarg =~ s/\s+--?conf=\S*\s+/ USE_CONE=mk CONE_PRJ=$prj CONE_CONF=$conf cone-pre defaultgoals /;
+    }
+
+    $cmdarg = " " . HandleExtCmdArg($cmdarg) . " " if $gImakerext;
+
+    $gMakecmd = "$ENV{IMAKER_MAKE} -f $0" . join("", map(" \"$_\"", split(/\s+/, Trim($cmdarg))));
+    warn("Can't parse Make targets.\n")
+        if (!(my $targets = (qx($gMakecmd 2>&1) =~ /\|MAKECMDGOALS=(.*?)\|/ ? " $1 " : "")) &&
+            ($cmdarg !~ /\s-(?:-?v(?:ersion?|ersi?|er?)?|versio\S+)\s/));
+
+    GetConfmkList() if
+        grep(!/^(help(-.+)?|print-.+)$/ || /^help-config$/, my @targets = split(/\s+/, Trim($targets)));
+
+    my ($mkfile, $mkfiles, $hptgt) = ("", "", "");
+    map {
+        $cmdarg =~ s/\s+\Q$_\E\s+/ /;
+        if (exists($gConfmkList{$_})) {
+            ($mkfile = $gConfmkList{$_}) =~ s/ /\x1E/g;
+            $mkfiles .= " -f $mkfile";
+            $targets =~ s/\s+\Q$_\E\s+/ /;
+        }
+    } @targets;
+    $cmdarg = "$mkfiles$cmdarg";
+
+    map { $targets =~ s/\s\Q$_\E\s/ /; $hptgt .= " $_" }
+        grep(/^help-.+$/ && !/^help-config$/, @targets);
+    map { $targets =~ s/\s\Q$_\E\s/ /; $hptgt .= " $_" }
+        grep(/^print-.+$/, @targets);
+    $hptgt = Trim($hptgt);
 
-    imaker::CloseLog();
+    if ($targets =~ s/ default(?= )//g) {
+        ($targets = Trim($targets)) =~ s/ /\x1E/g;
+        $cmdarg .= "TARGET_DEFAULT=$targets" if ($targets ne "");
+        $targets = "default";
+    }
+    @targets = ("defaultgoals@targets") if
+        !(@targets = map(s/\x1E/ /g ? $_ : $_, split(/\s+/, Trim($targets)))) || ("@targets" eq "#");
+
+    $mkfiles = "";
+    while ($cmdarg =~ s/\s+(-f\s?|--(?:file?|fi?|makefile?|makefi?|make?)[=\s]|IMAKER_CONFMK\x1E*=)(\S+)\s+/ /) {
+        $mkfile = $2;
+        ($mkfile = GetAbsFname(scalar($mkfile =~ s/\x1E/ /g, $mkfile))) =~ s/ /\\\x1E/g
+            if ($1 !~ /^IMAKER_CONFMK/);
+        $mkfiles .= ($mkfiles eq "" ? "" : chr(0x1E)) . $mkfile;
+    }
+    while ($cmdarg =~ s/\s+(\S+?)\x1E*([+:?])=\x1E*(\S+?)\s+/ /) {
+        ($gExportvar{sprintf("%03s", ++$gExportvar{""}) . "$1$2"} = $3) =~ s/\x1E/ /g;
+    }
+    $cmdarg = join(" ", map(scalar(s/\x1E/ /g, "\"$_\""), split(/\s+/, Trim($cmdarg .
+        ($mkfiles eq "" && ($ENV{IMAKER_MKLEVEL} || grep(/^default$/, @targets)) ? "" : " IMAKER_CONFMK=$mkfiles")))));
+
+    DPrint(2, "HandleCmdArg: `$origarg' => `$cmdarg', `" . join(" ", @targets) . "', `$hptgt'\n");
+    return($cmdarg, $hptgt, @targets);
+}
+
+
+###############################################################################
+#
+
+sub MenuRuncmd($)
+{
+    $ENV{IMAKER_CMDARG} = shift();
+    return(map(chomp() ? $_ : $_, qx($ENV{PERL} -x $0 2>&1)));
 }
 
+sub Menu($)
+{
+    (my $cmdarg = " " . shift() . " ") =~ s/\s+"IMAKER_CONFMK="\s+/ /;
+    my ($prodind, $product, @product) = (0, "", ());
+    my ($tgtind, $target, $tgtcols, $tgtrows, @target)  = (0, "", 4, 0, ());
+    my ($vartype, $varudeb, $varsym);
+    my $cfgfile = "./imaker_menu.cfg";
+
+    $cmdarg = ($cmdarg =~ /^\s*$/ ? "" : " " . Trim($cmdarg));
+    open(FILE, "<$cfgfile") and
+        (($prodind, $tgtind, $vartype, $varudeb, $varsym) = map(chomp() ? $_ : $_, <FILE>)) and close(FILE);
+    ($prodind, $tgtind, $vartype, $varudeb, $varsym) =
+        ($prodind || 0, $tgtind || 0, $vartype || "rnd", $varudeb || 0, $varsym || 0);
+
+    while (1) {
+        print("\nPRODUCTS\n--------\n");
+        #
+        if (!@product) {
+            @product = sort({lc($a) cmp lc($b)} grep($_ ne "", keys(%gConfmkList)));
+            $prodind = 0 if ($prodind > @product);
+        }
+        $product = ($prodind ? " $product[$prodind - 1]" : "");
+        my $maxlen = Max(map(length($_), @product));
+        map {
+            printf(" %" . (length(@product)) . "s) %-${maxlen}s  %s\n", $_ + 1, $product[$_], $gConfmkList{$product[$_]});
+        } (0 .. $#product);
+        print(" NO PRODUCTS FOUND!\n") if !@product;
+
+        print("\nTARGETS\n-------\n");
+        #
+        if (!@target) {
+            @target = grep(s/^== (.+) ==$/$1/, MenuRuncmd("$product PRINTCMD=0 VERBOSE=1 help-target-*-wiki"));
+            $tgtind = 0 if ($tgtind > @target);
+            $tgtrows = int($#target / $tgtcols + 1);
+            my $maxind = 0;
+            map {
+                if (!($_ % $tgtrows)) {
+                    $maxind = length(Min($_ + $tgtrows, $#target + 1)) + 1;
+                    $maxlen = Max(map(length(), @target[$_ .. Min($_ + $tgtrows - 1, $#target)]));
+                }
+                $target[$_] = sprintf("%${maxind}s) %-${maxlen}s", "t" . ($_ + 1), $target[$_]);
+            } (0 .. $#target);
+        }
+        ($target = ($tgtind ? $target[$tgtind - 1] : "")) =~ s/^.+?(\S+)\s*$/$1/;
+        foreach my $row (1 .. $tgtrows) {
+            foreach my $col (1 .. $tgtcols) {
+                my $ind = ($col - 1) * $tgtrows + $row - 1;
+                print(($ind < @target ? " $target[$ind]" : "") . ($col != $tgtcols ? " " : "\n"));
+            }
+        }
+        print(" NO TARGETS FOUND!\n") if !@target;
+
+        print("\nCONFIGURATION\n-------------\n");
+        #
+        print(
+          " Product: " . ($prodind ? $product[$prodind - 1] : "NOT SELECTED!") . "\n" .
+          " Target : " . ($tgtind ? $target : "NOT SELECTED!") . "\n" .
+          " Type   : " . ucfirst($vartype) . "\n" .
+          " Debug  : " . ($varudeb ? ($varudeb =~ /full/i ? "Full debug" : "Enabled") : "Disabled") . "\n" .
+          " Symbols: " . ($varsym ? "Created\n" : "Not created\n"));
+
+        print("\nOPTIONS\n-------\n");
+        #
+        print(
+          " t) Toggle type between rnd/prd/subcon\n" .
+          " u) Toggle debug between urel/udeb/udeb full\n" .
+          " s) Toggle symbol creation on/off\n" .
+          " r) Reset configuration\n" .
+          " h) Print usage information\n" .
+          " x) Exit\n\n" .
+          "Hit Enter to run: imaker$product$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym $target\n");
+
+        print("\nSelection: ");
+        #
+        my $input = <STDIN>;
+        ($input = (defined($input) ? $input : "?")) =~ s/^\s*(.*?)\s*$/\L$1\E/;
+
+        if ($input =~ /^(\d+)$/ && ($1 > 0) && ($1 <= @product) && ($1 != $prodind)) {
+            $prodind = $1;
+            ($tgtind, @target) = (0, ());
+        }
+        elsif ($input =~ /^t(\d+)$/ && ($1 > 0) && ($1 <= @target) && ($1 != $tgtind)) {
+            $tgtind = $1;
+        }
+        elsif ($input eq "t") {
+            $vartype = ($vartype =~ /rnd/i ? "prd" : ($vartype =~ /prd/i ? "subcon" : "rnd"));
+        }
+        elsif ($input eq "u") {
+            $varudeb = (!$varudeb ? 1 : ($varudeb !~ /full/i ? "full" : 0));
+        }
+        elsif ($input eq "s") {
+            $varsym = ($varsym ? 0 : 1);
+        }
+        elsif ($input eq "r") {
+            ($prodind, @product) = (0, ());
+            ($tgtind, @target)  = (0, ());
+            ($vartype, $varudeb, $varsym) = ("rnd", 0, 0);
+        }
+        elsif ($input eq "h") {
+            print("\nTODO: Help");
+            sleep(2);
+        }
+        elsif ($input =~ /^(x|)$/) {
+            open(FILE, ">$cfgfile") and
+                print(FILE map("$_\n", ($prodind, $tgtind, $vartype, $varudeb, $varsym))) and close(FILE);
+            return(("", "menu")) if ($input eq "x");
+            $cmdarg = "$product$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym";
+            $ENV{IMAKER_CMDARG} = Trim("$cmdarg $target");
+            return(($cmdarg, $target eq "" ? "defaultgoals" : $target));
+        }
+    }
+}
+
+
+###############################################################################
+#
+
+sub Install($$$)
+{
+    my ($clean, $bldinf, $destdir) = @_;
+    my $srcdir = GetDirname($bldinf = GetAbsFname($bldinf));
+    $destdir = GetAbsDirname($destdir) if $destdir;
+
+    print(($clean ? "\nCleaning" : "\nInstalling") . " `$bldinf'" . ($destdir ? " to `$destdir'\n" : "\n"));
+
+    my $export = 0;
+    foreach (grep(!/^\s*\/\//, ReadFile($bldinf, 0))) {
+        $export = 1, next if /^\s*PRJ_EXPORTS\s*$/i;
+        next if !$export;
+        Install($clean, "$srcdir$1", $destdir), next if /^\s*#include\s+"(.+)"\s*$/;
+        die("Unknown line `$_'.\n") if !/^\s*(\S+)\s+(.+?)\s*$/;
+        my ($src, $dest) = ("$srcdir$1", $2);
+        $dest = "$gEpocroot/epoc32$dest" if ($dest =~ s/^\+//);
+        $dest .= GetBasename($src) if ($dest =~ s/\s+\/\/$//);
+        ($src, $dest) = (GetAbsFname($src), GetAbsFname($dest));
+        next if ($destdir && ($dest !~ /^$gEpocroot\/epoc32\/tools\//i));
+        $dest = "$destdir/" . GetBasename($dest) if $destdir;
+        print(($clean ? "Delete" : "Copy `$src' =>") . " `$dest'\n");
+        unlink($dest);
+        die("Deletion failed.\n") if ($clean && -e($dest));
+        next if $clean;
+        File::Path::mkpath(GetDirname($dest));
+        File::Copy::copy($src, $dest) or die("Copying failed.\n");
+        chmod(0777, $dest);
+    }
+}
+
+
+###############################################################################
+#
+
+END {
+    if (!$gArgv) {
+        (my $keepgoing, $gStartmk) = ($gKeepgoing, time() - $gStartmk);
+        $gKeepgoing = 1;
+        SetLogfile($gLogfiles{__prev__}) if %gLogfiles;
+        PrintEnv(0) if $gError;
+        die("Command `$gMakecmd' failed in `" . GetAbsDirname(".") . "'.\n")
+            if ($gTgterr && !$keepgoing);
+
+        map { UnsubstDrive($_) } sort({$a cmp $b} keys(%gSubstdrv));
+
+        @gIcmd = @gReport;
+        (my $report, @gReport) = (2, ());
+        my ($maxtlen, $maxvlen, %uniq) = (0, 0, ());
+        while (@gIcmd) {
+            my ($tgtvar, $durval, $type) = (GetIPar(1), GetIPar(1), GetIPar(1));
+            if ($type =~ /^-?\d+$/) {
+                push(@gReport, [$tgtvar, $durval, $type]);
+                ($maxtlen, %uniq) = (Max($maxtlen, length($tgtvar)), ());
+            } else {
+                $report = 1, push(@gReport, [$tgtvar, $durval, $type])
+                    if ($tgtvar ne "") && !($uniq{"$tgtvar|$durval"}++);
+                $maxvlen = Max($maxvlen, length($tgtvar));
+            }
+        }
+
+        my ($tgtcnt, $warn) = (0, 0);
+        DPrint($report, "=" x 79 . "\n" . join("\n", map(@$_[2] =~ /^-?\d+$/ ?
+            ($tgtcnt++ ? "-" x 79 . "\n" : "") .
+            "Target: " . sprintf("%-${maxtlen}s", @$_[0]) .
+            "  Duration: " . Sec2Min(@$_[1] < 0 ? $gStartmk : @$_[1]) .
+            "  Status: " . (@$_[2] < 0 ? ($warn = "FAILED") : "OK")
+            : sprintf("%-${maxvlen}s", @$_[0]) . " = `@$_[1]'" .
+                ((@$_[2] =~ /^[fd]$/i) && !-e(@$_[1]) ? " - DOESN'T EXIST" : ""), @gReport)) .
+            (@gReport ? "\n" . "-" x 79 . "\n" : "") .
+            "Total duration: " . Sec2Min(time() - $gStarttime) .
+            "  Status: " . ($gError && !$keepgoing ? "FAILED" : "OK" .
+                ($warn ? " (with keep-going)" : "")) .
+            "\n" . "=" x 79 . "\n");
+
+        warn("\$_ has been changed in an uncontrolled manner!\n")
+            if !/^default input and pattern-searching space$/;
+        CloseLog();
+        exit(1) if ($gError && !$keepgoing);
+    }
+}
+
+
 __END__ # OF IMAKER.PL
--- a/imgtools/imaker/src/imaker.pm	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1462 +0,0 @@
-#
-# 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 "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: iMaker common Perl routines
-#
-
-
-
-use subs qw(CORE::GLOBAL::die);
-
-package imaker;
-
-use strict;
-use warnings;
-use Archive::Zip qw(:ERROR_CODES);
-use Archive::Zip::Tree;
-use Cwd;
-use Digest::MD5 qw(md5_hex);
-use File::Basename;
-use File::Copy;
-use File::Find;
-use File::Path;
-use File::Spec;
-use POSIX qw(strftime);
-use Time::Local;
-use XML::Simple;
-
-sub Max(@);
-sub Min(@);
-sub Quote($);
-sub Unquote($);
-sub Byte2Str($@);
-sub Str2Byte($);
-sub Str2Xml($);
-sub Ascii2Uni($);
-sub Uni2Ascii($);
-sub GetTimestamp();
-sub Sec2Min($);
-sub Wcard2Restr($);
-sub Wcard2Regex($);
-sub DPrint($@);
-sub Echo($$$);
-sub PathConv($;$$);
-sub ParseFiles($);
-sub GlobFiles($);
-sub GetBasename($);
-sub GetDirname($);
-sub GetAbsDirname($;$$);
-sub GetAbsFname($;$$);
-sub GetRelFname($;$$$);
-sub GetWriteFname($);
-sub GetFreeDrive();
-sub Search($$$$$\@\$);
-sub Find($$$$$\$);
-sub ChangeDir($);
-sub DeleteDir($;$);
-sub FindDir($$$$);
-sub MakeDir($);
-sub MakeChangeDir($);
-sub SetWorkdir($);
-sub OpenFile(*$$;$);
-sub Test($);
-sub CutFile($$$$$);
-sub Copy($$;$);
-sub DeleteFile($;$);
-sub FindFile($$$$);
-sub HeadFile($$$);
-sub TailFile($$$);
-sub TypeFile($;$);
-sub WriteFile($$$;$);
-sub UnzipFile($$);
-sub Zip($$$$@);
-sub Move($$);
-sub Touch($$);
-sub SetLogfile($);
-sub WidgetUnzip($$$);
-sub RunSystemCmd($$;$);
-sub ParseSystemCmd($$$);
-sub GenExclfile($$$$$);
-sub GenIbyfile($$$@);
-sub GenMakefile($$$$$);
-sub AddImageHeader($$$$$);
-sub Sleep($);
-sub FindSOSFiles($$$$$);
-sub CheckTool(@);
-sub GetIPar();
-sub PeekICmd($);
-sub GetICmd();
-sub EndICmd();
-sub RunICmd();
-sub RunIExtCmd($);
-sub GetFeatvarIncdir($;$);
-sub SetVerbose($);
-sub ReadICmdFile($);
-sub CloseLog();
-sub MakeStep($$$$$$);
-sub HandleCmdArg($);
-sub HandleExtCmdArg($);
-sub MenuRuncmd($);
-sub Menu($$$);
-
-use constant READBUFSIZE => 2097152;  # 2 MB
-
-our $STARTSTR = '>>>[START]=========8<==========8<==========8<==========8<==========8<==========';
-our $ENDSTR   = '==========>8==========>8==========>8==========>8==========>8===========[END]<<<';
-
-our $gBuflog     = 1;
-our $gCmdcnt     = 0;
-our @gCmdoutbuf  = ();
-our $gEpoc32;
-our @gFindresult = ();
-our $gError      = 0;
-our @gIcmd       = ();
-our $gImakerext  = 0;
-our $gKeepgoing  = 0;
-our @gLogbuf     = ();
-our $gLogfile    = "";
-our $gMakestep   = "";
-our $gOutfilter  = "";
-our $gParamcnt   = 0;
-our $gPrintcmd   = 0;
-our @gStepDur    = ();
-our %gStepIcmd   = ();
-our $gVerbose    = 1;
-our $gWarn       = 0;
-our $gWinOS      = ($^O =~ /win/i);
-our $gWorkdir    = "";
-our $gWorkdrive  = (Cwd::cwd() =~ /^([a-z]:)/i ? $1 : "");
-our @iVar        = ();  # General purpose variable to be used from $(call peval,...)
-
-BEGIN {
-    ($gEpoc32 = "$ENV{EPOCROOT}epoc32") =~ tr/\\/\//;
-    push(@INC, "$gEpoc32/tools");
-    eval { require featurevariantparser };
-}
-
-
-###############################################################################
-#
-
-sub Max(@)
-{
-    my $max = (shift() || 0);
-    map { $max = $_ if $_ > $max } @_;
-    return($max);
-}
-
-sub Min(@)
-{
-    my $min = (shift() || 0);
-    map { $min = $_ if $_ < $min } @_;
-    return($min);
-}
-
-sub Quote($)
-{
-    local $_ = shift();
-    return("") if !defined();
-    s/\\( |n|t)/\\\\$1/g;
-    return($_);
-}
-
-sub Unquote($)
-{
-    local $_ = shift();
-    return("") if !defined();
-    s/(?<!\\)(?<=\\n)\s+(\\n)?//g;
-    s/(?<!\\)\s+(?=\\n)//g;
-    s/(?<!\\)\\ / /g;
-    s/(?<!\\)\\n/\n/g;
-    s/(?<!\\)\\t/\t/g;
-    s/\\\\( |n|t)/\\$1/g;
-    s/\x00//g;
-    return($_);
-}
-
-sub Byte2Str($@)
-{
-    my ($base, @byte) = @_;
-    return(join("", map(($_ % 16 ? "" : sprintf("%04X:", $base + $_)) . sprintf(" %02X", $byte[$_]) .
-        (!(($_ + 1) % 16) || ($_ == (@byte - 1)) ? "\n" : ""), (0 .. (@byte - 1)))));
-}
-
-sub Str2Byte($)
-{
-    my ($str, $ind, @byte) = (shift(), 0, ());
-    $str =~ s/,$/, /;
-    map {
-        $ind++;
-        s/^\s+|\s+$//g;
-        if (/^\d+$/ && $_ < 256) {
-            push(@byte, $_);
-        } elsif (/^0x[0-9A-F]+$/i && hex() < 256) {
-            push(@byte, hex());
-        } else {
-            die("Invalid $ind. byte: `$_'.\n");
-            return;
-        }
-    } split(/,/, $str);
-    return(@byte);
-}
-
-sub Str2Xml($)
-{
-    my $str = shift();
-    $str =~ s/(.)/{'"'=>'&quot;', '&'=>'&amp;', "'"=>'&apos;', '<'=>'&lt;', '>'=>'&gt;'}->{$1} || $1/ge;
-    return($str);
-}
-
-sub Ascii2Uni($)
-{
-    (local $_ = shift()) =~ s/(?<!\r)\n/\r\n/g;  # Use CR+LF newlines
-    s/(.)/$1\x00/gs;
-    return("\xFF\xFE$_");
-}
-
-sub Uni2Ascii($)
-{
-    (local $_ = shift()) =~ s/(.)\x00/$1/gs;
-    s/\r\n/\n/g;
-    return(substr($_, 2));
-}
-
-sub GetTimestamp()
-{
-    my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = localtime();
-    return(sprintf("%04d%02d%02d%02d%02d%02d%02d",
-        $year + 1900, $mon + 1, $mday, $hour, $min, $sec, int(($yday + 1) / 7) + 1));
-}
-
-sub Sec2Min($)
-{
-    my $sec = shift();
-    return(sprintf("%02d:%02d", $sec / 60, $sec % 60));
-}
-
-sub Wcard2Restr($)
-{
-    (my $wcard = shift()) =~ s/(.)/{"*"=>".*", "?"=>"."}->{$1} || "\Q$1\E"/ge;
-    return($wcard);
-}
-
-sub Wcard2Regex($)
-{
-    my $restr = Wcard2Restr(shift());
-    return(qr/$restr/i);
-}
-
-
-###############################################################################
-#
-
-sub DPrint($@)
-{
-    my ($verbose, @outlist) = @_;
-    map { tr/\x00\x1F/#/ } @outlist;
-    print(@outlist) if !$verbose || ($verbose & $gVerbose);
-    push(@gLogbuf, @outlist) if ($verbose < 32) || ($verbose & $gVerbose);
-    return if $gBuflog && !$gLogfile;
-    print(LOG @gLogbuf) if $gBuflog;
-    @gLogbuf = ();
-}
-
-sub Echo($$$)
-{
-    return if $gPrintcmd;
-    my ($verbose, $str) = (shift(), shift());
-    DPrint($verbose, shift() ? "$str\n" : Unquote($str));
-}
-
-
-###############################################################################
-#
-
-# Overload die
-*CORE::GLOBAL::die = sub {
-    $gError = 1;
-    return if PeekICmd("iferror");
-    CORE::die(@_) if !$gKeepgoing;
-    warn(@_);
-};
-
-# Handler for __DIE__ signal
-$SIG{__DIE__} = sub {
-    select(STDERR);
-    DPrint(0, "*** Error: " . ($gMakestep ? "($gMakestep): " : "") . $_[0]);
-    select(STDOUT);
-    exit(1);
-};
-
-# Handler for __WARN__ signal
-$SIG{__WARN__} = sub {
-    select(STDERR);
-    my $msg = ($gMakestep ? "($gMakestep): " : "") . $_[0];
-    if ($gError) { DPrint(0, "*** Error: $msg") }
-    else { DPrint(127, "Warning: $msg") }
-    select(STDOUT);
-    $gError = $gWarn = 0;
-};
-
-
-###############################################################################
-# File operations
-
-sub PathConv($;$$)
-{
-    my $path = shift();
-    if (shift()) { $path =~ tr-\/-\\- }
-    else { $path =~ tr-\\-\/- }
-    if (shift()) { $path =~ s/^(?![a-z]:)/$gWorkdrive/i }
-    else { $path =~ s/^$gWorkdrive//i }
-    $path =~ s/^([a-z]:)/\u$1/;
-    return($path);
-}
-
-sub ParseFiles($)
-{
-    my ($file, @files) = (shift(), ());
-    push(@files, defined($1) ? $1 : (defined($2) ? $2 : ())) while $file =~ /""|"+(.+?)"+|((\\\s|\S)+)/g;
-    return(@files);
-}
-
-sub GlobFiles($)
-{
-    return(@gFindresult) if (my $file = shift()) =~ /^__find__$/i;
-    return(map(/[\*\?]/ ? glob(/\s/ ? "\"$_\"" : $_) : $_, ParseFiles($file)));
-}
-
-sub GetBasename($)
-{
-    return((File::Basename::fileparse(shift()))[0]);
-}
-
-sub GetDirname($)
-{
-    (my $dir = shift()) =~ s/^>>?(?!>)//;
-    return((File::Basename::fileparse($dir))[1]);
-}
-
-sub GetAbsDirname($;$$)
-{
-    (my $dir = shift()) =~ s/^>>?(?!>)//;
-    my $absdir = "";
-    eval { local $SIG{__DIE__}; $absdir = Cwd::abs_path($dir) };
-    return(PathConv($absdir || File::Spec->rel2abs($dir,
-        $dir !~ /^$gWorkdrive/i && $dir =~ /^([a-z]:)/i ? "$1/" : ""), shift(), shift()));
-}
-
-sub GetAbsFname($;$$)
-{
-    my $file = shift();
-    return($file) if $file eq "" || $file =~ /STD(IN|OUT|ERR)$/;
-    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
-    return($append . PathConv(File::Spec->catpath("", GetAbsDirname(GetDirname($file)), GetBasename($file)), shift(), shift()));
-}
-
-sub GetRelFname($;$$$)
-{
-    my ($file, $base) = (shift(), shift());
-    my $append = ($file =~ s/^>>(?!>)// ? ">>" : "");
-    return($append . PathConv(File::Spec->abs2rel($file, GetAbsDirname(defined($base) && ($base ne "") ? $base : ".")), shift(), shift()));
-}
-
-sub GetWriteFname($)
-{
-    (my $file = shift()) =~ s/^>?/>/;
-    return($file);
-}
-
-sub GetFreeDrive()
-{
-    for my $drive ("F", "A".."E", "G".."Z") {
-        return("$drive:") if
-            !system("subst $drive: . >nul") and !system("subst $drive: /d >nul");
-    }
-    die("No free drive letter available.\n");
-}
-
-sub Search($$$$$\@\$)
-{
-    my ($dir, $inclre, $exclre, $subdir, $finddir, $files, $total) = @_;
-    my @dir = ();
-
-    map {
-        my $isfile = -f();
-        my $isdir  = !$isfile && -d();
-        if ($finddir ? $isdir : $isfile) {
-            ++$$total;
-            my $fname = File::Basename::basename($_);
-            push(@$files, $_) if ($fname =~ /$inclre/ && $fname !~ /$exclre/);
-        }
-        push(@dir, $_) if $isdir && $subdir;
-    } sort({lc($a) cmp lc($b)} ($dir =~ /\s/ ? <"$dir/*"> : <$dir/*>));
-
-    map { Search($_, $inclre, $exclre, 1, $finddir, @$files, $$total) } @dir;
-}
-
-sub Find($$$$$\$)
-{
-    my ($dir, $inclpat, $exclpat, $subdir, $finddir, $total) = @_;
-    ($dir, $$total) = (GetAbsDirname($dir), 0);
-    my ($inclre, $exclre, @files) = ("", "", ());
-    if ($inclpat =~ /^\//) {
-        $inclre = eval("qr$inclpat");
-        $inclpat = "";
-    } else {
-        $inclre = join("|", map(Wcard2Restr($_), split(/\s+/, $inclpat)));
-        $inclre = qr/^($inclre)$/i;
-    }
-    if ($exclpat =~ /^\//) {
-        $exclre = eval("qr$exclpat");
-        $exclpat = "";
-    } else {
-        $exclre = join("|", map(Wcard2Restr($_), split(/\s+/, $exclpat)));
-        $exclre = qr/^($exclre)$/i;
-    }
-    DPrint(16, "Find" . ($finddir ? "Dir" : "File") . ": Directory `$dir'" . ($subdir ? " and subdirectories" : "") .
-        ", pattern `" . ($inclpat ne "" ? "$inclpat' $inclre" : "$inclre'") .
-        ($exclre eq qr/^()$/i ? "" : " excluding `" . ($exclpat ne "" ? "$exclpat' $exclre" : "$exclre'")));
-    Search($dir, $inclre, $exclre, $subdir, $finddir, @files, $$total);
-    DPrint(16, ", found " . @files . "/$$total " . ($finddir ? "directories\n" : "files\n"));
-    return(@files);
-}
-
-sub ChangeDir($)
-{
-    if ((my $dir = GetAbsDirname(shift())) ne GetAbsDirname(".")) {
-        DPrint(16, "ChangeDir: `$dir'\n");
-        chdir($dir) or die("Can't change to directory `$dir'.\n");
-    }
-}
-
-sub DeleteDir($;$)
-{
-    return if !-d(my $dir = GetAbsDirname(shift()));
-    DPrint(16, "DeleteDir: `$dir'\n");
-    for my $sec (0, 2, 5) {
-        warn("Can't delete directory `$dir', retrying in $sec seconds...\n"), sleep($sec) if $sec;
-        eval { local $SIG{__DIE__}; local $SIG{__WARN__} = sub{}; File::Path::rmtree($dir) };
-        return if !-d($dir);
-    }
-    $dir = "Can't delete directory `$dir'.\n";
-    shift() ? warn($dir) : die($dir);
-}
-
-sub FindDir($$$$)
-{
-    my ($dir, $inclpat, $exclpat, $opt) = @_;
-    @gFindresult = () if (($opt = (defined($opt) ? $opt : "")) !~ /a/);
-    push(@gFindresult, Find($dir, $inclpat, $exclpat, $opt =~ /r/, 1, local $_));
-}
-
-sub MakeDir($)
-{
-    my $dir = GetAbsDirname(shift());
-    return if -d($dir);
-    eval { local $SIG{__DIE__}; File::Path::mkpath($dir) };
-    if (-d($dir)) {
-        DPrint(16, "MakeDir: `" . GetAbsDirname($dir) ."'\n");
-    } else {
-        DPrint(16, "MakeDir: `$dir'\n");
-        die("Can't create directory `$dir'.\n");
-    }
-}
-
-sub MakeChangeDir($)
-{
-    MakeDir(my $dir = shift());
-    ChangeDir($dir);
-}
-
-sub SetWorkdir($)
-{
-    MakeChangeDir(shift());
-    $gWorkdrive = (Cwd::cwd() =~ /^([a-z]:)/i ? $1 : "");
-    $gWorkdir   = GetAbsDirname(".");
-}
-
-sub OpenFile(*$$;$)
-{
-    my ($fhandle, $file, $binmode, $print) = @_;
-    MakeDir(GetDirname($file)) if $file =~ /^>/;
-    DPrint(16, defined($print) ? $print : ($file =~ /^>/ ? "Write" : "Read") . "File: `$file'\n");
-    return(open($fhandle, $file)) if !$binmode;
-    return(open($fhandle, $file) and binmode($fhandle));
-}
-
-sub Test($)
-{
-    if (-d(my $file = shift())) {
-        DPrint(16, "TestDir: `" . GetAbsDirname($file) . "'\n");
-    } elsif (-f($file)) {
-        DPrint(16, "TestFile: `" . GetAbsFname($file) . "'\n");
-    } else {
-        DPrint(16, "Test: `$file'\n");
-        die("File or directory `$file' doesn't exist.\n");
-    }
-}
-
-sub CutFile($$$$$)
-{
-    my ($msg, $src, $dest, $head, $len) = @_;
-    my ($buf, $srctmp) = (undef, "$src.CUT");
-
-    OpenFile(*INFILE, $src, 1, $msg) or
-        die("Can't read file `$src'.\n"), return;
-
-    my $out = GetWriteFname($head ? $dest : $srctmp);
-    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
-    while ($len > 0) {
-        read(INFILE, $buf, $len < READBUFSIZE ? $len : READBUFSIZE);
-        print(OUTFILE $buf);
-        $len -= READBUFSIZE;
-    }
-    close(OUTFILE);
-
-    $out = GetWriteFname($head ? $srctmp : $dest);
-    OpenFile(*OUTFILE, $out, 1) or die("Can't write to `$out'.\n"), return;
-    print(OUTFILE $buf) while read(INFILE, $buf, READBUFSIZE);
-    close(OUTFILE);
-    close(INFILE);
-    Move($srctmp, $src);
-}
-
-sub Copy($$;$)
-{
-    my ($src, $dest, $dir) = @_;
-    my $append = ($dest =~ /^>>[^>]/);
-    $dir  = defined($dir) && $dir || !$append && -d($src);
-    $src  = ($dir ? GetAbsDirname($src)  : GetAbsFname($src));
-    $dest = ($dir ? GetAbsDirname($dest) : GetAbsFname($dest));
-    if ($append) {
-        my $buf;
-        OpenFile(*INFILE, $src, 1, "AppendFile: `$src' => `$dest'\n") or die("Can't read file `$src'.\n"), return;
-        OpenFile(*OUTFILE, $dest, 1, "") or die("Can't write to `$dest'.\n"), return;
-        print(OUTFILE $buf) while read(INFILE, $buf, READBUFSIZE);
-        return if close(INFILE) && close(OUTFILE);
-    }
-    elsif (!$dir) {
-        DPrint(16, "CopyFile: `$src' => `$dest'\n");
-        warn("CopyFile: Destination file `$dest' already exists\n") if -f($dest);
-        File::Copy::copy($src, $dest) and return;
-    } else {
-        DPrint(16, "CopyDir: `$src' => `$dest'\n");
-#        warn("CopyDir: Destination directory `$dest' already exists\n") if -d($dest);
-        !RunSystemCmd('xcopy "' . PathConv($src, 1) . '" "' . PathConv("$dest/" . GetBasename($src), 1) . '" /e /i /y /z', "") and return;
-    }
-    die("Can't copy `$src' to `$dest'.\n");
-}
-
-sub DeleteFile($;$)
-{
-    return if !-f(my $file = GetAbsFname(shift()));
-    DPrint(16, "DeleteFile: `$file'\n");
-    for my $sec (0, 1, 2) {
-        warn("Can't delete file `$file', retrying in $sec second(s)...\n"), sleep($sec) if $sec;
-        unlink($file);
-        return if !-f($file);
-    }
-    $file = "Can't delete file `$file'.\n";
-    shift() ? warn($file) : die($file);
-}
-
-sub FindFile($$$$)
-{
-    my ($dir, $inclpat, $exclpat, $opt) = @_;
-    @gFindresult = () if (($opt = (defined($opt) ? $opt : "")) !~ /a/);
-    push(@gFindresult, Find($dir, $inclpat, $exclpat, $opt =~ /r/, 0, local $_));
-}
-
-sub HeadFile($$$)
-{
-    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
-    $len = hex($len) if $len =~ /^0x/;
-    CutFile("HeadFile: Cut first $len bytes from `$src' => `$dest'\n", $src, $dest, 1, $len);
-}
-
-sub TailFile($$$)
-{
-    my ($src, $dest, $len) = (GetAbsFname(shift()), GetAbsFname(shift()), shift());
-    $len = hex($len) if $len =~ /^0x/;
-    CutFile("TailFile: Cut last $len bytes from `$src' => `$dest'\n", $src, $dest, 0, (-s($src) ? -s($src) : 0) - $len);
-}
-
-sub TypeFile($;$)
-{
-    my ($file, $str, $mode) = (GetAbsFname(shift()), "", shift() || "");
-    OpenFile(*FILE, $file, $mode, "TypeFile: `$file'" .
-        ($gOutfilter && ($mode ne "b") ? ", filter: `/$gOutfilter/i'" : "") . "\n") or
-            die("Can't read file `$file'.\n"), return;
-    DPrint(8, "$STARTSTR\n");
-    read(FILE, $str, -s($file));
-    if ($mode eq "b") {
-        DPrint(1, Byte2Str(0, map(ord(), split(//, $str))));
-    } else {
-        $str = Uni2Ascii($str) if $mode eq "u";
-        DPrint(1, map("$_\n", grep(!$gOutfilter || /$gOutfilter/i, split(/\n/, $str))));
-        $gOutfilter = "";
-    }
-    DPrint(8, "$ENDSTR\n");
-    close(FILE);
-}
-
-sub WriteFile($$$;$)
-{
-    my ($file, $str, $mode) = (GetAbsFname(shift()), shift(), shift() || "");
-    OpenFile(*FILE, GetWriteFname($file), $mode) or
-        die("Can't write to `$file'.\n"), return;
-    if ($mode eq "b") {
-        my @byte = Str2Byte($str);
-        DPrint(64, Byte2Str($file =~ s/^>>(?!>)// ? -s($file) : 0, @byte));
-        print(FILE map(chr(), @byte));
-    } else {
-        $str = Unquote($str) if !shift();
-        $str = Ascii2Uni($str) if $mode eq "u";
-        print(FILE $str);
-    }
-    close(FILE);
-}
-
-sub UnzipFile($$)
-{
-    my ($zipfile, $dir) = (GetAbsFname(shift()), GetAbsDirname(shift()));
-    DPrint(16, "UnzipFile: `$zipfile'");
-    Archive::Zip::setErrorHandler(sub{});
-    my ($error, $zip) = (0, Archive::Zip->new());
-    if ($zip->read($zipfile) != AZ_OK) {
-        DPrint(16, " to directory `$dir'\n");
-        die("Can't read zip archive `$zipfile'.\n");
-        return;
-    }
-    my @files = map($_->fileName(), grep(!$_->isDirectory(), $zip->members()));
-    DPrint(16, ", " . @files . " files to directory `$dir'\n");
-    foreach my $file (@files) {
-        DPrint(16, "ExtractFile: `$dir/$file'");
-        eval { local $SIG{__DIE__}; $error = ($zip->extractMember($file, "$dir/$file") != AZ_OK) };
-        DPrint(16, $error ? " Failed\n" : "\n");
-        die("Can't extract file `$file' to directory `$dir'.\n") if $error;
-        $error = 0;
-    }
-}
-
-sub Zip($$$$@)
-{
-    my ($zipfile, $dir, $opt, $prefix) = (GetAbsFname(shift()), shift(), shift(), shift());
-
-    $opt = (defined($opt) ? ", options: `$opt'" : "");
-    $prefix = GetAbsDirname($prefix) if $prefix ne "";
-    my %files = ();
-    map {
-        my $key = lc();
-        $files{$key} = $_ if !exists($files{$key});
-    } ($dir ? map(GetAbsDirname($_), grep(-d(), @_)) : map(GetAbsFname($_), grep(-f(), @_)));
-
-    DPrint(16, ($dir ? "ZipDir: `$zipfile'$opt, " . keys(%files) . " directories" :
-        "ZipFile: `$zipfile'$opt, " . keys(%files) . " files") . ($prefix ? ", prefix: $prefix\n" : "\n"));
-
-    Archive::Zip::setErrorHandler(sub{});
-    my ($error, $zip) = (0, Archive::Zip->new());
-    $zip->zipfileComment("iMaker-created zip archive `$zipfile'$opt.");
-
-    foreach my $file (sort({lc($a) cmp lc($b)} values(%files))) {
-        my $newfile = $file;
-        if ($opt !~ /j/) {
-            $newfile =~ s/^.*?\/+/$prefix\// if $prefix ne "";
-        } else {
-            $newfile = ($dir ? "" : GetBasename($file)) if ($prefix eq "") || ($newfile !~ s/^$prefix//);
-        }
-        DPrint(16, "Add" . ($dir ? "Dir" : "File") . ": `$file'" . ($file ne $newfile ? " => `$newfile'" : "")) if $opt !~ /q/;
-        eval {
-            local $SIG{__DIE__}; local $SIG{__WARN__} = sub{ $gWarn = 1 };
-            $error = ($dir ? $zip->addTree($file, $newfile) != AZ_OK :
-                !$zip->addFile($file, $newfile)) || $gWarn;
-        };
-        DPrint(16, $error ? " Failed\n" : "\n") if $opt !~ /q/;
-        warn("Can't add " . ($dir ? "directory tree" : "file") . "`$file' to zip archive `$zipfile'.\n") if $error;
-        $error = 0;
-    }
-    ($zip->writeToFileNamed($zipfile) == AZ_OK) or
-        die("Can't create zip archive `$zipfile'.\n");
-}
-
-sub Move($$)
-{
-    my ($src, $dest) = @_;
-    my $dir = -d($src);
-    $src = ($dir ? GetAbsDirname($src) : GetAbsFname($src));
-    MakeDir(GetDirname($dest));
-    $dest = ($dir ? GetAbsDirname($dest) : GetAbsFname($dest));
-    DPrint(16, "Move" . ($dir ? "Dir" : "File") . ": `$src' => `$dest'\n");
-    File::Copy::move($src, $dest) or
-        die("Can't move `$src' to `$dest'.\n");
-}
-
-sub Touch($$)
-{
-    my ($file, $time) = (shift(), shift() =~ /^(\d\d\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/ ?
-        Time::Local::timelocal($6, $5, $4, $3, $2 - 1, $1 - 1900) : time);
-    my $dir = -d($file);
-    $file = ($dir ? GetAbsDirname($file) : GetAbsFname($file));
-    DPrint(16, "Touch" . ($dir ? "Dir" : "File") . ": `$file': " .
-        POSIX::strftime("%Y-%m-%d,%H:%M:%S", localtime($time)) . "\n");
-    utime($time, $time, $file) or
-        die("Can't touch " . ($dir ? "directory" : "file") . " `$file'.\n");
-}
-
-sub SetLogfile($)
-{
-    $gBuflog = 0, return if !(my $file = GetAbsFname(shift()));
-    CloseLog();
-    OpenFile(*LOG, GetWriteFname($file), 0) or
-        warn("Can't log to file `$file'.\n"), return;
-    $gLogfile = $file;
-}
-
-
-###############################################################################
-#
-
-sub WidgetUnzip($$$)
-{
-    my ($wgzfile, $outdir, $plist) = (GetAbsFname(shift()), GetAbsDirname(shift()), shift());
-
-    my $tmpdir = "$outdir/wgz_unzip_temp";
-    DeleteDir($tmpdir);
-    UnzipFile($wgzfile, $tmpdir);
-
-    for my $dir (Find($tmpdir, "*", "", 0, 1, local $_)) {
-        my $xml = undef;
-        eval { local $SIG{__DIE__}; local $SIG{__WARN__} = sub{}; $xml = XMLin("$dir/$plist") };
-        die("Can't find/parse XML file `$dir/$plist'.\n"), next if !defined($xml);
-        my $id = "";
-        for my $ind (0 .. @{$xml->{dict}{key}} - 1) {
-            $id = $xml->{dict}{string}[$ind], last if $xml->{dict}{key}[$ind] =~ /^\s*Identifier\s*$/i;
-        }
-        die("Can't find Identifier from XML file `$dir/$plist'.\n"), next if $id eq "";
-        Move($dir, "$outdir/$id/" . GetBasename($dir));
-    }
-    DeleteDir($tmpdir);
-}
-
-
-###############################################################################
-#
-
-sub RunSystemCmd($$;$)
-{
-    my ($cmd, $file, $ignorerr) = @_;
-    DPrint(1, "$cmd\n"), return if $gPrintcmd;
-    my $null = ($file =~ /^null$/i);
-    $file = ($null ? "" : GetAbsFname($file));
-    @gCmdoutbuf = ();
-    DPrint(4, "RunSystemCmd(" . GetAbsDirname(".") . "): `$cmd'" .
-        ($file ? ", redirect to: `$file'" : ($null ? ", redirect to null" : "")) .
-        ($gOutfilter ? ", filter: `/$gOutfilter/i'" : "") . "\n");
-    OpenFile(*FILE, GetWriteFname($file), 0) or
-        (die("Can't write to `$file'.\n"), $file = "") if $file;
-    my $dur = time();
-    open(CMD, "$cmd 2>&1 |");
-    DPrint(8, "$STARTSTR\n");
-    while (my $line = <CMD>) {
-        chomp($line);
-        push(@gCmdoutbuf, $line);
-        DPrint(8, "$line\n") if !$null && (!$gOutfilter || ($line =~ /$gOutfilter/i));
-        print(FILE "$line\n") if $file;
-    }
-    close(CMD);
-    close(FILE) if $file;
-    push(@gStepDur, $dur = time() - $dur);
-    $gOutfilter = "";
-    my $error = ($? >> 8) && !$ignorerr && !$null;
-    print(map("$_\n", @gCmdoutbuf)) if $error && $gVerbose && !($gVerbose & 8);
-    $dur = Sec2Min($dur);
-    DPrint(8, substr($ENDSTR, 0, -16) . $dur . substr($ENDSTR, length($dur) - 16) . "\n");
-    die("Command `$cmd' failed (" . ($? >> 8). ").\n") if $error;
-}
-
-
-###############################################################################
-#
-
-sub ParseSystemCmd($$$)
-{
-    return if $gPrintcmd;
-    my ($title, $regex, $file) = @_;
-    $regex = ($regex =~ /^\// ? eval("qr$regex") : Wcard2Regex($regex));
-    return if !(my @parse = grep(/$regex/, @gCmdoutbuf));
-    if (!$file) {
-        Echo(1, $title, 0);
-        DPrint(1, map(sprintf("%" . length(@parse) . "s", $_) . ") $parse[$_ - 1]\n", 1 .. @parse));
-        return;
-    }
-    OpenFile(*FILE, GetWriteFname($file = $title), 0) or
-        die("Can't write to `$file'.\n"), return;
-    print(FILE join("\n", @parse));
-    close(FILE);
-}
-
-
-###############################################################################
-#
-
-sub GenExclfile($$$$$)
-{
-    return if $gPrintcmd;
-
-    my ($exclfile, $base, $prefix, $addfiles) = (shift(), shift(), shift(), shift());
-    my ($file, $rmfiles, %files) = ("", "", ());
-
-    WriteFile($exclfile, "", "");
-    $base = GetAbsDirname($base);
-
-    foreach $file (ParseFiles(shift())) {
-        $file =~ tr/\\/\//;
-        $file =~ s/^\///;
-        $file =~ s/\/$/\/\*/;
-        $rmfiles .= ($rmfiles eq "" ? "" : "|") . Wcard2Restr($file);
-    }
-    $rmfiles = qr/^(?:$rmfiles)$/i;
-
-    foreach $file (ParseFiles($addfiles)) {
-        $file =~ tr/\\/\//;
-        $file =~ /^\/?(?:(.*)\/)?(.+?)$/;
-        (my $dir, $file) = ($base . (defined($1) ? "/$1" : ""), $2);
-        map {
-            $files{$_} = 1 if ($_ = GetRelFname($_, $base)) !~ $rmfiles;
-        } ($file =~ /[\*\?]/ ? Find($dir, $file, "", 1, 0, local $_) : "$dir/$file");
-    }
-
-    map {
-        $files{"$_/"} = 1 while (s/^(.*)\/.*?$/$1/) && !exists($files{"$_/"});
-    } keys(%files);
-    $files{""} = 1;
-
-    WriteFile($exclfile, join("", map(($_ = "$prefix$_\n") =~ tr/\//\\/ ? $_ : $_, sort({lc($a) cmp lc($b)} keys(%files)))), "u", 1);
-}
-
-sub GenIbyfile($$$@)
-{
-    return if $gPrintcmd;
-
-    my ($ibyfile, $srcdir, $subdir) = (GetAbsFname(shift()), shift(), shift());
-    my ($header, $footer, $body, %files) = ("", "", "", ());
-
-    foreach my $dir (split(/\s+/, $srcdir)) {
-        $dir = GetAbsDirname($dir);
-        my ($found, $total, $lines) = (0, 0, "");
-        my @param = @_;
-        while (@param) {
-            my ($filepat, $format, @lines) = (shift(@param), shift(@param), ());
-            $header = $format, next if $filepat =~ /^__header__$/i;
-            $footer = $format, next if $filepat =~ /^__footer__$/i;
-            foreach my $src (Find($dir, $filepat, "", $subdir, 0, $total)) {
-                next if $files{$src};
-                $files{$src} = 1;
-                (my $line = $format) =~ s/%1/$src/g;
-                $line =~ s/%2/GetRelFname($src, $dir, 1)/ge;
-                $line =~ s/%3/GetRelFname($src, GetDirname($ibyfile))/ge;
-                push(@lines, $line);
-            }
-            $found += @lines;
-            $lines .= "//\n// Format: `$format', " . @lines . " files: `$filepat'\n" .
-                (@lines ? "//\n" . join("\n", @lines) . "\n" : "");
-        }
-        $body .= "\n// Collected files $found/$total from directory `$dir'" .
-            ($subdir ? " and subdirectories" : "") . "\n$lines";
-    }
-
-    my $append = ($ibyfile =~ s/^>>(?!>)// && -f($ibyfile) && ">>" || "");
-    (my $fname = "__" . uc(GetBasename($ibyfile)) . "__") =~ s/\W/_/g;
-    my @previby = ();
-
-    if ($append) {
-        OpenFile(*FILE, $ibyfile, 0) or die("Can't read file `$ibyfile'.\n"), return;
-        @previby = <FILE>;
-        close(FILE);
-        $previby[0] =~ s/(, collected )(\d+)( files)$/$1.($2 + keys(%files)).$3/e;
-        $previby[@previby - 1] = "";
-    }
-
-    OpenFile(*FILE, GetWriteFname($ibyfile), 0) or
-        die("Can't write to `$ibyfile'.\n"), return;
-    print(FILE @previby, ($append ? "// Appended" : "// Generated") . " `$append$ibyfile', " .
-        "collected " . keys(%files) . " files\n" .
-        ($append ? "" : "\n#ifndef $fname\n#define $fname\n") .
-        ($header ? Unquote("\\n$header\\n") : "") . $body . ($footer ? Unquote("\\n$footer\\n") : "") .
-        "\n#endif // $fname\n");
-    close(FILE);
-}
-
-
-###############################################################################
-#
-
-sub GenMakefile($$$$$)
-{
-    return if $gPrintcmd;
-    my ($hdrfile, $mkfile, $filter, $prepros, $assignop) =
-        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
-    ChangeDir(GetDirname($hdrfile));
-    RunSystemCmd("$prepros " . GetBasename($hdrfile), "");
-    my $maxdef = Max(map(/^\s*\#define\s+($filter)/ && length($1), @gCmdoutbuf));
-    WriteFile($mkfile, join('\n',
-        map(/^\s*\#define\s+($filter)\s*(.*?)\s*$/ ? sprintf("%-${maxdef}s $assignop %s", $1, $2 eq "" ? 1 : $2) : (), sort(@gCmdoutbuf))) . '\n', "");
-}
-
-
-###############################################################################
-#
-
-sub AddImageHeader($$$$$)
-{
-    return if $gPrintcmd;
-    my ($file, $hdrfile, $hdrstr, $hdrsize, $align) =
-        (GetAbsFname(shift()), GetAbsFname(shift()), shift(), shift(), shift());
-
-    $hdrstr =~ s/\/\*.*?\*\///g;
-    $hdrstr =~ s/,\s*$//;
-    WriteFile($hdrfile, $hdrstr, "b");
-    die("Invalid image header size: " . sprintf("0x%X", -s($hdrfile)) . " (!=$hdrsize).\n"), return
-        if -s($hdrfile) ne hex($hdrsize);
-
-    $align = Max(hex($align), hex($hdrsize)) - hex($hdrsize);
-    WriteFile(">>$hdrfile", ("0," x ($align - 1)) . "0", "b") if $align;
-    Copy($file, ">>$hdrfile") if $file ne "";
-}
-
-
-###############################################################################
-#
-
-sub Sleep($)
-{
-    sleep(shift()) if !$gPrintcmd;
-}
-
-
-###############################################################################
-#
-
-sub FindSOSFiles($$$$$)
-{
-    my ($dirs, $tmpoby, $imgoby, $pluglog, $opt) = @_;
-    my ($file, %files) = ("", ());
-    local $_;
-
-    foreach my $dir (GlobFiles($dirs)) {
-        $dir = GetAbsDirname($dir);
-
-        foreach $file (Find($dir, $tmpoby, "", 1, 0, $_)) {
-            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
-            (my $dir = GetDirname($file) . "/") =~ s/\/+$/\//;
-            while (<FILE>) {
-                next if !/^#\s+\d+\s+"(.+?)"/;
-                $_ = $1;
-                $file = GetAbsFname(/^(?:[a-z]:)?[\/\\]/i ? $_ : "$dir$_");
-                $files{lc($file)} = $file if !exists($files{lc($file)});
-            }
-            close(FILE);
-        }
-
-        foreach $file (Find($dir, $imgoby, "", 1, 0, $_)) {
-            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
-            while (<FILE>) {
-                next if !/^\s*(?:bootbinary|data|device|dll|extension|file|primary|secondary|variant)\S*?\s*[=\s]\s*(?:"(.+?)"|(\S+))/i;
-                $file = GetAbsFname(defined($1) ? $1 : $2);
-                $files{lc($file)} = $file if !exists($files{lc($file)});
-                next if ($file !~ s/\.[0-9a-f]{32}\./\./i);
-                $file .= ".vmap";
-                $files{lc($file)} = $file if !exists($files{lc($file)});
-            }
-            close(FILE);
-        }
-
-        my ($plugfile, $patched) = (0, 0);
-        foreach $file (Find($dir, $pluglog, "", 1, 0, $_)) {
-            OpenFile(*FILE, $file, 0) or warn("Can't read file `$file'.\n"), last;
-            while (<FILE>) {
-                $plugfile = 1, next if /^Reading (ROM|ROFS1|UDEB|UREL) files$/;
-                $plugfile = 0, next if ($plugfile && /^Found \d+ entries$/);
-                if ($plugfile) {
-                    next if !/`(.+)'$/;
-                    $file = GetAbsFname($1);
-                    $files{lc($file)} = $file if !exists($files{lc($file)});
-                    next;
-                }
-                $patched = $1, next if /^Found (\d+) ROM-patched components:$/;
-                next if (!$patched || !/^`(.+)'$/);
-                $patched--;
-                $file = GetAbsFname($1) . ".map";
-                $files{lc($file)} = $file, next if -f($file);
-                $file =~ s/(\..*?\.map)$/\.\*$1/;
-                foreach (glob($file =~ /\s/ ? "\"$file\"" : $file)) {
-                    ($file = lc()) =~ s/\.map$//;
-                    $files{lc()} = $_, last if exists($files{$file});
-                }
-            }
-            close(FILE);
-        }
-
-        $dir .= "/" if $dir !~ /\/$/;
-        foreach $file (keys(%files)) {
-            delete($files{$file}) if ($file =~ /^$dir/i);
-        }
-    }
-
-    @gFindresult = () if (!defined($opt) || $opt !~ /a/);
-    push(@gFindresult, values(%files));
-}
-
-
-###############################################################################
-#
-
-sub CheckTool(@)
-{
-    return if $gPrintcmd;
-    my ($maxtlen, $maxvlen, @tools) = (4, 9, ());
-    while (@_) {
-        my ($tool, $vquery, $getver, $version, $md5sum) = (shift(), shift(), shift(), " -", " ?");
-        if (length($vquery) > 1) {
-            RunSystemCmd($vquery, "null");
-            $version = (join("\n", @gCmdoutbuf) =~ eval($getver =~ /^\// ? "qr$getver" : "qr/$getver/ims") ?
-                (defined($1) && defined($2) && "`$1 $2'" || defined($1) && "`$1'" || " ?") : " ?");
-        }
-        OpenFile(*FILE, $tool, 1) and $md5sum = "`" . md5_hex(<FILE>) . "'";
-        close(FILE);
-        $maxtlen = Max($maxtlen, length($tool));
-        $maxvlen = Max($maxvlen, length($version));
-        push(@tools, "`$tool'", $version, $md5sum);
-    }
-    $maxtlen += 2;
-    @_ = (" Tool", " Version", " MD5 Checksum", "-" x $maxtlen, "-" x $maxvlen, "-" x 34, @tools);
-    DPrint(1, sprintf("%-${maxtlen}s %-${maxvlen}s ", shift(), shift()) . shift() . "\n") while(@_);
-}
-
-
-###############################################################################
-#
-
-sub GetIPar()
-{
-    local $_ = shift(@gIcmd);
-    $_ = "<UNDEFINED>" if (my $empty = !defined());
-
-    while (/\@PEVAL{.*}LAVEP\@/) {
-        my $start = rindex($_, '@PEVAL{', my $end = index($_, '}LAVEP@') + 7);
-        my ($expr, $eval, $evalerr) = (substr($_, $start + 7, $end - $start - 14), undef, "");
-        eval {
-            local ($_, $SIG{__DIE__});
-            local $SIG{__WARN__} = sub{} if $gPrintcmd;
-            $eval = eval($expr);
-            ($evalerr = $@) =~ s/^(.+?) at .*/$1/s;
-        };
-#        DPrint(64, "GetIPar: Evaluate `$expr' = `" . (defined($eval) ? $eval : "") . "'\n");
-        if (!defined($eval)) {
-            $eval = "";
-            warn("GetIPar: Evaluation `$expr' failed: $evalerr.\n") if !$gPrintcmd;
-        }
-        substr($_, $start, $end - $start) = $eval;
-    }
-    DPrint(32, "iPar: $gParamcnt. `$_'\n") if $gParamcnt;
-    $gParamcnt++;
-    return($empty ? undef : $_);
-}
-
-sub PeekICmd($)
-{
-    return(defined($gIcmd[0]) && $gIcmd[0] =~ /^$_[0]$/i);
-}
-
-sub GetICmd()
-{
-    $gParamcnt = 0;
-    my $cmd = GetIPar();
-    DPrint(32, "iCmd: " . ++$gCmdcnt . ". `$cmd'\n") if defined($cmd) && $cmd ne "";
-    return($cmd);
-}
-
-sub EndICmd()
-{
-    GetICmd(), return(1) if !defined($gIcmd[0]) || PeekICmd("end");
-    return(0);
-}
-
-sub RunICmd()
-{
-    my ($cmd, $file, $iferror) = ("", "", 0);
-    while (defined($cmd = GetICmd())) {
-        next if $cmd eq "";
-        local $_ = lc($cmd);
-        if (/^(error|warning)$/) {
-            my ($errwarn, $msg) = (GetIPar(), Unquote(GetIPar()));
-            die($msg)  if $errwarn && /e/;
-            warn($msg) if $errwarn && /w/;
-        }
-        elsif (/^echo(\d+)?(-q)?$/) {
-            my ($verbose, $quote) = (defined($1) && ($1 < 128) ? $1 : 1, defined($2));
-            Echo($verbose, GetIPar(), $quote);
-        }
-        elsif (/^filter$/) {
-            $gOutfilter = GetIPar();
-        }
-        elsif (/^cmd(tee)?$/) {
-            $file = $1;
-            RunSystemCmd(GetIPar(), $file ? GetIPar() : "");
-        }
-        elsif (/^parse(f)?$/) {
-            $file = $1;
-            ParseSystemCmd(GetIPar(), GetIPar(), $file);
-        }
-        elsif (/^(cd|copy(dir)?|del(dir)?|find(dir)?(-[ar]+)?|headb|logfile|mkcd|mkdir|move|tailb|test|touch|type[bu]?|unzip|workdir|write[bu]?(-q)?|zip(dir)?(-[jq]+)?)$/) {
-            my @files = GlobFiles(GetIPar());
-            my $par1 = GetIPar() if /^(?:copy|find|head|move|tail|touch|(un)?zip|write)/;
-            my $par2 = GetIPar() if /^(?:find|head|tail|zip)/;
-            next if $gPrintcmd;
-            foreach $file (@files) {
-                ChangeDir($file)                           if /^cd/;
-                DeleteDir($file)                           if /deldir/;
-                FindDir($file, $par1, $par2, $1)           if /finddir(-[ar]+)?/;
-                MakeDir($file)                             if /mkdir/;
-                MakeChangeDir($file)                       if /mkcd/;
-                SetWorkdir($file)                          if /workdir/;
-                Zip($file, 1, $1, $par2, GlobFiles($par1)) if /zipdir(-[jq]+)?/;
-                DeleteFile($file)                          if /del/;
-                FindFile($file, $par1, $par2, $1)          if /find(-[ar]+)?$/;
-                HeadFile($file, $par1, $par2)              if /headb/;
-                SetLogfile($file)                          if /logfile/;
-                TailFile($file, $par1, $par2)              if /tailb/;
-                TypeFile($file, $1)                        if /type(b|u)?/;
-                UnzipFile($file, $par1)                    if /unzip/;
-                WriteFile($file, $par1, $1, $2)            if /write(b|u)?(-q)?/;
-                Zip($file, 0, $1, $par2, GlobFiles($par1)) if /^zip(-[jq]+)?$/;
-                Copy($file, $par1, $1)                     if /copy(dir)?/;
-                Move($file, $par1)                         if /move/;
-                Test($file)                                if /test/;
-                Touch($file, $par1)                        if /touch/;
-            }
-        }
-        elsif (/^genexclst$/) {
-            GenExclfile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
-        }
-        elsif (/^geniby(-r)?$/) {
-            my ($sub, $iby, $dir, @par) = ($1, GetIPar(), GetIPar(), ());
-            push(@par, GetIPar(), GetIPar()) while !EndICmd();
-            GenIbyfile($iby, $dir, $sub, @par);
-        }
-        elsif (/^genmk$/) {
-            GenMakefile(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
-        }
-        elsif (/^iferror$/) {
-            $iferror++;
-            $gError = 0, next if $gError;
-            while (defined($gIcmd[0])) {
-                GetICmd(), last if PeekICmd("endif") && !--$iferror;
-                $iferror++ if shift(@gIcmd) =~ /^iferror$/i;
-            }
-        }
-        elsif (/^endif$/ && $iferror--) {
-        }
-        elsif (/^imghdr$/) {
-            AddImageHeader(GetIPar(), GetIPar(), GetIPar(), GetIPar(), GetIPar());
-        }
-        elsif (/^pause$/) {
-            DPrint(0, "Press Enter to continue...\n");
-            getc();
-        }
-        elsif (/^sleep$/) {
-            Sleep(GetIPar());
-        }
-        elsif (/^sosfind(-a)?$/) {
-            my $opt = $1;
-            FindSOSFiles(GetIPar(), GetIPar(), GetIPar(), GetIPar(), $opt);
-        }
-        elsif (/^toolchk$/) {
-            my @tools = ();
-            push(@tools, GetIPar(), GetIPar(), GetIPar()) while !EndICmd();
-            CheckTool(@tools);
-        }
-        elsif (/^wgunzip$/) {
-            ($file, my $dir, my $fname) = (GetIPar(), GetIPar(), GetIPar());
-            map { WidgetUnzip($_, $dir, $fname) } GlobFiles($file);
-        }
-        elsif (!$gImakerext || !RunIExtCmd($_)) {
-            die("Unknown iMaker command `$cmd'.\n");
-        }
-    }
-}
-
-
-###############################################################################
-#
-
-sub GetFeatvarIncdir($;$)
-{
-    my ($varname, $nbv) = @_;
-    my %featvar = ();
-    my @incdir  = ("Invalid SBV feature variant");
-    my $valid   = 0;
-    local $_;
-
-    open(OLDERR, ">&STDERR");
-    open(STDERR, $gWinOS ? ">nul" : ">/dev/null");
-    select(STDERR);
-    eval {
-        local $SIG{__DIE__};
-        %featvar = featurevariantparser->GetVariant($varname);
-        $valid = $featvar{VALID};
-    };
-    close(STDERR);
-    open(STDERR, ">&OLDERR");
-    close(OLDERR);
-    select(STDOUT);
-
-    return(grep(tr/\\/\// || 1, @{$featvar{ROM_INCLUDES}})) if $valid;
-    return(@incdir) if !$nbv;
-
-    # N*kia Binary Variation
-    foreach my $file (<$gEpoc32/tools/*.bsf>) {
-        (my $varname = lc($file)) =~ s/^.*\/(.+?)\.bsf$/$1/;
-        open(FILE, $file);
-        while (my $line = <FILE>) {
-            $featvar{$varname}{CUSTOMIZES} = lc($1) if $line =~ /^\s*CUSTOMIZES\s+(\S+)\s*$/i;
-            $featvar{$varname}{VARIANT} = (uc($1) || 1) if $line =~ /^\s*(VIRTUAL)?VARIANT\s*$/i;
-        }
-        close(FILE);
-    }
-    $varname = lc($varname);
-    my @variant = ();
-    while ($featvar{$varname}{VARIANT}) {
-        unshift(@variant, $varname) if $featvar{$varname}{VARIANT} ne "VIRTUAL";
-        $varname = $featvar{$varname}{CUSTOMIZES};
-    }
-    while (@variant) {
-        map { push(@incdir, join("/", $_, @variant)) } ("$gEpoc32/rom", "$gEpoc32/include");
-        pop(@variant);
-    }
-    return(@incdir);
-}
-
-
-###############################################################################
-#
-
-sub SetVerbose($)
-{
-    my $verbose = shift();
-    return($gVerbose = int($1)) if ($verbose =~ /^(\d+)$/) && ($1 < 128);
-    $gVerbose = 1;
-    warn("Verbose level `$verbose' is not integer between 0 - 127\n");
-    return(1);
-}
-
-sub ReadICmdFile($)
-{
-    my ($file, $steps) = (GetAbsFname(shift()), "");
-    OpenFile(*FILE, $file, 0) or
-        die("Can't read iMaker command file `$file'.\n"), return;
-    while (<FILE>) {
-        DPrint(2, $_), next if /^\s*#/;
-        next if !/^\s*(\S+?)\s*=(.*)$/;
-        $gStepIcmd{my $step = $1} = (my $icmd = $2);
-        $steps .= ($steps ? ", " : "") . $step . ($icmd =~ /^\s*$/ ? " (empty)" : "");
-    }
-    close(FILE);
-    DPrint(2, "Steps: $steps\n");
-}
-
-sub CloseLog()
-{
-    close(LOG) if $gLogfile;
-    $gLogfile = "";
-}
-
-sub MakeStep($$$$$$)
-{
-    (my $step, my $clean, my $build, $gKeepgoing, my $verbose, $gPrintcmd) = @_;
-    (my $dur, @gStepDur) = (time(), ());
-
-    SetVerbose($verbose);
-    ChangeDir($gWorkdir);
-
-    $gMakestep = "S:$step,C:" . ($clean ? 1 : 0) . ",B:" . ($build ? 1 : 0) .
-        ",K:" . ($gKeepgoing ? 1 : 0) . ",V:$gVerbose";
-    DPrint(2, "=" x 79 . "\nENTER: `$gMakestep'\n");
-    map {
-        if (defined($gStepIcmd{$_})) {
-            DPrint(64, "$_ = `$gStepIcmd{$_}'\n");
-            $gStepIcmd{$_} =~ s/(?<!(\\|\s))\|/ \|/g;  # ???
-            @gIcmd = map((s/^\s+|(?<!\\)\s+$//g, s/\\\|/\|/g) ? $_ : $_, split(/(?<!\\)\|/, "$gStepIcmd{$_} "));
-            RunICmd();
-        } else {
-            warn("Step `$_' is undefined.\n");
-        }
-    } ($clean ? "CLEAN_$step" : (), $build ? "BUILD_$step" : ());
-
-    DPrint(2, "EXIT: `$gMakestep', duration: " . Sec2Min($dur = time() - $dur) . "\n");
-    return((@gStepDur, $dur));
-}
-
-
-###############################################################################
-#
-
-sub HandleCmdArg($)
-{
-    my $arg = (defined($_[0]) ? $_[0] : "");
-    return($gImakerext ? HandleExtCmdArg($arg) : $arg);
-}
-
-
-###############################################################################
-#
-
-sub MenuRuncmd($)
-{
-    ($ENV{IMAKER_MAKECMD}, my @menubuf) = (shift(), ());
-    map {
-        chomp();
-        push(@menubuf, $_);
-    } qx($ENV{IMAKER_MAKECMD});
-    return(@menubuf);
-}
-
-sub Menu($$$)
-{
-    my ($makecmd, $mainmk, $cmdarg) = @_;
-    my $quietopt = 'LOGFILE= PRINTCMD=0 VERBOSE=1 WORKDIR=$(CURDIR)';
-    my ($prodind, $prodmk, @product) = (0, "", ());
-    my ($targind, $target, $targcols, $targrows, @target)  = (0, "", 4, 0, ());
-    my ($vartype, $varudeb, $varsym) = ("", 0, 0);
-    my $cfgfile = "./imaker_menu.cfg";
-
-    $cmdarg =~ s/^\s+|\s+$//g;
-    $cmdarg = " $cmdarg" if $cmdarg ne "";
-    open(FILE, "<$cfgfile") and
-        (($prodind, $targind, $vartype, $varudeb, $varsym) = map(chomp() ? $_ : $_, <FILE>)) and close(FILE);
-
-    while (1) {
-        system($gWinOS ? "cls" : "clear");
-
-        print("\nPRODUCTS\n--------\n");
-        #
-        if (!@product) {
-            map {
-                push(@product, [ucfirst($1), $_]) if /image_conf_(.+?)\./;
-            } MenuRuncmd("$makecmd $mainmk $quietopt help-config");
-        }
-        $prodmk = ($prodind ? " -f $product[$prodind - 1][1]" : "");
-        my $maxlen = Max(map(length(@$_[0]), @product));
-        map {
-            printf(" %" . (length(@product)) . "s) %-${maxlen}s  %s\n", $_ + 1, $product[$_][0], $product[$_][1]);
-        } (0 .. $#product);
-        print(" NO PRODUCTS FOUND!\n") if !@product;
-
-        print("\nTARGETS\n-------\n");
-        #
-        if (!@target) {
-            @target = MenuRuncmd("$makecmd$prodmk $mainmk $quietopt help-target-*-list");
-            $targrows = int($#target / $targcols + 1);
-            my $maxind = 0;
-            map {
-                if (!($_ % $targrows)) {
-                    $maxind = length(Min($_ + $targrows, $#target + 1)) + 1;
-                    $maxlen = Max(map(length(), @target[$_ .. Min($_ + $targrows - 1, $#target)]));
-                }
-                $target[$_] = sprintf("%${maxind}s) %-${maxlen}s", "t" . ($_ + 1), $target[$_]);
-            } (0 .. $#target);
-        }
-        ($target = ($targind ? $target[$targind - 1] : "")) =~ s/^.+?(\S+)\s*$/$1/;
-        foreach my $row (1 .. $targrows) {
-            foreach my $col (1 .. $targcols) {
-                my $ind = ($col - 1) * $targrows + $row - 1;
-                print(($ind < @target ? " $target[$ind]" : "") . ($col != $targcols ? " " : "\n"));
-            }
-        }
-        print(" NO TARGETS FOUND!\n") if !@target;
-
-        print("\nCONFIGURATION\n-------------\n");
-        #
-        if (!$vartype) {
-            ($vartype, $varudeb, $varsym) = map(/^\S+\s+=\s+`(.*)'$/ ? $1 : (),
-                MenuRuncmd("$makecmd$prodmk $mainmk $quietopt TIMESTAMP=" . GetTimestamp() .
-                    " $target print-TYPE,USE_UDEB,USE_SYMGEN"));
-            $varudeb =~ s/0//g;
-            $varsym  =~ s/0//g;
-        }
-        print(
-          " Product: " . ($prodind ? $product[$prodind - 1][0] : "NOT SELECTED!") . "\n" .
-          " Target : " . ($targind ? $target : "NOT SELECTED!") . "\n" .
-          " Type   : " . ucfirst($vartype) . "\n" .
-          " Tracing: " . ($varudeb ? ($varudeb =~ /full/i ? "Full debug" : "Enabled") : "Disabled") . "\n" .
-          " Symbols: " . ($varsym ? "Created\n" : "Not created\n"));
-
-        print("\nOPTIONS\n-------\n");
-        #
-        print(
-          " t) Toggle between rnd/prd/subcon\n" .
-          " u) Toggle between urel/udeb/udeb full\n" .
-          " s) Toggle symbol creation on/off\n" .
-          " r) Reset configuration\n" .
-          " h) Print usage information\n" .
-          " x) Exit\n\n" .
-          "Hit Enter to run: imaker$prodmk$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym $target\n");
-
-        print("\nSelection: ");
-        #
-        (my $input = <STDIN>) =~ s/^\s*(.*?)\s*$/\L$1\E/;
-
-        if ($input =~ /^(\d+)$/ && ($1 > 0) && ($1 <= @product) && ($1 != $prodind)) {
-            $prodind = $1;
-            ($targind, @target) = (0, ());
-        }
-        elsif ($input =~ /^t(\d+)$/ && ($1 > 0) && ($1 <= @target) && ($1 != $targind)) {
-            $targind = $1;
-        }
-        elsif ($input eq "t") {
-            $vartype = ($vartype =~ /rnd/i ? "prd" : ($vartype =~ /prd/i ? "subcon" : "rnd"));
-        }
-        elsif ($input eq "u") {
-            $varudeb = (!$varudeb ? 1 : ($varudeb !~ /full/i ? "full" : 0));
-        }
-        elsif ($input eq "s") {
-            $varsym = !$varsym;
-        }
-        elsif ($input eq "r") {
-            ($prodind, @product) = (0, ());
-            ($targind, @target)  = (0, ());
-            ($vartype, $varudeb, $varsym) = ("", 0, 0);
-        }
-        elsif ($input eq "h") {
-            print("\nTODO: Help");
-            sleep(2);
-        }
-        elsif ($input =~ /^(x|)$/) {
-            open(FILE, ">$cfgfile") and
-                print(FILE map("$_\n", ($prodind, $targind, $vartype, $varudeb, $varsym))) and close(FILE);
-            return($input eq "x" ? ("", "menu") :
-                ("$prodmk$cmdarg TYPE=$vartype USE_UDEB=$varudeb USE_SYMGEN=$varsym", $target));
-        }
-    }
-}
-
-
-###############################################################################
-#
-
-die($@) if !defined($gImakerext = do("imaker_extension.pm")) && $@;
-
-1;
-
-__END__ # OF IMAKER.PM
--- a/imgtools/imaker/src/imaker_core.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_core.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,10 +23,10 @@
 #  \___\___/|_|_\___|
 #
 
-USE_NOROMHDR = 0
-
 CORE_TITLE       = Core (ROM$(call iif,$(USE_ROFS1), & ROFS1))
-CORE_DIR         = $(WORKDIR)/core
+CORE_DRIVE       = Z
+CORE_ROOT        = $(OUTDIR)/core
+CORE_DIR         = $(CORE_ROOT)
 CORE_NAME        = $(NAME)
 CORE_PREFIX      = $(CORE_DIR)/$(CORE_NAME)
 CORE_IDIR        =
@@ -38,13 +38,14 @@
 CORE_INLINE      =
 CORE_TIME        = $(DAY)/$(MONTH)/$(YEAR)
 
-CORE_OBYGEN      =
+CORE_DEFHRH      = $(CORE_PREFIX)_core_define.hrh
+CORE_FEAXML      = $(E32ROMINC)/featuredatabase.xml $(E32INC)/s60features.xml $(E32INC)/s60customswfeatures.xml
+CORE_FEAIBY      = $(CORE_DIR)/feature.iby $(CORE_DIR)/s60features.iby $(CORE_DIR)/s60customswfeatures.iby
 
-CORE_VERIBY      = $(CORE_PREFIX)_core_version.iby
-CORE_ROMVER      = 0.01(0)
-CORE_VERSION     = V $(subst .,,$(COREPLAT_VERSION)).$(subst .,,$(S60_VERSION)).$(BUILD_YEAR).$(BUILD_WEEK).$(BUILD_NUMBER)$(if $(TYPE), $(call ucase,$(TYPE)))
+CORE_ROMVER      =
+CORE_VERSION     = $(SW_VERSION)
 CORE_SWVERFILE   = $(CORE_PREFIX)_core_sw.txt
-CORE_SWVERINFO   = $(CORE_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)\\\n$(PRODUCT_TYPE)\\\n(c) $(PRODUCT_MANUFACT)
+CORE_SWVERINFO   = $(CORE_VERSION)\n$(BUILD_YEAR)-$(BUILD_MONTH)-$(BUILD_DAY)\n$(PRODUCT_TYPE)\n(c) $(PRODUCT_MANUFACT)
 CORE_MODELFILE   = $(CORE_PREFIX)_core_model.txt
 CORE_MODELINFO   = S60
 CORE_IMEISVFILE  = $(CORE_PREFIX)_core_imeisv.txt
@@ -53,10 +54,35 @@
 CORE_PLATINFO    = SymbianOSMajorVersion=$(word 1,$(subst ., ,$(SOS_VERSION)))\nSymbianOSMinorVersion=$(word 2,$(subst ., ,$(SOS_VERSION)))\n
 CORE_PRODFILE    = $(CORE_PREFIX)_core_product.txt
 CORE_PRODINFO    = Manufacturer=$(PRODUCT_MANUFACT)\nModel=$(PRODUCT_MODEL)\nProduct=$(PRODUCT_TYPE)\nRevision=$(PRODUCT_REVISION)
+CORE_ID          = general
 CORE_FWIDFILE    = $(CORE_PREFIX)_core_fwid.txt
 CORE_FWID        = core
-CORE_FWIDVER     = $(CORE_VERSION) $(PRODUCT_TYPE)
+CORE_FWIDVER     = $(subst -,,$(PRODUCT_TYPE))_$(CORE_VERSION)_$(CORE_ID)$(SW_TYPEINFO)
 CORE_FWIDINFO    = id=$(CORE_FWID)\nversion=$(CORE_FWIDVER)\n
+CORE_PURPFILE    = $(CORE_PREFIX)_core_purpose.txt
+CORE_PURPINFO    = MCL
+CORE_DEVATTRFILE = $(CORE_PREFIX)_core_deviceattrib.ini
+
+define CORE_DEVATTRINFO
+  [Device]
+  0x10286358 = $(PRODUCT_MANUFACT)
+  0x10286359 = $(PRODUCT_MODEL)
+  0x1028635A = $(PRODUCT_TYPE)
+  0x1028635B = $(PRODUCT_REVISION)
+
+  [UI]
+  0x1028635D = S60
+  0x1028635E = $(word 1,$(subst ., ,$(S60_VERSION)))
+  0x1028635F = $(word 2,$(subst ., ,$(S60_VERSION)))
+  0x10286360 = $(S60_VERSION)
+
+  [OS]
+  0x10286361 = $(word 1,$(subst ., ,$(SOS_VERSION)))
+  0x10286362 = $(word 2,$(subst ., ,$(SOS_VERSION)))
+  0x10286363 = $(SOS_VERSION)
+endef
+
+CORE_IMG         = $(ROM_IMG) $(call iif,$(USE_ROFS1),$(ROFS1_IMG))
 
 CORE_PLUGINLOG   = $(CORE_PREFIX)_core_bldromplugin.log
 CORE_NDPROMFILE  = $(E32ROMBLD)/romfiles.txt
@@ -70,62 +96,69 @@
 CORE_PAGEFILE    = $(ODP_PAGEFILE)
 CORE_UDEBFILE    = $(TRACE_UDEBFILE)
 
+CORE_OBYGEN      =
+CORE_ORIDEIBY    = $(CORE_PREFIX)_core_override.iby
+CORE_ORIDEFILES  = $(IMAGE_ORIDEFILES)
+CORE_ORIDECONF   = $(IMAGE_ORIDECONF)
+
 CORE_ICHKLOG     = $(CORE_PREFIX)_core_imgcheck.log
 CORE_ICHKOPT     = $(IMGCHK_OPT)
-CORE_ICHKIMG     = $(ROM_IMG) $(call iif,$(USE_ROFS1),$(ROFS1_IMG))
+CORE_ICHKIMG     = $(CORE_IMG)
 
 CORE_I2FDIR      = $(CORE_DIR)/img2file
 
+CORE_CONECONF    =
+CORE_CONEOPT     = --all-layers --impl-tag=target:core
+
 #==============================================================================
 
 ROM_BUILDOPT   = $(call iif,$(USE_NOROMHDR),-no-header)
-ROM_CHECKSUM   = 0x12345678
 ROM_IMGHDRSIZE = 256
 ROM_HEADER     =
 ROM_FOOTER     =
 
-ROM_IMG        = $(CORE_PREFIX).rom.img
-ROM_INC        = $(CORE_PREFIX).rom.inc
-ROM_LOG        = $(CORE_PREFIX).rom.log
-ROM_OUTOBY     = $(CORE_PREFIX).rom.oby
-ROM_SYM        = $(CORE_PREFIX).rom.symbol
+ROM_PREFIX     = $(CORE_PREFIX).rom
+ROM_IMG        = $(ROM_PREFIX).img
+ROM_INC        = $(ROM_PREFIX).inc
+ROM_LOG        = $(ROM_PREFIX).log
+ROM_OUTOBY     = $(ROM_PREFIX).oby
+ROM_SYM        = $(ROM_PREFIX).symbol
 
-ROFS1_HEADER   =
-ROFS1_IMG      = $(CORE_PREFIX).rofs1.img
-ROFS1_LOG      = $(CORE_PREFIX).rofs1.log
-ROFS1_OUTOBY   = $(CORE_PREFIX).rofs1.oby
-ROFS1_SYM      = $(CORE_PREFIX).rofs1.symbol
+ROFS1_PREFIX   = $(CORE_PREFIX)
+ROFS1_PAGEFILE =
 
 #==============================================================================
 
 define CORE_MSTOBYINFO
-  $(BLDROM_HDRINFO)
+  $(call BLDROM_HDRINFO,CORE)
 
-  $(BLDROM_PLUGINFO)
+  $(call BLDROM_PLUGINFO,CORE)
 
-  // Core header
-  //
+  /* Core header
+  */
   $(CORE_HDRINFO)
 
-  // Core ROM
-  //
+  /* Core ROM
+  */
   ROM_IMAGE[0] {
     $(ROM_HDRINFO)
+  #ifndef _IMAGE_INCLUDE_HEADER_ONLY
     $(BLR.CORE.OBY)
     $(CORE_INLINE)
     $(ROM_FOOTERINFO)
   }
   $(call iif,$(USE_ROFS1),
 
-    // Core ROFS1
-    //
-    ROM_IMAGE 1 rofs1 non-xip size=$(ROFS_MAXSIZE)
+    /* Core ROFS1
+    */
+    ROM_IMAGE 1 rofs1 non-xip size=$(ROFS1_MAXSIZE)
 
     ROM_IMAGE[1] {
       $(ROFS1_HDRINFO)
-      // Content to be moved from ROM to ROFS1
+      /* Content to be moved from ROM to ROFS1 */
     }
   )
+  #endif // _IMAGE_INCLUDE_HEADER_ONLY
 endef
 
 define CORE_HDRINFO
@@ -143,124 +176,200 @@
 
 define ROM_FOOTERINFO
   $(if $(ROM_BUILDOPT),ROMBUILD_OPTION $(ROM_BUILDOPT))
-  romname $(notdir $(ROM_IMG))
   $(if $(CORE_TIME),time=$(CORE_TIME))
-  $(if $(ROM_CHECKSUM),romchecksum=$(ROM_CHECKSUM))
+  $(if $(CORE_ROMVER),version=$(CORE_ROMVER))
   $(ROM_FOOTER)
 endef
 
 define ROFS1_HDRINFO
-  $(call ODP_CODEINFO,1)
+  $(ODP_ROFSINFO)
   $(ROFS1_HEADER)
   $(if $(CORE_TIME),time=$(CORE_TIME))
 endef
 
-define CORE_VERIBYINFO
-  // Generated `$(CORE_VERIBY)$' for Core image creation
-  $(if $(CORE_ROMVER),
-
-    version=$(CORE_ROMVER))
+define CORE_ORIDEINFO
+  // Generated `$(CORE_ORIDEIBY)' for $(CORE_TITLE) image creation
 
-  OVERRIDE_REPLACE/ADD
-  data-override=$(CORE_SWVERFILE)  RESOURCE_FILES_DIR\versions\sw.txt
-  data-override=$(CORE_MODELFILE)  RESOURCE_FILES_DIR\versions\model.txt
-  data-override=$(CORE_IMEISVFILE)  RESOURCE_FILES_DIR\versions\imeisv.txt
-  data-override=$(CORE_PLATFILE)  RESOURCE_FILES_DIR\versions\platform.txt
-  data-override=$(CORE_PRODFILE)  RESOURCE_FILES_DIR\versions\product.txt
-  $(call iif,$(USE_FOTA),
-    data-override=$(CORE_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid1.txt)
-  OVERRIDE_END
+  $(call iif,$(USE_ROFS1),\
+    OVERRIDE_REPLACE/ADD
+    $(if $(CORE_SWVERINFO),
+      data-override="$(CORE_SWVERFILE)"  "$(IMAGE_VERSDIR)\sw.txt")
+    $(if $(CORE_MODELINFO),
+      data-override="$(CORE_MODELFILE)"  "$(IMAGE_VERSDIR)\model.txt")
+    $(if $(CORE_IMEISVINFO),
+      data-override="$(CORE_IMEISVFILE)"  "$(IMAGE_VERSDIR)\imeisv.txt")
+    $(if $(CORE_PLATINFO),
+      data-override="$(CORE_PLATFILE)"  "$(IMAGE_VERSDIR)\platform.txt")
+    $(if $(CORE_PRODINFO),
+      data-override="$(CORE_PRODFILE)"  "$(IMAGE_VERSDIR)\product.txt")
+    $(if $(CORE_PURPINFO),
+      data-override="$(CORE_PURPFILE)"  "$(IMAGE_VERSDIR)\purpose.txt")
+    $(if $(CORE_FWIDINFO),
+      data-override="$(CORE_FWIDFILE)"  "$(IMAGE_VERSDIR)\fwid1.txt")
+    $(if $(CORE_DEVATTRINFO),
+      data-override="$(CORE_DEVATTRFILE)"  "$(IMAGE_VERSDIR)\deviceattributes.ini")
+    OVERRIDE_END
+  )
 endef
 
 #==============================================================================
 
 CLEAN_COREFILE =\
-  del | "$(CORE_MSTOBY)" "$(CORE_VERIBY)" "$(CORE_SWVERFILE)" "$(CORE_MODELFILE)"\
-    "$(CORE_IMEISVFILE)" "$(CORE_PLATFILE)" "$(CORE_PRODFILE)" "$(CORE_FWIDFILE)" |\
+  del | "$(CORE_MSTOBY)" "$(CORE_ORIDEIBY)" "$(CORE_SWVERFILE)" "$(CORE_MODELFILE)"\
+    "$(CORE_IMEISVFILE)" "$(CORE_PLATFILE)" "$(CORE_PRODFILE)" "$(CORE_PURPFILE)"\
+    "$(CORE_FWIDFILE)" "$(CORE_DEVATTRFILE)" |\
   del | $(call getgenfiles,$(CORE_OBYGEN))
 
 BUILD_COREFILE =\
-  echo-q | Generating file(s) for Core image creation |\
-  write  | $(CORE_MSTOBY) | $(call def2str,$(CORE_MSTOBYINFO)) |\
-  $(call iif,$(USE_ROFS1),$(call iif,$(USE_VERGEN),\
-    write  | $(CORE_VERIBY)     | $(call def2str,$(CORE_VERIBYINFO)) |\
-    writeu | $(CORE_SWVERFILE)  | $(CORE_SWVERINFO)  |\
-    writeu | $(CORE_MODELFILE)  | $(CORE_MODELINFO)  |\
-    writeu | $(CORE_IMEISVFILE) | $(CORE_IMEISVINFO) |\
-    writeu | $(CORE_PLATFILE)   | $(CORE_PLATINFO)   |\
-    writeu | $(CORE_PRODFILE)   | $(CORE_PRODINFO)   |\
-    writeu | $(CORE_FWIDFILE)   | $(CORE_FWIDINFO)   |))\
+  echo-q  | Generating file(s) for $(CORE_TITLE) image creation |\
+  write-c | "$(CORE_MSTOBY)" | $(call def2str,$(CORE_MSTOBYINFO))\n |\
+  $(call iif,$(USE_ROFS1),\
+    $(if $(CORE_SWVERINFO),\
+      writeu | "$(CORE_SWVERFILE)"   | $(call quote,$(CORE_SWVERINFO)) |)\
+    $(if $(CORE_MODELINFO),\
+      writeu | "$(CORE_MODELFILE)"   | $(CORE_MODELINFO)  |)\
+    $(if $(CORE_IMEISVINFO),\
+      writeu | "$(CORE_IMEISVFILE)"  | $(CORE_IMEISVINFO) |)\
+    $(if $(CORE_PLATINFO),\
+      writeu | "$(CORE_PLATFILE)"    | $(CORE_PLATINFO)   |)\
+    $(if $(CORE_PRODINFO),\
+      writeu | "$(CORE_PRODFILE)"    | $(CORE_PRODINFO)   |)\
+    $(if $(CORE_PURPINFO),\
+      writeu | "$(CORE_PURPFILE)"    | $(CORE_PURPINFO)   |)\
+    $(if $(CORE_FWIDINFO),\
+      writeu | "$(CORE_FWIDFILE)"    | $(CORE_FWIDINFO)   |)\
+    $(if $(CORE_DEVATTRINFO),\
+      writeu | "$(CORE_DEVATTRFILE)" | $(call def2str,$(CORE_DEVATTRINFO)) |)\
+  )\
+  $(if $(CORE_ORIDEINFO),\
+    write-c | "$(CORE_ORIDEIBY)" | $(call def2str,$(CORE_ORIDEINFO)) |)\
+  $(if $(CORE_ORIDECONF),\
+    genorideiby | >>$(CORE_ORIDEIBY) | $(call def2str,$(CORE_ORIDEFILES) | $(CORE_ORIDECONF)) |)\
   $(CORE_OBYGEN)
 
 
 ###############################################################################
 # Core pre-build step
 
-CLEAN_COREPRE = $(if $(filter 1,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_COREFILE)
+CLEAN_COREPRE =\
+ $(if $(filter 1,$(USE_VARIANTBLD)),$(CLEAN_VARIANT) |)\
+ $(CLEAN_COREFILE) | $(CLEAN_DEFHRH) | $(CLEAN_FEATMAN)
+
 BUILD_COREPRE =\
-  $(if $(filter 1,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
-  mkcd | $(CORE_DIR) |\
-  $(BUILD_COREFILE)
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(BUILD_VARIANT) |)\
+  mkdir | "$(CORE_DIR)" |\
+  $(BUILD_COREFILE) |\
+  $(BUILD_DEFHRH)   |\
+  $(BUILD_FEATMAN)
 
 #==============================================================================
 # Core build step
 
-BLR.CORE.IDIR  = $(call dir2inc,$(CORE_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
-BLR.CORE.HBY   = $(call includeiby,<data_caging_paths_for_iby.hrh> $(CORE_HBY))
-BLR.CORE.OBY   = $(call includeiby,$(CORE_OBY) $(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(BLDROBY) $(call iif,$(USE_ROFS1),$(call iif,$(USE_VERGEN),$(CORE_VERIBY))))
-BLR.CORE.OPT   = $(CORE_OPT) $(if $(filter 1,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(CORE_NAME).img) $(BLDROPT)
-BLR.CORE.POST  =\
-  move | $(CORE_PREFIX).log | $(ROM_LOG) |\
-  move | $(CORE_PREFIX).oby | $(ROM_OUTOBY) |\
-  test | $(ROM_IMG) | $(call iif,$(USE_PAGEDROM),test | $(ROM_INC) |)\
-  $(call iif,$(USE_ROFS1),test | $(ROFS1_IMG))
+BLR.CORE.IDIR = $(call dir2inc,$(CORE_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.CORE.HBY  = $(call includeiby,<data_caging_paths_for_iby.hrh> $(CORE_HBY))
+BLR.CORE.OBY  =\
+  $(call includeiby,$(CORE_OBY))\
+  $(and $(call true,$(SYMBIAN_FEATURE_MANAGER)),$(CORE_FEAIBY),$(call mac2cppdef,-U__FEATURE_IBY__)$(call includeiby,$(CORE_FEAIBY)))\
+  $(call includeiby,$(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(BLDROBY) $(CORE_ORIDEIBY))
+BLR.CORE.OPT  = $(CORE_OPT) $(if $(filter 1,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(call pathconv,$(ROM_IMG)) $(BLDROPT)
+BLR.CORE.POST =\
+  test | "$(ROM_IMG)" $(call iif,$(USE_PAGEDROM),"$(ROM_INC)") |\
+  $(call iif,$(USE_ROFS1),\
+    move | "$(ROM_PREFIX).rofs1.img" | $(ROFS1_IMG)    |\
+    move | "$(ROM_PREFIX).rofs1.log" | $(ROFS1_LOG)    |\
+    move | "$(ROM_PREFIX).rofs1.oby" | $(ROFS1_OUTOBY) |\
+    $(call iif,$(USE_SYMGEN),move | "$(ROM_PREFIX).rofs1.symbol" | $(ROFS1_SYM)))
 
-CLEAN_CORE = $(CLEAN_BLDROM)
-BUILD_CORE = $(BUILD_BLDROM)
+CLEAN_CORE = $(call CLEAN_BLDROM,CORE)
+BUILD_CORE = $(call BUILD_BLDROM,CORE)
+
+REPORT_CORE =\
+  $(CORE_TITLE) dir | $(CORE_DIR) | d |\
+  Core ROM image    | $(ROM_IMG)  | f\
+  $(call iif,$(USE_SYMGEN),| Core ROM symbols | $(ROM_SYM) | f)\
+  $(call iif,$(USE_ROFS1),|\
+    Core ROFS1 image | $(ROFS1_IMG) | f\
+    $(call iif,$(USE_SYMGEN),| Core ROFS1 symbols | $(ROFS1_SYM) | f))
 
 #==============================================================================
 # Core post-build step
 
-CLEAN_COREPOST = $(CLEAN_IMGCHK) | $(CLEAN_CORESYM)
-BUILD_COREPOST =\
-  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
-  $(call iif,$(USE_SYMGEN),$(BUILD_CORESYM))
+CLEAN_COREPOST = $(CLEAN_IMGCHK)
+BUILD_COREPOST = $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK))
+
+
+###############################################################################
+# Core symbol generation
+
+MAKSYM_CMD = $(MAKSYM_TOOL) $(call pathconv,"$(ROM_LOG)" "$(ROM_SYM)")
 
 CLEAN_CORESYM = del | "$(ROM_SYM)" "$(ROFS1_SYM)"
 BUILD_CORESYM =\
   echo-q | Creating $(CORE_TITLE) symbol file(s) |\
-  cmd    | $(MAKSYM_TOOL) $(call pathconv,$(ROM_LOG) $(ROM_SYM)) |\
-  $(call iif,$(USE_ROFS1),cmd | $(MAKSYMROFS_TOOL) $(call pathconv,$(ROFS1_LOG) $(ROFS1_SYM)))
+  cmd    | $(MAKSYM_CMD) |\
+  $(call iif,$(USE_ROFS1),cmd | $(MAKSYMROFS_TOOL) $(call pathconv,"$(ROFS1_LOG)" "$(ROFS1_SYM)"))
+
+REPORT_CORESYM =\
+  Core ROM symbols | $(ROM_SYM) | f\
+  $(call iif,$(USE_ROFS1),| Core ROFS1 symbols | $(ROFS1_SYM) | f)
+
 
-#==============================================================================
+###############################################################################
+# Steps
 
-SOS.CORE.STEPS = $(call iif,$(SKIPPRE),,COREPRE) $(call iif,$(SKIPBLD),,CORE) $(call iif,$(SKIPPOST),,COREPOST)
+SOS.CORE.STEPS =\
+  $(call iif,$(SKIPPRE),,$(and $(filter 1,$(USE_VARIANTBLD)),$(call true,$(USE_CONE)),CONEGEN RESTART) COREPRE)\
+  $(call iif,$(SKIPBLD),,CORE) $(call iif,$(SKIPPOST),,COREPOST)
+
 ALL.CORE.STEPS = $(SOS.CORE.STEPS)
 
+CORE_PRESTEPS = $(call iif,$(USE_SMR),smr |)
+CORE_STEPS    = $(CORE_PRESTEPS) $(ALL.CORE.STEPS)
+CORE_IMGSTEPS = $(CORE_PRESTEPS) $(SOS.CORE.STEPS)
+
 
 ###############################################################################
 # Targets
 
-.PHONY: core core-all core-image core-pre core-check core-symbol core-i2file
+.PHONY: core $(addprefix core-,all check cone i2file image pre symbol)
 
-core core-% rom-% rofs1-%: IMAGE_TYPE = CORE
-core-all     : USE_SYMGEN = 1
+core core% rom% rofs1%: IMAGE_TYPE = CORE
+core-all              : USE_SYMGEN = 1
 
-core core-all: ;@$(call IMAKER,$$(ALL.CORE.STEPS))
-core-image   : ;@$(call IMAKER,$$(SOS.CORE.STEPS))
+core core-all: ;@$(call IMAKER,$$(CORE_STEPS))
+core-image   : ;@$(call IMAKER,$$(CORE_IMGSTEPS))
 
-core-pre     : ;@$(call IMAKER,COREPRE)
-core-check   : ;@$(call IMAKER,IMGCHK)
-core-symbol  : ;@$(call IMAKER,CORESYM)
+core-cone  : ;@$(call IMAKER,CONEGEN)
+core-pre   : ;@$(call IMAKER,COREPRE)
+core-check : ;@$(call IMAKER,IMGCHK)
+core-symbol: ;@$(call IMAKER,CORESYM)
+core-i2file: ;@$(call IMAKER,I2FILE)
 
-core-i2file  : ;@$(call IMAKER,COREI2F)
-
-core-trace-% : LABEL         = _trace_$*
-core-trace-% : USE_UDEB      = 1
-core-trace-% : CORE_UDEBFILE = $(call findfile,$(TRACE_PREFIX)$*$(TRACE_SUFFIX),$(TRACE_IDIR))
-core-trace-% :\
+core-trace-%: LABEL         = _$*
+core-trace-%: USE_UDEB      = 1
+core-trace-%: CORE_UDEBFILE = $(call findfile,$(TRACE_PREFIX)$*$(TRACE_SUFFIX),$(TRACE_IDIR))
+core-trace-%:\
   ;@$(if $(wildcard $(CORE_UDEBFILE)),,$(error Can't make target `$@', file `$(CORE_UDEBFILE)' not found))\
     $(call IMAKER,$$(ALL.CORE.STEPS))
 
 
+###############################################################################
+# Helps
+
+$(call add_help,CORE_PURPFILE,v,(string),The (generated) _core_purpose.txt file name.)
+$(call add_help,CORE_PURPINFO,v,(string),The content string for the purpose.txt file.)
+
+$(call add_help,core,t,Create $$(CORE_TITLE) image.)
+$(call add_help,core-dir,t,Create directory structure for $$(CORE_TITLE) creation.)
+$(call add_help,core-i2file,t,Extract all files from $$(CORE_TITLE) image.)
+$(call add_help,core-image,t,Create $$(CORE_TITLE) image (.img) file(s).)
+$(call add_help,core-pre,t,Run pre-step, create files etc. for $$(CORE_TITLE) creation.)
+$(call add_help,core-symbol,t,Create $$(CORE_TITLE) symbol file(s).)
+
+BUILD_HELPDYNAMIC +=\
+  $(foreach file,$(call reverse,$(wildcard $(addsuffix /$(TRACE_PREFIX)*$(TRACE_SUFFIX),$(TRACE_IDIR)))),\
+    $(call add_help,core-trace-$(patsubst $(TRACE_PREFIX)%$(TRACE_SUFFIX),%,$(notdir $(file))),t,\
+      Create $(CORE_TITLE) image with traces for $(file).))
+
+
 # END OF IMAKER_CORE.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_emmc.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker eMMC (Embedded Mass Memory) image configuration
+#
+
+
+
+###############################################################################
+#      __  __ __  __  ___
+#  ___|  \/  |  \/  |/ __|
+# / -_) |\/| | |\/| | (__
+# \___|_|  |_|_|  |_|\___|
+#
+
+EMMC_TITLE       = eMMC
+
+EMMC_DRIVE       = E
+EMMC_FATTYPE     = 32# FAT32
+EMMC_SIZE        = 16777216# kB (= 16 GB)
+EMMC_CLUSTERSIZE = 16# kB
+EMMC_FATTABLE    = 2
+
+EMMC_SWVERFILE   = $(EMMC_DATADIR)/Resource/Versions/User Content Package_Mass_Memory.txt
+EMMC_SWVERINFO   = # Don't generate sw version file
+EMMC_EXCLFILE    = # Don't generate exclude list
+
+
+# END OF IMAKER_EMMC.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_fat.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,296 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker FAT (File Allocation Table) image configuration
+#
+
+
+
+###############################################################################
+#  ___  _  _____
+# | __|/_\|_   _|
+# | _|/ _ \ | |
+# |_|/_/ \_\|_|
+#
+
+USE_FILEDISK = 0
+USE_FSIMAGE  = 0
+USE_SOSUDA   = 1
+
+FATEMPTY_CMD =
+
+
+###############################################################################
+#
+
+define FAT_EVAL
+$1_TITLE       = $1
+$1_ROOT        = $$(OUTDIR)/$2
+$1_DIR         = $$($1_ROOT)
+$1_NAME        = $$(NAME)
+$1_PREFIX      = $$($1_DIR)/$$($1_NAME)
+$1_IDIR        =
+$1_HBY         =
+$1_OBY         =
+$1_OPT         = $$(BLDROM_OPT) -D_EABI=$$(ARM_VERSION)
+$1_MSTOBY      = $$($1_PREFIX)_$2_master.oby
+$1_HEADER      =
+$1_INLINE      =
+$1_FOOTER      =
+$1_TIME        = $$(DAY)/$$(MONTH)/$$(YEAR)
+
+$1_DEFHRH      = $$($1_PREFIX)_$2_define.hrh
+$1_FEAXML      =
+$1_FEAIBY      =
+
+$1_ROMVER      = $$(CORE_ROMVER)
+$1_ID          = $$(if $$(filter $2_%,$$(TARGETNAME)),$$(TARGETID1),00)
+$1_REVISION    = 01
+$1_VERSION     = $$(CORE_VERSION).$$($1_ID).$$($1_REVISION)
+$1_SWVERFILE   = $$($1_DATADIR)/Resource/Versions/User Content Package_$1.txt
+$1_SWVERINFO   = $$($1_VERSION)
+
+$1_IMG         = $$($1_PREFIX).$2.img
+$1_LOG         = $$($1_PREFIX).$2.log
+$1_OUTOBY      = $$($1_PREFIX).$2.oby
+
+$1_PLUGINLOG   = $$($1_PREFIX)_$2_bldromplugin.log
+$1_UDEBFILE    = $$(TRACE_UDEBFILE)
+
+$1_OBYGEN      =
+$1_ORIDEIBY    = $$($1_PREFIX)_$2_override.iby
+$1_ORIDEFILES  = $$(IMAGE_ORIDEFILES)
+$1_ORIDECONF   = $$(IMAGE_ORIDECONF)
+
+$1_CONECONF    = $$(PRODUCT_NAME)_$2_$$($1_ID)$$(addprefix _,$$($1_VARNAME))_root.confml
+$1_CONEOPT     = --all-layers --impl-tag=target:$2
+
+$1_DRIVE       = C
+$1_FATTYPE     = 16# FAT16
+$1_SIZE        = 20480# kB
+$1_SIZEB       = $$(call peval,$$($1_SIZE) * 1024)# B
+$1_DISKSIZE    = $$($1_SIZE)# kB
+$1_SECTORSIZE  = 512# B
+$1_CLUSTERSIZE = 4# kB
+$1_FATTABLE    = 1
+$1_VOLUME      =
+
+$1_TOUCH       = 0#$$(YEAR)$$(MONTH)$$(DAY)000000
+$1_CPDIR       =
+$1_ZIP         =
+$1_DATADIR     = $$($1_DIR)/datadrive
+
+$1_VARNAME     = $$(if $$(filter $2_%,$$(TARGETNAME)),$$(TARGETID2-))
+$1_VARROOT     = $$(or $$(wildcard $$(PRODUCT_DIR)/$2),$$(or $$(if $$(PRODUCT_MSTNAME),$$(wildcard $$(PRODUCT_MSTDIR)/$2)),$$(PRODUCT_DIR)/$2))
+$1_VARDIR      = $$(if $$(and $$(call true,$$(USE_CONE)),$$(call true,$$(IMAKER_MKRESTARTS))),$$(CONE_OUTDIR),$$($1_VARROOT)/$2_$$($1_ID)$$(addprefix _,$$($1_VARNAME))$$(call iif,$$(USE_CONE),/content))
+
+$1_EXCLFILE    = $$($1_DATADIR)/private/100059C9/excludelist.txt
+
+define $1_EXCLADD
+*
+endef
+
+define $1_EXCLRM
+endef
+
+$1EMPTY_TITLE  = $$($1_TITLE) Empty
+$1EMPTY_IMG    = $$($1_PREFIX).$2empty.img
+$1EMPTY_CMD    = $$(FATEMPTY_CMD)
+
+#==============================================================================
+
+define $1_MSTOBYINFO
+  $$(call BLDROM_HDRINFO,$1)
+
+  ROM_IMAGE  0 non-xip size=0x00000000
+
+  DATA_IMAGE 0 $$(basename $$($1_IMG)) size=$$(call peval,$$($1_DISKSIZE) * 1024) fat$$(if $$(filter %32,$$($1_FATTYPE)),32,16)
+
+  $$(call BLDROM_PLUGINFO,$1)
+
+  /* $1 header
+  */
+  $$($1_HDRINFO)
+
+  DATA_IMAGE[0] {
+    $$(if $$($1_VOLUME),volume=$$($1_VOLUME))
+    fattable=$$($1_FATTABLE)
+  #ifndef _IMAGE_INCLUDE_HEADER_ONLY
+    $$(BLR.$1.OBY)
+    $$($1_INLINE)
+    $$($1_FOOTERINFO)
+  }
+  #endif // _IMAGE_INCLUDE_HEADER_ONLY
+endef
+
+define $1_HDRINFO
+  $$(DEFINE) _IMAGE_WORKDIR $$($1_DIR)
+  $$(call mac2cppdef,$$(BLR.$1.OPT))
+  $$(BLR.$1.HBY)
+  $$($1_HEADER)
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(VARIANT_HEADER))
+endef
+
+define $1_FOOTERINFO
+  $$(if $$($1_TIME),time=$$($1_TIME))
+  $$(if $$($1_ROMVER),version=$$($1_ROMVER))
+  $$($1_FOOTER)
+endef
+
+$1_ORIDEINFO =
+
+#==============================================================================
+# FAT pre-build
+
+CLEAN_$1PRE =\
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(CLEAN_VARIANT),deldir | "$$($1_DATADIR)") |\
+  $$(CLEAN_$1FILE) | $$(CLEAN_DEFHRH) | $$(CLEAN_FEATMAN)
+
+BUILD_$1PRE =\
+  echo-q | Preparing $$($1_TITLE) FAT image creation |\
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(BUILD_VARIANT) |,\
+    mkdir | "$$($1_DATADIR)" |\
+    $$(if $$($1_ZIP),\
+      $$(eval __i_zip := $$(foreach zip,$$($1_ZIP),$$(zip)$$(if $$(filter %.zip,$$(call lcase,$$(zip))),,/*.zip)))\
+      echo-q | Extracting `$$(__i_zip)' to `$$($1_DATADIR)' |\
+      unzip  | "$$(__i_zip)" | $$($1_DATADIR) |)\
+    $$(if $$($1_CPDIR),\
+      copydir | "$$($1_CPDIR)" | $$($1_DATADIR) |))\
+  mkdir | "$$($1_DIR)" |\
+  $$(BUILD_$1FILE) |\
+  $$(call iif,$$(BLR.$1.OBY),$$(BUILD_DEFHRH) |)\
+  $$(BUILD_FEATMAN)
+
+CLEAN_$1FILE =\
+  del | "$$($1_MSTOBY)" "$$($1_ORIDEIBY)" "$$($1_SWVERFILE)" |\
+  del | $$(call getgenfiles,$$($1_OBYGEN))
+
+BUILD_$1FILE =\
+  echo-q  | Generating file(s) for $$($1_TITLE) FAT image creation |\
+  $$(call iif,$$(BLR.$1.OBY),\
+    write-c | "$$($1_MSTOBY)"    | $$(call def2str,$$($1_MSTOBYINFO))\n |)\
+  $$(if $$($1_SWVERINFO),\
+    writeu  | "$$($1_SWVERFILE)" | $$(call quote,$$($1_SWVERINFO)) |)\
+  $$(if $$($1_ORIDEINFO),\
+    write-c | "$$($1_ORIDEIBY)"  | $$(call def2str,$$($1_ORIDEINFO)) |)\
+  $$(if $$($1_ORIDECONF),\
+    genorideiby | >>$$($1_ORIDEIBY) | $$(call def2str,$$($1_ORIDEFILES) | $$($1_ORIDECONF)) |)\
+  $$($1_OBYGEN)
+
+#==============================================================================
+# FAT build
+
+BLR.$1.IDIR = $$(call dir2inc,$$($1_IDIR) $$(call iif,$$(USE_FEATVAR),,$$(FEATVAR_IDIR)))
+BLR.$1.HBY  = $$(call includeiby,$$(IMAGE_HBY) $$($1_HBY))
+BLR.$1.OBY  = $$(call includeiby,$$($1_OBY))\
+  $$(and $$(call true,$$(SYMBIAN_FEATURE_MANAGER)),$$($1_FEAIBY),$$(call mac2cppdef,-U__FEATURE_IBY__)$$(call includeiby,$$($1_FEAIBY)))\
+  $$(call includeiby,$$(and $$(filter $3,$$(USE_VARIANTBLD)),$$(call true,$$(VARIANT_INCDIR)$$(USE_SOSUDA)),$$(VARIANT_OBY))\
+    $$(if $$(strip $$($1_ORIDEINFO)$$($1_ORIDECONF)),$$($1_ORIDEIBY)))
+BLR.$1.OPT  = $$($1_OPT) -noimage -o$$(call pathconv,$$($1_PREFIX)).dummy0.img $$(BLDROPT)
+BLR.$1.POST = $$(call iif,$$(USE_SOSUDA),,copyiby | "$$($1_OUTOBY)" | $$($1_DATADIR))
+
+CLEAN_$1 = $$(call CLEAN_BLDROM,$1) | $$(CLEAN_FILEDISK) | $$(CLEAN_WINIMAGE) | $$(CLEAN_FSIMAGE)
+BUILD_$1 =\
+  $$(call iif,$$(BLR.$1.OBY),$$(call BUILD_BLDROM,$1) |)\
+  $$(if $$($1_EXCLFILE),\
+    genexclst | $$($1_EXCLFILE) | $$($1_DATADIR) | $$($1_DRIVE): |\
+      $$(call def2str,$$($1_EXCLADD) | $$($1_EXCLRM)) |)\
+  $$(call iif,$$($1_TOUCH),\
+    finddir-r | "$$($1_DATADIR)" | * ||\
+    find-ar   | "$$($1_DATADIR)" | * ||\
+    touch     | __find__ | $$($1_TOUCH) |)\
+  echo-q | Creating $$($1_TITLE) FAT image |\
+  $$(call iif,$$(USE_SOSUDA),$$(BUILD_ROFSBLDFAT),\
+    $$(call iif,$$(USE_FSIMAGE),$$(BUILD_FSIMAGE),\
+      $$(call iif,$$(USE_FILEDISK),$$(BUILD_FILEDISK),$$(BUILD_WINIMAGE))))
+
+REPORT_$1 =\
+  $$($1_TITLE) dir   | $$($1_DIR) | d |\
+  $$($1_TITLE) image | $$($1_IMG) | f
+
+#==============================================================================
+# FAT post-build
+
+CLEAN_$1POST  =
+BUILD_$1POST  =
+REPORT_$1POST =
+
+#==============================================================================
+# Empty FAT
+
+CLEAN_$1EMPTY = del | "$$($1EMPTY_IMG)"
+BUILD_$1EMPTY = $$(if $$($1EMPTY_CMD),\
+  echo-q | Creating $$($1EMPTY_TITLE) FAT image |\
+  mkdir  | "$$($1_DIR)" |\
+  cmd    | $$($1EMPTY_CMD))
+
+REPORT_$1EMPTY = $$($1EMPTY_TITLE) image | $$($1EMPTY_IMG) | f
+
+#==============================================================================
+# FAT steps
+
+SOS.$1.STEPS =\
+  $$(call iif,$$(SKIPPRE),,$$(and $$(filter $3,$$(USE_VARIANTBLD)),$$(call true,$$(USE_CONE)),CONEGEN RESTART) $1PRE)\
+  $$(call iif,$$(SKIPBLD),,$1) $$(call iif,$$(SKIPPOST),,$1POST)
+
+SOS.$1EMPTY.STEPS = $$(if $$(BUILD_$1EMPTY),$1EMPTY)
+
+ALL.$1.STEPS      = $$(SOS.$1.STEPS)
+ALL.$1EMPTY.STEPS = $$(SOS.$1EMPTY.STEPS)
+
+#==============================================================================
+# Targets
+
+.PHONY: $2 $2-cone $2-image $2-pre $2empty $2empty-image variant$2
+
+$2 $2%  : IMAGE_TYPE = $1
+
+$2      : ;@$$(call IMAKER,$$$$(ALL.$1.STEPS))
+$2-image: ;@$$(call IMAKER,$$$$(SOS.$1.STEPS))
+$2-cone : ;@$$(call IMAKER,CONEGEN)
+$2-pre  : ;@$$(call IMAKER,$1PRE)
+
+$2empty      : ;@$$(call IMAKER,$$$$(ALL.$1EMPTY.STEPS))
+$2empty-image: ;@$$(call IMAKER,$$$$(SOS.$1EMPTY.STEPS))
+
+variant$2 variant$2%     : USE_CONE = 0
+variant$2 variant$2% $2_%: USE_VARIANTBLD = $3
+variant$2 variant$2% $2_%: $2$$(TARGETEXT) ;
+
+#==============================================================================
+# Helps
+
+$(call add_help,$2,t,Create $$($1_TITLE) image.)
+$(call add_help,$2-dir,t,Create directory structure for $$($1_TITLE) creation.)
+$(call add_help,$2-image,t,Create $$($1_TITLE) image (.img) file.)
+$(call add_help,$2-pre,t,Run pre-step, create files etc. for $$($1_TITLE) creation.)
+$(call add_help,variant$2,t,Create $$($1_TITLE) image from a variant directory. Be sure to define the VARIANT_DIR.)
+
+BUILD_HELPDYNAMIC +=\
+  $$(call add_help,$$(call getlastdir,$$(wildcard $$($1_VARROOT)/$2_*/)),t,$$($1_TITLE) variant target.)\
+  $$(eval include $$(wildcard $$($1_VARROOT)/$2_*/$$(VARIANT_MKNAME)))
+
+endef # FAT_EVAL
+
+
+###############################################################################
+#
+
+$(eval $(call FAT_EVAL,EMMC,emmc,e))
+$(eval $(call FAT_EVAL,MCARD,mcard,m))
+$(eval $(call FAT_EVAL,UDA,uda,u))
+
+$(call includechk,$(addprefix $(IMAKER_DIR)/imaker_,emmc.mk memcard.mk uda.mk))
+
+
+# END OF IMAKER_FAT.MK
--- a/imgtools/imaker/src/imaker_help.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_help.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -25,14 +25,15 @@
 
 add_help =\
   $(if $(filter help%,$(MAKECMDGOALS)),\
-    $(eval __i_type  := $(call select,$(call substr,1,1,$(strip $2)),t,t,v))\
-    $(eval __i_isvar := $(call equal,$(__i_type),v))\
+    $(eval __i_type  := $(if $(filter t% T%,$2),t,v))\
+    $(eval __i_isvar := $(filter v,$(__i_type)))\
     $(foreach name,$1,\
       $(eval HELP.$(name).TYPE := $(__i_type))\
       $(if $(__i_isvar),$(eval HELP.$(name).VALUES = $3))\
-      $(eval HELP.$(name).DESC = $(strip $(eval __i_desc := $(if $(__i_isvar),$4,$3))\
+      $(eval HELP.$(name).DESC = $(strip $(eval __i_desc = $(if $(__i_isvar),$$4,$$3))\
         $(foreach p,$(if $(__i_isvar),,4) 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20,\
-          $(if $(call defined,$p),$(eval __i_desc := $(__i_desc)$(,)$($p)))))$(__i_desc))))
+          $(if $(call defined,$p),$(eval __i_desc = $(value __i_desc)$(,)$$($p))))\
+        $(subst $$1,$(name),$(subst $$2,$(__i_type),$(__i_desc)))))))
 
 get_helpitems =\
   $(strip $(eval __i_list := $(filter HELP.%.TYPE,$(.VARIABLES)))\
@@ -40,26 +41,19 @@
 
 #==============================================================================
 
-.PHONY: help help-config help-target help-variable
+.PHONY: help help-config
 
-.DEFAULT_GOAL := help
-
-help:: ;@$(call IMAKER,HELPUSAGE:b)
+help:: ;@$(call IMAKER,HELPUSAGE)
 
-help-config: ;@$(call IMAKER,HELPCFG:b)
-
-help-target help-variable: $$@-* ;
+help-config: ;@$(call IMAKER,HELPCFG)
 
-help-target-%-list help-target-%-wiki help-target-% \
-help-variable-%-list help-variable-%-value help-variable-%-all help-variable-%-wiki help-variable-% \
-help-%-list help-%:\
-  ;@$(call IMAKER)
+help-%: ;@$(call IMAKER,HELP)
 
 # Help usage info
 define HELP_USAGE
 
   Print help data on documented iMaker API items; targets and variables.
-  Wildcards *, ? and [] can be used with % patterns.
+  Wildcards *, ? and [..] can be used with % patterns.
 
   help                  : Print this message.
   help-%                : $(HELP.help-%.DESC)
@@ -85,15 +79,10 @@
 
 BUILD_HELPUSAGE = echo | $(call def2str,$(HELP_USAGE))\n
 
-BUILD_HELPDYNAMIC =\
-  $(foreach file,$(call reverse,$(wildcard $(addsuffix /$(TRACE_PREFIX)*$(TRACE_SUFFIX),$(TRACE_IDIR)))),\
-    $(call add_help,core-trace-$(patsubst $(TRACE_PREFIX)%$(TRACE_SUFFIX),%,$(notdir $(file))),t,Core image with traces for $(file).))\
-  $(call add_help,$(call getlastdir,$(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/)),t,Language variant target.)\
-  $(call add_help,$(call getlastdir,$(wildcard $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_PREFIX)*/)),t,Customer variant target.)\
-  $(eval include $(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/$(LANGPACK_MKNAME)))\
-  $(eval include $(wildcard $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_PREFIX)*/$(VARIANT_MKNAME)))
+BUILD_HELPDYNAMIC =
 
 BUILD_HELP =\
+  $(BUILD_HELPDYNAMIC)\
   $(eval __i_var := $(filter help-%,$(MAKECMDGOALS)))\
   $(if $(filter help-target help-variable,$(__i_var)),$(eval __i_var := $(__i_var)-*))\
   $(eval __i_helpgoal := $(__i_var))\
@@ -107,15 +96,15 @@
   $(call peval,\
     my @var = ($(foreach var,$(foreach var2,$(subst $(,), ,$(__i_var)),$(call filterwcard,$(var2),$(__i_list))),{\
       n=>$(call pquote,$(var))\
-      $(eval __i_isvar := $(call equal,$(HELP.$(var).TYPE),v))\
+      $(eval __i_isvar := $(filter v,$(HELP.$(var).TYPE)))\
       $(if $(__i_value),$(if $(__i_isvar),$(,)v=>$(call pquote,$(call def2str,$($(var))))))\
       $(,)t=>q($(HELP.$(var).TYPE))\
       $(if $(__i_desc),\
         $(,)d=>$(call pquote,$(HELP.$(var).DESC))\
         $(if $(__i_isvar),$(,)V=>$(call pquote,$(HELP.$(var).VALUES)))) }$(,)));\
-    imaker:DPrint(1, map($(if $(__i_desc),$(if $(__i_wiki),,q(-) x 40 . qq(\n) .))\
+    DPrint(1, map($(if $(__i_desc),$(if $(__i_wiki),,q(-) x 40 . qq(\n) .))\
       qq($(if $(__i_wiki),== $$_->{n} ==,$$_->{n}))\
-      $(if $(__i_value),. ($$_->{t} eq q(v) ? qq( = `$$_->{v}$') : q())) . qq(\n)\
+      $(if $(__i_value),. ($$_->{t} eq q(v) ? qq( = `$$_->{v}') : q())) . qq(\n)\
       $(if $(__i_desc),.\
         qq($(__i_wiki)Type       : ) . ($$_->{t} eq q(t) ? qq(Target\n) : qq(Variable\n)) .\
         qq($(__i_wiki)Description: $$_->{d}\n) .\
@@ -124,42 +113,44 @@
 
 BUILD_HELPCFG =\
   echo | Finding available configuration file(s):\n\
-    $(call get_cfglist,$(CONFIGROOT),image_conf_.*\.mk,2)\n
+    $(call peval,return(join(q(), map(Quote(qq($$_\n)), GetConfmkList(1)))))
+
+
+###############################################################################
+# print-%
 
-get_cfglist =\
-  $(call peval,\
-    use File::Find;\
-    my ($$dir, @conf) = (GetAbsDirname($(call pquote,$1)), ());\
-    find(sub {\
-      push(@conf, $$File::Find::name) if\
-        /$2$$/s && (($$File::Find::name =~ tr/\///) > (($$dir =~ tr/\///) + $3));\
-    }, $$dir);\
-    return(join(q(\n), map(Quote($$_), sort({lc($$a) cmp lc($$b)} @conf)))))
+BUILD_PRINTVAR = $(call peval,DPrint(1,\
+  $(foreach var1,$(subst $(,), ,$(subst print-,,$(filter print-%,$(MAKECMDGOALS)))),\
+    $(foreach var2,$(call filterwcard,$(var1),$(filter-out BUILD_PRINTVAR,$(filter $(word 1,$(call substm,* ? [, ,$(var1)))%,$(.VARIABLES)))),\
+      $(call pquote,$(var2) = `$(call def2str,$($(var2)))').qq(\n),))); return(q()))
+
+print-%: ;@$(call IMAKER,PRINTVAR)
+
+$(call add_help,print-%,t,Print the value(s) of the given variable(s). Wildcards *, ? and [..] can be used in variable names.)
 
 
 ###############################################################################
 # Helps
 
 $(call add_help,CONFIGROOT,v,(string),Define the default configuration root directory.)
-$(call add_help,USE_OVERRIDE,v,([0|1]),Define whether the override.pm Buildrom.pl plugin is used.)
 $(call add_help,USE_PAGING,v,((0|rom|code[:[(1|2|3)]+]?)),Define the usage of On Demand Pagin (ODP). (E.g. 0,rom,code).)
 $(call add_help,USE_ROFS,v,([[dummy|]0..6][,[dummy|]0..6]*),Define the rofs sections in use. A comma separated list can be given of possible values. (E.g. 1,2,3).)
 $(call add_help,USE_ROMFILE,v,([0|1]),Define whether the \epoc32\rombuild\romfiles.txt is used. Files in romfiles are automatically moved to ROM, everything else in core is moved to ROFS1.)
 $(call add_help,USE_SYMGEN,v,([0|1]),Generate the rom symbol file. 0=Do not generate, 1=Generate)
 $(call add_help,USE_UDEB,v,([0|1|full]),Include the usage of the debug binary *.txt to define the list of binaries that are taken from udeb folder instead of the urel.)
-$(call add_help,USE_VERGEN,v,([0|1]),Use iMaker version info generation)
-$(call add_help,KEEPTEMP,v,([0|1]),Keep the buildrom.pl temp files (copied to the WORKDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby)
+$(call add_help,KEEPTEMP,v,([0|1]),Keep the buildrom.pl temp files (copied to the OUTDIR). E.g. tmp1.oby tmp2.oby..tmp9.oby)
 $(call add_help,LABEL,v,(string),A label to the NAME of the image)
 $(call add_help,NAME,v,(string),The name of the image)
 $(call add_help,TYPE,v,(rnd|prd|subcon),Defines the image type.)
-$(call add_help,WORKDIR,v,(string),The working directory for the image creation)
+$(call add_help,OUTDIR,v,(string),The output directory for the image creation.)
+$(call add_help,WORKDIR,v,(string),The working directory for the image creation. Deprecated, please use OUTDIR.)
 $(call add_help,PRODUCT_NAME,v,(string),Name of the product)
 $(call add_help,PRODUCT_MODEL,v,(string),The model of the product)
 $(call add_help,PRODUCT_REVISION,v,(string),The revision of the product.)
 $(call add_help,BLDROM_OPT,v,(string),The default buildrom.pl options)
 $(call add_help,BLDROPT,v,(string),For passing extra parameters (from command line) to the buildrom.pl)
 $(call add_help,BLDROBY,v,(string),For passing extra oby files (from command line) to the buildrom.pl)
-$(call add_help,SOS_VERSION,v,([0-9]+.[0-9]+),Symbian OS version number. The value is used in the version info generation (platform.txt).(see USE_VERGEN))
+$(call add_help,SOS_VERSION,v,([0-9]+.[0-9]+),Symbian OS version number. The value is used in the version info generation (platform.txt).)
 $(call add_help,COREPLAT_NAME,v,(string),Name of the core platform)
 $(call add_help,CORE_DIR,v,(string),The working directory, when creating core image)
 $(call add_help,CORE_NAME,v,(string),The name of the core image)
@@ -209,28 +200,20 @@
 $(call add_help,ROFS3_TIME,v,(string),The time defined to the rofs3 image.)
 $(call add_help,ROFS3_VERIBY,v,(string),The (generated) version iby file name for the rofs3 image. This file included the version text files and other version parameters.)
 $(call add_help,ROFS3_ROMVER,v,(string),The rofs3 ROM version string)
-$(call add_help,ROFS3_CUSTSWFILE,v,(string),The (generated) source file name for customersw.txt.)
-$(call add_help,ROFS3_CUSTSWINFO,v,(string),The content string for the customersw.txt.)
+$(call add_help,ROFS3_SWVERFILE,v,(string),The (generated) source file name for customersw.txt.)
+$(call add_help,ROFS3_SWVERINFO,v,(string),The content string for the customersw.txt.)
 $(call add_help,ROFS3_FWIDFILE,v,(string),The (generated) _rofs3_fwid.txt file name.)
 $(call add_help,ROFS3_FWIDINFO,v,(string),The content string for the fwid3.txt file.)
 $(call add_help,VARIANT_DIR,v,(string),Configure the directory where to included the customer variant content. By default all content under $(VARIANT_CPDIR) is included to the image as it exists in the folder.)
-$(call add_help,VARIANT_CONFML,v,(string),Configure what is the ConfigurationTool input confml file, when configuration tool is ran.)
-$(call add_help,VARIANT_CONFCP,v,(string),Configure which ConfigurationTool generated configurations dirs are copied to output.)
+$(call add_help,PRODUCT_VARDIR,v,(string),Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_DIR for details.)
+$(call add_help,TARGET_DEFAULT,v,(string),Configure actual target(s) for target default.)
 
 # Targets
 $(call add_help,version,t,Print the version information)
 $(call add_help,clean,t,Clean all target files.)
-$(call add_help,core,t,Create the core image (ROM,ROFS1))
-$(call add_help,rofs2,t,Create the rofs2 image)
-$(call add_help,rofs3,t,Create the rofs3 image)
 $(call add_help,variant,t,Create the variant image (rofs2,rofs3))
-$(call add_help,uda,t,Create the User Data area (uda) image.)
 $(call add_help,image,t,Create only the image file(s) (*.img))
-$(call add_help,core-image,t,Create the core image files (rom.img, rofs1.img))
-$(call add_help,rofs2-image,t,Create the rofs2 image file (rofs2.img))
-$(call add_help,rofs3-image,t,Create the rofs3 image file (rofs3.img))
-$(call add_help,variant-image,t,Create the variant image files (rofs3.img,rofs3.img))
-$(call add_help,uda-image,t,Create the User Data area (uda) image.)
+$(call add_help,variant-image,t,Create the variant image files (rofs2.img, rofs3.img))
 $(call add_help,toolinfo,t,Print info about the tool)
 $(call add_help,romsymbol,t,Create the rom symbol file)
 $(call add_help,all,t,Create all image sections and symbol files.)
@@ -240,7 +223,7 @@
 $(call add_help,step-%,t,\
 Generic target to execute any step inside the iMaker configuration. Any step (e.g. BUILD_*,CLEAN_*) can be executed with step-STEPNAME.\
 Example: step-ROFS2PRE executes the CLEAN_ROFS2PRE and BUILD_ROFS2PRE commands.)
-$(call add_help,print-%,t,Print the value of the given variable to the screen.)
+$(call add_help,default,t,Default target, uses variable TARGET_DEFAULT to get actual target(s), current default = $$(TARGET_DEFAULT).)
 
 $(call add_help,help,t,Print help on help targets.)
 $(call add_help,help-%,t,Print help on help items matching the pattern.)
--- a/imgtools/imaker/src/imaker_image.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_image.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -17,31 +17,36 @@
 
 
 USE_FEATVAR    = $(call select,$(word 1,$(getsbvrominc)),invalid,0,1)
-USE_FOTA       = 0
 USE_IMGCHK     = 0
-USE_IINTPRSIS  = 0
-USE_IREADIMG   = 0
-USE_IROMBLD    = 0
-USE_OVERRIDE   = 1
+USE_NOROMHDR   = 0
+USE_QTLOCLZTN  = 0
 USE_ROFS       = 1,2,3
 USE_ROFSFILE   = $(call iif,$(USE_PAGING),1,0)
 USE_ROMFILE    = 1
+USE_SMR        = 0
 USE_SYMGEN     = 0
 USE_UDEB       = 0
-USE_VERGEN     = 0
 
-$(foreach rofs,1 2 3 4 5 6,\
-  $(eval USE_ROFS$(rofs) = $$(if $$(findstring $(rofs),$$(filter-out :%,$$(subst :, :,$$(subst $$(,), ,$$(USE_ROFS))))),1,0)))
+# Temporary
+USE_BLRWORKDIR = 0
 
 #==============================================================================
 
 TYPE = rnd
 
-BUILD_INFOMK = image_conf_buildinfo.mk
-BUILD_NAMEMK = image_conf_naming.mk
+MAJOR_VERSION = 001
+MINOR_VERSION = 000
+SW_VERSION    = $(MAJOR_VERSION).$(MINOR_VERSION)
+SW_TYPEINFO   = $(call select,$(TYPE),rnd,RD)
+
+BUILD_INFOMK = $(call findfile,image_conf_buildinfo.mk,,1)
+BUILD_NAMEMK = $(call findfile,image_conf_naming.mk,,1)
 BUILD_YEAR   = $(YEAR)
+BUILD_MONTH  = $(MONTH)
 BUILD_WEEK   = $(WEEK)
-BUILD_NUMBER = xx
+BUILD_DAY    = $(DAY)
+BUILD_ID     = 001
+BUILD_NUMBER = 001
 
 COREPLAT_NAME    =
 COREPLAT_DIR     = $(CONFIGROOT)/$(COREPLAT_NAME)
@@ -49,24 +54,31 @@
 PLATFORM_NAME    = $(subst .,,$(COREPLAT_VERSION)$(S60_VERSION))
 PLATFORM_DIR     = $(CONFIGROOT)/$(PLATFORM_NAME)
 PRODUCT_MSTNAME  =
+PRODUCT_MSTDIR   = $(if $(PRODUCT_MSTNAME),$(PLATFORM_DIR)/$(PRODUCT_MSTNAME))
 PRODUCT_NAME     =
 PRODUCT_MANUFACT = Nokia
 PRODUCT_MODEL    = N00
 PRODUCT_TYPE     =
 PRODUCT_REVISION = 01
-PRODUCT_DIR      = $(PLATFORM_DIR)/$(if $(PRODUCT_MSTNAME),$(PRODUCT_MSTNAME)/)$(PRODUCT_NAME)
+PRODUCT_DIR      = $(if $(PRODUCT_NAME),$(PLATFORM_DIR)/$(if $(PRODUCT_MSTNAME),$(PRODUCT_MSTNAME)/)$(PRODUCT_NAME))
 
 FEATURE_VARIANT = $(PRODUCT_NAME)
 FEATVAR_IDIR    = $(call getrominc)
+FEATVAR_HRH     = $(call findfile,feature_settings.hrh)
 
-LABEL      =
-NAME       = $(PRODUCT_NAME)$(LABEL)
-WORKDIR    = $(if $(PRODUCT_NAME),$(E32ROMBLD)/$(PRODUCT_NAME),$(CURDIR))
-WORKPREFIX = $(WORKDIR)/$(NAME)
-WORKNAME   = $(WORKPREFIX)
+LABEL   =
+NAME    = $(or $(PRODUCT_NAME),imaker)$(LABEL)
+WORKDIR = $(if $(PRODUCT_NAME),$(E32ROMBLD)/$(PRODUCT_NAME),$(CURDIR))
 
-IMAGE_HBY  = <data_caging_paths_for_iby.hrh> <Variant\Header.iby>
-IMAGE_TYPE =
+IMAGE_TYPE    =
+IMAGE_ID      = $(or $(subst CORE,1,$(subst ROFS,,$(filter CORE ROFS%,$(IMAGE_TYPE)))),\
+  $(call lcase,$(call substr,1,1,$(filter EMMC MCARD UDA,$(IMAGE_TYPE)))))
+IMAGE_PREFIX  = $($(IMAGE_TYPE)_PREFIX)_$(call lcase,$(IMAGE_TYPE))
+IMAGE_HBY     = <data_caging_paths_for_iby.hrh> <variant/header.iby>
+IMAGE_VERSDIR = RESOURCE_FILES_DIR\versions
+
+IMAGE_ORIDEFILES =
+IMAGE_ORIDECONF  =
 
 TRACE_IDIR     = $(addsuffix /traces,$(FEATVAR_IDIR))
 TRACE_PREFIX   =
@@ -75,72 +87,63 @@
 
 OVERRIDE_CONF = OVERRIDE_REPLACE/WARN #OVERRIDE_REPLACE/ADD, OVERRIDE_REPLACE/SKIP, OVERRIDE_SKIP/ADD
 
-GENIBY_FILEPAT = *.dll *.exe *.agt *.csy *.fsy *.tsy *.drv *.nif *.pgn *.prt
+#GENIBY_FILEPAT = *.dll *.exe *.agt *.csy *.fsy *.tsy *.drv *.nif *.pgn *.prt
 
 ARM_VERSION = ARMV5
-SOS_VERSION = #9.3, 9.4, 9.5
-S60_VERSION = #3.2, 5.0
-
-ROFS_MAXSIZE = 0x10000000
-
-CPPFILE_LIST =
-MKFILE_LIST  = $(call findfile,$(BUILD_INFOMK) $(BUILD_NAMEMK) $(LANGPACK_SYSLANGMK),$(FEATVAR_IDIR)) | $(VARIANT_MK)
-
+SOS_VERSION = #9.5
+S60_VERSION =
 
-###############################################################################
-#
+CPPFILE_FILTER = FF_WDP_\S+|SYMBIAN_\S+
+CPPFILE_LIST   = $(if $(FEATURE_VARIANT),$(FEATVAR_HRH))
 
-SOS.IMAGE.STEPS =\
-  $(filter-out %POST,$(SOS.CORE.STEPS) $(SOS.VARIANT.STEPS))\
-  $(filter %POST,$(SOS.CORE.STEPS) $(SOS.VARIANT.STEPS))
-
-ALL.IMAGE.STEPS = $(SOS.IMAGE.STEPS)
-
-CLEAN_WORKAREA  = del | $(WORKDIR)/* | deldir | $(WORKDIR)/*
-ALL.CLEAN.STEPS = $(ALL.IMAGE.STEPS) WORKAREA
+TARGET_PRODUCT =
+TARGET_DEFAULT = all
 
 
 ###############################################################################
 # Internal macros and definitions
 
-getrominc = $(if $(call true,$(USE_FEATVAR)),$(getsbvrominc),$(CONFIGROOT) $(E32ROM))
+getrominc =\
+  $(if $(call true,$(USE_FEATVAR)),$(getsbvrominc),$(if $(word 5,$(__i_getrominc)),$(call restwords,5,$(__i_getrominc))\
+    ,$(PRODUCT_DIR) $(PRODUCT_MSTDIR) $(CONFIGROOT)) $(E32ROM) $(E32ROMINC) $(E32INC)/oem $(E32INC))
+
+#    ,$(PRODUCT_DIR) $(PRODUCT_MSTDIR) $(CONFIGROOT)) $(E32INC)/config $(E32ROM) $(E32ROMINC) $(E32INC)/internal $(E32INC))
 
 getsbvrominc =\
-  $(if $(call equal,$(__i_featvar),$(FEATURE_VARIANT)),,$(eval __i_featvar := $(FEATURE_VARIANT))\
-    $(eval __i_getrominc := $(shell $(PERL) -x $(IMAKER_TOOL) --incdir $(__i_featvar))))$(__i_getrominc)
+  $(if $(and $(FEATURE_VARIANT),$(call equal,$(__i_featvar),$(FEATURE_VARIANT))),,$(eval __i_featvar := $(FEATURE_VARIANT))\
+    $(eval __i_getrominc := $(if $(__i_featvar),$(shell $(PERL) -x $(IMAKER_TOOL) --incdir $(__i_featvar)),invalid)))$(__i_getrominc)
 
-includeiby = $(call peval,\
+includeiby = $(if $(strip $1),$(call peval,\
   my @files = ();\
   while ($(call pquote,$1) =~ /(?:([1-6]):)?(?:<(.+?)>|"+(.+?)"+|(\S+))/g) {\
     my $$rom = (defined($$1) ? $$1 : q());\
-    push(@files, ($$rom ? q(ROM_IMAGE[).$$rom.q(] {\\\n) : q()) . q(\#include ).\
-      (defined($$2) ? qq(<$$2>) : q(").GetRelFname(defined($$3) ? $$3 : $$4, $(call pquote,$2)).q(")) . ($$rom ? q(\\\n}) : q()))\
+    push(@files, ($$rom ? q(ROM_IMAGE[).$$rom.q(] {\n) : q()) . q(\#include ).\
+      (defined($$2) ? qq(<$$2>) : q(").GetAbsFname(defined($$3) ? $$3 : $$4).q(")) . ($$rom ? q(\n}) : q()))\
   }\
-  return(join(q(\\\n), @files)))
+  return(join(q(), map(q(\n) . $$_, @files)))))
 
 define BLDROM_HDRINFO
-  // Generated master oby for $($(IMAGE_TYPE)_TITLE) image creation
+  // Generated master oby for $($1_TITLE) image creation
   //
-  // Filename: $($(IMAGE_TYPE)_MSTOBY)
-  // Work dir: $(call peval,GetAbsDirname(q(.)))
-  // Command : $(BLDROM_CMD)
+  // Filename: $($1_MSTOBY)
+  // Command : $(call BLDROM_CMD,$1)
 endef
 
 define BLDROM_PLUGINFO
-  // Buildrom plugins
-  //
-  $(call iif,$(USE_OVERRIDE),
-    externaltool=override:$($(IMAGE_TYPE)_PLUGINLOG);$(if $(filter debug 127,$(VERBOSE)),debug,0)
-    $(OVERRIDE_CONF))
-  externaltool=obyparse:$($(IMAGE_TYPE)_PLUGINLOG);$(if $(filter debug 127,$(VERBOSE)),debug,0)
-  $(call iif,$(call select,$(IMAGE_TYPE),CORE,$(USE_ROFS1)),
+  /* Buildrom plugins
+  */
+  externaltool=override:-i$1;-l$($1_PLUGINLOG)$(if $(filter debug 127,$(VERBOSE)),;-ddebug)
+  $(OVERRIDE_CONF)
+  externaltool=obyparse:-i$1;-l$($1_PLUGINLOG);-w$($1_DIR)$(if $(filter debug 127,$(VERBOSE)),;-ddebug);-f$(FEATURE_VARIANT)
+  externaltool=stubsischeck:-i$1;-l$($1_PLUGINLOG)$(if $(filter debug 127,$(VERBOSE)),;-ddebug)
+  $(call iif,$(if $(filter CORE,$1),$(USE_ROFS1)),
     $(call iif,$(USE_ROMFILE),
       OBYPARSE_ROM $(CORE_ROMFILE))
     $(call iif,$(USE_ROFSFILE),
       OBYPARSE_ROFS1 $(CORE_ROFSFILE))
   )
   $(call iif,$(USE_UDEB),
-    OBYPARSE_UDEB $(call select,$(USE_UDEB),full,*,$($(IMAGE_TYPE)_UDEBFILE)))
+    OBYPARSE_UDEB $(call select,$(USE_UDEB),full,*,$($1_UDEBFILE)))
 endef
 
 getgenfiles = $(if $1,\
@@ -148,54 +151,60 @@
   $(if $(__i_cmd),"$(call getelem,2,$1)")\
   $(call getgenfiles,$(call restelems,$(if $(filter geniby%,$(__i_cmd)),7,$(if $(filter write%,$(__i_cmd)),4,2)),$1)))
 
-# TEMPORARY
-_buildoby = $(if $1,\
-  $(eval __i_elem1 := $(call getelem,1,$1))\
-  $(if $(filter geniby%,$(call lcase,$(__i_elem1))),$1,\
-    geniby | $(__i_elem1) | $(call getelem,2,$1) | $(call getelem,3,$1) | \#include "%3" | end |\
-    $(call _buildoby,$(call restelems,4,$1))))
-# TEMPORARY
-
 #==============================================================================
 
-BLDROM_CMD = $(BLDROM_TOOL) $(filter-out --D% -U%,$(BLR.$(IMAGE_TYPE).OPT)) $(BLR.$(IMAGE_TYPE).IDIR) $($(IMAGE_TYPE)_MSTOBY)
+BLDROM_CMD = $(BLDROM_TOOL)\
+  $(filter-out --D% -U% $(filter-out $(BLDROM_CMDDOPT),$(filter -D%,$(BLR.$1.OPT))),$(BLR.$1.OPT))\
+  $(BLR.$1.IDIR) $(subst \,/,$($1_MSTOBY))
+
+BLDROM_CMDDOPT = -DFEATUREVARIANT=% -D_FULL_DEBUG -D_PLAT=%
 
 CLEAN_BLDROM =\
-  del | "$($(IMAGE_TYPE)_PREFIX).*" "$($(IMAGE_TYPE)_DIR)/tmp?.oby" "$($(IMAGE_TYPE)_DIR)/ecom*.s??" "$($(IMAGE_TYPE)_PLUGINLOG)" |\
-  $(BLR.$(IMAGE_TYPE).CLEAN)
+  del | $(foreach file,dir *.img *.inc *.log *.oby *.symbol,"$($1_PREFIX).$(file)")\
+    $(foreach file,ecom*.s?? features.dat loglinux.oby logwin.oby tmp?.oby,"$($1_DIR)/$(file)")\
+    "$($1_PLUGINLOG)" |\
+  $(BLR.$1.CLEAN)
 
 BUILD_BLDROM =\
-  $(if $(BLR.$(IMAGE_TYPE).BUILD),$(BLR.$(IMAGE_TYPE).BUILD),\
-    echo-q | Creating $($(IMAGE_TYPE)_TITLE) SOS image |\
-    cd     | $($(IMAGE_TYPE)_DIR) |\
-    cmd    | $(strip $(BLDROM_CMD)) | $(BLDROM_PARSE) |\
-    copy   | tmp1.oby | $($(IMAGE_TYPE)_PREFIX).tmp1.oby |\
-    $(call iif,$(KEEPTEMP),,del | "tmp?.oby" "$($(IMAGE_TYPE)_PREFIX).dummy*" |)\
-    $(BLR.$(IMAGE_TYPE).POST))
+  $(or $(BLR.$1.BUILD),\
+    echo-q | Creating $($1_TITLE) SOS $(if $(filter -noimage,$(BLR.$1.OPT)),oby,image) |\
+    $(call iif,$(USE_BLRWORKDIR),,cd | "$($1_DIR)" |)\
+    cmd    | $(strip $(call BLDROM_CMD,$1)) | $(BLDROM_PARSE) |\
+    move   | "$($1_DIR)/tmp1.oby" | $($1_PREFIX).tmp1.oby |\
+    $(call iif,$(KEEPTEMP),,del | "$($1_DIR)/tmp?.oby" "$($1_PREFIX).dummy*" |)\
+    $(BLR.$1.POST))
 
-CLEAN_MAKSYMROFS = del | $($(IMAGE_TYPE)_SYM)
-BUILD_MAKSYMROFS =\
-  echo-q | Creating $($(IMAGE_TYPE)_TITLE) symbol file |\
-  cmd    | $(MAKSYMROFS_TOOL) $(call pathconv,$($(IMAGE_TYPE)_LOG) $($(IMAGE_TYPE)_SYM))
+
+###############################################################################
+# Steps
+
+IMAGE_STEPS = core $(VARIANT_STEPS)
+
+VARIANT_STEPS = $(call iif,$(USE_ROFS2),langpack_$(or $(TARGETID),01))\
+  $(foreach rofs,3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),rofs$(rofs)))
 
 
 ###############################################################################
 # Targets
 
-.PHONY:\
-  all flash flash-all image image-all\
-  i2file
+.PHONY: default all flash image variant #i2file variant-i2file
+
+default default-%:\
+  ;@$(call IMAKER,$$(if $$(PRODUCT_NAME),,$$(TARGET_PRODUCT)) $$(TARGET_DEFAULT))
 
-all flash-all image-all: USE_SYMGEN = 1
-all flash flash-all    : ;@$(call IMAKER,$$(ALL.IMAGE.STEPS))
+all  : ;@$(call IMAKER,flash-all)
+image: ;@$(call IMAKER,flash-image)
+
+flash flash-% image-%: ;@$(call IMAKER,$$(IMAGE_STEPS))
 
-image image-all: ;@$(call IMAKER,$$(SOS.IMAGE.STEPS))
+variant variant_% variant-%: ;@$(call IMAKER,$$(VARIANT_STEPS))
 
-i2file: ;@$(call IMAKER,$(call ucase,$@))
+#i2file        : ;@$(call IMAKER,$(call ucase,$@))
+#variant-i2file: ;@$(call IMAKER,VARIANTI2F)
 
 #==============================================================================
 
-include $(addprefix $(IMAKER_DIR)/imaker_,$(addsuffix .mk,core odp rofs2 rofs3 rofs4 uda variant))
+$(call includechk,$(addprefix $(IMAKER_DIR)/imaker_,fat.mk odp.mk rofs.mk smr.mk core.mk variant.mk))
 
 
 # END OF IMAKER_IMAGE.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_memcard.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker Memory MMC/SD card image configuration
+#
+
+
+
+###############################################################################
+#  __  __           ___             _
+# |  \/  |___ _ __ / __|__ _ _ _ __| |
+# | |\/| / -_) '  \ (__/ _` | '_/ _` |
+# |_|  |_\___|_|_|_\___\__,_|_| \__,_|
+#
+
+MCARD_TITLE       = MemCard
+
+MCARD_DRIVE       = F
+MCARD_FATTYPE     = 32# FAT32
+MCARD_SIZE        = 2097152# kB (= 2 GB)
+MCARD_CLUSTERSIZE = 16# kB
+MCARD_FATTABLE    = 2
+
+MCARD_SWVERFILE   = #$(MCARD_DATADIR)/Resource/Versions/User Content Package_Mass_Memory.txt
+MCARD_SWVERINFO   = # Don't generate sw version file
+MCARD_EXCLFILE    = # Don't generate exclude list
+
+
+# END OF IMAKER_MEMCARD.MK
--- a/imgtools/imaker/src/imaker_minienv.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_minienv.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,58 +23,156 @@
 # |_|  |_|_|_||_|_|___|_||_\_/
 #
 
-MINIENV_ZIP     = $(WORKPREFIX)_minienv.zip
-MINIENV_EXCLBIN = *.axf *.bin *.cmt *.fpsx *.hex *.out *.pmd *.ppu *.zip
-MINIENV_INCLBIN = *.axf *.bin *.fpsx *.hex *.out
-MINIENV_SOSDIR  = $(WORKDIR)
+MINIENV_ZIP      = $(EPOC_ROOT)/$(MINIENV_MFBSNAME)_$(MINIENV_MFBVER).jar
+MINIENV_EXCLBIN  = *.axf *.bin *.cmt *.fpsx *.hex *.out *.pmd *.ppu *.zip
+MINIENV_INCLBIN  = *.axf *.bin *.fpsx *.hex *.out
+MINIENV_SOSDIR   = $(OUTDIR)
+
+MINIENV_MFFILE   = $(EPOC_ROOT)/META-INF/MANIFEST.MF
+MINIENV_MFTMP    = $(OUTTMPDIR)/META-INF/MANIFEST.MF
+
+MINIENV_MFBNAME  = Minienv for $(PRODUCT_MODEL)
+MINIENV_MFBSNAME = com.nokia.tools.griffin.minienv.$(PRODUCT_MODEL)
+MINIENV_MFBVER   = $(MAJOR_VERSION).$(MINOR_VERSION).0
+MINIENV_MFPATH   = epoc32/tools
+MINIENV_MFSWVER  = $(word 1,$(subst ., ,$(MINIENV_MFBVER))).*
+MINIENV_MFCFGFLT = (&(product_type=$(PRODUCT_TYPE))(sw_version=$(MINIENV_MFSWVER)))
+#MINIENV_MFCFGFLT = (&(product_type=$(PRODUCT_TYPE))(sw_version=$(MAJOR_VERSION).$(MINOR_VERSION)))
 
-CLEAN_MINIENV = del | $(MINIENV_ZIP)
-BUILD_MINIENV =\
-  echo-q | Creating minimal flash image creation environment $(MINIENV_ZIP) |\
-  $(MINIENV_TOOL) | $(MINIENV_CONF) |\
-  zip-q  | $(MINIENV_ZIP) | __find__ |
+define MINIENV_MFINFO
+  Manifest-Version: 1.0
+  Bundle-ManifestVersion: 2.0
+  Bundle-Name: $(MINIENV_MFBNAME)
+  Bundle-SymbolicName: $(MINIENV_MFBSNAME);singleton:=true
+  Bundle-Version: $(MINIENV_MFBVER)
+  Griffin-ExportDirectory: $(MINIENV_MFPATH)
+  Griffin-ConfigurationFilter: $(MINIENV_MFCFGFLT)
+
+  Name: epoc32/tools/imaker.cmd
+  Require-Bundle: com.nokia.tools.griffin.theme
+endef
+
+MINIENV_META = find-af | $(MINIENV_MFTMP) | $(MINIENV_MFFILE) |
+
+#==============================================================================
 
 MINIENV_IMAKER =\
-  find   | $(E32TOOLS)   | imaker.cmd localise.pm localise_all_resources.pm obyparse.pm override.pm plugincommon.pm | |\
-  find-a | $(IMAKER_DIR) | * |
+  find-a  | $(E32TOOLS)   | imaker imaker.cmd ||\
+  find-a  | $(IMAKER_DIR) | * ||\
+  find-ar | $(CONFIGROOT)/assets/image | * |
 
-MINIENV_TOOL =\
-  $(MINIENV_IMAKER) |\
-  find-a | $(ITOOL_DIR) | * | |\
+MINIENV_ITOOL =\
+  find-a | $(ITOOL_DIR) | *.exe *.pl *.py imgcheck.* | *upct*
+
+MINIENV_BLDROM =\
   find-a | $(E32TOOLS) |\
-    cli.cmd s60ibymacros.pm\
-    armutl.pm bpabiutl.pm buildrom.* checksource.pm configpaging.pm datadriveimage.pm e32plat.pm\
-    e32variant.pm externaltools.pm featurevariantmap.pm featurevariantparser.pm genutl.pm maksym.*\
-    maksymrofs.* modload.pm pathutl.pm rofsbuild.exe rombuild.exe spitool.* uidcrc.exe winutl.pm\
-    *.bsf | gcc*.bsf |\
-  find-a  | $(E32TOOLS)/variant | * | |\
-  find-ar | $(E32GCCBIN)        | * | |\
-  find-ar | $(CONFT_TOOLDIR)    | * |
+    armutl.pm bpabiutl.pm buildrom.* checksource.pm configpaging.* datadriveimage.pm e32plat.pm e32variant.pm\
+    externaltools.pm flexmodload.pm genutl.pm maksym.* maksymrofs.* modload.pm pathutl.pm rofsbuild.exe rombuild.exe\
+    romosvariant.pm romutl.pm spitool.* uidcrc.exe winutl.pm feature* genericparser.pm rvct_*2set.pm writer.pm mingwm10.dll ||\
+  find-ar | $(E32TOOLS)/build/lib/XML | * |
+
+MINIENV_CONE = find-a | $(E32TOOLS) | cone cone.cmd || find-ar | $(CONE_TOOLDIR) | * |
+
+MINIENV_CPP = find-a | $(E32GCCBIN) | cpp.exe cygwin1.dll |
+
+MINIENV_TOOL1 =\
+  $(MINIENV_ITOOL)  |\
+  $(MINIENV_BLDROM) |\
+  $(MINIENV_CONE)   |\
+  $(MINIENV_CPP)    |\
+  find-a | $(E32TOOLS) |\
+    featuredatabase.dtd s60ibymacros.pm\
+    bmconv.exe dumpsis.exe elf2e32.exe interpretsis.exe mifconv.exe petran.exe svgtbinencode.exe\
+    xerces-c_2_*.dll ||\
+  find-a | $(E32TOOLS)/variant | * ||
+
+MINIENV_TOOL2 =\
+  find-ar | $(dir $(WIDGET_TOOL)) $(WIDGET_HSTOOLDIR) | * ||\
+  find-a  | $(E32DATAZ)/private/10282f06 $(EPOC32)/winscw/c/private/10282f06 | Widget_lproj.xml ||
+
+MINIENV_TOOL = $(foreach tool,$(sort $(filter $(addprefix MINIENV_TOOL,0 1 2 3 4 5 6 7 8 9),$(.VARIABLES))),$($(tool)) |)
 
-MINIENV_CONF =\
-  find-a    | $(E32INC)              | *.hrh | |\
-  find-ar   | $(E32INCCFG)           | * | |\
-  find-ar   | $(E32INC)/oem          | * | |\
-  find-ar   | $(E32INC)/variant      | * | |\
-  find-a    | $(E32ROM)              | * | |\
-  find-ar   | $(E32ROMCFG)           | * | $(MINIENV_EXCLBIN) |\
-  find-ar   | $(E32ROM)/configpaging | * | |\
-  find-ar   | $(E32ROMINC)           | * | |\
-  find-ar   | $(E32ROM)/variant      | * | |\
-  find-ar   | $(OST_DICTDIR)         | $(OST_DICTPAT) | |\
-  find-ar   | $(EPOC32)/data/Z/resource/plugins | * | |\
-  find-a    | $(COREPLAT_DIR) | $(MINIENV_INCLBIN) | |\
-  find-ar   | $(PRODUCT_DIR)  | $(MINIENV_INCLBIN) | |\
-  sosfind-a | $(MINIENV_SOSDIR) | *.tmp1.oby | *.rom.oby *.rofs?.oby | *_bldromplugin.log
+MINIENV_CONF1 =\
+  find-a  | $(E32INC)              | *.hrh ||\
+  find-ar | $(E32INCCFG)           | *     ||\
+  find-ar | $(E32ROM)/configpaging | *     ||\
+  find-a  | $(sort $(dir $(CORE_FEAXML)))  | $(notdir $(CORE_FEAXML)) ||\
+  find-a  | $(CONFIGROOT)          | *.mk  ||\
+  find-a  | $(PLATFORM_DIR)        | *.mk mem*.hrh ||\
+  find-ar | $(PRODUCT_DIR)         | *.mk mem*.hrh ||\
+  find-a  | $(E32INC)/mw                                      | ThirdPartyBitmap.pal       ||\
+  find-a  | $(E32ROMINC)/customervariant/mw                   | Certificates_Operator.iby  ||\
+  find-a  | $(E32DATAZ)/private/101f72a6                      | *                          ||\
+  find-a  | $(E32DATAZ)/private/10202be9                      | cccccc00_empty.cre         ||\
+  find-a  | $(E32DATAZ)/private/200009F3                      | defaultimportfile.mde      ||\
+  find-a  | $(E32DATAZ)/private/20019119                      | config.xml                 ||\
+  find-a  | $(E32DATAZ)/resource                              | swicertstore*.dat          ||\
+  find-a  | $(E32DATAZ)/system/data                           | SkinExclusions.ini         ||\
+  find-ar | $(E32DATAZ)/system/data/midp2/security/trustroots | *                          ||\
+  find-a  | $(E32DATAZ)/system/sounds/audiothemes             | at_nokia.xml               ||\
+  find-a  | $(EPOC32)/release/armv5/urel                      | R1_Mobile_4_0_Operator.cfg ||\
+  find-a  | $(EPOC32)/release/armv5/urel/z/private/100059C9   | ScriptInit.txt             ||\
+  find-a  | $(EPOC_ROOT)/ext/app/firsttimeuse/StartupSettings3/tools | APConf.txt          ||\
+  find-af | $(SISINST_HALHDA) |||\
+  find-ar | $(CONFIGROOT) | * | *.pmd isa.out dsp.hex *.cmt fota_updapp.bin *.axf DCT_ISA*.zip |
+
+MINIENV_CONF2 =\
+  sosfind-a | $(MINIENV_SOSDIR) | *.rom.oby *.rofs?.oby *.uda.oby *.emmc.oby *.mcard.oby | *_bldromplugin.log
+
+MINIENV_CONF3 =\
+  find-ar | $(OST_DICTDIR)  | $(OST_DICTPAT)     ||\
+  find-a  | $(COREPLAT_DIR) | $(MINIENV_INCLBIN) ||\
+  find-ar | $(PRODUCT_DIR)  | $(MINIENV_INCLBIN) ||
+
+#  find-a  | $(CONFIGROOT)   | *.confml ||\
+#  find-ar | $(CONFIGROOT)/assets | *   ||\
+#  find-a  | $(PLATFORM_DIR) | *.confml ||\
+#  find-ar | $(PRODUCT_DIR)  | *.confml ||\
+
+MINIENV_CONF = $(foreach conf,$(sort $(filter $(addprefix MINIENV_CONF,0 1 2 3 4 5 6 7 8 9),$(.VARIABLES))),$($(conf)) |)
+
+#==============================================================================
+
+CLEAN_MINIENV = $(if $(MINIENV_META),$(CLEAN_MINIENVMETA) |) del | "$(MINIENV_ZIP)"
+BUILD_MINIENV =\
+  $(if $(MINIENV_META),$(BUILD_MINIENVMETA) |)\
+  echo-q | Creating minimal flash image creation environment |\
+  find ||||\
+  $(MINIENV_META)   |\
+  $(MINIENV_IMAKER) |\
+  $(MINIENV_TOOL)   |\
+  $(MINIENV_CONF)   |\
+  zip$(if $(filter debug 127,$(VERBOSE)),,-q) | "$(MINIENV_ZIP)" | __find__ |
+
+REPORT_MINIENV =\
+  Minienv input SOS dir | $(MINIENV_SOSDIR) | d |\
+  Minienv archive       | $(MINIENV_ZIP)    | f
+
+CLEAN_MINIENVMETA = del | "$(MINIENV_MFTMP)"
+BUILD_MINIENVMETA =\
+  echo-q | Creating manifest file |\
+  write  | "$(MINIENV_MFTMP)" | $(call def2str,$(MINIENV_MFINFO))\n
 
 
 ###############################################################################
 # Targets
 
-.PHONY:\
-  minienv
+.PHONY: minienv minienv-conf minienv-imaker minienv-tool core-minienv
+
+minienv-conf: MINIENV_IMAKER =
+minienv-conf: MINIENV_TOOL   =
+
+minienv-imaker: MINIENV_TOOL =
+minienv-imaker: minienv-tool ;
 
-minienv: ;@$(call IMAKER,$(call ucase,$@))
+minienv-itool: MINIENV_TOOL = $(MINIENV_ITOOL)
+minienv-itool: minienv-tool ;
+
+minienv-tool: MINIENV_META =
+minienv-tool: MINIENV_CONF =
+
+minienv: MINIENV_CONF3 =
+minienv minienv-conf minienv-tool core-minienv: ;@$(call IMAKER,MINIENV)
 
 
 # END OF IMAKER_MINIENV.MK
--- a/imgtools/imaker/src/imaker_odp.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_odp.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -18,46 +18,71 @@
 
 USE_PAGING = 0
 
-USE_PAGEDROM  = $(if $(filter rom code code:%,$(call lcase,$(USE_PAGING))),1,0)
+USE_PAGEDROM  = $(if $(or $(call true,$(USE_PAGEDCODE)$(USE_PAGEDDATA)),$(filter rom,$(call lcase,$(USE_PAGING)))),1,0)
 USE_PAGEDCODE = $(call _getcodedp)
+USE_PAGEDDATA = $(if $(filter data,$(call lcase,$(USE_PAGING))),1,0)
 
 ODP_CONFDIR  = $(E32ROM)/configpaging
-ODP_PAGEFILE = configpaging.cfg
+ODP_PAGEFILE = $(call iif,$(USE_PAGEDDATA),configpaging_wdp.cfg,configpaging.cfg)
 ODP_CODECOMP = bytepair
 
-#             Min    Max    Young/Old   NAND page read  NAND page read
-#             live   live   page ratio  delay           CPU overhead
-#             pages  pages              (microseconds)  (microseconds)
-ODP_ROMCONF = 1024   2048     3           0               0
+ODP_ROMCONF =\
+  $(or $(SYMBIAN_ODP_NUMBER_OF_MIN_LIVE_PAGES),1024)\
+  $(or $(SYMBIAN_ODP_NUMBER_OF_MAX_LIVE_PAGES),2048)\
+  $(or $(SYMBIAN_ODP_YOUNG_OLD_PAGE_RATIO),3)\
+  $(or $(SYMBIAN_ODP_NAND_PAGE_READ_DELAY),0)\
+  $(or $(SYMBIAN_ODP_NAND_PAGE_NAND_PAGE_READ_CPU_OVERHEAD),0)
 
-# Section for Rombuild phase on all Demand Paging builds
+# Section for Rombuild on all Demand Paging builds
 #
 define ODP_ROMINFO
+  $(call iif,$(USE_PAGEDDATA),
+    #if defined(FF_WDP_EMMC) && defined(FF_WDP_NAND)
+      #error ERROR: Both of the flags FF_WDP_EMMC and FF_WDP_NAND are defined!
+    #elif !defined(FF_WDP_EMMC) && !defined(FF_WDP_NAND)
+      #error ERROR: One of the flags FF_WDP_EMMC or FF_WDP_NAND should be defined!
+    #endif
+    ,
+    #undef FF_WDP_EMMC
+    #undef FF_WDP_NAND
+  )
   $(call iif,$(USE_PAGEDROM),
     #define PAGED_ROM
     ROMBUILD_OPTION -geninc
-    demandpagingconfig $(strip $(ODP_ROMCONF))
-    pagingoverride defaultpaged
     pagedrom
     compress
+    demandpagingconfig $(strip $(ODP_ROMCONF))
+    codepagingoverride defaultpaged
+    $(call iif,$(USE_PAGEDDATA),
+      datapagingoverride defaultunpaged
+      ,
+      datapagingoverride nopaging)
   )
   $(if $(filter 1,$(USE_PAGEDCODE)),
     #define PAGED_CODE
-    pagingpolicy defaultpaged
+    codepagingpolicy defaultpaged
+    $(call iif,$(USE_PAGEDDATA),
+      datapagingpolicy defaultunpaged
+      ,
+      datapagingpolicy nopaging)
   )
   $(if $(CORE_PAGEFILE),$(call iif,$(USE_PAGEDROM)$(filter 1,$(USE_PAGEDCODE)),
-    externaltool=configpaging:$(CORE_PAGEFILE))
-  )
+    externaltool=configpaging:$(CORE_PAGEFILE)))
 endef
 
-# Section for Rofsbuild phase on Code DP enabled builds
+# Section for Rofsbuild on Code/Data DP enabled builds
 #
-define ODP_CODEINFO
-  $(if $(filter $1,$(USE_PAGEDCODE)),
+define ODP_ROFSINFO
+  $(if $(filter $(IMAGE_ID),$(USE_PAGEDCODE)),
     #define PAGED_CODE
-    $(if $(ROFS$1_PAGEFILE),
-      externaltool=configpaging:$(ROFS$1_PAGEFILE))
-    pagingoverride defaultpaged
+    codepagingoverride defaultpaged
+    $(call iif,$(USE_PAGEDDATA),
+      datapagingoverride defaultunpaged
+      ,
+      datapagingoverride nopaging
+    )
+    $(if $(ROFS$(IMAGE_ID)_PAGEFILE),
+      externaltool=configpaging:$(ROFS$(IMAGE_ID)_PAGEFILE))
   )
 endef
 
@@ -66,10 +91,11 @@
 # Internal stuff
 
 _getcodedp = $(or $(strip\
-  $(if $(filter code code:,$(eval __i_paging := $(call lcase,$(call sstrip,$(USE_PAGING))))$(__i_paging)),\
-    $(foreach rofs,1 2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),$(rofs))),\
-    $(if $(filter code:%,$(__i_paging)),\
-      $(foreach rofs,1 2 3 4 5 6,$(findstring $(rofs),$(__i_paging)))))),0)
+  $(eval __i_paging := $(call lcase,$(USE_PAGING)))\
+  $(foreach rofs,$(if $(filter code:%,$(__i_paging)),\
+    $(foreach rofs,1 2 3 4 5 6,$(findstring $(rofs),$(__i_paging))),\
+    $(if $(or $(call true,$(USE_PAGEDDATA)),$(filter code,$(__i_paging))),1 2 3 4 5 6)),\
+      $(call iif,$(USE_ROFS$(rofs)),$(rofs)))),0)
 
 
 # END OF IMAKER_ODP.MK
--- a/imgtools/imaker/src/imaker_public.mk	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,56 +0,0 @@
-#
-# 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 "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: iMaker public interface
-#
-
-
-
-#==============================================================================
-# Product variant variables
-
-FEATVARIANT_CONFML = $(wildcard $(PRODUCT_DIR)/$(FEATURE_VARIANT).confml)
-
-PRODVARIANT_DIR    = $(PRODUCT_DIR)
-PRODVARIANT_CONFML = $(or $(FEATVARIANT_CONFML),$(PRODUCT_DIR)/$(PRODUCT_NAME).confml)
-PRODVARIANT_CONFCP =\
-  $(PLATFORM_NAME) $(PRODUCT_MSTNAME) $(PRODUCT_NAME)\
-  $(if $(FEATVARIANT_CONFML),$(call select,$(PRODUCT_NAME),$(FEATURE_VARIANT),,$(FEATURE_VARIANT)))
-
-#==============================================================================
-# Customer variant variables
-# Root for customer variant (custvariant) package settings
-
-CUSTVARIANT_ROOT   = $(PRODUCT_DIR)/customer
-CUSTVARIANT_PREFIX = custvariant_
-CUSTVARIANT_NAME   =
-CUSTVARIANT_ID     =
-CUSTVARIANT_DIR    = $(CUSTVARIANT_ROOT)/$(CUSTVARIANT_NAME)
-CUSTVARIANT_COMPLP =
-
-#==============================================================================
-# The Target specific override settings
-
-$(CUSTVARIANT_PREFIX)%: CUSTVARIANT_NAME = $(TARGETNAME)
-$(CUSTVARIANT_PREFIX)%: CUSTVARIANT_ID   = $(TARGETID)
-$(CUSTVARIANT_PREFIX)%: VARIANT_DIR      = $(CUSTVARIANT_DIR)
-$(CUSTVARIANT_PREFIX)%: variantrofs3_$(TARGETID)$(TARGETEXT) ;
-
-#==============================================================================
-# Helps
-
-$(call add_help,PRODVARIANT_DIR,v,(string),Overrides the VARIANT_DIR for product variant, see the instructions of VARIANT_CONFCP for details.)
-$(call add_help,PRODVARIANT_CONFML,v,(string),Overrides the VARIANT_CONFML for product variant, see the instructions of VARIANT_CONFML for details.)
-$(call add_help,PRODVARIANT_CONFCP,v,(string),Overrides the VARIANT_CONFCP for product variant, see the instructions of VARIANT_CONFCP for details.)
-$(call add_help,CUSTVARIANT_DIR,v,(string),Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_CONFCP for details.)
-$(call add_help,CUSTVARIANT_COMPLP,v,(string),Compatible language variant.)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_rofs.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,261 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker generic ROFS image configuration
+#
+
+
+
+###############################################################################
+#  ___  ___  ___ ___
+# | _ \/ _ \| __/ __|
+# |   / (_) | _|\__ \
+# |_|_\\___/|_| |___/
+#
+
+ROFS_MAXSIZE = 0x10000000
+
+define ROFS_EVAL
+USE_$1        = $$(call userofs,$3)
+
+$1_TITLE      = $1
+$1_DRIVE      = Z
+$1_ROOT       = $$(OUTDIR)/$2
+$1_DIR        = $$($1_ROOT)
+$1_NAME       = $$(NAME)
+$1_PREFIX     = $$($1_DIR)/$$($1_NAME)
+$1_IDIR       =
+$1_HBY        =
+$1_OBY        =
+$1_OPT        =
+$1_MAXSIZE    = $$(ROFS_MAXSIZE)
+$1_MSTOBY     = $$($1_PREFIX)_$2_master.oby
+$1_HEADER     =
+$1_INLINE     =
+$1_FOOTER     =
+$1_TIME       = $$(DAY)/$$(MONTH)/$$(YEAR)
+
+$1_DEFHRH     = $$($1_PREFIX)_$2_define.hrh
+$1_FEAXML     =
+$1_FEAIBY     =
+
+$1_ROMVER     = $$(CORE_ROMVER)
+$1_ID         = $$(if $$(filter $2_%,$$(TARGETNAME)),$$(TARGETID1),00)
+$1_REVISION   = 01
+$1_VERSION    = $$(CORE_VERSION).$$($1_ID).$$($1_REVISION)
+$1_SWVERFILE  = $$($1_PREFIX)_$2_sw.txt
+$1_SWVERTGT   = $$(IMAGE_VERSDIR)\$2sw.txt
+$1_SWVERINFO  = $$($1_VERSION)\n$$(BUILD_YEAR)-$$(BUILD_MONTH)-$$(BUILD_DAY)
+$1_FWIDFILE   = $$($1_PREFIX)_$2_fwid.txt
+$1_FWID       = $2
+$1_FWIDVER    = $$($1_VERSION)$$(SW_TYPEINFO)
+$1_FWIDINFO   = id=$$($1_FWID)\nversion=$$($1_FWIDVER)\n
+
+$1_IMG        = $$($1_PREFIX).$2.img
+$1_LOG        = $$($1_PREFIX).$2.log
+$1_OUTOBY     = $$($1_PREFIX).$2.oby
+$1_SYM        = $$($1_PREFIX).$2.symbol
+
+$1_PLUGINLOG  = $$($1_PREFIX)_$2_bldromplugin.log
+$1_PAGEFILE   = $$(ODP_PAGEFILE)
+$1_UDEBFILE   = $$(TRACE_UDEBFILE)
+
+$1_OBYGEN     =
+$1_ORIDEIBY   = $$($1_PREFIX)_$2_override.iby
+$1_ORIDEFILES = $$(IMAGE_ORIDEFILES)
+$1_ORIDECONF  = $$(IMAGE_ORIDECONF)
+
+$1_ICHKLOG    = $$($1_PREFIX)_$2_imgcheck.log
+$1_ICHKOPT    = $$(IMGCHK_OPT)
+$1_ICHKIMG    = $$($1_IMG)
+
+$1_I2FDIR     = $$($1_DIR)/img2file
+
+$1_CONECONF   = $$(PRODUCT_NAME)_$2_$$($1_ID)$$(addprefix _,$$($1_VARNAME))_root.confml
+$1_CONEOPT    = --all-layers --impl-tag=target:$2
+
+$1_VARNAME    = $$(if $$(filter $2_%,$$(TARGETNAME)),$$(TARGETID2-))
+$1_VARROOT    = $$(or $$(wildcard $$(PRODUCT_DIR)/$2),$$(or $$(if $$(PRODUCT_MSTNAME),$$(wildcard $$(PRODUCT_MSTDIR)/$2)),$$(PRODUCT_DIR)/$2))
+$1_VARDIR     = $$(if $$(and $$(call true,$$(USE_CONE)),$$(call true,$$(IMAKER_MKRESTARTS))),$$(CONE_OUTDIR),$$($1_VARROOT)/$2_$$($1_ID)$$(addprefix _,$$($1_VARNAME))$$(call iif,$$(USE_CONE),/content))
+
+#==============================================================================
+
+define $1_MSTOBYINFO
+  $$(call BLDROM_HDRINFO,$1)
+
+  ROM_IMAGE 0        non-xip size=0x00000000
+  $$(foreach rofs,1 2 3 4 5 6,
+    ROM_IMAGE $$(rofs) $$(if $$(filter $$(rofs),$3), rofs,dummy)$$(rofs) non-xip size=$$($1_MAXSIZE))
+
+  $$(call BLDROM_PLUGINFO,$1)
+
+  /* $1 header
+  */
+  $$($1_HDRINFO)
+
+  ROM_IMAGE[$3] {
+    $$(ODP_ROFSINFO)
+  #ifndef _IMAGE_INCLUDE_HEADER_ONLY
+    $$(BLR.$1.OBY)
+    $$($1_INLINE)
+    $$($1_FOOTERINFO)
+  }
+  #endif // _IMAGE_INCLUDE_HEADER_ONLY
+endef
+
+define $1_HDRINFO
+  $$(DEFINE) _IMAGE_WORKDIR $$($1_DIR)
+  $$(call mac2cppdef,$$(BLR.$1.OPT))
+  $$(BLR.$1.HBY)
+  $$($1_HEADER)
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(VARIANT_HEADER))
+endef
+
+define $1_FOOTERINFO
+  $$(if $$($1_TIME),time=$$($1_TIME))
+  $$(if $$($1_ROMVER),version=$$($1_ROMVER))
+  $$($1_FOOTER)
+endef
+
+define $1_ORIDEINFO
+  // Generated `$$($1_ORIDEIBY)' for $$($1_TITLE) image creation
+
+  $$(if $$($1_SWVERINFO)$$($1_FWIDINFO),
+    OVERRIDE_REPLACE/ADD
+    $$(if $$($1_SWVERINFO),
+      data-override="$$($1_SWVERFILE)"  "$$($1_SWVERTGT)")
+    $$(if $$($1_FWIDINFO),
+      data-override="$$($1_FWIDFILE)"  "$$(IMAGE_VERSDIR)\fwid$3.txt")
+    OVERRIDE_END
+  )
+endef
+
+#==============================================================================
+# ROFS pre-build
+
+CLEAN_$1PRE =\
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(CLEAN_VARIANT) |)\
+  $$(CLEAN_$1FILE) | $$(CLEAN_DEFHRH) | $$(CLEAN_FEATMAN)
+
+BUILD_$1PRE =\
+  $$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(BUILD_VARIANT) |)\
+  mkdir | "$$($1_DIR)" |\
+  $$(BUILD_$1FILE) |\
+  $$(BUILD_DEFHRH) |\
+  $$(BUILD_FEATMAN)
+
+CLEAN_$1FILE =\
+  del | "$$($1_MSTOBY)" "$$($1_ORIDEIBY)" "$$($1_SWVERFILE)" "$$($1_FWIDFILE)" |\
+  del | $$(call getgenfiles,$$($1_OBYGEN))
+
+BUILD_$1FILE =\
+  echo-q  | Generating file(s) for $$($1_TITLE) image creation |\
+  write-c | "$$($1_MSTOBY)" | $$(call def2str,$$($1_MSTOBYINFO))\n |\
+  $$(if $$($1_SWVERINFO),\
+    writeu  | "$$($1_SWVERFILE)" | $$(call quote,$$($1_SWVERINFO)) |)\
+  $$(if $$($1_FWIDINFO),\
+    writeu  | "$$($1_FWIDFILE)"  | $$($1_FWIDINFO) |)\
+  $$(if $$($1_ORIDEINFO),\
+    write-c | "$$($1_ORIDEIBY)"  | $$(call def2str,$$($1_ORIDEINFO)) |)\
+  $$(if $$($1_ORIDECONF),\
+    genorideiby | >>$$($1_ORIDEIBY) | $$(call def2str,$$($1_ORIDEFILES) | $$($1_ORIDECONF)) |)\
+  $$($1_OBYGEN)
+
+#==============================================================================
+# ROFS build
+
+$1_DUMMY     = $$(call rofsdummy,$1)
+
+BLR.$1.BUILD = $$(if $$(filter d%,$$(USE_$1)),echo-q | Creating dummy $$($1_TITLE) SOS image | write-q | "$$($1_IMG)" | $$($1_DUMMY))
+BLR.$1.IDIR  = $$(call dir2inc,$$($1_IDIR) $$(call iif,$$(USE_FEATVAR),,$$(FEATVAR_IDIR)))
+BLR.$1.HBY   = $$(call includeiby,$$(IMAGE_HBY) $$($1_HBY))
+BLR.$1.OBY   = $$(call includeiby,$$($1_OBY))\
+  $$(and $$(call true,$$(SYMBIAN_FEATURE_MANAGER)),$$($1_FEAIBY),$$(call mac2cppdef,-U__FEATURE_IBY__)$$(call includeiby,$$($1_FEAIBY)))\
+  $$(call includeiby,$$(if $$(filter $3,$$(USE_VARIANTBLD)),$$(VARIANT_OBY)) $$($1_ORIDEIBY))
+BLR.$1.OPT   = $$($1_OPT) $$(if $$(filter $3,$$(USE_PAGEDCODE)),$$(if $$(ODP_CODECOMP),-c$$(ODP_CODECOMP))) -o$$(call pathconv,$$($1_PREFIX)).img $$(BLDROPT)
+BLR.$1.POST  = $$(call iif,$$(KEEPTEMP),,del | "$$($1_PREFIX).???")
+
+CLEAN_$1 = $$(call CLEAN_BLDROM,$1)
+BUILD_$1 = $$(call BUILD_BLDROM,$1)
+
+REPORT_$1 =\
+  $$($1_TITLE) dir   | $$($1_DIR) | d |\
+  $$($1_TITLE) image | $$($1_IMG) | f\
+  $$(call iif,$$(USE_SYMGEN),| $$(REPORT_MAKSYMROFS))
+
+#==============================================================================
+# ROFS post-build
+
+CLEAN_$1POST  = $$(CLEAN_IMGCHK)
+BUILD_$1POST  = $$(call iif,$$(USE_IMGCHK),$$(BUILD_IMGCHK))
+REPORT_$1POST =
+
+#==============================================================================
+# ROFS steps
+
+SOS.$1.STEPS = $$(call iif,$$(USE_$1),\
+  $$(call iif,$$(SKIPPRE),,$$(and $$(filter $3,$$(USE_VARIANTBLD)),$$(call true,$$(USE_CONE)),CONEGEN RESTART) $1PRE)\
+  $$(call iif,$$(SKIPBLD),,$1) $$(call iif,$$(SKIPPOST),,$1POST))
+
+ALL.$1.STEPS  = $$(SOS.$1.STEPS)
+
+#==============================================================================
+# Targets
+
+.PHONY: $2 $(addprefix $2-,all check cone i2file image pre symbol) variant$2
+
+$2 $2%: IMAGE_TYPE = $1
+$2-all: USE_SYMGEN = 1
+
+$2 $2-all: ;@$$(call IMAKER,$$$$(ALL.$1.STEPS))
+$2-image : ;@$$(call IMAKER,$$$$(SOS.$1.STEPS))
+
+$2-cone  : ;@$$(call IMAKER,CONEGEN)
+$2-pre   : ;@$$(call IMAKER,$1PRE)
+$2-check : ;@$$(call IMAKER,IMGCHK)
+$2-symbol: ;@$$(call IMAKER,MAKSYMROFS)
+$2-i2file: ;@$$(call IMAKER,I2FILE)
+
+variant$2 variant$2%     : USE_CONE = 0
+variant$2 variant$2% $2_%: USE_VARIANTBLD = $3
+variant$2 variant$2% $2_%: $2$$(TARGETEXT) ;
+
+#==============================================================================
+# Helps
+
+$(call add_help,$2,t,Create $$($1_TITLE) image.)
+$(call add_help,$2-dir,t,Create directory structure for $$($1_TITLE) creation.)
+$(call add_help,$2-i2file,t,Extract all files from $$($1_TITLE) image.)
+$(call add_help,$2-image,t,Create $$($1_TITLE) image (.img) file.)
+$(call add_help,$2-pre,t,Run pre-step, create files etc. for $$($1_TITLE) creation.)
+$(call add_help,$2-symbol,t,Create $$($1_TITLE) symbol file.)
+$(call add_help,variant$2,t,Create $$($1_TITLE) image from a variant directory. Be sure to define the VARIANT_DIR.)
+
+endef # ROFS_EVAL
+
+
+###############################################################################
+#
+
+userofs = $(eval __i_rofs := $(filter-out :%,$(subst :, :,$(subst $(,), ,$(USE_ROFS)))))$(if\
+  $(filter $1,$(__i_rofs)),1,$(if $(filter d$1 D$1,$(__i_rofs)),dummy,0))
+
+rofsdummy = $(if $(filter d%,$(USE_$1)),$(call prepeat,\
+  $(call peval,$(call pquote,$(USE_ROFS)) =~ /d$1:(\d*)/i && $$1 || 100),X))
+
+$(foreach rofs,1 2 3 4 5 6,$(eval $(call ROFS_EVAL,ROFS$(rofs),rofs$(rofs),$(rofs))))
+
+$(call includechk,$(addprefix $(IMAKER_DIR)/imaker_rofs,2.mk 3.mk 4.mk))
+
+
+# END OF IMAKER_ROFS.MK
--- a/imgtools/imaker/src/imaker_rofs2.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_rofs2.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,145 +23,74 @@
 # |_|_\\___/|_| |___/ /___|
 #
 
-USE_NEWLOCLZTN  = $(if $(filter 5%,$(S60_VERSION)),1,0)
-
-ROFS2_TITLE     = ROFS2
-ROFS2_DIR       = $(WORKDIR)/rofs2
-ROFS2_NAME      = $(NAME)
-ROFS2_PREFIX    = $(ROFS2_DIR)/$(ROFS2_NAME)
-ROFS2_IDIR      =
-ROFS2_HBY       =
-ROFS2_OBY       =
-ROFS2_OPT       =
-ROFS2_MSTOBY    = $(ROFS2_PREFIX)_rofs2_master.oby
-ROFS2_HEADER    =
-ROFS2_INLINE    =
-ROFS2_FOOTER    =
-ROFS2_TIME      = $(DAY)/$(MONTH)/$(YEAR)
-
-ROFS2_OBYGEN    =
-
-ROFS2_VERIBY    = $(ROFS2_PREFIX)_rofs2_version.iby
-ROFS2_ROMVER    = 0.01(0)
-ROFS2_VERSION   = $(CORE_VERSION)
-ROFS2_FWIDFILE  = $(ROFS2_PREFIX)_rofs2_fwid.txt
-ROFS2_FWID      = language
-ROFS2_FWIDVER   = $(LANGPACK_ID)
-ROFS2_FWIDINFO  = id=$(ROFS2_FWID)\nversion=$(ROFS2_FWIDVER)\n
-
-ROFS2_IMG       = $(ROFS2_PREFIX).rofs2.img
-ROFS2_LOG       = $(ROFS2_PREFIX).rofs2.log
-ROFS2_OUTOBY    = $(ROFS2_PREFIX).rofs2.oby
-ROFS2_SYM       = $(ROFS2_PREFIX).rofs2.symbol
+ROFS2_FEAXML    = $(E32ROMINC)/featuredatabase.xml $(E32INC)/s60features.xml
+ROFS2_FEAIBY    = $(ROFS2_DIR)/feature.iby $(ROFS2_DIR)/s60features.iby
 
-ROFS2_PLUGINLOG = $(ROFS2_PREFIX)_rofs2_bldromplugin.log
-ROFS2_PAGEFILE  = $(ODP_PAGEFILE)
-ROFS2_UDEBFILE  = $(TRACE_UDEBFILE)
-
-ROFS2_ICHKLOG   = $(ROFS2_PREFIX)_rofs2_imgcheck.log
-ROFS2_ICHKOPT   = $(IMGCHK_OPT)
-ROFS2_ICHKIMG   = $(ROFS2_IMG) $(CORE_ICHKIMG)
-
-ROFS2_I2FDIR    = $(ROFS2_DIR)/img2file
-
-#==============================================================================
-
-define ROFS2_MSTOBYINFO
-  $(BLDROM_HDRINFO)
+ROFS2_ID        = $(LANGPACK_ID)
+ROFS2_REVISION  = $(LANGPACK_REVISION)
+ROFS2_SWVERINFO = $(ROFS2_VERSION)\n$(BUILD_YEAR)-$(BUILD_MONTH)-$(BUILD_DAY)\n$(PRODUCT_TYPE)\n(c) $(PRODUCT_MANUFACT)
+ROFS2_SWVERTGT  = $(IMAGE_VERSDIR)\langsw.txt
+ROFS2_FWID      = language
 
-  ROM_IMAGE 0        non-xip size=0x00000000
-  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 2  rofs2 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 3 dummy3 non-xip size=$(ROFS_MAXSIZE)
+ROFS2_ICHKIMG  += $(CORE_ICHKIMG)
 
-  $(BLDROM_PLUGINFO)
+ROFS2_CONECONF  = $(PRODUCT_NAME)_langpack_$(LANGPACK_ID)_root.confml
 
-  // ROFS2 header
-  //
-  $(ROFS2_HDRINFO)
 
-  ROM_IMAGE[2] {
-    $(call ODP_CODEINFO,2)
-    $(BLR.ROFS2.OBY)
-    $(ROFS2_INLINE)
-    $(ROFS2_FOOTERINFO)
-  }
-endef
+###############################################################################
+# ROFS2 pre
 
 define ROFS2_HDRINFO
   $(DEFINE) _IMAGE_WORKDIR $(ROFS2_DIR)
   $(call mac2cppdef,$(BLR.ROFS2.OPT))
-  $(call iif,$(USE_NEWLOCLZTN),
-    $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
-      #define __LOCALES_$(lang)_IBY__)
-    $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
-      ADD_LANGUAGE $(lang))
-  )
+  $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
+    #define __LOCALES_$(lang)_IBY__)
+  $(foreach lang,$(call getlangbyid,$(LANGPACK_LANGS)),
+    LANGUAGE_CODE $(lang))
+  $(call iif,$(USE_QTLOCLZTN),QT_TO_SYMBIAN_LANGID $(LANGPACK_SYSLANGINI))
   $(BLR.ROFS2.HBY)
   $(ROFS2_HEADER)
   $(if $(filter 2,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
 endef
 
-define ROFS2_FOOTERINFO
-  $(if $(ROFS2_TIME),time=$(ROFS2_TIME))
-  $(ROFS2_FOOTER)
-endef
-
-define ROFS2_VERIBYINFO
-  // Generated `$(ROFS2_VERIBY)$' for ROFS2 image creation
-  $(if $(ROFS2_ROMVER),
+ROFS2_ORIDEINFO += $(LANGPACK_ORIDEINFO)
 
-    version=$(ROFS2_ROMVER))
-
+define LANGPACK_ORIDEINFO
   OVERRIDE_REPLACE/ADD
-  $(call iif,$(USE_NEWLOCLZTN),
-    data-override=$(LANGPACK_LANGFILE)  RESOURCE_FILES_DIR\Bootdata\languages.txt
-    data-override=$(LANGPACK_IDFILE)  RESOURCE_FILES_DIR\versions\lang.txt
-    data-override=$(LANGPACK_SWVERFILE)  RESOURCE_FILES_DIR\versions\langsw.txt
-  )
-  $(call iif,$(USE_FOTA),
-    data-override=$(ROFS2_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid2.txt)
+  data-override="$(LANGPACK_LANGFILE)"  "RESOURCE_FILES_DIR\Bootdata\languages.txt"
+  data-override="$(LANGPACK_IDFILE)"  "$(IMAGE_VERSDIR)\lang.txt"
   OVERRIDE_END
 endef
 
 #==============================================================================
 
-CLEAN_ROFS2FILE =\
-  del | "$(ROFS2_MSTOBY)" "$(ROFS2_VERIBY)" "$(ROFS2_FWIDFILE)" |\
-  $(CLEAN_LANGFILE) |\
-  del | $(call getgenfiles,$(call _buildoby,$(ROFS2_OBYGEN)))
-
-BUILD_ROFS2FILE =\
-  echo-q | Generating file(s) for ROFS2 image creation |\
-  write  | $(ROFS2_MSTOBY) | $(call def2str,$(ROFS2_MSTOBYINFO)) |\
-  $(call iif,$(USE_VERGEN),\
-    write  | $(ROFS2_VERIBY)   | $(call def2str,$(ROFS2_VERIBYINFO)) |\
-    writeu | $(ROFS2_FWIDFILE) | $(ROFS2_FWIDINFO) |)\
-  $(call iif,$(USE_NEWLOCLZTN),$(BUILD_LANGFILE)) |\
-  $(call _buildoby,$(ROFS2_OBYGEN))
+CLEAN_ROFS2FILE += | $(CLEAN_LANGFILE)
+BUILD_ROFS2FILE += | $(BUILD_LANGFILE)
 
 
 ###############################################################################
-#
+# Language package
 
-LANGPACK_SYSLANGMK     = system_languages.mk
+LANGPACK_SYSLANGMK     = $(call findfile,system_languages.mk,,1)
+LANGPACK_SYSLANGINI    = $(E32DATAZ)/resource/system_languages.ini
 
-LANGPACK_ROOT          = $(PRODUCT_DIR)/language
+LANGPACK_ROOT          = $(or $(wildcard $(PRODUCT_DIR)/language),$(or $(if $(PRODUCT_MSTNAME),$(wildcard $(PRODUCT_MSTDIR)/language)),$(PRODUCT_DIR)/language))
 LANGPACK_PREFIX        = langpack_
 LANGPACK_MKNAME        = language_variant.mk
-LANGPACK_NAME          =
-LANGPACK_DIR           = $(LANGPACK_ROOT)/$(LANGPACK_NAME)
-LANGPACK_CONFML        = $(or $(wildcard $(LANGPACK_DIR)/$(CONFT_CFGNAME).confml),$(PRODVARIANT_CONFML))
-LANGPACK_CONFCP        = $(PRODVARIANT_CONFCP) $(if $(wildcard $(LANGPACK_DIR)/$(CONFT_CFGNAME).confml),$(CONFT_CFGNAME))
+LANGPACK_NAME          = $(LANGPACK_PREFIX)$(LANGPACK_ID)
+LANGPACK_DIR           = $(if $(and $(call true,$(USE_CONE)),$(call true,$(IMAKER_MKRESTARTS))),$(CONE_OUTDIR),$(LANGPACK_ROOT)/$(LANGPACK_NAME)$(call iif,$(USE_CONE),/content))
+LANGPACK_DIRS          = $(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*$(call iif,$(USE_CONE),/content))
+LANGPACK_MK            = $(or $(wildcard $(LANGPACK_DIR)/$(LANGPACK_MKNAME)),$(wildcard $(LANGPACK_ROOT)/$(LANGPACK_NAME)/content/$(LANGPACK_MKNAME)))
 
 LANGPACK_IDFILE        = $(ROFS2_PREFIX)_rofs2_lang.txt
-LANGPACK_ID            = 01
+LANGPACK_IDINFO        = $(ROFS2_VERSION)
+LANGPACK_ID            = $(if $(filter $(LANGPACK_PREFIX)%,$(TARGETNAME)),$(TARGETID1),01)
+LANGPACK_REVISION      = 01
 LANGPACK_LANGFILE      = $(ROFS2_PREFIX)_rofs2_languages.txt
 LANGPACK_LANGS         = English
 LANGPACK_DEFAULTLANG   = $(word 1,$(LANGPACK_LANGS))
 LANGPACK_DEFAULTREGION = Western
-LANGPACK_SWVERFILE     = $(ROFS2_PREFIX)_rofs2_langsw.txt
-LANGPACK_SWVERINFO     = $(CORE_SWVERINFO)
+LANGPACK_REGIONS       = china japan western
 LANGPACK_INFOFILE      = $(ROFS2_PREFIX)_rofs2_$(LANGPACK_NAME)_info.txt
 
 LANGPACK_LANGNAMES     = $(call getlangname,$(LANGPACK_LANGS))
@@ -172,38 +101,37 @@
 
 #==============================================================================
 
-CLEAN_LANGFILE = del | "$(LANGPACK_LANGFILE)" "$(LANGPACK_IDFILE)" "$(LANGPACK_SWVERFILE)" "$(LANGPACK_INFOFILE)"
+CLEAN_LANGFILE = del | "$(LANGPACK_LANGFILE)" "$(LANGPACK_IDFILE)" "$(LANGPACK_INFOFILE)"
 BUILD_LANGFILE =\
   echo-q | Generating language files for Language Package image creation |\
   $(if $(strip $(LANGUAGE_SYSLANGS)),,\
-    error | 1 | No system languages defined\n |)\
+    error | 1 | No system languages defined. |)\
   $(if $(strip $(LANGPACK_LANGS)),,\
-    error | 1 | No languages defined in the language pack\n |)\
+    error | 1 | No languages defined in the language pack. |)\
   $(call select,$(words $(LANGPACK_LANGS)),$(words $(LANGPACK_LANGIDS)),,\
-    error | 1 | Not all languages of the language pack defined in the system languages\n |)\
+    error | 1 | Not all languages of the language pack defined in the system languages. |)\
   $(call select,$(words $(LANGPACK_LANGS)),$(words $(call getlangbyid,$(LANGPACK_LANGS))),,\
-    error | 1 | Duplicate language defined in the language pack\n |)\
+    error | 1 | Duplicate language defined in the language pack. |)\
   $(if $(strip $(LANGPACK_DEFAULTLANG)),,\
-    error | 1 | No default language defined\n |)\
+    error | 1 | No default language defined. |)\
   $(if $(word 2,$(LANGPACK_DEFAULTLANG)),\
-    error | 1 | More than one default language defined\n |)\
+    error | 1 | More than one default language defined. |)\
   $(if $(filter $(call lcase,$(LANGPACK_DEFAULTLANG)),$(call lcase,$(LANGPACK_LANGS))),,\
-    error | 1 | Default language not defined in the language pack languages\n |)\
+    error | 1 | Default language not defined in the language pack languages. |)\
   $(if $(word 2,$(sort $(call getlangregion,$(LANGPACK_LANGS)))),\
-    error | 1 | Not all languages of the language pack belong to the same region\n |)\
+    error | 1 | Not all languages of the language pack belong to the same region. |)\
   \
-  writeu | $(LANGPACK_LANGFILE)  | $(LANGPACK_LANGINFO) |\
-  writeu | $(LANGPACK_IDFILE)    | $(LANGPACK_ID) |\
-  writeu | $(LANGPACK_SWVERFILE) | $(LANGPACK_SWVERINFO) |\
+  writeu | "$(LANGPACK_LANGFILE)" | $(LANGPACK_LANGINFO) |\
+  writeu | "$(LANGPACK_IDFILE)"   | $(LANGPACK_IDINFO) |\
   $(if $(LANGPACK_NAME),\
-    write | $(LANGPACK_INFOFILE) | $(call def2str,$(LANGPACK_INFO)))
+    write | "$(LANGPACK_INFOFILE)" | $(call def2str,$(LANGPACK_INFO)))
 
 LANGPACK_LANGINFO =\
   $(foreach lang,$(LANGPACK_LANGIDS),\
     $(lang)$(call select,$(lang),$(LANGPACK_DEFLANGID),$(,)d)\n)
 
 define LANGPACK_INFO
-  Generated `$(LANGPACK_INFOFILE)$' for documenting the language selections
+  Generated `$(LANGPACK_INFOFILE)' for documenting the language selections
 
   Name         : $(LANGPACK_NAME)
   Default Lang.: $(LANGPACK_DEFLANGNAME) ($(LANGPACK_DEFLANGID))
@@ -214,79 +142,25 @@
 
 
 ###############################################################################
-# ROFS2 pre
+# Targets
 
-CLEAN_ROFS2PRE = $(if $(filter 2,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_ROFS2FILE)
-BUILD_ROFS2PRE =\
-  $(if $(filter 2,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
-  mkcd | $(ROFS2_DIR) |\
-  $(BUILD_ROFS2FILE)
-
-#==============================================================================
-# ROFS2 build
+LANGPACK_EXPORT = $(if $(filter $(LANGPACK_PREFIX)%,$(TARGETNAME)),$(addprefix $(LANGPACK_PREFIX)%:LANGPACK_,ID NAME))
+TARGET_EXPORT  += $(LANGPACK_EXPORT)
 
-BLR.ROFS2.IDIR = $(call dir2inc,$(ROFS2_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
-BLR.ROFS2.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS2_HBY))
-BLR.ROFS2.OBY  = $(call includeiby,$(ROFS2_OBY) $(if $(filter 2,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(call iif,$(USE_VERGEN),$(ROFS2_VERIBY)))
-BLR.ROFS2.OPT  = $(ROFS2_OPT) $(if $(filter 2,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(ROFS2_NAME).img) $(BLDROPT)
-BLR.ROFS2.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS2_PREFIX).???)
-
-CLEAN_ROFS2 = $(CLEAN_BLDROM)
-BUILD_ROFS2 = $(BUILD_BLDROM)
+# langpack_all langpack_china langpack_japan langpack_western
+.PHONY: $(addprefix $(LANGPACK_PREFIX),all $(LANGPACK_REGIONS))
 
-#==============================================================================
-# ROFS2 post
+$(addprefix $(LANGPACK_PREFIX),all $(LANGPACK_REGIONS)) \
+$(addsuffix -%,$(addprefix $(LANGPACK_PREFIX),all $(LANGPACK_REGIONS))):\
+  ;@$(call IMAKER,$$(call getlpacksbyregion,$(LANGPACK_ID)))
 
-CLEAN_ROFS2POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
-BUILD_ROFS2POST =\
-  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
-  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
-
-#==============================================================================
-
-SOS.ROFS2.STEPS = $(call iif,$(USE_ROFS2),$(call iif,$(SKIPPRE),,ROFS2PRE) $(call iif,$(SKIPBLD),,ROFS2) $(call iif,$(SKIPPOST),,ROFS2POST))
-ALL.ROFS2.STEPS = $(SOS.ROFS2.STEPS)
+$(LANGPACK_PREFIX)%: rofs2_$$* ;
 
 
 ###############################################################################
-# Targets
-
-.PHONY: rofs2 rofs2-all rofs2-image rofs2-pre rofs2-check rofs2-symbol rofs2-i2file
-
-rofs2 rofs2-%  : IMAGE_TYPE = ROFS2
-rofs2-all      : USE_SYMGEN = 1
-
-rofs2 rofs2-all: ;@$(call IMAKER,$$(ALL.ROFS2.STEPS))
-rofs2-image    : ;@$(call IMAKER,$$(SOS.ROFS2.STEPS))
-
-rofs2-pre      : ;@$(call IMAKER,ROFS2PRE)
-rofs2-check    : ;@$(call IMAKER,IMGCHK)
-rofs2-symbol   : ;@$(call IMAKER,MAKSYMROFS)
-
-rofs2-i2file   : USE_ROFS = 2
-rofs2-i2file   : ;@$(call IMAKER,VARIANTI2F)
-
-# langpack_%
-$(LANGPACK_PREFIX)%: LANGPACK_NAME  = $(TARGETNAME)
-$(LANGPACK_PREFIX)%: LANGPACK_ID    = $(TARGETID)
-$(LANGPACK_PREFIX)%: VARIANT_DIR    = $(LANGPACK_DIR)
-$(LANGPACK_PREFIX)%: VARIANT_MKNAME = $(LANGPACK_MKNAME)
-$(LANGPACK_PREFIX)%: VARIANT_CONFML = $(LANGPACK_CONFML)
-$(LANGPACK_PREFIX)%: VARIANT_CONFCP = $(LANGPACK_CONFCP)
-$(LANGPACK_PREFIX)%: variantrofs2_$(TARGETID)$(TARGETEXT) ;
-
-# langpack_all langpack_china langpack_japan langpack_western
-.PHONY: $(addprefix $(LANGPACK_PREFIX),all china japan western)
-
-$(addprefix $(LANGPACK_PREFIX),all china japan western):\
-  ;@$(call IMAKER,$$(addsuffix |,$$(call getlpacksbyregion,$(LANGPACK_ID))))
-
-#==============================================================================
 # Helps
 
-$(call add_help,LANGPACK_DIR,v,(string),Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_CONFCP for details.)
-$(call add_help,LANGPACK_CONFML,v,(string),Overrides the VARIANT_CONFML for language pack, see the instructions of VARIANT_CONFML for details.)
-$(call add_help,LANGPACK_CONFCP,v,(string),Overrides the VARIANT_CONFCP for language pack, see the instructions of VARIANT_CONFCP for details.)
+$(call add_help,LANGPACK_DIR,v,(string),Overrides the VARIANT_DIR for language pack, see the instructions of VARIANT_DIR for details.)
 $(call add_help,LANGPACK_LANGS,v,(string),Languages are the languages that are taken to the image (SC language is is defaulting to 01 in languages.txt))
 $(call add_help,LANGPACK_DEFAULTLANG,v,(string),Default language is the language where the device will boot to (SIM language overrides this selection))
 $(call add_help,LANGPACK_ID,v,(string),Language id used in the lang.txt generation)
@@ -296,6 +170,12 @@
 $(call add_help,$(LANGPACK_PREFIX)japan,t,Create language packages that belong to Japan region.)
 $(call add_help,$(LANGPACK_PREFIX)western,t,Create language packages that belong to Western region.)
 
+LANGPACK_HELP =\
+  $(call add_help,$(call getlpfrompath,$(LANGPACK_DIRS)),t,Language variant target.)\
+  $(eval include $(wildcard $(addsuffix /$(LANGPACK_MKNAME),$(LANGPACK_DIRS))))
+
+BUILD_HELPDYNAMIC += $(LANGPACK_HELP)
+
 
 ###############################################################################
 # Functions
@@ -315,19 +195,20 @@
 
 # Get all language pack targets that belong to a given region
 getlpacksbyregion = $(strip\
-  $(foreach file,$(wildcard $(LANGPACK_ROOT)/$(LANGPACK_PREFIX)*/$(LANGPACK_MKNAME)),\
+  $(foreach file,$(wildcard $(addsuffix /$(LANGPACK_MKNAME),$(LANGPACK_DIRS))),\
     $(eval include $(file))\
-    $(if $(call select,$1,all,1)$(call select,$1,$(LANGPACK_REGION),1),\
-      $(notdir $(patsubst %/,%,$(dir $(file)))))))
+    $(if $(call select,$1,all,1)$(call select,$1,$(LANGPACK_REGION),1),$(call getlpfrompath,$(file)))))
+
+# Get language pack target(s) from given path(s)
+getlpfrompath = $(filter $(LANGPACK_PREFIX)%,$(call substm,/ \, ,$1))
 
 
 ###############################################################################
 # Internal stuff
 
 LANGUAGE_EVAL =\
-  $(eval -include $(call findfile,$(LANGPACK_SYSLANGMK),$(FEATVAR_IDIR)))\
   $(eval LANGUAGE_ID-NAME :=)$(eval LANGUAGE_ID-REGION :=)\
-  $(call _evallangdata,$(subst $(\n), | ,$(LANGUAGE_SYSLANGS)))
+  $(call _evallangdata,$(strip $(subst $(\n), | ,$(LANGUAGE_SYSLANGS))))
 
 _evallangdata = $(if $1,\
   $(eval __i_ldata := $(call getelem,1,$1))\
--- a/imgtools/imaker/src/imaker_rofs3.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_rofs3.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,166 +23,55 @@
 # |_|_\\___/|_| |___/ |___/
 #
 
-ROFS3_TITLE      = ROFS3
-ROFS3_DIR        = $(WORKDIR)/rofs3
-ROFS3_NAME       = $(NAME)
-ROFS3_PREFIX     = $(ROFS3_DIR)/$(ROFS3_NAME)
-ROFS3_IDIR       =
-ROFS3_HBY        =
-ROFS3_OBY        =
-ROFS3_OPT        =
-ROFS3_MSTOBY     = $(ROFS3_PREFIX)_rofs3_master.oby
-ROFS3_HEADER     =
-ROFS3_INLINE     =
-ROFS3_FOOTER     =
-ROFS3_TIME       = $(DAY)/$(MONTH)/$(YEAR)
-
-ROFS3_OBYGEN     = #geniby | $(ROFS3_PREFIX)_rofs3_collected.oby | $(E32ROMINC)/customervariant/* | *.iby | \#include "%3" | end
-
-ROFS3_VERIBY     = $(ROFS3_PREFIX)_rofs3_version.iby
-ROFS3_ROMVER     = 0.01(0)
-ROFS3_VERSION    = $(CORE_VERSION)
-ROFS3_CUSTSWFILE = $(ROFS3_PREFIX)_rofs3_customersw.txt
-ROFS3_CUSTSWINFO = $(ROFS3_VERSION)\\\n$(DAY)-$(MONTH)-$(YEAR2)
-ROFS3_FWIDFILE   = $(ROFS3_PREFIX)_rofs3_fwid.txt
-ROFS3_FWID       = customer
-ROFS3_FWIDVER    = $(ROFS3_VERSION) Customer
-ROFS3_FWIDINFO   = id=$(ROFS3_FWID)\nversion=$(ROFS3_FWIDVER)\n
-
-ROFS3_IMG        = $(ROFS3_PREFIX).rofs3.img
-ROFS3_LOG        = $(ROFS3_PREFIX).rofs3.log
-ROFS3_OUTOBY     = $(ROFS3_PREFIX).rofs3.oby
-ROFS3_SYM        = $(ROFS3_PREFIX).rofs3.symbol
-
-ROFS3_PLUGINLOG  = $(ROFS3_PREFIX)_rofs3_bldromplugin.log
-ROFS3_PAGEFILE   = $(ODP_PAGEFILE)
-ROFS3_UDEBFILE   = $(TRACE_UDEBFILE)
-
-ROFS3_ICHKLOG    = $(ROFS3_PREFIX)_rofs3_imgcheck.log
-ROFS3_ICHKOPT    = $(IMGCHK_OPT)
-ROFS3_ICHKIMG    = $(ROFS3_IMG) $(ROFS2_ICHKIMG)
-
-ROFS3_I2FDIR     = $(ROFS3_DIR)/img2file
-
-#==============================================================================
-
-define ROFS3_MSTOBYINFO
-  $(BLDROM_HDRINFO)
-
-  ROM_IMAGE 0        non-xip size=0x00000000
-  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 2 dummy2 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 3  rofs3 non-xip size=$(ROFS_MAXSIZE)
-
-  $(BLDROM_PLUGINFO)
+ROFS3_FEAXML   = $(E32INC)/s60customswfeatures.xml
+ROFS3_FEAIBY   = $(ROFS3_DIR)/s60customswfeatures.iby
 
-  // ROFS3 header
-  //
-  $(ROFS3_HDRINFO)
-
-  ROM_IMAGE[3] {
-    $(call ODP_CODEINFO,3)
-    $(BLR.ROFS3.OBY)
-    $(ROFS3_INLINE)
-    $(ROFS3_FOOTERINFO)
-  }
-endef
-
-define ROFS3_HDRINFO
-  $(DEFINE) _IMAGE_WORKDIR $(ROFS3_DIR)
-  $(call mac2cppdef,$(BLR.ROFS3.OPT))
-  $(BLR.ROFS3.HBY)
-  $(ROFS3_HEADER)
-  $(if $(filter 3,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
-endef
-
-define ROFS3_FOOTERINFO
-  $(if $(ROFS3_TIME),time=$(ROFS3_TIME))
-  $(ROFS3_FOOTER)
-endef
+ROFS3_ID       = $(CUSTVARIANT_ID)
+ROFS3_REVISION = $(CUSTVARIANT_REVISION)
+ROFS3_SWVERTGT = $(IMAGE_VERSDIR)\customersw.txt
+ROFS3_FWID     = customer
 
-define ROFS3_VERIBYINFO
-  // Generated `$(ROFS3_VERIBY)$' for ROFS3 image creation
-  $(if $(ROFS3_ROMVER),
-
-    version=$(ROFS3_ROMVER))
-
-  OVERRIDE_REPLACE/ADD
-  $(if $(ROFS3_CUSTSWINFO),
-    data-override=$(ROFS3_CUSTSWFILE)  RESOURCE_FILES_DIR\versions\customersw.txt)
-  $(call iif,$(USE_FOTA),
-    data-override=$(ROFS3_FWIDFILE)  RESOURCE_FILES_DIR\versions\fwid3.txt)
-  OVERRIDE_END
-endef
+ROFS3_ICHKIMG += $(ROFS2_ICHKIMG)
 
-#==============================================================================
-
-CLEAN_ROFS3FILE =\
-  del | "$(ROFS3_MSTOBY)" "$(ROFS3_VERIBY)" "$(ROFS3_CUSTSWFILE)" "$(ROFS3_FWIDFILE)" |\
-  del | $(call getgenfiles,$(ROFS3_OBYGEN))
-
-BUILD_ROFS3FILE =\
-  echo-q | Generating file(s) for ROFS3 image creation |\
-  write  | $(ROFS3_MSTOBY) | $(call def2str,$(ROFS3_MSTOBYINFO)) |\
-  $(call iif,$(USE_VERGEN),\
-    write  | $(ROFS3_VERIBY)     | $(call def2str,$(ROFS3_VERIBYINFO)) |\
-    writeu | $(ROFS3_CUSTSWFILE) | $(ROFS3_CUSTSWINFO) |\
-    writeu | $(ROFS3_FWIDFILE)   | $(ROFS3_FWIDINFO) |)\
-  $(ROFS3_OBYGEN)
+ROFS3_CONECONF = $(PRODUCT_NAME)_custvariant_$(CUSTVARIANT_ID)$(addprefix _,$(CUSTVARIANT_NAME))_root.confml
+ROFS3_CONEOPT  = --layer-wildcard=*/custvariant* --impl-tag=target:rofs3
 
 
 ###############################################################################
-# ROFS3 pre
-
-CLEAN_ROFS3PRE = $(if $(filter 3,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT) |) $(CLEAN_ROFS3FILE)
-BUILD_ROFS3PRE =\
-  $(if $(filter 3,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |)\
-  mkcd | $(ROFS3_DIR) |\
-  $(BUILD_ROFS3FILE)
-
-#==============================================================================
-# ROFS3 build
+# Customer variant
 
-BLR.ROFS3.IDIR = $(call dir2inc,$(ROFS3_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
-BLR.ROFS3.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS3_HBY))
-BLR.ROFS3.OBY  = $(call includeiby,$(ROFS3_OBY) $(if $(filter 3,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(call iif,$(USE_VERGEN),$(ROFS3_VERIBY)))
-BLR.ROFS3.OPT  = $(ROFS3_OPT) $(if $(filter 3,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(notdir $(ROFS3_NAME).img) $(BLDROPT)
-BLR.ROFS3.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS3_PREFIX).???)
-
-CLEAN_ROFS3 = $(CLEAN_BLDROM)
-BUILD_ROFS3 = $(BUILD_BLDROM)
+CUSTVARIANT_ROOT     = $(PRODUCT_DIR)/customer
+CUSTVARIANT_ROOT2    = $(if $(PRODUCT_MSTNAME),$(PRODUCT_MSTDIR)/customer)
+#CUSTVARIANT_ROOT3    = $(PLATFORM_DIR)/country
+CUSTVARIANT_PREFIX   = custvariant_
+CUSTVARIANT_ID       = $(if $(filter $(CUSTVARIANT_PREFIX)%,$(TARGETNAME)),$(TARGETID1),00)
+CUSTVARIANT_NAME     = $(if $(filter $(CUSTVARIANT_PREFIX)%,$(TARGETNAME)),$(TARGETID2-),vanilla)
+CUSTVARIANT_REVISION = 01
+CUSTVARIANT_DIR      = $(if $(and $(call true,$(USE_CONE)),$(call true,$(IMAKER_MKRESTARTS))),$(CONE_OUTDIR),$(strip\
+  $(eval __i_custvardir :=)$(foreach croot,$(sort $(filter CUSTVARIANT_ROOT%,$(.VARIABLES))),\
+    $(if $(__i_custvardir),,$(eval __i_custvardir := $(if $(wildcard $($(croot))),\
+      $(wildcard $($(croot))/$(CUSTVARIANT_PREFIX)$(CUSTVARIANT_ID)$(addprefix _,$(CUSTVARIANT_NAME)))))))\
+  )$(or $(__i_custvardir),$(CUSTVARIANT_ROOT)/$(CUSTVARIANT_PREFIX)$(CUSTVARIANT_ID)$(addprefix _,$(CUSTVARIANT_NAME)))$(call iif,$(USE_CONE),/content))
+CUSTVARIANT_COMPLP   =
 
-#==============================================================================
-# ROFS3 post
+CUSTVARIANT_EXPORT = $(if $(filter $(CUSTVARIANT_PREFIX)%,$(TARGETNAME)),$(addprefix $(CUSTVARIANT_PREFIX)%:CUSTVARIANT_,ID NAME))
+TARGET_EXPORT     += $(CUSTVARIANT_EXPORT)
 
-CLEAN_ROFS3POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
-BUILD_ROFS3POST =\
-  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
-  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
-
-#==============================================================================
-
-SOS.ROFS3.STEPS = $(call iif,$(USE_ROFS3),$(call iif,$(SKIPPRE),,ROFS3PRE) $(call iif,$(SKIPBLD),,ROFS3) $(call iif,$(SKIPPOST),,ROFS3POST))
-ALL.ROFS3.STEPS = $(SOS.ROFS3.STEPS)
+# custvariant_%
+$(CUSTVARIANT_PREFIX)%: rofs3_$$* ;
 
 
 ###############################################################################
-# Targets
+# Helps
 
-.PHONY: rofs3 rofs3-all rofs3-image rofs3-pre rofs3-check rofs3-symbol rofs3-i2file
-
-rofs3 rofs3-%  : IMAGE_TYPE = ROFS3
-rofs3-all      : USE_SYMGEN = 1
+$(call add_help,CUSTVARIANT_DIR,v,(string),Overrides the VARIANT_DIR for customer variant, see the instructions of VARIANT_DIR for details.)
+$(call add_help,CUSTVARIANT_COMPLP,v,(string),Compatible language variant.)
 
-rofs3 rofs3-all: ;@$(call IMAKER,$$(ALL.ROFS3.STEPS))
-rofs3-image    : ;@$(call IMAKER,$$(SOS.ROFS3.STEPS))
+CUSTVARIANT_HELP = $(call add_help,$(foreach croot,$(filter CUSTVARIANT_ROOT%,$(.VARIABLES)),\
+  $(if $(wildcard $($(croot))),$(call getlastdir,$(filter %/,$(wildcard $($(croot))/$(CUSTVARIANT_PREFIX)*/))))),\
+  t,Customer $$(subst $$(CUSTVARIANT_PREFIX),,$$1) variant target.)
 
-rofs3-pre      : ;@$(call IMAKER,ROFS3PRE)
-rofs3-check    : ;@$(call IMAKER,IMGCHK)
-rofs3-symbol   : ;@$(call IMAKER,MAKSYMROFS)
-
-rofs3-i2file   : USE_ROFS = 3
-rofs3-i2file   : ;@$(call IMAKER,VARIANTI2F)
+BUILD_HELPDYNAMIC += $(CUSTVARIANT_HELP)
 
 
 # END OF IMAKER_ROFS3.MK
--- a/imgtools/imaker/src/imaker_rofs4.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_rofs4.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,141 +23,5 @@
 # |_|_\\___/|_| |___/   |_|
 #
 
-ROFS4_TITLE      = ROFS4
-ROFS4_DIR        = $(WORKDIR)/rofs4
-ROFS4_NAME       = $(NAME)
-ROFS4_PREFIX     = $(ROFS4_DIR)/$(ROFS4_NAME)
-ROFS4_IDIR       =
-ROFS4_HBY        =
-ROFS4_OBY        =
-ROFS4_OPT        =
-ROFS4_MSTOBY     = $(ROFS4_PREFIX)_rofs4_master.oby
-ROFS4_HEADER     =
-ROFS4_INLINE     =
-ROFS4_FOOTER     =
-ROFS4_TIME       = $(DAY)/$(MONTH)/$(YEAR)
-
-ROFS4_OBYGEN     =
-
-ROFS4_VERSION    = $(CORE_VERSION)
-
-ROFS4_IMG        = $(ROFS4_PREFIX).rofs4.img
-ROFS4_LOG        = $(ROFS4_PREFIX).rofs4.log
-ROFS4_OUTOBY     = $(ROFS4_PREFIX).rofs4.oby
-ROFS4_SYM        = $(ROFS4_PREFIX).rofs4.symbol
-
-ROFS4_PLUGINLOG  = $(ROFS4_PREFIX)_rofs4_bldromplugin.log
-ROFS4_PAGEFILE   = $(ODP_PAGEFILE)
-ROFS4_UDEBFILE   = $(TRACE_UDEBFILE)
-
-ROFS4_ICHKLOG    = $(ROFS4_PREFIX)_rofs4_imgcheck.log
-ROFS4_ICHKOPT    = $(IMGCHK_OPT)
-ROFS4_ICHKIMG    = $(ROFS4_IMG) $(ROFS2_ICHKIMG)
-
-ROFS4_I2FDIR     = $(ROFS4_DIR)/img2file
-
-#==============================================================================
-
-define ROFS4_MSTOBYINFO
-  $(BLDROM_HDRINFO)
-
-  ROM_IMAGE 0        non-xip size=0x00000000
-  ROM_IMAGE 1 dummy1 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 2 dummy2 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 3 dummy3 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 4  rofs4 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 5 dummy5 non-xip size=$(ROFS_MAXSIZE)
-  ROM_IMAGE 6 dummy6 non-xip size=$(ROFS_MAXSIZE)
-
-  $(BLDROM_PLUGINFO)
-
-  // ROFS4 header
-  //
-  $(ROFS4_HDRINFO)
-
-  ROM_IMAGE[4] {
-    $(call ODP_CODEINFO,4)
-    $(BLR.ROFS4.OBY)
-    $(ROFS4_INLINE)
-    $(ROFS4_FOOTERINFO)
-  }
-endef
-
-define ROFS4_HDRINFO
-  $(DEFINE) _IMAGE_WORKDIR $(ROFS4_DIR)
-  $(call mac2cppdef,$(BLR.ROFS4.OPT))
-  $(BLR.ROFS4.HBY)
-  $(ROFS4_HEADER)
-endef
-
-define ROFS4_FOOTERINFO
-  $(if $(ROFS4_TIME),time=$(ROFS4_TIME))
-  $(ROFS4_FOOTER)
-endef
-
-#==============================================================================
-
-CLEAN_ROFS4FILE =\
-  del | "$(ROFS4_MSTOBY)" |\
-  del | $(call getgenfiles,$(ROFS4_OBYGEN))
-
-BUILD_ROFS4FILE =\
-  echo-q | Generating file(s) for $(ROFS4_TITLE) image creation |\
-  write  | $(ROFS4_MSTOBY) | $(call def2str,$(ROFS4_MSTOBYINFO)) |\
-  $(ROFS4_OBYGEN)
-
-
-###############################################################################
-# ROFS4 pre
-
-CLEAN_ROFS4PRE = $(CLEAN_ROFS4FILE)
-BUILD_ROFS4PRE =\
-  mkcd | $(ROFS4_DIR) |\
-  $(BUILD_ROFS4FILE)
-
-#==============================================================================
-# ROFS4 build
-
-BLR.ROFS4.IDIR = $(call dir2inc,$(ROFS4_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
-BLR.ROFS4.HBY  = $(call includeiby,$(IMAGE_HBY) $(ROFS4_HBY))
-BLR.ROFS4.OBY  = $(call includeiby,$(ROFS4_OBY))
-BLR.ROFS4.OPT  = $(ROFS4_OPT) $(if $(filter 4,$(USE_PAGEDCODE)),$(if $(ODP_CODECOMP),-c$(ODP_CODECOMP))) -o$(ROFS4_NAME).img $(BLDROPT)
-BLR.ROFS4.POST = $(call iif,$(KEEPTEMP),,del | $(ROFS4_PREFIX).???)
-
-CLEAN_ROFS4 = $(CLEAN_BLDROM)
-BUILD_ROFS4 = $(BUILD_BLDROM)
-
-#==============================================================================
-# ROFS4 post
-
-CLEAN_ROFS4POST = $(CLEAN_IMGCHK) | $(CLEAN_MAKSYMROFS)
-BUILD_ROFS4POST =\
-  $(call iif,$(USE_IMGCHK),$(BUILD_IMGCHK) |)\
-  $(call iif,$(USE_SYMGEN),$(BUILD_MAKSYMROFS))
-
-#==============================================================================
-
-SOS.ROFS4.STEPS = $(call iif,$(USE_ROFS4),$(call iif,$(SKIPPRE),,ROFS4PRE) $(call iif,$(SKIPBLD),,ROFS4) $(call iif,$(SKIPPOST),,ROFS4POST))
-ALL.ROFS4.STEPS = $(SOS.ROFS4.STEPS)
-
-
-###############################################################################
-# Targets
-
-.PHONY: rofs4 rofs4-all rofs4-image rofs4-pre rofs4-check rofs4-symbol rofs4-i2file
-
-rofs4 rofs4-%  : IMAGE_TYPE = ROFS4
-rofs4-all      : USE_SYMGEN = 1
-
-rofs4 rofs4-all: ;@$(call IMAKER,$$(ALL.ROFS4.STEPS))
-rofs4-image    : ;@$(call IMAKER,$$(SOS.ROFS4.STEPS))
-
-rofs4-pre      : ;@$(call IMAKER,ROFS4PRE)
-rofs4-check    : ;@$(call IMAKER,IMGCHK)
-rofs4-symbol   : ;@$(call IMAKER,MAKSYMROFS)
-
-rofs4-i2file   : USE_ROFS = 4
-rofs4-i2file   : ;@$(call IMAKER,VARIANTI2F)
-
 
 # END OF IMAKER_ROFS4.MK
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imaker/src/imaker_smr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,127 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: iMaker SMR image configuration
+#
+
+
+
+###############################################################################
+#  ___ __  __ ___
+# / __|  \/  | _ \
+# \__ \ |\/| |   /
+# |___/_|  |_|_|_\
+#
+
+SMR_TITLE  = SMR
+SMR_DIR    = $(CORE_DIR)/smr
+SMR_NAME   = $(NAME)
+SMR_PREFIX = $(SMR_DIR)/$(SMR_NAME)
+SMR_IDIR   =
+SMR_HBY    =
+SMR_OBY    =
+SMR_OPT    = $(BLDROM_OPT) -s -D_EABI=$(ARM_VERSION)
+SMR_MSTOBY = $(SMR_PREFIX)_smr_master.oby
+SMR_HEADER =
+
+SMR_OBYGEN =
+
+SMR_IMG    = $(SMR_PREFIX).smr.img
+SMR_LOG    = $(SMR_PREFIX).smr.log
+SMR_OUTOBY = $(SMR_PREFIX).smr.oby
+
+SMR_CONECONF =
+SMR_CONEOPT  = --all-layers --impl-tag=target:smr
+
+#==============================================================================
+
+define SMR_MSTOBYINFO
+  $(call BLDROM_HDRINFO,SMR)
+
+  ROM_IMAGE 0 non-xip size=0x00000000
+
+  /* $(SMR_TITLE) header
+  */
+  $(SMR_HDRINFO)
+
+  SMR_IMAGE {
+    $(BLR.SMR.OBY)
+    imagename=$(notdir $(SMR_IMG))
+  }
+endef
+
+define SMR_HDRINFO
+  $(DEFINE) _IMAGE_WORKDIR $(SMR_DIR)
+  $(call mac2cppdef,$(BLR.SMR.OPT))
+  $(BLR.SMR.HBY)
+  $(SMR_HEADER)
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
+endef
+
+
+###############################################################################
+# SMR pre-build step
+
+CLEAN_SMRPRE =\
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(CLEAN_VARIANT) |)\
+  del | "$(SMR_MSTOBY)" | del | $(call getgenfiles,$(SMR_OBYGEN))
+
+BUILD_SMRPRE =\
+  $(if $(filter 1,$(USE_VARIANTBLD)),$(BUILD_VARIANT) |)\
+  mkdir   | "$(SMR_DIR)" |\
+  echo-q  | Generating file(s) for $(SMR_TITLE) image creation  |\
+  write-c | "$(SMR_MSTOBY)" | $(call def2str,$(SMR_MSTOBYINFO)) |\
+  $(SMR_OBYGEN)
+
+#==============================================================================
+# SMR build step
+
+BLR.SMR.IDIR = $(call dir2inc,$(SMR_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
+BLR.SMR.HBY  = $(call includeiby,$(IMAGE_HBY) $(SMR_HBY))
+BLR.SMR.OBY  = $(call includeiby,$(SMR_OBY))\
+  $(call includeiby,$(if $(filter 1,$(USE_VARIANTBLD)),$(VARIANT_OBY)) $(BLDROBY))
+BLR.SMR.OPT  = $(SMR_OPT) -o$(call pathconv,$(SMR_PREFIX)).img $(BLDROPT)
+BLR.SMR.POST =\
+  move | "$(SMR_OUTOBY).log" | $(SMR_LOG) |\
+  test | "$(SMR_IMG)"
+
+CLEAN_SMR = $(call CLEAN_BLDROM,SMR)
+BUILD_SMR = $(call BUILD_BLDROM,SMR)
+
+REPORT_SMR =\
+  $(SMR_TITLE) dir   | $(SMR_DIR) | d |\
+  $(SMR_TITLE) image | $(SMR_IMG) | f
+
+#==============================================================================
+
+SOS.SMR.STEPS = $(call iif,$(USE_SMR),\
+  $(call iif,$(SKIPPRE),,$(and $(filter 1,$(USE_VARIANTBLD)),$(call true,$(USE_CONE)),CONEGEN RESTART) SMRPRE)\
+  $(call iif,$(SKIPBLD),,SMR) $(call iif,$(SKIPPOST),,SMRPOST))
+
+ALL.SMR.STEPS = $(SOS.SMR.STEPS)
+
+
+###############################################################################
+# Targets
+
+.PHONY: smr smr-all smr-image smr-cone smr-pre
+
+smr smr%: IMAGE_TYPE = SMR
+
+smr smr-all: ;@$(call IMAKER,$$(ALL.SMR.STEPS))
+smr-image  : ;@$(call IMAKER,$$(SOS.SMR.STEPS))
+smr-cone   : ;@$(call IMAKER,CONEGEN)
+smr-pre    : ;@$(call IMAKER,SMRPRE)
+
+
+# END OF IMAKER_SMR.MK
--- a/imgtools/imaker/src/imaker_tools.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_tools.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -19,124 +19,308 @@
 ###############################################################################
 # External tools
 
-BLDROM_TOOL     = buildrom
+BLDROM_TOOL     = $(PERL) -S buildrom.pl
+FEATMAN_TOOL    = $(PERL) -S features.pl
 ROMBLD_TOOL     = rombuild
 ROFSBLD_TOOL    = rofsbuild
-MAKSYM_TOOL     = maksym
-MAKSYMROFS_TOOL = maksymrofs
+MAKSYM_TOOL     = $(PERL) -S maksym.pl
+MAKSYMROFS_TOOL = $(PERL) -S maksymrofs.pl
+ELF2E32_TOOL    = elf2e32
 IMGCHK_TOOL     = imgcheck
 INTPRSIS_TOOL   = interpretsis
 READIMG_TOOL    = readimage
 
-UNZIP_TOOL      = unzip
 ZIP_TOOL        = zip
 7ZIP_TOOL       = 7za
-FILEDISK_TOOL   = filedisk
-WINIMAGE_TOOL   = "c:/program files/winimage/winimage.exe"
+UNZIP_TOOL      = $(7ZIP_TOOL)
+
+BUILD_TOOLSET =\
+  tool-cpp          | $(CPP)           |\
+  tool-elf2e32      | $(ELF2E32_TOOL)  |\
+  tool-interpretsis | $(INTPRSIS_TOOL) |\
+  tool-opcache      | $(OPC_TOOL)      |\
+  tool-unzip        | $(UNZIP_TOOL)
+
+#==============================================================================
+
+BLDROM_JOBS =
+
+BLDROM_OPT =\
+  -loglevel1 $(call iif,$(KEEPTEMP),-p) -v $(call iif,$(USE_SYMGEN),,-nosymbols) $(addprefix -j,$(BLDROM_JOBS))\
+  $(call iif,$(USE_BLRWORKDIR),-workdir="$($(IMAGE_TYPE)_DIR)")\
+  $(call iif,$(USE_FEATVAR),-DFEATUREVARIANT=$(FEATURE_VARIANT))\
+  $(call iif,$(SYMBIAN_FEATURE_MANAGER),\
+    $(if $($(IMAGE_TYPE)_FEAXML),-fm=$(subst $( ),$(,),$(strip $($(IMAGE_TYPE)_FEAXML)))) -D__FEATURE_IBY__)\
+  $(if $(IMAGE_TYPE),-D_IMAGE_TYPE_$(IMAGE_TYPE)) $(if $(TYPE),-D_IMAGE_TYPE_$(call ucase,$(TYPE)))
+
+BLDROM_PARSE =\
+  parse   | Missing files:   | /Missing file:/i ||\
+  parse   | Errors:          | /ERROR:\|ERR :/i ||\
+  parse-4 | Erroneous links: | /WARNING: Kernel\/variant\/extension/i ||\
+  parse   | Warnings:        | /WARNING:\|WARN:/i |\
+    /WARNING: the value of attribute .+ has been overridden\|WARNING: Kernel\/variant\/extension\|Warning: Can't open .+\.map/i
+
+#  parse   | Can't locate:    | /Can't locate\|couldn't be located/i |
+#Unrecognised option -NO-HEADER0
+
+# For passing extra parameters (from command line)
+BLDROPT =
+BLDROBY =
 
 #==============================================================================
 
-BLDROM_OPT =\
-  -loglevel1 $(call iif,$(KEEPTEMP),-p) -v -nosymbols\
-  $(call iif,$(USE_FEATVAR),-DFEATUREVARIANT=$(FEATURE_VARIANT))\
-  $(if $(IMAGE_TYPE),-D_IMAGE_TYPE_$(IMAGE_TYPE)) $(if $(TYPE),-D_IMAGE_TYPE_$(call ucase,$(TYPE)))
+DEFHRH_IDIR = . $($(IMAGE_TYPE)_IDIR) $(FEATVAR_IDIR)
+DEFHRH_CMD  = $(CPP) -nostdinc -undef -dM -D_IMAGE_INCLUDE_HEADER_ONLY\
+  $(call dir2inc,$(DEFHRH_IDIR)) -include $(call upddrive,$(FEATVAR_HRH)) $(call updoutdrive,$($(IMAGE_TYPE)_MSTOBY)) \|\
+  $(PERL) -we $(call iif,$(USE_UNIX),',")print(sort({lc($$a) cmp lc($$b)} <STDIN>))$(call iif,$(USE_UNIX),',")\
+    >>$($(IMAGE_TYPE)_DEFHRH)
+
+define DEFHRH_HDRINFO
+  // Generated file for documenting feature variant definitions
+  //
+  // Filename: $($(IMAGE_TYPE)_DEFHRH)
+  // Command : $(DEFHRH_CMD)
+endef
+
+CLEAN_DEFHRH = del | "$($(IMAGE_TYPE)_DEFHRH)"
+BUILD_DEFHRH =\
+  $(if $($(IMAGE_TYPE)_DEFHRH),\
+    write | "$($(IMAGE_TYPE)_DEFHRH)" | $(call def2str,$(DEFHRH_HDRINFO))\n\n |\
+    cmd   | $(DEFHRH_CMD))
+
+#==============================================================================
 
-BLDROM_PARSE =\
-  parse | \nMissing file(s):\n | Missing file: |\
-  parse | \nWarning(s):\n      | /WARNING:\|WARN:/i |\
-  parse | \nError(s):\n        | /ERROR:\|ERR :/i   |\
-  parse | \nCan$'t locate:\n | Can$'t locate | parse | \ncouldn$'t be located:\n | couldn$'t be located
+FEATMAN_OPT = $($(IMAGE_TYPE)_FEAXML) --ibyfile=$($(IMAGE_TYPE)_DIR) --verbose
+FEATMAN_CMD = $(FEATMAN_TOOL) $(FEATMAN_OPT)
+
+CLEAN_FEATMAN = del | $(foreach file,$($(IMAGE_TYPE)_FEAIBY),"$(file)")
+BUILD_FEATMAN =\
+  $(call iif,$(SYMBIAN_FEATURE_MANAGER),$(if $($(IMAGE_TYPE)_FEAXML),\
+    echo-q | Generating Feature manager file(s) |\
+    write  | $($(IMAGE_TYPE)_FEAIBY) | |\
+    cmd    | $(FEATMAN_CMD)))
 
-#* Writing tmp7.oby - result of problem-suppression phase
-#Can't open \epoc32\release\ARMV5\urel\apgrfx.dll.map
-#Unrecognised option -NO-HEADER0
+#==============================================================================
+# ROFS symbol generation
+
+MAKSYMROFS_CMD = $(MAKSYMROFS_TOOL) $(call pathconv,"$($(IMAGE_TYPE)_LOG)" "$($(IMAGE_TYPE)_SYM)")
 
-# For passing extra paramters (from command line)
-BLDROPT =
-BLDROBY =
+CLEAN_MAKSYMROFS = del | "$($(IMAGE_TYPE)_SYM)"
+BUILD_MAKSYMROFS =\
+  echo-q | Creating $($(IMAGE_TYPE)_TITLE) symbol file |\
+  cmd    | $(MAKSYMROFS_CMD)
+
+REPORT_MAKSYMROFS = $($(IMAGE_TYPE)_TITLE) symbols | $($(IMAGE_TYPE)_SYM) | f
 
 
 ###############################################################################
-# S60 Configuration Tool CLI
+# ConE
+
+USE_CONE = 0
+
+CONE_TOOL    = $(call iif,$(USE_UNIX),,call )cone
+CONE_TOOLDIR = $(or $(wildcard $(E32TOOLS)/configurationengine),$(E32TOOLS)/cone)
+CONE_OUTDIR  = $(OUTTMPDIR)/cone
+CONE_PRJ     = $(CONFIGROOT)
+CONE_CONF    = $($(IMAGE_TYPE)_CONECONF)
+CONE_RNDCONF = $(COREPLAT_NAME)/$(PRODUCT_NAME)/rnd/root.confml
+CONE_ADDCONF = $(call select,$(TYPE),rnd,$(if $(wildcard $(CONE_PRJ)/$(CONE_RNDCONF)),$(CONE_RNDCONF)))
+CONE_LOG     = $($(or $(addsuffix _,$(IMAGE_TYPE)),WORK)PREFIX)_cone_$(call substm,* / : ? \,@,$(TARGET)).log
+CONE_VERBOSE = $(if $(filter debug 127,$(VERBOSE)),5)
+CONE_GOPT    = generate --project="$(CONE_PRJ)"\
+  $(if $(CONE_CONF),--configuration="$(CONE_CONF)") $(addprefix --add=,$(CONE_ADDCONF))\
+  $(if $(CONE_LOG),--log-file="$(CONE_LOG)") $(addprefix --verbose=,$(CONE_VERBOSE))
+CONE_PARSE   = parse-2 | ConE errors: | /ERROR\s*:/i |
+
+#==============================================================================
 
-CONFT_TOOL    = cli.cmd
-CONFT_TOOLDIR = $(or $(wildcard /s60/tools/toolsextensions/ConfigurationTool),/ext/tools/toolsextensions/ConfigurationTool)
+CONE_MK    = $(if $(CONE_PRJ),$(CONE_PRJ).mk)
+CONE_MKOPT = $(CONE_GOPT) --impl=imaker.* --all-layers --set=imaker.makefilename="$(CONE_MK)" --output=.
+CONE_MKCMD = $(CONE_TOOL) $(CONE_MKOPT)
+
+CLEAN_CONEPRE = del | "$(CONE_MK)" "$(CONE_LOG)"
+BUILD_CONEPRE =\
+  echo-q | Creating ConE makefile `$(CONE_MK)' |\
+  cmd    | $(CONE_MKCMD) | $(CONE_PARSE) |\
+  test   | "$(CONE_MK)"
+
+#==============================================================================
+
+CONE_IMPLS       =
+CONE_IMPLOPT     = $(addprefix --impl=,$(subst $(,), ,$(CONE_IMPLS)))
+CONE_LAYERS      =
+CONE_LAYEROPT    = $(addprefix --layer=,$(subst $(,), ,$(CONE_LAYERS)))
+CONE_REPFILE     = $(basename $(CONE_LOG)).html
+CONE_REPDATADIR  = $(OUTDIR)/cone-repdata
+CONE_REPDATAFILE = $(CONE_REPDATADIR)/$(IMAGE_TYPE).dat
+CONE_RTMPLFILE   =
+
+CONE_GENOPT = $(CONE_GOPT)\
+  $(CONE_IMPLOPT) $(CONE_LAYEROPT) --add-setting-file=imaker_variantdir.cfg\
+  $(if $(CONE_REPFILE),$(call select,$(USE_CONE),mk,--report-data-output="$(CONE_REPDATAFILE)",--report="$(CONE_REPFILE)"))\
+  $($(IMAGE_TYPE)_CONEOPT) --output="$(CONE_OUTDIR)"
+CONE_GENCMD = $(CONE_TOOL) $(CONE_GENOPT)
 
-CONFT_DIR     = $(WORKDIR)/ct
-CONFT_TMPDIR  = $(CONFT_DIR)/_temp
-CONFT_CFGNAME = variant
-CONFT_CONFML  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_CONFML),$(WORKDIR)/$(CONFT_CFGNAME).confml)
-CONFT_IMPL    = $(CONFIGROOT)/confml_data/s60;$(CONFIGROOT)/confml_data/customsw
-CONFT_IBYML   = $(CONFT_TOOLDIR)/ibyml
-CONFT_OUTDIR  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(CONFT_DIR)/cenrep)
-CONFT_CRLOG   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_PREFIX)_,$(CONFT_DIR))cenrep.log
-CONFT_ECLCONF = -configuration $(CONFT_TMPDIR) -data $(CONFT_TMPDIR)
-CONFT_CONF    = $(CONFT_ECLCONF)\
-  -master $(CONFT_CONFML) -impl $(CONFT_IMPL) $(if $(CONFT_IBYML),-ibyml $(CONFT_IBYML)) -output $(CONFT_DIR)\
-  -report $(CONFT_CRLOG) -ignore_errors
-CONFT_CONFCP  = $(call iif,$(USE_VARIANTBLD),$(VARIANT_CONFCP),$(CONFT_CFGNAME))
+CLEAN_CONEGEN = del | "$(CONE_LOG)" "$(CONE_REPFILE)" | deldir | "$(CONE_OUTDIR)"
+BUILD_CONEGEN =\
+  echo-q | Generating $($(IMAGE_TYPE)_TITLE) content with ConE |\
+  mkdir  | "$(CONE_OUTDIR)" |\
+  cmd    | $(CONE_GENCMD)   | $(CONE_PARSE)
+
+REPORT_CONEGEN =\
+  ConE log | $(CONE_LOG) | f\
+  $(if $(CONE_REPFILE),| ConE report | $(CONE_REPFILE) | f)
+
+#==============================================================================
+
+CLEAN_CONEREPPRE = deldir | "$(CONE_REPDATADIR)"
+BUILD_CONEREPPRE =
+
+CONE_REPGENOPT =\
+  report --input-data-dir="$(CONE_REPDATADIR)"\
+  $(if $(CONE_RTMPLFILE),--template="$(CONE_RTMPLFILE)")\
+  --report="$(CONE_REPFILE)" --log-file="$(CONE_LOG)" $(addprefix --verbose=,$(CONE_VERBOSE))
+CONE_REPGENCMD = $(CONE_TOOL) $(CONE_REPGENOPT)
 
-CONFT_CMD     = $(CONFT_TOOL) $(CONFT_CONF)
-CONFT_PARSE   = parse | \nWarnings, errors and problems:\n | /warning:\|error:\|problem/i
+CLEAN_CONEREPGEN = del | "$(CONE_REPFILE)"
+BUILD_CONEREPGEN = $(if $(CONE_REPFILE),\
+  echo-q | Generating report with ConE to `$(CONE_REPFILE)' |\
+  cmd    | $(CONE_REPGENCMD))
+
+REPORT_CONEREPGEN = $(if $(CONE_REPFILE),ConE report | $(CONE_REPFILE) | f)
 
-CLEAN_CENREP =\
-  del    | $(CONFT_CRLOG) |\
-  deldir | "$(CONFT_DIR)" "$(CONFT_TMPDIR)" $(call iif,$(USE_VARIANTBLD),,"$(CONFT_OUTDIR)")
+#==============================================================================
+
+CONE_XCF = $(ICDP_XCF)
+
+CONE_XCFOPT = $(CONE_GOPT) --impl=xcf.gcfml --all-layers --output="$(dir $(CONE_XCF))"
+CONE_XCFCMD = $(CONE_TOOL) $(CONE_XCFOPT)
 
-BUILD_CENREP =\
-  echo-q | Calling S60 Configuration Tool |\
-  mkcd   | $(CONFT_DIR) |\
-  deldir | $(CONFT_TMPDIR) |\
-  cmd    | $(CONFT_CMD) | $(CONFT_PARSE) |\
-  $(foreach dir,$(CONFT_CONFCP),\
-    finddir | $(CONFT_DIR)/$(dir) | * | |\
-    copy    | __find__ | $(CONFT_OUTDIR) |)\
-  $(call iif,$(KEEPTEMP),,deldir | $(CONFT_TMPDIR))
+CLEAN_CONEXCF = del | "$(CONE_XCF)" "$(CONE_LOG)"
+BUILD_CONEXCF =\
+  echo-q | Creating XCF file `$(CONE_XCF)' |\
+  cmd    | $(CONE_XCFCMD) | $(CONE_PARSE)  |\
+  test   | "$(CONE_XCF)"
+
+#==============================================================================
+
+.PHONY: cone-pre cone-gen cone-rep-pre cone-rep-gen
+
+cone-pre: ;@$(call IMAKER,CONEPRE)
+cone-gen: ;@$(call IMAKER,CONEGEN)
+cone-rep-pre: ;@$(call IMAKER,CONEREPPRE)
+cone-rep-gen: ;@$(call IMAKER,CONEREPGEN)
 
 
 ###############################################################################
-# Interpretsis
+# SIS pre-installation
+
+SISINST_INI    = $(wildcard $(VARIANT_DIR)/sis_config.ini)
+SISINST_DIR    = $(VARIANT_SISDIR)
+SISINST_OUTDIR = $(VARIANT_OUTDIR)
+SISINST_CFGINI = $(IMAGE_PREFIX)_sis.ini
+SISINST_LOG    = $(IMAGE_PREFIX)_sis.log
+SISINST_CONF   = -d $(if $(filter Z z,$(or $($(IMAGE_TYPE)_DRIVE),Z)),C,$($(IMAGE_TYPE)_DRIVE)) -e -k 5.4 -s "$(SISINST_DIR)"
+SISINST_HALHDA =
+
+# sf/os/kernelhwsrv/halservices/hal/inc/hal_data.h:
+define SISINST_HALINFO
+  EManufacturer_Ericsson          0x00000000
+  EManufacturer_Motorola          0x00000001
+  EManufacturer_Nokia             0x00000002
+  EManufacturer_Panasonic         0x00000003
+  EManufacturer_Psion             0x00000004
+  EManufacturer_Intel             0x00000005
+  EManufacturer_Cogent            0x00000006
+  EManufacturer_Cirrus            0x00000007
+  EManufacturer_Linkup            0x00000008
+  EManufacturer_TexasInstruments  0x00000009
 
-SISINST_DIR    = $(WORKDIR)/sisinst
-SISINST_SISDIR = $(call iif,$(USE_VARIANTBLD),$(VARIANT_SISDIR))
-SISINST_OUTDIR = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(SISINST_DIR)/output)
-#SISINST_ZDIR   = $(SISINST_DIR)/z_drive
-SISINST_ZDIR   = $(EPOC32)/data/Z
+  EDeviceFamily_Crystal         0
+  EDeviceFamily_Pearl           1
+  EDeviceFamily_Quartz          2
+
+  ECPU_ARM                      0
+  ECPU_MCORE                    1
+  ECPU_X86                      2
+
+  ECPUABI_ARM4                  0
+  ECPUABI_ARMI                  1
+  ECPUABI_THUMB                 2
+  ECPUABI_MCORE                 3
+  ECPUABI_MSVC                  4
+  ECPUABI_ARM5T                 5
+  ECPUABI_X86                   6
+
+  ESystemStartupReason_Cold     0
+  ESystemStartupReason_Warm     1
+  ESystemStartupReason_Fault    2
+
+  EKeyboard_Keypad              0x1
+  EKeyboard_Full                0x2
 
-SISINST_HALINI = $(wildcard $(PRODUCT_DIR)/interpretsis.ini)
-SISINST_CONF   = -w info -z $(SISINST_ZDIR) $(if $(SISINST_HALINI),-i $(SISINST_HALINI)) -c $(SISINST_OUTDIR) -s $(SISINST_SISDIR)
-SISINST_CMD    = $(INTPRSIS_TOOL) $(SISINST_CONF)
-SISINST_PARSE  =\
-  parse | \nWarning(s):\n | /^WARN:/ |\
-  parse | \nError(s):\n   | /^ERR :/
+  EMouseState_Invisible         0
+  EMouseState_Visible           1
 
-#CLEAN_SISINSTPRE = deldir | $(SISINST_ZDIR)
-#BUILD_SISINSTPRE =\
-#  mkdir | $(SISINST_ZDIR) |\
-#  $(foreach img,$(ROM_IMG) $(foreach rofs,1 2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),$(ROFS$(rofs)_IMG))),\
-#    cmd | $(READIMG_TOOL) -z $(SISINST_ZDIR) $(img) |)
+  EMachineUid_Series5mx         0x1000118a
+  EMachineUid_Brutus            0x10005f60
+  EMachineUid_Cogent            0x10005f61
+  EMachineUid_Win32Emulator     0x10005f62
+  EMachineUid_WinC              0x10005f63
+  EMachineUid_CL7211_Eval       0x1000604f
+  EMachineUid_LinkUp            0x00000000
+  EMachineUid_Assabet           0x100093f3
+  EMachineUid_Zylonite          0x101f7f27
+  EMachineUid_IQ80310           0x1000a681
+  EMachineUid_Lubbock           0x101f7f26
+  EMachineUid_Integrator        0x1000AAEA
+  EMachineUid_Helen             0x101F3EE3
+  EMachineUid_X86PC             0x100000ad
+  EMachineUid_OmapH2            0x1020601C
+  EMachineUid_OmapH4            0x102734E3
+  EMachineUid_NE1_TB            0x102864F7
+  EMachineUid_EmuBoard          0x1200afed
+  EMachineUid_OmapH6            0x10286564
+  EMachineUid_OmapZoom          0x10286565
+  EMachineUid_STE8500           0x101FF810
 
-CLEAN_SISINST = deldir | "$(SISINST_DIR)" $(call iif,$(USE_VARIANTBLD),,"$(SISINST_OUTDIR)")
+  EPowerBatteryStatus_Zero      0
+  EPowerBatteryStatus_Replace   1
+  EPowerBatteryStatus_Low       2
+  EPowerBatteryStatus_Good      3
+
+  EPowerBackupStatus_Zero       0
+  EPowerBackupStatus_Replace    1
+  EPowerBackupStatus_Low        2
+  EPowerBackupStatus_Good       3
+endef
+
+define SISINST_CFGINFO
+  $(foreach lang,$(LANGPACK_LANGIDS),
+    DEVICE_SUPPORTED_LANGUAGE = $(lang))
+endef
+
+CLEAN_SISINST = del | "$(SISINST_CFGINI)" "$(SISINST_LOG)"
 BUILD_SISINST =\
-  echo-q | Installing SIS |\
-  mkdir  | $(SISINST_OUTDIR) |\
-  cmd    | $(SISINST_CMD) | $(SISINST_PARSE)
+  echo-q  | Installing SIS file(s) |\
+  sisinst | $(SISINST_INI) | $(SISINST_CFGINI) | $(SISINST_CONF)  |\
+    $(SISINST_HALHDA) | $(strip $(call def2str,$(SISINST_HALINFO) | $(SISINST_CFGINFO))) |\
+    $(SISINST_OUTDIR) | $(SISINST_LOG)
 
 
 ###############################################################################
 # Operator Cache Tool
 
-OPC_TOOL     = $(ITOOL_DIR)/opcache_tool.py
-OPC_CONF     = -u $(OPC_URL) -e $(OPC_EXPDATE) -m $(OPC_MMAPFILE) -i $(OPC_RAWDIR) -o $(OPC_OUTDIR)/$(OPC_CACHEDIR)
-OPC_CMD      = $(PYTHON) $(OPC_TOOL) $(OPC_CONF)
-OPC_DIR      = $(WORKDIR)/opcache
-OPC_RAWDIR   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OPCDIR))
-OPC_OUTDIR   = $(call iif,$(USE_VARIANTBLD),$(VARIANT_OUTDIR),$(OPC_DIR)/output)
-OPC_CACHEDIR = cache
-OPC_MMAPFILE = $(OPC_DIR)/mimemap.dat
-
+OPC_TOOL     = $(PYTHON) $(ITOOL_DIR)/opcache_tool.py
+OPC_INI      = $(wildcard $(VARIANT_DIR)/opcache_config.ini)
+OPC_DIR      = $(VARIANT_OPCDIR)
+OPC_OUTDIR   = $(VARIANT_OUTDIR)/$(OPC_CACHEDIR)
+OPC_TMPDIR   = $(OUTTMPDIR)/opcache
+OPC_CACHEDIR = system/cache/op
 OPC_URL      = http://www.someoperator.com/Cache_OpCache
-OPC_EXPDATE  = 3
+OPC_EXPDATE  = 2012-01-01
+OPC_MIMEFILE = $(IMAGE_PREFIX)_opcachemime.dat
+OPC_CONF     = -u "$(OPC_URL)" -e "$(OPC_EXPDATE)" -m "$(OPC_MIMEFILE)" -i "$(OPC_DIR)" -o "$(OPC_OUTDIR)"
 
 define OPC_MIMEMAP
   .bmp:   image/bmp
@@ -159,30 +343,12 @@
   .xhtml: application/xhtml+xml
 endef
 
-CLEAN_OPCACHE = del | $(OPC_MMAPFILE) | deldir | "$(OPC_DIR)" $(call iif,$(USE_VARIANTBLD),,"$(OPC_OUTDIR)")
+CLEAN_OPCACHE = del | "$(OPC_MIMEFILE)"
 BUILD_OPCACHE =\
-  echo-q | Creating Operator Cache content |\
-  write  | $(OPC_MMAPFILE) |\
-    $(call def2str,\# Generated `$(OPC_MMAPFILE)$' for Operator Cache content creation$(\n)$(\n)$(OPC_MIMEMAP)) |\
-  test   | $(OPC_RAWDIR)/* |\
-  mkdir  | $(OPC_OUTDIR)/$(OPC_CACHEDIR) |\
-  cmd    | $(OPC_CMD)
-
-
-###############################################################################
-# Widget Pre-installation
-
-WIDGET_WGZIP   = $(WORKDIR)/*.wgz
-WIDGET_WGZDIR  = $(EPOC32)/release/winscw/udeb/z/data/WidgetBURTemp
-WIDGET_WGZIBY  = $(E32ROMINC)/widgetbackupfiles.iby
-WIDGET_WGZPXML = Info.plist
-
-CLEAN_WGZPREINST = del | $(WIDGET_WGZIBY) | deldir | $(WIDGET_WGZDIR)
-BUILD_WGZPREINST =\
-  echo-q   | Widget Pre-installation |\
-  echo-q   | Unzip $(WIDGET_WGZIP) file(s) to $(WIDGET_WGZDIR), generating $(WIDGET_WGZIBY) |\
-  wgunzip  | $(WIDGET_WGZIP) | $(WIDGET_WGZDIR) | $(WIDGET_WGZPXML) |\
-  geniby-r | $(WIDGET_WGZIBY) | $(WIDGET_WGZDIR) | * | data="%1" "data/WidgetBURTemp/%2" | end
+  echo-q  | Creating Operator Cache content |\
+  mkdir   | "$(OPC_OUTDIR)"   |\
+  write   | "$(OPC_MIMEFILE)" | $(call def2str,$(OPC_MIMEMAP))\n |\
+  opcache | $(OPC_INI) | $(OPC_CONF) | $(OPC_TMPDIR)
 
 
 ###############################################################################
@@ -226,28 +392,276 @@
 ###############################################################################
 # Image to files; extract files from .img using Readimage tool
 
-I2FILE_DIR = $(WORKDIR)/img2file
+CLEAN_I2FILE = deldir | "$($(IMAGE_TYPE)_I2FDIR)"
+BUILD_I2FILE =\
+  echo-q | Extracting files from $($(IMAGE_TYPE)_TITLE) SOS image to $($(IMAGE_TYPE)_I2FDIR) |\
+  mkcd   | "$($(IMAGE_TYPE)_I2FDIR)" |\
+  $(foreach img,$($(IMAGE_TYPE)_IMG),\
+    cmd  | $(READIMG_TOOL) -s $(img)   |\
+    cmd  | $(READIMG_TOOL) -z . $(img) |)
+
+
+###############################################################################
+# Rofsbuild FAT
+
+ROFSBLD_FATOPT = -datadrive="$($(IMAGE_TYPE)_OUTOBY)" $(addprefix -j,$(BLDROM_JOBS)) $(call iif,$(KEEPGOING),-k) -loglevel2 -slog
+
+CLEAN_ROFSBLDFAT = del | "$($(IMAGE_TYPE)_LOG)"
+BUILD_ROFSBLDFAT =\
+  cmd  | $(ROFSBLD_TOOL) $(ROFSBLD_FATOPT) |\
+  move | "$($(IMAGE_TYPE)_OUTOBY).log" | $($(IMAGE_TYPE)_LOG)
+
+
+###############################################################################
+# Filedisk
+
+FILEDISK_TOOL  = filedisk
+FILEDISK_OPT   = /mount 0 $(call peval,GetAbsFname($(call pquote,$($(IMAGE_TYPE)_IMG)),1)) $(call peval,$$iVar[0] = GetFreeDrive())
+FILEDISK_SLEEP = 1
 
-CLEAN_COREI2F = deldir | $(CORE_I2FDIR)
-BUILD_COREI2F = $(call _buildi2file,CORE,$(CORE_I2FDIR),$(ROM_IMG) $(call iif,$(USE_ROFS1),$(ROFS1_IMG)))
+CLEAN_FILEDISK = del | "$($(IMAGE_TYPE)EMPTY_IMG)"
+BUILD_FILEDISK =\
+  $(if $($(IMAGE_TYPE)EMPTY_CMD),\
+    cmd   | $($(IMAGE_TYPE)EMPTY_CMD) |\
+    move  | "$($(IMAGE_TYPE)EMPTY_IMG)" | $($(IMAGE_TYPE)_IMG) |)\
+  cmd     | $(FILEDISK_TOOL) $(FILEDISK_OPT) |\
+  copydir | "$($(IMAGE_TYPE)_DATADIR)" | $(call peval,$$iVar[0])/ |\
+  cmd     | $(FILEDISK_TOOL) /status $(call peval,$$iVar[0]) |\
+  sleep   | $(FILEDISK_SLEEP) |\
+  cmd     | $(FILEDISK_TOOL) /umount $(call peval,$$iVar[0])
+
+
+###############################################################################
+# WinImage
+
+WINIMAGE_TOOL = "c:/program files/winimage/winimage.exe"
+WINIMAGE_OPT  = $(call pathconv,$($(IMAGE_TYPE)_IMG)) /i $(call pathconv,$($(IMAGE_TYPE)_DATADIR)) /h /q
+
+CLEAN_WINIMAGE = del | "$($(IMAGE_TYPE)EMPTY_IMG)"
+BUILD_WINIMAGE =\
+  $(if $($(IMAGE_TYPE)EMPTY_CMD),\
+    cmd  | $($(IMAGE_TYPE)EMPTY_CMD) |\
+    move | "$($(IMAGE_TYPE)EMPTY_IMG)" | $($(IMAGE_TYPE)_IMG) |)\
+  cmd | $(WINIMAGE_TOOL) $(WINIMAGE_OPT)
+
+
+###############################################################################
+# Widget Pre-installation
 
-CLEAN_VARIANTI2F = $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),deldir | $(ROFS$(rofs)_I2FDIR) |))
-BUILD_VARIANTI2F =\
-  $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),\
-    $(call _buildi2file,ROFS$(rofs),$(ROFS$(rofs)_I2FDIR),$(ROFS$(rofs)_IMG))))
+WIDGET_TOOLDIR = $(E32TOOLS)/widget_tools
+WIDGET_TOOL    = $(WIDGET_TOOLDIR)/widgetpreinstaller/installwidgets.pl
+WIDGET_DIR     = $(VARIANT_WGZDIR)
+WIDGET_TMPDIR  = $(OUTTMPDIR)/widget
+WIDGET_OUTDIR  = $(VARIANT_OUTDIR)
+WIDGET_IDIR    = $(WIDGET_DIR) $(VARIANT_DIR) $(FEATVAR_IDIR)
+WIDGET_INI     = $(call findfile,widget_config.ini,$(WIDGET_IDIR),1)
+WIDGET_CFGINI  = $(IMAGE_PREFIX)_widget.ini
+WIDGET_LANGOPT = $(LANGPACK_DEFLANGID)
+WIDGET_OPT     = -verbose $(if $(filter debug 127,$(VERBOSE)),-debug) -epocroot "$(WIDGET_TMPDIR)" $(call iif,$(WIDGET_LANGOPT),-localization $(WIDGET_LANGOPT))
+WIDGET_CMD     = $(PERL) $(WIDGET_TOOL) $(WIDGET_OPT) "$(WIDGET_CFGINI)"
+
+define WIDGET_HDRINFO
+  # Generated configuration file for Widget pre-installation
+  #
+  # Filename: $(WIDGET_CFGINI)
+  # Command : $(WIDGET_CMD)
+
+  $(if $(WIDGET_INI),,[drive-$(call lcase,$($(IMAGE_TYPE)_DRIVE))])
+endef
+
+WIDGET_HSINI     = $(IMAGE_PREFIX)_hsplugin.ini
+WIDGET_HSCINI    = $(IMAGE_PREFIX)_hsplugincwrt.ini
+WIDGET_HSOPT     = "$(WIDGET_TMPDIR)" "$(WIDGET_HSINI)"
+WIDGET_HSCOPT    = "$(WIDGET_TMPDIR)" "$(WIDGET_HSCINI)"
+WIDGET_HSCMD     = $(call iif,$(USE_UNIX),,call )$(WIDGET_TOOLDIR)/hspluginpreinstaller/HSPluginPreInstaller $(WIDGET_HSOPT)
+WIDGET_HSCCMD    = $(call iif,$(USE_UNIX),,call )$(WIDGET_TOOLDIR)/hspluginpreinstaller/HSPluginPreInstaller $(WIDGET_HSCOPT)
+
+WIDGET_HSVIEWDIR = $(if $(VARIANT_CPDIR),$(wildcard $(subst \,/,$(VARIANT_CPDIR))/private/200159c0/install))
+WIDGET_HSWIDEDIR = $(E32DATAZ)/private/200159c0/install/wideimage_2001f489
+WIDGET_HSOUTDIR  = $(subst \,/,$(WIDGET_OUTDIR))/private/200159c0/install
+
+define WIDGET_HSINFO
+  # Generated configuration file for Home Screen plugin pre-installation for$(if $1, $1) widgets
+  #
+  # Filename: $(WIDGET_HS$(if $1,C)INI)
+  # Command : $(WIDGET_HS$(if $1,C)CMD)
+
+  WIDGET_REGISTRY_PATH=$(subst \,/,$(WIDGET_OUTDIR))/private/10282f06/$1WidgetEntryStore.xml
+
+  VIEW_CONFIGURATION_PATH=$(WIDGET_HSVIEWDIR)
+
+  WIDEIMAGE_PATH=$(WIDGET_HSWIDEDIR)
+
+  OUTPUT_DIR=$(WIDGET_HSOUTDIR)
+endef
+
+CLEAN_WIDGET =\
+  del    | "$(WIDGET_CFGINI)" "$(WIDGET_HSINI)" "$(WIDGET_HSCINI)" |\
+  deldir | "$(WIDGET_TMPDIR)"
+
+BUILD_WIDGET =\
+  echo-q  | Installing widget(s) |\
+  genwgzcfg | $(WIDGET_CFGINI) | $(WIDGET_INI) | $(WIDGET_DIR) | $(call def2str,$(WIDGET_HDRINFO)) |\
+  $(and $(WIDGET_HSINFO),$(WIDGET_HSVIEWDIR),\
+    write | "$(WIDGET_HSINI)"  | $(call def2str,$(call WIDGET_HSINFO))\n |\
+    write | "$(WIDGET_HSCINI)" | $(call def2str,$(call WIDGET_HSINFO,CWRT))\n |)\
+  mkdir   | "$(WIDGET_TMPDIR)" |\
+  cmd     | (cd $(call pathconv,$(WIDGET_TMPDIR))) & $(WIDGET_CMD) |\
+  copydir | "$(WIDGET_TMPDIR)/epoc32/$(if $(filter CORE ROFS%,$(IMAGE_TYPE)),release/winscw/udeb/z,winscw/?)" |\
+    $(WIDGET_OUTDIR) |\
+  $(and $(WIDGET_HSINFO),$(WIDGET_HSVIEWDIR),\
+    mkdir | "$(WIDGET_HSOUTDIR)" |\
+    cmd   | $(WIDGET_HSCMD)  |\
+    cmd   | $(WIDGET_HSCCMD) |)\
+  $(call iif,$(KEEPTEMP),,deldir | "$(WIDGET_TMPDIR)")
+
+
+###############################################################################
+# Data package 2.0 creation / iCreatorDP
+
+#USE_DPGEN = 0
 
-CLEAN_I2FILE = deldir | $(I2FILE_DIR) | $(CLEAN_COREI2F) | $(CLEAN_VARIANTI2F)
-BUILD_I2FILE =\
-  $(BUILD_COREI2F) | $(BUILD_VARIANTI2F) |\
-  copy | $(CORE_I2FDIR)/* | $(I2FILE_DIR) |\
-  $(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),copy | $(ROFS$(rofs)_I2FDIR)/* | $(I2FILE_DIR) |))
+ICDP_TOOL    = iCreatorDP.py
+ICDP_TOOLDIR = $(EPOC_ROOT)/iCreatorDP
+ICDP_OPT     = --xcfs="$(ICDP_XCF)" --wa="$(ICDP_WRKDIR)" --ba="$(ICDP_BLDDIR)" --i="$(ICDP_IMGDIR)" --build
+ICDP_OUTDIR  = $(EPOC_ROOT)/output
+ICDP_XCF     = $(ICDP_OUTDIR)/griffin.xcf
+ICDP_WRKDIR  = $(ICDP_OUTDIR)/DP_WA
+ICDP_BLDDIR  = $(ICDP_OUTDIR)/DP_OUT
+ICDP_IMGDIR  = $(ICDP_OUTDIR)/images
+ICDP_VPLDIR  = $(ICDP_OUTDIR)/VPL
+ICDP_CMD     = $(PYTHON) $(ICDP_TOOL) $(ICDP_OPT)
+
+ICDP_CUSTIMG = $(ICDP_IMGDIR)/customer.fpsx
+ICDP_UDAIMG  = $(ICDP_IMGDIR)/customer_uda.fpsx
+
+#ICDP_IMGLIST = "$(ICDP_IMGDIR)/customer.fpsx" "$(ICDP_IMGDIR)/customer_uda.fpsx"
+
+CLEAN_DPPRE = $(CLEAN_CONEXCF) | del | "$(ICDP_CUSTIMG)"
+BUILD_DPPRE =\
+  $(BUILD_CONEXCF) |\
+  echo-q | Copying images |\
+  mkdir  | "$(ICDP_IMGDIR)" |\
+  copy   | "$(ROFS3_FLASH)" | $(ICDP_CUSTIMG) |\
+#  copy   | $(UDA_FLASH) | $(ICDP_UDAIMG)
+
+CLEAN_DPBLD = deldir | "$(ICDP_BLDDIR)"
+BUILD_DPBLD =\
+  echo-q | Generating data package |\
+  cd     | "$(ICDP_TOOLDIR)" |\
+  cmd    | $(ICDP_CMD)
+
+CLEAN_DPPOST = deldir | "$(ICDP_VPLDIR)"
+BUILD_DPPOST =\
+  find-r | "$(ICDP_BLDDIR)" | *.zip | |\
+  unzip  | __find__ | $(ICDP_VPLDIR)
+
+#==============================================================================
+
+.PHONY: datapack datapack-pre
+
+datapack    : ;@$(call IMAKER,$$(call iif,$$(SKIPPRE),,DPPRE) $$(call iif,$$(SKIPBLD),,DPBLD) $$(call iif,$$(SKIPPOST),,DPPOST))
+datapack-pre: ;@$(call IMAKER,DPPRE)
+
+
+###############################################################################
+# Data package copying functionality for Griffin
+
+#DP_SRCDIR   = $(EPOC_ROOT)/output/images
+DP_CORESRC  =
+DP_LANGSRC  =
+DP_CUSTSRC  =
+DP_UDASRC   =
+DP_DCPSRC   =
+DP_VPLSRC   =
+DP_SIGNSRC  =
+
+DP_OUTDIR   = $(EPOC_ROOT)/output/VPL
+DP_CORETGT  = $(DP_OUTDIR)/core.fpsx
+DP_LANGTGT  = $(DP_OUTDIR)/lang.fpsx
+DP_CUSTTGT  = $(DP_OUTDIR)/customer.fpsx
+DP_UDATGT   = $(DP_OUTDIR)/uda.fpsx
+DP_DCPTGT   = $(DP_OUTDIR)/carbidev.dcp
+DP_VPLTGT   = $(DP_OUTDIR)/carbidev.vpl
+DP_SIGNTGT  = $(DP_OUTDIR)/carbidev_signature.bin
 
-_buildi2file =\
-  echo-q | Extracting files from $($1_TITLE) SOS image to $2 |\
-  mkcd   | $2 |\
-  $(foreach img,$3,\
-    cmd | $(READIMG_TOOL) -s $(img)   |\
-    cmd | $(READIMG_TOOL) -z . $(img) |)
+DP_MK    = $(OUTPREFIX)_dpcopy.mk
+DP_MKLOG = $(basename $(DP_MK))_cone.log
+DP_MKOPT =\
+  generate --project="$(CONE_PRJ)" $(if $(CONE_CONF),--configuration="$(CONE_CONF)")\
+  --impl=dp.makeml --all-layers --set=imaker.makefilename="$(DP_MK)"\
+  --log-file="$(DP_MKLOG)" $(addprefix --verbose=,$(CONE_VERBOSE))
+DP_MKCMD = $(CONE_TOOL) $(DP_MKOPT)
+
+CLEAN_DPCOPYPRE = del | "$(DP_MK)" "$(DP_MKLOG)"
+BUILD_DPCOPYPRE =\
+  echo-q | Generating makefile `$(DP_MK)' for Data Package copy |\
+  cmd    | $(DP_MKCMD) |\
+  test   | "$(DP_MK)"
+
+CLEAN_DPCOPY = deldir | "$(DP_OUTDIR)"
+
+BUILD_DPCOPY =\
+  echo-q | Copying Data Package contents |\
+  mkdir  | "$(DP_OUTDIR)" |\
+  $(foreach type,CORE LANG CUST UDA DCP VPL SIGN,\
+    copy | "$(DP_$(type)SRC)" | $(DP_$(type)TGT) |)
+
+#==============================================================================
+
+.PHONY: dpcopy dpcopy-pre
+
+dpcopy    : ;@$(call IMAKER,DPCOPY)
+dpcopy-pre: ;@$(call IMAKER,DPCOPYPRE)
+
+
+###############################################################################
+# PlatSim
+
+USE_PLATSIM               = 0
+
+PLATSIM_TOOL              = pscli.exe
+PLATSIM_TOOLDIR           = /rd_sw/platsim
+PLATSIM_TOOL_INSTANCESDIR = $(PLATSIM_TOOLDIR)/instances
+PLATSIM_IMAGESDIR         = $(PLATSIM_TOOLDIR)/HW77/images
+PLATSIM_INSTANCE          = 1
+RUN_PLATSIM               = 0
+PLATSIM_IMAGES            = $(CORE_FLASH)
+PLATSIM_IMAGESRC          = $(patsubst %\,%,$(call pathconv,$(dir $(PLATSIM_IMAGES))))
+
+PLATSIM_INSTANCES = $(notdir $(foreach entry,$(wildcard $(PLATSIM_TOOL_INSTANCESDIR)/*),$(call isdir,$(entry))))
+define isdir
+$(if $(wildcard $1/*),$1)
+endef
+
+BUILD_PLATLAUNCH =\
+  echo-q | Launching PlatSim instance $(PLATSIM_INSTANCE) |\
+  cd     | $(PLATSIM_TOOLDIR) |\
+  cmd    | $(PLATSIM_TOOL) --launch $(PLATSIM_INSTANCE)
+
+BUILD_PLATSHUTDOWN =\
+  echo-q | Stopping PlatSim instance $(PLATSIM_INSTANCE) |\
+  cd     | $(PLATSIM_TOOLDIR) |\
+  cmd    | $(PLATSIM_TOOL) --console --shutdown $(PLATSIM_INSTANCE)
+
+BUILD_PLATCREATE =\
+  echo-q | Creating new PlatSim instance $(PLATSIM_INSTANCE) |\
+  cmd    | $(PLATSIM_TOOL) --console --create $(PLATSIM_INSTANCE) |\
+  cmd    | $(PLATSIM_TOOL) --set $(PLATSIM_INSTANCE):imaker_$(PLATSIM_INSTANCE)
+
+BUILD_PLATUPDATE =\
+  echo-q | Updating PlatSim instance $(PLATSIM_INSTANCE) |\
+  cmd    | $(PLATSIM_TOOL) --console --set $(PLATSIM_INSTANCE):$(PLATSIM_IMAGESRC):$(notdir $(PLATSIM_IMAGES))
+
+BUILD_PLATBLD =\
+  cd | $(PLATSIM_TOOLDIR) |\
+  $(if $(filter $(PLATSIM_INSTANCE),$(PLATSIM_INSTANCES)),\
+    echo-q | Platsim instance $(PLATSIM_INSTANCE) exists | $(BUILD_PLATSHUTDOWN),\
+    $(BUILD_PLATCREATE)) |\
+  $(BUILD_PLATUPDATE) |\
+  $(call iif,$(RUN_PLATSIM),$(BUILD_PLATLAUNCH))
+
+$(call add_help,USE_PLATSIM,v,(string),Define that the configuration is a PlatSim configuration.)
 
 
 ###############################################################################
@@ -269,7 +683,6 @@
   $(IMGCHK_TOOL)   | $(IMGCHK_TOOL) -h      | IMGCHECK.+? V(.+?)\s*$$  |
   $(INTPRSIS_TOOL) | $(INTPRSIS_TOOL) -h    | INTERPRETSIS\s+Version\s+(.+?)\s*$$ |
   $(READIMG_TOOL)  | $(READIMG_TOOL)        | Readimage.+? V(.+?)\s*$$ |
-  $(CONFT_TOOL)    | $(CONFT_TOOL) -version | ^.+?\n(.+?)\n(.+?)\n
 endef
 
 BUILD_TOOLINFO = echo-q | | toolchk | $(strip $(TOOL_INFO)) | end
@@ -282,9 +695,9 @@
 ###############################################################################
 # Targets
 
-.PHONY: checkdep opcache sisinst toolinfo wgzpreinst
+.PHONY: checkdep opcache sisinst toolinfo
 
-chkdep opcache sisinst toolinfo wgzpreinst:\
+chkdep opcache sisinst toolinfo:\
   ;@$(call IMAKER,$(call ucase,$@))
 
 
--- a/imgtools/imaker/src/imaker_uda.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_uda.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -23,205 +23,11 @@
 #  \___/|___/_/ \_\
 #
 
-USE_FILEDISK = 0
-USE_SOSUDA   = 0
-USE_UDAFGEN  = 0
-
-UDA_TITLE       = UDA
-UDA_DIR         = $(WORKDIR)/uda
-UDA_NAME        = $(NAME)
-UDA_PREFIX      = $(UDA_DIR)/$(UDA_NAME)
-UDA_IDIR        =
-UDA_HBY         =
-UDA_OBY         =
-UDA_OPT         = $(BLDROM_OPT) -D_EABI=$(ARM_VERSION)
-UDA_MSTOBY      = $(UDA_PREFIX)_uda_master.oby
-UDA_HEADER      =
-UDA_INLINE      =
-UDA_FOOTER      =
-UDA_TIME        = $(DAY)/$(MONTH)/$(YEAR)
-
-UDA_CPDIR       =
-UDA_ZIP         =
-UDA_DATADIR     = $(UDA_DIR)/datadrive
-UDA_SISCONFFILE = $(UDA_PREFIX)_uda_sisconf.txt
-UDA_SISCONF     =\
-  -d $(UDA_DRIVE): -c $(UDA_DATADIR) $(if $(SISINST_SISDIR),-s $(SISINST_SISDIR))\
-  -z $(SISINST_ZDIR) $(if $(SISINST_HALINI),-i $(SISINST_HALINI)) -w info
-
-UDA_VERSION     = $(CORE_VERSION)
-UDA_SWVERFILE   = "$(UDA_DATADIR)/Resource/Versions/User Content Package_UDA.txt"
-UDA_SWVERINFO   = $(UDA_VERSION)
-UDA_EXCLFILE    = $(UDA_DATADIR)/private/100059C9/excludelist.txt
-UDA_TOUCH       = $(call iif,$(USE_SOSUDA),,$(YEAR)$(MONTH)$(DAY)000000)
-
-UDA_IMG         = $(UDA_PREFIX).uda.img
-UDA_LOG         = $(UDA_PREFIX).uda.log
-UDA_OUTOBY      = $(UDA_PREFIX).uda.oby
-UDA_EMPTYIMG    = $(UDA_PREFIX).udaempty.img
-
-UDA_PLUGINLOG   = $(UDA_PREFIX)_uda_bldromplugin.log
-UDA_UDEBFILE    = $(TRACE_UDEBFILE)
-
 UDA_DRIVE       = C
-UDA_FATTYPE     = fat16
-UDA_FATSIZE     = 20480
-
-define UDA_EXCLADD
-*
-endef
-
-define UDA_EXCLRM
-endef
-
-#==============================================================================
-
-UDA_FDISKCONF = /mount 0
-UDA_FDISKCMD  =\
-  $(FILEDISK_TOOL) $(UDA_FDISKCONF) $(call peval,GetAbsFname($(call pquote,$(UDA_IMG)),1,1)) $(call peval,$$iVar[0] = GetFreeDrive()) |\
-  copy  | $(UDA_DATADIR)/* | $(call peval,$$iVar[0])/ |\
-  cmd   | $(FILEDISK_TOOL) /status $(call peval,$$iVar[0]) |\
-  sleep | 1 |\
-  cmd   | $(FILEDISK_TOOL) /umount $(call peval,$$iVar[0])
-
-UDA_WINIMGCMD = $(WINIMAGE_TOOL) $(call pathconv,$(UDA_IMG)) /i $(call pathconv,$(UDA_DATADIR)) /h /q
-
-UDA_CMD       = $(call iif,$(USE_FILEDISK),$(UDA_FDISKCMD),$(UDA_WINIMGCMD))
-UDA_EMPTYCMD  =
-
-#==============================================================================
-
-define UDA_MSTOBYINFO
-  $(BLDROM_HDRINFO)
-
-  ROM_IMAGE  0 non-xip size=0x00000000
-
-  DATA_IMAGE 0 $(basename $(UDA_IMG)) size=$(call peval,$(UDA_FATSIZE) * 1024) $(UDA_FATTYPE)
-
-  // UDA header
-  //
-  $(UDA_HDRINFO)
-
-  DATA_IMAGE[0] {
-    $(BLR.UDA.OBY)
-    $(UDA_INLINE)
-    $(UDA_FOOTERINFO)
-  }
-endef
-
-define UDA_HDRINFO
-  $(DEFINE) _IMAGE_WORKDIR $(UDA_DIR)
-  $(call mac2cppdef,$(BLR.UDA.OPT))
-  $(BLR.UDA.HBY)
-  $(UDA_HEADER)
-  $(if $(filter u U,$(USE_VARIANTBLD)),$(VARIANT_HEADER))
-endef
-
-define UDA_FOOTERINFO
-  $(if $(UDA_TIME),time=$(UDA_TIME))
-  $(UDA_FOOTER)
-endef
-
-#==============================================================================
-
-CLEAN_UDAFILE =\
-  del | "$(UDA_MSTOBY)" "$(UDA_SISCONFFILE)" "$(UDA_SWVERFILE)" "$(UDA_EXCLFILE)"
-
-BUILD_UDAFILE =\
-  echo-q | Generating file(s) for UDA image creation |\
-  $(call iif,$(USE_SOSUDA),\
-    write  | $(UDA_MSTOBY) | $(call def2str,$(UDA_MSTOBYINFO)) |\
-    write  | $(UDA_SISCONFFILE) | $(call quote,$(UDA_SISCONF)) |)\
-  $(call iif,$(USE_UDAFGEN),\
-    $(if $(UDA_SWVERINFO),\
-      writeu | $(UDA_SWVERFILE) | $(UDA_SWVERINFO) |)\
-    $(if $(UDA_EXCLFILE),\
-      genexclst | $(UDA_EXCLFILE) | $(UDA_DATADIR) | $(UDA_DRIVE):/ |\
-        "$(subst $(\n)," ",$(UDA_EXCLADD))" | "$(subst $(\n)," ",$(UDA_EXCLRM))")\
-  )
-
-
-###############################################################################
-# UDA pre
-
-CLEAN_UDAPRE = $(if $(filter u U,$(USE_VARIANTBLD)),$(CLEAN_CUSTVARIANT),deldir | $(UDA_DATADIR)) | $(CLEAN_UDAFILE)
-
-BUILD_UDAPRE =\
-  echo-q | Preparing UDA image creation |\
-  $(if $(filter u U,$(USE_VARIANTBLD)),$(BUILD_CUSTVARIANT) |,\
-    mkdir | $(UDA_DATADIR) |\
-    $(if $(UDA_ZIP),\
-      $(eval __i_zip := $(foreach zip,$(UDA_ZIP),$(zip)$(if $(filter %.zip,$(call lcase,$(zip))),,/*.zip)))\
-      echo-q | Extracting `$(__i_zip)$' to `$(UDA_DATADIR)$' |\
-      unzip  | $(__i_zip) | $(UDA_DATADIR) |)\
-    $(if $(UDA_CPDIR),\
-      copy | $(UDA_CPDIR)/* | $(UDA_DATADIR) |))\
-  mkcd | $(UDA_DIR) |\
-  $(BUILD_UDAFILE) |\
-  $(call iif,$(USE_FILEDISK),\
-    cmd | attrib -r -a -s -h $(call pathconv,$(UDA_DATADIR)) /s /d |)\
-  $(if $(UDA_TOUCH),\
-    finddir-r | $(UDA_DATADIR) | * | |\
-    find-ar   | $(UDA_DATADIR) | * | |\
-    touch     | __find__ | $(UDA_TOUCH))
-
-#==============================================================================
-# UDA build
-
-BLR.UDA.IDIR   = $(call dir2inc,$(UDA_IDIR) $(call iif,$(USE_FEATVAR),,$(FEATVAR_IDIR)))
-BLR.UDA.HBY    = $(call includeiby,$(IMAGE_HBY) $(UDA_HBY))
-BLR.UDA.OBY    = $(call includeiby,$(UDA_OBY) $(if $(filter u U,$(USE_VARIANTBLD)),$(VARIANT_OBY)))
-BLR.UDA.OPT    = $(UDA_OPT) -p -retainfolder -pfile=$(UDA_SISCONFFILE) -o$(UDA_NAME).dummy0.img $(BLDROPT)
-BLR.UDA.POST   =\
-  move | $(UDA_OUTOBY).log | $(UDA_LOG)
-
-BLR.UDA.CLEAN  = del | "$(UDA_EMPTYIMG)" "$(UDA_IMG)"
-BLR.UDA.BUILD  =\
-  $(call iif,$(USE_SOSUDA),,\
-    echo-q | Creating $(UDA_TITLE) SOS image |\
-    $(if $(UDA_EMPTYCMD),\
-      cmd  | $(UDA_EMPTYCMD) |\
-      move | $(UDA_EMPTYIMG) | $(UDA_IMG) |)\
-    cmd | $(UDA_CMD))
-
-CLEAN_UDA = $(CLEAN_BLDROM)
-BUILD_UDA = $(BUILD_BLDROM)
-
-# UDA Empty
-#
-CLEAN_UDAEMPTY = del | $(UDA_EMPTYIMG)
-BUILD_UDAEMPTY =\
-  echo-q | Creating empty UDA FAT image |\
-  mkdir  | $(UDA_DIR) |\
-  cmd    | $(UDA_EMPTYCMD)
-
-#==============================================================================
-# UDA post
-
-#==============================================================================
-
-SOS.UDA.STEPS      = $(call iif,$(SKIPPRE),,UDAPRE) UDA $(SOS.UDAEMPTY.STEPS)
-SOS.UDAEMPTY.STEPS = UDAEMPTY
-
-ALL.UDA.STEPS      = $(SOS.UDA.STEPS)
-ALL.UDAEMPTY.STEPS = $(SOS.UDAEMPTY.STEPS)
-
-#==============================================================================
-
-.PHONY: uda uda-image uda-pre uda-empty uda-empty-image variantuda
-
-uda uda-%: IMAGE_TYPE = UDA
-
-uda      : ;@$(call IMAKER,$$(ALL.UDA.STEPS))
-uda-image: ;@$(call IMAKER,$$(SOS.UDA.STEPS))
-uda-pre  : ;@$(call IMAKER,UDAPRE)
-
-uda-empty:       ;@$(call IMAKER,$$(ALL.UDAEMPTY.STEPS))
-uda-empty-image: ;@$(call IMAKER,$$(SOS.UDAEMPTY.STEPS))
-
-variantuda variantuda%: USE_CUSTVARIANTBLD = 1
-variantuda variantuda%: USE_VARIANTBLD     = u
-variantuda variantuda%: uda$(TARGETEXT) ;
+UDA_FATTYPE     = 16# FAT16
+UDA_SIZE        = 20480# kB
+UDA_CLUSTERSIZE = 4# kB
+UDA_FATTABLE    = 1
 
 
 # END OF IMAKER_UDA.MK
--- a/imgtools/imaker/src/imaker_variant.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_variant.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -11,7 +11,7 @@
 #
 # Contributors:
 #
-# Description: iMaker Variant image configuration
+# Description: iMaker Variant Build image configuration
 #
 
 
@@ -25,107 +25,82 @@
 
 USE_VARIANTBLD = 0
 
+PRODUCT_VARDIR   = $(if $(and $(call true,$(USE_CONE)),$(call true,$(IMAKER_MKRESTARTS))),$(CONE_OUTDIR),$(PRODUCT_DIR))
+
 VARIANT_NAME     = $(TARGETNAME)
 VARIANT_ID       = $(TARGETID)
-VARIANT_DIR      = $(call iif,$(USE_CUSTVARIANTBLD),,$(PRODVARIANT_DIR))
-VARIANT_OUTDIR   = $(if $(filter u U,$(USE_VARIANTBLD)),$(UDA_DATADIR),$($(IMAGE_TYPE)_DIR)/variant)
+VARIANT_DIR      = $(if $(filter $(LANGPACK_PREFIX)%,$(TARGETNAME)),$(LANGPACK_DIR),$(if\
+  $(filter $(CUSTVARIANT_PREFIX)%,$(TARGETNAME)),$(CUSTVARIANT_DIR),$(if\
+    $(filter emmc_% mcard_% uda_%,$(TARGETNAME)),$($(IMAGE_TYPE)_VARDIR),$(if\
+      $(filter variant%,$(TARGETNAME)),,$(PRODUCT_VARDIR)))))
+VARIANT_OUTDIR   = $(if $(filter CORE ROFS%,$(IMAGE_TYPE)),$($(IMAGE_TYPE)_DIR)/variant,$($(IMAGE_TYPE)_DATADIR))
 VARIANT_MKNAME   = variant.mk
 VARIANT_MK       = $(if $(VARIANT_DIR),$(wildcard $(VARIANT_DIR)/$(VARIANT_MKNAME)))
 
-VARIANT_PREFIX   = $($(IMAGE_TYPE)_PREFIX)_$(call lcase,$(IMAGE_TYPE))
-VARIANT_HBY      = $(VARIANT_PREFIX)_customervariant.hby
+VARIANT_HBY      = $(IMAGE_PREFIX)_$(if $(filter CORE ROFS%,$(IMAGE_TYPE)),variant,datadrive).hby
 VARIANT_HEADER   = $(if $(VARIANT_INCDIR),$(call includeiby,$(VARIANT_HBY)))
-VARIANT_OBY      = $(VARIANT_PREFIX)_customervariant.oby
-VARIANT_OVERRIDE = $(if $(filter 1 2,$(USE_VARIANTBLD)),1,0)
-VARIANT_OBYDATA  = data$(call iif,$(VARIANT_OVERRIDE),-override)="%1"  "%2"
+VARIANT_OBY      = $(basename $(VARIANT_HBY)).oby
+VARIANT_OVERRIDE = $(if $(filter CORE ROFS%,$(IMAGE_TYPE)),OVERRIDE_REPLACE/ADD)
+VARIANT_OBYDATA  = data$(call iif,$(VARIANT_OVERRIDE),-override)="%1"  "%2"$(if $(filter CORE ROFS%,$(IMAGE_TYPE)),,  %4)
 
-VARIANT_CONFML   = $(call iif,$(USE_CUSTVARIANTBLD),$(wildcard $(VARIANT_DIR)/$(CONFT_CFGNAME).confml),$(PRODVARIANT_CONFML))
-VARIANT_CONFCP   = $(call iif,$(USE_CUSTVARIANTBLD),$(if $(VARIANT_CONFML),$(CONFT_CFGNAME)),$(PRODVARIANT_CONFCP))
-VARIANT_CPDIR    = $(wildcard $(VARIANT_DIR)/content)
-VARIANT_INCDIR   = $(wildcard $(VARIANT_DIR)/include)
-VARIANT_SISDIR   = $(wildcard $(VARIANT_DIR)/sis)
-VARIANT_OPCDIR   = $(wildcard $(VARIANT_DIR)/opcache)
-VARIANT_ZIPDIR   = $(wildcard $(VARIANT_DIR)/zip)
+VARIANT_CPDIR    = $(if $(wildcard $(VARIANT_DIR)/content/*),$(VARIANT_DIR)/content)
+VARIANT_INCDIR   = $(if $(wildcard $(VARIANT_DIR)/include/*),$(VARIANT_DIR)/include)
+VARIANT_SISDIR   = $(if $(wildcard $(VARIANT_DIR)/sis/*),$(VARIANT_DIR)/sis)
+VARIANT_OPCDIR   = $(if $(wildcard $(VARIANT_DIR)/opcache/*),$(VARIANT_DIR)/opcache)
+VARIANT_WGZDIR   = $(if $(wildcard $(VARIANT_DIR)/widget/*),$(VARIANT_DIR)/widget)
+VARIANT_ZIPDIR   = $(if $(wildcard $(VARIANT_DIR)/zip/*),$(VARIANT_DIR)/zip)
 
 #==============================================================================
 
-CLEAN_CUSTVARIANT =\
-  del | "$(VARIANT_HBY)" "$(VARIANT_OBY)" | deldir | $(VARIANT_OUTDIR) |\
-  $(if $(VARIANT_CONFML),$(CLEAN_CENREP)  |)\
-  $(if $(VARIANT_SISDIR),$(CLEAN_SISINST) |)\
-  $(if $(VARIANT_OPCDIR),$(CLEAN_OPCACHE) |)
+CLEAN_VARIANT =\
+  del | "$(VARIANT_HBY)" "$(VARIANT_OBY)" | deldir | "$(VARIANT_OUTDIR)" |\
+  $(CLEAN_SISINST) | $(CLEAN_OPCACHE) | $(CLEAN_WIDGET)
 
-BUILD_CUSTVARIANT =\
-  echo-q | Variant target             USE_VARIANTBLD = $(call iif,$(USE_VARIANTBLD),`$(USE_VARIANTBLD)$',-) |\
-  echo-q | Variant directory          VARIANT_DIR    = $(or $(filter -,$(VARIANT_DIR)),$(if $(VARIANT_DIR),`$(VARIANT_DIR)$',-)) |\
-  echo-q | Variant config makefile    VARIANT_MK     = $(if $(VARIANT_MK),`$(VARIANT_MK)$',-) |\
-  echo-q | Variant include directory  VARIANT_INCDIR = $(if $(VARIANT_INCDIR),`$(VARIANT_INCDIR)$',-) |\
-  echo-q | Variant confml file        VARIANT_CONFML = $(if $(VARIANT_CONFML),`$(VARIANT_CONFML)$',-) |\
-  echo-q | Variant CenRep configs     VARIANT_CONFCP = $(if $(VARIANT_CONFCP),`$(VARIANT_CONFCP)$',-) |\
-  echo-q | Variant SIS directory      VARIANT_SISDIR = $(if $(VARIANT_SISDIR),`$(VARIANT_SISDIR)$',-) |\
-  echo-q | Variant operator cache dir VARIANT_OPCDIR = $(if $(VARIANT_OPCDIR),`$(VARIANT_OPCDIR)$',-) |\
-  echo-q | Variant zip content dir    VARIANT_ZIPDIR = $(if $(VARIANT_ZIPDIR),`$(VARIANT_ZIPDIR)$',-) |\
-  echo-q | Variant copy content dir   VARIANT_CPDIR  = $(if $(VARIANT_CPDIR),`$(VARIANT_CPDIR)$',-)   |\
-  echo-q | Variant output directory   VARIANT_OUTDIR = $(if $(VARIANT_OUTDIR),`$(VARIANT_OUTDIR)$',-) |\
+BUILD_VARIANT =\
+  echo-q | Variant target              USE_VARIANTBLD = $(call iif,$(USE_VARIANTBLD),`$(USE_VARIANTBLD)',-) |\
+  echo-q | Variant directory           VARIANT_DIR    = $(or $(filter -,$(VARIANT_DIR)),$(if $(VARIANT_DIR),`$(VARIANT_DIR)',-)) |\
+  echo-q | Variant config makefile     VARIANT_MK     = $(if $(VARIANT_MK),`$(VARIANT_MK)',-) |\
+  echo-q | Variant include directory   VARIANT_INCDIR = $(if $(VARIANT_INCDIR),`$(VARIANT_INCDIR)',-) |\
+  echo-q | Variant SIS conf            SISINST_INI    = $(if $(SISINST_INI),`$(SISINST_INI)',-)       |\
+  echo-q | Variant SIS directory       VARIANT_SISDIR = $(if $(VARIANT_SISDIR),`$(VARIANT_SISDIR)',-) |\
+  echo-q | Variant operator cache conf OPC_INI        = $(if $(OPC_INI),`$(OPC_INI)',-)               |\
+  echo-q | Variant operator cache dir  VARIANT_OPCDIR = $(if $(VARIANT_OPCDIR),`$(VARIANT_OPCDIR)',-) |\
+  echo-q | Variant widget preinst conf WIDGET_INI     = $(if $(WIDGET_INI),`$(WIDGET_INI)',-)         |\
+  echo-q | Variant widget preinst dir  VARIANT_WGZDIR = $(if $(VARIANT_WGZDIR),`$(VARIANT_WGZDIR)',-) |\
+  echo-q | Variant zip content dir     VARIANT_ZIPDIR = $(if $(VARIANT_ZIPDIR),`$(VARIANT_ZIPDIR)',-) |\
+  echo-q | Variant copy content dir    VARIANT_CPDIR  = $(if $(VARIANT_CPDIR),`$(VARIANT_CPDIR)',-)   |\
+  echo-q | Variant output directory    VARIANT_OUTDIR = $(if $(VARIANT_OUTDIR),`$(VARIANT_OUTDIR)',-) |\
   $(if $(VARIANT_DIR),,\
-    error | 1 | Variable VARIANT_DIR is not set while making target $@!\n |)\
-  $(if $(word 2,$(USE_VARIANTBLD))$(filter-out 0 1 2 3 4 5 6 u U,$(USE_VARIANTBLD)),\
-    error | 1 | Variable USE_VARIANTBLD is incorrectly defined. Possible values are 1 - 3 (6) and u.\n |)\
-  mkdir  | $(VARIANT_OUTDIR) |\
+    error | 1 | Variable VARIANT_DIR is not set while making target $(TARGETNAME). |)\
+  $(if $(wildcard $(subst \,/,$(VARIANT_DIR))),,\
+    error | 1 | Variable VARIANT_DIR does not point to an existing directory ($(VARIANT_DIR)). |)\
+  $(if $(word 2,$(USE_VARIANTBLD))$(filter-out 0 1 2 3 4 5 6 e E m M u U,$(USE_VARIANTBLD)),\
+    error | 1 | Variable USE_VARIANTBLD is incorrectly defined. Possible values are 1 - 6$(,) e$(,) m and u. |)\
+  mkdir | "$(VARIANT_OUTDIR)" |\
   $(if $(VARIANT_INCDIR),\
     echo-q | Generating oby(s) for Variant image creation |\
-    geniby | $(VARIANT_HBY) | $(VARIANT_INCDIR) | *.hrh | \#include "%3" | end |\
+    geniby | $(VARIANT_HBY) | $(VARIANT_INCDIR) |\
+      __header__ | define _IMAGE_VARINCDIR $(call quote,$(VARIANT_INCDIR)) | *.hrh | \#include "%3" | end |\
     geniby | $(VARIANT_OBY) | $(VARIANT_INCDIR) | *.iby | \#include "%3" | end |)\
-  $(if $(wildcard $(VARIANT_CONFML)),\
-    $(BUILD_CENREP) |)\
-  $(if $(VARIANT_SISDIR),\
-    $(call iif,$(USE_SOSUDA),\
-      geniby-r | >>$(VARIANT_OBY) | $(VARIANT_SISDIR) | *.sis* | sisfile="%1" | end,\
-      $(BUILD_SISINST)) |)\
-  $(if $(VARIANT_OPCDIR),\
+  $(if $(or $(SISINST_INI),$(VARIANT_SISDIR)),\
+    $(BUILD_SISINST) |)\
+  $(if $(or $(OPC_INI),$(VARIANT_OPCDIR)),\
     $(BUILD_OPCACHE) |)\
-  $(if $(VARIANT_ZIPDIR),$(if $(wildcard $(VARIANT_ZIPDIR)/*),\
+  $(if $(or $(WIDGET_INI),$(VARIANT_WGZDIR)),\
+    $(BUILD_WIDGET) |)\
+  $(if $(VARIANT_ZIPDIR),\
     echo-q | Extracting zip content directory |\
-    cmd    | $(7ZIP_TOOL) x -y $(VARIANT_ZIPDIR)/* -o$(VARIANT_OUTDIR) |))\
+    cmd    | $(7ZIP_TOOL) x -y $(VARIANT_ZIPDIR)/* -o$(VARIANT_OUTDIR) |)\
   $(if $(VARIANT_CPDIR),\
-    echo-q | Copying copy content directory |\
-    copy   | $(VARIANT_CPDIR)/* | $(VARIANT_OUTDIR) |)\
-  $(if $(filter u U,$(USE_VARIANTBLD)),,\
-    geniby-r | >>$(VARIANT_OBY) | $(VARIANT_OUTDIR) | * | $(VARIANT_OBYDATA) | end |)\
-  write | >>$(VARIANT_OBY) | |
-
-#==============================================================================
-
-variantrofs%: USE_CUSTVARIANTBLD = 1
+    echo-q  | Copying copy content directory |\
+    copydir | "$(VARIANT_CPDIR)" | $(VARIANT_OUTDIR) |)\
+  $(call iif,$(filter CORE ROFS%,$(IMAGE_TYPE))$(USE_SOSUDA),\
+    geniby-r | >>$(VARIANT_OBY) | $(VARIANT_OUTDIR) |\
+      $(call iif,$(VARIANT_OVERRIDE),__header__ | $(VARIANT_OVERRIDE) |)\
+      * | $(VARIANT_OBYDATA) |\
+      $(call iif,$(VARIANT_OVERRIDE),__footer__ | OVERRIDE_END |) end)
 
-$(foreach rofs,2 3 4 5 6,\
-  $(eval .PHONY: variantrofs$(rofs))\
-  $(eval variantrofs$(rofs) variantrofs$(rofs)%: USE_VARIANTBLD = $(rofs))\
-  $(eval variantrofs$(rofs) variantrofs$(rofs)%: rofs$(rofs)$(TARGETEXT) ;)\
-)
-
-$(call add_help,variantrofs2,t,Create an image from a variant with rofs2. Be sure to define the VARIANT_DIR.)
-$(call add_help,variantrofs3,t,Create an image from a customer variant folder. Be sure to define the VARIANT_DIR.)
-$(call add_help,variantuda,t,Create an image from a variant userdata folder. Be sure to define the VARIANT_DIR.)
-
-#==============================================================================
-
-SOS.VARIANT.STEPS = $(foreach rofs,2 3 4 5 6,$(SOS.ROFS$(rofs).STEPS))
-ALL.VARIANT.STEPS = $(SOS.VARIANT.STEPS)
-
-#==============================================================================
-# Targets
-
-.PHONY: variant variant-image variant-symbol variant-i2file
-
-variant: ;@$(call IMAKER,$$(ALL.VARIANT.STEPS))
-
-variant-image: ;@$(call IMAKER,$$(SOS.VARIANT.STEPS))
-
-variant-symbol:\
-  ;@$(call IMAKER,$(foreach rofs,2 3 4 5 6,$(call iif,$(USE_ROFS$(rofs)),ROFS$(rofs)SYM)))
-
-variant-i2file: ;@$(call IMAKER,VARIANTI2F)
+#  geniby-dr | >>$(VARIANT_OBY) | $(VARIANT_OUTDIR) | * | dir="%2" | end
 
 
 # END OF IMAKER_VARIANT.MK
--- a/imgtools/imaker/src/imaker_version.mk	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imaker/src/imaker_version.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -14,4 +14,4 @@
 # Description: iMaker version string
 #
 
-IMAKER_VERSION = iMaker 09.06.01, 05-Feb-2009.
+IMAKER_VERSION = iMaker 10.24.01, 14-Jun-2010.
Binary file imgtools/imglib/boostlibrary/binary/linux/libboost_filesystem-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/linux/libboost_regex-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/linux/libboost_regex-mgw34-mt-p-1_39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/linux/libboost_system-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/linux/libboost_thread-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/windows/libboost_filesystem-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/windows/libboost_regex-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/windows/libboost_regex-mgw34-mt-p-1_39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/windows/libboost_system-1.39.a has changed
Binary file imgtools/imglib/boostlibrary/binary/windows/libboost_thread-1.39.a has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/cerrno.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,331 @@
+//  Boost cerrno.hpp header  -------------------------------------------------//
+
+//  Copyright Beman Dawes 2005.
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+#ifndef BOOST_CERRNO_HPP
+#define BOOST_CERRNO_HPP
+
+#include <cerrno>
+
+//  supply errno values likely to be missing, particularly on Windows
+
+#ifndef EAFNOSUPPORT
+#define EAFNOSUPPORT 9901
+#endif
+
+#ifndef EADDRINUSE
+#define EADDRINUSE 9902
+#endif
+
+#ifndef EADDRNOTAVAIL
+#define EADDRNOTAVAIL 9903
+#endif
+
+#ifndef EISCONN
+#define EISCONN 9904
+#endif
+
+#ifndef EBADMSG
+#define EBADMSG 9905
+#endif
+
+#ifndef ECONNABORTED
+#define ECONNABORTED 9906
+#endif
+
+#ifndef EALREADY
+#define EALREADY 9907
+#endif
+
+#ifndef ECONNREFUSED
+#define ECONNREFUSED 9908
+#endif
+
+#ifndef ECONNRESET
+#define ECONNRESET 9909
+#endif
+
+#ifndef EDESTADDRREQ
+#define EDESTADDRREQ 9910
+#endif
+
+#ifndef EHOSTUNREACH
+#define EHOSTUNREACH 9911
+#endif
+
+#ifndef EIDRM
+#define EIDRM 9912
+#endif
+
+#ifndef EMSGSIZE
+#define EMSGSIZE 9913
+#endif
+
+#ifndef ENETDOWN
+#define ENETDOWN 9914
+#endif
+
+#ifndef ENETRESET
+#define ENETRESET 9915
+#endif
+
+#ifndef ENETUNREACH
+#define ENETUNREACH 9916
+#endif
+
+#ifndef ENOBUFS
+#define ENOBUFS 9917
+#endif
+
+#ifndef ENOLINK
+#define ENOLINK 9918
+#endif
+
+#ifndef ENODATA
+#define ENODATA 9919
+#endif
+
+#ifndef ENOMSG
+#define ENOMSG 9920
+#endif
+
+#ifndef ENOPROTOOPT
+#define ENOPROTOOPT 9921
+#endif
+
+#ifndef ENOSR
+#define ENOSR 9922
+#endif
+
+#ifndef ENOTSOCK
+#define ENOTSOCK 9923
+#endif
+
+#ifndef ENOSTR
+#define ENOSTR 9924
+#endif
+
+#ifndef ENOTCONN
+#define ENOTCONN 9925
+#endif
+
+#ifndef ENOTSUP
+#define ENOTSUP 9926
+#endif
+
+#ifndef ECANCELED
+#define ECANCELED 9927
+#endif
+
+#ifndef EINPROGRESS
+#define EINPROGRESS 9928
+#endif
+
+#ifndef EOPNOTSUPP
+#define EOPNOTSUPP 9929
+#endif
+
+#ifndef EWOULDBLOCK
+#define EWOULDBLOCK 9930
+#endif
+
+#ifndef EOWNERDEAD
+#define EOWNERDEAD  9931
+#endif
+
+#ifndef EPROTO
+#define EPROTO 9932
+#endif
+
+#ifndef EPROTONOSUPPORT
+#define EPROTONOSUPPORT 9933
+#endif
+
+#ifndef ENOTRECOVERABLE
+#define ENOTRECOVERABLE 9934
+#endif
+
+#ifndef ETIME
+#define ETIME 9935
+#endif
+
+#ifndef ETXTBSY
+#define ETXTBSY 9936
+#endif
+
+#ifndef ETIMEDOUT
+#define ETIMEDOUT 9938
+#endif
+
+#ifndef ELOOP
+#define ELOOP 9939
+#endif
+
+#ifndef EOVERFLOW
+#define EOVERFLOW 9940
+#endif
+
+#ifndef EPROTOTYPE
+#define EPROTOTYPE 9941
+#endif
+
+#ifndef ENOSYS
+#define ENOSYS 9942
+#endif
+
+#ifndef EINVAL
+#define EINVAL 9943
+#endif
+
+#ifndef ERANGE
+#define ERANGE 9944
+#endif
+
+#ifndef EILSEQ
+#define EILSEQ 9945
+#endif
+
+//  Windows Mobile doesn't appear to define these:
+
+#ifndef E2BIG
+#define E2BIG 9946
+#endif
+
+#ifndef EDOM
+#define EDOM 9947
+#endif
+
+#ifndef EFAULT
+#define EFAULT 9948
+#endif
+
+#ifndef EBADF
+#define EBADF 9949
+#endif
+
+#ifndef EPIPE
+#define EPIPE 9950
+#endif
+
+#ifndef EXDEV
+#define EXDEV 9951
+#endif
+
+#ifndef EBUSY
+#define EBUSY 9952
+#endif
+
+#ifndef ENOTEMPTY
+#define ENOTEMPTY 9953
+#endif
+
+#ifndef ENOEXEC
+#define ENOEXEC 9954
+#endif
+
+#ifndef EEXIST
+#define EEXIST 9955
+#endif
+
+#ifndef EFBIG
+#define EFBIG 9956
+#endif
+
+#ifndef ENAMETOOLONG
+#define ENAMETOOLONG 9957
+#endif
+
+#ifndef ENOTTY
+#define ENOTTY 9958
+#endif
+
+#ifndef EINTR
+#define EINTR 9959
+#endif
+
+#ifndef ESPIPE
+#define ESPIPE 9960
+#endif
+
+#ifndef EIO
+#define EIO 9961
+#endif
+
+#ifndef EISDIR
+#define EISDIR 9962
+#endif
+
+#ifndef ECHILD
+#define ECHILD 9963
+#endif
+
+#ifndef ENOLCK
+#define ENOLCK 9964
+#endif
+
+#ifndef ENOSPC
+#define ENOSPC 9965
+#endif
+
+#ifndef ENXIO
+#define ENXIO 9966
+#endif
+
+#ifndef ENODEV
+#define ENODEV 9967
+#endif
+
+#ifndef ENOENT
+#define ENOENT 9968
+#endif
+
+#ifndef ESRCH
+#define ESRCH 9969
+#endif
+
+#ifndef ENOTDIR
+#define ENOTDIR 9970
+#endif
+
+#ifndef ENOMEM
+#define ENOMEM 9971
+#endif
+
+#ifndef EPERM
+#define EPERM 9972
+#endif
+
+#ifndef EACCES
+#define EACCES 9973
+#endif
+
+#ifndef EROFS
+#define EROFS 9974
+#endif
+
+#ifndef EDEADLK
+#define EDEADLK 9975
+#endif
+
+#ifndef EAGAIN
+#define EAGAIN 9976
+#endif
+
+#ifndef ENFILE
+#define ENFILE 9977
+#endif
+
+#ifndef EMFILE
+#define EMFILE 9978
+#endif
+
+#ifndef EMLINK
+#define EMLINK 9979
+#endif
+
+#endif // include guard
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/enable_shared_from_this.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,18 @@
+#ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+#define BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
+
+//
+//  enable_shared_from_this.hpp
+//
+//  Copyright (c) 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0.
+//  See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt
+//
+//  http://www.boost.org/libs/smart_ptr/enable_shared_from_this.html
+//
+
+#include <boost/smart_ptr/enable_shared_from_this.hpp>
+
+#endif  // #ifndef BOOST_ENABLE_SHARED_FROM_THIS_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+//  boost/filesystem/filesystem.hpp  -----------------------------------------//
+
+//  Copyright Beman Dawes 2005
+
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_FILESYSTEM_HPP
+#define BOOST_FILESYSTEM_FILESYSTEM_HPP
+
+#include <boost/filesystem/operations.hpp>   // includes path.hpp
+#include <boost/filesystem/convenience.hpp>
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/config.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,113 @@
+//  boost/filesystem/config.hpp  ---------------------------------------------//
+
+//  Copyright Beman Dawes 2003
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_CONFIG_HPP
+#define BOOST_FILESYSTEM_CONFIG_HPP
+
+#define BOOST_FILESYSTEM_I18N  // aid users wishing to compile several versions
+
+//  ability to change namespace aids path_table.cpp  ------------------------// 
+#ifndef BOOST_FILESYSTEM_NAMESPACE
+# define BOOST_FILESYSTEM_NAMESPACE filesystem
+#endif
+
+// This header implements separate compilation features as described in
+// http://www.boost.org/more/separate_compilation.html
+
+#include <boost/config.hpp>
+#include <boost/detail/workaround.hpp> 
+
+//  determine platform  ------------------------------------------------------//
+
+//  BOOST_CYGWIN_PATH implies BOOST_WINDOWS_PATH and BOOST_POSIX_API
+
+# if defined(BOOST_CYGWIN_PATH)
+#   if defined(BOOST_POSIX_PATH)
+#     error BOOST_POSIX_PATH is invalid when BOOST_CYGWIN_PATH is defined
+#   endif
+#   if defined(BOOST_WINDOWS_API)
+#     error BOOST_WINDOWS_API is invalid when BOOST_CYGWIN_PATH is defined
+#   endif
+#   define BOOST_WINDOWS_PATH
+#   define BOOST_POSIX_API
+# endif
+
+//  BOOST_POSIX_API or BOOST_WINDOWS_API specify which API to use
+
+# if defined( BOOST_WINDOWS_API ) && defined( BOOST_POSIX_API )
+#   error both BOOST_WINDOWS_API and BOOST_POSIX_API are defined
+# elif !defined( BOOST_WINDOWS_API ) && !defined( BOOST_POSIX_API )
+#   if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
+#     define BOOST_WINDOWS_API
+#   else
+#     define BOOST_POSIX_API 
+#   endif
+# endif
+
+//  BOOST_WINDOWS_PATH enables Windows path syntax recognition
+
+# if !defined(BOOST_POSIX_PATH) && (defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__))
+#   define BOOST_WINDOWS_PATH
+# endif
+
+//  narrow support only for badly broken compilers or libraries  -------------//
+
+# if defined(BOOST_NO_STD_WSTRING) || defined(BOOST_NO_SFINAE) || defined(BOOST_NO_STD_LOCALE) || BOOST_WORKAROUND(__BORLANDC__, <0x610)
+#   define BOOST_FILESYSTEM_NARROW_ONLY
+# endif
+
+//  enable dynamic linking on Windows  ---------------------------------------//
+
+#  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)) &&  BOOST_WORKAROUND(__BORLANDC__, <0x610) && defined(__WIN32__)
+#    error Dynamic linking Boost.Filesystem does not work for Borland; use static linking instead
+#  endif
+
+#ifdef BOOST_HAS_DECLSPEC // defined in config system
+// we need to import/export our code only if the user has specifically
+// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+// libraries to be dynamically linked, or BOOST_FILESYSTEM_DYN_LINK
+// if they want just this one to be dynamically liked:
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)
+// export if this is our own source, otherwise import:
+#ifdef BOOST_FILESYSTEM_SOURCE
+# define BOOST_FILESYSTEM_DECL __declspec(dllexport)
+#else
+# define BOOST_FILESYSTEM_DECL __declspec(dllimport)
+#endif  // BOOST_FILESYSTEM_SOURCE
+#endif  // DYN_LINK
+#endif  // BOOST_HAS_DECLSPEC
+//
+// if BOOST_FILESYSTEM_DECL isn't defined yet define it now:
+#ifndef BOOST_FILESYSTEM_DECL
+#define BOOST_FILESYSTEM_DECL
+#endif
+
+//  enable automatic library variant selection  ------------------------------// 
+
+#if !defined(BOOST_FILESYSTEM_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_FILESYSTEM_NO_LIB)
+//
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_filesystem
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_FILESYSTEM_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // BOOST_FILESYSTEM_CONFIG_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/convenience.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,306 @@
+//  boost/filesystem/convenience.hpp  ----------------------------------------//
+
+//  Copyright Beman Dawes, 2002-2005
+//  Copyright Vladimir Prus, 2002
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_CONVENIENCE_HPP
+#define BOOST_FILESYSTEM_CONVENIENCE_HPP
+
+#include <boost/filesystem/operations.hpp>
+#include <boost/system/error_code.hpp>
+#include <vector>
+#include <stack>
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+#   define BOOST_FS_FUNC(BOOST_FS_TYPE) \
+      template<class Path> typename boost::enable_if<is_basic_path<Path>, \
+      BOOST_FS_TYPE>::type
+#   define BOOST_FS_FUNC_STRING BOOST_FS_FUNC(typename Path::string_type)
+#   define BOOST_FS_TYPENAME typename
+# else
+#   define BOOST_FS_FUNC(BOOST_FS_TYPE) inline BOOST_FS_TYPE 
+    typedef boost::filesystem::path Path;
+#   define BOOST_FS_FUNC_STRING inline std::string
+#   define BOOST_FS_TYPENAME
+# endif
+
+namespace boost
+{
+  namespace filesystem
+  {
+
+    BOOST_FS_FUNC(bool) create_directories(const Path& ph)
+    {
+         if (ph.empty() || exists(ph))
+         {
+           if ( !ph.empty() && !is_directory(ph) )
+               boost::throw_exception( basic_filesystem_error<Path>(
+                 "boost::filesystem::create_directories", ph,
+                 make_error_code( boost::system::posix::file_exists ) ) );
+           return false;
+         }
+
+         // First create branch, by calling ourself recursively
+         create_directories(ph.parent_path());
+         // Now that parent's path exists, create the directory
+         create_directory(ph);
+         return true;
+     }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+
+    BOOST_FS_FUNC_STRING extension(const Path& ph)
+    {
+      typedef BOOST_FS_TYPENAME Path::string_type string_type;
+      string_type filename = ph.filename();
+
+      BOOST_FS_TYPENAME string_type::size_type n = filename.rfind('.');
+      if (n != string_type::npos)
+        return filename.substr(n);
+      else
+        return string_type();
+    }
+
+    BOOST_FS_FUNC_STRING basename(const Path& ph)
+    {
+      typedef BOOST_FS_TYPENAME Path::string_type string_type;
+      string_type filename = ph.filename();
+      BOOST_FS_TYPENAME string_type::size_type n = filename.rfind('.');
+      return filename.substr(0, n);
+    }
+
+
+    BOOST_FS_FUNC(Path) change_extension( const Path & ph,
+      const BOOST_FS_TYPENAME Path::string_type & new_extension )
+      { return ph.parent_path() / (basename(ph) + new_extension); }
+
+# endif
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+    // "do-the-right-thing" overloads  ---------------------------------------//
+
+    inline bool create_directories(const path& ph)
+      { return create_directories<path>(ph); }
+    inline bool create_directories(const wpath& ph)
+      { return create_directories<wpath>(ph); }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    inline std::string extension(const path& ph)
+      { return extension<path>(ph); }
+    inline std::wstring extension(const wpath& ph)
+      { return extension<wpath>(ph); }
+
+    inline std::string basename(const path& ph)
+      { return basename<path>( ph ); }
+    inline std::wstring basename(const wpath& ph)
+      { return basename<wpath>( ph ); }
+
+    inline path change_extension( const path & ph, const std::string& new_ex )
+      { return change_extension<path>( ph, new_ex ); }
+    inline wpath change_extension( const wpath & ph, const std::wstring& new_ex )
+      { return change_extension<wpath>( ph, new_ex ); }
+# endif
+
+# endif
+
+
+    //  basic_recursive_directory_iterator helpers  --------------------------//
+
+    namespace detail
+    {
+      template< class Path >
+      struct recur_dir_itr_imp
+      {
+        typedef basic_directory_iterator< Path > element_type;
+        std::stack< element_type, std::vector< element_type > > m_stack;
+        int  m_level;
+        bool m_no_push;
+        bool m_no_throw;
+
+        recur_dir_itr_imp() : m_level(0), m_no_push(false), m_no_throw(false) {}
+      };
+
+    } // namespace detail
+
+    //  basic_recursive_directory_iterator  ----------------------------------//
+
+    template< class Path >
+    class basic_recursive_directory_iterator
+      : public boost::iterator_facade<
+          basic_recursive_directory_iterator<Path>,
+          basic_directory_entry<Path>,
+          boost::single_pass_traversal_tag >
+    {
+    public:
+      typedef Path path_type;
+
+      basic_recursive_directory_iterator(){}  // creates the "end" iterator
+
+      explicit basic_recursive_directory_iterator( const Path & dir_path );
+      basic_recursive_directory_iterator( const Path & dir_path,
+        system::error_code & ec );
+
+      int level() const { return m_imp->m_level; }
+
+      void pop();
+      void no_push()
+      {
+        BOOST_ASSERT( m_imp.get() && "attempt to no_push() on end iterator" );
+        m_imp->m_no_push = true;
+      }
+
+      file_status status() const
+      {
+        BOOST_ASSERT( m_imp.get()
+          && "attempt to call status() on end recursive_iterator" );
+        return m_imp->m_stack.top()->status();
+      }
+
+      file_status symlink_status() const
+      {
+        BOOST_ASSERT( m_imp.get()
+          && "attempt to call symlink_status() on end recursive_iterator" );
+        return m_imp->m_stack.top()->symlink_status();
+      }
+
+    private:
+
+      // shared_ptr provides shallow-copy semantics required for InputIterators.
+      // m_imp.get()==0 indicates the end iterator.
+      boost::shared_ptr< detail::recur_dir_itr_imp< Path > >  m_imp;
+
+      friend class boost::iterator_core_access;
+
+      typename boost::iterator_facade< 
+        basic_recursive_directory_iterator<Path>,
+        basic_directory_entry<Path>,
+        boost::single_pass_traversal_tag >::reference
+      dereference() const 
+      {
+        BOOST_ASSERT( m_imp.get() && "attempt to dereference end iterator" );
+        return *m_imp->m_stack.top();
+      }
+
+      void increment();
+
+      bool equal( const basic_recursive_directory_iterator & rhs ) const
+        { return m_imp == rhs.m_imp; }
+
+    };
+
+    typedef basic_recursive_directory_iterator<path> recursive_directory_iterator;
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    typedef basic_recursive_directory_iterator<wpath> wrecursive_directory_iterator;
+# endif
+
+    //  basic_recursive_directory_iterator implementation  -------------------//
+
+    //  constructors
+    template<class Path>
+    basic_recursive_directory_iterator<Path>::
+      basic_recursive_directory_iterator( const Path & dir_path )
+      : m_imp( new detail::recur_dir_itr_imp<Path> )
+    {
+      m_imp->m_stack.push( basic_directory_iterator<Path>( dir_path ) );
+      if ( m_imp->m_stack.top () == basic_directory_iterator<Path>() )
+        { m_imp.reset (); }
+    }
+
+    template<class Path>
+    basic_recursive_directory_iterator<Path>::
+      basic_recursive_directory_iterator( const Path & dir_path,
+        system::error_code & ec )
+      : m_imp( new detail::recur_dir_itr_imp<Path> )
+    {
+      m_imp->m_no_throw = true;
+      m_imp->m_stack.push( basic_directory_iterator<Path>( dir_path, ec ) );
+      if ( m_imp->m_stack.top () == basic_directory_iterator<Path>() )
+        { m_imp.reset (); }
+    }
+
+    //  increment
+    template<class Path>
+    void basic_recursive_directory_iterator<Path>::increment()
+    {
+      BOOST_ASSERT( m_imp.get() && "increment on end iterator" );
+      
+      static const basic_directory_iterator<Path> end_itr;
+
+      if ( m_imp->m_no_push )
+        { m_imp->m_no_push = false; }
+      else if ( is_directory( m_imp->m_stack.top()->status() ) )
+      {
+        system::error_code ec;
+#if BOOST_WORKAROUND(__CODEGEARC__, BOOST_TESTED_AT(0x610))
+        if( m_imp->m_no_throw ) {
+            m_imp->m_stack.push(
+                basic_directory_iterator<Path>( *m_imp->m_stack.top(), ec )
+            );
+        }
+        else {
+            m_imp->m_stack.push(
+                basic_directory_iterator<Path>( *m_imp->m_stack.top() )
+            );
+        }
+#else
+        m_imp->m_stack.push(
+          m_imp->m_no_throw
+            ? basic_directory_iterator<Path>( *m_imp->m_stack.top(), ec )
+            : basic_directory_iterator<Path>( *m_imp->m_stack.top() ) );
+#endif
+        if ( m_imp->m_stack.top() != end_itr )
+        {
+          ++m_imp->m_level;
+          return;
+        }
+        m_imp->m_stack.pop();
+      }
+
+      while ( !m_imp->m_stack.empty()
+        && ++m_imp->m_stack.top() == end_itr )
+      {
+        m_imp->m_stack.pop();
+        --m_imp->m_level;
+      }
+
+      if ( m_imp->m_stack.empty() ) m_imp.reset(); // done, so make end iterator
+    }
+
+    //  pop
+    template<class Path>
+    void basic_recursive_directory_iterator<Path>::pop()
+    {
+      BOOST_ASSERT( m_imp.get() && "pop on end iterator" );
+      BOOST_ASSERT( m_imp->m_level > 0 && "pop with level < 1" );
+
+      static const basic_directory_iterator<Path> end_itr;
+
+      do
+      {
+        m_imp->m_stack.pop();
+        --m_imp->m_level;
+      }
+      while ( !m_imp->m_stack.empty()
+        && ++m_imp->m_stack.top() == end_itr );
+
+      if ( m_imp->m_stack.empty() ) m_imp.reset(); // done, so make end iterator
+    }
+
+  } // namespace filesystem
+} // namespace boost
+
+#undef BOOST_FS_FUNC_STRING
+#undef BOOST_FS_FUNC
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+#endif // BOOST_FILESYSTEM_CONVENIENCE_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/exception.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+//  boost/filesystem/exception.hpp  -------------------------------------------//
+
+//  Copyright Beman Dawes 2003
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  This header is no long used. The contents have been moved to path.hpp.
+//  It is provided so that user code #includes do not have to be changed.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/fstream.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,584 @@
+//  boost/filesystem/fstream.hpp  --------------------------------------------//
+
+//  Copyright Beman Dawes 2002.
+//  Use, modification, and distribution is subject to the Boost Software
+//  License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_FSTREAM_HPP
+#define BOOST_FILESYSTEM_FSTREAM_HPP
+
+#include <boost/filesystem/operations.hpp> // for 8.3 hack (see below)
+#include <boost/utility/enable_if.hpp>
+#include <boost/detail/workaround.hpp>
+
+#include <iosfwd>
+#include <fstream>
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+// NOTE: fstream.hpp for Boost 1.32.0 and earlier supplied workarounds for
+// various compiler problems. They have been removed to ease development of the
+// basic i18n functionality. Once the new interface is stable, the workarounds
+// will be reinstated for any compilers that otherwise can support the rest of
+// the library after internationalization.
+
+namespace boost
+{
+  namespace filesystem
+  {
+    namespace detail
+    {
+#   if defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_NARROW_ONLY)
+#     if !defined(BOOST_DINKUMWARE_STDLIB) || BOOST_DINKUMWARE_STDLIB < 405
+      // The 8.3 hack:
+      // C++98 does not supply a wchar_t open, so try to get an equivalent
+      // narrow char name based on the short, so-called 8.3, name.
+      // Not needed for Dinkumware 405 and later as they do supply wchar_t open.
+      BOOST_FILESYSTEM_DECL bool create_file_api( const std::wstring & ph,
+        std::ios_base::openmode mode ); // true if succeeds
+      BOOST_FILESYSTEM_DECL std::string narrow_path_api(
+        const std::wstring & ph ); // return is empty if fails
+
+      inline std::string path_proxy( const std::wstring & file_ph,
+        std::ios_base::openmode mode )
+      // Return a non-existant path if cannot supply narrow short path.
+      // An empty path doesn't work because some Dinkumware versions
+      // assert the path is non-empty.  
+      {
+        std::string narrow_ph;
+        bool created_file( false );
+        if ( !exists( file_ph )
+          && (mode & std::ios_base::out) != 0
+          && create_file_api( file_ph, mode ) )
+        {
+          created_file = true;
+        }
+        narrow_ph = narrow_path_api( file_ph );
+        if ( narrow_ph.empty() )
+        {
+          if ( created_file ) remove_api( file_ph );
+          narrow_ph = "\x01";
+        }
+        return narrow_ph;
+      }
+#     else
+      // Dinkumware 405 and later does supply wchar_t functions
+      inline const std::wstring & path_proxy( const std::wstring & file_ph,
+        std::ios_base::openmode )
+        { return file_ph; }
+#     endif
+#   endif 
+
+      inline const std::string & path_proxy( const std::string & file_ph,
+        std::ios_base::openmode )
+        { return file_ph; }
+
+    } // namespace detail
+
+    template < class charT, class traits = std::char_traits<charT> >
+    class basic_filebuf : public std::basic_filebuf<charT,traits>
+    {
+    private: // disallow copying
+      basic_filebuf( const basic_filebuf & );
+      const basic_filebuf & operator=( const basic_filebuf & ); 
+    public:
+      basic_filebuf() {}
+      virtual ~basic_filebuf() {}
+
+#   ifndef BOOST_FILESYSTEM_NARROW_ONLY
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>,
+        basic_filebuf<charT,traits> *>::type
+      open( const Path & file_ph, std::ios_base::openmode mode );
+
+      basic_filebuf<charT,traits> *
+      open( const wpath & file_ph, std::ios_base::openmode mode );
+#   endif
+
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+      basic_filebuf<charT,traits> *
+      open( const path & file_ph, std::ios_base::openmode mode );
+#   endif
+    };
+
+    template < class charT, class traits = std::char_traits<charT> >
+    class basic_ifstream : public std::basic_ifstream<charT,traits>
+    {
+    private: // disallow copying
+      basic_ifstream( const basic_ifstream & );
+      const basic_ifstream & operator=( const basic_ifstream & ); 
+    public:
+      basic_ifstream() {}
+
+      // use two signatures, rather than one signature with default second
+      // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
+
+#   ifndef BOOST_FILESYSTEM_NARROW_ONLY
+      template<class Path>
+      explicit basic_ifstream( const Path & file_ph,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+
+      template<class Path>
+      basic_ifstream( const Path & file_ph, std::ios_base::openmode mode,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph, std::ios_base::openmode mode );
+
+      explicit basic_ifstream( const wpath & file_ph );
+      basic_ifstream( const wpath & file_ph, std::ios_base::openmode mode );
+      void open( const wpath & file_ph );
+      void open( const wpath & file_ph, std::ios_base::openmode mode );
+#   endif
+
+      explicit basic_ifstream( const path & file_ph );
+      basic_ifstream( const path & file_ph, std::ios_base::openmode mode );
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+      void open( const path & file_ph );
+      void open( const path & file_ph, std::ios_base::openmode mode );
+#   endif
+      virtual ~basic_ifstream() {}
+    };
+
+    template < class charT, class traits = std::char_traits<charT> >
+    class basic_ofstream : public std::basic_ofstream<charT,traits>
+    {
+    private: // disallow copying
+      basic_ofstream( const basic_ofstream & );
+      const basic_ofstream & operator=( const basic_ofstream & ); 
+    public:
+      basic_ofstream() {}
+
+      // use two signatures, rather than one signature with default second
+      // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
+
+#   ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+      template<class Path>
+      explicit basic_ofstream( const Path & file_ph,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+      explicit basic_ofstream( const wpath & file_ph );
+
+      template<class Path>
+      basic_ofstream( const Path & file_ph, std::ios_base::openmode mode,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+      basic_ofstream( const wpath & file_ph, std::ios_base::openmode mode );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph );
+      void open( const wpath & file_ph );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph, std::ios_base::openmode mode );
+      void open( const wpath & file_ph, std::ios_base::openmode mode );
+
+#   endif
+
+      explicit basic_ofstream( const path & file_ph );
+      basic_ofstream( const path & file_ph, std::ios_base::openmode mode );
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+      void open( const path & file_ph );
+      void open( const path & file_ph, std::ios_base::openmode mode );
+#   endif
+      virtual ~basic_ofstream() {}
+    };
+
+    template < class charT, class traits = std::char_traits<charT> >
+    class basic_fstream : public std::basic_fstream<charT,traits>
+    {
+    private: // disallow copying
+      basic_fstream( const basic_fstream & );
+      const basic_fstream & operator=( const basic_fstream & ); 
+    public:
+      basic_fstream() {}
+
+      // use two signatures, rather than one signature with default second
+      // argument, to workaround VC++ 7.1 bug (ID VSWhidbey 38416)
+
+#   ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+      template<class Path>
+      explicit basic_fstream( const Path & file_ph,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+      explicit basic_fstream( const wpath & file_ph );
+
+      template<class Path>
+      basic_fstream( const Path & file_ph, std::ios_base::openmode mode,
+        typename boost::enable_if<is_basic_path<Path> >::type* dummy = 0 );
+      basic_fstream( const wpath & file_ph, std::ios_base::openmode mode );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph );
+      void open( const wpath & file_ph );
+
+      template<class Path>
+      typename boost::enable_if<is_basic_path<Path>, void>::type
+      open( const Path & file_ph, std::ios_base::openmode mode );
+      void open( const wpath & file_ph, std::ios_base::openmode mode );
+
+#   endif
+
+      explicit basic_fstream( const path & file_ph );
+      basic_fstream( const path & file_ph, std::ios_base::openmode mode );
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+      void open( const path & file_ph );
+      void open( const path & file_ph, std::ios_base::openmode mode );
+#   endif
+      virtual ~basic_fstream() {}
+
+    };
+ 
+    typedef basic_filebuf<char> filebuf;
+    typedef basic_ifstream<char> ifstream;
+    typedef basic_ofstream<char> ofstream;
+    typedef basic_fstream<char> fstream;
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    typedef basic_filebuf<wchar_t> wfilebuf;
+    typedef basic_ifstream<wchar_t> wifstream;
+    typedef basic_fstream<wchar_t> wfstream;
+    typedef basic_ofstream<wchar_t> wofstream;
+# endif
+    
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+//  basic_filebuf definitions  -----------------------------------------------//
+
+    template <class charT, class traits>
+    template<class Path>
+    typename boost::enable_if<is_basic_path<Path>,
+      basic_filebuf<charT,traits> *>::type
+    basic_filebuf<charT,traits>::open( const Path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      return (std::basic_filebuf<charT,traits>::open( detail::path_proxy(
+        file_ph.external_file_string(), mode ).c_str(), mode )
+          == 0) ? 0 : this;
+    }
+
+    template <class charT, class traits>
+    basic_filebuf<charT,traits> *
+    basic_filebuf<charT, traits>::open( const wpath & file_ph,
+      std::ios_base::openmode mode )
+    {
+      return this->BOOST_NESTED_TEMPLATE open<wpath>( file_ph, mode );
+    }
+
+//  basic_ifstream definitions  ----------------------------------------------//
+
+    template <class charT, class traits> template<class Path>
+    basic_ifstream<charT,traits>::basic_ifstream(const Path & file_ph,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_ifstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in ).c_str(), std::ios_base::in ) {}
+
+    template <class charT, class traits>
+    basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph )
+      : std::basic_ifstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in ).c_str(), std::ios_base::in ) {}
+    
+    template <class charT, class traits> template<class Path>
+    basic_ifstream<charT,traits>::basic_ifstream( const Path & file_ph,
+      std::ios_base::openmode mode,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_ifstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in ) {}
+
+    template <class charT, class traits>
+    basic_ifstream<charT,traits>::basic_ifstream( const wpath & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_ifstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in ) {}
+
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_ifstream<charT,traits>::open( const Path & file_ph )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in ).c_str(), std::ios_base::in );
+    }
+
+    template <class charT, class traits>
+    void basic_ifstream<charT,traits>::open( const wpath & file_ph )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in ).c_str(), std::ios_base::in );
+    }
+    
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_ifstream<charT,traits>::open( const Path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in );
+    }
+    
+    template <class charT, class traits>
+    void basic_ifstream<charT,traits>::open( const wpath & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in );
+    }
+
+//  basic_ofstream definitions  ----------------------------------------------//
+
+    template <class charT, class traits> template<class Path>
+    basic_ofstream<charT,traits>::basic_ofstream(const Path & file_ph,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_ofstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::out ).c_str(), std::ios_base::out ) {}
+
+    template <class charT, class traits>
+    basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph )
+      : std::basic_ofstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::out ).c_str(), std::ios_base::out ) {}
+
+    template <class charT, class traits> template<class Path>
+    basic_ofstream<charT,traits>::basic_ofstream( const Path & file_ph,
+      std::ios_base::openmode mode,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_ofstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::out ) {}
+
+    template <class charT, class traits>
+    basic_ofstream<charT,traits>::basic_ofstream( const wpath & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_ofstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::out ) {}
+    
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_ofstream<charT,traits>::open( const Path & file_ph )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::out ).c_str(), std::ios_base::out );
+    }
+    
+    template <class charT, class traits>
+    void basic_ofstream<charT,traits>::open( const wpath & file_ph )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::out ).c_str(), std::ios_base::out );
+    }
+    
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_ofstream<charT,traits>::open( const Path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::out );
+    }
+
+    template <class charT, class traits>
+    void basic_ofstream<charT,traits>::open( const wpath & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::out );
+    }
+
+//  basic_fstream definitions  -----------------------------------------------//
+
+    template <class charT, class traits> template<class Path>
+    basic_fstream<charT,traits>::basic_fstream(const Path & file_ph,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_fstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in|std::ios_base::out ).c_str(),
+          std::ios_base::in|std::ios_base::out ) {}
+
+    template <class charT, class traits>
+    basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph )
+      : std::basic_fstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in|std::ios_base::out ).c_str(),
+          std::ios_base::in|std::ios_base::out ) {}
+
+    template <class charT, class traits> template<class Path>
+    basic_fstream<charT,traits>::basic_fstream( const Path & file_ph,
+      std::ios_base::openmode mode,
+      typename boost::enable_if<is_basic_path<Path> >::type* )
+      : std::basic_fstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {}
+    
+    template <class charT, class traits>
+    basic_fstream<charT,traits>::basic_fstream( const wpath & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_fstream<charT,traits>(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in | std::ios_base::out ) {}
+      
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_fstream<charT,traits>::open( const Path & file_ph )
+    {
+      std::basic_fstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in|std::ios_base::out ).c_str(),
+          std::ios_base::in|std::ios_base::out );
+    }
+
+    template <class charT, class traits>
+    void basic_fstream<charT,traits>::open( const wpath & file_ph )
+    {
+      std::basic_fstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          std::ios_base::in|std::ios_base::out ).c_str(),
+          std::ios_base::in|std::ios_base::out );
+    }
+    
+    template <class charT, class traits> template<class Path>
+    typename boost::enable_if<is_basic_path<Path>, void>::type
+    basic_fstream<charT,traits>::open( const Path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_fstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in | std::ios_base::out );
+    }
+
+    template <class charT, class traits>
+    void basic_fstream<charT,traits>::open( const wpath & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_fstream<charT,traits>::open(
+        detail::path_proxy( file_ph.external_file_string(),
+          mode ).c_str(), mode | std::ios_base::in | std::ios_base::out );
+    }
+
+# endif
+
+#  if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+    template <class charT, class traits>
+    basic_filebuf<charT,traits> *
+    basic_filebuf<charT, traits>::open( const path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      return std::basic_filebuf<charT,traits>::open(
+        file_ph.file_string().c_str(), mode ) == 0 ? 0 : this;
+    }
+#  endif
+
+    template <class charT, class traits>
+    basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph )
+      : std::basic_ifstream<charT,traits>(
+          file_ph.file_string().c_str(), std::ios_base::in ) {}
+
+    template <class charT, class traits>
+    basic_ifstream<charT,traits>::basic_ifstream( const path & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_ifstream<charT,traits>(
+          file_ph.file_string().c_str(), mode ) {}
+    
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+    template <class charT, class traits>
+    void basic_ifstream<charT,traits>::open( const path & file_ph )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        file_ph.file_string().c_str(), std::ios_base::in );
+    }
+    
+    template <class charT, class traits>
+    void basic_ifstream<charT,traits>::open( const path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ifstream<charT,traits>::open(
+        file_ph.file_string().c_str(), mode );
+    }
+#   endif
+
+    template <class charT, class traits>
+    basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph )
+      : std::basic_ofstream<charT,traits>(
+          file_ph.file_string().c_str(), std::ios_base::out ) {}
+
+    template <class charT, class traits>
+    basic_ofstream<charT,traits>::basic_ofstream( const path & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_ofstream<charT,traits>(
+          file_ph.file_string().c_str(), mode ) {}
+    
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+    template <class charT, class traits>
+    void basic_ofstream<charT,traits>::open( const path & file_ph )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        file_ph.file_string().c_str(), std::ios_base::out );
+    }
+    
+    template <class charT, class traits>
+    void basic_ofstream<charT,traits>::open( const path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_ofstream<charT,traits>::open(
+        file_ph.file_string().c_str(), mode );
+    }
+#   endif
+
+    template <class charT, class traits>
+    basic_fstream<charT,traits>::basic_fstream( const path & file_ph )
+      : std::basic_fstream<charT,traits>(
+          file_ph.file_string().c_str(),
+          std::ios_base::in|std::ios_base::out ) {}
+
+
+    template <class charT, class traits>
+    basic_fstream<charT,traits>::basic_fstream( const path & file_ph,
+      std::ios_base::openmode mode )
+      : std::basic_fstream<charT,traits>(
+          file_ph.file_string().c_str(), mode ) {}
+
+#   if !BOOST_WORKAROUND( BOOST_MSVC, <= 1200 ) // VC++ 6.0 can't handle this
+    template <class charT, class traits>
+    void basic_fstream<charT,traits>::open( const path & file_ph )
+    {
+      std::basic_fstream<charT,traits>::open(
+        file_ph.file_string().c_str(), std::ios_base::in|std::ios_base::out );
+    }
+
+    template <class charT, class traits>
+    void basic_fstream<charT,traits>::open( const path & file_ph,
+      std::ios_base::openmode mode )
+    {
+      std::basic_fstream<charT,traits>::open(
+        file_ph.file_string().c_str(), mode );
+    }
+#   endif
+  } // namespace filesystem
+} // namespace boost
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+#endif  // BOOST_FILESYSTEM_FSTREAM_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/operations.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1173 @@
+//  boost/filesystem/operations.hpp  -----------------------------------------//
+
+//  Copyright 2002-2005 Beman Dawes
+//  Copyright 2002 Jan Langer
+//  Copyright 2001 Dietmar Kuehl                                        
+//  
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_OPERATIONS_HPP
+#define BOOST_FILESYSTEM_OPERATIONS_HPP
+
+#include <boost/filesystem/path.hpp>
+
+#include <boost/shared_ptr.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/iterator.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+
+#include <string>
+#include <utility> // for pair
+#include <ctime>
+
+#ifdef BOOST_WINDOWS_API
+#  include <fstream>
+#  if !defined(_WIN32_WINNT) || _WIN32_WINNT >= 0x0500
+#    define BOOST_FS_HARD_LINK // Default for Windows 2K or later 
+#  endif
+#endif
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+# ifdef BOOST_NO_STDC_NAMESPACE
+    namespace std { using ::time_t; }
+# endif
+
+//----------------------------------------------------------------------------//
+
+namespace boost
+{
+  namespace filesystem
+  {
+
+// typedef boost::filesystem::path Path; needs to be in namespace boost::filesystem
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+#   define BOOST_FS_FUNC(BOOST_FS_TYPE) \
+      template<class Path> typename boost::enable_if<is_basic_path<Path>, \
+      BOOST_FS_TYPE>::type
+#   define BOOST_INLINE_FS_FUNC(BOOST_FS_TYPE) \
+      template<class Path> inline typename boost::enable_if<is_basic_path<Path>, \
+      BOOST_FS_TYPE>::type
+#   define BOOST_FS_TYPENAME typename
+# else
+#   define BOOST_FS_FUNC(BOOST_FS_TYPE) inline BOOST_FS_TYPE
+#   define BOOST_INLINE_FS_FUNC(BOOST_FS_TYPE) inline BOOST_FS_TYPE
+    typedef boost::filesystem::path Path;
+#   define BOOST_FS_TYPENAME
+# endif
+
+    template<class Path> class basic_directory_iterator;
+
+    // BOOST_FILESYSTEM_NARROW_ONLY needs this:
+    typedef basic_directory_iterator<path> directory_iterator;
+
+    template<class Path> class basic_directory_entry;
+
+    enum file_type
+    { 
+      status_unknown,
+      file_not_found,
+      regular_file,
+      directory_file,
+      // the following will never be reported by some operating or file systems
+      symlink_file,
+      block_file,
+      character_file,
+      fifo_file,
+      socket_file,
+      type_unknown // file does exist, but isn't one of the above types or
+                   // we don't have strong enough permission to find its type
+    };
+
+    class file_status
+    {
+    public:
+      explicit file_status( file_type v = status_unknown ) : m_value(v) {}
+
+      void type( file_type v )  { m_value = v; }
+      file_type type() const    { return m_value; }
+
+    private:
+      // the internal representation is unspecified so that additional state
+      // information such as permissions can be added in the future; this
+      // implementation just uses status_type as the internal representation
+
+      file_type m_value;
+    };
+
+    inline bool status_known( file_status f ) { return f.type() != status_unknown; }
+    inline bool exists( file_status f )       { return f.type() != status_unknown && f.type() != file_not_found; }
+    inline bool is_regular_file(file_status f){ return f.type() == regular_file; }
+    inline bool is_directory( file_status f ) { return f.type() == directory_file; }
+    inline bool is_symlink( file_status f )   { return f.type() == symlink_file; }
+    inline bool is_other( file_status f )     { return exists(f) && !is_regular_file(f) && !is_directory(f) && !is_symlink(f); }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    inline bool is_regular( file_status f )   { return f.type() == regular_file; }
+# endif
+
+    struct space_info
+    {
+      // all values are byte counts
+      boost::uintmax_t capacity;
+      boost::uintmax_t free;      // <= capacity
+      boost::uintmax_t available; // <= free
+    };
+
+    namespace detail
+    {
+      typedef std::pair< system::error_code, bool >
+        query_pair;
+
+      typedef std::pair< system::error_code, boost::uintmax_t >
+        uintmax_pair;
+
+      typedef std::pair< system::error_code, std::time_t >
+        time_pair;
+
+      typedef std::pair< system::error_code, space_info >
+        space_pair;
+
+      template< class Path >
+      struct directory_pair
+      {
+        typedef std::pair< system::error_code,
+          typename Path::external_string_type > type;
+      };
+
+#   ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+      BOOST_FILESYSTEM_DECL bool
+        symbolic_link_exists_api( const std::string & ); // deprecated
+#   endif
+
+      BOOST_FILESYSTEM_DECL file_status
+        status_api( const std::string & ph, system::error_code & ec );
+#   ifndef BOOST_WINDOWS_API
+      BOOST_FILESYSTEM_DECL file_status
+        symlink_status_api( const std::string & ph, system::error_code & ec );
+#   endif
+      BOOST_FILESYSTEM_DECL query_pair
+        is_empty_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL query_pair
+        equivalent_api( const std::string & ph1, const std::string & ph2 );
+      BOOST_FILESYSTEM_DECL uintmax_pair
+        file_size_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL space_pair
+        space_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL time_pair 
+        last_write_time_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        last_write_time_api( const std::string & ph, std::time_t new_value );
+      BOOST_FILESYSTEM_DECL system::error_code
+        get_current_path_api( std::string & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        set_current_path_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL query_pair
+        create_directory_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        create_hard_link_api( const std::string & to_ph,
+          const std::string & from_ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        create_symlink_api( const std::string & to_ph,
+          const std::string & from_ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        remove_api( const std::string & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        rename_api( const std::string & from, const std::string & to );
+      BOOST_FILESYSTEM_DECL system::error_code
+        copy_file_api( const std::string & from, const std::string & to );
+
+#   if defined(BOOST_WINDOWS_API)
+      
+      BOOST_FILESYSTEM_DECL system::error_code
+        get_full_path_name_api( const std::string & ph, std::string & target );
+
+#     if !defined(BOOST_FILESYSTEM_NARROW_ONLY)
+
+      BOOST_FILESYSTEM_DECL  boost::filesystem::file_status
+        status_api( const std::wstring & ph, system::error_code & ec );
+      BOOST_FILESYSTEM_DECL query_pair 
+        is_empty_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL query_pair
+        equivalent_api( const std::wstring & ph1, const std::wstring & ph2 );
+      BOOST_FILESYSTEM_DECL uintmax_pair 
+        file_size_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL space_pair 
+        space_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        get_full_path_name_api( const std::wstring & ph, std::wstring & target );
+      BOOST_FILESYSTEM_DECL time_pair 
+        last_write_time_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        last_write_time_api( const std::wstring & ph, std::time_t new_value );
+      BOOST_FILESYSTEM_DECL system::error_code 
+        get_current_path_api( std::wstring & ph );
+      BOOST_FILESYSTEM_DECL system::error_code 
+        set_current_path_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL query_pair
+        create_directory_api( const std::wstring & ph );
+# ifdef BOOST_FS_HARD_LINK
+      BOOST_FILESYSTEM_DECL system::error_code
+        create_hard_link_api( const std::wstring & existing_ph,
+          const std::wstring & new_ph );
+# endif
+      BOOST_FILESYSTEM_DECL system::error_code
+        create_symlink_api( const std::wstring & to_ph,
+          const std::wstring & from_ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        remove_api( const std::wstring & ph );
+      BOOST_FILESYSTEM_DECL system::error_code
+        rename_api( const std::wstring & from, const std::wstring & to );
+      BOOST_FILESYSTEM_DECL system::error_code
+        copy_file_api( const std::wstring & from, const std::wstring & to );
+
+#     endif
+#   endif
+
+      template<class Path>
+      bool remove_aux( const Path & ph, file_status f );
+
+      template<class Path>
+      unsigned long remove_all_aux( const Path & ph, file_status f );
+
+    } // namespace detail
+
+//  operations functions  ----------------------------------------------------//
+
+    //  The non-template overloads enable automatic conversion from std and
+    //  C-style strings. See basic_path constructors. The enable_if for the
+    //  templates implements the famous "do-the-right-thing" rule.
+
+//  query functions  ---------------------------------------------------------//
+
+    BOOST_INLINE_FS_FUNC(file_status)
+    status( const Path & ph, system::error_code & ec )
+      { return detail::status_api( ph.external_file_string(), ec ); }
+
+    BOOST_FS_FUNC(file_status)
+    status( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+        "boost::filesystem::status", ph, ec ) );
+      return result;
+    }
+
+    BOOST_INLINE_FS_FUNC(file_status)
+    symlink_status( const Path & ph, system::error_code & ec )
+#   ifdef BOOST_WINDOWS_API
+      { return detail::status_api( ph.external_file_string(), ec ); }
+#   else
+      { return detail::symlink_status_api( ph.external_file_string(), ec ); }
+#   endif
+
+    BOOST_FS_FUNC(file_status)
+    symlink_status( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( symlink_status( ph, ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+        "boost::filesystem::symlink_status", ph, ec ) );
+      return result;
+    }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    inline bool symbolic_link_exists( const path & ph )
+      { return is_symlink( symlink_status(ph) ); }
+# endif
+
+    BOOST_FS_FUNC(bool) exists( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::exists", ph, ec ) );
+      return exists( result );
+    }
+
+    BOOST_FS_FUNC(bool) is_directory( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_directory", ph, ec ) );
+      return is_directory( result );
+    }
+
+    BOOST_FS_FUNC(bool) is_regular_file( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_regular_file", ph, ec ) );
+      return is_regular_file( result );
+    }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    BOOST_FS_FUNC(bool) is_regular( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_regular", ph, ec ) );
+      return is_regular( result );
+    }
+# endif
+
+    BOOST_FS_FUNC(bool) is_other( const Path & ph )
+    { 
+      system::error_code ec;
+      file_status result( detail::status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_other", ph, ec ) );
+      return is_other( result );
+    }
+
+    BOOST_FS_FUNC(bool) is_symlink(
+#   ifdef BOOST_WINDOWS_API
+      const Path & )
+    {
+      return false;
+#   else
+      const Path & ph)
+    {
+      system::error_code ec;
+      file_status result( detail::symlink_status_api( ph.external_file_string(), ec ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_symlink", ph, ec ) );
+      return is_symlink( result );
+#   endif
+    }
+
+    // VC++ 7.0 and earlier has a serious namespace bug that causes a clash
+    // between boost::filesystem::is_empty and the unrelated type trait
+    // boost::is_empty.
+
+# if !defined( BOOST_MSVC ) || BOOST_MSVC > 1300
+    BOOST_FS_FUNC(bool) is_empty( const Path & ph )
+# else
+    BOOST_FS_FUNC(bool) _is_empty( const Path & ph )
+# endif
+    {
+      detail::query_pair result(
+        detail::is_empty_api( ph.external_file_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::is_empty", ph, result.first ) );
+      return result.second;
+    }
+
+    BOOST_FS_FUNC(bool) equivalent( const Path & ph1, const Path & ph2 )
+    {
+      detail::query_pair result( detail::equivalent_api(
+        ph1.external_file_string(), ph2.external_file_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::equivalent", ph1, ph2, result.first ) );
+      return result.second;
+    }
+
+    BOOST_FS_FUNC(boost::uintmax_t) file_size( const Path & ph )
+    {
+      detail::uintmax_pair result
+        ( detail::file_size_api( ph.external_file_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::file_size", ph, result.first ) );
+      return result.second;
+    }
+
+    BOOST_FS_FUNC(space_info) space( const Path & ph )
+    {
+      detail::space_pair result
+        ( detail::space_api( ph.external_file_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::space", ph, result.first ) );
+      return result.second;
+    }
+
+    BOOST_FS_FUNC(std::time_t) last_write_time( const Path & ph )
+    {
+      detail::time_pair result
+        ( detail::last_write_time_api( ph.external_file_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::last_write_time", ph, result.first ) );
+      return result.second;
+    }
+
+
+//  operations  --------------------------------------------------------------//
+
+    BOOST_FS_FUNC(bool) create_directory( const Path & dir_ph )
+    {
+      detail::query_pair result(
+        detail::create_directory_api( dir_ph.external_directory_string() ) );
+      if ( result.first )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::create_directory",
+          dir_ph, result.first ) );
+      return result.second;
+    }
+
+#if !defined(BOOST_WINDOWS_API) || defined(BOOST_FS_HARD_LINK)
+    BOOST_FS_FUNC(void)
+    create_hard_link( const Path & to_ph, const Path & from_ph )
+    {
+      system::error_code ec( 
+        detail::create_hard_link_api(
+          to_ph.external_file_string(),
+          from_ph.external_file_string() ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::create_hard_link",
+          to_ph, from_ph, ec ) );
+    }
+
+    BOOST_FS_FUNC(system::error_code)
+    create_hard_link( const Path & to_ph, const Path & from_ph,
+      system::error_code & ec )
+    {
+      ec = detail::create_hard_link_api(
+            to_ph.external_file_string(),
+            from_ph.external_file_string() );
+      return ec;
+    }
+#endif
+
+    BOOST_FS_FUNC(void)
+    create_symlink( const Path & to_ph, const Path & from_ph )
+    {
+      system::error_code ec( 
+        detail::create_symlink_api(
+          to_ph.external_file_string(),
+          from_ph.external_file_string() ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::create_symlink",
+          to_ph, from_ph, ec ) );
+    }
+
+    BOOST_FS_FUNC(system::error_code)
+    create_symlink( const Path & to_ph, const Path & from_ph,
+      system::error_code & ec )
+    {
+      ec = detail::create_symlink_api(
+             to_ph.external_file_string(),
+             from_ph.external_file_string() );
+      return ec;
+    }
+
+    BOOST_FS_FUNC(bool) remove( const Path & ph )
+    {
+      system::error_code ec;
+      file_status f = symlink_status( ph, ec );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::remove", ph, ec ) );
+      return detail::remove_aux( ph, f );
+    }
+
+    BOOST_FS_FUNC(unsigned long) remove_all( const Path & ph )
+    {
+      system::error_code ec;
+      file_status f = symlink_status( ph, ec );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::remove_all", ph, ec ) );
+      return exists( f ) ? detail::remove_all_aux( ph, f ) : 0;
+    }
+
+    BOOST_FS_FUNC(void) rename( const Path & from_path, const Path & to_path )
+    {
+      system::error_code ec( detail::rename_api(
+        from_path.external_directory_string(),
+        to_path.external_directory_string() ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::rename",
+          from_path, to_path, ec ) );
+    }
+
+    BOOST_FS_FUNC(void) copy_file( const Path & from_path, const Path & to_path )
+    {
+      system::error_code ec( detail::copy_file_api(
+        from_path.external_directory_string(),
+        to_path.external_directory_string() ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::copy_file",
+          from_path, to_path, ec ) );
+    }
+
+    template< class Path >
+    Path current_path()
+    {
+      typename Path::external_string_type ph;
+      system::error_code ec( detail::get_current_path_api( ph ) );
+      if ( ec )
+          boost::throw_exception( basic_filesystem_error<Path>(
+            "boost::filesystem::current_path", ec ) );
+      return Path( Path::traits_type::to_internal( ph ) );
+    }
+
+    BOOST_FS_FUNC(void) current_path( const Path & ph )
+    {
+      system::error_code ec( detail::set_current_path_api(
+        ph.external_directory_string() ) );
+      if ( ec )
+          boost::throw_exception( basic_filesystem_error<Path>(
+            "boost::filesystem::current_path", ph, ec ) );
+    }
+
+    template< class Path >
+    const Path & initial_path()
+    {
+      static Path init_path;
+      if ( init_path.empty() ) init_path = current_path<Path>();
+      return init_path;
+    }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    // legacy support
+    inline path current_path()  // overload supports pre-i18n apps
+      { return current_path<boost::filesystem::path>(); }
+    inline const path & initial_path() // overload supports pre-i18n apps
+      { return initial_path<boost::filesystem::path>(); }
+# endif
+
+    BOOST_FS_FUNC(Path) system_complete( const Path & ph )
+    {
+# ifdef BOOST_WINDOWS_API
+      if ( ph.empty() ) return ph;
+      BOOST_FS_TYPENAME Path::external_string_type sys_ph;
+      system::error_code ec( detail::get_full_path_name_api( ph.external_file_string(),
+              sys_ph ) );
+      if ( ec )
+          boost::throw_exception( basic_filesystem_error<Path>(
+            "boost::filesystem::system_complete", ph, ec ) );
+      return Path( Path::traits_type::to_internal( sys_ph ) );
+# else
+      return (ph.empty() || ph.is_complete())
+        ? ph : current_path<Path>() / ph;
+# endif
+    }
+
+    BOOST_FS_FUNC(Path)
+    complete( const Path & ph,
+      const Path & base/* = initial_path<Path>() */)
+    {
+      BOOST_ASSERT( base.is_complete()
+        && (ph.is_complete() || !ph.has_root_name())
+        && "boost::filesystem::complete() precondition not met" );
+#   ifdef BOOST_WINDOWS_PATH
+      if (ph.empty() || ph.is_complete()) return ph;
+      if ( !ph.has_root_name() )
+        return ph.has_root_directory()
+          ? Path( base.root_name() ) / ph
+          : base / ph;
+      return base / ph;
+#   else
+      return (ph.empty() || ph.is_complete()) ? ph : base / ph;
+#   endif
+    }
+
+    // VC++ 7.1 had trouble with default arguments, so separate one argument
+    // signatures are provided as workarounds; the effect is the same.
+    BOOST_FS_FUNC(Path) complete( const Path & ph )
+      { return complete( ph, initial_path<Path>() ); }
+
+    BOOST_FS_FUNC(void)
+    last_write_time( const Path & ph, const std::time_t new_time )
+    {
+      system::error_code ec( detail::last_write_time_api( ph.external_file_string(),
+          new_time ) );
+      if ( ec )
+        boost::throw_exception( basic_filesystem_error<Path>(
+          "boost::filesystem::last_write_time", ph, ec ) );
+    }
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+    // "do-the-right-thing" overloads  ---------------------------------------//
+
+    inline file_status status( const path & ph )
+      { return status<path>( ph ); }
+    inline file_status status( const wpath & ph )
+      { return status<wpath>( ph ); }
+
+    inline file_status status( const path & ph, system::error_code & ec )
+      { return status<path>( ph, ec ); }
+    inline file_status status( const wpath & ph, system::error_code & ec )
+      { return status<wpath>( ph, ec ); }
+
+    inline file_status symlink_status( const path & ph )
+      { return symlink_status<path>( ph ); }
+    inline file_status symlink_status( const wpath & ph )
+      { return symlink_status<wpath>( ph ); }
+
+    inline file_status symlink_status( const path & ph, system::error_code & ec )
+      { return symlink_status<path>( ph, ec ); }
+    inline file_status symlink_status( const wpath & ph, system::error_code & ec )
+      { return symlink_status<wpath>( ph, ec ); }
+
+    inline bool exists( const path & ph ) { return exists<path>( ph ); }
+    inline bool exists( const wpath & ph ) { return exists<wpath>( ph ); }
+
+    inline bool is_directory( const path & ph )
+      { return is_directory<path>( ph ); }
+    inline bool is_directory( const wpath & ph )
+      { return is_directory<wpath>( ph ); }
+ 
+    inline bool is_regular_file( const path & ph )
+      { return is_regular_file<path>( ph ); }
+    inline bool is_regular_file( const wpath & ph )
+      { return is_regular_file<wpath>( ph ); }
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    inline bool is_regular( const path & ph )
+      { return is_regular<path>( ph ); }
+    inline bool is_regular( const wpath & ph )
+      { return is_regular<wpath>( ph ); }
+# endif
+
+    inline bool is_other( const path & ph )
+      { return is_other<path>( ph ); }
+    inline bool is_other( const wpath & ph )
+      { return is_other<wpath>( ph ); }
+
+    inline bool is_symlink( const path & ph )
+      { return is_symlink<path>( ph ); }
+    inline bool is_symlink( const wpath & ph )
+      { return is_symlink<wpath>( ph ); }
+
+    inline bool is_empty( const path & ph )
+      { return is_empty<path>( ph ); }
+    inline bool is_empty( const wpath & ph )
+      { return is_empty<wpath>( ph ); }
+
+    inline bool equivalent( const path & ph1, const path & ph2 )
+      { return equivalent<path>( ph1, ph2 ); }
+    inline bool equivalent( const wpath & ph1, const wpath & ph2 )
+      { return equivalent<wpath>( ph1, ph2 ); }
+
+    inline boost::uintmax_t file_size( const path & ph )
+      { return file_size<path>( ph ); }
+    inline boost::uintmax_t file_size( const wpath & ph )
+      { return file_size<wpath>( ph ); }
+
+    inline space_info space( const path & ph )
+      { return space<path>( ph ); }
+    inline space_info space( const wpath & ph )
+      { return space<wpath>( ph ); }
+
+    inline std::time_t last_write_time( const path & ph )
+      { return last_write_time<path>( ph ); }
+    inline std::time_t last_write_time( const wpath & ph )
+      { return last_write_time<wpath>( ph ); }
+
+    inline bool create_directory( const path & dir_ph )
+      { return create_directory<path>( dir_ph ); }
+    inline bool create_directory( const wpath & dir_ph )
+      { return create_directory<wpath>( dir_ph ); }
+
+#if !defined(BOOST_WINDOWS_API) || defined(BOOST_FS_HARD_LINK)
+    inline void create_hard_link( const path & to_ph,
+      const path & from_ph )
+      { return create_hard_link<path>( to_ph, from_ph ); }
+    inline void create_hard_link( const wpath & to_ph,
+      const wpath & from_ph )
+      { return create_hard_link<wpath>( to_ph, from_ph ); }
+
+    inline system::error_code create_hard_link( const path & to_ph,
+      const path & from_ph, system::error_code & ec )
+      { return create_hard_link<path>( to_ph, from_ph, ec ); }
+    inline system::error_code create_hard_link( const wpath & to_ph,
+      const wpath & from_ph, system::error_code & ec )
+      { return create_hard_link<wpath>( to_ph, from_ph, ec ); }
+#endif
+    
+    inline void create_symlink( const path & to_ph,
+      const path & from_ph )
+      { return create_symlink<path>( to_ph, from_ph ); }
+    inline void create_symlink( const wpath & to_ph,
+      const wpath & from_ph )
+      { return create_symlink<wpath>( to_ph, from_ph ); }
+
+    inline system::error_code create_symlink( const path & to_ph,
+      const path & from_ph, system::error_code & ec )
+      { return create_symlink<path>( to_ph, from_ph, ec ); }
+    inline system::error_code create_symlink( const wpath & to_ph,
+      const wpath & from_ph, system::error_code & ec )
+      { return create_symlink<wpath>( to_ph, from_ph, ec ); }
+
+    inline bool remove( const path & ph )
+      { return remove<path>( ph ); }
+    inline bool remove( const wpath & ph )
+      { return remove<wpath>( ph ); }
+
+    inline unsigned long remove_all( const path & ph )
+      { return remove_all<path>( ph ); }
+    inline unsigned long remove_all( const wpath & ph )
+      { return remove_all<wpath>( ph ); }
+
+    inline void rename( const path & from_path, const path & to_path )
+      { return rename<path>( from_path, to_path ); }
+    inline void rename( const wpath & from_path, const wpath & to_path )
+      { return rename<wpath>( from_path, to_path ); }
+
+    inline void copy_file( const path & from_path, const path & to_path )
+      { return copy_file<path>( from_path, to_path ); }
+    inline void copy_file( const wpath & from_path, const wpath & to_path )
+      { return copy_file<wpath>( from_path, to_path ); }
+
+    inline path system_complete( const path & ph )
+      { return system_complete<path>( ph ); }
+    inline wpath system_complete( const wpath & ph )
+      { return system_complete<wpath>( ph ); }
+
+    inline path complete( const path & ph,
+      const path & base/* = initial_path<path>()*/ )
+      { return complete<path>( ph, base ); }
+    inline wpath complete( const wpath & ph,
+      const wpath & base/* = initial_path<wpath>()*/ )
+      { return complete<wpath>( ph, base ); }
+
+    inline path complete( const path & ph )
+      { return complete<path>( ph, initial_path<path>() ); }
+    inline wpath complete( const wpath & ph )
+      { return complete<wpath>( ph, initial_path<wpath>() ); }
+
+    inline void last_write_time( const path & ph, const std::time_t new_time )
+      { last_write_time<path>( ph, new_time ); }
+    inline void last_write_time( const wpath & ph, const std::time_t new_time )
+      { last_write_time<wpath>( ph, new_time ); }
+
+    inline void current_path( const path & ph )
+      { current_path<path>( ph ); }
+    inline void current_path( const wpath & ph )
+      { current_path<wpath>( ph ); }
+
+# endif // ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+    namespace detail
+    {
+      template<class Path>
+      bool remove_aux( const Path & ph, file_status f )
+      {
+        if ( exists( f ) )
+        {
+          system::error_code ec = remove_api( ph.external_file_string() );
+          if ( ec )
+            boost::throw_exception( basic_filesystem_error<Path>(
+              "boost::filesystem::remove", ph, ec ) );
+          return true;
+        }
+        return false;
+      }
+
+      template<class Path>
+      unsigned long remove_all_aux( const Path & ph, file_status f )
+      {
+        static const boost::filesystem::basic_directory_iterator<Path> end_itr;
+        unsigned long count = 1;
+        if ( !boost::filesystem::is_symlink( f ) // don't recurse symbolic links
+          && boost::filesystem::is_directory( f ) )
+        {
+          for ( boost::filesystem::basic_directory_iterator<Path> itr( ph );
+                itr != end_itr; ++itr )
+          {
+            boost::system::error_code ec;
+            boost::filesystem::file_status fn = boost::filesystem::symlink_status( itr->path(), ec );
+            if ( ec )
+              boost::throw_exception( basic_filesystem_error<Path>( 
+                "boost::filesystem:remove_all", ph, ec ) );
+            count += remove_all_aux( itr->path(), fn );
+          }
+        }
+        remove_aux( ph, f );
+        return count;
+      }
+
+//  test helper  -------------------------------------------------------------//
+
+    // not part of the documented interface because false positives are possible;
+    // there is no law that says that an OS that has large stat.st_size
+    // actually supports large file sizes.
+      BOOST_FILESYSTEM_DECL bool possible_large_file_size_support();
+
+//  directory_iterator helpers  ----------------------------------------------//
+
+//    forwarding functions avoid need for BOOST_FILESYSTEM_DECL for class
+//    basic_directory_iterator, and so avoid iterator_facade DLL template
+//    problems. They also overload to the proper external path character type.
+
+      BOOST_FILESYSTEM_DECL system::error_code
+        dir_itr_first( void *& handle,
+#if       defined(BOOST_POSIX_API)
+            void *& buffer,
+#endif
+          const std::string & dir_path,
+          std::string & target, file_status & fs, file_status & symlink_fs );
+      // eof: return==0 && handle==0
+
+      BOOST_FILESYSTEM_DECL system::error_code
+        dir_itr_increment( void *& handle,
+#if       defined(BOOST_POSIX_API)
+            void *& buffer,
+#endif
+          std::string & target, file_status & fs, file_status & symlink_fs );
+      // eof: return==0 && handle==0
+
+      BOOST_FILESYSTEM_DECL system::error_code
+        dir_itr_close( void *& handle
+#if       defined(BOOST_POSIX_API)
+            , void *& buffer
+#endif
+          );
+      // Effects: none if handle==0, otherwise close handle, set handle=0
+
+#     if defined(BOOST_WINDOWS_API) && !defined(BOOST_FILESYSTEM_NARROW_ONLY)
+      BOOST_FILESYSTEM_DECL system::error_code
+        dir_itr_first( void *& handle, const std::wstring & ph,
+          std::wstring & target, file_status & fs, file_status & symlink_fs );
+      BOOST_FILESYSTEM_DECL system::error_code
+        dir_itr_increment( void *& handle, std::wstring & target,
+          file_status & fs, file_status & symlink_fs );
+#     endif
+
+      template< class Path >
+      class dir_itr_imp
+      {
+      public:  
+        basic_directory_entry<Path> m_directory_entry;
+        void *        m_handle;
+#       ifdef BOOST_POSIX_API
+          void *      m_buffer;  // see dir_itr_increment implementation
+#       endif
+        dir_itr_imp() : m_handle(0)
+#       ifdef BOOST_POSIX_API
+          , m_buffer(0)
+#       endif
+        {}
+
+        ~dir_itr_imp() { dir_itr_close( m_handle
+#if       defined(BOOST_POSIX_API)
+            , m_buffer
+#endif
+          ); }
+      };
+
+      BOOST_FILESYSTEM_DECL system::error_code not_found_error();
+
+    } // namespace detail
+
+//  basic_directory_iterator  ------------------------------------------------//
+
+    template< class Path >
+    class basic_directory_iterator
+      : public boost::iterator_facade<
+          basic_directory_iterator<Path>,
+          basic_directory_entry<Path>,
+          boost::single_pass_traversal_tag >
+    {
+    public:
+      typedef Path path_type;
+
+      basic_directory_iterator(){}  // creates the "end" iterator
+
+      explicit basic_directory_iterator( const Path & dir_path );
+      basic_directory_iterator( const Path & dir_path, system::error_code & ec );
+
+    private:
+
+      // shared_ptr provides shallow-copy semantics required for InputIterators.
+      // m_imp.get()==0 indicates the end iterator.
+      boost::shared_ptr< detail::dir_itr_imp< Path > >  m_imp;
+
+      friend class boost::iterator_core_access;
+
+      typename boost::iterator_facade<
+        basic_directory_iterator<Path>,
+        basic_directory_entry<Path>,
+        boost::single_pass_traversal_tag >::reference dereference() const 
+      {
+        BOOST_ASSERT( m_imp.get() && "attempt to dereference end iterator" );
+        return m_imp->m_directory_entry;
+      }
+
+      void increment();
+
+      bool equal( const basic_directory_iterator & rhs ) const
+        { return m_imp == rhs.m_imp; }
+
+      system::error_code m_init( const Path & dir_path );
+    };
+
+    typedef basic_directory_iterator< path > directory_iterator;
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    typedef basic_directory_iterator< wpath > wdirectory_iterator;
+# endif
+
+    //  basic_directory_iterator implementation  ---------------------------//
+
+    template<class Path>
+    system::error_code basic_directory_iterator<Path>::m_init(
+      const Path & dir_path )
+    {
+      if ( dir_path.empty() )
+      {
+        m_imp.reset();
+        return detail::not_found_error();
+      }
+      typename Path::external_string_type name;
+      file_status fs, symlink_fs;
+      system::error_code ec( detail::dir_itr_first( m_imp->m_handle,
+#if   defined(BOOST_POSIX_API)
+        m_imp->m_buffer,
+#endif
+        dir_path.external_directory_string(),
+        name, fs, symlink_fs ) );
+
+      if ( ec )
+      {
+        m_imp.reset();
+        return ec;
+      }
+      
+      if ( m_imp->m_handle == 0 ) m_imp.reset(); // eof, so make end iterator
+      else // not eof
+      {
+        m_imp->m_directory_entry.assign( dir_path
+          / Path::traits_type::to_internal( name ), fs, symlink_fs );
+        if ( name[0] == dot<Path>::value // dot or dot-dot
+          && (name.size() == 1
+            || (name[1] == dot<Path>::value
+              && name.size() == 2)) )
+          {  increment(); }
+      }
+      return boost::system::error_code();
+    }
+
+    template<class Path>
+    basic_directory_iterator<Path>::basic_directory_iterator(
+      const Path & dir_path )
+      : m_imp( new detail::dir_itr_imp<Path> )
+    {
+      system::error_code ec( m_init(dir_path) );
+      if ( ec )
+      {
+        boost::throw_exception( basic_filesystem_error<Path>( 
+          "boost::filesystem::basic_directory_iterator constructor",
+          dir_path, ec ) );
+      }
+    }
+
+    template<class Path>
+    basic_directory_iterator<Path>::basic_directory_iterator(
+      const Path & dir_path, system::error_code & ec )
+      : m_imp( new detail::dir_itr_imp<Path> )
+    {
+      ec = m_init(dir_path);
+    }
+
+    template<class Path>
+    void basic_directory_iterator<Path>::increment()
+    {
+      BOOST_ASSERT( m_imp.get() && "attempt to increment end iterator" );
+      BOOST_ASSERT( m_imp->m_handle != 0 && "internal program error" );
+      
+      typename Path::external_string_type name;
+      file_status fs, symlink_fs;
+      system::error_code ec;
+
+      for (;;)
+      {
+        ec = detail::dir_itr_increment( m_imp->m_handle,
+#if     defined(BOOST_POSIX_API)
+          m_imp->m_buffer,
+#endif
+          name, fs, symlink_fs );
+        if ( ec )
+        {
+          boost::throw_exception( basic_filesystem_error<Path>(  
+            "boost::filesystem::basic_directory_iterator increment",
+            m_imp->m_directory_entry.path().parent_path(), ec ) );
+        }
+        if ( m_imp->m_handle == 0 ) { m_imp.reset(); return; } // eof, make end
+        if ( !(name[0] == dot<Path>::value // !(dot or dot-dot)
+          && (name.size() == 1
+            || (name[1] == dot<Path>::value
+              && name.size() == 2))) )
+        {
+          m_imp->m_directory_entry.replace_filename(
+            Path::traits_type::to_internal( name ), fs, symlink_fs );
+          return;
+        }
+      }
+    }
+
+    //  basic_directory_entry  -----------------------------------------------//
+    
+    template<class Path>
+    class basic_directory_entry
+    {
+    public:
+      typedef Path path_type;
+      typedef typename Path::string_type string_type;
+
+      // compiler generated copy-ctor, copy assignment, and destructor apply
+
+      basic_directory_entry() {}
+      explicit basic_directory_entry( const path_type & p,
+        file_status st = file_status(), file_status symlink_st=file_status() )
+        : m_path(p), m_status(st), m_symlink_status(symlink_st)
+        {}
+
+      void assign( const path_type & p,
+        file_status st, file_status symlink_st )
+        { m_path = p; m_status = st; m_symlink_status = symlink_st; }
+
+      void replace_filename( const string_type & s,
+        file_status st, file_status symlink_st )
+      {
+        m_path.remove_filename();
+        m_path /= s;
+        m_status = st;
+        m_symlink_status = symlink_st;
+      }
+
+#   ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+      void replace_leaf( const string_type & s,
+        file_status st, file_status symlink_st )
+          { replace_filename( s, st, symlink_st ); }
+#   endif
+
+      const Path &  path() const { return m_path; }
+      file_status   status() const;
+      file_status   status( system::error_code & ec ) const;
+      file_status   symlink_status() const;
+      file_status   symlink_status( system::error_code & ec ) const;
+
+      // conversion simplifies the most common use of basic_directory_entry
+      operator const path_type &() const { return m_path; }
+
+#   ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+      // deprecated functions preserve common use cases in legacy code
+      typename Path::string_type filename() const
+      {
+        return path().filename();
+      }
+      typename Path::string_type leaf() const
+      {
+        return path().filename();
+      }
+      typename Path::string_type string() const
+      {
+        return path().string();
+      }
+#   endif
+
+    private:
+      path_type             m_path;
+      mutable file_status  m_status;           // stat()-like
+      mutable file_status  m_symlink_status;   // lstat()-like
+        // note: m_symlink_status is not used by Windows implementation
+
+    }; // basic_directory_status
+
+    typedef basic_directory_entry<path> directory_entry;
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    typedef basic_directory_entry<wpath> wdirectory_entry;
+# endif
+
+    //  basic_directory_entry implementation  --------------------------------//
+
+    template<class Path>
+    file_status
+    basic_directory_entry<Path>::status() const
+    {
+      if ( !status_known( m_status ) )
+      {
+#     ifndef BOOST_WINDOWS_API
+        if ( status_known( m_symlink_status )
+          && !is_symlink( m_symlink_status ) )
+          { m_status = m_symlink_status; }
+        else { m_status = boost::filesystem::status( m_path ); }
+#     else
+        m_status = boost::filesystem::status( m_path );
+#     endif
+      }
+      return m_status;
+    }
+
+    template<class Path>
+    file_status
+    basic_directory_entry<Path>::status( system::error_code & ec ) const
+    {
+      if ( !status_known( m_status ) )
+      {
+#     ifndef BOOST_WINDOWS_API
+        if ( status_known( m_symlink_status )
+          && !is_symlink( m_symlink_status ) )
+          { ec = boost::system::error_code();; m_status = m_symlink_status; }
+        else { m_status = boost::filesystem::status( m_path, ec ); }
+#     else
+        m_status = boost::filesystem::status( m_path, ec );
+#     endif
+      }
+      else ec = boost::system::error_code();;
+      return m_status;
+    }
+
+    template<class Path>
+    file_status
+    basic_directory_entry<Path>::symlink_status() const
+    {
+#   ifndef BOOST_WINDOWS_API
+      if ( !status_known( m_symlink_status ) )
+        { m_symlink_status = boost::filesystem::symlink_status( m_path ); }
+      return m_symlink_status;
+#   else
+      return status();
+#   endif
+    }
+
+    template<class Path>
+    file_status
+    basic_directory_entry<Path>::symlink_status( system::error_code & ec ) const
+    {
+#   ifndef BOOST_WINDOWS_API
+      if ( !status_known( m_symlink_status ) )
+        { m_symlink_status = boost::filesystem::symlink_status( m_path, ec ); }
+      else ec = boost::system::error_code();;
+      return m_symlink_status;
+#   else
+      return status( ec );
+#   endif
+    }
+  } // namespace filesystem
+} // namespace boost
+
+#undef BOOST_FS_FUNC
+
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+#endif // BOOST_FILESYSTEM_OPERATIONS_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/filesystem/path.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1507 @@
+//  boost/filesystem/path.hpp  -----------------------------------------------//
+
+//  Copyright Beman Dawes 2002-2005
+//  Copyright Vladimir Prus 2002
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/filesystem
+
+//  basic_path's stem(), extension(), and replace_extension() are based on
+//  basename(), extension(), and change_extension() from the original
+//  filesystem/convenience.hpp header by Vladimir Prus.
+
+//----------------------------------------------------------------------------// 
+
+#ifndef BOOST_FILESYSTEM_PATH_HPP
+#define BOOST_FILESYSTEM_PATH_HPP
+
+#include <boost/filesystem/config.hpp>
+#include <boost/system/system_error.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/type_traits/is_same.hpp>
+#include <boost/static_assert.hpp>
+
+#include <string>
+#include <algorithm> // for lexicographical_compare
+#include <iosfwd>    // needed by basic_path inserter and extractor
+#include <stdexcept>
+#include <cassert>
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+#   include <locale>
+# endif
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+//----------------------------------------------------------------------------//
+
+namespace boost
+{
+  namespace BOOST_FILESYSTEM_NAMESPACE
+  {
+    template<class String, class Traits> class basic_path;
+
+    struct path_traits;
+    typedef basic_path< std::string, path_traits > path;
+
+    struct path_traits
+    {
+      typedef std::string internal_string_type;
+      typedef std::string external_string_type;
+      static external_string_type to_external( const path &,
+        const internal_string_type & src ) { return src; }
+      static internal_string_type to_internal(
+        const external_string_type & src ) { return src; }
+    };
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+    struct BOOST_FILESYSTEM_DECL wpath_traits;
+    
+    typedef basic_path< std::wstring, wpath_traits > wpath;
+
+    struct BOOST_FILESYSTEM_DECL wpath_traits
+    {
+      typedef std::wstring internal_string_type;
+# ifdef BOOST_WINDOWS_API
+      typedef std::wstring external_string_type;
+      static external_string_type to_external( const wpath &,
+        const internal_string_type & src ) { return src; }
+      static internal_string_type to_internal(
+        const external_string_type & src ) { return src; }
+# else
+      typedef std::string external_string_type;
+      static external_string_type to_external( const wpath & ph,
+        const internal_string_type & src );
+      static internal_string_type to_internal(
+        const external_string_type & src );
+# endif
+      static void imbue( const std::locale & loc );
+      static bool imbue( const std::locale & loc, const std::nothrow_t & );
+    };
+
+# endif // ifndef BOOST_FILESYSTEM_NARROW_ONLY
+
+    //  path traits  ---------------------------------------------------------//
+
+    template<class Path> struct is_basic_path
+      { BOOST_STATIC_CONSTANT( bool, value = false ); };
+    template<> struct is_basic_path<path>
+      { BOOST_STATIC_CONSTANT( bool, value = true ); };
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    template<> struct is_basic_path<wpath>
+      { BOOST_STATIC_CONSTANT( bool, value = true ); };
+# endif
+
+    // These only have to be specialized if Path::string_type::value_type
+    // is not convertible from char, although specializations may eliminate
+    // compiler warnings. See ticket 2543.
+    template<class Path> struct slash
+      { BOOST_STATIC_CONSTANT( char, value = '/' ); };
+
+    template<class Path> struct dot
+      { BOOST_STATIC_CONSTANT( char, value = '.' ); };
+
+    template<class Path> struct colon
+      { BOOST_STATIC_CONSTANT( char, value = ':' ); };
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    template<> struct slash<wpath>
+      { BOOST_STATIC_CONSTANT( wchar_t, value = L'/' ); };
+    template<> struct dot<wpath>
+      { BOOST_STATIC_CONSTANT( wchar_t, value = L'.' ); };
+    template<> struct colon<wpath>
+      { BOOST_STATIC_CONSTANT( wchar_t, value = L':' ); };
+# endif
+
+# ifdef BOOST_WINDOWS_PATH
+    template<class Path> struct path_alt_separator
+      { BOOST_STATIC_CONSTANT( char, value = '\\' ); };
+#   ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    template<> struct path_alt_separator<wpath>
+      { BOOST_STATIC_CONSTANT( wchar_t, value = L'\\' ); };
+#   endif
+# endif
+
+    //  workaround for VC++ 7.0 and earlier issues with nested classes
+    namespace detail
+    {
+      template<class Path>
+      class iterator_helper
+      {
+      public:
+        typedef typename Path::iterator iterator;
+        static void do_increment( iterator & ph );
+        static void do_decrement( iterator & ph );
+      };
+    }
+
+    //  basic_path  ----------------------------------------------------------//
+  
+    template<class String, class Traits>
+    class basic_path
+    {
+    // invariant: m_path valid according to the portable generic path grammar
+
+      // validate template arguments
+// TODO: get these working
+//      BOOST_STATIC_ASSERT( ::boost::is_same<String,typename Traits::internal_string_type>::value );
+//      BOOST_STATIC_ASSERT( ::boost::is_same<typename Traits::external_string_type,std::string>::value || ::boost::is_same<typename Traits::external_string_type,std::wstring>::value );
+
+    public:
+      // compiler generates copy constructor and copy assignment
+
+      typedef basic_path<String, Traits> path_type;
+      typedef String string_type;
+      typedef typename String::value_type value_type;
+      typedef Traits traits_type;
+      typedef typename Traits::external_string_type external_string_type; 
+
+      // constructors/destructor
+      basic_path() {}
+      basic_path( const string_type & s ) { operator/=( s ); }
+      basic_path( const value_type * s )  { operator/=( s ); }
+#     ifndef BOOST_NO_MEMBER_TEMPLATES
+        template <class InputIterator>
+          basic_path( InputIterator first, InputIterator last )
+            { append( first, last ); }
+#     endif
+     ~basic_path() {}
+
+      // assignments
+      basic_path & operator=( const string_type & s )
+      {
+#     if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, >= 310)
+        m_path.clear();
+#     else
+        m_path.erase( m_path.begin(), m_path.end() );
+#     endif
+        operator/=( s ); 
+        return *this;
+      }
+      basic_path & operator=( const value_type * s )
+      { 
+#     if BOOST_WORKAROUND(BOOST_DINKUMWARE_STDLIB, >= 310)
+        m_path.clear();
+#     else
+        m_path.erase( m_path.begin(), m_path.end() );
+#     endif
+        operator/=( s ); 
+        return *this;
+      }
+#     ifndef BOOST_NO_MEMBER_TEMPLATES
+        template <class InputIterator>
+          basic_path & assign( InputIterator first, InputIterator last )
+            { m_path.clear(); append( first, last ); return *this; }
+#     endif
+
+      // modifiers
+      basic_path & operator/=( const basic_path & rhs )  { return operator /=( rhs.string().c_str() ); }
+      basic_path & operator/=( const string_type & rhs ) { return operator /=( rhs.c_str() ); }
+      basic_path & operator/=( const value_type * s );
+#     ifndef BOOST_NO_MEMBER_TEMPLATES
+        template <class InputIterator>
+          basic_path & append( InputIterator first, InputIterator last );
+#     endif
+      
+      void swap( basic_path & rhs )
+      {
+        m_path.swap( rhs.m_path );
+#       ifdef BOOST_CYGWIN_PATH
+          std::swap( m_cygwin_root, rhs.m_cygwin_root );
+#       endif
+      }
+
+      basic_path & remove_filename();
+      basic_path & replace_extension( const string_type & new_extension = string_type() );
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+      basic_path & remove_leaf() { return remove_filename(); }
+# endif
+
+      // observers
+      const string_type & string() const         { return m_path; }
+      const string_type file_string() const;
+      const string_type directory_string() const { return file_string(); }
+
+      const external_string_type external_file_string() const { return Traits::to_external( *this, file_string() ); }
+      const external_string_type external_directory_string() const { return Traits::to_external( *this, directory_string() ); }
+
+      basic_path   root_path() const;
+      string_type  root_name() const;
+      string_type  root_directory() const;
+      basic_path   relative_path() const;
+      basic_path   parent_path() const;
+      string_type  filename() const;
+      string_type  stem() const;
+      string_type  extension() const;
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+      string_type  leaf() const            { return filename(); }
+      basic_path   branch_path() const     { return parent_path(); }
+      bool         has_leaf() const        { return !m_path.empty(); }
+      bool         has_branch_path() const { return !parent_path().empty(); }
+# endif
+
+      bool empty() const               { return m_path.empty(); } // name consistent with std containers
+      bool is_complete() const;
+      bool has_root_path() const;
+      bool has_root_name() const;
+      bool has_root_directory() const;
+      bool has_relative_path() const   { return !relative_path().empty(); }
+      bool has_filename() const        { return !m_path.empty(); }
+      bool has_parent_path() const     { return !parent_path().empty(); }
+
+      // iterators
+      class iterator : public boost::iterator_facade<
+        iterator,
+        string_type const,
+        boost::bidirectional_traversal_tag >
+      {
+      private:
+        friend class boost::iterator_core_access;
+        friend class boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits>;
+
+        const string_type & dereference() const
+          { return m_name; }
+        bool equal( const iterator & rhs ) const
+          { return m_path_ptr == rhs.m_path_ptr && m_pos == rhs.m_pos; }
+
+        friend class boost::BOOST_FILESYSTEM_NAMESPACE::detail::iterator_helper<path_type>;
+
+        void increment()
+        { 
+          boost::BOOST_FILESYSTEM_NAMESPACE::detail::iterator_helper<path_type>::do_increment(
+            *this );
+        }
+        void decrement()
+        { 
+          boost::BOOST_FILESYSTEM_NAMESPACE::detail::iterator_helper<path_type>::do_decrement(
+            *this );
+        }
+
+        string_type             m_name;     // current element
+        const basic_path *      m_path_ptr; // path being iterated over
+        typename string_type::size_type  m_pos;  // position of name in
+                                            // path_ptr->string(). The
+                                            // end() iterator is indicated by 
+                                            // pos == path_ptr->m_path.size()
+      }; // iterator
+
+      typedef iterator const_iterator;
+
+      iterator begin() const;
+      iterator end() const;
+
+    private:
+      // Note: This is an implementation for POSIX and Windows, where there
+      // are only minor differences between generic and native path grammars.
+      // Private members might be quite different in other implementations,
+      // particularly where there were wide differences between portable and
+      // native path formats, or between file_string() and
+      // directory_string() formats, or simply that the implementation
+      // was willing expend additional memory to achieve greater speed for
+      // some operations at the expense of other operations.
+
+      string_type  m_path; // invariant: portable path grammar
+                           // on Windows, backslashes converted to slashes
+
+#   ifdef BOOST_CYGWIN_PATH
+      bool m_cygwin_root; // if present, m_path[0] was slash. note: initialization
+                          // done by append
+#   endif  
+
+      void m_append_separator_if_needed();
+      void m_append( value_type value ); // converts Windows alt_separator
+
+      // Was qualified; como433beta8 reports:
+      //    warning #427-D: qualified name is not allowed in member declaration 
+      friend class iterator;
+      friend class boost::BOOST_FILESYSTEM_NAMESPACE::detail::iterator_helper<path_type>;
+
+      // Deprecated features ease transition for existing code. Don't use these
+      // in new code.
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+    public:
+      typedef bool (*name_check)( const std::string & name );
+      basic_path( const string_type & str, name_check ) { operator/=( str ); }
+      basic_path( const typename string_type::value_type * s, name_check )
+        { operator/=( s );}
+      string_type native_file_string() const { return file_string(); }
+      string_type native_directory_string() const { return directory_string(); }
+      static bool default_name_check_writable() { return false; } 
+      static void default_name_check( name_check ) {}
+      static name_check default_name_check() { return 0; }
+      basic_path & canonize();
+      basic_path & normalize();
+# endif
+    };
+
+  //  basic_path non-member functions  ---------------------------------------//
+
+    template< class String, class Traits >
+    inline void swap( basic_path<String, Traits> & lhs,
+               basic_path<String, Traits> & rhs ) { lhs.swap( rhs ); }
+
+    template< class String, class Traits >
+    bool operator<( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs )
+    {
+      return std::lexicographical_compare(
+        lhs.begin(), lhs.end(), rhs.begin(), rhs.end() );
+    }
+
+    template< class String, class Traits >
+    bool operator<( const typename basic_path<String, Traits>::string_type::value_type * lhs,
+                    const basic_path<String, Traits> & rhs )
+    {
+      basic_path<String, Traits> tmp( lhs );
+      return std::lexicographical_compare(
+        tmp.begin(), tmp.end(), rhs.begin(), rhs.end() );
+    }
+
+    template< class String, class Traits >
+    bool operator<( const typename basic_path<String, Traits>::string_type & lhs,
+                    const basic_path<String, Traits> & rhs )
+    {
+      basic_path<String, Traits> tmp( lhs );
+      return std::lexicographical_compare(
+        tmp.begin(), tmp.end(), rhs.begin(), rhs.end() );
+    }
+
+    template< class String, class Traits >
+    bool operator<( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type::value_type * rhs )
+    {
+      basic_path<String, Traits> tmp( rhs );
+      return std::lexicographical_compare(
+        lhs.begin(), lhs.end(), tmp.begin(), tmp.end() );
+    }
+
+    template< class String, class Traits >
+    bool operator<( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type & rhs )
+    {
+      basic_path<String, Traits> tmp( rhs );
+      return std::lexicographical_compare(
+        lhs.begin(), lhs.end(), tmp.begin(), tmp.end() );
+    }
+
+    //  operator == uses string compare rather than !(lhs < rhs) && !(rhs < lhs) because
+    //  the result is the same yet the direct string compare is much more efficient that
+    //  lexicographical_compare, and lexicographical_compare used twice at that.
+
+    template< class String, class Traits >
+    inline bool operator==( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs )
+    { 
+      return lhs.string() == rhs.string();
+    }
+
+    template< class String, class Traits >
+    inline bool operator==( const typename basic_path<String, Traits>::string_type::value_type * lhs,
+                    const basic_path<String, Traits> & rhs )
+    {
+      return lhs == rhs.string();
+    }
+
+    template< class String, class Traits >
+    inline bool operator==( const typename basic_path<String, Traits>::string_type & lhs,
+                    const basic_path<String, Traits> & rhs )
+    {
+      return lhs == rhs.string();
+    }
+
+    template< class String, class Traits >
+    inline bool operator==( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type::value_type * rhs )
+    {
+      return lhs.string() == rhs;
+    }
+
+    template< class String, class Traits >
+    inline bool operator==( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type & rhs )
+    {
+      return lhs.string() == rhs;
+    }
+
+    template< class String, class Traits >
+    inline bool operator!=( const basic_path<String, Traits> & lhs,
+      const basic_path<String, Traits> & rhs )
+        { return !(lhs == rhs); }
+    
+    template< class String, class Traits >
+    inline bool operator!=( const typename basic_path<String,
+      Traits>::string_type::value_type * lhs,
+        const basic_path<String, Traits> & rhs )
+        { return !(lhs == rhs); }
+
+    template< class String, class Traits >
+    inline bool operator!=( const typename basic_path<String, Traits>::string_type & lhs,
+      const basic_path<String, Traits> & rhs )
+        { return !(lhs == rhs); }
+
+    template< class String, class Traits >
+    inline bool operator!=( const basic_path<String, Traits> & lhs,
+      const typename basic_path<String, Traits>::string_type::value_type * rhs )
+        { return !(lhs == rhs); }
+
+    template< class String, class Traits >
+    inline bool operator!=( const basic_path<String, Traits> & lhs,
+      const typename basic_path<String, Traits>::string_type & rhs )
+        { return !(lhs == rhs); }
+
+    template< class String, class Traits >
+    inline bool operator>( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return rhs < lhs; }
+    
+    template< class String, class Traits >
+    inline bool operator>( const typename basic_path<String, Traits>::string_type::value_type * lhs,
+                    const basic_path<String, Traits> & rhs ) { return rhs < basic_path<String, Traits>(lhs); }
+
+    template< class String, class Traits >
+    inline bool operator>( const typename basic_path<String, Traits>::string_type & lhs,
+                    const basic_path<String, Traits> & rhs ) { return rhs < basic_path<String, Traits>(lhs); }
+
+    template< class String, class Traits >
+    inline bool operator>( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type::value_type * rhs )
+                    { return basic_path<String, Traits>(rhs) < lhs; }
+
+    template< class String, class Traits >
+    inline bool operator>( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type & rhs )
+                    { return basic_path<String, Traits>(rhs) < lhs; }
+
+    template< class String, class Traits >
+    inline bool operator<=( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return !(rhs < lhs); }
+    
+    template< class String, class Traits >
+    inline bool operator<=( const typename basic_path<String, Traits>::string_type::value_type * lhs,
+                    const basic_path<String, Traits> & rhs ) { return !(rhs < basic_path<String, Traits>(lhs)); }
+
+    template< class String, class Traits >
+    inline bool operator<=( const typename basic_path<String, Traits>::string_type & lhs,
+                    const basic_path<String, Traits> & rhs ) { return !(rhs < basic_path<String, Traits>(lhs)); }
+
+    template< class String, class Traits >
+    inline bool operator<=( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type::value_type * rhs )
+                    { return !(basic_path<String, Traits>(rhs) < lhs); }
+
+    template< class String, class Traits >
+    inline bool operator<=( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type & rhs )
+                    { return !(basic_path<String, Traits>(rhs) < lhs); }
+
+    template< class String, class Traits >
+    inline bool operator>=( const basic_path<String, Traits> & lhs, const basic_path<String, Traits> & rhs ) { return !(lhs < rhs); }
+    
+    template< class String, class Traits >
+    inline bool operator>=( const typename basic_path<String, Traits>::string_type::value_type * lhs,
+                    const basic_path<String, Traits> & rhs ) { return !(lhs < basic_path<String, Traits>(rhs)); }
+
+    template< class String, class Traits >
+    inline bool operator>=( const typename basic_path<String, Traits>::string_type & lhs,
+                    const basic_path<String, Traits> & rhs ) { return !(lhs < basic_path<String, Traits>(rhs)); }
+
+    template< class String, class Traits >
+    inline bool operator>=( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type::value_type * rhs )
+                    { return !(basic_path<String, Traits>(lhs) < rhs); }
+
+    template< class String, class Traits >
+    inline bool operator>=( const basic_path<String, Traits> & lhs,
+                    const typename basic_path<String, Traits>::string_type & rhs )
+                    { return !(basic_path<String, Traits>(lhs) < rhs); }
+
+    // operator /
+
+    template< class String, class Traits >
+    inline basic_path<String, Traits> operator/( 
+      const basic_path<String, Traits> & lhs,
+      const basic_path<String, Traits> & rhs )
+      { return basic_path<String, Traits>( lhs ) /= rhs; }
+
+    template< class String, class Traits >
+    inline basic_path<String, Traits> operator/( 
+      const basic_path<String, Traits> & lhs,
+      const typename String::value_type * rhs )
+      { return basic_path<String, Traits>( lhs ) /=
+          basic_path<String, Traits>( rhs ); }
+
+    template< class String, class Traits >
+    inline basic_path<String, Traits> operator/( 
+      const basic_path<String, Traits> & lhs, const String & rhs )
+      { return basic_path<String, Traits>( lhs ) /=
+          basic_path<String, Traits>( rhs ); }
+
+    template< class String, class Traits >
+    inline basic_path<String, Traits> operator/( 
+      const typename String::value_type * lhs,
+      const basic_path<String, Traits> & rhs )
+      { return basic_path<String, Traits>( lhs ) /= rhs; }
+
+    template< class String, class Traits >
+    inline basic_path<String, Traits> operator/(
+      const String & lhs, const basic_path<String, Traits> & rhs )
+      { return basic_path<String, Traits>( lhs ) /= rhs; }
+   
+    //  inserters and extractors  --------------------------------------------//
+
+// bypass VC++ 7.0 and earlier, and broken Borland compilers
+# if !BOOST_WORKAROUND(BOOST_MSVC, <= 1300) && !BOOST_WORKAROUND(__BORLANDC__, < 0x610)
+    template< class Path >
+    std::basic_ostream< typename Path::string_type::value_type,
+      typename Path::string_type::traits_type > &
+      operator<<
+      ( std::basic_ostream< typename Path::string_type::value_type,
+      typename Path::string_type::traits_type >& os, const Path & ph )
+    {
+      os << ph.string();
+      return os;
+    }
+
+    template< class Path >
+    std::basic_istream< typename Path::string_type::value_type,
+      typename Path::string_type::traits_type > &
+      operator>>
+      ( std::basic_istream< typename Path::string_type::value_type,
+      typename Path::string_type::traits_type >& is, Path & ph )
+    {
+      typename Path::string_type str;
+      is >> str;
+      ph = str;
+      return is;
+    }
+# elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    template< class String, class Traits >
+    std::basic_ostream< BOOST_DEDUCED_TYPENAME String::value_type,
+      BOOST_DEDUCED_TYPENAME String::traits_type > &
+      operator<<
+      ( std::basic_ostream< BOOST_DEDUCED_TYPENAME String::value_type,
+          BOOST_DEDUCED_TYPENAME String::traits_type >& os, 
+        const basic_path< String, Traits > & ph )
+    {
+      os << ph.string();
+      return os;
+    }
+
+    template< class String, class Traits >
+    std::basic_istream< BOOST_DEDUCED_TYPENAME String::value_type, 
+      BOOST_DEDUCED_TYPENAME String::traits_type > &
+      operator>>
+      ( std::basic_istream< BOOST_DEDUCED_TYPENAME String::value_type,
+          BOOST_DEDUCED_TYPENAME String::traits_type> & is,
+        basic_path< String, Traits > & ph )
+    {
+      String str;
+      is >> str;
+      ph = str;
+      return is;
+    }
+# endif
+
+    //  basic_filesystem_error helpers  --------------------------------------//
+
+    //  Originally choice of implementation was done via specialization of
+    //  basic_filesystem_error::what(). Several compilers (GCC, aCC, etc.)
+    //  couldn't handle that, so the choice is now accomplished by overloading.
+
+    namespace detail
+    {
+      // BOOST_FILESYSTEM_DECL version works for VC++ but not GCC. Go figure!
+      inline
+      const char * what( const char * sys_err_what,
+        const path & path1_arg, const path & path2_arg, std::string & target )
+      {
+        try
+        {
+          if ( target.empty() )
+          {
+            target = sys_err_what;
+            if ( !path1_arg.empty() )
+            {
+              target += ": \"";
+              target += path1_arg.file_string();
+              target += "\"";
+            }
+            if ( !path2_arg.empty() )
+            {
+              target += ", \"";
+              target += path2_arg.file_string();
+              target += "\"";
+            }
+          }
+          return target.c_str();
+        }
+        catch (...)
+        {
+          return sys_err_what;
+        }
+      }
+
+      template<class Path>
+      const char * what( const char * sys_err_what,
+        const Path & /*path1_arg*/, const Path & /*path2_arg*/, std::string & /*target*/ )
+      {
+        return sys_err_what;
+      }
+    }
+
+    //  basic_filesystem_error  ----------------------------------------------//
+
+    template<class Path>
+    class basic_filesystem_error : public system::system_error
+    {
+    // see http://www.boost.org/more/error_handling.html for design rationale
+    public:
+      // compiler generates copy constructor and copy assignment
+
+      typedef Path path_type;
+
+      basic_filesystem_error( const std::string & what_arg,
+        system::error_code ec );
+
+      basic_filesystem_error( const std::string & what_arg,
+        const path_type & path1_arg, system::error_code ec );
+
+      basic_filesystem_error( const std::string & what_arg, const path_type & path1_arg,
+        const path_type & path2_arg, system::error_code ec );
+
+      ~basic_filesystem_error() throw() {}
+
+      const path_type & path1() const
+      {
+        static const path_type empty_path;
+        return m_imp_ptr.get() ? m_imp_ptr->m_path1 : empty_path ;
+      }
+      const path_type & path2() const
+      {
+        static const path_type empty_path;
+        return m_imp_ptr.get() ? m_imp_ptr->m_path2 : empty_path ;
+      }
+
+      const char * what() const throw()
+      { 
+        if ( !m_imp_ptr.get() )
+          return system::system_error::what();
+        return detail::what( system::system_error::what(), m_imp_ptr->m_path1,
+          m_imp_ptr->m_path2, m_imp_ptr->m_what );  
+      }
+
+    private:
+      struct m_imp
+      {
+        path_type                 m_path1; // may be empty()
+        path_type                 m_path2; // may be empty()
+        std::string               m_what;  // not built until needed
+      };
+      boost::shared_ptr<m_imp> m_imp_ptr;
+    };
+
+    typedef basic_filesystem_error<path> filesystem_error;
+
+# ifndef BOOST_FILESYSTEM_NARROW_ONLY
+    typedef basic_filesystem_error<wpath> wfilesystem_error;
+# endif
+
+  //  path::name_checks  -----------------------------------------------------//
+
+    BOOST_FILESYSTEM_DECL bool portable_posix_name( const std::string & name );
+    BOOST_FILESYSTEM_DECL bool windows_name( const std::string & name );
+    BOOST_FILESYSTEM_DECL bool portable_name( const std::string & name );
+    BOOST_FILESYSTEM_DECL bool portable_directory_name( const std::string & name );
+    BOOST_FILESYSTEM_DECL bool portable_file_name( const std::string & name );
+    BOOST_FILESYSTEM_DECL bool native( const std::string & name );
+    inline bool no_check( const std::string & )
+      { return true; }
+
+// implementation  -----------------------------------------------------------//
+
+    namespace detail
+    {
+
+      //  is_separator helper ------------------------------------------------//
+
+      template<class Path>
+      inline  bool is_separator( typename Path::string_type::value_type c )
+      {
+        return c == slash<Path>::value
+#     ifdef BOOST_WINDOWS_PATH
+          || c == path_alt_separator<Path>::value
+#     endif
+          ;
+      }
+
+      // filename_pos helper  ----------------------------------------------------//
+
+      template<class String, class Traits>
+      typename String::size_type filename_pos(
+        const String & str, // precondition: portable generic path grammar
+        typename String::size_type end_pos ) // end_pos is past-the-end position
+      // return 0 if str itself is filename (or empty)
+      {
+        typedef typename
+          boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits> path_type;
+
+        // case: "//"
+        if ( end_pos == 2 
+          && str[0] == slash<path_type>::value
+          && str[1] == slash<path_type>::value ) return 0;
+
+        // case: ends in "/"
+        if ( end_pos && str[end_pos-1] == slash<path_type>::value )
+          return end_pos-1;
+        
+        // set pos to start of last element
+        typename String::size_type pos(
+          str.find_last_of( slash<path_type>::value, end_pos-1 ) );
+#       ifdef BOOST_WINDOWS_PATH
+        if ( pos == String::npos )
+          pos = str.find_last_of( path_alt_separator<path_type>::value, end_pos-1 );
+        if ( pos == String::npos )
+          pos = str.find_last_of( colon<path_type>::value, end_pos-2 );
+#       endif
+
+        return ( pos == String::npos // path itself must be a filename (or empty)
+          || (pos == 1 && str[0] == slash<path_type>::value) ) // or net
+            ? 0 // so filename is entire string
+            : pos + 1; // or starts after delimiter
+      }
+
+      // first_element helper  -----------------------------------------------//
+      //   sets pos and len of first element, excluding extra separators
+      //   if src.empty(), sets pos,len, to 0,0.
+
+      template<class String, class Traits>
+        void first_element(
+          const String & src, // precondition: portable generic path grammar
+          typename String::size_type & element_pos,
+          typename String::size_type & element_size,
+#       if !BOOST_WORKAROUND( BOOST_MSVC, <= 1310 ) // VC++ 7.1
+          typename String::size_type size = String::npos
+#       else
+          typename String::size_type size = -1
+#       endif
+          )
+      {
+        if ( size == String::npos ) size = src.size();
+        element_pos = 0;
+        element_size = 0;
+        if ( src.empty() ) return;
+
+        typedef typename boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits> path_type;
+
+        typename String::size_type cur(0);
+        
+        // deal with // [network]
+        if ( size >= 2 && src[0] == slash<path_type>::value
+          && src[1] == slash<path_type>::value
+          && (size == 2
+            || src[2] != slash<path_type>::value) )
+        { 
+          cur += 2;
+          element_size += 2;
+        }
+
+        // leading (not non-network) separator
+        else if ( src[0] == slash<path_type>::value )
+        {
+          ++element_size;
+          // bypass extra leading separators
+          while ( cur+1 < size
+            && src[cur+1] == slash<path_type>::value )
+          {
+            ++cur;
+            ++element_pos;
+          }
+          return;
+        }
+
+        // at this point, we have either a plain name, a network name,
+        // or (on Windows only) a device name
+
+        // find the end
+        while ( cur < size
+#         ifdef BOOST_WINDOWS_PATH
+          && src[cur] != colon<path_type>::value
+#         endif
+          && src[cur] != slash<path_type>::value )
+        {
+          ++cur;
+          ++element_size;
+        }
+
+#       ifdef BOOST_WINDOWS_PATH
+        if ( cur == size ) return;
+        // include device delimiter
+        if ( src[cur] == colon<path_type>::value )
+          { ++element_size; }
+#       endif
+
+        return;
+      }
+
+      // root_directory_start helper  ----------------------------------------//
+
+      template<class String, class Traits>
+      typename String::size_type root_directory_start(
+        const String & s, // precondition: portable generic path grammar
+        typename String::size_type size )
+      // return npos if no root_directory found
+      {
+        typedef typename boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits> path_type;
+
+#     ifdef BOOST_WINDOWS_PATH
+        // case "c:/"
+        if ( size > 2
+          && s[1] == colon<path_type>::value
+          && s[2] == slash<path_type>::value ) return 2;
+#     endif
+
+        // case "//"
+        if ( size == 2
+          && s[0] == slash<path_type>::value
+          && s[1] == slash<path_type>::value ) return String::npos;
+
+        // case "//net {/}"
+        if ( size > 3
+          && s[0] == slash<path_type>::value
+          && s[1] == slash<path_type>::value
+          && s[2] != slash<path_type>::value )
+        {
+          typename String::size_type pos(
+            s.find( slash<path_type>::value, 2 ) );
+          return pos < size ? pos : String::npos;
+        }
+        
+        // case "/"
+        if ( size > 0 && s[0] == slash<path_type>::value ) return 0;
+
+        return String::npos;
+      }
+
+      // is_non_root_slash helper  -------------------------------------------//
+
+      template<class String, class Traits>
+      bool is_non_root_slash( const String & str,
+        typename String::size_type pos ) // pos is position of the slash
+      {
+        typedef typename
+          boost::BOOST_FILESYSTEM_NAMESPACE::basic_path<String, Traits>
+            path_type;
+
+        assert( !str.empty() && str[pos] == slash<path_type>::value
+          && "precondition violation" );
+
+        // subsequent logic expects pos to be for leftmost slash of a set
+        while ( pos > 0 && str[pos-1] == slash<path_type>::value )
+          --pos;
+
+        return  pos != 0
+          && (pos <= 2 || str[1] != slash<path_type>::value
+            || str.find( slash<path_type>::value, 2 ) != pos)
+#       ifdef BOOST_WINDOWS_PATH
+          && (pos !=2 || str[1] != colon<path_type>::value)
+#       endif
+            ;
+      }
+    } // namespace detail
+
+    // decomposition functions  ----------------------------------------------//
+
+    template<class String, class Traits>
+    String basic_path<String, Traits>::filename() const
+    {
+      typename String::size_type end_pos(
+        detail::filename_pos<String, Traits>( m_path, m_path.size() ) );
+      return (m_path.size()
+                && end_pos
+                && m_path[end_pos] == slash<path_type>::value
+                && detail::is_non_root_slash< String, Traits >(m_path, end_pos))
+        ? String( 1, dot<path_type>::value )
+        : m_path.substr( end_pos );
+    }
+
+    template<class String, class Traits>
+    String basic_path<String, Traits>::stem() const
+    {
+      string_type name = filename();
+      typename string_type::size_type n = name.rfind('.');
+      return name.substr(0, n);
+    }
+
+    template<class String, class Traits>
+    String basic_path<String, Traits>::extension() const
+    {
+      string_type name = filename();
+      typename string_type::size_type n = name.rfind('.');
+      if (n != string_type::npos)
+        return name.substr(n);
+      else
+        return string_type();
+    }
+
+    template<class String, class Traits>
+    basic_path<String, Traits> basic_path<String, Traits>::parent_path() const
+    {
+      typename String::size_type end_pos(
+        detail::filename_pos<String, Traits>( m_path, m_path.size() ) );
+
+      bool filename_was_separator( m_path.size()
+        && m_path[end_pos] == slash<path_type>::value );
+
+      // skip separators unless root directory
+      typename string_type::size_type root_dir_pos( detail::root_directory_start
+        <string_type, traits_type>( m_path, end_pos ) );
+      for ( ; 
+        end_pos > 0
+        && (end_pos-1) != root_dir_pos
+        && m_path[end_pos-1] == slash<path_type>::value
+        ;
+        --end_pos ) {}
+
+     return (end_pos == 1 && root_dir_pos == 0 && filename_was_separator)
+       ? path_type()
+       : path_type( m_path.substr( 0, end_pos ) );
+    }
+
+    template<class String, class Traits>
+    basic_path<String, Traits> basic_path<String, Traits>::relative_path() const
+    {
+      iterator itr( begin() );
+      for ( ; itr.m_pos != m_path.size()
+          && (itr.m_name[0] == slash<path_type>::value
+#     ifdef BOOST_WINDOWS_PATH
+          || itr.m_name[itr.m_name.size()-1]
+            == colon<path_type>::value
+#     endif
+             ); ++itr ) {}
+
+      return basic_path<String, Traits>( m_path.substr( itr.m_pos ) );
+    }
+
+    template<class String, class Traits>
+    String basic_path<String, Traits>::root_name() const
+    {
+      iterator itr( begin() );
+
+      return ( itr.m_pos != m_path.size()
+        && (
+            ( itr.m_name.size() > 1
+              && itr.m_name[0] == slash<path_type>::value
+              && itr.m_name[1] == slash<path_type>::value
+            )
+#     ifdef BOOST_WINDOWS_PATH
+          || itr.m_name[itr.m_name.size()-1]
+            == colon<path_type>::value
+#     endif
+           ) )
+        ? *itr
+        : String();
+    }
+
+    template<class String, class Traits>
+    String basic_path<String, Traits>::root_directory() const
+    {
+      typename string_type::size_type start(
+        detail::root_directory_start<String, Traits>( m_path, m_path.size() ) );
+
+      return start == string_type::npos
+        ? string_type()
+        : m_path.substr( start, 1 );
+    }
+
+    template<class String, class Traits>
+    basic_path<String, Traits> basic_path<String, Traits>::root_path() const
+    {
+      // even on POSIX, root_name() is non-empty() on network paths
+      return basic_path<String, Traits>( root_name() ) /= root_directory();
+    }
+
+    // path query functions  -------------------------------------------------//
+
+    template<class String, class Traits>
+    inline bool basic_path<String, Traits>::is_complete() const
+    {
+#   ifdef BOOST_WINDOWS_PATH
+      return has_root_name() && has_root_directory();
+#   else
+      return has_root_directory();
+#   endif
+    }
+
+    template<class String, class Traits>
+    inline bool basic_path<String, Traits>::has_root_path() const
+    {
+      return !root_path().empty();
+    }
+
+    template<class String, class Traits>
+    inline bool basic_path<String, Traits>::has_root_name() const
+    {
+      return !root_name().empty();
+    }
+
+    template<class String, class Traits>
+    inline bool basic_path<String, Traits>::has_root_directory() const
+    {
+      return !root_directory().empty();
+    }
+
+    // append  ---------------------------------------------------------------//
+
+    template<class String, class Traits>
+    void basic_path<String, Traits>::m_append_separator_if_needed()
+    // requires: !empty()
+    {
+      if (
+#       ifdef BOOST_WINDOWS_PATH
+        *(m_path.end()-1) != colon<path_type>::value && 
+#       endif
+        *(m_path.end()-1) != slash<path_type>::value )
+      {
+        m_path += slash<path_type>::value;
+      }
+    }
+      
+    template<class String, class Traits>
+    void basic_path<String, Traits>::m_append( value_type value )
+    {
+#   ifdef BOOST_CYGWIN_PATH
+      if ( m_path.empty() ) m_cygwin_root = (value == slash<path_type>::value);
+#   endif
+
+#   ifdef BOOST_WINDOWS_PATH
+      // for BOOST_WINDOWS_PATH, convert alt_separator ('\') to separator ('/')
+      m_path += ( value == path_alt_separator<path_type>::value
+        ? slash<path_type>::value
+        : value );
+#   else
+      m_path += value;
+#   endif
+    }
+    
+    // except that it wouldn't work for BOOST_NO_MEMBER_TEMPLATES compilers,
+    // the append() member template could replace this code.
+    template<class String, class Traits>
+    basic_path<String, Traits> & basic_path<String, Traits>::operator /=
+      ( const value_type * next_p )
+    {
+      // ignore escape sequence on POSIX or Windows
+      if ( *next_p == slash<path_type>::value
+        && *(next_p+1) == slash<path_type>::value
+        && *(next_p+2) == colon<path_type>::value ) next_p += 3;
+      
+      // append slash<path_type>::value if needed
+      if ( !empty() && *next_p != 0
+        && !detail::is_separator<path_type>( *next_p ) )
+      { m_append_separator_if_needed(); }
+
+      for ( ; *next_p != 0; ++next_p ) m_append( *next_p );
+      return *this;
+    }
+
+# ifndef BOOST_NO_MEMBER_TEMPLATES
+    template<class String, class Traits> template <class InputIterator>
+      basic_path<String, Traits> & basic_path<String, Traits>::append(
+        InputIterator first, InputIterator last )
+    {
+      // append slash<path_type>::value if needed
+      if ( !empty() && first != last
+        && !detail::is_separator<path_type>( *first ) )
+      { m_append_separator_if_needed(); }
+
+      // song-and-dance to avoid violating InputIterator requirements
+      // (which prohibit lookahead) in detecting a possible escape sequence
+      // (escape sequences are simply ignored on POSIX and Windows)
+      bool was_escape_sequence(true);
+      std::size_t append_count(0);
+      typename String::size_type initial_pos( m_path.size() );
+
+      for ( ; first != last && *first; ++first )
+      {
+        if ( append_count == 0 && *first != slash<path_type>::value )
+          was_escape_sequence = false;
+        if ( append_count == 1 && *first != slash<path_type>::value )
+          was_escape_sequence = false;
+        if ( append_count == 2 && *first != colon<path_type>::value )
+          was_escape_sequence = false;
+        m_append( *first );
+        ++append_count;
+      }
+
+      // erase escape sequence if any
+      if ( was_escape_sequence && append_count >= 3 )
+        m_path.erase( initial_pos, 3 );
+
+      return *this;
+    }
+# endif
+
+# ifndef BOOST_FILESYSTEM_NO_DEPRECATED
+
+    // canonize  ------------------------------------------------------------//
+
+    template<class String, class Traits>
+    basic_path<String, Traits> & basic_path<String, Traits>::canonize()
+    {
+      static const typename string_type::value_type dot_str[]
+        = { dot<path_type>::value, 0 };
+
+      if ( m_path.empty() ) return *this;
+        
+      path_type temp;
+
+      for ( iterator itr( begin() ); itr != end(); ++itr )
+      {
+        temp /= *itr;
+      };
+
+      if ( temp.empty() ) temp /= dot_str;
+      m_path = temp.m_path;
+      return *this;
+    }
+
+    // normalize  ------------------------------------------------------------//
+
+    template<class String, class Traits>
+    basic_path<String, Traits> & basic_path<String, Traits>::normalize()
+    {
+      static const typename string_type::value_type dot_str[]
+        = { dot<path_type>::value, 0 };
+
+      if ( m_path.empty() ) return *this;
+        
+      path_type temp;
+      iterator start( begin() );
+      iterator last( end() );
+      iterator stop( last-- );
+      for ( iterator itr( start ); itr != stop; ++itr )
+      {
+        // ignore "." except at start and last
+        if ( itr->size() == 1
+          && (*itr)[0] == dot<path_type>::value
+          && itr != start
+          && itr != last ) continue;
+
+        // ignore a name and following ".."
+        if ( !temp.empty()
+          && itr->size() == 2
+          && (*itr)[0] == dot<path_type>::value
+          && (*itr)[1] == dot<path_type>::value ) // dot dot
+        {
+          string_type lf( temp.filename() );  
+          if ( lf.size() > 0  
+            && (lf.size() != 1
+              || (lf[0] != dot<path_type>::value
+                && lf[0] != slash<path_type>::value))
+            && (lf.size() != 2 
+              || (lf[0] != dot<path_type>::value
+                && lf[1] != dot<path_type>::value
+#             ifdef BOOST_WINDOWS_PATH
+                && lf[1] != colon<path_type>::value
+#             endif
+                 )
+               )
+            )
+          {
+            temp.remove_filename();
+            // if not root directory, must also remove "/" if any
+            if ( temp.m_path.size() > 0
+              && temp.m_path[temp.m_path.size()-1]
+                == slash<path_type>::value )
+            {
+              typename string_type::size_type rds(
+                detail::root_directory_start<String,Traits>( temp.m_path,
+                  temp.m_path.size() ) );
+              if ( rds == string_type::npos
+                || rds != temp.m_path.size()-1 ) 
+                { temp.m_path.erase( temp.m_path.size()-1 ); }
+            }
+
+            iterator next( itr );
+            if ( temp.empty() && ++next != stop
+              && next == last && *last == dot_str ) temp /= dot_str;
+            continue;
+          }
+        }
+
+        temp /= *itr;
+      };
+
+      if ( temp.empty() ) temp /= dot_str;
+      m_path = temp.m_path;
+      return *this;
+    }
+
+# endif
+
+    // modifiers  ------------------------------------------------------------//
+
+    template<class String, class Traits>
+    basic_path<String, Traits> & basic_path<String, Traits>::remove_filename()
+    {
+      m_path.erase(
+        detail::filename_pos<String, Traits>( m_path, m_path.size() ) );
+      return *this;
+    }
+
+    template<class String, class Traits>
+    basic_path<String, Traits> &
+    basic_path<String, Traits>::replace_extension( const string_type & new_ext )
+    {
+      // erase existing extension if any
+      string_type old_ext = extension();
+      if ( !old_ext.empty() )
+        m_path.erase( m_path.size() - old_ext.size() );
+
+      if ( !new_ext.empty() && new_ext[0] != dot<path_type>::value )
+        m_path += dot<path_type>::value;
+
+      m_path += new_ext;
+
+      return *this;
+    }
+
+
+    // path conversion functions  --------------------------------------------//
+
+    template<class String, class Traits>
+    const String
+    basic_path<String, Traits>::file_string() const
+    {
+#   ifdef BOOST_WINDOWS_PATH
+      // for Windows, use the alternate separator, and bypass extra 
+      // root separators
+
+      typename string_type::size_type root_dir_start(
+        detail::root_directory_start<String, Traits>( m_path, m_path.size() ) );
+      bool in_root( root_dir_start != string_type::npos );
+      String s;
+      for ( typename string_type::size_type pos( 0 );
+        pos != m_path.size(); ++pos )
+      {
+        // special case // [net]
+        if ( pos == 0 && m_path.size() > 1
+          && m_path[0] == slash<path_type>::value
+          && m_path[1] == slash<path_type>::value
+          && ( m_path.size() == 2 
+            || !detail::is_separator<path_type>( m_path[2] )
+             ) )
+        {
+          ++pos;
+          s += path_alt_separator<path_type>::value;
+          s += path_alt_separator<path_type>::value;
+          continue;
+        }   
+
+        // bypass extra root separators
+        if ( in_root )
+        { 
+          if ( s.size() > 0
+            && s[s.size()-1] == path_alt_separator<path_type>::value
+            && m_path[pos] == slash<path_type>::value
+            ) continue;
+        }
+
+        if ( m_path[pos] == slash<path_type>::value )
+          s += path_alt_separator<path_type>::value;
+        else
+          s += m_path[pos];
+
+        if ( pos > root_dir_start
+          && m_path[pos] == slash<path_type>::value )
+          { in_root = false; }
+      }
+#   ifdef BOOST_CYGWIN_PATH
+      if ( m_cygwin_root ) s[0] = slash<path_type>::value;
+#   endif
+      return s;
+#   else
+      return m_path;
+#   endif
+    }
+
+    // iterator functions  ---------------------------------------------------//
+
+    template<class String, class Traits>
+    typename basic_path<String, Traits>::iterator basic_path<String, Traits>::begin() const
+    {
+      iterator itr;
+      itr.m_path_ptr = this;
+      typename string_type::size_type element_size;
+      detail::first_element<String, Traits>( m_path, itr.m_pos, element_size );
+      itr.m_name = m_path.substr( itr.m_pos, element_size );
+      return itr;
+    }
+
+    template<class String, class Traits>
+    typename basic_path<String, Traits>::iterator basic_path<String, Traits>::end() const
+      {
+        iterator itr;
+        itr.m_path_ptr = this;
+        itr.m_pos = m_path.size();
+        return itr;
+      }
+
+    namespace detail
+    {
+      //  do_increment  ------------------------------------------------------//
+
+      template<class Path>
+      void iterator_helper<Path>::do_increment( iterator & itr )
+      {
+        typedef typename Path::string_type string_type;
+        typedef typename Path::traits_type traits_type;
+
+        assert( itr.m_pos < itr.m_path_ptr->m_path.size() && "basic_path::iterator increment past end()" );
+
+        bool was_net( itr.m_name.size() > 2
+          && itr.m_name[0] == slash<Path>::value
+          && itr.m_name[1] == slash<Path>::value
+          && itr.m_name[2] != slash<Path>::value );
+
+        // increment to position past current element
+        itr.m_pos += itr.m_name.size();
+
+        // if end reached, create end iterator
+        if ( itr.m_pos == itr.m_path_ptr->m_path.size() )
+        {
+          itr.m_name.erase( itr.m_name.begin(), itr.m_name.end() ); // VC++ 6.0 lib didn't supply clear() 
+          return;
+        }
+
+        // process separator (Windows drive spec is only case not a separator)
+        if ( itr.m_path_ptr->m_path[itr.m_pos] == slash<Path>::value )
+        {
+          // detect root directory
+          if ( was_net
+  #       ifdef BOOST_WINDOWS_PATH
+            // case "c:/"
+            || itr.m_name[itr.m_name.size()-1] == colon<Path>::value
+  #       endif
+             )
+          {
+            itr.m_name = slash<Path>::value;
+            return;
+          }
+
+          // bypass separators
+          while ( itr.m_pos != itr.m_path_ptr->m_path.size()
+            && itr.m_path_ptr->m_path[itr.m_pos] == slash<Path>::value )
+            { ++itr.m_pos; }
+
+          // detect trailing separator, and treat it as ".", per POSIX spec
+          if ( itr.m_pos == itr.m_path_ptr->m_path.size()
+            && detail::is_non_root_slash< string_type, traits_type >(
+                itr.m_path_ptr->m_path, itr.m_pos-1 ) ) 
+          {
+            --itr.m_pos;
+            itr.m_name = dot<Path>::value;
+            return;
+          }
+        }
+
+        // get next element
+        typename string_type::size_type end_pos(
+          itr.m_path_ptr->m_path.find( slash<Path>::value, itr.m_pos ) );
+        itr.m_name = itr.m_path_ptr->m_path.substr( itr.m_pos, end_pos - itr.m_pos );
+      } 
+
+      //  do_decrement  ------------------------------------------------------//
+
+      template<class Path>
+      void iterator_helper<Path>::do_decrement( iterator & itr )
+      {                                                                                
+        assert( itr.m_pos && "basic_path::iterator decrement past begin()"  );
+
+        typedef typename Path::string_type string_type;
+        typedef typename Path::traits_type traits_type;
+
+        typename string_type::size_type end_pos( itr.m_pos );
+
+        typename string_type::size_type root_dir_pos(
+          detail::root_directory_start<string_type, traits_type>(
+            itr.m_path_ptr->m_path, end_pos ) );
+
+        // if at end and there was a trailing non-root '/', return "."
+        if ( itr.m_pos == itr.m_path_ptr->m_path.size()
+          && itr.m_path_ptr->m_path.size() > 1
+          && itr.m_path_ptr->m_path[itr.m_pos-1] == slash<Path>::value
+          && detail::is_non_root_slash< string_type, traits_type >(
+               itr.m_path_ptr->m_path, itr.m_pos-1 ) 
+           )
+        {
+          --itr.m_pos;
+            itr.m_name = dot<Path>::value;
+            return;
+        }
+
+        // skip separators unless root directory
+        for ( 
+          ; 
+          end_pos > 0
+          && (end_pos-1) != root_dir_pos
+          && itr.m_path_ptr->m_path[end_pos-1] == slash<Path>::value
+          ;
+          --end_pos ) {}
+
+        itr.m_pos = detail::filename_pos<string_type, traits_type>
+            ( itr.m_path_ptr->m_path, end_pos );
+        itr.m_name = itr.m_path_ptr->m_path.substr( itr.m_pos, end_pos - itr.m_pos );
+      }
+    } // namespace detail
+
+    //  basic_filesystem_error implementation --------------------------------//
+
+    template<class Path>
+    basic_filesystem_error<Path>::basic_filesystem_error(
+      const std::string & what_arg, system::error_code ec )
+      : system::system_error(ec, what_arg)
+    {
+      try
+      {
+        m_imp_ptr.reset( new m_imp );
+      }
+      catch (...) { m_imp_ptr.reset(); }
+    }
+
+    template<class Path>
+    basic_filesystem_error<Path>::basic_filesystem_error(
+      const std::string & what_arg, const path_type & path1_arg,
+      system::error_code ec )
+      : system::system_error(ec, what_arg)
+    {
+      try
+      {
+        m_imp_ptr.reset( new m_imp );
+        m_imp_ptr->m_path1 = path1_arg;
+      }
+      catch (...) { m_imp_ptr.reset(); }
+    }
+
+    template<class Path>
+    basic_filesystem_error<Path>::basic_filesystem_error(
+      const std::string & what_arg, const path_type & path1_arg,
+      const path_type & path2_arg, system::error_code ec )
+      : system::system_error(ec, what_arg)
+    {
+      try
+      {
+        m_imp_ptr.reset( new m_imp );
+        m_imp_ptr->m_path1 = path1_arg;
+        m_imp_ptr->m_path2 = path2_arg;
+      }
+      catch (...) { m_imp_ptr.reset(); }
+    }
+
+  } // namespace BOOST_FILESYSTEM_NAMESPACE
+} // namespace boost
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+
+#endif // BOOST_FILESYSTEM_PATH_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/none.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Distributed under the Boost Software License, Version 1.0.
+// (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_NONE_17SEP2003_HPP
+#define BOOST_NONE_17SEP2003_HPP
+
+#include "boost/none_t.hpp"
+
+// NOTE: Borland users have to include this header outside any precompiled headers
+// (bcc<=5.64 cannot include instance data in a precompiled header)
+//  -- * To be verified, now that there's no unnamed namespace
+
+namespace boost {
+
+none_t const none = ((none_t)0) ;
+
+} // namespace boost
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/none_t.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_NONE_T_17SEP2003_HPP
+#define BOOST_NONE_T_17SEP2003_HPP
+
+namespace boost {
+
+namespace detail { struct none_helper{}; }
+
+typedef int detail::none_helper::*none_t ;
+
+} // namespace boost
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/optional.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,18 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/libs/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_OPTIONAL_FLC_19NOV2002_HPP
+#define BOOST_OPTIONAL_FLC_19NOV2002_HPP
+
+#include "boost/optional/optional.hpp"
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/optional/optional.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,922 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_OPTIONAL_OPTIONAL_FLC_19NOV2002_HPP
+#define BOOST_OPTIONAL_OPTIONAL_FLC_19NOV2002_HPP
+
+#include<new>
+#include<algorithm>
+
+#include "boost/config.hpp"
+#include "boost/assert.hpp"
+#include "boost/type.hpp"
+#include "boost/type_traits/alignment_of.hpp"
+#include "boost/type_traits/type_with_alignment.hpp"
+#include "boost/type_traits/remove_reference.hpp"
+#include "boost/type_traits/is_reference.hpp"
+#include "boost/mpl/if.hpp"
+#include "boost/mpl/bool.hpp"
+#include "boost/mpl/not.hpp"
+#include "boost/detail/reference_content.hpp"
+#include "boost/none.hpp"
+#include "boost/utility/compare_pointees.hpp"
+
+#include "boost/optional/optional_fwd.hpp"
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1200)
+// VC6.0 has the following bug:
+//   When a templated assignment operator exist, an implicit conversion
+//   constructing an optional<T> is used when assigment of the form:
+//     optional<T> opt ; opt = T(...);
+//   is compiled.
+//   However, optional's ctor is _explicit_ and the assignemt shouldn't compile.
+//   Therefore, for VC6.0 templated assignment is disabled.
+//
+#define BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1300)
+// VC7.0 has the following bug:
+//   When both a non-template and a template copy-ctor exist
+//   and the templated version is made 'explicit', the explicit is also
+//   given to the non-templated version, making the class non-implicitely-copyable.
+//
+#define BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
+#endif
+
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300) || BOOST_WORKAROUND(BOOST_INTEL_CXX_VERSION,<=700)
+// AFAICT only VC7.1 correctly resolves the overload set
+// that includes the in-place factory taking functions,
+// so for the other VC versions, in-place factory support
+// is disabled
+#define BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+#endif
+
+#if BOOST_WORKAROUND(__BORLANDC__, <= 0x551)
+// BCB (5.5.1) cannot parse the nested template struct in an inplace factory.
+#define BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+#endif
+
+#if !defined(BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT) \
+    && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581) )
+// BCB (up to 5.64) has the following bug:
+//   If there is a member function/operator template of the form
+//     template<class Expr> mfunc( Expr expr ) ;
+//   some calls are resolved to this even if there are other better matches.
+//   The effect of this bug is that calls to converting ctors and assignments
+//   are incrorrectly sink to this general catch-all member function template as shown above.
+#define BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION
+#endif
+
+// Daniel Wallin discovered that bind/apply.hpp badly interacts with the apply<>
+// member template of a factory as used in the optional<> implementation.
+// He proposed this simple fix which is to move the call to apply<> outside
+// namespace boost.
+namespace boost_optional_detail
+{
+  template <class T, class Factory>
+  void construct(Factory const& factory, void* address)
+  {
+    factory.BOOST_NESTED_TEMPLATE apply<T>(address);
+  }
+}
+
+
+namespace boost {
+
+class in_place_factory_base ;
+class typed_in_place_factory_base ;
+
+namespace optional_detail {
+
+// This local class is used instead of that in "aligned_storage.hpp"
+// because I've found the 'official' class to ICE BCB5.5
+// when some types are used with optional<>
+// (due to sizeof() passed down as a non-type template parameter)
+template <class T>
+class aligned_storage
+{
+    // Borland ICEs if unnamed unions are used for this!
+    union dummy_u
+    {
+        char data[ sizeof(T) ];
+        BOOST_DEDUCED_TYPENAME type_with_alignment<
+          ::boost::alignment_of<T>::value >::type aligner_;
+    } dummy_ ;
+
+  public:
+
+    void const* address() const { return &dummy_.data[0]; }
+    void      * address()       { return &dummy_.data[0]; }
+} ;
+
+template<class T>
+struct types_when_isnt_ref
+{
+  typedef T const& reference_const_type ;
+  typedef T &      reference_type ;
+  typedef T const* pointer_const_type ;
+  typedef T *      pointer_type ;
+  typedef T const& argument_type ;
+} ;
+template<class T>
+struct types_when_is_ref
+{
+  typedef BOOST_DEDUCED_TYPENAME remove_reference<T>::type raw_type ;
+
+  typedef raw_type& reference_const_type ;
+  typedef raw_type& reference_type ;
+  typedef raw_type* pointer_const_type ;
+  typedef raw_type* pointer_type ;
+  typedef raw_type& argument_type ;
+} ;
+
+struct optional_tag {} ;
+
+template<class T>
+class optional_base : public optional_tag
+{
+  private :
+
+    typedef
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
+    BOOST_DEDUCED_TYPENAME
+#endif 
+    ::boost::detail::make_reference_content<T>::type internal_type ;
+
+    typedef aligned_storage<internal_type> storage_type ;
+
+    typedef types_when_isnt_ref<T> types_when_not_ref ;
+    typedef types_when_is_ref<T>   types_when_ref   ;
+
+    typedef optional_base<T> this_type ;
+
+  protected :
+
+    typedef T value_type ;
+
+    typedef mpl::true_  is_reference_tag ;
+    typedef mpl::false_ is_not_reference_tag ;
+
+    typedef BOOST_DEDUCED_TYPENAME is_reference<T>::type is_reference_predicate ;
+
+    typedef BOOST_DEDUCED_TYPENAME mpl::if_<is_reference_predicate,types_when_ref,types_when_not_ref>::type types ;
+
+    typedef bool (this_type::*unspecified_bool_type)() const;
+
+    typedef BOOST_DEDUCED_TYPENAME types::reference_type       reference_type ;
+    typedef BOOST_DEDUCED_TYPENAME types::reference_const_type reference_const_type ;
+    typedef BOOST_DEDUCED_TYPENAME types::pointer_type         pointer_type ;
+    typedef BOOST_DEDUCED_TYPENAME types::pointer_const_type   pointer_const_type ;
+    typedef BOOST_DEDUCED_TYPENAME types::argument_type        argument_type ;
+
+    // Creates an optional<T> uninitialized.
+    // No-throw
+    optional_base()
+      :
+      m_initialized(false) {}
+
+    // Creates an optional<T> uninitialized.
+    // No-throw
+    optional_base ( none_t )
+      :
+      m_initialized(false) {}
+
+    // Creates an optional<T> initialized with 'val'.
+    // Can throw if T::T(T const&) does
+    optional_base ( argument_type val )
+      :
+      m_initialized(false)
+    {
+      construct(val);
+    }
+    
+    // Creates an optional<T> initialized with 'val' IFF cond is true, otherwise creates an uninitialzed optional<T>.
+    // Can throw if T::T(T const&) does
+    optional_base ( bool cond, argument_type val )
+      :
+      m_initialized(false)
+    {
+      if ( cond )
+        construct(val);
+    }
+
+    // Creates a deep copy of another optional<T>
+    // Can throw if T::T(T const&) does
+    optional_base ( optional_base const& rhs )
+      :
+      m_initialized(false)
+    {
+      if ( rhs.is_initialized() )
+        construct(rhs.get_impl());
+    }
+
+
+    // This is used for both converting and in-place constructions.
+    // Derived classes use the 'tag' to select the appropriate
+    // implementation (the correct 'construct()' overload)
+    template<class Expr>
+    explicit optional_base ( Expr const& expr, Expr const* tag )
+      :
+      m_initialized(false)
+    {
+      construct(expr,tag);
+    }
+
+
+
+    // No-throw (assuming T::~T() doesn't)
+    ~optional_base() { destroy() ; }
+
+    // Assigns from another optional<T> (deep-copies the rhs value)
+    void assign ( optional_base const& rhs )
+    {
+      if (is_initialized())
+      {
+        if ( rhs.is_initialized() )
+             assign_value(rhs.get_impl(), is_reference_predicate() );
+        else destroy();
+      }
+      else
+      {
+        if ( rhs.is_initialized() )
+          construct(rhs.get_impl());
+      }
+    }
+
+    // Assigns from another _convertible_ optional<U> (deep-copies the rhs value)
+    template<class U>
+    void assign ( optional<U> const& rhs )
+    {
+      if (is_initialized())
+      {
+        if ( rhs.is_initialized() )
+             assign_value(static_cast<value_type>(rhs.get()), is_reference_predicate() );
+        else destroy();
+      }
+      else
+      {
+        if ( rhs.is_initialized() )
+          construct(static_cast<value_type>(rhs.get()));
+      }
+    }
+
+    // Assigns from a T (deep-copies the rhs value)
+    void assign ( argument_type val )
+    {
+      if (is_initialized())
+           assign_value(val, is_reference_predicate() );
+      else construct(val);
+    }
+
+    // Assigns from "none", destroying the current value, if any, leaving this UNINITIALIZED
+    // No-throw (assuming T::~T() doesn't)
+    void assign ( none_t ) { destroy(); }
+
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+    template<class Expr>
+    void assign_expr ( Expr const& expr, Expr const* tag )
+      {
+        if (is_initialized())
+             assign_expr_to_initialized(expr,tag);
+        else construct(expr,tag);
+      }
+#endif
+
+  public :
+
+    // Destroys the current value, if any, leaving this UNINITIALIZED
+    // No-throw (assuming T::~T() doesn't)
+    void reset() { destroy(); }
+
+    // Replaces the current value -if any- with 'val'
+    void reset ( argument_type val ) { assign(val); }
+
+    // Returns a pointer to the value if this is initialized, otherwise,
+    // returns NULL.
+    // No-throw
+    pointer_const_type get_ptr() const { return m_initialized ? get_ptr_impl() : 0 ; }
+    pointer_type       get_ptr()       { return m_initialized ? get_ptr_impl() : 0 ; }
+
+    bool is_initialized() const { return m_initialized ; }
+
+  protected :
+
+    void construct ( argument_type val )
+     {
+       new (m_storage.address()) internal_type(val) ;
+       m_initialized = true ;
+     }
+
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+    // Constructs in-place using the given factory
+    template<class Expr>
+    void construct ( Expr const& factory, in_place_factory_base const* )
+     {
+       BOOST_STATIC_ASSERT ( ::boost::mpl::not_<is_reference_predicate>::value ) ;
+       boost_optional_detail::construct<value_type>(factory, m_storage.address());
+       m_initialized = true ;
+     }
+
+    // Constructs in-place using the given typed factory
+    template<class Expr>
+    void construct ( Expr const& factory, typed_in_place_factory_base const* )
+     {
+       BOOST_STATIC_ASSERT ( ::boost::mpl::not_<is_reference_predicate>::value ) ;
+       factory.apply(m_storage.address()) ;
+       m_initialized = true ;
+     }
+
+    template<class Expr>
+    void assign_expr_to_initialized ( Expr const& factory, in_place_factory_base const* tag )
+     {
+       destroy();
+       construct(factory,tag);
+     }
+
+    // Constructs in-place using the given typed factory
+    template<class Expr>
+    void assign_expr_to_initialized ( Expr const& factory, typed_in_place_factory_base const* tag )
+     {
+       destroy();
+       construct(factory,tag);
+     }
+#endif
+
+    // Constructs using any expression implicitely convertible to the single argument
+    // of a one-argument T constructor.
+    // Converting constructions of optional<T> from optional<U> uses this function with
+    // 'Expr' being of type 'U' and relying on a converting constructor of T from U.
+    template<class Expr>
+    void construct ( Expr const& expr, void const* )
+     {
+       new (m_storage.address()) internal_type(expr) ;
+       m_initialized = true ;
+     }
+
+    // Assigns using a form any expression implicitely convertible to the single argument
+    // of a T's assignment operator.
+    // Converting assignments of optional<T> from optional<U> uses this function with
+    // 'Expr' being of type 'U' and relying on a converting assignment of T from U.
+    template<class Expr>
+    void assign_expr_to_initialized ( Expr const& expr, void const* )
+     {
+       assign_value(expr, is_reference_predicate());
+     }
+
+#ifdef BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION
+    // BCB5.64 (and probably lower versions) workaround.
+    //   The in-place factories are supported by means of catch-all constructors
+    //   and assignment operators (the functions are parameterized in terms of
+    //   an arbitrary 'Expr' type)
+    //   This compiler incorrectly resolves the overload set and sinks optional<T> and optional<U>
+    //   to the 'Expr'-taking functions even though explicit overloads are present for them.
+    //   Thus, the following overload is needed to properly handle the case when the 'lhs'
+    //   is another optional.
+    //
+    // For VC<=70 compilers this workaround dosen't work becasue the comnpiler issues and error
+    // instead of choosing the wrong overload
+    //
+    // Notice that 'Expr' will be optional<T> or optional<U> (but not optional_base<..>)
+    template<class Expr>
+    void construct ( Expr const& expr, optional_tag const* )
+     {
+       if ( expr.is_initialized() )
+       {
+         // An exception can be thrown here.
+         // It it happens, THIS will be left uninitialized.
+         new (m_storage.address()) internal_type(expr.get()) ;
+         m_initialized = true ;
+       }
+     }
+#endif
+
+    void assign_value ( argument_type val, is_not_reference_tag ) { get_impl() = val; }
+    void assign_value ( argument_type val, is_reference_tag     ) { construct(val); }
+
+    void destroy()
+    {
+      if ( m_initialized )
+        destroy_impl(is_reference_predicate()) ;
+    }
+
+    unspecified_bool_type safe_bool() const { return m_initialized ? &this_type::is_initialized : 0 ; }
+
+    reference_const_type get_impl() const { return dereference(get_object(), is_reference_predicate() ) ; }
+    reference_type       get_impl()       { return dereference(get_object(), is_reference_predicate() ) ; }
+
+    pointer_const_type get_ptr_impl() const { return cast_ptr(get_object(), is_reference_predicate() ) ; }
+    pointer_type       get_ptr_impl()       { return cast_ptr(get_object(), is_reference_predicate() ) ; }
+
+  private :
+
+    // internal_type can be either T or reference_content<T>
+    internal_type const* get_object() const { return static_cast<internal_type const*>(m_storage.address()); }
+    internal_type *      get_object()       { return static_cast<internal_type *>     (m_storage.address()); }
+
+    // reference_content<T> lacks an implicit conversion to T&, so the following is needed to obtain a proper reference.
+    reference_const_type dereference( internal_type const* p, is_not_reference_tag ) const { return *p ; }
+    reference_type       dereference( internal_type*       p, is_not_reference_tag )       { return *p ; }
+    reference_const_type dereference( internal_type const* p, is_reference_tag     ) const { return p->get() ; }
+    reference_type       dereference( internal_type*       p, is_reference_tag     )       { return p->get() ; }
+
+#if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x581))
+    void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->internal_type::~internal_type() ; m_initialized = false ; }
+#else
+    void destroy_impl ( is_not_reference_tag ) { get_ptr_impl()->T::~T() ; m_initialized = false ; }
+#endif
+
+    void destroy_impl ( is_reference_tag     ) { m_initialized = false ; }
+
+    // If T is of reference type, trying to get a pointer to the held value must result in a compile-time error.
+    // Decent compilers should disallow conversions from reference_content<T>* to T*, but just in case,
+    // the following olverloads are used to filter out the case and guarantee an error in case of T being a reference.
+    pointer_const_type cast_ptr( internal_type const* p, is_not_reference_tag ) const { return p ; }
+    pointer_type       cast_ptr( internal_type *      p, is_not_reference_tag )       { return p ; }
+    pointer_const_type cast_ptr( internal_type const* p, is_reference_tag     ) const { return &p->get() ; }
+    pointer_type       cast_ptr( internal_type *      p, is_reference_tag     )       { return &p->get() ; }
+
+    bool m_initialized ;
+    storage_type m_storage ;
+} ;
+
+} // namespace optional_detail
+
+template<class T>
+class optional : public optional_detail::optional_base<T>
+{
+    typedef optional_detail::optional_base<T> base ;
+
+    typedef BOOST_DEDUCED_TYPENAME base::unspecified_bool_type  unspecified_bool_type ;
+
+  public :
+
+    typedef optional<T> this_type ;
+
+    typedef BOOST_DEDUCED_TYPENAME base::value_type           value_type ;
+    typedef BOOST_DEDUCED_TYPENAME base::reference_type       reference_type ;
+    typedef BOOST_DEDUCED_TYPENAME base::reference_const_type reference_const_type ;
+    typedef BOOST_DEDUCED_TYPENAME base::pointer_type         pointer_type ;
+    typedef BOOST_DEDUCED_TYPENAME base::pointer_const_type   pointer_const_type ;
+    typedef BOOST_DEDUCED_TYPENAME base::argument_type        argument_type ;
+
+    // Creates an optional<T> uninitialized.
+    // No-throw
+    optional() : base() {}
+
+    // Creates an optional<T> uninitialized.
+    // No-throw
+    optional( none_t none_ ) : base(none_) {}
+
+    // Creates an optional<T> initialized with 'val'.
+    // Can throw if T::T(T const&) does
+    optional ( argument_type val ) : base(val) {}
+
+    // Creates an optional<T> initialized with 'val' IFF cond is true, otherwise creates an uninitialized optional.
+    // Can throw if T::T(T const&) does
+    optional ( bool cond, argument_type val ) : base(cond,val) {}
+
+#ifndef BOOST_OPTIONAL_NO_CONVERTING_COPY_CTOR
+    // NOTE: MSVC needs templated versions first
+
+    // Creates a deep copy of another convertible optional<U>
+    // Requires a valid conversion from U to T.
+    // Can throw if T::T(U const&) does
+    template<class U>
+    explicit optional ( optional<U> const& rhs )
+      :
+      base()
+    {
+      if ( rhs.is_initialized() )
+        this->construct(rhs.get());
+    }
+#endif
+
+#ifndef BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT
+    // Creates an optional<T> with an expression which can be either
+    //  (a) An instance of InPlaceFactory (i.e. in_place(a,b,...,n);
+    //  (b) An instance of TypedInPlaceFactory ( i.e. in_place<T>(a,b,...,n);
+    //  (c) Any expression implicitely convertible to the single type
+    //      of a one-argument T's constructor.
+    //  (d*) Weak compilers (BCB) might also resolved Expr as optional<T> and optional<U>
+    //       even though explicit overloads are present for these.
+    // Depending on the above some T ctor is called.
+    // Can throw is the resolved T ctor throws.
+    template<class Expr>
+    explicit optional ( Expr const& expr ) : base(expr,&expr) {}
+#endif
+
+    // Creates a deep copy of another optional<T>
+    // Can throw if T::T(T const&) does
+    optional ( optional const& rhs ) : base(rhs) {}
+
+   // No-throw (assuming T::~T() doesn't)
+    ~optional() {}
+
+#if !defined(BOOST_OPTIONAL_NO_INPLACE_FACTORY_SUPPORT) && !defined(BOOST_OPTIONAL_WEAK_OVERLOAD_RESOLUTION)
+    // Assigns from an expression. See corresponding constructor.
+    // Basic Guarantee: If the resolved T ctor throws, this is left UNINITIALIZED
+    template<class Expr>
+    optional& operator= ( Expr expr )
+      {
+        this->assign_expr(expr,&expr);
+        return *this ;
+      }
+#endif
+
+
+#ifndef BOOST_OPTIONAL_NO_CONVERTING_ASSIGNMENT
+    // Assigns from another convertible optional<U> (converts && deep-copies the rhs value)
+    // Requires a valid conversion from U to T.
+    // Basic Guarantee: If T::T( U const& ) throws, this is left UNINITIALIZED
+    template<class U>
+    optional& operator= ( optional<U> const& rhs )
+      {
+        this->assign(rhs);
+        return *this ;
+      }
+#endif
+
+    // Assigns from another optional<T> (deep-copies the rhs value)
+    // Basic Guarantee: If T::T( T const& ) throws, this is left UNINITIALIZED
+    //  (NOTE: On BCB, this operator is not actually called and left is left UNMODIFIED in case of a throw)
+    optional& operator= ( optional const& rhs )
+      {
+        this->assign( rhs ) ;
+        return *this ;
+      }
+
+    // Assigns from a T (deep-copies the rhs value)
+    // Basic Guarantee: If T::( T const& ) throws, this is left UNINITIALIZED
+    optional& operator= ( argument_type val )
+      {
+        this->assign( val ) ;
+        return *this ;
+      }
+
+    // Assigns from a "none"
+    // Which destroys the current value, if any, leaving this UNINITIALIZED
+    // No-throw (assuming T::~T() doesn't)
+    optional& operator= ( none_t none_ )
+      {
+        this->assign( none_ ) ;
+        return *this ;
+      }
+
+    // Returns a reference to the value if this is initialized, otherwise,
+    // the behaviour is UNDEFINED
+    // No-throw
+    reference_const_type get() const { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }
+    reference_type       get()       { BOOST_ASSERT(this->is_initialized()) ; return this->get_impl(); }
+
+    // Returns a copy of the value if this is initialized, 'v' otherwise
+    reference_const_type get_value_or ( reference_const_type v ) const { return this->is_initialized() ? get() : v ; }
+    reference_type       get_value_or ( reference_type       v )       { return this->is_initialized() ? get() : v ; }
+    
+    // Returns a pointer to the value if this is initialized, otherwise,
+    // the behaviour is UNDEFINED
+    // No-throw
+    pointer_const_type operator->() const { BOOST_ASSERT(this->is_initialized()) ; return this->get_ptr_impl() ; }
+    pointer_type       operator->()       { BOOST_ASSERT(this->is_initialized()) ; return this->get_ptr_impl() ; }
+
+    // Returns a reference to the value if this is initialized, otherwise,
+    // the behaviour is UNDEFINED
+    // No-throw
+    reference_const_type operator *() const { return this->get() ; }
+    reference_type       operator *()       { return this->get() ; }
+
+    // implicit conversion to "bool"
+    // No-throw
+    operator unspecified_bool_type() const { return this->safe_bool() ; }
+
+       // This is provided for those compilers which don't like the conversion to bool
+       // on some contexts.
+       bool operator!() const { return !this->is_initialized() ; }
+} ;
+
+// Returns optional<T>(v)
+template<class T> 
+inline 
+optional<T> make_optional ( T const& v  )
+{
+  return optional<T>(v);
+}
+
+// Returns optional<T>(cond,v)
+template<class T> 
+inline 
+optional<T> make_optional ( bool cond, T const& v )
+{
+  return optional<T>(cond,v);
+}
+
+// Returns a reference to the value if this is initialized, otherwise, the behaviour is UNDEFINED.
+// No-throw
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_const_type
+get ( optional<T> const& opt )
+{
+  return opt.get() ;
+}
+
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_type
+get ( optional<T>& opt )
+{
+  return opt.get() ;
+}
+
+// Returns a pointer to the value if this is initialized, otherwise, returns NULL.
+// No-throw
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::pointer_const_type
+get ( optional<T> const* opt )
+{
+  return opt->get_ptr() ;
+}
+
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::pointer_type
+get ( optional<T>* opt )
+{
+  return opt->get_ptr() ;
+}
+
+// Returns a reference to the value if this is initialized, otherwise, the behaviour is UNDEFINED.
+// No-throw
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_const_type
+get_optional_value_or ( optional<T> const& opt, BOOST_DEDUCED_TYPENAME optional<T>::reference_const_type v )
+{
+  return opt.get_value_or(v) ;
+}
+
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::reference_type
+get_optional_value_or ( optional<T>& opt, BOOST_DEDUCED_TYPENAME optional<T>::reference_type v )
+{
+  return opt.get_value_or(v) ;
+}
+
+// Returns a pointer to the value if this is initialized, otherwise, returns NULL.
+// No-throw
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::pointer_const_type
+get_pointer ( optional<T> const& opt )
+{
+  return opt.get_ptr() ;
+}
+
+template<class T>
+inline
+BOOST_DEDUCED_TYPENAME optional<T>::pointer_type
+get_pointer ( optional<T>& opt )
+{
+  return opt.get_ptr() ;
+}
+
+// optional's relational operators ( ==, !=, <, >, <=, >= ) have deep-semantics (compare values).
+// WARNING: This is UNLIKE pointers. Use equal_pointees()/less_pointess() in generic code instead.
+
+
+//
+// optional<T> vs optional<T> cases
+//
+
+template<class T>
+inline
+bool operator == ( optional<T> const& x, optional<T> const& y )
+{ return equal_pointees(x,y); }
+
+template<class T>
+inline
+bool operator < ( optional<T> const& x, optional<T> const& y )
+{ return less_pointees(x,y); }
+
+template<class T>
+inline
+bool operator != ( optional<T> const& x, optional<T> const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( optional<T> const& x, optional<T> const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( optional<T> const& x, optional<T> const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( optional<T> const& x, optional<T> const& y )
+{ return !( x < y ) ; }
+
+
+//
+// optional<T> vs T cases
+//
+template<class T>
+inline
+bool operator == ( optional<T> const& x, T const& y )
+{ return equal_pointees(x, optional<T>(y)); }
+
+template<class T>
+inline
+bool operator < ( optional<T> const& x, T const& y )
+{ return less_pointees(x, optional<T>(y)); }
+
+template<class T>
+inline
+bool operator != ( optional<T> const& x, T const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( optional<T> const& x, T const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( optional<T> const& x, T const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( optional<T> const& x, T const& y )
+{ return !( x < y ) ; }
+
+//
+// T vs optional<T> cases
+//
+
+template<class T>
+inline
+bool operator == ( T const& x, optional<T> const& y )
+{ return equal_pointees( optional<T>(x), y ); }
+
+template<class T>
+inline
+bool operator < ( T const& x, optional<T> const& y )
+{ return less_pointees( optional<T>(x), y ); }
+
+template<class T>
+inline
+bool operator != ( T const& x, optional<T> const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( T const& x, optional<T> const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( T const& x, optional<T> const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( T const& x, optional<T> const& y )
+{ return !( x < y ) ; }
+
+
+//
+// optional<T> vs none cases
+//
+
+template<class T>
+inline
+bool operator == ( optional<T> const& x, none_t )
+{ return equal_pointees(x, optional<T>() ); }
+
+template<class T>
+inline
+bool operator < ( optional<T> const& x, none_t )
+{ return less_pointees(x,optional<T>() ); }
+
+template<class T>
+inline
+bool operator != ( optional<T> const& x, none_t y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( optional<T> const& x, none_t y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( optional<T> const& x, none_t y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( optional<T> const& x, none_t y )
+{ return !( x < y ) ; }
+
+//
+// none vs optional<T> cases
+//
+
+template<class T>
+inline
+bool operator == ( none_t x, optional<T> const& y )
+{ return equal_pointees(optional<T>() ,y); }
+
+template<class T>
+inline
+bool operator < ( none_t x, optional<T> const& y )
+{ return less_pointees(optional<T>() ,y); }
+
+template<class T>
+inline
+bool operator != ( none_t x, optional<T> const& y )
+{ return !( x == y ) ; }
+
+template<class T>
+inline
+bool operator > ( none_t x, optional<T> const& y )
+{ return y < x ; }
+
+template<class T>
+inline
+bool operator <= ( none_t x, optional<T> const& y )
+{ return !( y < x ) ; }
+
+template<class T>
+inline
+bool operator >= ( none_t x, optional<T> const& y )
+{ return !( x < y ) ; }
+
+//
+// The following swap implementation follows the GCC workaround as found in
+//  "boost/detail/compressed_pair.hpp"
+//
+namespace optional_detail {
+
+// GCC < 3.2 gets the using declaration at namespace scope (FLC, DWA)
+#if BOOST_WORKAROUND(__GNUC__, < 3)                             \
+    || BOOST_WORKAROUND(__GNUC__, == 3) && __GNUC_MINOR__ <= 2
+   using std::swap;
+#define BOOST_OPTIONAL_STD_SWAP_INTRODUCED_AT_NS_SCOPE
+#endif
+
+// optional's swap:
+// If both are initialized, calls swap(T&, T&). If this swap throws, both will remain initialized but their values are now unspecified.
+// If only one is initialized, calls U.reset(*I), THEN I.reset().
+// If U.reset(*I) throws, both are left UNCHANGED (U is kept uinitialized and I is never reset)
+// If both are uninitialized, do nothing (no-throw)
+template<class T>
+inline
+void optional_swap ( optional<T>& x, optional<T>& y )
+{
+  if ( !x && !!y )
+  {
+    x.reset(*y);
+    y.reset();
+  }
+  else if ( !!x && !y )
+  {
+    y.reset(*x);
+    x.reset();
+  }
+  else if ( !!x && !!y )
+  {
+// GCC > 3.2 and all other compilers have the using declaration at function scope (FLC)
+#ifndef BOOST_OPTIONAL_STD_SWAP_INTRODUCED_AT_NS_SCOPE
+    // allow for Koenig lookup
+    using std::swap ;
+#endif
+    swap(*x,*y);
+  }
+}
+
+} // namespace optional_detail
+
+template<class T> inline void swap ( optional<T>& x, optional<T>& y )
+{
+  optional_detail::optional_swap(x,y);
+}
+
+
+} // namespace boost
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/optional/optional_fwd.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+// Copyright (C) 2003, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
+#define BOOST_OPTIONAL_OPTIONAL_FWD_FLC_19NOV2002_HPP
+
+namespace boost {
+
+template<class T> class optional ;
+
+} // namespace boost
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/optional/optional_io.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,84 @@
+// Copyright (C) 2005, Fernando Luis Cacciola Carballal.
+//
+// Use, modification, and distribution is subject to the Boost Software
+// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+//
+// See http://www.boost.org/lib/optional for documentation.
+//
+// You are welcome to contact the author at:
+//  fernando_cacciola@hotmail.com
+//
+#ifndef BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP
+#define BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP
+
+#if defined __GNUC__
+#  if (__GNUC__ == 2 && __GNUC_MINOR__ <= 97) 
+#    define BOOST_OPTIONAL_NO_TEMPLATED_STREAMS
+#  endif
+#endif // __GNUC__
+
+#if defined BOOST_OPTIONAL_NO_TEMPLATED_STREAMS
+#  include <iostream>
+#else 
+#  include <istream>
+#  include <ostream>
+#endif  
+
+
+#include "boost/optional/optional.hpp"
+#include "boost/utility/value_init.hpp"
+
+namespace boost
+{
+
+#if defined (BOOST_NO_TEMPLATED_STREAMS)
+template<class T>
+inline std::ostream& operator<<(std::ostream& out, optional<T> const& v)
+#else
+template<class CharType, class CharTrait, class T>
+inline
+std::basic_ostream<CharType, CharTrait>&
+operator<<(std::basic_ostream<CharType, CharTrait>& out, optional<T> const& v)
+#endif
+{
+  if ( out.good() )
+  {
+    if ( !v )
+         out << "--" ;
+    else out << ' ' << *v ;
+  }
+
+  return out;
+}
+
+#if defined (BOOST_NO_TEMPLATED_STREAMS)
+template<class T>
+inline std::istream& operator>>(std::istream& in, optional<T>& v)
+#else
+template<class CharType, class CharTrait, class T>
+inline
+std::basic_istream<CharType, CharTrait>&
+operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v)
+#endif
+{
+  if ( in.good() )
+  {
+    int d = in.get();
+    if ( d == ' ' )
+    {
+      T x ;
+      in >> x;
+      v = x ;
+    }
+    else
+      v = optional<T>() ;
+  }
+
+  return in;
+}
+
+} // namespace boost
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,37 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org/libs/regex for documentation.
+  *   FILE         regex.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares boost::basic_regex<> and associated
+  *                functions and classes. This header is the main
+  *                entry point for the template regex code.
+  */
+
+
+/* start with C compatibility API */
+
+#ifndef BOOST_RE_REGEX_HPP
+#define BOOST_RE_REGEX_HPP
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+
+#include <boost/regex/v4/regex.hpp>
+
+#endif  // include
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/concepts.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,870 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         concepts.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression concepts.
+  */
+
+#ifndef BOOST_REGEX_CONCEPTS_HPP_INCLUDED
+#define BOOST_REGEX_CONCEPTS_HPP_INCLUDED
+
+#include <boost/concept_archetype.hpp>
+#include <boost/concept_check.hpp>
+#include <boost/type_traits/is_enum.hpp>
+#include <boost/type_traits/is_base_and_derived.hpp>
+#include <boost/static_assert.hpp>
+#ifndef BOOST_TEST_TR1_REGEX
+#include <boost/regex.hpp>
+#endif
+#include <bitset>
+#include <vector>
+#include <iostream>
+
+namespace boost{
+
+//
+// bitmask_archetype:
+// this can be either an integer type, an enum, or a std::bitset,
+// we use the latter as the architype as it offers the "strictest"
+// of the possible interfaces:
+//
+typedef std::bitset<512> bitmask_archetype;
+//
+// char_architype:
+// A strict model for the character type interface.
+//
+struct char_architype
+{
+   // default constructable:
+   char_architype();
+   // copy constructable / assignable:
+   char_architype(const char_architype&);
+   char_architype& operator=(const char_architype&);
+   // constructable from an integral value:
+   char_architype(unsigned long val);
+   // comparable:
+   bool operator==(const char_architype&)const;
+   bool operator!=(const char_architype&)const;
+   bool operator<(const char_architype&)const;
+   bool operator<=(const char_architype&)const;
+   bool operator>=(const char_architype&)const;
+   bool operator>(const char_architype&)const;
+   // conversion to integral type:
+   operator long()const;
+};
+//
+// char_architype can not be used with basic_string:
+//
+} // namespace boost
+namespace std{
+   template<> struct char_traits<boost::char_architype>
+   {
+      // The intent is that this template is not instantiated,
+      // but this typedef gives us a chance of compilation in
+      // case it is:
+      typedef boost::char_architype char_type;
+   };
+}
+namespace boost{
+//
+// regex_traits_architype:
+// A strict interpretation of the regular expression traits class requirements.
+//
+template <class charT>
+struct regex_traits_architype
+{
+public:
+   regex_traits_architype();
+   typedef charT char_type;
+   // typedef std::size_t size_type;
+   typedef std::vector<char_type> string_type;
+   typedef copy_constructible_archetype<assignable_archetype<> > locale_type;
+   typedef bitmask_archetype char_class_type;
+
+   static std::size_t length(const char_type* ) { return 0; }
+
+   charT translate(charT ) const { return charT(); }
+   charT translate_nocase(charT ) const { return static_object<charT>::get(); }
+
+   template <class ForwardIterator>
+   string_type transform(ForwardIterator , ForwardIterator ) const
+   { return static_object<string_type>::get(); }
+   template <class ForwardIterator>
+   string_type transform_primary(ForwardIterator , ForwardIterator ) const
+   { return static_object<string_type>::get(); }
+
+   template <class ForwardIterator>
+   char_class_type lookup_classname(ForwardIterator , ForwardIterator ) const
+   { return static_object<char_class_type>::get(); }
+   template <class ForwardIterator>
+   string_type lookup_collatename(ForwardIterator , ForwardIterator ) const
+   { return static_object<string_type>::get(); }
+
+   bool isctype(charT, char_class_type) const
+   { return false; }
+   int value(charT, int) const
+   { return 0; }
+
+   locale_type imbue(locale_type l)
+   { return l; }
+   locale_type getloc()const
+   { return static_object<locale_type>::get(); }
+
+private:
+   // this type is not copyable:
+   regex_traits_architype(const regex_traits_architype&);
+   regex_traits_architype& operator=(const regex_traits_architype&);
+};
+
+//
+// alter this to std::tr1, to test a std implementation:
+//
+#ifndef BOOST_TEST_TR1_REGEX
+namespace global_regex_namespace = ::boost;
+#else
+namespace global_regex_namespace = ::std::tr1;
+#endif
+
+template <class Bitmask>
+struct BitmaskConcept
+{
+   void constraints() 
+   {
+      function_requires<CopyConstructibleConcept<Bitmask> >();
+      function_requires<AssignableConcept<Bitmask> >();
+
+      m_mask1 = m_mask2 | m_mask3;
+      m_mask1 = m_mask2 & m_mask3;
+      m_mask1 = m_mask2 ^ m_mask3;
+
+      m_mask1 = ~m_mask2;
+
+      m_mask1 |= m_mask2;
+      m_mask1 &= m_mask2;
+      m_mask1 ^= m_mask2;
+   }
+   Bitmask m_mask1, m_mask2, m_mask3;
+};
+
+template <class traits>
+struct RegexTraitsConcept
+{
+   RegexTraitsConcept();
+   // required typedefs:
+   typedef typename traits::char_type char_type;
+   // typedef typename traits::size_type size_type;
+   typedef typename traits::string_type string_type;
+   typedef typename traits::locale_type locale_type;
+   typedef typename traits::char_class_type char_class_type;
+
+   void constraints() 
+   {
+      //function_requires<UnsignedIntegerConcept<size_type> >();
+      function_requires<RandomAccessContainerConcept<string_type> >();
+      function_requires<DefaultConstructibleConcept<locale_type> >();
+      function_requires<CopyConstructibleConcept<locale_type> >();
+      function_requires<AssignableConcept<locale_type> >();
+      function_requires<BitmaskConcept<char_class_type> >();
+
+      std::size_t n = traits::length(m_pointer);
+      ignore_unused_variable_warning(n);
+
+      char_type c = m_ctraits.translate(m_char);
+      ignore_unused_variable_warning(c);
+      c = m_ctraits.translate_nocase(m_char);
+      
+      //string_type::foobar bar;
+      string_type s1 = m_ctraits.transform(m_pointer, m_pointer);
+      ignore_unused_variable_warning(s1);
+
+      string_type s2 = m_ctraits.transform_primary(m_pointer, m_pointer);
+      ignore_unused_variable_warning(s2);
+
+      char_class_type cc = m_ctraits.lookup_classname(m_pointer, m_pointer);
+      ignore_unused_variable_warning(cc);
+
+      string_type s3 = m_ctraits.lookup_collatename(m_pointer, m_pointer);
+      ignore_unused_variable_warning(s3);
+
+      bool b = m_ctraits.isctype(m_char, cc);
+      ignore_unused_variable_warning(b);
+
+      int v = m_ctraits.value(m_char, 16);
+      ignore_unused_variable_warning(v);
+
+      locale_type l(m_ctraits.getloc());
+      m_traits.imbue(l);
+      ignore_unused_variable_warning(l);
+   }
+   traits m_traits;
+   const traits m_ctraits;
+   const char_type* m_pointer;
+   char_type m_char;
+private:
+   RegexTraitsConcept& operator=(RegexTraitsConcept&);
+};
+
+//
+// helper class to compute what traits class a regular expression type is using:
+//
+template <class Regex>
+struct regex_traits_computer;
+
+template <class charT, class traits>
+struct regex_traits_computer< global_regex_namespace::basic_regex<charT, traits> >
+{
+   typedef traits type;
+};
+
+//
+// BaseRegexConcept does not test anything dependent on basic_string,
+// in case our charT does not have an associated char_traits:
+//
+template <class Regex>
+struct BaseRegexConcept
+{
+   typedef typename Regex::value_type value_type;
+   //typedef typename Regex::size_type size_type;
+   typedef typename Regex::flag_type flag_type;
+   typedef typename Regex::locale_type locale_type;
+   typedef input_iterator_archetype<value_type> input_iterator_type;
+
+   // derived test types:
+   typedef const value_type* pointer_type;
+   typedef bidirectional_iterator_archetype<value_type> BidiIterator;
+   typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type;
+   typedef global_regex_namespace::match_results<BidiIterator> match_results_type;
+   typedef output_iterator_archetype<value_type> OutIterator;
+   typedef typename regex_traits_computer<Regex>::type traits_type;
+   typedef global_regex_namespace::regex_iterator<BidiIterator, value_type, traits_type> regex_iterator_type;
+   typedef global_regex_namespace::regex_token_iterator<BidiIterator, value_type, traits_type> regex_token_iterator_type;
+
+   void global_constraints()
+   {
+      //
+      // test non-template components:
+      //
+      function_requires<BitmaskConcept<global_regex_namespace::regex_constants::syntax_option_type> >();
+      global_regex_namespace::regex_constants::syntax_option_type opts
+         = global_regex_namespace::regex_constants::icase
+         | global_regex_namespace::regex_constants::nosubs
+         | global_regex_namespace::regex_constants::optimize
+         | global_regex_namespace::regex_constants::collate
+         | global_regex_namespace::regex_constants::ECMAScript
+         | global_regex_namespace::regex_constants::basic
+         | global_regex_namespace::regex_constants::extended
+         | global_regex_namespace::regex_constants::awk
+         | global_regex_namespace::regex_constants::grep
+         | global_regex_namespace::regex_constants::egrep;
+      ignore_unused_variable_warning(opts);
+
+      function_requires<BitmaskConcept<global_regex_namespace::regex_constants::match_flag_type> >();
+      global_regex_namespace::regex_constants::match_flag_type mopts
+         = global_regex_namespace::regex_constants::match_default
+         | global_regex_namespace::regex_constants::match_not_bol
+         | global_regex_namespace::regex_constants::match_not_eol
+         | global_regex_namespace::regex_constants::match_not_bow
+         | global_regex_namespace::regex_constants::match_not_eow
+         | global_regex_namespace::regex_constants::match_any
+         | global_regex_namespace::regex_constants::match_not_null
+         | global_regex_namespace::regex_constants::match_continuous
+         | global_regex_namespace::regex_constants::match_prev_avail
+         | global_regex_namespace::regex_constants::format_default
+         | global_regex_namespace::regex_constants::format_sed
+         | global_regex_namespace::regex_constants::format_no_copy
+         | global_regex_namespace::regex_constants::format_first_only;
+      ignore_unused_variable_warning(mopts);
+
+      BOOST_STATIC_ASSERT((::boost::is_enum<global_regex_namespace::regex_constants::error_type>::value));
+      global_regex_namespace::regex_constants::error_type e1 = global_regex_namespace::regex_constants::error_collate;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_ctype;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_escape;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_backref;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_brack;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_paren;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_brace;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_badbrace;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_range;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_space;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_badrepeat;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_complexity;
+      ignore_unused_variable_warning(e1);
+      e1 = global_regex_namespace::regex_constants::error_stack;
+      ignore_unused_variable_warning(e1);
+
+      BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::runtime_error, global_regex_namespace::regex_error>::value  ));
+      const global_regex_namespace::regex_error except(e1);
+      e1 = except.code();
+
+      typedef typename Regex::value_type value_type;
+      function_requires< RegexTraitsConcept<global_regex_namespace::regex_traits<char> > >();
+      function_requires< BaseRegexConcept<global_regex_namespace::basic_regex<char> > >();
+   }
+   void constraints() 
+   {
+      global_constraints();
+
+      BOOST_STATIC_ASSERT((::boost::is_same< flag_type, global_regex_namespace::regex_constants::syntax_option_type>::value));
+      flag_type opts
+         = Regex::icase
+         | Regex::nosubs
+         | Regex::optimize
+         | Regex::collate
+         | Regex::ECMAScript
+         | Regex::basic
+         | Regex::extended
+         | Regex::awk
+         | Regex::grep
+         | Regex::egrep;
+      ignore_unused_variable_warning(opts);
+
+      function_requires<DefaultConstructibleConcept<Regex> >();
+      function_requires<CopyConstructibleConcept<Regex> >();
+
+      // Regex constructors:
+      Regex e1(m_pointer);
+      ignore_unused_variable_warning(e1);
+      Regex e2(m_pointer, m_flags);
+      ignore_unused_variable_warning(e2);
+      Regex e3(m_pointer, m_size, m_flags);
+      ignore_unused_variable_warning(e3);
+      Regex e4(in1, in2);
+      ignore_unused_variable_warning(e4);
+      Regex e5(in1, in2, m_flags);
+      ignore_unused_variable_warning(e5);
+
+      // assign etc:
+      Regex e;
+      e = m_pointer;
+      e = e1;
+      e.assign(e1);
+      e.assign(m_pointer);
+      e.assign(m_pointer, m_flags);
+      e.assign(m_pointer, m_size, m_flags);
+      e.assign(in1, in2);
+      e.assign(in1, in2, m_flags);
+
+      // access:
+      const Regex ce;
+      unsigned i = ce.mark_count();
+      ignore_unused_variable_warning(i);
+      m_flags = ce.flags();
+      e.imbue(ce.getloc());
+      e.swap(e1);
+      
+      global_regex_namespace::swap(e, e1);
+
+      // sub_match:
+      BOOST_STATIC_ASSERT((::boost::is_base_and_derived<std::pair<BidiIterator, BidiIterator>, sub_match_type>::value));
+      typedef typename sub_match_type::value_type sub_value_type;
+      typedef typename sub_match_type::difference_type sub_diff_type;
+      typedef typename sub_match_type::iterator sub_iter_type;
+      BOOST_STATIC_ASSERT((::boost::is_same<sub_value_type, value_type>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<sub_iter_type, BidiIterator>::value));
+      bool b = m_sub.matched;
+      ignore_unused_variable_warning(b);
+      BidiIterator bi = m_sub.first;
+      ignore_unused_variable_warning(bi);
+      bi = m_sub.second;
+      ignore_unused_variable_warning(bi);
+      sub_diff_type diff = m_sub.length();
+      ignore_unused_variable_warning(diff);
+      // match_results tests:
+      typedef typename match_results_type::value_type mr_value_type;
+      typedef typename match_results_type::const_reference mr_const_reference;
+      typedef typename match_results_type::reference mr_reference;
+      typedef typename match_results_type::const_iterator mr_const_iterator;
+      typedef typename match_results_type::iterator mr_iterator;
+      typedef typename match_results_type::difference_type mr_difference_type;
+      typedef typename match_results_type::size_type mr_size_type;
+      typedef typename match_results_type::allocator_type mr_allocator_type;
+      typedef typename match_results_type::char_type mr_char_type;
+      typedef typename match_results_type::string_type mr_string_type;
+
+      match_results_type m1;
+      mr_allocator_type at;
+      match_results_type m2(at);
+      match_results_type m3(m1);
+      m1 = m2;
+
+      int ival = 0;
+
+      mr_size_type mrs = m_cresults.size();
+      ignore_unused_variable_warning(mrs);
+      mrs = m_cresults.max_size();
+      ignore_unused_variable_warning(mrs);
+      b = m_cresults.empty();
+      ignore_unused_variable_warning(b);
+      mr_difference_type mrd = m_cresults.length();
+      ignore_unused_variable_warning(mrd);
+      mrd = m_cresults.length(ival);
+      ignore_unused_variable_warning(mrd);
+      mrd = m_cresults.position();
+      ignore_unused_variable_warning(mrd);
+      mrd = m_cresults.position(mrs);
+      ignore_unused_variable_warning(mrd);
+
+      mr_const_reference mrcr = m_cresults[ival];
+      ignore_unused_variable_warning(mrcr);
+      mr_const_reference mrcr2 = m_cresults.prefix();
+      ignore_unused_variable_warning(mrcr2);
+      mr_const_reference mrcr3 = m_cresults.suffix();
+      ignore_unused_variable_warning(mrcr3);
+      mr_const_iterator mrci = m_cresults.begin();
+      ignore_unused_variable_warning(mrci);
+      mrci = m_cresults.end();
+      ignore_unused_variable_warning(mrci);
+
+      mr_allocator_type at2 = m_cresults.get_allocator();
+      m_results.swap(m_results);
+      global_regex_namespace::swap(m_results, m_results);
+
+      // regex_match:
+      b = global_regex_namespace::regex_match(m_in, m_in, m_results, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_in, m_in, m_results, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_in, m_in, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_in, m_in, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_pointer, m_pmatch, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_pointer, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_pointer, e, m_mft);
+      ignore_unused_variable_warning(b);
+      // regex_search:
+      b = global_regex_namespace::regex_search(m_in, m_in, m_results, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_in, m_in, m_results, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_in, m_in, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_in, m_in, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_pointer, m_pmatch, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_pointer, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_pointer, e, m_mft);
+      ignore_unused_variable_warning(b);
+
+      // regex_iterator:
+      typedef typename regex_iterator_type::regex_type rit_regex_type;
+      typedef typename regex_iterator_type::value_type rit_value_type;
+      typedef typename regex_iterator_type::difference_type rit_difference_type;
+      typedef typename regex_iterator_type::pointer rit_pointer;
+      typedef typename regex_iterator_type::reference rit_reference;
+      typedef typename regex_iterator_type::iterator_category rit_iterator_category;
+      BOOST_STATIC_ASSERT((::boost::is_same<rit_regex_type, Regex>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rit_value_type, match_results_type>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rit_difference_type, std::ptrdiff_t>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rit_pointer, const match_results_type*>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rit_reference, const match_results_type&>::value));
+      BOOST_STATIC_ASSERT((::boost::is_convertible<rit_iterator_category*, std::forward_iterator_tag*>::value));
+      // this takes care of most of the checks needed:
+      function_requires<ForwardIteratorConcept<regex_iterator_type> >();
+      regex_iterator_type iter1(m_in, m_in, e);
+      ignore_unused_variable_warning(iter1);
+      regex_iterator_type iter2(m_in, m_in, e, m_mft);
+      ignore_unused_variable_warning(iter2);
+
+      // regex_token_iterator:
+      typedef typename regex_token_iterator_type::regex_type rtit_regex_type;
+      typedef typename regex_token_iterator_type::value_type rtit_value_type;
+      typedef typename regex_token_iterator_type::difference_type rtit_difference_type;
+      typedef typename regex_token_iterator_type::pointer rtit_pointer;
+      typedef typename regex_token_iterator_type::reference rtit_reference;
+      typedef typename regex_token_iterator_type::iterator_category rtit_iterator_category;
+      BOOST_STATIC_ASSERT((::boost::is_same<rtit_regex_type, Regex>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rtit_value_type, sub_match_type>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rtit_difference_type, std::ptrdiff_t>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rtit_pointer, const sub_match_type*>::value));
+      BOOST_STATIC_ASSERT((::boost::is_same<rtit_reference, const sub_match_type&>::value));
+      BOOST_STATIC_ASSERT((::boost::is_convertible<rtit_iterator_category*, std::forward_iterator_tag*>::value));
+      // this takes care of most of the checks needed:
+      function_requires<ForwardIteratorConcept<regex_token_iterator_type> >();
+      regex_token_iterator_type ti1(m_in, m_in, e);
+      ignore_unused_variable_warning(ti1);
+      regex_token_iterator_type ti2(m_in, m_in, e, 0);
+      ignore_unused_variable_warning(ti2);
+      regex_token_iterator_type ti3(m_in, m_in, e, 0, m_mft);
+      ignore_unused_variable_warning(ti3);
+      std::vector<int> subs;
+      regex_token_iterator_type ti4(m_in, m_in, e, subs);
+      ignore_unused_variable_warning(ti4);
+      regex_token_iterator_type ti5(m_in, m_in, e, subs, m_mft);
+      ignore_unused_variable_warning(ti5);
+      static const int i_array[3] = { 1, 2, 3, };
+      regex_token_iterator_type ti6(m_in, m_in, e, i_array);
+      ignore_unused_variable_warning(ti6);
+      regex_token_iterator_type ti7(m_in, m_in, e, i_array, m_mft);
+      ignore_unused_variable_warning(ti7);
+   }
+
+   pointer_type m_pointer;
+   flag_type m_flags;
+   std::size_t m_size;
+   input_iterator_type in1, in2;
+   const sub_match_type m_sub;
+   const value_type m_char;
+   match_results_type m_results;
+   const match_results_type m_cresults;
+   OutIterator m_out;
+   BidiIterator m_in;
+   global_regex_namespace::regex_constants::match_flag_type m_mft;
+   global_regex_namespace::match_results<pointer_type> m_pmatch;
+
+   BaseRegexConcept();
+   BaseRegexConcept(const BaseRegexConcept&);
+   BaseRegexConcept& operator=(const BaseRegexConcept&);
+};
+
+//
+// RegexConcept:
+// Test every interface in the std:
+//
+template <class Regex>
+struct RegexConcept
+{
+   typedef typename Regex::value_type value_type;
+   //typedef typename Regex::size_type size_type;
+   typedef typename Regex::flag_type flag_type;
+   typedef typename Regex::locale_type locale_type;
+
+   // derived test types:
+   typedef const value_type* pointer_type;
+   typedef std::basic_string<value_type> string_type;
+   typedef boost::bidirectional_iterator_archetype<value_type> BidiIterator;
+   typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type;
+   typedef global_regex_namespace::match_results<BidiIterator> match_results_type;
+   typedef output_iterator_archetype<value_type> OutIterator;
+
+
+   void constraints() 
+   {
+      function_requires<BaseRegexConcept<Regex> >();
+      // string based construct:
+      Regex e1(m_string);
+      ignore_unused_variable_warning(e1);
+      Regex e2(m_string, m_flags);
+      ignore_unused_variable_warning(e2);
+
+      // assign etc:
+      Regex e;
+      e = m_string;
+      e.assign(m_string);
+      e.assign(m_string, m_flags);
+
+      // sub_match:
+      string_type s(m_sub);
+      ignore_unused_variable_warning(s);
+      s = m_sub.str();
+      ignore_unused_variable_warning(s);
+      int i = m_sub.compare(m_string);
+      ignore_unused_variable_warning(i);
+
+      int i2 = m_sub.compare(m_sub);
+      ignore_unused_variable_warning(i2);
+      i2 = m_sub.compare(m_pointer);
+      ignore_unused_variable_warning(i2);
+
+      bool b = m_sub == m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_sub != m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_sub > m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_sub >= m_sub;
+      ignore_unused_variable_warning(b);
+
+      b = m_sub == m_pointer;
+      ignore_unused_variable_warning(b);
+      b = m_sub != m_pointer;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_pointer;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_pointer;
+      ignore_unused_variable_warning(b);
+      b = m_sub > m_pointer;
+      ignore_unused_variable_warning(b);
+      b = m_sub >= m_pointer;
+      ignore_unused_variable_warning(b);
+
+      b = m_pointer == m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_pointer != m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_pointer <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_pointer <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_pointer > m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_pointer >= m_sub;
+      ignore_unused_variable_warning(b);
+
+      b = m_sub == m_char;
+      ignore_unused_variable_warning(b);
+      b = m_sub != m_char;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_char;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_char;
+      ignore_unused_variable_warning(b);
+      b = m_sub > m_char;
+      ignore_unused_variable_warning(b);
+      b = m_sub >= m_char;
+      ignore_unused_variable_warning(b);
+
+      b = m_char == m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_char != m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_char <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_char <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_char > m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_char >= m_sub;
+      ignore_unused_variable_warning(b);
+
+      b = m_sub == m_string;
+      ignore_unused_variable_warning(b);
+      b = m_sub != m_string;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_string;
+      ignore_unused_variable_warning(b);
+      b = m_sub <= m_string;
+      ignore_unused_variable_warning(b);
+      b = m_sub > m_string;
+      ignore_unused_variable_warning(b);
+      b = m_sub >= m_string;
+      ignore_unused_variable_warning(b);
+
+      b = m_string == m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_string != m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_string <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_string <= m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_string > m_sub;
+      ignore_unused_variable_warning(b);
+      b = m_string >= m_sub;
+      ignore_unused_variable_warning(b);
+
+      // match results:
+      m_string = m_results.str();
+      ignore_unused_variable_warning(m_string);
+      m_string = m_results.str(0);
+      ignore_unused_variable_warning(m_string);
+      m_out = m_cresults.format(m_out, m_string);
+      m_out = m_cresults.format(m_out, m_string, m_mft);
+      m_string = m_cresults.format(m_string);
+      ignore_unused_variable_warning(m_string);
+      m_string = m_cresults.format(m_string, m_mft);
+      ignore_unused_variable_warning(m_string);
+
+      // regex_match:
+      b = global_regex_namespace::regex_match(m_string, m_smatch, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_string, m_smatch, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_string, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_match(m_string, e, m_mft);
+      ignore_unused_variable_warning(b);
+
+      // regex_search:
+      b = global_regex_namespace::regex_search(m_string, m_smatch, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_string, m_smatch, e, m_mft);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_string, e);
+      ignore_unused_variable_warning(b);
+      b = global_regex_namespace::regex_search(m_string, e, m_mft);
+      ignore_unused_variable_warning(b);
+
+      // regex_replace:
+      m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string, m_mft);
+      m_out = global_regex_namespace::regex_replace(m_out, m_in, m_in, e, m_string);
+      m_string = global_regex_namespace::regex_replace(m_string, e, m_string, m_mft);
+      ignore_unused_variable_warning(m_string);
+      m_string = global_regex_namespace::regex_replace(m_string, e, m_string);
+      ignore_unused_variable_warning(m_string);
+
+   }
+
+   flag_type m_flags;
+   string_type m_string;
+   const sub_match_type m_sub;
+   match_results_type m_results;
+   pointer_type m_pointer;
+   value_type m_char;
+   const match_results_type m_cresults;
+   OutIterator m_out;
+   BidiIterator m_in;
+   global_regex_namespace::regex_constants::match_flag_type m_mft;
+   global_regex_namespace::match_results<typename string_type::const_iterator> m_smatch;
+
+   RegexConcept();
+   RegexConcept(const RegexConcept&);
+   RegexConcept& operator=(const RegexConcept&);
+};
+
+#ifndef BOOST_REGEX_TEST_STD
+//
+// BoostRegexConcept:
+// Test every interface in the Boost implementation:
+//
+template <class Regex>
+struct BoostRegexConcept
+{
+   typedef typename Regex::value_type value_type;
+   typedef typename Regex::size_type size_type;
+   typedef typename Regex::flag_type flag_type;
+   typedef typename Regex::locale_type locale_type;
+
+   // derived test types:
+   typedef const value_type* pointer_type;
+   typedef std::basic_string<value_type> string_type;
+   typedef typename Regex::const_iterator const_iterator;
+   typedef bidirectional_iterator_archetype<value_type> BidiIterator;
+   typedef global_regex_namespace::sub_match<BidiIterator> sub_match_type;
+   typedef global_regex_namespace::match_results<BidiIterator> match_results_type;
+
+   void constraints() 
+   {
+      global_regex_namespace::regex_constants::match_flag_type mopts
+         = global_regex_namespace::regex_constants::match_default
+         | global_regex_namespace::regex_constants::match_not_bol
+         | global_regex_namespace::regex_constants::match_not_eol
+         | global_regex_namespace::regex_constants::match_not_bow
+         | global_regex_namespace::regex_constants::match_not_eow
+         | global_regex_namespace::regex_constants::match_any
+         | global_regex_namespace::regex_constants::match_not_null
+         | global_regex_namespace::regex_constants::match_continuous
+         | global_regex_namespace::regex_constants::match_partial
+         | global_regex_namespace::regex_constants::match_prev_avail
+         | global_regex_namespace::regex_constants::format_default
+         | global_regex_namespace::regex_constants::format_sed
+         | global_regex_namespace::regex_constants::format_perl
+         | global_regex_namespace::regex_constants::format_no_copy
+         | global_regex_namespace::regex_constants::format_first_only;
+
+      (void)mopts;
+
+      function_requires<RegexConcept<Regex> >();
+      const global_regex_namespace::regex_error except(global_regex_namespace::regex_constants::error_collate);
+      std::ptrdiff_t pt = except.position();
+      ignore_unused_variable_warning(pt);
+      const Regex ce, ce2;
+#ifndef BOOST_NO_STD_LOCALE
+      m_stream << ce;
+#endif
+      unsigned i = ce.error_code();
+      ignore_unused_variable_warning(i);
+      pointer_type p = ce.expression();
+      ignore_unused_variable_warning(p);
+      int i2 = ce.compare(ce2);
+      ignore_unused_variable_warning(i2);
+      bool b = ce == ce2;
+      ignore_unused_variable_warning(b);
+      b = ce.empty();
+      ignore_unused_variable_warning(b);
+      b = ce != ce2;
+      ignore_unused_variable_warning(b);
+      b = ce < ce2;
+      ignore_unused_variable_warning(b);
+      b = ce > ce2;
+      ignore_unused_variable_warning(b);
+      b = ce <= ce2;
+      ignore_unused_variable_warning(b);
+      b = ce >= ce2;
+      ignore_unused_variable_warning(b);
+      i = ce.status();
+      ignore_unused_variable_warning(i);
+      size_type s = ce.max_size();
+      ignore_unused_variable_warning(s);
+      s = ce.size();
+      ignore_unused_variable_warning(s);
+      const_iterator pi = ce.begin();
+      ignore_unused_variable_warning(pi);
+      pi = ce.end();
+      ignore_unused_variable_warning(pi);
+      string_type s2 = ce.str();
+      ignore_unused_variable_warning(s2);
+
+      m_string = m_sub + m_sub;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_sub + m_pointer;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_pointer + m_sub;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_sub + m_string;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_string + m_sub;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_sub + m_char;
+      ignore_unused_variable_warning(m_string);
+      m_string = m_char + m_sub;
+      ignore_unused_variable_warning(m_string);
+
+#ifndef BOOST_NO_STD_LOCALE
+      m_stream << m_sub;
+      m_stream << m_cresults;
+#endif
+   }
+
+   std::basic_ostream<value_type> m_stream;
+   sub_match_type m_sub;
+   pointer_type m_pointer;
+   string_type m_string;
+   const value_type m_char;
+   match_results_type m_results;
+   const match_results_type m_cresults;
+
+   BoostRegexConcept();
+   BoostRegexConcept(const BoostRegexConcept&);
+   BoostRegexConcept& operator=(const BoostRegexConcept&);
+};
+
+#endif // BOOST_REGEX_TEST_STD
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/config.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,417 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0. (See accompanying file
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         config.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: regex extended config setup.
+  */
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#define BOOST_REGEX_CONFIG_HPP
+/*
+ * Borland C++ Fix/error check
+ * this has to go *before* we include any std lib headers:
+ */
+#if defined(__BORLANDC__)
+#  include <boost/regex/config/borland.hpp>
+#endif
+
+/*****************************************************************************
+ *
+ *  Include all the headers we need here:
+ *
+ ****************************************************************************/
+
+#ifdef __cplusplus
+
+#  ifndef BOOST_REGEX_USER_CONFIG
+#     define BOOST_REGEX_USER_CONFIG <boost/regex/user.hpp>
+#  endif
+
+#  include BOOST_REGEX_USER_CONFIG
+
+#  include <boost/config.hpp>
+
+#else
+   /*
+    * C build,
+    * don't include <boost/config.hpp> because that may
+    * do C++ specific things in future...
+    */
+#  include <stdlib.h>
+#  include <stddef.h>
+#  ifdef _MSC_VER
+#     define BOOST_MSVC _MSC_VER
+#  endif
+#endif
+
+/*****************************************************************************
+ *
+ *  Boilerplate regex config options:
+ *
+ ****************************************************************************/
+
+/* Obsolete macro, use BOOST_VERSION instead: */
+#define BOOST_RE_VERSION 320
+
+/* fix: */
+#if defined(_UNICODE) && !defined(UNICODE)
+#define UNICODE
+#endif
+
+/*
+ * Fix for gcc prior to 3.4: std::ctype<wchar_t> doesn't allow
+ * masks to be combined, for example:
+ * std::use_facet<std::ctype<wchar_t> >.is(std::ctype_base::lower|std::ctype_base::upper, L'a');
+ * returns *false*.
+ */
+#ifdef __GLIBCPP__
+#  define BOOST_REGEX_BUGGY_CTYPE_FACET
+#endif
+
+/*
+ * Intel C++ before 8.0 ends up with unresolved externals unless we turn off
+ * extern template support:
+ */
+#if defined(BOOST_INTEL) && defined(__cplusplus) && (BOOST_INTEL <= 800)
+#  define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#endif
+/*
+ * Visual C++ doesn't support external templates with C++ extensions turned off:
+ */
+#if defined(_MSC_VER) && !defined(_MSC_EXTENSIONS)
+#  define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#endif
+
+/*
+ * If there isn't good enough wide character support then there will
+ * be no wide character regular expressions:
+ */
+#if (defined(BOOST_NO_CWCHAR) || defined(BOOST_NO_CWCTYPE) || defined(BOOST_NO_STD_WSTRING))
+#  if !defined(BOOST_NO_WREGEX)
+#     define BOOST_NO_WREGEX
+#  endif
+#else
+#  if defined(__sgi) && (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))
+      /* STLPort on IRIX is misconfigured: <cwctype> does not compile
+       * as a temporary fix include <wctype.h> instead and prevent inclusion
+       * of STLPort version of <cwctype> */
+#     include <wctype.h>
+#     define __STLPORT_CWCTYPE
+#     define _STLP_CWCTYPE
+#  endif
+
+#ifdef __cplusplus
+#  include <boost/regex/config/cwchar.hpp>
+#endif
+
+#endif
+
+/*
+ * If Win32 support has been disabled for boost in general, then
+ * it is for regex in particular:
+ */
+#if defined(BOOST_DISABLE_WIN32) && !defined(BOOST_REGEX_NO_W32)
+#  define BOOST_REGEX_NO_W32
+#endif
+
+/* disable our own file-iterators and mapfiles if we can't
+ * support them: */
+#if !defined(BOOST_HAS_DIRENT_H) && !(defined(_WIN32) && !defined(BOOST_REGEX_NO_W32))
+#  define BOOST_REGEX_NO_FILEITER
+#endif
+
+/* backwards compatibitity: */
+#if defined(BOOST_RE_NO_LIB)
+#  define BOOST_REGEX_NO_LIB
+#endif
+
+#if defined(__GNUC__) && (defined(_WIN32) || defined(__CYGWIN__))
+/* gcc on win32 has problems if you include <windows.h>
+   (sporadically generates bad code). */
+#  define BOOST_REGEX_NO_W32
+#endif
+#if defined(__COMO__) && !defined(BOOST_REGEX_NO_W32) && !defined(_MSC_EXTENSIONS)
+#  define BOOST_REGEX_NO_W32
+#endif
+
+/*****************************************************************************
+ *
+ *  Wide character workarounds:
+ *
+ ****************************************************************************/
+
+/*
+ * define BOOST_REGEX_HAS_OTHER_WCHAR_T when wchar_t is a native type, but the users
+ * code may be built with wchar_t as unsigned short: basically when we're building
+ * with MSVC and the /Zc:wchar_t option we place some extra unsigned short versions
+ * of the non-inline functions in the library, so that users can still link to the lib,
+ * irrespective of whether their own code is built with /Zc:wchar_t.
+ */
+#if defined(__cplusplus) && (defined(BOOST_MSVC) || defined(__ICL)) && !defined(BOOST_NO_INTRINSIC_WCHAR_T) && defined(BOOST_WINDOWS) && !defined(__SGI_STL_PORT) && !defined(_STLPORT_VERSION) && !defined(BOOST_RWSTD_VER)
+#  define BOOST_REGEX_HAS_OTHER_WCHAR_T
+#  ifdef BOOST_MSVC
+#     pragma warning(push)
+#     pragma warning(disable : 4251 4231 4660)
+#  endif
+#  ifdef _DLL
+#     include <string>
+      extern template class __declspec(dllimport) std::basic_string<unsigned short>;
+#  endif
+#  ifdef BOOST_MSVC
+#     pragma warning(pop)
+#  endif
+#endif
+
+
+/*****************************************************************************
+ *
+ *  Set up dll import/export options:
+ *
+ ****************************************************************************/
+
+#if defined(BOOST_HAS_DECLSPEC) && (defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && !defined(BOOST_REGEX_STATIC_LINK)
+#  if defined(BOOST_REGEX_SOURCE)
+#     define BOOST_REGEX_DECL __declspec(dllexport)
+#     define BOOST_REGEX_BUILD_DLL
+#  else
+#     define BOOST_REGEX_DECL __declspec(dllimport)
+#  endif
+#endif
+
+#ifndef BOOST_REGEX_DECL
+#  define BOOST_REGEX_DECL
+#endif
+
+#if !defined(BOOST_REGEX_NO_LIB) && !defined(BOOST_REGEX_SOURCE) && !defined(BOOST_ALL_NO_LIB) && defined(__cplusplus)
+#  define BOOST_LIB_NAME boost_regex
+#  if defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#     define BOOST_DYN_LINK
+#  endif
+#  ifdef BOOST_REGEX_DIAG
+#     define BOOST_LIB_DIAGNOSTIC
+#  endif
+#  include <boost/config/auto_link.hpp>
+#endif
+
+/*****************************************************************************
+ *
+ *  Set up function call type:
+ *
+ ****************************************************************************/
+
+#if defined(BOOST_MSVC) && (BOOST_MSVC >= 1200) && defined(_MSC_EXTENSIONS)
+#if defined(_DEBUG) || defined(__MSVC_RUNTIME_CHECKS) || defined(_MANAGED)
+#  define BOOST_REGEX_CALL __cdecl
+#else
+#  define BOOST_REGEX_CALL __fastcall
+#endif
+#  define BOOST_REGEX_CCALL __cdecl
+#endif
+
+#if defined(__BORLANDC__) && !defined(BOOST_DISABLE_WIN32)
+#  define BOOST_REGEX_CALL __fastcall
+#  define BOOST_REGEX_CCALL __stdcall
+#endif
+
+#ifndef BOOST_REGEX_CALL
+#  define BOOST_REGEX_CALL
+#endif
+#ifndef BOOST_REGEX_CCALL
+#define BOOST_REGEX_CCALL
+#endif
+
+/*****************************************************************************
+ *
+ *  Set up localisation model:
+ *
+ ****************************************************************************/
+
+/* backwards compatibility: */
+#ifdef BOOST_RE_LOCALE_C
+#  define BOOST_REGEX_USE_C_LOCALE
+#endif
+
+#ifdef BOOST_RE_LOCALE_CPP
+#  define BOOST_REGEX_USE_CPP_LOCALE
+#endif
+
+/* Win32 defaults to native Win32 locale: */
+#if defined(_WIN32) && !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) && !defined(BOOST_REGEX_NO_W32)
+#  define BOOST_REGEX_USE_WIN32_LOCALE
+#endif
+/* otherwise use C++ locale if supported: */
+#if !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE) && !defined(BOOST_NO_STD_LOCALE)
+#  define BOOST_REGEX_USE_CPP_LOCALE
+#endif
+/* otherwise use C+ locale: */
+#if !defined(BOOST_REGEX_USE_WIN32_LOCALE) && !defined(BOOST_REGEX_USE_C_LOCALE) && !defined(BOOST_REGEX_USE_CPP_LOCALE)
+#  define BOOST_REGEX_USE_C_LOCALE
+#endif
+
+#ifndef BOOST_REGEX_MAX_STATE_COUNT
+#  define BOOST_REGEX_MAX_STATE_COUNT 100000000
+#endif
+
+
+/*****************************************************************************
+ *
+ *  Error Handling for exception free compilers:
+ *
+ ****************************************************************************/
+
+#ifdef BOOST_NO_EXCEPTIONS
+/*
+ * If there are no exceptions then we must report critical-errors
+ * the only way we know how; by terminating.
+ */
+#include <stdexcept>
+#include <string>
+#include <boost/throw_exception.hpp>
+
+#  define BOOST_REGEX_NOEH_ASSERT(x)\
+if(0 == (x))\
+{\
+   std::string s("Error: critical regex++ failure in: ");\
+   s.append(#x);\
+   std::runtime_error e(s);\
+   boost::throw_exception(e);\
+}
+#else
+/*
+ * With exceptions then error handling is taken care of and
+ * there is no need for these checks:
+ */
+#  define BOOST_REGEX_NOEH_ASSERT(x)
+#endif
+
+
+/*****************************************************************************
+ *
+ *  Stack protection under MS Windows:
+ *
+ ****************************************************************************/
+
+#if !defined(BOOST_REGEX_NO_W32) && !defined(BOOST_REGEX_V3)
+#  if(defined(_WIN32) || defined(_WIN64) || defined(_WINCE)) \
+        && !defined(__GNUC__) \
+        && !(defined(__BORLANDC__) && (__BORLANDC__ >= 0x600)) \
+        && !(defined(__MWERKS__) && (__MWERKS__ <= 0x3003))
+#     define BOOST_REGEX_HAS_MS_STACK_GUARD
+#  endif
+#elif defined(BOOST_REGEX_HAS_MS_STACK_GUARD)
+#  undef BOOST_REGEX_HAS_MS_STACK_GUARD
+#endif
+
+#if defined(__cplusplus) && defined(BOOST_REGEX_HAS_MS_STACK_GUARD)
+
+namespace boost{
+namespace re_detail{
+
+BOOST_REGEX_DECL void BOOST_REGEX_CALL reset_stack_guard_page();
+
+}
+}
+
+#endif
+
+
+/*****************************************************************************
+ *
+ *  Algorithm selection and configuration:
+ *
+ ****************************************************************************/
+
+#if !defined(BOOST_REGEX_RECURSIVE) && !defined(BOOST_REGEX_NON_RECURSIVE)
+#  if defined(BOOST_REGEX_HAS_MS_STACK_GUARD) && !defined(_STLP_DEBUG) && !defined(__STL_DEBUG) && !(defined(BOOST_MSVC) && (BOOST_MSVC >= 1400))
+#     define BOOST_REGEX_RECURSIVE
+#  else
+#     define BOOST_REGEX_NON_RECURSIVE
+#  endif
+#endif
+
+#ifdef BOOST_REGEX_NON_RECURSIVE
+#  ifdef BOOST_REGEX_RECURSIVE
+#     error "Can't set both BOOST_REGEX_RECURSIVE and BOOST_REGEX_NON_RECURSIVE"
+#  endif
+#  ifndef BOOST_REGEX_BLOCKSIZE
+#     define BOOST_REGEX_BLOCKSIZE 4096
+#  endif
+#  if BOOST_REGEX_BLOCKSIZE < 512
+#     error "BOOST_REGEX_BLOCKSIZE must be at least 512"
+#  endif
+#  ifndef BOOST_REGEX_MAX_BLOCKS
+#     define BOOST_REGEX_MAX_BLOCKS 1024
+#  endif
+#  ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
+#     undef BOOST_REGEX_HAS_MS_STACK_GUARD
+#  endif
+#  ifndef BOOST_REGEX_MAX_CACHE_BLOCKS
+#     define BOOST_REGEX_MAX_CACHE_BLOCKS 16
+#  endif
+#endif
+
+
+/*****************************************************************************
+ *
+ *  helper memory allocation functions:
+ *
+ ****************************************************************************/
+
+#if defined(__cplusplus) && defined(BOOST_REGEX_NON_RECURSIVE)
+namespace boost{ namespace re_detail{
+
+BOOST_REGEX_DECL void* BOOST_REGEX_CALL get_mem_block();
+BOOST_REGEX_DECL void BOOST_REGEX_CALL put_mem_block(void*);
+
+}} /* namespaces */
+#endif
+
+/*****************************************************************************
+ *
+ *  Diagnostics:
+ *
+ ****************************************************************************/
+
+#ifdef BOOST_REGEX_CONFIG_INFO
+BOOST_REGEX_DECL void BOOST_REGEX_CALL print_regex_library_info();
+#endif
+
+#if defined(BOOST_REGEX_DIAG)
+#  pragma message ("BOOST_REGEX_DECL" BOOST_STRINGIZE(=BOOST_REGEX_DECL))
+#  pragma message ("BOOST_REGEX_CALL" BOOST_STRINGIZE(=BOOST_REGEX_CALL))
+#  pragma message ("BOOST_REGEX_CCALL" BOOST_STRINGIZE(=BOOST_REGEX_CCALL))
+#ifdef BOOST_REGEX_USE_C_LOCALE
+#  pragma message ("Using C locale in regex traits class")
+#elif BOOST_REGEX_USE_CPP_LOCALE
+#  pragma message ("Using C++ locale in regex traits class")
+#else
+#  pragma message ("Using Win32 locale in regex traits class")
+#endif
+#if defined(BOOST_REGEX_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)
+#  pragma message ("Dynamic linking enabled")
+#endif
+#if defined(BOOST_REGEX_NO_LIB) || defined(BOOST_ALL_NO_LIB)
+#  pragma message ("Auto-linking disabled")
+#endif
+#ifdef BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#  pragma message ("Extern templates disabled")
+#endif
+
+#endif
+
+#endif
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/config/borland.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         boost/regex/config/borland.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: regex borland-specific config setup.
+  */
+
+
+#if defined(__BORLANDC__)
+#  if (__BORLANDC__ == 0x550) || (__BORLANDC__ == 0x551)
+      // problems with std::basic_string and dll RTL:
+#     if defined(_RTLDLL) && defined(_RWSTD_COMPILE_INSTANTIATE)
+#        ifdef BOOST_REGEX_BUILD_DLL
+#           error _RWSTD_COMPILE_INSTANTIATE must not be defined when building regex++ as a DLL
+#        else
+#           pragma message("Defining _RWSTD_COMPILE_INSTANTIATE when linking to the DLL version of the RTL may produce memory corruption problems in std::basic_string, as a result of separate versions of basic_string's static data in the RTL and you're exe/dll: be warned!!")
+#        endif
+#     endif
+#     ifndef _RTLDLL
+         // this is harmless for a staic link:
+#        define _RWSTD_COMPILE_INSTANTIATE
+#     endif
+      // external templates cause problems for some reason:
+#     define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+#  endif
+#  if (__BORLANDC__ <= 0x540) && !defined(BOOST_REGEX_NO_LIB) && !defined(_NO_VCL)
+      // C++ Builder 4 and earlier, we can't tell whether we should be using
+      // the VCL runtime or not, do a static link instead:
+#     define BOOST_REGEX_STATIC_LINK
+#  endif
+   //
+   // VCL support:
+   // if we're building a console app then there can't be any VCL (can there?)
+#  if !defined(__CONSOLE__) && !defined(_NO_VCL)
+#     define BOOST_REGEX_USE_VCL
+#  endif
+   //
+   // if this isn't Win32 then don't automatically select link
+   // libraries:
+   //
+#  ifndef _Windows
+#     ifndef BOOST_REGEX_NO_LIB
+#        define BOOST_REGEX_NO_LIB
+#     endif
+#     ifndef BOOST_REGEX_STATIC_LINK
+#        define BOOST_REGEX_STATIC_LINK
+#     endif
+#  endif
+
+#if __BORLANDC__ < 0x600
+//
+// string workarounds:
+//
+#include <cstring>
+#undef strcmp
+#undef strcpy
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/config/cwchar.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,207 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         boost/regex/config/cwchar.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: regex wide character string fixes.
+  */
+
+#ifndef BOOST_REGEX_CONFIG_CWCHAR_HPP
+#define BOOST_REGEX_CONFIG_CWCHAR_HPP
+
+#include <cwchar>
+#include <cwctype>
+#include <boost/config.hpp>
+
+#if defined(__STD_RWCOMPILER_H__) || defined(_RWSTD_VER)
+// apparently this is required for the RW STL on Linux:
+#undef iswalnum
+#undef iswalpha
+#undef iswblank
+#undef iswcntrl
+#undef iswdigit
+#undef iswgraph
+#undef iswlower
+#undef iswprint
+#undef iswprint
+#undef iswpunct
+#undef iswspace
+#undef iswupper
+#undef iswxdigit
+#undef iswctype
+#undef towlower
+#undef towupper
+#undef towctrans
+#undef wctrans
+#undef wctype
+#endif
+
+namespace std{
+
+#ifndef BOOST_NO_STDC_NAMESPACE
+extern "C"{
+#endif
+
+#ifdef iswalnum
+inline int (iswalnum)(wint_t i)
+{ return iswalnum(i); }
+#undef iswalnum
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswalnum;
+#endif
+
+#ifdef iswalpha
+inline int (iswalpha)(wint_t i)
+{ return iswalpha(i); }
+#undef iswalpha
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswalpha;
+#endif
+
+#ifdef iswcntrl
+inline int (iswcntrl)(wint_t i)
+{ return iswcntrl(i); }
+#undef iswcntrl
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswcntrl;
+#endif
+
+#ifdef iswdigit
+inline int (iswdigit)(wint_t i)
+{ return iswdigit(i); }
+#undef iswdigit
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswdigit;
+#endif
+
+#ifdef iswgraph
+inline int (iswgraph)(wint_t i)
+{ return iswgraph(i); }
+#undef iswgraph
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswgraph;
+#endif
+
+#ifdef iswlower
+inline int (iswlower)(wint_t i)
+{ return iswlower(i); }
+#undef iswlower
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswlower;
+#endif
+
+#ifdef iswprint
+inline int (iswprint)(wint_t i)
+{ return iswprint(i); }
+#undef iswprint
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswprint;
+#endif
+
+#ifdef iswpunct
+inline int (iswpunct)(wint_t i)
+{ return iswpunct(i); }
+#undef iswpunct
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswpunct;
+#endif
+
+#ifdef iswspace
+inline int (iswspace)(wint_t i)
+{ return iswspace(i); }
+#undef iswspace
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswspace;
+#endif
+
+#ifdef iswupper
+inline int (iswupper)(wint_t i)
+{ return iswupper(i); }
+#undef iswupper
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswupper;
+#endif
+
+#ifdef iswxdigit
+inline int (iswxdigit)(wint_t i)
+{ return iswxdigit(i); }
+#undef iswxdigit
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::iswxdigit;
+#endif
+
+#ifdef towlower
+inline wint_t (towlower)(wint_t i)
+{ return towlower(i); }
+#undef towlower
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::towlower;
+#endif
+
+#ifdef towupper
+inline wint_t (towupper)(wint_t i)
+{ return towupper(i); }
+#undef towupper
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using :: towupper;
+#endif
+
+#ifdef wcscmp
+inline int (wcscmp)(const wchar_t *p1, const wchar_t *p2)
+{ return wcscmp(p1,p2); }
+#undef wcscmp
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::wcscmp;
+#endif
+
+#ifdef wcscoll
+inline int (wcscoll)(const wchar_t *p1, const wchar_t *p2)
+{ return wcscoll(p1,p2); }
+#undef wcscoll
+#elif defined(BOOST_NO_STDC_NAMESPACE) && !defined(UNDER_CE)
+using ::wcscoll;
+#endif
+
+#ifdef wcscpy
+inline wchar_t *(wcscpy)(wchar_t *p1, const wchar_t *p2)
+{ return wcscpy(p1,p2); }
+#undef wcscpy
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::wcscpy;
+#endif
+
+#ifdef wcslen
+inline size_t (wcslen)(const wchar_t *p)
+{ return wcslen(p); }
+#undef wcslen
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::wcslen;
+#endif
+
+#ifdef wcsxfrm
+size_t wcsxfrm(wchar_t *p1, const wchar_t *p2, size_t s)
+{ return wcsxfrm(p1,p2,s); }
+#undef wcsxfrm
+#elif defined(BOOST_NO_STDC_NAMESPACE)
+using ::wcsxfrm;
+#endif
+
+
+#ifndef BOOST_NO_STDC_NAMESPACE
+} // extern "C"
+#endif
+
+} // namespace std
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/icu.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1017 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         icu.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Unicode regular expressions on top of the ICU Library.
+  */
+
+#ifndef BOOST_REGEX_ICU_HPP
+#define BOOST_REGEX_ICU_HPP
+
+#include <unicode/utypes.h>
+#include <unicode/uchar.h>
+#include <unicode/coll.h>
+#include <boost/regex.hpp>
+#include <boost/regex/pending/unicode_iterator.hpp>
+#include <boost/mpl/int_fwd.hpp>
+#include <bitset>
+
+
+namespace boost{
+
+namespace re_detail{
+
+// 
+// Implementation details:
+//
+class BOOST_REGEX_DECL icu_regex_traits_implementation
+{
+   typedef UChar32                      char_type;
+   typedef std::size_t                  size_type;
+   typedef std::vector<char_type>       string_type;
+   typedef U_NAMESPACE_QUALIFIER Locale locale_type;
+   typedef boost::uint_least32_t        char_class_type;
+public:
+   icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& l)
+      : m_locale(l)
+   {
+      UErrorCode success = U_ZERO_ERROR;
+      m_collator.reset(U_NAMESPACE_QUALIFIER Collator::createInstance(l, success));
+      if(U_SUCCESS(success) == 0)
+         init_error();
+      m_collator->setStrength(U_NAMESPACE_QUALIFIER Collator::IDENTICAL);
+      success = U_ZERO_ERROR;
+      m_primary_collator.reset(U_NAMESPACE_QUALIFIER Collator::createInstance(l, success));
+      if(U_SUCCESS(success) == 0)
+         init_error();
+      m_primary_collator->setStrength(U_NAMESPACE_QUALIFIER Collator::PRIMARY);
+   }
+   U_NAMESPACE_QUALIFIER Locale getloc()const
+   {
+      return m_locale;
+   }
+   string_type do_transform(const char_type* p1, const char_type* p2, const U_NAMESPACE_QUALIFIER Collator* pcoll) const;
+   string_type transform(const char_type* p1, const char_type* p2) const
+   {
+      return do_transform(p1, p2, m_collator.get());
+   }
+   string_type transform_primary(const char_type* p1, const char_type* p2) const
+   {
+      return do_transform(p1, p2, m_primary_collator.get());
+   }
+private:
+   void init_error()
+   {
+      std::runtime_error e("Could not initialize ICU resources");
+      boost::throw_exception(e);
+   }
+   U_NAMESPACE_QUALIFIER Locale m_locale;                                  // The ICU locale that we're using
+   boost::scoped_ptr< U_NAMESPACE_QUALIFIER Collator> m_collator;          // The full collation object
+   boost::scoped_ptr< U_NAMESPACE_QUALIFIER Collator> m_primary_collator;  // The primary collation object
+};
+
+inline boost::shared_ptr<icu_regex_traits_implementation> get_icu_regex_traits_implementation(const U_NAMESPACE_QUALIFIER Locale& loc)
+{
+   return boost::shared_ptr<icu_regex_traits_implementation>(new icu_regex_traits_implementation(loc));
+}
+
+}
+
+class BOOST_REGEX_DECL icu_regex_traits
+{
+public:
+   typedef UChar32                      char_type;
+   typedef std::size_t                  size_type;
+   typedef std::vector<char_type>       string_type;
+   typedef U_NAMESPACE_QUALIFIER Locale locale_type;
+#ifdef BOOST_NO_INT64_T
+   typedef std::bitset<64>              char_class_type;
+#else
+   typedef boost::uint64_t              char_class_type;
+#endif
+
+   struct boost_extensions_tag{};
+
+   icu_regex_traits()
+      : m_pimpl(re_detail::get_icu_regex_traits_implementation(U_NAMESPACE_QUALIFIER Locale()))
+   {
+   }
+   static size_type length(const char_type* p);
+
+   ::boost::regex_constants::syntax_type syntax_type(char_type c)const
+   {
+      return ((c < 0x7f) && (c > 0)) ? re_detail::get_default_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
+   }
+   ::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c) const
+   {
+      return ((c < 0x7f) && (c > 0)) ? re_detail::get_default_escape_syntax_type(static_cast<char>(c)) : regex_constants::syntax_char;
+   }
+   char_type translate(char_type c) const
+   {
+      return c;
+   }
+   char_type translate_nocase(char_type c) const
+   {
+      return ::u_tolower(c);
+   }
+   char_type translate(char_type c, bool icase) const
+   {
+      return icase ? translate_nocase(c) : translate(c);
+   }
+   char_type tolower(char_type c) const
+   {
+      return ::u_tolower(c);
+   }
+   char_type toupper(char_type c) const
+   {
+      return ::u_toupper(c);
+   }
+   string_type transform(const char_type* p1, const char_type* p2) const
+   {
+      return m_pimpl->transform(p1, p2);
+   }
+   string_type transform_primary(const char_type* p1, const char_type* p2) const
+   {
+      return m_pimpl->transform_primary(p1, p2);
+   }
+   char_class_type lookup_classname(const char_type* p1, const char_type* p2) const;
+   string_type lookup_collatename(const char_type* p1, const char_type* p2) const;
+   bool isctype(char_type c, char_class_type f) const;
+   int toi(const char_type*& p1, const char_type* p2, int radix)const
+   {
+      return re_detail::global_toi(p1, p2, radix, *this);
+   }
+   int value(char_type c, int radix)const
+   {
+      return u_digit(c, static_cast< ::int8_t>(radix));
+   }
+   locale_type imbue(locale_type l)
+   {
+      locale_type result(m_pimpl->getloc());
+      m_pimpl = re_detail::get_icu_regex_traits_implementation(l);
+      return result;
+   }
+   locale_type getloc()const
+   {
+      return locale_type();
+   }
+   std::string error_string(::boost::regex_constants::error_type n) const
+   {
+      return re_detail::get_default_error_string(n);
+   }
+private:
+   icu_regex_traits(const icu_regex_traits&);
+   icu_regex_traits& operator=(const icu_regex_traits&);
+
+   //
+   // define the bitmasks offsets we need for additional character properties:
+   //
+   enum{
+      offset_blank = U_CHAR_CATEGORY_COUNT,
+      offset_space = U_CHAR_CATEGORY_COUNT+1,
+      offset_xdigit = U_CHAR_CATEGORY_COUNT+2,
+      offset_underscore = U_CHAR_CATEGORY_COUNT+3,
+      offset_unicode = U_CHAR_CATEGORY_COUNT+4,
+      offset_any = U_CHAR_CATEGORY_COUNT+5,
+      offset_ascii = U_CHAR_CATEGORY_COUNT+6
+   };
+
+   //
+   // and now the masks:
+   //
+   static const char_class_type mask_blank;
+   static const char_class_type mask_space;
+   static const char_class_type mask_xdigit;
+   static const char_class_type mask_underscore;
+   static const char_class_type mask_unicode;
+   static const char_class_type mask_any;
+   static const char_class_type mask_ascii;
+
+   static char_class_type lookup_icu_mask(const ::UChar32* p1, const ::UChar32* p2);
+
+   boost::shared_ptr< ::boost::re_detail::icu_regex_traits_implementation> m_pimpl;
+};
+
+} // namespace boost
+
+//
+// template instances:
+//
+#define BOOST_REGEX_CHAR_T UChar32
+#undef BOOST_REGEX_TRAITS_T
+#define BOOST_REGEX_TRAITS_T , icu_regex_traits
+#define BOOST_REGEX_ICU_INSTANCES
+#ifdef BOOST_REGEX_ICU_INSTANTIATE
+#  define BOOST_REGEX_INSTANTIATE
+#endif
+#include <boost/regex/v4/instances.hpp>
+#undef BOOST_REGEX_CHAR_T
+#undef BOOST_REGEX_TRAITS_T
+#undef BOOST_REGEX_ICU_INSTANCES
+#ifdef BOOST_REGEX_INSTANTIATE
+#  undef BOOST_REGEX_INSTANTIATE
+#endif
+
+namespace boost{
+
+// types:
+typedef basic_regex< ::UChar32, icu_regex_traits> u32regex;
+typedef match_results<const ::UChar32*> u32match;
+typedef match_results<const ::UChar*> u16match;
+
+//
+// Construction of 32-bit regex types from UTF-8 and UTF-16 primitives:
+//
+namespace re_detail{
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATES) && !defined(__IBMCPP__)
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<1>*)
+{
+   typedef boost::u8_to_u32_iterator<InputIterator, UChar32> conv_type;
+   return u32regex(conv_type(i), conv_type(j), opt);
+}
+
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<2>*)
+{
+   typedef boost::u16_to_u32_iterator<InputIterator, UChar32> conv_type;
+   return u32regex(conv_type(i), conv_type(j), opt);
+}
+
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<4>*)
+{
+   return u32regex(i, j, opt);
+}
+#else
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<1>*)
+{
+   typedef boost::u8_to_u32_iterator<InputIterator, UChar32> conv_type;
+   typedef std::vector<UChar32> vector_type;
+   vector_type v;
+   conv_type a(i), b(j);
+   while(a != b)
+   {
+      v.push_back(*a);
+      ++a;
+   }
+   if(v.size())
+      return u32regex(&*v.begin(), v.size(), opt);
+   return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
+}
+
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<2>*)
+{
+   typedef boost::u16_to_u32_iterator<InputIterator, UChar32> conv_type;
+   typedef std::vector<UChar32> vector_type;
+   vector_type v;
+   conv_type a(i), b(j);
+   while(a != b)
+   {
+      v.push_back(*a);
+      ++a;
+   }
+   if(v.size())
+      return u32regex(&*v.begin(), v.size(), opt);
+   return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
+}
+
+template <class InputIterator>
+inline u32regex do_make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt, 
+                              const boost::mpl::int_<4>*)
+{
+   typedef std::vector<UCHAR32> vector_type;
+   vector_type v;
+   while(i != j)
+   {
+      v.push_back((UCHAR32)(*i));
+      ++a;
+   }
+   if(v.size())
+      return u32regex(&*v.begin(), v.size(), opt);
+   return u32regex(static_cast<UChar32 const*>(0), static_cast<u32regex::size_type>(0), opt);
+}
+#endif
+}
+
+//
+// Construction from an iterator pair:
+//
+template <class InputIterator>
+inline u32regex make_u32regex(InputIterator i, 
+                              InputIterator j, 
+                              boost::regex_constants::syntax_option_type opt)
+{
+   return re_detail::do_make_u32regex(i, j, opt, static_cast<boost::mpl::int_<sizeof(*i)> const*>(0));
+}
+//
+// construction from UTF-8 nul-terminated strings:
+//
+inline u32regex make_u32regex(const char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(p, p + std::strlen(p), opt, static_cast<boost::mpl::int_<1> const*>(0));
+}
+inline u32regex make_u32regex(const unsigned char* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(p, p + std::strlen(reinterpret_cast<const char*>(p)), opt, static_cast<boost::mpl::int_<1> const*>(0));
+}
+//
+// construction from UTF-16 nul-terminated strings:
+//
+#ifndef BOOST_NO_WREGEX
+inline u32regex make_u32regex(const wchar_t* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(p, p + std::wcslen(p), opt, static_cast<boost::mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
+inline u32regex make_u32regex(const UChar* p, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(p, p + u_strlen(p), opt, static_cast<boost::mpl::int_<2> const*>(0));
+}
+#endif
+//
+// construction from basic_string class-template:
+//
+template<class C, class T, class A>
+inline u32regex make_u32regex(const std::basic_string<C, T, A>& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(s.begin(), s.end(), opt, static_cast<boost::mpl::int_<sizeof(C)> const*>(0));
+}
+//
+// Construction from ICU string type:
+//
+inline u32regex make_u32regex(const UnicodeString& s, boost::regex_constants::syntax_option_type opt = boost::regex_constants::perl)
+{
+   return re_detail::do_make_u32regex(s.getBuffer(), s.getBuffer() + s.length(), opt, static_cast<boost::mpl::int_<2> const*>(0));
+}
+
+//
+// regex_match overloads that widen the character type as appropriate:
+//
+namespace re_detail{
+template<class MR1, class MR2>
+void copy_results(MR1& out, MR2 const& in)
+{
+   // copy results from an adapted MR2 match_results:
+   out.set_size(in.size(), in.prefix().first.base(), in.suffix().second.base());
+   out.set_base(in.base().base());
+   for(int i = 0; i < (int)in.size(); ++i)
+   {
+      if(in[i].matched)
+      {
+         out.set_first(in[i].first.base(), i);
+         out.set_second(in[i].second.base(), i);
+      }
+   }
+}
+
+template <class BidiIterator, class Allocator>
+inline bool do_regex_match(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 boost::mpl::int_<4> const*)
+{
+   return ::boost::regex_match(first, last, m, e, flags);
+}
+template <class BidiIterator, class Allocator>
+bool do_regex_match(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 boost::mpl::int_<2> const*)
+{
+   typedef u16_to_u32_iterator<BidiIterator, UChar32> conv_type;
+   typedef match_results<conv_type>                   match_type;
+   typedef typename match_type::allocator_type        alloc_type;
+   match_type what;
+   bool result = ::boost::regex_match(conv_type(first), conv_type(last), what, e, flags);
+   // copy results across to m:
+   if(result) copy_results(m, what);
+   return result;
+}
+template <class BidiIterator, class Allocator>
+bool do_regex_match(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 boost::mpl::int_<1> const*)
+{
+   typedef u8_to_u32_iterator<BidiIterator, UChar32>  conv_type;
+   typedef match_results<conv_type>                   match_type;
+   typedef typename match_type::allocator_type        alloc_type;
+   match_type what;
+   bool result = ::boost::regex_match(conv_type(first), conv_type(last), what, e, flags);
+   // copy results across to m:
+   if(result) copy_results(m, what);
+   return result;
+}
+} // namespace re_detail
+
+template <class BidiIterator, class Allocator>
+inline bool u32regex_match(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+}
+inline bool u32regex_match(const UChar* p, 
+                 match_results<const UChar*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
+}
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
+inline bool u32regex_match(const wchar_t* p, 
+                 match_results<const wchar_t*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_match(const char* p, 
+                 match_results<const char*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_match(const unsigned char* p, 
+                 match_results<const unsigned char*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_match(const std::string& s, 
+                        match_results<std::string::const_iterator>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+#ifndef BOOST_NO_STD_WSTRING
+inline bool u32regex_match(const std::wstring& s, 
+                        match_results<std::wstring::const_iterator>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_match(const UnicodeString& s, 
+                        match_results<const UChar*>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+//
+// regex_match overloads that do not return what matched:
+//
+template <class BidiIterator>
+inline bool u32regex_match(BidiIterator first, BidiIterator last, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<BidiIterator> m;
+   return re_detail::do_regex_match(first, last, m, e, flags, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+}
+inline bool u32regex_match(const UChar* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const UChar*> m;
+   return re_detail::do_regex_match(p, p+u_strlen(p), m, e, flags, static_cast<mpl::int_<2> const*>(0));
+}
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
+inline bool u32regex_match(const wchar_t* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return re_detail::do_regex_match(p, p+std::wcslen(p), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_match(const char* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return re_detail::do_regex_match(p, p+std::strlen(p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_match(const unsigned char* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const unsigned char*> m;
+   return re_detail::do_regex_match(p, p+std::strlen((const char*)p), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_match(const std::string& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<1> const*>(0));
+}
+#ifndef BOOST_NO_STD_WSTRING
+inline bool u32regex_match(const std::wstring& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::wstring::const_iterator> m;
+   return re_detail::do_regex_match(s.begin(), s.end(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_match(const UnicodeString& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const UChar*> m;
+   return re_detail::do_regex_match(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+
+//
+// regex_search overloads that widen the character type as appropriate:
+//
+namespace re_detail{
+template <class BidiIterator, class Allocator>
+inline bool do_regex_search(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 BidiIterator base,
+                 boost::mpl::int_<4> const*)
+{
+   return ::boost::regex_search(first, last, m, e, flags, base);
+}
+template <class BidiIterator, class Allocator>
+bool do_regex_search(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 BidiIterator base,
+                 boost::mpl::int_<2> const*)
+{
+   typedef u16_to_u32_iterator<BidiIterator, UChar32> conv_type;
+   typedef match_results<conv_type>                   match_type;
+   typedef typename match_type::allocator_type        alloc_type;
+   match_type what;
+   bool result = ::boost::regex_search(conv_type(first), conv_type(last), what, e, flags, conv_type(base));
+   // copy results across to m:
+   if(result) copy_results(m, what);
+   return result;
+}
+template <class BidiIterator, class Allocator>
+bool do_regex_search(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 BidiIterator base,
+                 boost::mpl::int_<1> const*)
+{
+   typedef u8_to_u32_iterator<BidiIterator, UChar32>  conv_type;
+   typedef match_results<conv_type>                   match_type;
+   typedef typename match_type::allocator_type        alloc_type;
+   match_type what;
+   bool result = ::boost::regex_search(conv_type(first), conv_type(last), what, e, flags, conv_type(base));
+   // copy results across to m:
+   if(result) copy_results(m, what);
+   return result;
+}
+}
+
+template <class BidiIterator, class Allocator>
+inline bool u32regex_search(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+}
+template <class BidiIterator, class Allocator>
+inline bool u32regex_search(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags,
+                 BidiIterator base)
+{
+   return re_detail::do_regex_search(first, last, m, e, flags, base, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+}
+inline bool u32regex_search(const UChar* p, 
+                 match_results<const UChar*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
+}
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
+inline bool u32regex_search(const wchar_t* p, 
+                 match_results<const wchar_t*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_search(const char* p, 
+                 match_results<const char*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_search(const unsigned char* p, 
+                 match_results<const unsigned char*>& m, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_search(const std::string& s, 
+                        match_results<std::string::const_iterator>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
+}
+#ifndef BOOST_NO_STD_WSTRING
+inline bool u32regex_search(const std::wstring& s, 
+                        match_results<std::wstring::const_iterator>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_search(const UnicodeString& s, 
+                        match_results<const UChar*>& m, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return re_detail::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+template <class BidiIterator>
+inline bool u32regex_search(BidiIterator first, BidiIterator last, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<BidiIterator> m;
+   return re_detail::do_regex_search(first, last, m, e, flags, first, static_cast<mpl::int_<sizeof(*first)> const*>(0));
+}
+inline bool u32regex_search(const UChar* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const UChar*> m;
+   return re_detail::do_regex_search(p, p+u_strlen(p), m, e, flags, p, static_cast<mpl::int_<2> const*>(0));
+}
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2) && !defined(BOOST_NO_WREGEX)
+inline bool u32regex_search(const wchar_t* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return re_detail::do_regex_search(p, p+std::wcslen(p), m, e, flags, p, static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_search(const char* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return re_detail::do_regex_search(p, p+std::strlen(p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_search(const unsigned char* p, 
+                 const u32regex& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<const unsigned char*> m;
+   return re_detail::do_regex_search(p, p+std::strlen((const char*)p), m, e, flags, p, static_cast<mpl::int_<1> const*>(0));
+}
+inline bool u32regex_search(const std::string& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<1> const*>(0));
+}
+#ifndef BOOST_NO_STD_WSTRING
+inline bool u32regex_search(const std::wstring& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::wstring::const_iterator> m;
+   return re_detail::do_regex_search(s.begin(), s.end(), m, e, flags, s.begin(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+#endif
+inline bool u32regex_search(const UnicodeString& s, 
+                        const u32regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const UChar*> m;
+   return re_detail::do_regex_search(s.getBuffer(), s.getBuffer() + s.length(), m, e, flags, s.getBuffer(), static_cast<mpl::int_<sizeof(wchar_t)> const*>(0));
+}
+
+//
+// overloads for regex_replace with utf-8 and utf-16 data types:
+//
+namespace re_detail{
+template <class I>
+inline std::pair< boost::u8_to_u32_iterator<I>, boost::u8_to_u32_iterator<I> >
+   make_utf32_seq(I i, I j, mpl::int_<1> const*)
+{
+   return std::pair< boost::u8_to_u32_iterator<I>, boost::u8_to_u32_iterator<I> >(boost::u8_to_u32_iterator<I>(i), boost::u8_to_u32_iterator<I>(j));
+}
+template <class I>
+inline std::pair< boost::u16_to_u32_iterator<I>, boost::u16_to_u32_iterator<I> >
+   make_utf32_seq(I i, I j, mpl::int_<2> const*)
+{
+   return std::pair< boost::u16_to_u32_iterator<I>, boost::u16_to_u32_iterator<I> >(boost::u16_to_u32_iterator<I>(i), boost::u16_to_u32_iterator<I>(j));
+}
+template <class I>
+inline std::pair< I, I >
+   make_utf32_seq(I i, I j, mpl::int_<4> const*)
+{
+   return std::pair< I, I >(i, j);
+}
+template <class charT>
+inline std::pair< boost::u8_to_u32_iterator<const charT*>, boost::u8_to_u32_iterator<const charT*> >
+   make_utf32_seq(const charT* p, mpl::int_<1> const*)
+{
+   return std::pair< boost::u8_to_u32_iterator<const charT*>, boost::u8_to_u32_iterator<const charT*> >(boost::u8_to_u32_iterator<const charT*>(p), boost::u8_to_u32_iterator<const charT*>(p+std::strlen((const char*)p)));
+}
+template <class charT>
+inline std::pair< boost::u16_to_u32_iterator<const charT*>, boost::u16_to_u32_iterator<const charT*> >
+   make_utf32_seq(const charT* p, mpl::int_<2> const*)
+{
+   return std::pair< boost::u16_to_u32_iterator<const charT*>, boost::u16_to_u32_iterator<const charT*> >(boost::u16_to_u32_iterator<const charT*>(p), boost::u16_to_u32_iterator<const charT*>(p+u_strlen((const UChar*)p)));
+}
+template <class charT>
+inline std::pair< const charT*, const charT* >
+   make_utf32_seq(const charT* p, mpl::int_<4> const*)
+{
+   return std::pair< const charT*, const charT* >(p, p+icu_regex_traits::length((UChar32 const*)p));
+}
+template <class OutputIterator>
+inline OutputIterator make_utf32_out(OutputIterator o, mpl::int_<4> const*)
+{
+   return o;
+}
+template <class OutputIterator>
+inline utf16_output_iterator<OutputIterator> make_utf32_out(OutputIterator o, mpl::int_<2> const*)
+{
+   return o;
+}
+template <class OutputIterator>
+inline utf8_output_iterator<OutputIterator> make_utf32_out(OutputIterator o, mpl::int_<1> const*)
+{
+   return o;
+}
+
+template <class OutputIterator, class I1, class I2>
+OutputIterator do_regex_replace(OutputIterator out,
+                                 std::pair<I1, I1> const& in,
+                                 const u32regex& e, 
+                                 const std::pair<I2, I2>& fmt, 
+                                 match_flag_type flags
+                                 )
+{
+   // unfortunately we have to copy the format string in order to pass in onward:
+   std::vector<UChar32> f;
+#ifndef BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS
+   f.assign(fmt.first, fmt.second);
+#else
+   f.clear();
+   I2 pos = fmt.first;
+   while(pos != fmt.second)
+      f.push_back(*pos++);
+#endif
+   
+   regex_iterator<I1, UChar32, icu_regex_traits> i(in.first, in.second, e, flags);
+   regex_iterator<I1, UChar32, icu_regex_traits> j;
+   if(i == j)
+   {
+      if(!(flags & regex_constants::format_no_copy))
+         out = re_detail::copy(in.first, in.second, out);
+   }
+   else
+   {
+      I1 last_m = in.first;
+      while(i != j)
+      {
+         if(!(flags & regex_constants::format_no_copy))
+            out = re_detail::copy(i->prefix().first, i->prefix().second, out); 
+         if(f.size())
+            out = ::boost::re_detail::regex_format_imp(out, *i, &*f.begin(), &*f.begin() + f.size(), flags, e.get_traits());
+         else
+            out = ::boost::re_detail::regex_format_imp(out, *i, static_cast<UChar32 const*>(0), static_cast<UChar32 const*>(0), flags, e.get_traits());
+         last_m = (*i)[0].second;
+         if(flags & regex_constants::format_first_only)
+            break;
+         ++i;
+      }
+      if(!(flags & regex_constants::format_no_copy))
+         out = re_detail::copy(last_m, in.second, out);
+   }
+   return out;
+}
+template <class BaseIterator>
+inline const BaseIterator& extract_output_base(const BaseIterator& b)
+{
+   return b;
+}
+template <class BaseIterator>
+inline BaseIterator extract_output_base(const utf8_output_iterator<BaseIterator>& b)
+{
+   return b.base();
+}
+template <class BaseIterator>
+inline BaseIterator extract_output_base(const utf16_output_iterator<BaseIterator>& b)
+{
+   return b.base();
+}
+}  // re_detail
+
+template <class OutputIterator, class BidirectionalIterator, class charT>
+inline OutputIterator u32regex_replace(OutputIterator out,
+                         BidirectionalIterator first,
+                         BidirectionalIterator last,
+                         const u32regex& e, 
+                         const charT* fmt, 
+                         match_flag_type flags = match_default)
+{
+   return re_detail::extract_output_base
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+   <OutputIterator>
+#endif
+    (
+      re_detail::do_regex_replace(
+         re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         e,
+         re_detail::make_utf32_seq(fmt, static_cast<mpl::int_<sizeof(*fmt)> const*>(0)),
+         flags)
+      );
+}
+
+template <class OutputIterator, class Iterator, class charT>
+inline OutputIterator u32regex_replace(OutputIterator out,
+                         Iterator first,
+                         Iterator last,
+                         const u32regex& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   return re_detail::extract_output_base
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+   <OutputIterator>
+#endif
+    (
+      re_detail::do_regex_replace(
+         re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         e,
+         re_detail::make_utf32_seq(fmt.begin(), fmt.end(), static_cast<mpl::int_<sizeof(charT)> const*>(0)),
+         flags)
+      );
+}
+
+template <class OutputIterator, class Iterator>
+inline OutputIterator u32regex_replace(OutputIterator out,
+                         Iterator first,
+                         Iterator last,
+                         const u32regex& e, 
+                         const UnicodeString& fmt,
+                         match_flag_type flags = match_default)
+{
+   return re_detail::extract_output_base
+#if BOOST_WORKAROUND(BOOST_MSVC, <= 1300)
+   <OutputIterator>
+#endif
+   (
+      re_detail::do_regex_replace(
+         re_detail::make_utf32_out(out, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         re_detail::make_utf32_seq(first, last, static_cast<mpl::int_<sizeof(*first)> const*>(0)),
+         e,
+         re_detail::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
+         flags)
+      );
+}
+
+template <class charT>
+std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
+                         const u32regex& e, 
+                         const charT* fmt,
+                         match_flag_type flags = match_default)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   u32regex_replace(i, s.begin(), s.end(), e, fmt, flags);
+   return result;
+}
+
+template <class charT>
+std::basic_string<charT> u32regex_replace(const std::basic_string<charT>& s,
+                         const u32regex& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   u32regex_replace(i, s.begin(), s.end(), e, fmt.c_str(), flags);
+   return result;
+}
+
+namespace re_detail{
+
+class unicode_string_out_iterator
+{
+   UnicodeString* out;
+public:
+   unicode_string_out_iterator(UnicodeString& s) : out(&s) {}
+   unicode_string_out_iterator& operator++() { return *this; }
+   unicode_string_out_iterator& operator++(int) { return *this; }
+   unicode_string_out_iterator& operator*() { return *this; }
+   unicode_string_out_iterator& operator=(UChar v) 
+   { 
+      *out += v; 
+      return *this; 
+   }
+   typedef std::ptrdiff_t difference_type;
+   typedef UChar value_type;
+   typedef value_type* pointer;
+   typedef value_type& reference;
+   typedef std::output_iterator_tag iterator_category;
+};
+
+}
+
+inline UnicodeString u32regex_replace(const UnicodeString& s,
+                         const u32regex& e, 
+                         const UChar* fmt,
+                         match_flag_type flags = match_default)
+{
+   UnicodeString result;
+   re_detail::unicode_string_out_iterator i(result);
+   u32regex_replace(i, s.getBuffer(), s.getBuffer()+s.length(), e, fmt, flags);
+   return result;
+}
+
+inline UnicodeString u32regex_replace(const UnicodeString& s,
+                         const u32regex& e, 
+                         const UnicodeString& fmt,
+                         match_flag_type flags = match_default)
+{
+   UnicodeString result;
+   re_detail::unicode_string_out_iterator i(result);
+   re_detail::do_regex_replace(
+         re_detail::make_utf32_out(i, static_cast<mpl::int_<2> const*>(0)),
+         re_detail::make_utf32_seq(s.getBuffer(), s.getBuffer()+s.length(), static_cast<mpl::int_<2> const*>(0)),
+         e,
+         re_detail::make_utf32_seq(fmt.getBuffer(), fmt.getBuffer() + fmt.length(), static_cast<mpl::int_<2> const*>(0)),
+         flags);
+   return result;
+}
+
+} // namespace boost.
+
+#include <boost/regex/v4/u32regex_iterator.hpp>
+#include <boost/regex/v4/u32regex_token_iterator.hpp>
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/mfc.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,190 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         mfc.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Overloads and helpers for using MFC/ATL string types with Boost.Regex.
+  */
+
+#ifndef BOOST_REGEX_MFC_HPP
+#define BOOST_REGEX_MFC_HPP
+
+#include <atlsimpstr.h>
+#include <boost/regex.hpp>
+
+namespace boost{
+
+//
+// define the types used for TCHAR's:
+typedef basic_regex<TCHAR> tregex;
+typedef match_results<TCHAR const*> tmatch;
+typedef regex_iterator<TCHAR const*> tregex_iterator;
+typedef regex_token_iterator<TCHAR const*> tregex_token_iterator;
+
+#if _MSC_VER >= 1310
+#define SIMPLE_STRING_PARAM class B, bool b
+#define SIMPLE_STRING_ARG_LIST B, b
+#else
+#define SIMPLE_STRING_PARAM class B
+#define SIMPLE_STRING_ARG_LIST B
+#endif
+
+//
+// define regex creation functions:
+//
+template <SIMPLE_STRING_PARAM>
+inline basic_regex<B> 
+make_regex(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, ::boost::regex_constants::syntax_option_type f = boost::regex_constants::normal)
+{
+   basic_regex<B> result(s.GetString(), s.GetString() + s.GetLength(), f);
+   return result;
+}
+//
+// regex_match overloads:
+//
+template <SIMPLE_STRING_PARAM, class A, class T>
+inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
+                 match_results<const B*, A>& what,
+                 const basic_regex<B, T>& e,
+                 boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   return ::boost::regex_match(s.GetString(),
+                               s.GetString() + s.GetLength(),
+                               what,
+                               e,
+                               f);
+}
+
+template <SIMPLE_STRING_PARAM, class T>
+inline bool regex_match(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
+                 const basic_regex<B, T>& e,
+                 boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   return ::boost::regex_match(s.GetString(),
+                               s.GetString() + s.GetLength(),
+                               e,
+                               f);
+}
+//
+// regex_search overloads:
+//
+template <SIMPLE_STRING_PARAM, class A, class T>
+inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
+                 match_results<const B*, A>& what,
+                 const basic_regex<B, T>& e,
+                 boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   return ::boost::regex_search(s.GetString(),
+                               s.GetString() + s.GetLength(),
+                               what,
+                               e,
+                               f);
+}
+
+template <SIMPLE_STRING_PARAM, class T>
+inline bool regex_search(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
+                 const basic_regex<B, T>& e,
+                 boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   return ::boost::regex_search(s.GetString(),
+                               s.GetString() + s.GetLength(),
+                               e,
+                               f);
+}
+//
+// regex_iterator creation:
+//
+template <SIMPLE_STRING_PARAM>
+inline regex_iterator<B const*> 
+make_regex_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   regex_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, f);
+   return result;
+}
+
+template <SIMPLE_STRING_PARAM>
+inline regex_token_iterator<B const*> 
+   make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, int sub = 0, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, sub, f);
+   return result;
+}
+
+template <SIMPLE_STRING_PARAM>
+inline regex_token_iterator<B const*> 
+make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, const std::vector<int>& subs, ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f);
+   return result;
+}
+
+template <SIMPLE_STRING_PARAM, std::size_t N>
+inline regex_token_iterator<B const*> 
+make_regex_token_iterator(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s, const basic_regex<B>& e, const int (& subs)[N], ::boost::regex_constants::match_flag_type f = boost::regex_constants::match_default)
+{
+   regex_token_iterator<B const*> result(s.GetString(), s.GetString() + s.GetLength(), e, subs, f);
+   return result;
+}
+
+template <class OutputIterator, class BidirectionalIterator, class traits,
+          SIMPLE_STRING_PARAM>
+OutputIterator regex_replace(OutputIterator out,
+                           BidirectionalIterator first,
+                           BidirectionalIterator last,
+                           const basic_regex<B, traits>& e,
+                           const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt,
+                           match_flag_type flags = match_default)
+{
+   return ::boost::regex_replace(out, first, last, e, fmt.GetString(), flags);
+}
+
+namespace re_detail{
+
+template <SIMPLE_STRING_PARAM>
+class mfc_string_out_iterator
+{
+   ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>* out;
+public:
+   mfc_string_out_iterator(ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s) : out(&s) {}
+   mfc_string_out_iterator& operator++() { return *this; }
+   mfc_string_out_iterator& operator++(int) { return *this; }
+   mfc_string_out_iterator& operator*() { return *this; }
+   mfc_string_out_iterator& operator=(B v) 
+   { 
+      out->AppendChar(v); 
+      return *this; 
+   }
+   typedef std::ptrdiff_t difference_type;
+   typedef B value_type;
+   typedef value_type* pointer;
+   typedef value_type& reference;
+   typedef std::output_iterator_tag iterator_category;
+};
+
+}
+
+template <class traits, SIMPLE_STRING_PARAM>
+ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> regex_replace(const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& s,
+                            const basic_regex<B, traits>& e,
+                            const ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST>& fmt,
+                            match_flag_type flags = match_default)
+{
+   ATL::CSimpleStringT<SIMPLE_STRING_ARG_LIST> result(s.GetManager());
+   re_detail::mfc_string_out_iterator<SIMPLE_STRING_ARG_LIST> i(result);
+   regex_replace(i, s.GetString(), s.GetString() + s.GetLength(), e, fmt.GetString(), flags);
+   return result;
+}
+
+} // namespace boost.
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/pattern_except.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,100 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         pattern_except.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares pattern-matching exception classes.
+  */
+
+#ifndef BOOST_RE_PAT_EXCEPT_HPP
+#define BOOST_RE_PAT_EXCEPT_HPP
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+
+#include <stdexcept>
+#include <cstddef>
+#include <boost/regex/v4/error_type.hpp>
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4275)
+#endif
+class BOOST_REGEX_DECL regex_error : public std::runtime_error
+{
+public:
+   explicit regex_error(const std::string& s, regex_constants::error_type err = regex_constants::error_unknown, std::ptrdiff_t pos = 0);
+   explicit regex_error(regex_constants::error_type err);
+   ~regex_error() throw();
+   regex_constants::error_type code()const
+   { return m_error_code; }
+   std::ptrdiff_t position()const
+   { return m_position; }
+   void raise()const;
+private:
+   regex_constants::error_type m_error_code;
+   std::ptrdiff_t m_position;
+};
+
+typedef regex_error bad_pattern;
+typedef regex_error bad_expression;
+
+namespace re_detail{
+
+BOOST_REGEX_DECL void BOOST_REGEX_CALL raise_runtime_error(const std::runtime_error& ex);
+
+template <class traits>
+void raise_error(const traits& t, regex_constants::error_type code)
+{
+   (void)t;  // warning suppression
+   std::runtime_error e(t.error_string(code));
+   ::boost::re_detail::raise_runtime_error(e);
+}
+
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/pending/object_cache.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,163 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         object_cache.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Implements a generic object cache.
+  */
+
+#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
+#define BOOST_REGEX_OBJECT_CACHE_HPP
+
+#include <map>
+#include <list>
+#include <stdexcept>
+#include <string>
+#include <boost/config.hpp>
+#include <boost/shared_ptr.hpp>
+#ifdef BOOST_HAS_THREADS
+#include <boost/regex/pending/static_mutex.hpp>
+#endif
+
+namespace boost{
+
+template <class Key, class Object>
+class object_cache
+{
+public:
+   typedef std::pair< ::boost::shared_ptr<Object const>, Key const*> value_type;
+   typedef std::list<value_type> list_type;
+   typedef typename list_type::iterator list_iterator;
+   typedef std::map<Key, list_iterator> map_type;
+   typedef typename map_type::iterator map_iterator;
+   typedef typename list_type::size_type size_type;
+   static boost::shared_ptr<Object const> get(const Key& k, size_type max_cache_size);
+
+private:
+   static boost::shared_ptr<Object const> do_get(const Key& k, size_type max_cache_size);
+
+   struct data
+   {
+      list_type   cont;
+      map_type    index;
+   };
+
+   // Needed by compilers not implementing the resolution to DR45. For reference,
+   // see http://www.open-std.org/JTC1/SC22/WG21/docs/cwg_defects.html#45.
+   friend struct data;
+};
+
+template <class Key, class Object>
+boost::shared_ptr<Object const> object_cache<Key, Object>::get(const Key& k, size_type max_cache_size)
+{
+#ifdef BOOST_HAS_THREADS
+   static boost::static_mutex mut = BOOST_STATIC_MUTEX_INIT;
+
+   boost::static_mutex::scoped_lock l(mut);
+   if(l)
+   {
+      return do_get(k, max_cache_size);
+   }
+   //
+   // what do we do if the lock fails?
+   // for now just throw, but we should never really get here...
+   //
+   ::boost::throw_exception(std::runtime_error("Error in thread safety code: could not acquire a lock"));
+   return boost::shared_ptr<Object>();
+#else
+   return do_get(k, max_cache_size);
+#endif
+}
+
+template <class Key, class Object>
+boost::shared_ptr<Object const> object_cache<Key, Object>::do_get(const Key& k, size_type max_cache_size)
+{
+   typedef typename object_cache<Key, Object>::data object_data;
+   typedef typename map_type::size_type map_size_type;
+   static object_data s_data;
+
+   //
+   // see if the object is already in the cache:
+   //
+   map_iterator mpos = s_data.index.find(k);
+   if(mpos != s_data.index.end())
+   {
+      //
+      // Eureka! 
+      // We have a cached item, bump it up the list and return it:
+      //
+      if(--(s_data.cont.end()) != mpos->second)
+      {
+         // splice out the item we want to move:
+         list_type temp;
+         temp.splice(temp.end(), s_data.cont, mpos->second);
+         // and now place it at the end of the list:
+         s_data.cont.splice(s_data.cont.end(), temp, temp.begin());
+         BOOST_ASSERT(*(s_data.cont.back().second) == k);
+         // update index with new position:
+         mpos->second = --(s_data.cont.end());
+         BOOST_ASSERT(&(mpos->first) == mpos->second->second);
+         BOOST_ASSERT(&(mpos->first) == s_data.cont.back().second);
+      }
+      return s_data.cont.back().first;
+   }
+   //
+   // if we get here then the item is not in the cache,
+   // so create it:
+   //
+   boost::shared_ptr<Object const> result(new Object(k));
+   //
+   // Add it to the list, and index it:
+   //
+   s_data.cont.push_back(value_type(result, static_cast<Key const*>(0)));
+   s_data.index.insert(std::make_pair(k, --(s_data.cont.end())));
+   s_data.cont.back().second = &(s_data.index.find(k)->first);
+   map_size_type s = s_data.index.size();
+   BOOST_ASSERT(s_data.index[k]->first.get() == result.get());
+   BOOST_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
+   BOOST_ASSERT(s_data.index.find(k)->first == k);
+   if(s > max_cache_size)
+   {
+      //
+      // We have too many items in the list, so we need to start
+      // popping them off the back of the list, but only if they're
+      // being held uniquely by us:
+      //
+      list_iterator pos = s_data.cont.begin();
+      list_iterator last = s_data.cont.end();
+      while((pos != last) && (s > max_cache_size))
+      {
+         if(pos->first.unique())
+         {
+            list_iterator condemmed(pos);
+            ++pos;
+            // now remove the items from our containers, 
+            // then order has to be as follows:
+            BOOST_ASSERT(s_data.index.find(*(condemmed->second)) != s_data.index.end());
+            s_data.index.erase(*(condemmed->second));
+            s_data.cont.erase(condemmed); 
+            --s;
+         }
+         else
+            --pos;
+      }
+      BOOST_ASSERT(s_data.index[k]->first.get() == result.get());
+      BOOST_ASSERT(&(s_data.index.find(k)->first) == s_data.cont.back().second);
+      BOOST_ASSERT(s_data.index.find(k)->first == k);
+   }
+   return result;
+}
+
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/pending/static_mutex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,184 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         static_mutex.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares static_mutex lock type, there are three different
+  *                implementations: POSIX pthreads, WIN32 threads, and portable,
+  *                these are described in more detail below.
+  */
+
+#ifndef BOOST_REGEX_STATIC_MUTEX_HPP
+#define BOOST_REGEX_STATIC_MUTEX_HPP
+
+#include <boost/config.hpp>
+#include <boost/regex/config.hpp> // dll import/export options.
+
+#ifdef BOOST_HAS_PTHREADS
+#include <pthread.h>
+#endif
+
+#if defined(BOOST_HAS_PTHREADS) && defined(PTHREAD_MUTEX_INITIALIZER)
+//
+// pthreads version:
+// simple wrap around a pthread_mutex_t initialized with
+// PTHREAD_MUTEX_INITIALIZER.
+//
+namespace boost{
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock;
+
+class static_mutex
+{
+public:
+   typedef scoped_static_mutex_lock scoped_lock;
+   pthread_mutex_t m_mutex;
+};
+
+#define BOOST_STATIC_MUTEX_INIT { PTHREAD_MUTEX_INITIALIZER, }
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock
+{
+public:
+   scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
+   ~scoped_static_mutex_lock();
+   inline bool locked()const
+   {
+      return m_have_lock;
+   }
+   inline operator void const*()const
+   {
+      return locked() ? this : 0;
+   }
+   void lock();
+   void unlock();
+private:
+   static_mutex& m_mutex;
+   bool m_have_lock;
+};
+
+
+} // namespace boost
+#elif defined(BOOST_HAS_WINTHREADS)
+//
+// Win32 version:
+// Use a 32-bit int as a lock, along with a test-and-set
+// implementation using InterlockedCompareExchange.
+//
+
+#include <boost/cstdint.hpp>
+
+namespace boost{
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock;
+
+class static_mutex
+{
+public:
+   typedef scoped_static_mutex_lock scoped_lock;
+   boost::int32_t m_mutex;
+};
+
+#define BOOST_STATIC_MUTEX_INIT { 0, }
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock
+{
+public:
+   scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
+   ~scoped_static_mutex_lock();
+   operator void const*()const;
+   bool locked()const;
+   void lock();
+   void unlock();
+private:
+   static_mutex& m_mutex;
+   bool m_have_lock;
+   scoped_static_mutex_lock(const scoped_static_mutex_lock&);
+   scoped_static_mutex_lock& operator=(const scoped_static_mutex_lock&);
+};
+
+inline scoped_static_mutex_lock::operator void const*()const
+{
+   return locked() ? this : 0;
+}
+
+inline bool scoped_static_mutex_lock::locked()const
+{
+   return m_have_lock;
+}
+
+} // namespace
+
+#else
+//
+// Portable version of a static mutex based on Boost.Thread library:
+// This has to use a single mutex shared by all instances of static_mutex
+// because boost::call_once doesn't alow us to pass instance information
+// down to the initialisation proceedure.  In fact the initialisation routine
+// may need to be called more than once - but only once per instance.
+//
+// Since this preprocessor path is almost never taken, we hide these header
+// dependencies so that build tools don't find them.
+//
+#define B1 <boost/thread/once.hpp>
+#define B2 <boost/thread/recursive_mutex.hpp>
+#include B1
+#include B2
+#undef B1
+#undef B2
+
+namespace boost{
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock;
+extern "C" BOOST_REGEX_DECL void free_static_mutex();
+
+class BOOST_REGEX_DECL static_mutex
+{
+public:
+   typedef scoped_static_mutex_lock scoped_lock;
+   static void init();
+   static boost::recursive_mutex* m_pmutex;
+   static boost::once_flag m_once;
+};
+
+#define BOOST_STATIC_MUTEX_INIT {  }
+
+class BOOST_REGEX_DECL scoped_static_mutex_lock
+{
+public:
+   scoped_static_mutex_lock(static_mutex& mut, bool lk = true);
+   ~scoped_static_mutex_lock();
+   operator void const*()const;
+   bool locked()const;
+   void lock();
+   void unlock();
+private:
+   boost::recursive_mutex::scoped_lock* m_plock;
+   bool m_have_lock;
+};
+
+inline scoped_static_mutex_lock::operator void const*()const
+{
+   return locked() ? this : 0;
+}
+
+inline bool scoped_static_mutex_lock::locked()const
+{
+   return m_have_lock;
+}
+
+} // namespace
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/pending/unicode_iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,692 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         unicode_iterator.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Iterator adapters for converting between different Unicode encodings.
+  */
+
+/****************************************************************************
+
+Contents:
+~~~~~~~~~
+
+1) Read Only, Input Adapters:
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+template <class BaseIterator, class U8Type = ::boost::uint8_t>
+class u32_to_u8_iterator;
+
+Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-8.
+
+template <class BaseIterator, class U32Type = ::boost::uint32_t>
+class u8_to_u32_iterator;
+
+Adapts sequence of UTF-8 code points to "look like" a sequence of UTF-32.
+
+template <class BaseIterator, class U16Type = ::boost::uint16_t>
+class u32_to_u16_iterator;
+
+Adapts sequence of UTF-32 code points to "look like" a sequence of UTF-16.
+
+template <class BaseIterator, class U32Type = ::boost::uint32_t>
+class u16_to_u32_iterator;
+
+Adapts sequence of UTF-16 code points to "look like" a sequence of UTF-32.
+
+2) Single pass output iterator adapters:
+
+template <class BaseIterator>
+class utf8_output_iterator;
+
+Accepts UTF-32 code points and forwards them on as UTF-8 code points.
+
+template <class BaseIterator>
+class utf16_output_iterator;
+
+Accepts UTF-32 code points and forwards them on as UTF-16 code points.
+
+****************************************************************************/
+
+#ifndef BOOST_REGEX_UNICODE_ITERATOR_HPP
+#define BOOST_REGEX_UNICODE_ITERATOR_HPP
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+#include <boost/iterator/iterator_facade.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/throw_exception.hpp>
+#include <stdexcept>
+#ifndef BOOST_NO_STD_LOCALE
+#include <sstream>
+#include <ios>
+#endif
+#include <limits.h> // CHAR_BIT
+
+namespace boost{
+
+namespace detail{
+
+static const ::boost::uint16_t high_surrogate_base = 0xD7C0u;
+static const ::boost::uint16_t low_surrogate_base = 0xDC00u;
+static const ::boost::uint32_t ten_bit_mask = 0x3FFu;
+
+inline bool is_high_surrogate(::boost::uint16_t v)
+{
+   return (v & 0xFC00u) == 0xd800u;
+}
+inline bool is_low_surrogate(::boost::uint16_t v)
+{
+   return (v & 0xFC00u) == 0xdc00u;
+}
+template <class T>
+inline bool is_surrogate(T v)
+{
+   return (v & 0xF800u) == 0xd800;
+}
+
+inline unsigned utf8_byte_count(boost::uint8_t c)
+{
+   // if the most significant bit with a zero in it is in position
+   // 8-N then there are N bytes in this UTF-8 sequence:
+   boost::uint8_t mask = 0x80u;
+   unsigned result = 0;
+   while(c & mask)
+   {
+      ++result;
+      mask >>= 1;
+   }
+   return (result == 0) ? 1 : ((result > 4) ? 4 : result);
+}
+
+inline unsigned utf8_trailing_byte_count(boost::uint8_t c)
+{
+   return utf8_byte_count(c) - 1;
+}
+
+inline void invalid_utf32_code_point(::boost::uint32_t val)
+{
+#ifndef BOOST_NO_STD_LOCALE
+   std::stringstream ss;
+   ss << "Invalid UTF-32 code point U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-16 sequence";
+   std::out_of_range e(ss.str());
+#else
+   std::out_of_range e("Invalid UTF-32 code point encountered while trying to encode UTF-16 sequence");
+#endif
+   boost::throw_exception(e);
+}
+
+
+} // namespace detail
+
+template <class BaseIterator, class U16Type = ::boost::uint16_t>
+class u32_to_u16_iterator
+   : public boost::iterator_facade<u32_to_u16_iterator<BaseIterator, U16Type>, U16Type, std::bidirectional_iterator_tag, const U16Type>
+{
+   typedef boost::iterator_facade<u32_to_u16_iterator<BaseIterator, U16Type>, U16Type, std::bidirectional_iterator_tag, const U16Type> base_type;
+
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
+
+   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
+   BOOST_STATIC_ASSERT(sizeof(U16Type)*CHAR_BIT == 16);
+#endif
+
+public:
+   typename base_type::reference
+      dereference()const
+   {
+      if(m_current == 2)
+         extract_current();
+      return m_values[m_current];
+   }
+   bool equal(const u32_to_u16_iterator& that)const
+   {
+      if(m_position == that.m_position)
+      {
+         // Both m_currents must be equal, or both even
+         // this is the same as saying their sum must be even:
+         return (m_current + that.m_current) & 1u ? false : true;
+      }
+      return false;
+   }
+   void increment()
+   {
+      // if we have a pending read then read now, so that we know whether
+      // to skip a position, or move to a low-surrogate:
+      if(m_current == 2)
+      {
+         // pending read:
+         extract_current();
+      }
+      // move to the next surrogate position:
+      ++m_current;
+      // if we've reached the end skip a position:
+      if(m_values[m_current] == 0)
+      {
+         m_current = 2;
+         ++m_position;
+      }
+   }
+   void decrement()
+   {
+      if(m_current != 1)
+      {
+         // decrementing an iterator always leads to a valid position:
+         --m_position;
+         extract_current();
+         m_current = m_values[1] ? 1 : 0;
+      }
+      else
+      {
+         m_current = 0;
+      }
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+   // construct:
+   u32_to_u16_iterator() : m_position(), m_current(0)
+   {
+      m_values[0] = 0;
+      m_values[1] = 0;
+      m_values[2] = 0;
+   }
+   u32_to_u16_iterator(BaseIterator b) : m_position(b), m_current(2)
+   {
+      m_values[0] = 0;
+      m_values[1] = 0;
+      m_values[2] = 0;
+   }
+private:
+
+   void extract_current()const
+   {
+      // begin by checking for a code point out of range:
+      ::boost::uint32_t v = *m_position;
+      if(v >= 0x10000u)
+      {
+         if(v > 0x10FFFFu)
+            detail::invalid_utf32_code_point(*m_position);
+         // split into two surrogates:
+         m_values[0] = static_cast<U16Type>(v >> 10) + detail::high_surrogate_base;
+         m_values[1] = static_cast<U16Type>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
+         m_current = 0;
+         BOOST_ASSERT(detail::is_high_surrogate(m_values[0]));
+         BOOST_ASSERT(detail::is_low_surrogate(m_values[1]));
+      }
+      else
+      {
+         // 16-bit code point:
+         m_values[0] = static_cast<U16Type>(*m_position);
+         m_values[1] = 0;
+         m_current = 0;
+         // value must not be a surrogate:
+         if(detail::is_surrogate(m_values[0]))
+            detail::invalid_utf32_code_point(*m_position);
+      }
+   }
+   BaseIterator m_position;
+   mutable U16Type m_values[3];
+   mutable unsigned m_current;
+};
+
+template <class BaseIterator, class U32Type = ::boost::uint32_t>
+class u16_to_u32_iterator
+   : public boost::iterator_facade<u16_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type>
+{
+   typedef boost::iterator_facade<u16_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type> base_type;
+   // special values for pending iterator reads:
+   BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
+
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
+
+   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 16);
+   BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
+#endif
+
+public:
+   typename base_type::reference
+      dereference()const
+   {
+      if(m_value == pending_read)
+         extract_current();
+      return m_value;
+   }
+   bool equal(const u16_to_u32_iterator& that)const
+   {
+      return m_position == that.m_position;
+   }
+   void increment()
+   {
+      // skip high surrogate first if there is one:
+      if(detail::is_high_surrogate(*m_position)) ++m_position;
+      ++m_position;
+      m_value = pending_read;
+   }
+   void decrement()
+   {
+      --m_position;
+      // if we have a low surrogate then go back one more:
+      if(detail::is_low_surrogate(*m_position)) 
+         --m_position;
+      m_value = pending_read;
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+   // construct:
+   u16_to_u32_iterator() : m_position()
+   {
+      m_value = pending_read;
+   }
+   u16_to_u32_iterator(BaseIterator b) : m_position(b)
+   {
+      m_value = pending_read;
+   }
+private:
+   static void invalid_code_point(::boost::uint16_t val)
+   {
+#ifndef BOOST_NO_STD_LOCALE
+      std::stringstream ss;
+      ss << "Misplaced UTF-16 surrogate U+" << std::showbase << std::hex << val << " encountered while trying to encode UTF-32 sequence";
+      std::out_of_range e(ss.str());
+#else
+      std::out_of_range e("Misplaced UTF-16 surrogate encountered while trying to encode UTF-32 sequence");
+#endif
+      boost::throw_exception(e);
+   }
+   void extract_current()const
+   {
+      m_value = static_cast<U32Type>(static_cast< ::boost::uint16_t>(*m_position));
+      // if the last value is a high surrogate then adjust m_position and m_value as needed:
+      if(detail::is_high_surrogate(*m_position))
+      {
+         // precondition; next value must have be a low-surrogate:
+         BaseIterator next(m_position);
+         ::boost::uint16_t t = *++next;
+         if((t & 0xFC00u) != 0xDC00u)
+            invalid_code_point(t);
+         m_value = (m_value - detail::high_surrogate_base) << 10;
+         m_value |= (static_cast<U32Type>(static_cast< ::boost::uint16_t>(t)) & detail::ten_bit_mask);
+      }
+      // postcondition; result must not be a surrogate:
+      if(detail::is_surrogate(m_value))
+         invalid_code_point(static_cast< ::boost::uint16_t>(m_value));
+   }
+   BaseIterator m_position;
+   mutable U32Type m_value;
+};
+
+template <class BaseIterator, class U8Type = ::boost::uint8_t>
+class u32_to_u8_iterator
+   : public boost::iterator_facade<u32_to_u8_iterator<BaseIterator, U8Type>, U8Type, std::bidirectional_iterator_tag, const U8Type>
+{
+   typedef boost::iterator_facade<u32_to_u8_iterator<BaseIterator, U8Type>, U8Type, std::bidirectional_iterator_tag, const U8Type> base_type;
+   
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
+
+   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 32);
+   BOOST_STATIC_ASSERT(sizeof(U8Type)*CHAR_BIT == 8);
+#endif
+
+public:
+   typename base_type::reference
+      dereference()const
+   {
+      if(m_current == 4)
+         extract_current();
+      return m_values[m_current];
+   }
+   bool equal(const u32_to_u8_iterator& that)const
+   {
+      if(m_position == that.m_position)
+      {
+         // either the m_current's must be equal, or one must be 0 and 
+         // the other 4: which means neither must have bits 1 or 2 set:
+         return (m_current == that.m_current)
+            || (((m_current | that.m_current) & 3) == 0);
+      }
+      return false;
+   }
+   void increment()
+   {
+      // if we have a pending read then read now, so that we know whether
+      // to skip a position, or move to a low-surrogate:
+      if(m_current == 4)
+      {
+         // pending read:
+         extract_current();
+      }
+      // move to the next surrogate position:
+      ++m_current;
+      // if we've reached the end skip a position:
+      if(m_values[m_current] == 0)
+      {
+         m_current = 4;
+         ++m_position;
+      }
+   }
+   void decrement()
+   {
+      if((m_current & 3) == 0)
+      {
+         --m_position;
+         extract_current();
+         m_current = 3;
+         while(m_current && (m_values[m_current] == 0))
+            --m_current;
+      }
+      else
+         --m_current;
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+   // construct:
+   u32_to_u8_iterator() : m_position(), m_current(0)
+   {
+      m_values[0] = 0;
+      m_values[1] = 0;
+      m_values[2] = 0;
+      m_values[3] = 0;
+      m_values[4] = 0;
+   }
+   u32_to_u8_iterator(BaseIterator b) : m_position(b), m_current(4)
+   {
+      m_values[0] = 0;
+      m_values[1] = 0;
+      m_values[2] = 0;
+      m_values[3] = 0;
+      m_values[4] = 0;
+   }
+private:
+
+   void extract_current()const
+   {
+      boost::uint32_t c = *m_position;
+      if(c > 0x10FFFFu)
+         detail::invalid_utf32_code_point(c);
+      if(c < 0x80u)
+      {
+         m_values[0] = static_cast<unsigned char>(c);
+         m_values[1] = static_cast<unsigned char>(0u);
+         m_values[2] = static_cast<unsigned char>(0u);
+         m_values[3] = static_cast<unsigned char>(0u);
+      }
+      else if(c < 0x800u)
+      {
+         m_values[0] = static_cast<unsigned char>(0xC0u + (c >> 6));
+         m_values[1] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+         m_values[2] = static_cast<unsigned char>(0u);
+         m_values[3] = static_cast<unsigned char>(0u);
+      }
+      else if(c < 0x10000u)
+      {
+         m_values[0] = static_cast<unsigned char>(0xE0u + (c >> 12));
+         m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
+         m_values[2] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+         m_values[3] = static_cast<unsigned char>(0u);
+      }
+      else
+      {
+         m_values[0] = static_cast<unsigned char>(0xF0u + (c >> 18));
+         m_values[1] = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
+         m_values[2] = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
+         m_values[3] = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+      }
+      m_current= 0;
+   }
+   BaseIterator m_position;
+   mutable U8Type m_values[5];
+   mutable unsigned m_current;
+};
+
+template <class BaseIterator, class U32Type = ::boost::uint32_t>
+class u8_to_u32_iterator
+   : public boost::iterator_facade<u8_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type>
+{
+   typedef boost::iterator_facade<u8_to_u32_iterator<BaseIterator, U32Type>, U32Type, std::bidirectional_iterator_tag, const U32Type> base_type;
+   // special values for pending iterator reads:
+   BOOST_STATIC_CONSTANT(U32Type, pending_read = 0xffffffffu);
+
+#if !defined(BOOST_NO_STD_ITERATOR_TRAITS) && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   typedef typename std::iterator_traits<BaseIterator>::value_type base_value_type;
+
+   BOOST_STATIC_ASSERT(sizeof(base_value_type)*CHAR_BIT == 8);
+   BOOST_STATIC_ASSERT(sizeof(U32Type)*CHAR_BIT == 32);
+#endif
+
+public:
+   typename base_type::reference
+      dereference()const
+   {
+      if(m_value == pending_read)
+         extract_current();
+      return m_value;
+   }
+   bool equal(const u8_to_u32_iterator& that)const
+   {
+      return m_position == that.m_position;
+   }
+   void increment()
+   {
+      // skip high surrogate first if there is one:
+      unsigned c = detail::utf8_byte_count(*m_position);
+      std::advance(m_position, c);
+      m_value = pending_read;
+   }
+   void decrement()
+   {
+      // Keep backtracking until we don't have a trailing character:
+      unsigned count = 0;
+      while((*--m_position & 0xC0u) == 0x80u) ++count;
+      // now check that the sequence was valid:
+      if(count != detail::utf8_trailing_byte_count(*m_position))
+         invalid_sequnce();
+      m_value = pending_read;
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+   // construct:
+   u8_to_u32_iterator() : m_position()
+   {
+      m_value = pending_read;
+   }
+   u8_to_u32_iterator(BaseIterator b) : m_position(b)
+   {
+      m_value = pending_read;
+   }
+private:
+   static void invalid_sequnce()
+   {
+      std::out_of_range e("Invalid UTF-8 sequence encountered while trying to encode UTF-32 character");
+      boost::throw_exception(e);
+   }
+   void extract_current()const
+   {
+      m_value = static_cast<U32Type>(static_cast< ::boost::uint8_t>(*m_position));
+      // we must not have a continuation character:
+      if((m_value & 0xC0u) == 0x80u)
+         invalid_sequnce();
+      // see how many extra byts we have:
+      unsigned extra = detail::utf8_trailing_byte_count(*m_position);
+      // extract the extra bits, 6 from each extra byte:
+      BaseIterator next(m_position);
+      for(unsigned c = 0; c < extra; ++c)
+      {
+         ++next;
+         m_value <<= 6;
+         m_value += static_cast<boost::uint8_t>(*next) & 0x3Fu;
+      }
+      // we now need to remove a few of the leftmost bits, but how many depends
+      // upon how many extra bytes we've extracted:
+      static const boost::uint32_t masks[4] = 
+      {
+         0x7Fu,
+         0x7FFu,
+         0xFFFFu,
+         0x1FFFFFu,
+      };
+      m_value &= masks[extra];
+      // check the result:
+      if(m_value > static_cast<U32Type>(0x10FFFFu))
+         invalid_sequnce();
+   }
+   BaseIterator m_position;
+   mutable U32Type m_value;
+};
+
+template <class BaseIterator>
+class utf16_output_iterator
+{
+public:
+   typedef void                                   difference_type;
+   typedef void                                   value_type;
+   typedef boost::uint32_t*                       pointer;
+   typedef boost::uint32_t&                       reference;
+   typedef std::output_iterator_tag               iterator_category;
+
+   utf16_output_iterator(const BaseIterator& b)
+      : m_position(b){}
+   utf16_output_iterator(const utf16_output_iterator& that)
+      : m_position(that.m_position){}
+   utf16_output_iterator& operator=(const utf16_output_iterator& that)
+   {
+      m_position = that.m_position;
+      return *this;
+   }
+   const utf16_output_iterator& operator*()const
+   {
+      return *this;
+   }
+   void operator=(boost::uint32_t val)const
+   {
+      push(val);
+   }
+   utf16_output_iterator& operator++()
+   {
+      return *this;
+   }
+   utf16_output_iterator& operator++(int)
+   {
+      return *this;
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+private:
+   void push(boost::uint32_t v)const
+   {
+      if(v >= 0x10000u)
+      {
+         // begin by checking for a code point out of range:
+         if(v > 0x10FFFFu)
+            detail::invalid_utf32_code_point(v);
+         // split into two surrogates:
+         *m_position++ = static_cast<boost::uint16_t>(v >> 10) + detail::high_surrogate_base;
+         *m_position++ = static_cast<boost::uint16_t>(v & detail::ten_bit_mask) + detail::low_surrogate_base;
+      }
+      else
+      {
+         // 16-bit code point:
+         // value must not be a surrogate:
+         if(detail::is_surrogate(v))
+            detail::invalid_utf32_code_point(v);
+         *m_position++ = static_cast<boost::uint16_t>(v);
+      }
+   }
+   mutable BaseIterator m_position;
+};
+
+template <class BaseIterator>
+class utf8_output_iterator
+{
+public:
+   typedef void                                   difference_type;
+   typedef void                                   value_type;
+   typedef boost::uint32_t*                       pointer;
+   typedef boost::uint32_t&                       reference;
+   typedef std::output_iterator_tag               iterator_category;
+
+   utf8_output_iterator(const BaseIterator& b)
+      : m_position(b){}
+   utf8_output_iterator(const utf8_output_iterator& that)
+      : m_position(that.m_position){}
+   utf8_output_iterator& operator=(const utf8_output_iterator& that)
+   {
+      m_position = that.m_position;
+      return *this;
+   }
+   const utf8_output_iterator& operator*()const
+   {
+      return *this;
+   }
+   void operator=(boost::uint32_t val)const
+   {
+      push(val);
+   }
+   utf8_output_iterator& operator++()
+   {
+      return *this;
+   }
+   utf8_output_iterator& operator++(int)
+   {
+      return *this;
+   }
+   BaseIterator base()const
+   {
+      return m_position;
+   }
+private:
+   void push(boost::uint32_t c)const
+   {
+      if(c > 0x10FFFFu)
+         detail::invalid_utf32_code_point(c);
+      if(c < 0x80u)
+      {
+         *m_position++ = static_cast<unsigned char>(c);
+      }
+      else if(c < 0x800u)
+      {
+         *m_position++ = static_cast<unsigned char>(0xC0u + (c >> 6));
+         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+      }
+      else if(c < 0x10000u)
+      {
+         *m_position++ = static_cast<unsigned char>(0xE0u + (c >> 12));
+         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
+         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+      }
+      else
+      {
+         *m_position++ = static_cast<unsigned char>(0xF0u + (c >> 18));
+         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 12) & 0x3Fu));
+         *m_position++ = static_cast<unsigned char>(0x80u + ((c >> 6) & 0x3Fu));
+         *m_position++ = static_cast<unsigned char>(0x80u + (c & 0x3Fu));
+      }
+   }
+   mutable BaseIterator m_position;
+};
+
+} // namespace boost
+
+#endif // BOOST_REGEX_UNICODE_ITERATOR_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,35 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_traits.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression traits classes.
+  */
+
+#ifndef BOOST_REGEX_TRAITS_HPP
+#define BOOST_REGEX_TRAITS_HPP
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#  include <boost/regex/config.hpp>
+#endif
+
+#  ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED
+#     include <boost/regex/v4/regex_traits.hpp>
+#  endif
+
+#endif // include
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/user.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,90 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         user.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: User settable options.
+  */
+
+// define if you want the regex library to use the C locale
+// even on Win32:
+// #define BOOST_REGEX_USE_C_LOCALE
+
+// define this is you want the regex library to use the C++
+// locale:
+// #define BOOST_REGEX_USE_CPP_LOCALE
+
+// define this if the runtime library is a dll, and you
+// want BOOST_REGEX_DYN_LINK to set up dll exports/imports
+// with __declspec(dllexport)/__declspec(dllimport.)
+// #define BOOST_REGEX_HAS_DLL_RUNTIME
+
+// define this if you want to dynamically link to regex,
+// if the runtime library is also a dll (Probably Win32 specific,
+// and has no effect unless BOOST_REGEX_HAS_DLL_RUNTIME is set):
+// #define BOOST_REGEX_DYN_LINK
+
+// define this if you don't want the lib to automatically
+// select its link libraries:
+// #define BOOST_REGEX_NO_LIB
+
+// define this if templates with switch statements cause problems:
+// #define BOOST_REGEX_NO_TEMPLATE_SWITCH_MERGE
+ 
+// define this to disable Win32 support when available:
+// #define BOOST_REGEX_NO_W32
+
+// define this if bool is not a real type:
+// #define BOOST_REGEX_NO_BOOL
+
+// define this if no template instances are to be placed in
+// the library rather than users object files:
+// #define BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+
+// define this if the forward declarations in regex_fwd.hpp
+// cause more problems than they are worth:
+// #define BOOST_REGEX_NO_FWD
+
+// define this if your compiler supports MS Windows structured
+// exception handling.
+// #define BOOST_REGEX_HAS_MS_STACK_GUARD
+
+// define this if you want to use the recursive algorithm
+// even if BOOST_REGEX_HAS_MS_STACK_GUARD is not defined.
+// #define BOOST_REGEX_RECURSIVE
+
+// define this if you want to use the non-recursive
+// algorithm, even if the recursive version would be the default.
+// #define BOOST_REGEX_NON_RECURSIVE
+
+// define this if you want to set the size of the memory blocks
+// used by the non-recursive algorithm.
+// #define BOOST_REGEX_BLOCKSIZE 4096
+
+// define this if you want to set the maximum number of memory blocks
+// used by the non-recursive algorithm.
+// #define BOOST_REGEX_MAX_BLOCKS 1024
+
+// define this if you want to set the maximum number of memory blocks
+// cached by the non-recursive algorithm: Normally this is 16, but can be 
+// higher if you have multiple threads all using boost.regex, or lower 
+// if you don't want boost.regex to cache memory.
+// #define BOOST_REGEX_MAX_CACHE_BLOCKS 16
+
+// define this if you want to be able to access extended capture
+// information in your sub_match's (caution this will slow things
+// down quite a bit).
+// #define BOOST_REGEX_MATCH_EXTRA
+
+// define this if you want to enable support for Unicode via ICU.
+// #define BOOST_HAS_ICU
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/basic_regex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,669 @@
+/*
+ *
+ * Copyright (c) 1998-2004
+ * John Maddock
+ *
+ * Distributed under the Boost Software License, Version 1.0.
+ * (See accompanying file LICENSE_1_0.txt or copy at
+ * http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org/ for most recent version.
+  *   FILE         basic_regex.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class basic_regex.
+  */
+
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP
+#define BOOST_REGEX_V4_BASIC_REGEX_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4251 4231 4660 4800)
+#endif
+
+namespace re_detail{
+
+//
+// forward declaration, we will need this one later:
+//
+template <class charT, class traits>
+class basic_regex_parser;
+
+//
+// class regex_data:
+// represents the data we wish to expose to the matching algorithms.
+//
+template <class charT, class traits>
+struct regex_data
+{
+   typedef regex_constants::syntax_option_type   flag_type;
+   typedef std::size_t                           size_type;  
+
+   regex_data(const ::boost::shared_ptr<
+      ::boost::regex_traits_wrapper<traits> >& t) 
+      : m_ptraits(t), m_expression(0), m_expression_len(0) {}
+   regex_data() 
+      : m_ptraits(new ::boost::regex_traits_wrapper<traits>()), m_expression(0), m_expression_len(0) {}
+
+   ::boost::shared_ptr<
+      ::boost::regex_traits_wrapper<traits>
+      >                        m_ptraits;                 // traits class instance
+   flag_type                   m_flags;                   // flags with which we were compiled
+   int                         m_status;                  // error code (0 implies OK).
+   const charT*                m_expression;              // the original expression
+   std::ptrdiff_t              m_expression_len;          // the length of the original expression
+   size_type                   m_mark_count;              // the number of marked sub-expressions
+   re_detail::re_syntax_base*  m_first_state;             // the first state of the machine
+   unsigned                    m_restart_type;            // search optimisation type
+   unsigned char               m_startmap[1 << CHAR_BIT]; // which characters can start a match
+   unsigned int                m_can_be_null;             // whether we can match a null string
+   re_detail::raw_storage      m_data;                    // the buffer in which our states are constructed
+   typename traits::char_class_type    m_word_mask;       // mask used to determine if a character is a word character
+   std::vector<
+      std::pair<
+      std::size_t, std::size_t> > m_subs;                 // Position of sub-expressions within the *string*.
+};
+//
+// class basic_regex_implementation
+// pimpl implementation class for basic_regex.
+//
+template <class charT, class traits>
+class basic_regex_implementation
+   : public regex_data<charT, traits>
+{
+public:
+   typedef regex_constants::syntax_option_type   flag_type;
+   typedef std::ptrdiff_t                        difference_type;
+   typedef std::size_t                           size_type; 
+   typedef typename traits::locale_type          locale_type;
+   typedef const charT*                          const_iterator;
+
+   basic_regex_implementation(){}
+   basic_regex_implementation(const ::boost::shared_ptr<
+      ::boost::regex_traits_wrapper<traits> >& t)
+      : regex_data<charT, traits>(t) {}
+   void assign(const charT* arg_first,
+                          const charT* arg_last,
+                          flag_type f)
+   {
+      regex_data<charT, traits>* pdat = this;
+      basic_regex_parser<charT, traits> parser(pdat);
+      parser.parse(arg_first, arg_last, f);
+   }
+
+   locale_type BOOST_REGEX_CALL imbue(locale_type l)
+   { 
+      return this->m_ptraits->imbue(l); 
+   }
+   locale_type BOOST_REGEX_CALL getloc()const
+   { 
+      return this->m_ptraits->getloc(); 
+   }
+   std::basic_string<charT> BOOST_REGEX_CALL str()const
+   {
+      std::basic_string<charT> result;
+      if(this->m_status == 0)
+         result = std::basic_string<charT>(this->m_expression, this->m_expression_len);
+      return result;
+   }
+   const_iterator BOOST_REGEX_CALL expression()const
+   {
+      return this->m_expression;
+   }
+   std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
+   {
+      if(n == 0)
+         throw std::out_of_range("0 is not a valid subexpression index.");
+      const std::pair<std::size_t, std::size_t>& pi = this->m_subs.at(n - 1);
+      std::pair<const_iterator, const_iterator> p(expression() + pi.first, expression() + pi.second);
+      return p;
+   }
+   //
+   // begin, end:
+   const_iterator BOOST_REGEX_CALL begin()const
+   { 
+      return (!this->m_status ? 0 : this->m_expression); 
+   }
+   const_iterator BOOST_REGEX_CALL end()const
+   { 
+      return (!this->m_status ? 0 : this->m_expression + this->m_expression_len); 
+   }
+   flag_type BOOST_REGEX_CALL flags()const
+   {
+      return this->m_flags;
+   }
+   size_type BOOST_REGEX_CALL size()const
+   {
+      return this->m_expression_len;
+   }
+   int BOOST_REGEX_CALL status()const
+   {
+      return this->m_status;
+   }
+   size_type BOOST_REGEX_CALL mark_count()const
+   {
+      return this->m_mark_count;
+   }
+   const re_detail::re_syntax_base* get_first_state()const
+   {
+      return this->m_first_state;
+   }
+   unsigned get_restart_type()const
+   {
+      return this->m_restart_type;
+   }
+   const unsigned char* get_map()const
+   {
+      return this->m_startmap;
+   }
+   const ::boost::regex_traits_wrapper<traits>& get_traits()const
+   {
+      return *(this->m_ptraits);
+   }
+   bool can_be_null()const
+   {
+      return this->m_can_be_null;
+   }
+   const regex_data<charT, traits>& get_data()const
+   {
+      basic_regex_implementation<charT, traits> const* p = this;
+      return *static_cast<const regex_data<charT, traits>*>(p);
+   }
+};
+
+} // namespace re_detail
+//
+// class basic_regex:
+// represents the compiled
+// regular expression:
+//
+
+#ifdef BOOST_REGEX_NO_FWD
+template <class charT, class traits = regex_traits<charT> >
+#else
+template <class charT, class traits >
+#endif
+class basic_regex : public regbase
+{
+public:
+   // typedefs:
+   typedef std::size_t                           traits_size_type;
+   typedef typename traits::string_type          traits_string_type;
+   typedef charT                                 char_type;
+   typedef traits                                traits_type;
+
+   typedef charT                                 value_type;
+   typedef charT&                                reference;
+   typedef const charT&                          const_reference;
+   typedef const charT*                          const_iterator;
+   typedef const_iterator                        iterator;
+   typedef std::ptrdiff_t                        difference_type;
+   typedef std::size_t                           size_type;   
+   typedef regex_constants::syntax_option_type   flag_type;
+   // locale_type
+   // placeholder for actual locale type used by the
+   // traits class to localise *this.
+   typedef typename traits::locale_type          locale_type;
+   
+public:
+   explicit basic_regex(){}
+   explicit basic_regex(const charT* p, flag_type f = regex_constants::normal)
+   {
+      assign(p, f);
+   }
+   basic_regex(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
+   {
+      assign(p1, p2, f);
+   }
+   basic_regex(const charT* p, size_type len, flag_type f)
+   {
+      assign(p, len, f);
+   }
+   basic_regex(const basic_regex& that)
+      : m_pimpl(that.m_pimpl) {}
+   ~basic_regex(){}
+   basic_regex& BOOST_REGEX_CALL operator=(const basic_regex& that)
+   {
+      return assign(that);
+   }
+   basic_regex& BOOST_REGEX_CALL operator=(const charT* ptr)
+   {
+      return assign(ptr);
+   }
+
+   //
+   // assign:
+   basic_regex& assign(const basic_regex& that)
+   { 
+      m_pimpl = that.m_pimpl;
+      return *this; 
+   }
+   basic_regex& assign(const charT* p, flag_type f = regex_constants::normal)
+   {
+      return assign(p, p + traits::length(p), f);
+   }
+   basic_regex& assign(const charT* p, size_type len, flag_type f)
+   {
+      return assign(p, p + len, f);
+   }
+private:
+   basic_regex& do_assign(const charT* p1,
+                          const charT* p2,
+                          flag_type f);
+public:
+   basic_regex& assign(const charT* p1,
+                          const charT* p2,
+                          flag_type f = regex_constants::normal)
+   {
+      return do_assign(p1, p2, f);
+   }
+#if !defined(BOOST_NO_MEMBER_TEMPLATES)
+
+   template <class ST, class SA>
+   unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
+   { 
+      return set_expression(p.data(), p.data() + p.size(), f); 
+   }
+
+   template <class ST, class SA>
+   explicit basic_regex(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
+   { 
+      assign(p, f); 
+   }
+
+   template <class InputIterator>
+   basic_regex(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
+   {
+      typedef typename traits::string_type seq_type;
+      seq_type a(arg_first, arg_last);
+      if(a.size())
+         assign(&*a.begin(), &*a.begin() + a.size(), f);
+      else
+         assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
+   }
+
+   template <class ST, class SA>
+   basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
+   {
+      return assign(p.data(), p.data() + p.size(), regex_constants::normal);
+   }
+
+   template <class string_traits, class A>
+   basic_regex& BOOST_REGEX_CALL assign(
+       const std::basic_string<charT, string_traits, A>& s,
+       flag_type f = regex_constants::normal)
+   {
+      return assign(s.data(), s.data() + s.size(), f);
+   }
+
+   template <class InputIterator>
+   basic_regex& BOOST_REGEX_CALL assign(InputIterator arg_first,
+                          InputIterator arg_last,
+                          flag_type f = regex_constants::normal)
+   {
+      typedef typename traits::string_type seq_type;
+      seq_type a(arg_first, arg_last);
+      if(a.size())
+      {
+         const charT* p1 = &*a.begin();
+         const charT* p2 = &*a.begin() + a.size();
+         return assign(p1, p2, f);
+      }
+      return assign(static_cast<const charT*>(0), static_cast<const charT*>(0), f);
+   }
+#else
+   unsigned int BOOST_REGEX_CALL set_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
+   { 
+      return set_expression(p.data(), p.data() + p.size(), f); 
+   }
+
+   basic_regex(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
+   { 
+      assign(p, f); 
+   }
+
+   basic_regex& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
+   {
+      return assign(p.data(), p.data() + p.size(), regex_constants::normal);
+   }
+
+   basic_regex& BOOST_REGEX_CALL assign(
+       const std::basic_string<charT>& s,
+       flag_type f = regex_constants::normal)
+   {
+      return assign(s.data(), s.data() + s.size(), f);
+   }
+
+#endif
+
+   //
+   // locale:
+   locale_type BOOST_REGEX_CALL imbue(locale_type l);
+   locale_type BOOST_REGEX_CALL getloc()const
+   { 
+      return m_pimpl.get() ? m_pimpl->getloc() : locale_type(); 
+   }
+   //
+   // getflags:
+   // retained for backwards compatibility only, "flags"
+   // is now the preferred name:
+   flag_type BOOST_REGEX_CALL getflags()const
+   { 
+      return flags();
+   }
+   flag_type BOOST_REGEX_CALL flags()const
+   { 
+      return m_pimpl.get() ? m_pimpl->flags() : 0;
+   }
+   //
+   // str:
+   std::basic_string<charT> BOOST_REGEX_CALL str()const
+   {
+      return m_pimpl.get() ? m_pimpl->str() : std::basic_string<charT>();
+   }
+   //
+   // begin, end, subexpression:
+   std::pair<const_iterator, const_iterator> BOOST_REGEX_CALL subexpression(std::size_t n)const
+   {
+      if(!m_pimpl.get())
+         throw std::logic_error("Can't access subexpressions in an invalid regex.");
+      return m_pimpl->subexpression(n);
+   }
+   const_iterator BOOST_REGEX_CALL begin()const
+   { 
+      return (m_pimpl.get() ? m_pimpl->begin() : 0); 
+   }
+   const_iterator BOOST_REGEX_CALL end()const
+   { 
+      return (m_pimpl.get() ? m_pimpl->end() : 0); 
+   }
+   //
+   // swap:
+   void BOOST_REGEX_CALL swap(basic_regex& that)throw()
+   {
+      m_pimpl.swap(that.m_pimpl);
+   }
+   //
+   // size:
+   size_type BOOST_REGEX_CALL size()const
+   { 
+      return (m_pimpl.get() ? m_pimpl->size() : 0); 
+   }
+   //
+   // max_size:
+   size_type BOOST_REGEX_CALL max_size()const
+   { 
+      return UINT_MAX; 
+   }
+   //
+   // empty:
+   bool BOOST_REGEX_CALL empty()const
+   { 
+      return (m_pimpl.get() ? 0 != m_pimpl->status() : true); 
+   }
+
+   size_type BOOST_REGEX_CALL mark_count()const 
+   { 
+      return (m_pimpl.get() ? m_pimpl->mark_count() : 0); 
+   }
+
+   int status()const
+   {
+      return (m_pimpl.get() ? m_pimpl->status() : regex_constants::error_empty);
+   }
+
+   int BOOST_REGEX_CALL compare(const basic_regex& that) const
+   {
+      if(m_pimpl.get() == that.m_pimpl.get())
+         return 0;
+      if(!m_pimpl.get())
+         return -1;
+      if(!that.m_pimpl.get())
+         return 1;
+      if(status() != that.status())
+         return status() - that.status();
+      if(flags() != that.flags())
+         return flags() - that.flags();
+      return str().compare(that.str());
+   }
+   bool BOOST_REGEX_CALL operator==(const basic_regex& e)const
+   { 
+      return compare(e) == 0; 
+   }
+   bool BOOST_REGEX_CALL operator != (const basic_regex& e)const
+   { 
+      return compare(e) != 0; 
+   }
+   bool BOOST_REGEX_CALL operator<(const basic_regex& e)const
+   { 
+      return compare(e) < 0; 
+   }
+   bool BOOST_REGEX_CALL operator>(const basic_regex& e)const
+   { 
+      return compare(e) > 0; 
+   }
+   bool BOOST_REGEX_CALL operator<=(const basic_regex& e)const
+   { 
+      return compare(e) <= 0; 
+   }
+   bool BOOST_REGEX_CALL operator>=(const basic_regex& e)const
+   { 
+      return compare(e) >= 0; 
+   }
+
+   //
+   // The following are deprecated as public interfaces
+   // but are available for compatibility with earlier versions.
+   const charT* BOOST_REGEX_CALL expression()const 
+   { 
+      return (m_pimpl.get() && !m_pimpl->status() ? m_pimpl->expression() : 0); 
+   }
+   unsigned int BOOST_REGEX_CALL set_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
+   {
+      assign(p1, p2, f | regex_constants::no_except);
+      return status();
+   }
+   unsigned int BOOST_REGEX_CALL set_expression(const charT* p, flag_type f = regex_constants::normal) 
+   { 
+      assign(p, f | regex_constants::no_except); 
+      return status();
+   }
+   unsigned int BOOST_REGEX_CALL error_code()const
+   {
+      return status();
+   }
+   //
+   // private access methods:
+   //
+   const re_detail::re_syntax_base* get_first_state()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->get_first_state();
+   }
+   unsigned get_restart_type()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->get_restart_type();
+   }
+   const unsigned char* get_map()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->get_map();
+   }
+   const ::boost::regex_traits_wrapper<traits>& get_traits()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->get_traits();
+   }
+   bool can_be_null()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->can_be_null();
+   }
+   const re_detail::regex_data<charT, traits>& get_data()const
+   {
+      BOOST_ASSERT(0 != m_pimpl.get());
+      return m_pimpl->get_data();
+   }
+
+private:
+   shared_ptr<re_detail::basic_regex_implementation<charT, traits> > m_pimpl;
+};
+
+//
+// out of line members;
+// these are the only members that mutate the basic_regex object,
+// and are designed to provide the strong exception guarentee
+// (in the event of a throw, the state of the object remains unchanged).
+//
+template <class charT, class traits>
+basic_regex<charT, traits>& basic_regex<charT, traits>::do_assign(const charT* p1,
+                        const charT* p2,
+                        flag_type f)
+{
+   shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp;
+   if(!m_pimpl.get())
+   {
+      temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>());
+   }
+   else
+   {
+      temp = shared_ptr<re_detail::basic_regex_implementation<charT, traits> >(new re_detail::basic_regex_implementation<charT, traits>(m_pimpl->m_ptraits));
+   }
+   temp->assign(p1, p2, f);
+   temp.swap(m_pimpl);
+   return *this;
+}
+
+template <class charT, class traits>
+typename basic_regex<charT, traits>::locale_type BOOST_REGEX_CALL basic_regex<charT, traits>::imbue(locale_type l)
+{ 
+   shared_ptr<re_detail::basic_regex_implementation<charT, traits> > temp(new re_detail::basic_regex_implementation<charT, traits>());
+   locale_type result = temp->imbue(l);
+   temp.swap(m_pimpl);
+   return result;
+}
+
+//
+// non-members:
+//
+template <class charT, class traits>
+void swap(basic_regex<charT, traits>& e1, basic_regex<charT, traits>& e2)
+{
+   e1.swap(e2);
+}
+
+#ifndef BOOST_NO_STD_LOCALE
+template <class charT, class traits, class traits2>
+std::basic_ostream<charT, traits>& 
+   operator << (std::basic_ostream<charT, traits>& os, 
+                const basic_regex<charT, traits2>& e)
+{
+   return (os << e.str());
+}
+#else
+template <class traits>
+std::ostream& operator << (std::ostream& os, const basic_regex<char, traits>& e)
+{
+   return (os << e.str());
+}
+#endif
+
+//
+// class reg_expression:
+// this is provided for backwards compatibility only,
+// it is deprecated, no not use!
+//
+#ifdef BOOST_REGEX_NO_FWD
+template <class charT, class traits = regex_traits<charT> >
+#else
+template <class charT, class traits >
+#endif
+class reg_expression : public basic_regex<charT, traits>
+{
+public:
+   typedef typename basic_regex<charT, traits>::flag_type flag_type;
+   typedef typename basic_regex<charT, traits>::size_type size_type;
+   explicit reg_expression(){}
+   explicit reg_expression(const charT* p, flag_type f = regex_constants::normal)
+      : basic_regex<charT, traits>(p, f){}
+   reg_expression(const charT* p1, const charT* p2, flag_type f = regex_constants::normal)
+      : basic_regex<charT, traits>(p1, p2, f){}
+   reg_expression(const charT* p, size_type len, flag_type f)
+      : basic_regex<charT, traits>(p, len, f){}
+   reg_expression(const reg_expression& that)
+      : basic_regex<charT, traits>(that) {}
+   ~reg_expression(){}
+   reg_expression& BOOST_REGEX_CALL operator=(const reg_expression& that)
+   {
+      return this->assign(that);
+   }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATES)
+   template <class ST, class SA>
+   explicit reg_expression(const std::basic_string<charT, ST, SA>& p, flag_type f = regex_constants::normal)
+   : basic_regex<charT, traits>(p, f)
+   { 
+   }
+
+   template <class InputIterator>
+   reg_expression(InputIterator arg_first, InputIterator arg_last, flag_type f = regex_constants::normal)
+   : basic_regex<charT, traits>(arg_first, arg_last, f)
+   {
+   }
+
+   template <class ST, class SA>
+   reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT, ST, SA>& p)
+   {
+      this->assign(p);
+      return *this;
+   }
+#else
+   explicit reg_expression(const std::basic_string<charT>& p, flag_type f = regex_constants::normal)
+   : basic_regex<charT, traits>(p, f)
+   { 
+   }
+
+   reg_expression& BOOST_REGEX_CALL operator=(const std::basic_string<charT>& p)
+   {
+      this->assign(p);
+      return *this;
+   }
+#endif
+
+};
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/basic_regex_creator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1332 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         basic_regex_creator.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class basic_regex_creator which fills in
+  *                the data members of a regex_data object.
+  */
+
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
+#define BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4800)
+#endif
+
+namespace boost{
+
+namespace re_detail{
+
+template <class charT>
+struct digraph : public std::pair<charT, charT>
+{
+   digraph() : std::pair<charT, charT>(0, 0){}
+   digraph(charT c1) : std::pair<charT, charT>(c1, 0){}
+   digraph(charT c1, charT c2) : std::pair<charT, charT>(c1, c2)
+   {}
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+   digraph(const digraph<charT>& d) : std::pair<charT, charT>(d.first, d.second){}
+#endif
+   template <class Seq>
+   digraph(const Seq& s) : std::pair<charT, charT>()
+   {
+      BOOST_ASSERT(s.size() <= 2);
+      BOOST_ASSERT(s.size());
+      this->first = s[0];
+      this->second = (s.size() > 1) ? s[1] : 0;
+   }
+};
+
+template <class charT, class traits>
+class basic_char_set
+{
+public:
+   typedef digraph<charT>                   digraph_type;
+   typedef typename traits::string_type     string_type;
+   typedef typename traits::char_class_type mask_type;
+
+   basic_char_set()
+   {
+      m_negate = false;
+      m_has_digraphs = false;
+      m_classes = 0;
+      m_negated_classes = 0;
+      m_empty = true;
+   }
+
+   void add_single(const digraph_type& s)
+   {
+      m_singles.insert(m_singles.end(), s);
+      if(s.second)
+         m_has_digraphs = true;
+      m_empty = false;
+   }
+   void add_range(const digraph_type& first, const digraph_type& end)
+   {
+      m_ranges.insert(m_ranges.end(), first);
+      m_ranges.insert(m_ranges.end(), end);
+      if(first.second)
+      {
+         m_has_digraphs = true;
+         add_single(first);
+      }
+      if(end.second)
+      {
+         m_has_digraphs = true;
+         add_single(end);
+      }
+      m_empty = false;
+   }
+   void add_class(mask_type m)
+   {
+      m_classes |= m;
+      m_empty = false;
+   }
+   void add_negated_class(mask_type m)
+   {
+      m_negated_classes |= m;
+      m_empty = false;
+   }
+   void add_equivalent(const digraph_type& s)
+   {
+      m_equivalents.insert(m_equivalents.end(), s);
+      if(s.second)
+      {
+         m_has_digraphs = true;
+         add_single(s);
+      }
+      m_empty = false;
+   }
+   void negate()
+   { 
+      m_negate = true;
+      //m_empty = false;
+   }
+
+   //
+   // accessor functions:
+   //
+   bool has_digraphs()const
+   {
+      return m_has_digraphs;
+   }
+   bool is_negated()const
+   {
+      return m_negate;
+   }
+   typedef typename std::vector<digraph_type>::const_iterator  list_iterator;
+   list_iterator singles_begin()const
+   {
+      return m_singles.begin();
+   }
+   list_iterator singles_end()const
+   {
+      return m_singles.end();
+   }
+   list_iterator ranges_begin()const
+   {
+      return m_ranges.begin();
+   }
+   list_iterator ranges_end()const
+   {
+      return m_ranges.end();
+   }
+   list_iterator equivalents_begin()const
+   {
+      return m_equivalents.begin();
+   }
+   list_iterator equivalents_end()const
+   {
+      return m_equivalents.end();
+   }
+   mask_type classes()const
+   {
+      return m_classes;
+   }
+   mask_type negated_classes()const
+   {
+      return m_negated_classes;
+   }
+   bool empty()const
+   {
+      return m_empty;
+   }
+private:
+   std::vector<digraph_type> m_singles;         // a list of single characters to match
+   std::vector<digraph_type> m_ranges;          // a list of end points of our ranges
+   bool                      m_negate;          // true if the set is to be negated
+   bool                      m_has_digraphs;    // true if we have digraphs present
+   mask_type                 m_classes;         // character classes to match
+   mask_type                 m_negated_classes; // negated character classes to match
+   bool                      m_empty;           // whether we've added anything yet
+   std::vector<digraph_type> m_equivalents;     // a list of equivalence classes
+};
+   
+template <class charT, class traits>
+class basic_regex_creator
+{
+public:
+   basic_regex_creator(regex_data<charT, traits>* data);
+   std::ptrdiff_t getoffset(void* addr)
+   {
+      return getoffset(addr, m_pdata->m_data.data());
+   }
+   std::ptrdiff_t getoffset(const void* addr, const void* base)
+   {
+      return static_cast<const char*>(addr) - static_cast<const char*>(base);
+   }
+   re_syntax_base* getaddress(std::ptrdiff_t off)
+   {
+      return getaddress(off, m_pdata->m_data.data());
+   }
+   re_syntax_base* getaddress(std::ptrdiff_t off, void* base)
+   {
+      return static_cast<re_syntax_base*>(static_cast<void*>(static_cast<char*>(base) + off));
+   }
+   void init(unsigned l_flags)
+   {
+      m_pdata->m_flags = l_flags;
+      m_icase = l_flags & regex_constants::icase;
+   }
+   regbase::flag_type flags()
+   {
+      return m_pdata->m_flags;
+   }
+   void flags(regbase::flag_type f)
+   {
+      m_pdata->m_flags = f;
+      if(m_icase != static_cast<bool>(f & regbase::icase))
+      {
+         m_icase = static_cast<bool>(f & regbase::icase);
+      }
+   }
+   re_syntax_base* append_state(syntax_element_type t, std::size_t s = sizeof(re_syntax_base));
+   re_syntax_base* insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s = sizeof(re_syntax_base));
+   re_literal* append_literal(charT c);
+   re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set);
+   re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, mpl::false_*);
+   re_syntax_base* append_set(const basic_char_set<charT, traits>& char_set, mpl::true_*);
+   void finalize(const charT* p1, const charT* p2);
+protected:
+   regex_data<charT, traits>*    m_pdata;              // pointer to the basic_regex_data struct we are filling in
+   const ::boost::regex_traits_wrapper<traits>&  
+                                 m_traits;             // convenience reference to traits class
+   re_syntax_base*               m_last_state;         // the last state we added
+   bool                          m_icase;              // true for case insensitive matches
+   unsigned                      m_repeater_id;        // the state_id of the next repeater
+   bool                          m_has_backrefs;       // true if there are actually any backrefs
+   unsigned                      m_backrefs;           // bitmask of permitted backrefs
+   boost::uintmax_t              m_bad_repeats;        // bitmask of repeats we can't deduce a startmap for;
+   typename traits::char_class_type m_word_mask;       // mask used to determine if a character is a word character
+   typename traits::char_class_type m_mask_space;      // mask used to determine if a character is a word character
+   typename traits::char_class_type m_lower_mask;       // mask used to determine if a character is a lowercase character
+   typename traits::char_class_type m_upper_mask;      // mask used to determine if a character is an uppercase character
+   typename traits::char_class_type m_alpha_mask;      // mask used to determine if a character is an alphabetic character
+private:
+   basic_regex_creator& operator=(const basic_regex_creator&);
+   basic_regex_creator(const basic_regex_creator&);
+
+   void fixup_pointers(re_syntax_base* state);
+   void create_startmaps(re_syntax_base* state);
+   int calculate_backstep(re_syntax_base* state);
+   void create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask);
+   unsigned get_restart_type(re_syntax_base* state);
+   void set_all_masks(unsigned char* bits, unsigned char);
+   bool is_bad_repeat(re_syntax_base* pt);
+   void set_bad_repeat(re_syntax_base* pt);
+   syntax_element_type get_repeat_type(re_syntax_base* state);
+   void probe_leading_repeat(re_syntax_base* state);
+};
+
+template <class charT, class traits>
+basic_regex_creator<charT, traits>::basic_regex_creator(regex_data<charT, traits>* data)
+   : m_pdata(data), m_traits(*(data->m_ptraits)), m_last_state(0), m_repeater_id(0), m_has_backrefs(false), m_backrefs(0)
+{
+   m_pdata->m_data.clear();
+   m_pdata->m_status = ::boost::regex_constants::error_ok;
+   static const charT w = 'w';
+   static const charT s = 's';
+   static const charT l[5] = { 'l', 'o', 'w', 'e', 'r', };
+   static const charT u[5] = { 'u', 'p', 'p', 'e', 'r', };
+   static const charT a[5] = { 'a', 'l', 'p', 'h', 'a', };
+   m_word_mask = m_traits.lookup_classname(&w, &w +1);
+   m_mask_space = m_traits.lookup_classname(&s, &s +1);
+   m_lower_mask = m_traits.lookup_classname(l, l + 5);
+   m_upper_mask = m_traits.lookup_classname(u, u + 5);
+   m_alpha_mask = m_traits.lookup_classname(a, a + 5);
+   m_pdata->m_word_mask = m_word_mask;
+   BOOST_ASSERT(m_word_mask != 0); 
+   BOOST_ASSERT(m_mask_space != 0); 
+   BOOST_ASSERT(m_lower_mask != 0); 
+   BOOST_ASSERT(m_upper_mask != 0); 
+   BOOST_ASSERT(m_alpha_mask != 0); 
+}
+
+template <class charT, class traits>
+re_syntax_base* basic_regex_creator<charT, traits>::append_state(syntax_element_type t, std::size_t s)
+{
+   // if the state is a backref then make a note of it:
+   if(t == syntax_element_backref)
+      this->m_has_backrefs = true;
+   // append a new state, start by aligning our last one:
+   m_pdata->m_data.align();
+   // set the offset to the next state in our last one:
+   if(m_last_state)
+      m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
+   // now actually extent our data:
+   m_last_state = static_cast<re_syntax_base*>(m_pdata->m_data.extend(s));
+   // fill in boilerplate options in the new state:
+   m_last_state->next.i = 0;
+   m_last_state->type = t;
+   return m_last_state;
+}
+
+template <class charT, class traits>
+re_syntax_base* basic_regex_creator<charT, traits>::insert_state(std::ptrdiff_t pos, syntax_element_type t, std::size_t s)
+{
+   // append a new state, start by aligning our last one:
+   m_pdata->m_data.align();
+   // set the offset to the next state in our last one:
+   if(m_last_state)
+      m_last_state->next.i = m_pdata->m_data.size() - getoffset(m_last_state);
+   // remember the last state position:
+   std::ptrdiff_t off = getoffset(m_last_state) + s;
+   // now actually insert our data:
+   re_syntax_base* new_state = static_cast<re_syntax_base*>(m_pdata->m_data.insert(pos, s));
+   // fill in boilerplate options in the new state:
+   new_state->next.i = s;
+   new_state->type = t;
+   m_last_state = getaddress(off);
+   return new_state;
+}
+
+template <class charT, class traits>
+re_literal* basic_regex_creator<charT, traits>::append_literal(charT c)
+{
+   re_literal* result;
+   // start by seeing if we have an existing re_literal we can extend:
+   if((0 == m_last_state) || (m_last_state->type != syntax_element_literal))
+   {
+      // no existing re_literal, create a new one:
+      result = static_cast<re_literal*>(append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
+      result->length = 1;
+      *static_cast<charT*>(static_cast<void*>(result+1)) = m_traits.translate(c, m_icase);
+   }
+   else
+   {
+      // we have an existing re_literal, extend it:
+      std::ptrdiff_t off = getoffset(m_last_state);
+      m_pdata->m_data.extend(sizeof(charT));
+      m_last_state = result = static_cast<re_literal*>(getaddress(off));
+      charT* characters = static_cast<charT*>(static_cast<void*>(result+1));
+      characters[result->length] = m_traits.translate(c, m_icase);
+      ++(result->length);
+   }
+   return result;
+}
+
+template <class charT, class traits>
+inline re_syntax_base* basic_regex_creator<charT, traits>::append_set(
+   const basic_char_set<charT, traits>& char_set)
+{
+   typedef mpl::bool_< (sizeof(charT) == 1) > truth_type;
+   return char_set.has_digraphs() 
+      ? append_set(char_set, static_cast<mpl::false_*>(0))
+      : append_set(char_set, static_cast<truth_type*>(0));
+}
+
+template <class charT, class traits>
+re_syntax_base* basic_regex_creator<charT, traits>::append_set(
+   const basic_char_set<charT, traits>& char_set, mpl::false_*)
+{
+   typedef typename traits::string_type string_type;
+   typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
+   typedef typename traits::char_class_type mask_type;
+   
+   re_set_long<mask_type>* result = static_cast<re_set_long<mask_type>*>(append_state(syntax_element_long_set, sizeof(re_set_long<mask_type>)));
+   //
+   // fill in the basics:
+   //
+   result->csingles = static_cast<unsigned int>(::boost::re_detail::distance(char_set.singles_begin(), char_set.singles_end()));
+   result->cranges = static_cast<unsigned int>(::boost::re_detail::distance(char_set.ranges_begin(), char_set.ranges_end())) / 2;
+   result->cequivalents = static_cast<unsigned int>(::boost::re_detail::distance(char_set.equivalents_begin(), char_set.equivalents_end()));
+   result->cclasses = char_set.classes();
+   result->cnclasses = char_set.negated_classes();
+   if(flags() & regbase::icase)
+   {
+      // adjust classes as needed:
+      if(((result->cclasses & m_lower_mask) == m_lower_mask) || ((result->cclasses & m_upper_mask) == m_upper_mask))
+         result->cclasses |= m_alpha_mask;
+      if(((result->cnclasses & m_lower_mask) == m_lower_mask) || ((result->cnclasses & m_upper_mask) == m_upper_mask))
+         result->cnclasses |= m_alpha_mask;
+   }
+
+   result->isnot = char_set.is_negated();
+   result->singleton = !char_set.has_digraphs();
+   //
+   // remember where the state is for later:
+   //
+   std::ptrdiff_t offset = getoffset(result);
+   //
+   // now extend with all the singles:
+   //
+   item_iterator first, last;
+   first = char_set.singles_begin();
+   last = char_set.singles_end();
+   while(first != last)
+   {
+      charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (first->second ? 3 : 2)));
+      p[0] = m_traits.translate(first->first, m_icase);
+      if(first->second)
+      {
+         p[1] = m_traits.translate(first->second, m_icase);
+         p[2] = 0;
+      }
+      else
+         p[1] = 0;
+      ++first;
+   }
+   //
+   // now extend with all the ranges:
+   //
+   first = char_set.ranges_begin();
+   last = char_set.ranges_end();
+   while(first != last)
+   {
+      // first grab the endpoints of the range:
+      digraph<charT> c1 = *first;
+      c1.first = this->m_traits.translate(c1.first, this->m_icase);
+      c1.second = this->m_traits.translate(c1.second, this->m_icase);
+      ++first;
+      digraph<charT> c2 = *first;
+      c2.first = this->m_traits.translate(c2.first, this->m_icase);
+      c2.second = this->m_traits.translate(c2.second, this->m_icase);
+      ++first;
+      string_type s1, s2;
+      // different actions now depending upon whether collation is turned on:
+      if(flags() & regex_constants::collate)
+      {
+         // we need to transform our range into sort keys:
+#if BOOST_WORKAROUND(__GNUC__, < 3)
+         string_type in(3, charT(0));
+         in[0] = c1.first;
+         in[1] = c1.second;
+         s1 = this->m_traits.transform(in.c_str(), (in[1] ? in.c_str()+2 : in.c_str()+1));
+         in[0] = c2.first;
+         in[1] = c2.second;
+         s2 = this->m_traits.transform(in.c_str(), (in[1] ? in.c_str()+2 : in.c_str()+1));
+#else
+         charT a1[3] = { c1.first, c1.second, charT(0), };
+         charT a2[3] = { c2.first, c2.second, charT(0), };
+         s1 = this->m_traits.transform(a1, (a1[1] ? a1+2 : a1+1));
+         s2 = this->m_traits.transform(a2, (a2[1] ? a2+2 : a2+1));
+#endif
+         if(s1.size() == 0)
+            s1 = string_type(1, charT(0));
+         if(s2.size() == 0)
+            s2 = string_type(1, charT(0));
+      }
+      else
+      {
+         if(c1.second)
+         {
+            s1.insert(s1.end(), c1.first);
+            s1.insert(s1.end(), c1.second);
+         }
+         else
+            s1 = string_type(1, c1.first);
+         if(c2.second)
+         {
+            s2.insert(s2.end(), c2.first);
+            s2.insert(s2.end(), c2.second);
+         }
+         else
+            s2.insert(s2.end(), c2.first);
+      }
+      if(s1 > s2)
+      {
+         // Oops error:
+         return 0;
+      }
+      charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s1.size() + s2.size() + 2) ) );
+      re_detail::copy(s1.begin(), s1.end(), p);
+      p[s1.size()] = charT(0);
+      p += s1.size() + 1;
+      re_detail::copy(s2.begin(), s2.end(), p);
+      p[s2.size()] = charT(0);
+   }
+   //
+   // now process the equivalence classes:
+   //
+   first = char_set.equivalents_begin();
+   last = char_set.equivalents_end();
+   while(first != last)
+   {
+      string_type s;
+      if(first->second)
+      {
+#if BOOST_WORKAROUND(__GNUC__, < 3)
+         string_type in(3, charT(0));
+         in[0] = first->first;
+         in[1] = first->second;
+         s = m_traits.transform_primary(in.c_str(), in.c_str()+2);
+#else
+         charT cs[3] = { first->first, first->second, charT(0), };
+         s = m_traits.transform_primary(cs, cs+2);
+#endif
+      }
+      else
+         s = m_traits.transform_primary(&first->first, &first->first+1);
+      if(s.empty())
+         return 0;  // invalid or unsupported equivalence class
+      charT* p = static_cast<charT*>(this->m_pdata->m_data.extend(sizeof(charT) * (s.size()+1) ) );
+      re_detail::copy(s.begin(), s.end(), p);
+      p[s.size()] = charT(0);
+      ++first;
+   }
+   //
+   // finally reset the address of our last state:
+   //
+   m_last_state = result = static_cast<re_set_long<mask_type>*>(getaddress(offset));
+   return result;
+}
+
+namespace{
+
+template<class T>
+inline bool char_less(T t1, T t2)
+{
+   return t1 < t2;
+}
+template<>
+inline bool char_less<char>(char t1, char t2)
+{
+   return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
+}
+template<>
+inline bool char_less<signed char>(signed char t1, signed char t2)
+{
+   return static_cast<unsigned char>(t1) < static_cast<unsigned char>(t2);
+}
+}
+
+template <class charT, class traits>
+re_syntax_base* basic_regex_creator<charT, traits>::append_set(
+   const basic_char_set<charT, traits>& char_set, mpl::true_*)
+{
+   typedef typename traits::string_type string_type;
+   typedef typename basic_char_set<charT, traits>::list_iterator item_iterator;
+   
+   re_set* result = static_cast<re_set*>(append_state(syntax_element_set, sizeof(re_set)));
+   bool negate = char_set.is_negated();
+   std::memset(result->_map, 0, sizeof(result->_map));
+   //
+   // handle singles first:
+   //
+   item_iterator first, last;
+   first = char_set.singles_begin();
+   last = char_set.singles_end();
+   while(first != last)
+   {
+      for(unsigned int i = 0; i < (1 << CHAR_BIT); ++i)
+      {
+         if(this->m_traits.translate(static_cast<charT>(i), this->m_icase)
+            == this->m_traits.translate(first->first, this->m_icase))
+            result->_map[i] = true;
+      }
+      ++first;
+   }
+   //
+   // OK now handle ranges:
+   //
+   first = char_set.ranges_begin();
+   last = char_set.ranges_end();
+   while(first != last)
+   {
+      // first grab the endpoints of the range:
+      charT c1 = this->m_traits.translate(first->first, this->m_icase);
+      ++first;
+      charT c2 = this->m_traits.translate(first->first, this->m_icase);
+      ++first;
+      // different actions now depending upon whether collation is turned on:
+      if(flags() & regex_constants::collate)
+      {
+         // we need to transform our range into sort keys:
+         charT c3[2] = { c1, charT(0), };
+         string_type s1 = this->m_traits.transform(c3, c3+1);
+         c3[0] = c2;
+         string_type s2 = this->m_traits.transform(c3, c3+1);
+         if(s1 > s2)
+         {
+            // Oops error:
+            return 0;
+         }
+         BOOST_ASSERT(c3[1] == charT(0));
+         for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+         {
+            c3[0] = static_cast<charT>(i);
+            string_type s3 = this->m_traits.transform(c3, c3 +1);
+            if((s1 <= s3) && (s3 <= s2))
+               result->_map[i] = true;
+         }
+      }
+      else
+      {
+         if(char_less<charT>(c2, c1))
+         {
+            // Oops error:
+            return 0;
+         }
+         // everything in range matches:
+         std::memset(result->_map + static_cast<unsigned char>(c1), true, 1 + static_cast<unsigned char>(c2) - static_cast<unsigned char>(c1));
+      }
+   }
+   //
+   // and now the classes:
+   //
+   typedef typename traits::char_class_type mask_type;
+   mask_type m = char_set.classes();
+   if(flags() & regbase::icase)
+   {
+      // adjust m as needed:
+      if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
+         m |= m_alpha_mask;
+   }
+   if(m != 0)
+   {
+      for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+      {
+         if(this->m_traits.isctype(static_cast<charT>(i), m))
+            result->_map[i] = true;
+      }
+   }
+   //
+   // and now the negated classes:
+   //
+   m = char_set.negated_classes();
+   if(flags() & regbase::icase)
+   {
+      // adjust m as needed:
+      if(((m & m_lower_mask) == m_lower_mask) || ((m & m_upper_mask) == m_upper_mask))
+         m |= m_alpha_mask;
+   }
+   if(m != 0)
+   {
+      for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+      {
+         if(0 == this->m_traits.isctype(static_cast<charT>(i), m))
+            result->_map[i] = true;
+      }
+   }
+   //
+   // now process the equivalence classes:
+   //
+   first = char_set.equivalents_begin();
+   last = char_set.equivalents_end();
+   while(first != last)
+   {
+      string_type s;
+      BOOST_ASSERT(static_cast<charT>(0) == first->second);
+      s = m_traits.transform_primary(&first->first, &first->first+1);
+      if(s.empty())
+         return 0;  // invalid or unsupported equivalence class
+      for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+      {
+         charT c[2] = { (static_cast<charT>(i)), charT(0), };
+         string_type s2 = this->m_traits.transform_primary(c, c+1);
+         if(s == s2)
+            result->_map[i] = true;
+      }
+      ++first;
+   }
+   if(negate)
+   {
+      for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+      {
+         result->_map[i] = !(result->_map[i]);
+      }
+   }
+   return result;
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::finalize(const charT* p1, const charT* p2)
+{
+   // we've added all the states we need, now finish things off.
+   // start by adding a terminating state:
+   append_state(syntax_element_match);
+   // extend storage to store original expression:
+   std::ptrdiff_t len = p2 - p1;
+   m_pdata->m_expression_len = len;
+   charT* ps = static_cast<charT*>(m_pdata->m_data.extend(sizeof(charT) * (1 + (p2 - p1))));
+   m_pdata->m_expression = ps;
+   re_detail::copy(p1, p2, ps);
+   ps[p2 - p1] = 0;
+   // fill in our other data...
+   // successful parsing implies a zero status:
+   m_pdata->m_status = 0;
+   // get the first state of the machine:
+   m_pdata->m_first_state = static_cast<re_syntax_base*>(m_pdata->m_data.data());
+   // fixup pointers in the machine:
+   fixup_pointers(m_pdata->m_first_state);
+   // create nested startmaps:
+   create_startmaps(m_pdata->m_first_state);
+   // create main startmap:
+   std::memset(m_pdata->m_startmap, 0, sizeof(m_pdata->m_startmap));
+   m_pdata->m_can_be_null = 0;
+
+   m_bad_repeats = 0;
+   create_startmap(m_pdata->m_first_state, m_pdata->m_startmap, &(m_pdata->m_can_be_null), mask_all);
+   // get the restart type:
+   m_pdata->m_restart_type = get_restart_type(m_pdata->m_first_state);
+   // optimise a leading repeat if there is one:
+   probe_leading_repeat(m_pdata->m_first_state);
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::fixup_pointers(re_syntax_base* state)
+{
+   while(state)
+   {
+      switch(state->type)
+      {
+      case syntax_element_rep:
+      case syntax_element_dot_rep:
+      case syntax_element_char_rep:
+      case syntax_element_short_set_rep:
+      case syntax_element_long_set_rep:
+         // set the state_id of this repeat:
+         static_cast<re_repeat*>(state)->state_id = m_repeater_id++;
+         // fall through:
+      case syntax_element_alt:
+         std::memset(static_cast<re_alt*>(state)->_map, 0, sizeof(static_cast<re_alt*>(state)->_map));
+         static_cast<re_alt*>(state)->can_be_null = 0;
+         // fall through:
+      case syntax_element_jump:
+         static_cast<re_jump*>(state)->alt.p = getaddress(static_cast<re_jump*>(state)->alt.i, state);
+         // fall through again:
+      default:
+         if(state->next.i)
+            state->next.p = getaddress(state->next.i, state);
+         else
+            state->next.p = 0;
+      }
+      state = state->next.p;
+   }
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::create_startmaps(re_syntax_base* state)
+{
+   // non-recursive implementation:
+   // create the last map in the machine first, so that earlier maps
+   // can make use of the result...
+   //
+   // This was originally a recursive implementation, but that caused stack
+   // overflows with complex expressions on small stacks (think COM+).
+
+   // start by saving the case setting:
+   bool l_icase = m_icase;
+   std::vector<std::pair<bool, re_syntax_base*> > v;
+
+   while(state)
+   {
+      switch(state->type)
+      {
+      case syntax_element_toggle_case:
+         // we need to track case changes here:
+         m_icase = static_cast<re_case*>(state)->icase;
+         state = state->next.p;
+         continue;
+      case syntax_element_alt:
+      case syntax_element_rep:
+      case syntax_element_dot_rep:
+      case syntax_element_char_rep:
+      case syntax_element_short_set_rep:
+      case syntax_element_long_set_rep:
+         // just push the state onto our stack for now:
+         v.push_back(std::pair<bool, re_syntax_base*>(m_icase, state));
+         state = state->next.p;
+         break;
+      case syntax_element_backstep:
+         // we need to calculate how big the backstep is:
+         static_cast<re_brace*>(state)->index
+            = this->calculate_backstep(state->next.p);
+         if(static_cast<re_brace*>(state)->index < 0)
+         {
+            // Oops error:
+            if(0 == this->m_pdata->m_status) // update the error code if not already set
+               this->m_pdata->m_status = boost::regex_constants::error_bad_pattern;
+            //
+            // clear the expression, we should be empty:
+            //
+            this->m_pdata->m_expression = 0;
+            this->m_pdata->m_expression_len = 0;
+            //
+            // and throw if required:
+            //
+            if(0 == (this->flags() & regex_constants::no_except))
+            {
+               std::string message = this->m_pdata->m_ptraits->error_string(boost::regex_constants::error_bad_pattern);
+               boost::regex_error e(message, boost::regex_constants::error_bad_pattern, 0);
+               e.raise();
+            }
+         }
+         // fall through:
+      default:
+         state = state->next.p;
+      }
+   }
+   // now work through our list, building all the maps as we go:
+   while(v.size())
+   {
+      const std::pair<bool, re_syntax_base*>& p = v.back();
+      m_icase = p.first;
+      state = p.second;
+      v.pop_back();
+
+      // Build maps:
+      m_bad_repeats = 0;
+      create_startmap(state->next.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_take);
+      m_bad_repeats = 0;
+      create_startmap(static_cast<re_alt*>(state)->alt.p, static_cast<re_alt*>(state)->_map, &static_cast<re_alt*>(state)->can_be_null, mask_skip);
+      // adjust the type of the state to allow for faster matching:
+      state->type = this->get_repeat_type(state);
+   }
+   // restore case sensitivity:
+   m_icase = l_icase;
+}
+
+template <class charT, class traits>
+int basic_regex_creator<charT, traits>::calculate_backstep(re_syntax_base* state)
+{
+   typedef typename traits::char_class_type mask_type;
+   int result = 0;
+   while(state)
+   {
+      switch(state->type)
+      {
+      case syntax_element_startmark:
+         if((static_cast<re_brace*>(state)->index == -1)
+            || (static_cast<re_brace*>(state)->index == -2))
+         {
+            state = static_cast<re_jump*>(state->next.p)->alt.p->next.p;
+            continue;
+         }
+         else if(static_cast<re_brace*>(state)->index == -3)
+         {
+            state = state->next.p->next.p;
+            continue;
+         }
+         break;
+      case syntax_element_endmark:
+         if((static_cast<re_brace*>(state)->index == -1)
+            || (static_cast<re_brace*>(state)->index == -2))
+            return result;
+         break;
+      case syntax_element_literal:
+         result += static_cast<re_literal*>(state)->length;
+         break;
+      case syntax_element_wild:
+      case syntax_element_set:
+         result += 1;
+         break;
+      case syntax_element_dot_rep:
+      case syntax_element_char_rep:
+      case syntax_element_short_set_rep:
+      case syntax_element_backref:
+      case syntax_element_rep:
+      case syntax_element_combining:
+      case syntax_element_long_set_rep:
+      case syntax_element_backstep:
+         {
+            re_repeat* rep = static_cast<re_repeat *>(state);
+            // adjust the type of the state to allow for faster matching:
+            state->type = this->get_repeat_type(state);
+            if((state->type == syntax_element_dot_rep) 
+               || (state->type == syntax_element_char_rep)
+               || (state->type == syntax_element_short_set_rep))
+            {
+               if(rep->max != rep->min)
+                  return -1;
+               result += static_cast<int>(rep->min);
+               state = rep->alt.p;
+               continue;
+            }
+            else if((state->type == syntax_element_long_set_rep)) 
+            {
+               BOOST_ASSERT(rep->next.p->type == syntax_element_long_set);
+               if(static_cast<re_set_long<mask_type>*>(rep->next.p)->singleton == 0)
+                  return -1;
+               if(rep->max != rep->min)
+                  return -1;
+               result += static_cast<int>(rep->min);
+               state = rep->alt.p;
+               continue;
+            }
+         }
+         return -1;
+      case syntax_element_long_set:
+         if(static_cast<re_set_long<mask_type>*>(state)->singleton == 0)
+            return -1;
+         result += 1;
+         break;
+      case syntax_element_jump:
+         state = static_cast<re_jump*>(state)->alt.p;
+         continue;
+      default:
+         break;
+      }
+      state = state->next.p;
+   }
+   return -1;
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::create_startmap(re_syntax_base* state, unsigned char* l_map, unsigned int* pnull, unsigned char mask)
+{
+   int not_last_jump = 1;
+
+   // track case sensitivity:
+   bool l_icase = m_icase;
+
+   while(state)
+   {
+      switch(state->type)
+      {
+      case syntax_element_toggle_case:
+         l_icase = static_cast<re_case*>(state)->icase;
+         state = state->next.p;
+         break;
+      case syntax_element_literal:
+      {
+         // don't set anything in *pnull, set each element in l_map
+         // that could match the first character in the literal:
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            charT first_char = *static_cast<charT*>(static_cast<void*>(static_cast<re_literal*>(state) + 1));
+            for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
+            {
+               if(m_traits.translate(static_cast<charT>(i), l_icase) == first_char)
+                  l_map[i] |= mask;
+            }
+         }
+         return;
+      }
+      case syntax_element_end_line:
+      {
+         // next character must be a line separator (if there is one):
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            l_map['\n'] |= mask;
+            l_map['\r'] |= mask;
+            l_map['\f'] |= mask;
+            l_map[0x85] |= mask;
+         }
+         // now figure out if we can match a NULL string at this point:
+         if(pnull)
+            create_startmap(state->next.p, 0, pnull, mask);
+         return;
+      }
+      case syntax_element_backref:
+         // can be null, and any character can match:
+         if(pnull)
+            *pnull |= mask;
+         // fall through:
+      case syntax_element_wild:
+      {
+         // can't be null, any character can match:
+         set_all_masks(l_map, mask);
+         return;
+      }
+      case syntax_element_match:
+      {
+         // must be null, any character can match:
+         set_all_masks(l_map, mask);
+         if(pnull)
+            *pnull |= mask;
+         return;
+      }
+      case syntax_element_word_start:
+      {
+         // recurse, then AND with all the word characters:
+         create_startmap(state->next.p, l_map, pnull, mask);
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
+            {
+               if(!m_traits.isctype(static_cast<charT>(i), m_word_mask))
+                  l_map[i] &= static_cast<unsigned char>(~mask);
+            }
+         }
+         return;
+      }
+      case syntax_element_word_end:
+      {
+         // recurse, then AND with all the word characters:
+         create_startmap(state->next.p, l_map, pnull, mask);
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
+            {
+               if(m_traits.isctype(static_cast<charT>(i), m_word_mask))
+                  l_map[i] &= static_cast<unsigned char>(~mask);
+            }
+         }
+         return;
+      }
+      case syntax_element_buffer_end:
+      {
+         // we *must be null* :
+         if(pnull)
+            *pnull |= mask;
+         return;
+      }
+      case syntax_element_long_set:
+         if(l_map)
+         {
+            typedef typename traits::char_class_type mask_type;
+            if(static_cast<re_set_long<mask_type>*>(state)->singleton)
+            {
+               l_map[0] |= mask_init;
+               for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
+               {
+                  charT c = static_cast<charT>(i);
+                  if(&c != re_is_set_member(&c, &c + 1, static_cast<re_set_long<mask_type>*>(state), *m_pdata, m_icase))
+                     l_map[i] |= mask;
+               }
+            }
+            else
+               set_all_masks(l_map, mask);
+         }
+         return;
+      case syntax_element_set:
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            for(unsigned int i = 0; i < (1u << CHAR_BIT); ++i)
+            {
+               if(static_cast<re_set*>(state)->_map[
+                  static_cast<unsigned char>(m_traits.translate(static_cast<charT>(i), l_icase))])
+                  l_map[i] |= mask;
+            }
+         }
+         return;
+      case syntax_element_jump:
+         // take the jump:
+         state = static_cast<re_alt*>(state)->alt.p;
+         not_last_jump = -1;
+         break;
+      case syntax_element_alt:
+      case syntax_element_rep:
+      case syntax_element_dot_rep:
+      case syntax_element_char_rep:
+      case syntax_element_short_set_rep:
+      case syntax_element_long_set_rep:
+         {
+            re_alt* rep = static_cast<re_alt*>(state);
+            if(rep->_map[0] & mask_init)
+            {
+               if(l_map)
+               {
+                  // copy previous results:
+                  l_map[0] |= mask_init;
+                  for(unsigned int i = 0; i <= UCHAR_MAX; ++i)
+                  {
+                     if(rep->_map[i] & mask_any)
+                        l_map[i] |= mask;
+                  }
+               }
+               if(pnull)
+               {
+                  if(rep->can_be_null & mask_any)
+                     *pnull |= mask;
+               }
+            }
+            else
+            {
+               // we haven't created a startmap for this alternative yet
+               // so take the union of the two options:
+               if(is_bad_repeat(state))
+               {
+                  set_all_masks(l_map, mask);
+                  if(pnull)
+                     *pnull |= mask;
+                  return;
+               }
+               set_bad_repeat(state);
+               create_startmap(state->next.p, l_map, pnull, mask);
+               if((state->type == syntax_element_alt)
+                  || (static_cast<re_repeat*>(state)->min == 0)
+                  || (not_last_jump == 0))
+                  create_startmap(rep->alt.p, l_map, pnull, mask);
+            }
+         }
+         return;
+      case syntax_element_soft_buffer_end:
+         // match newline or null:
+         if(l_map)
+         {
+            l_map[0] |= mask_init;
+            l_map['\n'] |= mask;
+            l_map['\r'] |= mask;
+         }
+         if(pnull)
+            *pnull |= mask;
+         return;
+      case syntax_element_endmark:
+         // need to handle independent subs as a special case:
+         if(static_cast<re_brace*>(state)->index < 0)
+         {
+            // can be null, any character can match:
+            set_all_masks(l_map, mask);
+            if(pnull)
+               *pnull |= mask;
+            return;
+         }
+         else
+         {
+            state = state->next.p;
+            break;
+         }
+
+      case syntax_element_startmark:
+         // need to handle independent subs as a special case:
+         if(static_cast<re_brace*>(state)->index == -3)
+         {
+            state = state->next.p->next.p;
+            break;
+         }
+         // otherwise fall through:
+      default:
+         state = state->next.p;
+      }
+      ++not_last_jump;
+   }
+}
+
+template <class charT, class traits>
+unsigned basic_regex_creator<charT, traits>::get_restart_type(re_syntax_base* state)
+{
+   //
+   // find out how the machine starts, so we can optimise the search:
+   //
+   while(state)
+   {
+      switch(state->type)
+      {
+      case syntax_element_startmark:
+      case syntax_element_endmark:
+         state = state->next.p;
+         continue;
+      case syntax_element_start_line:
+         return regbase::restart_line;
+      case syntax_element_word_start:
+         return regbase::restart_word;
+      case syntax_element_buffer_start:
+         return regbase::restart_buf;
+      case syntax_element_restart_continue:
+         return regbase::restart_continue;
+      default:
+         state = 0;
+         continue;
+      }
+   }
+   return regbase::restart_any;
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::set_all_masks(unsigned char* bits, unsigned char mask)
+{
+   //
+   // set mask in all of bits elements, 
+   // if bits[0] has mask_init not set then we can 
+   // optimise this to a call to memset:
+   //
+   if(bits)
+   {
+      if(bits[0] == 0)
+         (std::memset)(bits, mask, 1u << CHAR_BIT);
+      else
+      {
+         for(unsigned i = 0; i < (1u << CHAR_BIT); ++i)
+            bits[i] |= mask;
+      }
+      bits[0] |= mask_init;
+   }
+}
+
+template <class charT, class traits>
+bool basic_regex_creator<charT, traits>::is_bad_repeat(re_syntax_base* pt)
+{
+   switch(pt->type)
+   {
+   case syntax_element_rep:
+   case syntax_element_dot_rep:
+   case syntax_element_char_rep:
+   case syntax_element_short_set_rep:
+   case syntax_element_long_set_rep:
+      {
+         unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
+         if(state_id > sizeof(m_bad_repeats) * CHAR_BIT)
+            return true;  // run out of bits, assume we can't traverse this one.
+         static const boost::uintmax_t one = 1uL;
+         return m_bad_repeats & (one << state_id);
+      }
+   default:
+      return false;
+   }
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::set_bad_repeat(re_syntax_base* pt)
+{
+   switch(pt->type)
+   {
+   case syntax_element_rep:
+   case syntax_element_dot_rep:
+   case syntax_element_char_rep:
+   case syntax_element_short_set_rep:
+   case syntax_element_long_set_rep:
+      {
+         unsigned state_id = static_cast<re_repeat*>(pt)->state_id;
+         static const boost::uintmax_t one = 1uL;
+         if(state_id <= sizeof(m_bad_repeats) * CHAR_BIT)
+            m_bad_repeats |= (one << state_id);
+      }
+   default:
+      break;
+   }
+}
+
+template <class charT, class traits>
+syntax_element_type basic_regex_creator<charT, traits>::get_repeat_type(re_syntax_base* state)
+{
+   typedef typename traits::char_class_type mask_type;
+   if(state->type == syntax_element_rep)
+   {
+      // check to see if we are repeating a single state:
+      if(state->next.p->next.p->next.p == static_cast<re_alt*>(state)->alt.p)
+      {
+         switch(state->next.p->type)
+         {
+         case re_detail::syntax_element_wild:
+            return re_detail::syntax_element_dot_rep;
+         case re_detail::syntax_element_literal:
+            return re_detail::syntax_element_char_rep;
+         case re_detail::syntax_element_set:
+            return re_detail::syntax_element_short_set_rep;
+         case re_detail::syntax_element_long_set:
+            if(static_cast<re_detail::re_set_long<mask_type>*>(state->next.p)->singleton)
+               return re_detail::syntax_element_long_set_rep;
+            break;
+         default:
+            break;
+         }
+      }
+   }
+   return state->type;
+}
+
+template <class charT, class traits>
+void basic_regex_creator<charT, traits>::probe_leading_repeat(re_syntax_base* state)
+{
+   // enumerate our states, and see if we have a leading repeat 
+   // for which failed search restarts can be optimised;
+   do
+   {
+      switch(state->type)
+      {
+      case syntax_element_startmark:
+         if(static_cast<re_brace*>(state)->index >= 0)
+         {
+            state = state->next.p;
+            continue;
+         }
+         if((static_cast<re_brace*>(state)->index == -1)
+            || (static_cast<re_brace*>(state)->index == -2))
+         {
+            // skip past the zero width assertion:
+            state = static_cast<const re_jump*>(state->next.p)->alt.p->next.p;
+            continue;
+         }
+         if(static_cast<re_brace*>(state)->index == -3)
+         {
+            // Have to skip the leading jump state:
+            state = state->next.p->next.p;
+            continue;
+         }
+         return;
+      case syntax_element_endmark:
+      case syntax_element_start_line:
+      case syntax_element_end_line:
+      case syntax_element_word_boundary:
+      case syntax_element_within_word:
+      case syntax_element_word_start:
+      case syntax_element_word_end:
+      case syntax_element_buffer_start:
+      case syntax_element_buffer_end:
+      case syntax_element_restart_continue:
+         state = state->next.p;
+         break;
+      case syntax_element_dot_rep:
+      case syntax_element_char_rep:
+      case syntax_element_short_set_rep:
+      case syntax_element_long_set_rep:
+         if(this->m_has_backrefs == 0)
+            static_cast<re_repeat*>(state)->leading = true;
+         // fall through:
+      default:
+         return;
+      }
+   }while(state);
+}
+
+
+} // namespace re_detail
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/basic_regex_parser.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2140 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         basic_regex_parser.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class basic_regex_parser.
+  */
+
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
+#define BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4244 4800)
+#endif
+
+template <class charT, class traits>
+class basic_regex_parser : public basic_regex_creator<charT, traits>
+{
+public:
+   basic_regex_parser(regex_data<charT, traits>* data);
+   void parse(const charT* p1, const charT* p2, unsigned flags);
+   void fail(regex_constants::error_type error_code, std::ptrdiff_t position);
+
+   bool parse_all();
+   bool parse_basic();
+   bool parse_extended();
+   bool parse_literal();
+   bool parse_open_paren();
+   bool parse_basic_escape();
+   bool parse_extended_escape();
+   bool parse_match_any();
+   bool parse_repeat(std::size_t low = 0, std::size_t high = (std::numeric_limits<std::size_t>::max)());
+   bool parse_repeat_range(bool isbasic);
+   bool parse_alt();
+   bool parse_set();
+   bool parse_backref();
+   void parse_set_literal(basic_char_set<charT, traits>& char_set);
+   bool parse_inner_set(basic_char_set<charT, traits>& char_set);
+   bool parse_QE();
+   bool parse_perl_extension();
+   bool add_emacs_code(bool negate);
+   bool unwind_alts(std::ptrdiff_t last_paren_start);
+   digraph<charT> get_next_set_literal(basic_char_set<charT, traits>& char_set);
+   charT unescape_character();
+   regex_constants::syntax_option_type parse_options();
+
+private:
+   typedef bool (basic_regex_parser::*parser_proc_type)();
+   typedef typename traits::string_type string_type;
+   typedef typename traits::char_class_type char_class_type;
+   parser_proc_type           m_parser_proc;    // the main parser to use
+   const charT*               m_base;           // the start of the string being parsed
+   const charT*               m_end;            // the end of the string being parsed
+   const charT*               m_position;       // our current parser position
+   unsigned                   m_mark_count;     // how many sub-expressions we have
+   std::ptrdiff_t             m_paren_start;    // where the last seen ')' began (where repeats are inserted).
+   std::ptrdiff_t             m_alt_insert_point; // where to insert the next alternative
+   bool                       m_has_case_change; // true if somewhere in the current block the case has changed
+#if defined(BOOST_MSVC) && defined(_M_IX86)
+   // This is an ugly warning suppression workaround (for warnings *inside* std::vector
+   // that can not otherwise be suppressed)...
+   BOOST_STATIC_ASSERT(sizeof(long) >= sizeof(void*));
+   std::vector<long>           m_alt_jumps;      // list of alternative in the current scope.
+#else
+   std::vector<std::ptrdiff_t> m_alt_jumps;      // list of alternative in the current scope.
+#endif
+
+   basic_regex_parser& operator=(const basic_regex_parser&);
+   basic_regex_parser(const basic_regex_parser&);
+};
+
+template <class charT, class traits>
+basic_regex_parser<charT, traits>::basic_regex_parser(regex_data<charT, traits>* data)
+   : basic_regex_creator<charT, traits>(data), m_mark_count(0), m_paren_start(0), m_alt_insert_point(0), m_has_case_change(false)
+{
+}
+
+template <class charT, class traits>
+void basic_regex_parser<charT, traits>::parse(const charT* p1, const charT* p2, unsigned l_flags)
+{
+   // pass l_flags on to base class:
+   this->init(l_flags);
+   // set up pointers:
+   m_position = m_base = p1;
+   m_end = p2;
+   // empty strings are errors:
+   if((p1 == p2) && 
+      (
+         ((l_flags & regbase::main_option_type) != regbase::perl_syntax_group)
+         || (l_flags & regbase::no_empty_expressions)
+      )
+     )
+   {
+      fail(regex_constants::error_empty, 0);
+      return;
+   }
+   // select which parser to use:
+   switch(l_flags & regbase::main_option_type)
+   {
+   case regbase::perl_syntax_group:
+      m_parser_proc = &basic_regex_parser<charT, traits>::parse_extended;
+      break;
+   case regbase::basic_syntax_group:
+      m_parser_proc = &basic_regex_parser<charT, traits>::parse_basic;
+      break;
+   case regbase::literal:
+      m_parser_proc = &basic_regex_parser<charT, traits>::parse_literal;
+      break;
+   }
+
+   // parse all our characters:
+   bool result = parse_all();
+   //
+   // Unwind our alternatives:
+   //
+   unwind_alts(-1);
+   // reset l_flags as a global scope (?imsx) may have altered them:
+   this->flags(l_flags);
+   // if we haven't gobbled up all the characters then we must
+   // have had an unexpected ')' :
+   if(!result)
+   {
+      fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_position));
+      return;
+   }
+   // if an error has been set then give up now:
+   if(this->m_pdata->m_status)
+      return;
+   // fill in our sub-expression count:
+   this->m_pdata->m_mark_count = 1 + m_mark_count;
+   this->finalize(p1, p2);
+}
+
+template <class charT, class traits>
+void basic_regex_parser<charT, traits>::fail(regex_constants::error_type error_code, std::ptrdiff_t position)
+{
+   if(0 == this->m_pdata->m_status) // update the error code if not already set
+      this->m_pdata->m_status = error_code;
+   m_position = m_end; // don't bother parsing anything else
+   // get the error message:
+   std::string message = this->m_pdata->m_ptraits->error_string(error_code);
+   // and raise the exception, this will do nothing if exceptions are disabled:
+#ifndef BOOST_NO_EXCEPTIONS
+   if(0 == (this->flags() & regex_constants::no_except))
+   {
+      boost::regex_error e(message, error_code, position);
+      e.raise();
+   }
+#else
+   (void)position; // suppress warnings.
+#endif
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_all()
+{
+   bool result = true;
+   while(result && (m_position != m_end))
+   {
+      result = (this->*m_parser_proc)();
+   }
+   return result;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4702)
+#endif
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_basic()
+{
+   switch(this->m_traits.syntax_type(*m_position))
+   {
+   case regex_constants::syntax_escape:
+      return parse_basic_escape();
+   case regex_constants::syntax_dot:
+      return parse_match_any();
+   case regex_constants::syntax_caret:
+      ++m_position;
+      this->append_state(syntax_element_start_line);
+      break;
+   case regex_constants::syntax_dollar:
+      ++m_position;
+      this->append_state(syntax_element_end_line);
+      break;
+   case regex_constants::syntax_star:
+      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line))
+         return parse_literal();
+      else
+      {
+         ++m_position;
+         return parse_repeat();
+      }
+   case regex_constants::syntax_plus:
+      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
+         return parse_literal();
+      else
+      {
+         ++m_position;
+         return parse_repeat(1);
+      }
+   case regex_constants::syntax_question:
+      if(!(this->m_last_state) || (this->m_last_state->type == syntax_element_start_line) || !(this->flags() & regbase::emacs_ex))
+         return parse_literal();
+      else
+      {
+         ++m_position;
+         return parse_repeat(0, 1);
+      }
+   case regex_constants::syntax_open_set:
+      return parse_set();
+   case regex_constants::syntax_newline:
+      if(this->flags() & regbase::newline_alt)
+         return parse_alt();
+      else
+         return parse_literal();
+   default:
+      return parse_literal();
+   }
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_extended()
+{
+   bool result = true;
+   switch(this->m_traits.syntax_type(*m_position))
+   {
+   case regex_constants::syntax_open_mark:
+      return parse_open_paren();
+   case regex_constants::syntax_close_mark:
+      return false;
+   case regex_constants::syntax_escape:
+      return parse_extended_escape();
+   case regex_constants::syntax_dot:
+      return parse_match_any();
+   case regex_constants::syntax_caret:
+      ++m_position;
+      this->append_state(
+         (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_start : syntax_element_start_line));
+      break;
+   case regex_constants::syntax_dollar:
+      ++m_position;
+      this->append_state(
+         (this->flags() & regex_constants::no_mod_m ? syntax_element_buffer_end : syntax_element_end_line));
+      break;
+   case regex_constants::syntax_star:
+      if(m_position == this->m_base)
+      {
+         fail(regex_constants::error_badrepeat, 0);
+         return false;
+      }
+      ++m_position;
+      return parse_repeat();
+   case regex_constants::syntax_question:
+      if(m_position == this->m_base)
+      {
+         fail(regex_constants::error_badrepeat, 0);
+         return false;
+      }
+      ++m_position;
+      return parse_repeat(0,1);
+   case regex_constants::syntax_plus:
+      if(m_position == this->m_base)
+      {
+         fail(regex_constants::error_badrepeat, 0);
+         return false;
+      }
+      ++m_position;
+      return parse_repeat(1);
+   case regex_constants::syntax_open_brace:
+      ++m_position;
+      return parse_repeat_range(false);
+   case regex_constants::syntax_close_brace:
+      fail(regex_constants::error_brace, this->m_position - this->m_end);
+      return false;
+   case regex_constants::syntax_or:
+      return parse_alt();
+   case regex_constants::syntax_open_set:
+      return parse_set();
+   case regex_constants::syntax_newline:
+      if(this->flags() & regbase::newline_alt)
+         return parse_alt();
+      else
+         return parse_literal();
+   case regex_constants::syntax_hash:
+      //
+      // If we have a mod_x flag set, then skip until
+      // we get to a newline character:
+      //
+      if((this->flags() 
+         & (regbase::no_perl_ex|regbase::mod_x))
+         == regbase::mod_x)
+      {
+         while((m_position != m_end) && !is_separator(*m_position++)){}
+         return true;
+      }
+      // Otherwise fall through:
+   default:
+      result = parse_literal();
+      break;
+   }
+   return result;
+}
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_literal()
+{
+   // append this as a literal provided it's not a space character
+   // or the perl option regbase::mod_x is not set:
+   if(
+      ((this->flags() 
+         & (regbase::main_option_type|regbase::mod_x|regbase::no_perl_ex)) 
+            != regbase::mod_x)
+      || !this->m_traits.isctype(*m_position, this->m_mask_space))
+         this->append_literal(*m_position);
+   ++m_position;
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_open_paren()
+{
+   //
+   // skip the '(' and error check:
+   //
+   if(++m_position == m_end)
+   {
+      fail(regex_constants::error_paren, m_position - m_base);
+      return false;
+   }
+   //
+   // begin by checking for a perl-style (?...) extension:
+   //
+   if(
+         ((this->flags() & (regbase::main_option_type | regbase::no_perl_ex)) == 0)
+         || ((this->flags() & (regbase::main_option_type | regbase::emacs_ex)) == (regbase::basic_syntax_group|regbase::emacs_ex))
+     )
+   {
+      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
+         return parse_perl_extension();
+   }
+   //
+   // update our mark count, and append the required state:
+   //
+   unsigned markid = 0;
+   if(0 == (this->flags() & regbase::nosubs))
+   {
+      markid = ++m_mark_count;
+      if(this->flags() & regbase::save_subexpression_location)
+         this->m_pdata->m_subs.push_back(std::pair<std::size_t, std::size_t>(std::distance(m_base, m_position) - 1, 0));
+   }
+   re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
+   pb->index = markid;
+   std::ptrdiff_t last_paren_start = this->getoffset(pb);
+   // back up insertion point for alternations, and set new point:
+   std::ptrdiff_t last_alt_point = m_alt_insert_point;
+   this->m_pdata->m_data.align();
+   m_alt_insert_point = this->m_pdata->m_data.size();
+   //
+   // back up the current flags in case we have a nested (?imsx) group:
+   //
+   regex_constants::syntax_option_type opts = this->flags();
+   bool old_case_change = m_has_case_change;
+   m_has_case_change = false; // no changes to this scope as yet...
+   //
+   // now recursively add more states, this will terminate when we get to a
+   // matching ')' :
+   //
+   parse_all();
+   //
+   // Unwind pushed alternatives:
+   //
+   if(0 == unwind_alts(last_paren_start))
+      return false;
+   //
+   // restore flags:
+   //
+   if(m_has_case_change)
+   {
+      // the case has changed in one or more of the alternatives
+      // within the scoped (...) block: we have to add a state
+      // to reset the case sensitivity:
+      static_cast<re_case*>(
+         this->append_state(syntax_element_toggle_case, sizeof(re_case))
+         )->icase = opts & regbase::icase;
+   }
+   this->flags(opts);
+   m_has_case_change = old_case_change;
+   //
+   // we either have a ')' or we have run out of characters prematurely:
+   //
+   if(m_position == m_end)
+   {
+      this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
+      return false;
+   }
+   BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
+   if(markid && (this->flags() & regbase::save_subexpression_location))
+      this->m_pdata->m_subs.at(markid - 1).second = std::distance(m_base, m_position);
+   ++m_position;
+   //
+   // append closing parenthesis state:
+   //
+   pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
+   pb->index = markid;
+   this->m_paren_start = last_paren_start;
+   //
+   // restore the alternate insertion point:
+   //
+   this->m_alt_insert_point = last_alt_point;
+   //
+   // allow backrefs to this mark:
+   //
+   if((markid > 0) && (markid < sizeof(unsigned) * CHAR_BIT))
+      this->m_backrefs |= 1u << (markid - 1);
+
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_basic_escape()
+{
+   ++m_position;
+   bool result = true;
+   switch(this->m_traits.escape_syntax_type(*m_position))
+   {
+   case regex_constants::syntax_open_mark:
+      return parse_open_paren();
+   case regex_constants::syntax_close_mark:
+      return false;
+   case regex_constants::syntax_plus:
+      if(this->flags() & regex_constants::bk_plus_qm)
+      {
+         ++m_position;
+         return parse_repeat(1);
+      }
+      else
+         return parse_literal();
+   case regex_constants::syntax_question:
+      if(this->flags() & regex_constants::bk_plus_qm)
+      {
+         ++m_position;
+         return parse_repeat(0, 1);
+      }
+      else
+         return parse_literal();
+   case regex_constants::syntax_open_brace:
+      if(this->flags() & regbase::no_intervals)
+         return parse_literal();
+      ++m_position;
+      return parse_repeat_range(true);
+   case regex_constants::syntax_close_brace:
+      if(this->flags() & regbase::no_intervals)
+         return parse_literal();
+      fail(regex_constants::error_brace, this->m_position - this->m_base);
+      return false;
+   case regex_constants::syntax_or:
+      if(this->flags() & regbase::bk_vbar)
+         return parse_alt();
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::syntax_digit:
+      return parse_backref();
+   case regex_constants::escape_type_start_buffer:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_buffer_start);
+      }
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::escape_type_end_buffer:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_buffer_end);
+      }
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::escape_type_word_assert:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_word_boundary);
+      }
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::escape_type_not_word_assert:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_within_word);
+      }
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::escape_type_left_word:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_word_start);
+      }
+      else
+         result = parse_literal();
+      break;
+   case regex_constants::escape_type_right_word:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         ++m_position;
+         this->append_state(syntax_element_word_end);
+      }
+      else
+         result = parse_literal();
+      break;
+   default:
+      if(this->flags() & regbase::emacs_ex)
+      {
+         bool negate = true;
+         switch(*m_position)
+         {
+         case 'w':
+            negate = false;
+            // fall through:
+         case 'W':
+            {
+            basic_char_set<charT, traits> char_set;
+            if(negate)
+               char_set.negate();
+            char_set.add_class(this->m_word_mask);
+            if(0 == this->append_set(char_set))
+            {
+               fail(regex_constants::error_ctype, m_position - m_base);
+               return false;
+            }
+            ++m_position;
+            return true;
+            }
+         case 's':
+            negate = false;
+            // fall through:
+         case 'S':
+            return add_emacs_code(negate);
+         case 'c':
+         case 'C':
+            // not supported yet:
+            fail(regex_constants::error_escape, m_position - m_base);
+            return false;
+         default:
+            break;
+         }
+      }
+      result = parse_literal();
+      break;
+   }
+   return result;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_extended_escape()
+{
+   ++m_position;
+   bool negate = false; // in case this is a character class escape: \w \d etc
+   switch(this->m_traits.escape_syntax_type(*m_position))
+   {
+   case regex_constants::escape_type_not_class:
+      negate = true;
+      // fall through:
+   case regex_constants::escape_type_class:
+      {
+         typedef typename traits::char_class_type mask_type;
+         mask_type m = this->m_traits.lookup_classname(m_position, m_position+1);
+         if(m != 0)
+         {
+            basic_char_set<charT, traits> char_set;
+            if(negate)
+               char_set.negate();
+            char_set.add_class(m);
+            if(0 == this->append_set(char_set))
+            {
+               fail(regex_constants::error_ctype, m_position - m_base);
+               return false;
+            }
+            ++m_position;
+            return true;
+         }
+         //
+         // not a class, just a regular unknown escape:
+         //
+         this->append_literal(unescape_character());
+         break;
+      }
+   case regex_constants::syntax_digit:
+      return parse_backref();
+   case regex_constants::escape_type_left_word:
+      ++m_position;
+      this->append_state(syntax_element_word_start);
+      break;
+   case regex_constants::escape_type_right_word:
+      ++m_position;
+      this->append_state(syntax_element_word_end);
+      break;
+   case regex_constants::escape_type_start_buffer:
+      ++m_position;
+      this->append_state(syntax_element_buffer_start);
+      break;
+   case regex_constants::escape_type_end_buffer:
+      ++m_position;
+      this->append_state(syntax_element_buffer_end);
+      break;
+   case regex_constants::escape_type_word_assert:
+      ++m_position;
+      this->append_state(syntax_element_word_boundary);
+      break;
+   case regex_constants::escape_type_not_word_assert:
+      ++m_position;
+      this->append_state(syntax_element_within_word);
+      break;
+   case regex_constants::escape_type_Z:
+      ++m_position;
+      this->append_state(syntax_element_soft_buffer_end);
+      break;
+   case regex_constants::escape_type_Q:
+      return parse_QE();
+   case regex_constants::escape_type_C:
+      return parse_match_any();
+   case regex_constants::escape_type_X:
+      ++m_position;
+      this->append_state(syntax_element_combining);
+      break;
+   case regex_constants::escape_type_G:
+      ++m_position;
+      this->append_state(syntax_element_restart_continue);
+      break;
+   case regex_constants::escape_type_not_property:
+      negate = true;
+      // fall through:
+   case regex_constants::escape_type_property:
+      {
+         ++m_position;
+         char_class_type m;
+         if(m_position == m_end)
+         {
+            fail(regex_constants::error_escape, m_position - m_base);
+            return false;
+         }
+         // maybe have \p{ddd}
+         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
+         {
+            const charT* base = m_position;
+            // skip forward until we find enclosing brace:
+            while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
+               ++m_position;
+            if(m_position == m_end)
+            {
+               fail(regex_constants::error_escape, m_position - m_base);
+               return false;
+            }
+            m = this->m_traits.lookup_classname(++base, m_position++);
+         }
+         else
+         {
+            m = this->m_traits.lookup_classname(m_position, m_position+1);
+            ++m_position;
+         }
+         if(m != 0)
+         {
+            basic_char_set<charT, traits> char_set;
+            if(negate)
+               char_set.negate();
+            char_set.add_class(m);
+            if(0 == this->append_set(char_set))
+            {
+               fail(regex_constants::error_ctype, m_position - m_base);
+               return false;
+            }
+            return true;
+         }
+         fail(regex_constants::error_ctype, m_position - m_base);
+      }
+   default:
+      this->append_literal(unescape_character());
+      break;
+   }
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_match_any()
+{
+   //
+   // we have a '.' that can match any character:
+   //
+   ++m_position;
+   static_cast<re_dot*>(
+      this->append_state(syntax_element_wild, sizeof(re_dot))
+      )->mask = static_cast<unsigned char>(this->flags() & regbase::no_mod_s 
+      ? re_detail::force_not_newline 
+         : this->flags() & regbase::mod_s ?
+            re_detail::force_newline : re_detail::dont_care);
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_repeat(std::size_t low, std::size_t high)
+{
+   bool greedy = true;
+   std::size_t insert_point;
+   // 
+   // when we get to here we may have a non-greedy ? mark still to come:
+   //
+   if((m_position != m_end) 
+      && (
+            (0 == (this->flags() & (regbase::main_option_type | regbase::no_perl_ex)))
+            || ((regbase::basic_syntax_group|regbase::emacs_ex) == (this->flags() & (regbase::main_option_type | regbase::emacs_ex)))
+         )
+      )
+   {
+      // OK we have a perl regex, check for a '?':
+      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_question)
+      {
+         greedy = false;
+         ++m_position;
+      }
+   }
+   if(0 == this->m_last_state)
+   {
+      fail(regex_constants::error_badrepeat, ::boost::re_detail::distance(m_base, m_position));
+      return false;
+   }
+   if(this->m_last_state->type == syntax_element_endmark)
+   {
+      // insert a repeat before the '(' matching the last ')':
+      insert_point = this->m_paren_start;
+   }
+   else if((this->m_last_state->type == syntax_element_literal) && (static_cast<re_literal*>(this->m_last_state)->length > 1))
+   {
+      // the last state was a literal with more than one character, split it in two:
+      re_literal* lit = static_cast<re_literal*>(this->m_last_state);
+      charT c = (static_cast<charT*>(static_cast<void*>(lit+1)))[lit->length - 1];
+      --(lit->length);
+      // now append new state:
+      lit = static_cast<re_literal*>(this->append_state(syntax_element_literal, sizeof(re_literal) + sizeof(charT)));
+      lit->length = 1;
+      (static_cast<charT*>(static_cast<void*>(lit+1)))[0] = c;
+      insert_point = this->getoffset(this->m_last_state);
+   }
+   else
+   {
+      // repeat the last state whatever it was, need to add some error checking here:
+      switch(this->m_last_state->type)
+      {
+      case syntax_element_start_line:
+      case syntax_element_end_line:
+      case syntax_element_word_boundary:
+      case syntax_element_within_word:
+      case syntax_element_word_start:
+      case syntax_element_word_end:
+      case syntax_element_buffer_start:
+      case syntax_element_buffer_end:
+      case syntax_element_alt:
+      case syntax_element_soft_buffer_end:
+      case syntax_element_restart_continue:
+      case syntax_element_jump:
+      case syntax_element_startmark:
+      case syntax_element_backstep:
+         // can't legally repeat any of the above:
+         fail(regex_constants::error_badrepeat, m_position - m_base);
+         return false;
+      default:
+         // do nothing...
+         break;
+      }
+      insert_point = this->getoffset(this->m_last_state);
+   }
+   //
+   // OK we now know what to repeat, so insert the repeat around it:
+   //
+   re_repeat* rep = static_cast<re_repeat*>(this->insert_state(insert_point, syntax_element_rep, re_repeater_size));
+   rep->min = low;
+   rep->max = high;
+   rep->greedy = greedy;
+   rep->leading = false;
+   // store our repeater position for later:
+   std::ptrdiff_t rep_off = this->getoffset(rep);
+   // and append a back jump to the repeat:
+   re_jump* jmp = static_cast<re_jump*>(this->append_state(syntax_element_jump, sizeof(re_jump)));
+   jmp->alt.i = rep_off - this->getoffset(jmp);
+   this->m_pdata->m_data.align();
+   // now fill in the alt jump for the repeat:
+   rep = static_cast<re_repeat*>(this->getaddress(rep_off));
+   rep->alt.i = this->m_pdata->m_data.size() - rep_off;
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_repeat_range(bool isbasic)
+{
+   //
+   // parse a repeat-range:
+   //
+   std::size_t min, max;
+   int v;
+   // skip whitespace:
+   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
+      ++m_position;
+   // fail if at end:
+   if(this->m_position == this->m_end)
+   {
+      fail(regex_constants::error_brace, this->m_position - this->m_base);
+      return false;
+   }
+   // get min:
+   v = this->m_traits.toi(m_position, m_end, 10);
+   // skip whitespace:
+   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
+      ++m_position;
+   if(v < 0)
+   {
+      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
+      return false;
+   }
+   else if(this->m_position == this->m_end)
+   {
+      fail(regex_constants::error_brace, this->m_position - this->m_base);
+      return false;
+   }
+   min = v;
+   // see if we have a comma:
+   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_comma)
+   {
+      // move on and error check:
+      ++m_position;
+      // skip whitespace:
+      while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
+         ++m_position;
+      if(this->m_position == this->m_end)
+      {
+         fail(regex_constants::error_brace, this->m_position - this->m_base);
+         return false;
+      }
+      // get the value if any:
+      v = this->m_traits.toi(m_position, m_end, 10);
+      max = (v >= 0) ? v : (std::numeric_limits<std::size_t>::max)();
+   }
+   else
+   {
+      // no comma, max = min:
+      max = min;
+   }
+   // skip whitespace:
+   while((m_position != m_end) && this->m_traits.isctype(*m_position, this->m_mask_space))
+      ++m_position;
+   // OK now check trailing }:
+   if(this->m_position == this->m_end)
+   {
+      fail(regex_constants::error_brace, this->m_position - this->m_base);
+      return false;
+   }
+   if(isbasic)
+   {
+      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_escape)
+      {
+         ++m_position;
+         if(this->m_position == this->m_end)
+         {
+            fail(regex_constants::error_brace, this->m_position - this->m_base);
+            return false;
+         }
+      }
+      else
+      {
+         fail(regex_constants::error_badbrace, this->m_position - this->m_base);
+         return false;
+      }
+   }
+   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_brace)
+      ++m_position;
+   else
+   {
+      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
+      return false;
+   }
+   //
+   // finally go and add the repeat, unless error:
+   //
+   if(min > max)
+   {
+      fail(regex_constants::error_badbrace, this->m_position - this->m_base);
+      return false;
+   }
+   return parse_repeat(min, max);
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_alt()
+{
+   //
+   // error check: if there have been no previous states,
+   // or if the last state was a '(' then error:
+   //
+   if(
+      ((this->m_last_state == 0) || (this->m_last_state->type == syntax_element_startmark))
+      &&
+      !(
+         ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
+           &&
+         ((this->flags() & regbase::no_empty_expressions) == 0)
+        )
+      )
+   {
+      fail(regex_constants::error_empty, this->m_position - this->m_base);
+      return false;
+   }
+   ++m_position;
+   //
+   // we need to append a trailing jump: 
+   //
+   re_syntax_base* pj = this->append_state(re_detail::syntax_element_jump, sizeof(re_jump));
+   std::ptrdiff_t jump_offset = this->getoffset(pj);
+   //
+   // now insert the alternative:
+   //
+   re_alt* palt = static_cast<re_alt*>(this->insert_state(this->m_alt_insert_point, syntax_element_alt, re_alt_size));
+   jump_offset += re_alt_size;
+   this->m_pdata->m_data.align();
+   palt->alt.i = this->m_pdata->m_data.size() - this->getoffset(palt);
+   //
+   // update m_alt_insert_point so that the next alternate gets
+   // inserted at the start of the second of the two we've just created:
+   //
+   this->m_alt_insert_point = this->m_pdata->m_data.size();
+   //
+   // the start of this alternative must have a case changes state
+   // if the current block has messed around with case changes:
+   //
+   if(m_has_case_change)
+   {
+      static_cast<re_case*>(
+         this->append_state(syntax_element_toggle_case, sizeof(re_case))
+         )->icase = this->m_icase;
+   }
+   //
+   // push the alternative onto our stack, a recursive
+   // implementation here is easier to understand (and faster
+   // as it happens), but causes all kinds of stack overflow problems
+   // on programs with small stacks (COM+).
+   //
+   m_alt_jumps.push_back(jump_offset);
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_set()
+{
+   ++m_position;
+   if(m_position == m_end)
+   {
+      fail(regex_constants::error_brack, m_position - m_base);
+      return false;
+   }
+   basic_char_set<charT, traits> char_set;
+
+   const charT* base = m_position;  // where the '[' was
+   const charT* item_base = m_position;  // where the '[' or '^' was
+
+   while(m_position != m_end)
+   {
+      switch(this->m_traits.syntax_type(*m_position))
+      {
+      case regex_constants::syntax_caret:
+         if(m_position == base)
+         {
+            char_set.negate();
+            ++m_position;
+            item_base = m_position;
+         }
+         else
+            parse_set_literal(char_set);
+         break;
+      case regex_constants::syntax_close_set:
+         if(m_position == item_base)
+         {
+            parse_set_literal(char_set);
+            break;
+         }
+         else
+         {
+            ++m_position;
+            if(0 == this->append_set(char_set))
+            {
+               fail(regex_constants::error_range, m_position - m_base);
+               return false;
+            }
+         }
+         return true;
+      case regex_constants::syntax_open_set:
+         if(parse_inner_set(char_set))
+            break;
+         return true;
+      case regex_constants::syntax_escape:
+         {
+            // 
+            // look ahead and see if this is a character class shortcut
+            // \d \w \s etc...
+            //
+            ++m_position;
+            if(this->m_traits.escape_syntax_type(*m_position)
+               == regex_constants::escape_type_class)
+            {
+               char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
+               if(m != 0)
+               {
+                  char_set.add_class(m);
+                  ++m_position;
+                  break;
+               }
+            }
+            else if(this->m_traits.escape_syntax_type(*m_position)
+               == regex_constants::escape_type_not_class)
+            {
+               // negated character class:
+               char_class_type m = this->m_traits.lookup_classname(m_position, m_position+1);
+               if(m != 0)
+               {
+                  char_set.add_negated_class(m);
+                  ++m_position;
+                  break;
+               }
+            }
+            // not a character class, just a regular escape:
+            --m_position;
+            parse_set_literal(char_set);
+            break;
+         }
+      default:
+         parse_set_literal(char_set);
+         break;
+      }
+   }
+   return m_position != m_end;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_inner_set(basic_char_set<charT, traits>& char_set)
+{
+   //
+   // we have either a character class [:name:]
+   // a collating element [.name.]
+   // or an equivalence class [=name=]
+   //
+   if(m_end == ++m_position)
+   {
+      fail(regex_constants::error_brack, m_position - m_base);
+      return false;
+   }
+   switch(this->m_traits.syntax_type(*m_position))
+   {
+   case regex_constants::syntax_dot:
+      //
+      // a collating element is treated as a literal:
+      //
+      --m_position;
+      parse_set_literal(char_set);
+      return true;
+   case regex_constants::syntax_colon:
+      {
+      // check that character classes are actually enabled:
+      if((this->flags() & (regbase::main_option_type | regbase::no_char_classes)) 
+         == (regbase::basic_syntax_group  | regbase::no_char_classes))
+      {
+         --m_position;
+         parse_set_literal(char_set);
+         return true;
+      }
+      // skip the ':'
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      const charT* name_first = m_position;
+      // skip at least one character, then find the matching ':]'
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      while((m_position != m_end) 
+         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_colon)) 
+         ++m_position;
+      const charT* name_last = m_position;
+      if(m_end == m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      if((m_end == ++m_position) 
+         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      //
+      // check for negated class:
+      //
+      bool negated = false;
+      if(this->m_traits.syntax_type(*name_first) == regex_constants::syntax_caret)
+      {
+         ++name_first;
+         negated = true;
+      }
+      typedef typename traits::char_class_type mask_type;
+      mask_type m = this->m_traits.lookup_classname(name_first, name_last);
+      if(m == 0)
+      {
+         if(char_set.empty() && (name_last - name_first == 1))
+         {
+            // maybe a special case:
+            ++m_position;
+            if( (m_position != m_end) 
+               && (this->m_traits.syntax_type(*m_position) 
+                  == regex_constants::syntax_close_set))
+            {
+               if(this->m_traits.escape_syntax_type(*name_first) 
+                  == regex_constants::escape_type_left_word)
+               {
+                  ++m_position;
+                  this->append_state(syntax_element_word_start);
+                  return false;
+               }
+               if(this->m_traits.escape_syntax_type(*name_first) 
+                  == regex_constants::escape_type_right_word)
+               {
+                  ++m_position;
+                  this->append_state(syntax_element_word_end);
+                  return false;
+               }
+            }
+         }
+         fail(regex_constants::error_ctype, name_first - m_base);
+         return false;
+      }
+      if(negated == false)
+         char_set.add_class(m);
+      else
+         char_set.add_negated_class(m);
+      ++m_position;
+      break;
+   }
+   case regex_constants::syntax_equal:
+      {
+      // skip the '='
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      const charT* name_first = m_position;
+      // skip at least one character, then find the matching '=]'
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      while((m_position != m_end) 
+         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)) 
+         ++m_position;
+      const charT* name_last = m_position;
+      if(m_end == m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      if((m_end == ++m_position) 
+         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return false;
+      }
+      string_type m = this->m_traits.lookup_collatename(name_first, name_last);
+      if((0 == m.size()) || (m.size() > 2))
+      {
+         fail(regex_constants::error_collate, name_first - m_base);
+         return false;
+      }
+      digraph<charT> d;
+      d.first = m[0];
+      if(m.size() > 1)
+         d.second = m[1];
+      else
+         d.second = 0;
+      char_set.add_equivalent(d);
+      ++m_position;
+      break;
+   }
+   default:
+      --m_position;
+      parse_set_literal(char_set);
+      break;
+   }
+   return true;
+}
+
+template <class charT, class traits>
+void basic_regex_parser<charT, traits>::parse_set_literal(basic_char_set<charT, traits>& char_set)
+{
+   digraph<charT> start_range(get_next_set_literal(char_set));
+   if(m_end == m_position)
+   {
+      fail(regex_constants::error_brack, m_position - m_base);
+      return;
+   }
+   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
+   {
+      // we have a range:
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_brack, m_position - m_base);
+         return;
+      }
+      if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set)
+      {
+         digraph<charT> end_range = get_next_set_literal(char_set);
+         char_set.add_range(start_range, end_range);
+         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_dash)
+         {
+            if(m_end == ++m_position)
+            {
+               fail(regex_constants::error_brack, m_position - m_base);
+               return;
+            }
+            if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_set)
+            {
+               // trailing - :
+               --m_position;
+               return;
+            }
+            fail(regex_constants::error_range, m_position - m_base);
+            return;
+         }
+         return;
+      }
+      --m_position;
+   }
+   char_set.add_single(start_range);
+}
+
+template <class charT, class traits>
+digraph<charT> basic_regex_parser<charT, traits>::get_next_set_literal(basic_char_set<charT, traits>& char_set)
+{
+   digraph<charT> result;
+   switch(this->m_traits.syntax_type(*m_position))
+   {
+   case regex_constants::syntax_dash:
+      if(!char_set.empty())
+      {
+         // see if we are at the end of the set:
+         if((++m_position == m_end) || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
+         {
+            fail(regex_constants::error_range, m_position - m_base);
+            return result;
+         }
+         --m_position;
+      }
+      result.first = *m_position++;
+      return result;
+   case regex_constants::syntax_escape:
+      // check to see if escapes are supported first:
+      if(this->flags() & regex_constants::no_escape_in_lists)
+      {
+         result = *m_position++;
+         break;
+      }
+      ++m_position;
+      result = unescape_character();
+      break;
+   case regex_constants::syntax_open_set:
+   {
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_collate, m_position - m_base);
+         return result;
+      }
+      if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot)
+      {
+         --m_position;
+         result.first = *m_position;
+         ++m_position;
+         return result;
+      }
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_collate, m_position - m_base);
+         return result;
+      }
+      const charT* name_first = m_position;
+      // skip at least one character, then find the matching ':]'
+      if(m_end == ++m_position)
+      {
+         fail(regex_constants::error_collate, name_first - m_base);
+         return result;
+      }
+      while((m_position != m_end) 
+         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_dot)) 
+         ++m_position;
+      const charT* name_last = m_position;
+      if(m_end == m_position)
+      {
+         fail(regex_constants::error_collate, name_first - m_base);
+         return result;
+      }
+      if((m_end == ++m_position) 
+         || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_set))
+      {
+         fail(regex_constants::error_collate, name_first - m_base);
+         return result;
+      }
+      ++m_position;
+      string_type s = this->m_traits.lookup_collatename(name_first, name_last);
+      if(s.empty() || (s.size() > 2))
+      {
+         fail(regex_constants::error_collate, name_first - m_base);
+         return result;
+      }
+      result.first = s[0];
+      if(s.size() > 1)
+         result.second = s[1];
+      else
+         result.second = 0;
+      return result;
+   }
+   default:
+      result = *m_position++;
+   }
+   return result;
+}
+
+//
+// does a value fit in the specified charT type?
+//
+template <class charT>
+bool valid_value(charT, int v, const mpl::true_&)
+{
+   return (v >> (sizeof(charT) * CHAR_BIT)) == 0;
+}
+template <class charT>
+bool valid_value(charT, int, const mpl::false_&)
+{
+   return true; // v will alsways fit in a charT
+}
+template <class charT>
+bool valid_value(charT c, int v)
+{
+   return valid_value(c, v, mpl::bool_<(sizeof(charT) < sizeof(int))>());
+}
+
+template <class charT, class traits>
+charT basic_regex_parser<charT, traits>::unescape_character()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   charT result(0);
+   if(m_position == m_end)
+   {
+      fail(regex_constants::error_escape, m_position - m_base);
+      return false;
+   }
+   switch(this->m_traits.escape_syntax_type(*m_position))
+   {
+   case regex_constants::escape_type_control_a:
+      result = charT('\a');
+      break;
+   case regex_constants::escape_type_e:
+      result = charT(27);
+      break;
+   case regex_constants::escape_type_control_f:
+      result = charT('\f');
+      break;
+   case regex_constants::escape_type_control_n:
+      result = charT('\n');
+      break;
+   case regex_constants::escape_type_control_r:
+      result = charT('\r');
+      break;
+   case regex_constants::escape_type_control_t:
+      result = charT('\t');
+      break;
+   case regex_constants::escape_type_control_v:
+      result = charT('\v');
+      break;
+   case regex_constants::escape_type_word_assert:
+      result = charT('\b');
+      break;
+   case regex_constants::escape_type_ascii_control:
+      ++m_position;
+      if(m_position == m_end)
+      {
+         fail(regex_constants::error_escape, m_position - m_base);
+         return result;
+      }
+      /*
+      if((*m_position < charT('@'))
+            || (*m_position > charT(125)) )
+      {
+         fail(regex_constants::error_escape, m_position - m_base);
+         return result;
+      }
+      */
+      result = static_cast<charT>(*m_position % 32);
+      break;
+   case regex_constants::escape_type_hex:
+      ++m_position;
+      if(m_position == m_end)
+      {
+         fail(regex_constants::error_escape, m_position - m_base);
+         return result;
+      }
+      // maybe have \x{ddd}
+      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
+      {
+         ++m_position;
+         if(m_position == m_end)
+         {
+            fail(regex_constants::error_escape, m_position - m_base);
+            return result;
+         }
+         int i = this->m_traits.toi(m_position, m_end, 16);
+         if((m_position == m_end)
+            || (i < 0)
+            || ((std::numeric_limits<charT>::is_specialized) && (charT(i) > (std::numeric_limits<charT>::max)()))
+            || (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
+         {
+            fail(regex_constants::error_badbrace, m_position - m_base);
+            return result;
+         }
+         ++m_position;
+         result = charT(i);
+      }
+      else
+      {
+         std::ptrdiff_t len = (std::min)(static_cast<std::ptrdiff_t>(2), m_end - m_position);
+         int i = this->m_traits.toi(m_position, m_position + len, 16);
+         if((i < 0)
+            || !valid_value(charT(0), i))
+         {
+            fail(regex_constants::error_escape, m_position - m_base);
+            return result;
+         }
+         result = charT(i);
+      }
+      return result;
+   case regex_constants::syntax_digit:
+      {
+      // an octal escape sequence, the first character must be a zero
+      // followed by up to 3 octal digits:
+      std::ptrdiff_t len = (std::min)(::boost::re_detail::distance(m_position, m_end), static_cast<std::ptrdiff_t>(4));
+      const charT* bp = m_position;
+      int val = this->m_traits.toi(bp, bp + 1, 8);
+      if(val != 0)
+      {
+         // Oops not an octal escape after all:
+         fail(regex_constants::error_escape, m_position - m_base);
+         return result;
+      }
+      val = this->m_traits.toi(m_position, m_position + len, 8);
+      if(val < 0) 
+      {
+         fail(regex_constants::error_escape, m_position - m_base);
+         return result;
+      }
+      return static_cast<charT>(val);
+      }
+   case regex_constants::escape_type_named_char:
+      {
+         ++m_position;
+         if(m_position == m_end)
+         {
+            fail(regex_constants::error_escape, m_position - m_base);
+            return false;
+         }
+         // maybe have \N{name}
+         if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_open_brace)
+         {
+            const charT* base = m_position;
+            // skip forward until we find enclosing brace:
+            while((m_position != m_end) && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_brace))
+               ++m_position;
+            if(m_position == m_end)
+            {
+               fail(regex_constants::error_escape, m_position - m_base);
+               return false;
+            }
+            string_type s = this->m_traits.lookup_collatename(++base, m_position++);
+            if(s.empty())
+            {
+               fail(regex_constants::error_collate, m_position - m_base);
+               return false;
+            }
+            if(s.size() == 1)
+            {
+               return s[0];
+            }
+         }
+         // fall through is a failure:
+         fail(regex_constants::error_escape, m_position - m_base);
+         return false;
+      }
+   default:
+      result = *m_position;
+      break;
+   }
+   ++m_position;
+   return result;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_backref()
+{
+   BOOST_ASSERT(m_position != m_end);
+   const charT* pc = m_position;
+   int i = this->m_traits.toi(pc, pc + 1, 10);
+   if((i == 0) || (((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group) && (this->flags() & regbase::no_bk_refs)))
+   {
+      // not a backref at all but an octal escape sequence:
+      charT c = unescape_character();
+      this->append_literal(c);
+   }
+   else if((i > 0) && (this->m_backrefs & (1u << (i-1))))
+   {
+      m_position = pc;
+      re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_backref, sizeof(re_brace)));
+      pb->index = i;
+   }
+   else
+   {
+      fail(regex_constants::error_backref, m_position - m_end);
+      return false;
+   }
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_QE()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   //
+   // parse a \Q...\E sequence:
+   //
+   ++m_position; // skip the Q
+   const charT* start = m_position;
+   const charT* end;
+   do
+   {
+      while((m_position != m_end) 
+         && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_escape))
+         ++m_position;
+      if(m_position == m_end)
+      {
+         //  a \Q...\E sequence may terminate with the end of the expression:
+         end = m_position;
+         break;  
+      }
+      if(++m_position == m_end) // skip the escape
+      {
+         fail(regex_constants::error_escape, m_position - m_base);
+         return false;
+      }
+      // check to see if it's a \E:
+      if(this->m_traits.escape_syntax_type(*m_position) == regex_constants::escape_type_E)
+      {
+         ++m_position;
+         end = m_position - 2;
+         break;
+      }
+      // otherwise go round again:
+   }while(true);
+   //
+   // now add all the character between the two escapes as literals:
+   //
+   while(start != end)
+   {
+      this->append_literal(*start);
+      ++start;
+   }
+   return true;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::parse_perl_extension()
+{
+   if(++m_position == m_end)
+   {
+      fail(regex_constants::error_badrepeat, m_position - m_base);
+      return false;
+   }
+   //
+   // treat comments as a special case, as these
+   // are the only ones that don't start with a leading
+   // startmark state:
+   //
+   if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_hash)
+   {
+      while((m_position != m_end) 
+         && (this->m_traits.syntax_type(*m_position++) != regex_constants::syntax_close_mark))
+      {}      
+      return true;
+   }
+   //
+   // backup some state, and prepare the way:
+   //
+   int markid = 0;
+   std::ptrdiff_t jump_offset = 0;
+   re_brace* pb = static_cast<re_brace*>(this->append_state(syntax_element_startmark, sizeof(re_brace)));
+   std::ptrdiff_t last_paren_start = this->getoffset(pb);
+   // back up insertion point for alternations, and set new point:
+   std::ptrdiff_t last_alt_point = m_alt_insert_point;
+   this->m_pdata->m_data.align();
+   m_alt_insert_point = this->m_pdata->m_data.size();
+   std::ptrdiff_t expected_alt_point = m_alt_insert_point;
+   bool restore_flags = true;
+   regex_constants::syntax_option_type old_flags = this->flags();
+   bool old_case_change = m_has_case_change;
+   m_has_case_change = false;
+   //
+   // select the actual extension used:
+   //
+   switch(this->m_traits.syntax_type(*m_position))
+   {
+   case regex_constants::syntax_colon:
+      //
+      // a non-capturing mark:
+      //
+      pb->index = markid = 0;
+      ++m_position;
+      break;
+   case regex_constants::syntax_equal:
+      pb->index = markid = -1;
+      ++m_position;
+      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
+      this->m_pdata->m_data.align();
+      m_alt_insert_point = this->m_pdata->m_data.size();
+      break;
+   case regex_constants::syntax_not:
+      pb->index = markid = -2;
+      ++m_position;
+      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
+      this->m_pdata->m_data.align();
+      m_alt_insert_point = this->m_pdata->m_data.size();
+      break;
+   case regex_constants::escape_type_left_word:
+      {
+         // a lookbehind assertion:
+         if(++m_position == m_end)
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+         regex_constants::syntax_type t = this->m_traits.syntax_type(*m_position);
+         if(t == regex_constants::syntax_not)
+            pb->index = markid = -2;
+         else if(t == regex_constants::syntax_equal)
+            pb->index = markid = -1;
+         else
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+         ++m_position;
+         jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
+         this->append_state(syntax_element_backstep, sizeof(re_brace));
+         this->m_pdata->m_data.align();
+         m_alt_insert_point = this->m_pdata->m_data.size();
+         break;
+      }
+   case regex_constants::escape_type_right_word:
+      //
+      // an independent sub-expression:
+      //
+      pb->index = markid = -3;
+      ++m_position;
+      jump_offset = this->getoffset(this->append_state(syntax_element_jump, sizeof(re_jump)));
+      this->m_pdata->m_data.align();
+      m_alt_insert_point = this->m_pdata->m_data.size();
+      break;
+   case regex_constants::syntax_open_mark:
+      {
+      // a conditional expression:
+      pb->index = markid = -4;
+      if(++m_position == m_end)
+      {
+         fail(regex_constants::error_badrepeat, m_position - m_base);
+         return false;
+      }
+      int v = this->m_traits.toi(m_position, m_end, 10);
+      if(v > 0)
+      {
+         re_brace* br = static_cast<re_brace*>(this->append_state(syntax_element_assert_backref, sizeof(re_brace)));
+         br->index = v;
+         if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_close_mark)
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+         if(++m_position == m_end)
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+      }
+      else
+      {
+         // verify that we have a lookahead or lookbehind assert:
+         if(this->m_traits.syntax_type(*m_position) != regex_constants::syntax_question)
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+         if(++m_position == m_end)
+         {
+            fail(regex_constants::error_badrepeat, m_position - m_base);
+            return false;
+         }
+         if(this->m_traits.syntax_type(*m_position) == regex_constants::escape_type_left_word)
+         {
+            if(++m_position == m_end)
+            {
+               fail(regex_constants::error_badrepeat, m_position - m_base);
+               return false;
+            }
+            if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
+               && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
+            {
+               fail(regex_constants::error_badrepeat, m_position - m_base);
+               return false;
+            }
+            m_position -= 3;
+         }
+         else
+         {
+            if((this->m_traits.syntax_type(*m_position) != regex_constants::syntax_equal)
+               && (this->m_traits.syntax_type(*m_position) != regex_constants::syntax_not))
+            {
+               fail(regex_constants::error_badrepeat, m_position - m_base);
+               return false;
+            }
+            m_position -= 2;
+         }
+      }
+      break;
+      }
+   case regex_constants::syntax_close_mark:
+      fail(regex_constants::error_badrepeat, m_position - m_base);
+      return false;
+   default:
+      //
+      // lets assume that we have a (?imsx) group and try and parse it:
+      //
+      regex_constants::syntax_option_type opts = parse_options();
+      if(m_position == m_end)
+         return false;
+      // make a note of whether we have a case change:
+      m_has_case_change = ((opts & regbase::icase) != (this->flags() & regbase::icase));
+      pb->index = markid = 0;
+      if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark)
+      {
+         // update flags and carry on as normal:
+         this->flags(opts);
+         restore_flags = false;
+         old_case_change |= m_has_case_change; // defer end of scope by one ')'
+      }
+      else if(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_colon)
+      {
+         // update flags and carry on until the matching ')' is found:
+         this->flags(opts);
+         ++m_position;
+      }
+      else
+      {
+         fail(regex_constants::error_badrepeat, m_position - m_base);
+         return false;
+      }
+
+      // finally append a case change state if we need it:
+      if(m_has_case_change)
+      {
+         static_cast<re_case*>(
+            this->append_state(syntax_element_toggle_case, sizeof(re_case))
+            )->icase = opts & regbase::icase;
+      }
+
+   }
+   //
+   // now recursively add more states, this will terminate when we get to a
+   // matching ')' :
+   //
+   parse_all();
+   //
+   // Unwind alternatives:
+   //
+   if(0 == unwind_alts(last_paren_start))
+      return false;
+   //
+   // we either have a ')' or we have run out of characters prematurely:
+   //
+   if(m_position == m_end)
+   {
+      this->fail(regex_constants::error_paren, ::boost::re_detail::distance(m_base, m_end));
+      return false;
+   }
+   BOOST_ASSERT(this->m_traits.syntax_type(*m_position) == regex_constants::syntax_close_mark);
+   ++m_position;
+   //
+   // restore the flags:
+   //
+   if(restore_flags)
+   {
+      // append a case change state if we need it:
+      if(m_has_case_change)
+      {
+         static_cast<re_case*>(
+            this->append_state(syntax_element_toggle_case, sizeof(re_case))
+            )->icase = old_flags & regbase::icase;
+      }
+      this->flags(old_flags);
+   }
+   //
+   // set up the jump pointer if we have one:
+   //
+   if(jump_offset)
+   {
+      this->m_pdata->m_data.align();
+      re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
+      jmp->alt.i = this->m_pdata->m_data.size() - this->getoffset(jmp);
+      if(this->m_last_state == jmp)
+      {
+         // Oops... we didn't have anything inside the assertion:
+         fail(regex_constants::error_empty, m_position - m_base);
+         return false;
+      }
+   }
+   //
+   // verify that if this is conditional expression, that we do have
+   // an alternative, if not add one:
+   //
+   if(markid == -4)
+   {
+      re_syntax_base* b = this->getaddress(expected_alt_point);
+      // Make sure we have exactly one alternative following this state:
+      if(b->type != syntax_element_alt)
+      {
+         re_alt* alt = static_cast<re_alt*>(this->insert_state(expected_alt_point, syntax_element_alt, sizeof(re_alt)));
+         alt->alt.i = this->m_pdata->m_data.size() - this->getoffset(alt);
+      }
+      else if(this->getaddress(static_cast<re_alt*>(b)->alt.i, b)->type == syntax_element_alt)
+      {
+         fail(regex_constants::error_bad_pattern, m_position - m_base);
+         return false;
+      }
+      // check for invalid repetition of next state:
+      b = this->getaddress(expected_alt_point);
+      b = this->getaddress(static_cast<re_alt*>(b)->next.i, b);
+      if((b->type != syntax_element_assert_backref)
+         && (b->type != syntax_element_startmark))
+      {
+         fail(regex_constants::error_badrepeat, m_position - m_base);
+         return false;
+      }
+   }
+   //
+   // append closing parenthesis state:
+   //
+   pb = static_cast<re_brace*>(this->append_state(syntax_element_endmark, sizeof(re_brace)));
+   pb->index = markid;
+   this->m_paren_start = last_paren_start;
+   //
+   // restore the alternate insertion point:
+   //
+   this->m_alt_insert_point = last_alt_point;
+   //
+   // and the case change data:
+   //
+   m_has_case_change = old_case_change;
+   return true;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::add_emacs_code(bool negate)
+{
+   //
+   // parses an emacs style \sx or \Sx construct.
+   //
+   if(++m_position == m_end)
+   {
+      fail(regex_constants::error_escape, m_position - m_base);
+      return false;
+   }
+   basic_char_set<charT, traits> char_set;
+   if(negate)
+      char_set.negate();
+
+   static const charT s_punct[5] = { 'p', 'u', 'n', 'c', 't', };
+
+   switch(*m_position)
+   {
+   case 's':
+   case ' ':
+      char_set.add_class(this->m_mask_space);
+      break;
+   case 'w':
+      char_set.add_class(this->m_word_mask);
+      break;
+   case '_':
+      char_set.add_single(digraph<charT>(charT('$'))); 
+      char_set.add_single(digraph<charT>(charT('&'))); 
+      char_set.add_single(digraph<charT>(charT('*'))); 
+      char_set.add_single(digraph<charT>(charT('+'))); 
+      char_set.add_single(digraph<charT>(charT('-'))); 
+      char_set.add_single(digraph<charT>(charT('_'))); 
+      char_set.add_single(digraph<charT>(charT('<'))); 
+      char_set.add_single(digraph<charT>(charT('>'))); 
+      break;
+   case '.':
+      char_set.add_class(this->m_traits.lookup_classname(s_punct, s_punct+5));
+      break;
+   case '(':
+      char_set.add_single(digraph<charT>(charT('('))); 
+      char_set.add_single(digraph<charT>(charT('['))); 
+      char_set.add_single(digraph<charT>(charT('{'))); 
+      break;
+   case ')':
+      char_set.add_single(digraph<charT>(charT(')'))); 
+      char_set.add_single(digraph<charT>(charT(']'))); 
+      char_set.add_single(digraph<charT>(charT('}'))); 
+      break;
+   case '"':
+      char_set.add_single(digraph<charT>(charT('"'))); 
+      char_set.add_single(digraph<charT>(charT('\''))); 
+      char_set.add_single(digraph<charT>(charT('`'))); 
+      break;
+   case '\'':
+      char_set.add_single(digraph<charT>(charT('\''))); 
+      char_set.add_single(digraph<charT>(charT(','))); 
+      char_set.add_single(digraph<charT>(charT('#'))); 
+      break;
+   case '<':
+      char_set.add_single(digraph<charT>(charT(';'))); 
+      break;
+   case '>':
+      char_set.add_single(digraph<charT>(charT('\n'))); 
+      char_set.add_single(digraph<charT>(charT('\f'))); 
+      break;
+   default:
+      fail(regex_constants::error_ctype, m_position - m_base);
+      return false;
+   }
+   if(0 == this->append_set(char_set))
+   {
+      fail(regex_constants::error_ctype, m_position - m_base);
+      return false;
+   }
+   ++m_position;
+   return true;
+}
+
+template <class charT, class traits>
+regex_constants::syntax_option_type basic_regex_parser<charT, traits>::parse_options()
+{
+   // we have a (?imsx-imsx) group, convert it into a set of flags:
+   regex_constants::syntax_option_type f = this->flags();
+   bool breakout = false;
+   do
+   {
+      switch(*m_position)
+      {
+      case 's':
+         f |= regex_constants::mod_s;
+         f &= ~regex_constants::no_mod_s;
+         break;
+      case 'm':
+         f &= ~regex_constants::no_mod_m;
+         break;
+      case 'i':
+         f |= regex_constants::icase;
+         break;
+      case 'x':
+         f |= regex_constants::mod_x;
+         break;
+      default:
+         breakout = true;
+         continue;
+      }
+      if(++m_position == m_end)
+      {
+         fail(regex_constants::error_paren, m_position - m_base);
+         return false;
+      }
+   }
+   while(!breakout);
+
+   if(*m_position == static_cast<charT>('-'))
+   {
+      if(++m_position == m_end)
+      {
+         fail(regex_constants::error_paren, m_position - m_base);
+         return false;
+      }
+      do
+      {
+         switch(*m_position)
+         {
+         case 's':
+            f &= ~regex_constants::mod_s;
+            f |= regex_constants::no_mod_s;
+            break;
+         case 'm':
+            f |= regex_constants::no_mod_m;
+            break;
+         case 'i':
+            f &= ~regex_constants::icase;
+            break;
+         case 'x':
+            f &= ~regex_constants::mod_x;
+            break;
+         default:
+            breakout = true;
+            continue;
+         }
+         if(++m_position == m_end)
+         {
+            fail(regex_constants::error_paren, m_position - m_base);
+            return false;
+         }
+      }
+      while(!breakout);
+   }
+   return f;
+}
+
+template <class charT, class traits>
+bool basic_regex_parser<charT, traits>::unwind_alts(std::ptrdiff_t last_paren_start)
+{
+   //
+   // If we didn't actually add any states after the last 
+   // alternative then that's an error:
+   //
+   if((this->m_alt_insert_point == static_cast<std::ptrdiff_t>(this->m_pdata->m_data.size()))
+      && m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start)
+      &&
+      !(
+         ((this->flags() & regbase::main_option_type) == regbase::perl_syntax_group)
+           &&
+         ((this->flags() & regbase::no_empty_expressions) == 0)
+        )
+      )
+   {
+      fail(regex_constants::error_empty, this->m_position - this->m_base);
+      return false;
+   }
+   // 
+   // Fix up our alternatives:
+   //
+   while(m_alt_jumps.size() && (m_alt_jumps.back() > last_paren_start))
+   {
+      //
+      // fix up the jump to point to the end of the states
+      // that we've just added:
+      //
+      std::ptrdiff_t jump_offset = m_alt_jumps.back();
+      m_alt_jumps.pop_back();
+      this->m_pdata->m_data.align();
+      re_jump* jmp = static_cast<re_jump*>(this->getaddress(jump_offset));
+      BOOST_ASSERT(jmp->type == syntax_element_jump);
+      jmp->alt.i = this->m_pdata->m_data.size() - jump_offset;
+   }
+   return true;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace re_detail
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/c_regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,211 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         c_regex_traits.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression traits class that wraps the global C locale.
+  */
+
+#ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED
+#define BOOST_C_REGEX_TRAITS_HPP_INCLUDED
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+#ifndef BOOST_REGEX_WORKAROUND_HPP
+#include <boost/regex/v4/regex_workaround.hpp>
+#endif
+
+#include <cctype>
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{
+   using ::strlen; using ::tolower;
+}
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+
+template <class charT>
+struct c_regex_traits;
+
+template<>
+struct BOOST_REGEX_DECL c_regex_traits<char>
+{
+   c_regex_traits(){}
+   typedef char char_type;
+   typedef std::size_t size_type;
+   typedef std::string string_type;
+   struct locale_type{};
+   typedef boost::uint32_t char_class_type;
+
+   static size_type length(const char_type* p) 
+   { 
+      return (std::strlen)(p); 
+   }
+
+   char translate(char c) const 
+   { 
+      return c; 
+   }
+   char translate_nocase(char c) const 
+   { 
+      return static_cast<char>((std::tolower)(static_cast<unsigned char>(c))); 
+   }
+
+   static string_type BOOST_REGEX_CALL transform(const char* p1, const char* p2);
+   static string_type BOOST_REGEX_CALL transform_primary(const char* p1, const char* p2);
+
+   static char_class_type BOOST_REGEX_CALL lookup_classname(const char* p1, const char* p2);
+   static string_type BOOST_REGEX_CALL lookup_collatename(const char* p1, const char* p2);
+
+   static bool BOOST_REGEX_CALL isctype(char, char_class_type);
+   static int BOOST_REGEX_CALL value(char, int);
+
+   locale_type imbue(locale_type l)
+   { return l; }
+   locale_type getloc()const
+   { return locale_type(); }
+
+private:
+   // this type is not copyable:
+   c_regex_traits(const c_regex_traits&);
+   c_regex_traits& operator=(const c_regex_traits&);
+};
+
+#ifndef BOOST_NO_WREGEX
+template<>
+struct BOOST_REGEX_DECL c_regex_traits<wchar_t>
+{
+   c_regex_traits(){}
+   typedef wchar_t char_type;
+   typedef std::size_t size_type;
+   typedef std::wstring string_type;
+   struct locale_type{};
+   typedef boost::uint32_t char_class_type;
+
+   static size_type length(const char_type* p) 
+   { 
+      return (std::wcslen)(p); 
+   }
+
+   wchar_t translate(wchar_t c) const 
+   { 
+      return c; 
+   }
+   wchar_t translate_nocase(wchar_t c) const 
+   { 
+      return (std::towlower)(c); 
+   }
+
+   static string_type BOOST_REGEX_CALL transform(const wchar_t* p1, const wchar_t* p2);
+   static string_type BOOST_REGEX_CALL transform_primary(const wchar_t* p1, const wchar_t* p2);
+
+   static char_class_type BOOST_REGEX_CALL lookup_classname(const wchar_t* p1, const wchar_t* p2);
+   static string_type BOOST_REGEX_CALL lookup_collatename(const wchar_t* p1, const wchar_t* p2);
+
+   static bool BOOST_REGEX_CALL isctype(wchar_t, char_class_type);
+   static int BOOST_REGEX_CALL value(wchar_t, int);
+
+   locale_type imbue(locale_type l)
+   { return l; }
+   locale_type getloc()const
+   { return locale_type(); }
+
+private:
+   // this type is not copyable:
+   c_regex_traits(const c_regex_traits&);
+   c_regex_traits& operator=(const c_regex_traits&);
+};
+
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+//
+// Provide an unsigned short version as well, so the user can link to this
+// no matter whether they build with /Zc:wchar_t or not (MSVC specific).
+//
+template<>
+struct BOOST_REGEX_DECL c_regex_traits<unsigned short>
+{
+   c_regex_traits(){}
+   typedef unsigned short char_type;
+   typedef std::size_t size_type;
+   typedef std::basic_string<unsigned short> string_type;
+   struct locale_type{};
+   typedef boost::uint32_t char_class_type;
+
+   static size_type length(const char_type* p) 
+   { 
+      return (std::wcslen)((const wchar_t*)p); 
+   }
+
+   unsigned short translate(unsigned short c) const 
+   { 
+      return c; 
+   }
+   unsigned short translate_nocase(unsigned short c) const 
+   { 
+      return (std::towlower)((wchar_t)c); 
+   }
+
+   static string_type BOOST_REGEX_CALL transform(const unsigned short* p1, const unsigned short* p2);
+   static string_type BOOST_REGEX_CALL transform_primary(const unsigned short* p1, const unsigned short* p2);
+
+   static char_class_type BOOST_REGEX_CALL lookup_classname(const unsigned short* p1, const unsigned short* p2);
+   static string_type BOOST_REGEX_CALL lookup_collatename(const unsigned short* p1, const unsigned short* p2);
+
+   static bool BOOST_REGEX_CALL isctype(unsigned short, char_class_type);
+   static int BOOST_REGEX_CALL value(unsigned short, int);
+
+   locale_type imbue(locale_type l)
+   { return l; }
+   locale_type getloc()const
+   { return locale_type(); }
+
+private:
+   // this type is not copyable:
+   c_regex_traits(const c_regex_traits&);
+   c_regex_traits& operator=(const c_regex_traits&);
+};
+
+#endif
+
+#endif // BOOST_NO_WREGEX
+
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/char_regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,81 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0. (See accompanying file
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         char_regex_traits.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares deprecated traits classes char_regex_traits<>.
+  */
+
+
+#ifndef BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
+#define BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+
+namespace deprecated{
+//
+// class char_regex_traits_i
+// provides case insensitive traits classes (deprecated):
+template <class charT>
+class char_regex_traits_i : public regex_traits<charT> {};
+
+template<>
+class char_regex_traits_i<char> : public regex_traits<char>
+{
+public:
+   typedef char char_type;
+   typedef unsigned char uchar_type;
+   typedef unsigned int size_type;
+   typedef regex_traits<char> base_type;
+
+};
+
+#ifndef BOOST_NO_WREGEX
+template<>
+class char_regex_traits_i<wchar_t> : public regex_traits<wchar_t>
+{
+public:
+   typedef wchar_t char_type;
+   typedef unsigned short uchar_type;
+   typedef unsigned int size_type;
+   typedef regex_traits<wchar_t> base_type;
+
+};
+#endif
+} // namespace deprecated
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // include
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/cpp_regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1062 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         cpp_regex_traits.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression traits class cpp_regex_traits.
+  */
+
+#ifndef BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
+#define BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
+
+#include <boost/config.hpp>
+
+#ifndef BOOST_NO_STD_LOCALE
+
+#ifndef BOOST_RE_PAT_EXCEPT_HPP
+#include <boost/regex/pattern_except.hpp>
+#endif
+#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
+#include <boost/regex/v4/regex_traits_defaults.hpp>
+#endif
+#ifdef BOOST_HAS_THREADS
+#include <boost/regex/pending/static_mutex.hpp>
+#endif
+#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
+#include <boost/regex/v4/primary_transform.hpp>
+#endif
+#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
+#include <boost/regex/pending/object_cache.hpp>
+#endif
+
+#include <istream>
+#include <ios>
+#include <climits>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4786)
+#endif
+
+namespace boost{ 
+
+//
+// forward declaration is needed by some compilers:
+//
+template <class charT>
+class cpp_regex_traits;
+   
+namespace re_detail{
+
+//
+// class parser_buf:
+// acts as a stream buffer which wraps around a pair of pointers:
+//
+template <class charT,
+          class traits = ::std::char_traits<charT> >
+class parser_buf : public ::std::basic_streambuf<charT, traits>
+{
+   typedef ::std::basic_streambuf<charT, traits> base_type;
+   typedef typename base_type::int_type int_type;
+   typedef typename base_type::char_type char_type;
+   typedef typename base_type::pos_type pos_type;
+   typedef ::std::streamsize streamsize;
+   typedef typename base_type::off_type off_type;
+public:
+   parser_buf() : base_type() { setbuf(0, 0); }
+   const charT* getnext() { return this->gptr(); }
+protected:
+   std::basic_streambuf<charT, traits>* setbuf(char_type* s, streamsize n);
+   typename parser_buf<charT, traits>::pos_type seekpos(pos_type sp, ::std::ios_base::openmode which);
+   typename parser_buf<charT, traits>::pos_type seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which);
+private:
+   parser_buf& operator=(const parser_buf&);
+   parser_buf(const parser_buf&);
+};
+
+template<class charT, class traits>
+std::basic_streambuf<charT, traits>*
+parser_buf<charT, traits>::setbuf(char_type* s, streamsize n)
+{
+   this->setg(s, s, s + n);
+   return this;
+}
+
+template<class charT, class traits>
+typename parser_buf<charT, traits>::pos_type
+parser_buf<charT, traits>::seekoff(off_type off, ::std::ios_base::seekdir way, ::std::ios_base::openmode which)
+{
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   std::ptrdiff_t size = this->egptr() - this->eback();
+   std::ptrdiff_t pos = this->gptr() - this->eback();
+   charT* g = this->eback();
+   switch(way)
+   {
+   case ::std::ios_base::beg:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + off, g + size);
+      break;
+   case ::std::ios_base::end:
+      if((off < 0) || (off > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + size - off, g + size);
+      break;
+   case ::std::ios_base::cur:
+   {
+      std::ptrdiff_t newpos = static_cast<std::ptrdiff_t>(pos + off);
+      if((newpos < 0) || (newpos > size))
+         return pos_type(off_type(-1));
+      else
+         this->setg(g, g + newpos, g + size);
+      break;
+   }
+   default: ;
+   }
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4244)
+#endif
+   return static_cast<pos_type>(this->gptr() - this->eback());
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template<class charT, class traits>
+typename parser_buf<charT, traits>::pos_type
+parser_buf<charT, traits>::seekpos(pos_type sp, ::std::ios_base::openmode which)
+{
+   if(which & ::std::ios_base::out)
+      return pos_type(off_type(-1));
+   off_type size = static_cast<off_type>(this->egptr() - this->eback());
+   charT* g = this->eback();
+   if(off_type(sp) <= size)
+   {
+      this->setg(g, g + off_type(sp), g + size);
+   }
+   return pos_type(off_type(-1));
+}
+
+//
+// class cpp_regex_traits_base:
+// acts as a container for locale and the facets we are using.
+//
+template <class charT>
+struct cpp_regex_traits_base
+{
+   cpp_regex_traits_base(const std::locale& l)
+   { imbue(l); }
+   std::locale imbue(const std::locale& l);
+
+   std::locale m_locale;
+   std::ctype<charT> const* m_pctype;
+#ifndef BOOST_NO_STD_MESSAGES
+   std::messages<charT> const* m_pmessages;
+#endif
+   std::collate<charT> const* m_pcollate;
+
+   bool operator<(const cpp_regex_traits_base& b)const
+   {
+      if(m_pctype == b.m_pctype)
+      {
+#ifndef BOOST_NO_STD_MESSAGES
+         if(m_pmessages == b.m_pmessages)
+         {
+         }
+         return m_pmessages < b.m_pmessages;
+#else
+         return m_pcollate < b.m_pcollate;
+#endif
+      }
+      return m_pctype < b.m_pctype;
+   }
+   bool operator==(const cpp_regex_traits_base& b)const
+   {
+      return (m_pctype == b.m_pctype) 
+#ifndef BOOST_NO_STD_MESSAGES
+         && (m_pmessages == b.m_pmessages) 
+#endif
+         && (m_pcollate == b.m_pcollate);
+   }
+};
+
+template <class charT>
+std::locale cpp_regex_traits_base<charT>::imbue(const std::locale& l)
+{
+   std::locale result(m_locale);
+   m_locale = l;
+   m_pctype = &BOOST_USE_FACET(std::ctype<charT>, l);
+#ifndef BOOST_NO_STD_MESSAGES
+   m_pmessages = &BOOST_USE_FACET(std::messages<charT>, l);
+#endif
+   m_pcollate = &BOOST_USE_FACET(std::collate<charT>, l);
+   return result;
+}
+
+//
+// class cpp_regex_traits_char_layer:
+// implements methods that require specialisation for narrow characters:
+//
+template <class charT>
+class cpp_regex_traits_char_layer : public cpp_regex_traits_base<charT>
+{
+   typedef std::basic_string<charT> string_type;
+   typedef std::map<charT, regex_constants::syntax_type> map_type;
+   typedef typename map_type::const_iterator map_iterator_type;
+public:
+   cpp_regex_traits_char_layer(const std::locale& l)
+      : cpp_regex_traits_base<charT>(l)
+   {
+      init();
+   }
+   cpp_regex_traits_char_layer(const cpp_regex_traits_base<charT>& b)
+      : cpp_regex_traits_base<charT>(b)
+   {
+      init();
+   }
+   void init();
+
+   regex_constants::syntax_type syntax_type(charT c)const
+   {
+      map_iterator_type i = m_char_map.find(c);
+      return ((i == m_char_map.end()) ? 0 : i->second);
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(charT c) const
+   {
+      map_iterator_type i = m_char_map.find(c);
+      if(i == m_char_map.end())
+      {
+         if(this->m_pctype->is(std::ctype_base::lower, c)) return regex_constants::escape_type_class;
+         if(this->m_pctype->is(std::ctype_base::upper, c)) return regex_constants::escape_type_not_class;
+         return 0;
+      }
+      return i->second;
+   }
+
+private:
+   string_type get_default_message(regex_constants::syntax_type);
+   // TODO: use a hash table when available!
+   map_type m_char_map;
+};
+
+template <class charT>
+void cpp_regex_traits_char_layer<charT>::init()
+{
+   // we need to start by initialising our syntax map so we know which
+   // character is used for which purpose:
+#ifndef BOOST_NO_STD_MESSAGES
+#ifndef __IBMCPP__
+   typename std::messages<charT>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
+#else
+   typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
+#endif
+   std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
+   if(cat_name.size())
+   {
+      cat = this->m_pmessages->open(
+         cat_name, 
+         this->m_locale);
+      if((int)cat < 0)
+      {
+         std::string m("Unable to open message catalog: ");
+         std::runtime_error err(m + cat_name);
+         boost::re_detail::raise_runtime_error(err);
+      }
+   }
+   //
+   // if we have a valid catalog then load our messages:
+   //
+   if((int)cat >= 0)
+   {
+#ifndef BOOST_NO_EXCEPTIONS
+      try{
+#endif
+         for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
+         {
+            string_type mss = this->m_pmessages->get(cat, 0, i, get_default_message(i));
+            for(typename string_type::size_type j = 0; j < mss.size(); ++j)
+            {
+               m_char_map[mss[j]] = i;
+            }
+         }
+         this->m_pmessages->close(cat);
+#ifndef BOOST_NO_EXCEPTIONS
+      }
+      catch(...)
+      {
+         this->m_pmessages->close(cat);
+         throw;
+      }
+#endif
+   }
+   else
+   {
+#endif
+      for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
+      {
+         const char* ptr = get_default_syntax(i);
+         while(ptr && *ptr)
+         {
+            m_char_map[this->m_pctype->widen(*ptr)] = i;
+            ++ptr;
+         }
+      }
+#ifndef BOOST_NO_STD_MESSAGES
+   }
+#endif
+}
+
+template <class charT>
+typename cpp_regex_traits_char_layer<charT>::string_type 
+   cpp_regex_traits_char_layer<charT>::get_default_message(regex_constants::syntax_type i)
+{
+   const char* ptr = get_default_syntax(i);
+   string_type result;
+   while(ptr && *ptr)
+   {
+      result.append(1, this->m_pctype->widen(*ptr));
+      ++ptr;
+   }
+   return result;
+}
+
+//
+// specialised version for narrow characters:
+//
+template <>
+class BOOST_REGEX_DECL cpp_regex_traits_char_layer<char> : public cpp_regex_traits_base<char>
+{
+   typedef std::string string_type;
+public:
+   cpp_regex_traits_char_layer(const std::locale& l)
+   : cpp_regex_traits_base<char>(l)
+   {
+      init();
+   }
+   cpp_regex_traits_char_layer(const cpp_regex_traits_base<char>& l)
+   : cpp_regex_traits_base<char>(l)
+   {
+      init();
+   }
+
+   regex_constants::syntax_type syntax_type(char c)const
+   {
+      return m_char_map[static_cast<unsigned char>(c)];
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(char c) const
+   {
+      return m_char_map[static_cast<unsigned char>(c)];
+   }
+
+private:
+   regex_constants::syntax_type m_char_map[1u << CHAR_BIT];
+   void init();
+};
+
+#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
+enum
+{
+   char_class_space=1<<0, 
+   char_class_print=1<<1, 
+   char_class_cntrl=1<<2, 
+   char_class_upper=1<<3, 
+   char_class_lower=1<<4,
+   char_class_alpha=1<<5, 
+   char_class_digit=1<<6, 
+   char_class_punct=1<<7, 
+   char_class_xdigit=1<<8,
+   char_class_alnum=char_class_alpha|char_class_digit, 
+   char_class_graph=char_class_alnum|char_class_punct,
+   char_class_blank=1<<9,
+   char_class_word=1<<10,
+   char_class_unicode=1<<11
+};
+
+#endif
+
+//
+// class cpp_regex_traits_implementation:
+// provides pimpl implementation for cpp_regex_traits.
+//
+template <class charT>
+class cpp_regex_traits_implementation : public cpp_regex_traits_char_layer<charT>
+{
+public:
+   typedef typename cpp_regex_traits<charT>::char_class_type char_class_type;
+   typedef typename std::ctype<charT>::mask                  native_mask_type;
+#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
+   BOOST_STATIC_CONSTANT(char_class_type, mask_blank = 1u << 24);
+   BOOST_STATIC_CONSTANT(char_class_type, mask_word = 1u << 25);
+   BOOST_STATIC_CONSTANT(char_class_type, mask_unicode = 1u << 26);
+#endif
+
+   typedef std::basic_string<charT> string_type;
+   typedef charT char_type;
+   //cpp_regex_traits_implementation();
+   cpp_regex_traits_implementation(const std::locale& l)
+      : cpp_regex_traits_char_layer<charT>(l)
+   {
+      init();
+   }
+   cpp_regex_traits_implementation(const cpp_regex_traits_base<charT>& l)
+      : cpp_regex_traits_char_layer<charT>(l)
+   {
+      init();
+   }
+   std::string error_string(regex_constants::error_type n) const
+   {
+      if(!m_error_strings.empty())
+      {
+         std::map<int, std::string>::const_iterator p = m_error_strings.find(n);
+         return (p == m_error_strings.end()) ? std::string(get_default_error_string(n)) : p->second;
+      }
+      return get_default_error_string(n);
+   }
+   char_class_type lookup_classname(const charT* p1, const charT* p2) const
+   {
+      char_class_type result = lookup_classname_imp(p1, p2);
+      if(result == 0)
+      {
+         string_type temp(p1, p2);
+         this->m_pctype->tolower(&*temp.begin(), &*temp.begin() + temp.size());
+         result = lookup_classname_imp(&*temp.begin(), &*temp.begin() + temp.size());
+      }
+      return result;
+   }
+   string_type lookup_collatename(const charT* p1, const charT* p2) const;
+   string_type transform_primary(const charT* p1, const charT* p2) const;
+   string_type transform(const charT* p1, const charT* p2) const;
+private:
+   std::map<int, std::string>     m_error_strings;   // error messages indexed by numberic ID
+   std::map<string_type, char_class_type>  m_custom_class_names; // character class names
+   std::map<string_type, string_type>      m_custom_collate_names; // collating element names
+   unsigned                       m_collate_type;    // the form of the collation string
+   charT                          m_collate_delim;   // the collation group delimiter
+   //
+   // helpers:
+   //
+   char_class_type lookup_classname_imp(const charT* p1, const charT* p2) const;
+   void init();
+#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
+public:
+   bool isctype(charT c, char_class_type m)const;
+#endif
+};
+
+#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
+#if !defined(BOOST_NO_INCLASS_MEMBER_INITIALIZATION)
+
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_blank;
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_word;
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::char_class_type const cpp_regex_traits_implementation<charT>::mask_unicode;
+
+#endif
+#endif
+
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::string_type 
+   cpp_regex_traits_implementation<charT>::transform_primary(const charT* p1, const charT* p2) const
+{
+   //
+   // PRECONDITIONS:
+   //
+   // A bug in gcc 3.2 (and maybe other versions as well) treats
+   // p1 as a null terminated string, for efficiency reasons 
+   // we work around this elsewhere, but just assert here that
+   // we adhere to gcc's (buggy) preconditions...
+   //
+   BOOST_ASSERT(*p2 == 0);
+
+   string_type result;
+   //
+   // swallowing all exceptions here is a bad idea
+   // however at least one std lib will always throw
+   // std::bad_alloc for certain arguments...
+   //
+   try{
+      //
+      // What we do here depends upon the format of the sort key returned by
+      // sort key returned by this->transform:
+      //
+      switch(m_collate_type)
+      {
+      case sort_C:
+      case sort_unknown:
+         // the best we can do is translate to lower case, then get a regular sort key:
+         {
+            result.assign(p1, p2);
+            this->m_pctype->tolower(&*result.begin(), &*result.begin() + result.size());
+            result = this->m_pcollate->transform(&*result.begin(), &*result.begin() + result.size());
+            break;
+         }
+      case sort_fixed:
+         {
+            // get a regular sort key, and then truncate it:
+            result.assign(this->m_pcollate->transform(p1, p2));
+            result.erase(this->m_collate_delim);
+            break;
+         }
+      case sort_delim:
+            // get a regular sort key, and then truncate everything after the delim:
+            result.assign(this->m_pcollate->transform(p1, p2));
+            std::size_t i;
+            for(i = 0; i < result.size(); ++i)
+            {
+               if(result[i] == m_collate_delim)
+                  break;
+            }
+            result.erase(i);
+            break;
+      }
+   }catch(...){}
+   while(result.size() && (charT(0) == *result.rbegin()))
+      result.erase(result.size() - 1);
+   if(result.empty())
+   {
+      // character is ignorable at the primary level:
+      result = string_type(1, charT(0));
+   }
+   return result;
+}
+
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::string_type 
+   cpp_regex_traits_implementation<charT>::transform(const charT* p1, const charT* p2) const
+{
+   //
+   // PRECONDITIONS:
+   //
+   // A bug in gcc 3.2 (and maybe other versions as well) treats
+   // p1 as a null terminated string, for efficiency reasons 
+   // we work around this elsewhere, but just assert here that
+   // we adhere to gcc's (buggy) preconditions...
+   //
+   BOOST_ASSERT(*p2 == 0);
+   //
+   // swallowing all exceptions here is a bad idea
+   // however at least one std lib will always throw
+   // std::bad_alloc for certain arguments...
+   //
+   string_type result;
+   try{
+      result = this->m_pcollate->transform(p1, p2);
+      //
+      // Borland's STLPort version returns a NULL-terminated
+      // string that has garbage at the end - each call to
+      // std::collate<wchar_t>::transform returns a different string!
+      // So as a workaround, we'll truncate the string at the first NULL
+      // which _seems_ to work....
+#if BOOST_WORKAROUND(__BORLANDC__, < 0x580)
+      result.erase(result.find(charT(0)));
+#else
+      //
+      // some implementations (Dinkumware) append unnecessary trailing \0's:
+      while(result.size() && (charT(0) == *result.rbegin()))
+         result.erase(result.size() - 1);
+#endif
+      BOOST_ASSERT(std::find(result.begin(), result.end(), charT(0)) == result.end());
+   }
+   catch(...)
+   {
+   }
+   return result;
+}
+
+
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::string_type 
+   cpp_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const
+{
+   typedef typename std::map<string_type, string_type>::const_iterator iter_type;
+   if(m_custom_collate_names.size())
+   {
+      iter_type pos = m_custom_collate_names.find(string_type(p1, p2));
+      if(pos != m_custom_collate_names.end())
+         return pos->second;
+   }
+#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
+               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\
+               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
+   std::string name(p1, p2);
+#else
+   std::string name;
+   const charT* p0 = p1;
+   while(p0 != p2)
+      name.append(1, char(*p0++));
+#endif
+   name = lookup_default_collate_name(name);
+#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
+               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\
+               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
+   if(name.size())
+      return string_type(name.begin(), name.end());
+#else
+   if(name.size())
+   {
+      string_type result;
+      typedef std::string::const_iterator iter;
+      iter b = name.begin();
+      iter e = name.end();
+      while(b != e)
+         result.append(1, charT(*b++));
+      return result;
+   }
+#endif
+   if(p2 - p1 == 1)
+      return string_type(1, *p1);
+   return string_type();
+}
+
+template <class charT>
+void cpp_regex_traits_implementation<charT>::init()
+{
+#ifndef BOOST_NO_STD_MESSAGES
+#ifndef __IBMCPP__
+   typename std::messages<charT>::catalog cat = static_cast<std::messages<char>::catalog>(-1);
+#else
+   typename std::messages<charT>::catalog cat = reinterpret_cast<std::messages<char>::catalog>(-1);
+#endif
+   std::string cat_name(cpp_regex_traits<charT>::get_catalog_name());
+   if(cat_name.size())
+   {
+      cat = this->m_pmessages->open(
+         cat_name, 
+         this->m_locale);
+      if((int)cat < 0)
+      {
+         std::string m("Unable to open message catalog: ");
+         std::runtime_error err(m + cat_name);
+         boost::re_detail::raise_runtime_error(err);
+      }
+   }
+   //
+   // if we have a valid catalog then load our messages:
+   //
+   if((int)cat >= 0)
+   {
+      //
+      // Error messages:
+      //
+      for(boost::regex_constants::error_type i = static_cast<boost::regex_constants::error_type>(0); 
+         i <= boost::regex_constants::error_unknown; 
+         i = static_cast<boost::regex_constants::error_type>(i + 1))
+      {
+         const char* p = get_default_error_string(i);
+         string_type default_message;
+         while(*p)
+         {
+            default_message.append(1, this->m_pctype->widen(*p));
+            ++p;
+         }
+         string_type s = this->m_pmessages->get(cat, 0, i+200, default_message);
+         std::string result;
+         for(std::string::size_type j = 0; j < s.size(); ++j)
+         {
+            result.append(1, this->m_pctype->narrow(s[j], 0));
+         }
+         m_error_strings[i] = result;
+      }
+      //
+      // Custom class names:
+      //
+#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
+      static const char_class_type masks[14] = 
+      {
+         std::ctype<charT>::alnum,
+         std::ctype<charT>::alpha,
+         std::ctype<charT>::cntrl,
+         std::ctype<charT>::digit,
+         std::ctype<charT>::graph,
+         std::ctype<charT>::lower,
+         std::ctype<charT>::print,
+         std::ctype<charT>::punct,
+         std::ctype<charT>::space,
+         std::ctype<charT>::upper,
+         std::ctype<charT>::xdigit,
+         cpp_regex_traits_implementation<charT>::mask_blank,
+         cpp_regex_traits_implementation<charT>::mask_word,
+         cpp_regex_traits_implementation<charT>::mask_unicode,
+      };
+#else
+      static const char_class_type masks[14] = 
+      {
+         ::boost::re_detail::char_class_alnum,
+         ::boost::re_detail::char_class_alpha,
+         ::boost::re_detail::char_class_cntrl,
+         ::boost::re_detail::char_class_digit,
+         ::boost::re_detail::char_class_graph,
+         ::boost::re_detail::char_class_lower,
+         ::boost::re_detail::char_class_print,
+         ::boost::re_detail::char_class_punct,
+         ::boost::re_detail::char_class_space,
+         ::boost::re_detail::char_class_upper,
+         ::boost::re_detail::char_class_xdigit,
+         ::boost::re_detail::char_class_blank,
+         ::boost::re_detail::char_class_word,
+         ::boost::re_detail::char_class_unicode,
+      };
+#endif
+      static const string_type null_string;
+      for(unsigned int j = 0; j <= 13; ++j)
+      {
+         string_type s(this->m_pmessages->get(cat, 0, j+300, null_string));
+         if(s.size())
+            this->m_custom_class_names[s] = masks[j];
+      }
+   }
+#endif
+   //
+   // get the collation format used by m_pcollate:
+   //
+   m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);
+}
+
+template <class charT>
+typename cpp_regex_traits_implementation<charT>::char_class_type 
+   cpp_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const
+{
+#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
+   static const char_class_type masks[20] = 
+   {
+      0,
+      std::ctype<char>::alnum, 
+      std::ctype<char>::alpha,
+      cpp_regex_traits_implementation<charT>::mask_blank,
+      std::ctype<char>::cntrl,
+      std::ctype<char>::digit,
+      std::ctype<char>::digit,
+      std::ctype<char>::graph,
+      std::ctype<char>::lower,
+      std::ctype<char>::lower,
+      std::ctype<char>::print,
+      std::ctype<char>::punct,
+      std::ctype<char>::space,
+      std::ctype<char>::space,
+      std::ctype<char>::upper,
+      cpp_regex_traits_implementation<charT>::mask_unicode,
+      std::ctype<char>::upper,
+      std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word, 
+      std::ctype<char>::alnum | cpp_regex_traits_implementation<charT>::mask_word, 
+      std::ctype<char>::xdigit,
+   };
+#else
+   static const char_class_type masks[20] = 
+   {
+      0,
+      ::boost::re_detail::char_class_alnum, 
+      ::boost::re_detail::char_class_alpha,
+      ::boost::re_detail::char_class_blank,
+      ::boost::re_detail::char_class_cntrl,
+      ::boost::re_detail::char_class_digit,
+      ::boost::re_detail::char_class_digit,
+      ::boost::re_detail::char_class_graph,
+      ::boost::re_detail::char_class_lower,
+      ::boost::re_detail::char_class_lower,
+      ::boost::re_detail::char_class_print,
+      ::boost::re_detail::char_class_punct,
+      ::boost::re_detail::char_class_space,
+      ::boost::re_detail::char_class_space,
+      ::boost::re_detail::char_class_upper,
+      ::boost::re_detail::char_class_unicode,
+      ::boost::re_detail::char_class_upper,
+      ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, 
+      ::boost::re_detail::char_class_alnum | ::boost::re_detail::char_class_word, 
+      ::boost::re_detail::char_class_xdigit,
+   };
+#endif
+   if(m_custom_class_names.size())
+   {
+      typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter;
+      map_iter pos = m_custom_class_names.find(string_type(p1, p2));
+      if(pos != m_custom_class_names.end())
+         return pos->second;
+   }
+   std::size_t state_id = 1 + re_detail::get_default_class_id(p1, p2);
+   BOOST_ASSERT(state_id < sizeof(masks) / sizeof(masks[0]));
+   return masks[state_id];
+}
+
+#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
+template <class charT>
+bool cpp_regex_traits_implementation<charT>::isctype(const charT c, char_class_type mask) const
+{
+   return
+      ((mask & ::boost::re_detail::char_class_space) && (m_pctype->is(std::ctype<charT>::space, c)))
+      || ((mask & ::boost::re_detail::char_class_print) && (m_pctype->is(std::ctype<charT>::print, c)))
+      || ((mask & ::boost::re_detail::char_class_cntrl) && (m_pctype->is(std::ctype<charT>::cntrl, c)))
+      || ((mask & ::boost::re_detail::char_class_upper) && (m_pctype->is(std::ctype<charT>::upper, c)))
+      || ((mask & ::boost::re_detail::char_class_lower) && (m_pctype->is(std::ctype<charT>::lower, c)))
+      || ((mask & ::boost::re_detail::char_class_alpha) && (m_pctype->is(std::ctype<charT>::alpha, c)))
+      || ((mask & ::boost::re_detail::char_class_digit) && (m_pctype->is(std::ctype<charT>::digit, c)))
+      || ((mask & ::boost::re_detail::char_class_punct) && (m_pctype->is(std::ctype<charT>::punct, c)))
+      || ((mask & ::boost::re_detail::char_class_xdigit) && (m_pctype->is(std::ctype<charT>::xdigit, c)))
+      || ((mask & ::boost::re_detail::char_class_blank) && (m_pctype->is(std::ctype<charT>::space, c)) && !::boost::re_detail::is_separator(c))
+      || ((mask & ::boost::re_detail::char_class_word) && (c == '_'))
+      || ((mask & ::boost::re_detail::char_class_unicode) && ::boost::re_detail::is_extended(c));
+}
+#endif
+
+
+template <class charT>
+inline boost::shared_ptr<const cpp_regex_traits_implementation<charT> > create_cpp_regex_traits(const std::locale& l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT))
+{
+   cpp_regex_traits_base<charT> key(l);
+   return ::boost::object_cache<cpp_regex_traits_base<charT>, cpp_regex_traits_implementation<charT> >::get(key, 5);
+}
+
+} // re_detail
+
+template <class charT>
+class cpp_regex_traits
+{
+private:
+   typedef std::ctype<charT>            ctype_type;
+public:
+   typedef charT                        char_type;
+   typedef std::size_t                  size_type;
+   typedef std::basic_string<char_type> string_type;
+   typedef std::locale                  locale_type;
+   typedef boost::uint_least32_t        char_class_type;
+
+   struct boost_extensions_tag{};
+
+   cpp_regex_traits()
+      : m_pimpl(re_detail::create_cpp_regex_traits<charT>(std::locale()))
+   { }
+   static size_type length(const char_type* p)
+   {
+      return std::char_traits<charT>::length(p);
+   }
+   regex_constants::syntax_type syntax_type(charT c)const
+   {
+      return m_pimpl->syntax_type(c);
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(charT c) const
+   {
+      return m_pimpl->escape_syntax_type(c);
+   }
+   charT translate(charT c) const
+   {
+      return c;
+   }
+   charT translate_nocase(charT c) const
+   {
+      return m_pimpl->m_pctype->tolower(c);
+   }
+   charT translate(charT c, bool icase) const
+   {
+      return icase ? m_pimpl->m_pctype->tolower(c) : c;
+   }
+   charT tolower(charT c) const
+   {
+      return m_pimpl->m_pctype->tolower(c);
+   }
+   charT toupper(charT c) const
+   {
+      return m_pimpl->m_pctype->toupper(c);
+   }
+   string_type transform(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->transform(p1, p2);
+   }
+   string_type transform_primary(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->transform_primary(p1, p2);
+   }
+   char_class_type lookup_classname(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->lookup_classname(p1, p2);
+   }
+   string_type lookup_collatename(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->lookup_collatename(p1, p2);
+   }
+   bool isctype(charT c, char_class_type f) const
+   {
+#ifndef BOOST_REGEX_BUGGY_CTYPE_FACET
+      typedef typename std::ctype<charT>::mask ctype_mask;
+
+      static const ctype_mask mask_base = 
+         static_cast<ctype_mask>(
+            std::ctype<charT>::alnum 
+            | std::ctype<charT>::alpha
+            | std::ctype<charT>::cntrl
+            | std::ctype<charT>::digit
+            | std::ctype<charT>::graph
+            | std::ctype<charT>::lower
+            | std::ctype<charT>::print
+            | std::ctype<charT>::punct
+            | std::ctype<charT>::space
+            | std::ctype<charT>::upper
+            | std::ctype<charT>::xdigit);
+
+      if((f & mask_base) 
+         && (m_pimpl->m_pctype->is(
+            static_cast<ctype_mask>(f & mask_base), c)))
+         return true;
+      else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c))
+         return true;
+      else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_word) && (c == '_'))
+         return true;
+      else if((f & re_detail::cpp_regex_traits_implementation<charT>::mask_blank) 
+         && m_pimpl->m_pctype->is(std::ctype<charT>::space, c)
+         && !re_detail::is_separator(c))
+         return true;
+      return false;
+#else
+      return m_pimpl->isctype(c, f);
+#endif
+   }
+   int toi(const charT*& p1, const charT* p2, int radix)const;
+   int value(charT c, int radix)const
+   {
+      const charT* pc = &c;
+      return toi(pc, pc + 1, radix);
+   }
+   locale_type imbue(locale_type l)
+   {
+      std::locale result(getloc());
+      m_pimpl = re_detail::create_cpp_regex_traits<charT>(l);
+      return result;
+   }
+   locale_type getloc()const
+   {
+      return m_pimpl->m_locale;
+   }
+   std::string error_string(regex_constants::error_type n) const
+   {
+      return m_pimpl->error_string(n);
+   }
+
+   //
+   // extension:
+   // set the name of the message catalog in use (defaults to "boost_regex").
+   //
+   static std::string catalog_name(const std::string& name);
+   static std::string get_catalog_name();
+
+private:
+   boost::shared_ptr<const re_detail::cpp_regex_traits_implementation<charT> > m_pimpl;
+   //
+   // catalog name handler:
+   //
+   static std::string& get_catalog_name_inst();
+
+#ifdef BOOST_HAS_THREADS
+   static static_mutex& get_mutex_inst();
+#endif
+};
+
+
+template <class charT>
+int cpp_regex_traits<charT>::toi(const charT*& first, const charT* last, int radix)const
+{
+   re_detail::parser_buf<charT>   sbuf;            // buffer for parsing numbers.
+   std::basic_istream<charT>      is(&sbuf);       // stream for parsing numbers.
+
+   // we do NOT want to parse any thousands separators inside the stream:
+   last = std::find(first, last, BOOST_USE_FACET(std::numpunct<charT>, is.getloc()).thousands_sep());
+
+   sbuf.pubsetbuf(const_cast<charT*>(static_cast<const charT*>(first)), static_cast<std::streamsize>(last-first));
+   is.clear();
+   if(std::abs(radix) == 16) is >> std::hex;
+   else if(std::abs(radix) == 8) is >> std::oct;
+   else is >> std::dec;
+   int val;
+   if(is >> val)
+   {
+      first = first + ((last - first) - sbuf.in_avail());
+      return val;
+   }
+   else
+      return -1;
+}
+
+template <class charT>
+std::string cpp_regex_traits<charT>::catalog_name(const std::string& name)
+{
+#ifdef BOOST_HAS_THREADS
+   static_mutex::scoped_lock lk(get_mutex_inst());
+#endif
+   std::string result(get_catalog_name_inst());
+   get_catalog_name_inst() = name;
+   return result;
+}
+
+template <class charT>
+std::string& cpp_regex_traits<charT>::get_catalog_name_inst()
+{
+   static std::string s_name;
+   return s_name;
+}
+
+template <class charT>
+std::string cpp_regex_traits<charT>::get_catalog_name()
+{
+#ifdef BOOST_HAS_THREADS
+   static_mutex::scoped_lock lk(get_mutex_inst());
+#endif
+   std::string result(get_catalog_name_inst());
+   return result;
+}
+
+#ifdef BOOST_HAS_THREADS
+template <class charT>
+static_mutex& cpp_regex_traits<charT>::get_mutex_inst()
+{
+   static static_mutex s_mutex = BOOST_STATIC_MUTEX_INIT;
+   return s_mutex;
+}
+#endif
+
+
+} // boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/cregex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,329 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0. (See accompanying file
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         cregex.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares POSIX API functions
+  *                + boost::RegEx high level wrapper.
+  */
+
+#ifndef BOOST_RE_CREGEX_HPP_INCLUDED
+#define BOOST_RE_CREGEX_HPP_INCLUDED
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+#include <boost/regex/v4/match_flags.hpp>
+#include <boost/regex/v4/error_type.hpp>
+
+#ifdef __cplusplus
+#include <cstddef>
+#else
+#include <stddef.h>
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+/* include these defs only for POSIX compatablity */
+#ifdef __cplusplus
+namespace boost{
+extern "C" {
+#endif
+
+#if defined(__cplusplus) && !defined(BOOST_NO_STDC_NAMESPACE)
+typedef std::ptrdiff_t regoff_t;
+typedef std::size_t regsize_t;
+#else
+typedef ptrdiff_t regoff_t;
+typedef size_t regsize_t;
+#endif
+
+typedef struct
+{
+   unsigned int re_magic;
+#ifdef __cplusplus
+   std::size_t  re_nsub;      /* number of parenthesized subexpressions */
+#else
+   size_t re_nsub; 
+#endif
+   const char*  re_endp;       /* end pointer for REG_PEND */
+   void* guts;                /* none of your business :-) */
+   match_flag_type eflags;        /* none of your business :-) */
+} regex_tA;
+
+#ifndef BOOST_NO_WREGEX
+typedef struct
+{
+   unsigned int re_magic;
+#ifdef __cplusplus
+   std::size_t  re_nsub;         /* number of parenthesized subexpressions */
+#else
+   size_t re_nsub;
+#endif
+   const wchar_t* re_endp;       /* end pointer for REG_PEND */
+   void* guts;                   /* none of your business :-) */
+   match_flag_type eflags;           /* none of your business :-) */
+} regex_tW;
+#endif
+
+typedef struct
+{
+   regoff_t rm_so;      /* start of match */
+   regoff_t rm_eo;      /* end of match */
+} regmatch_t;
+
+/* regcomp() flags */
+typedef enum{
+   REG_BASIC = 0000,
+   REG_EXTENDED = 0001,
+   REG_ICASE = 0002,
+   REG_NOSUB = 0004,
+   REG_NEWLINE = 0010,
+   REG_NOSPEC = 0020,
+   REG_PEND = 0040,
+   REG_DUMP = 0200,
+   REG_NOCOLLATE = 0400,
+   REG_ESCAPE_IN_LISTS = 01000,
+   REG_NEWLINE_ALT = 02000,
+   REG_PERLEX = 04000,
+
+   REG_PERL = REG_EXTENDED | REG_NOCOLLATE | REG_ESCAPE_IN_LISTS | REG_PERLEX,
+   REG_AWK = REG_EXTENDED | REG_ESCAPE_IN_LISTS,
+   REG_GREP = REG_BASIC | REG_NEWLINE_ALT,
+   REG_EGREP = REG_EXTENDED | REG_NEWLINE_ALT,
+
+   REG_ASSERT = 15,
+   REG_INVARG = 16,
+   REG_ATOI = 255,   /* convert name to number (!) */
+   REG_ITOA = 0400   /* convert number to name (!) */
+} reg_comp_flags;
+
+/* regexec() flags */
+typedef enum{
+   REG_NOTBOL =    00001,
+   REG_NOTEOL =    00002,
+   REG_STARTEND =  00004
+} reg_exec_flags;
+
+//
+// POSIX error codes:
+//
+typedef unsigned reg_error_t;
+typedef reg_error_t reg_errcode_t;  // backwards compatibility
+
+static const reg_error_t REG_NOERROR = 0;   /* Success.  */
+static const reg_error_t REG_NOMATCH = 1;   /* Didn't find a match (for regexec).  */
+
+  /* POSIX regcomp return error codes.  (In the order listed in the
+     standard.)  */
+static const reg_error_t REG_BADPAT = 2;    /* Invalid pattern.  */
+static const reg_error_t REG_ECOLLATE = 3;  /* Undefined collating element.  */
+static const reg_error_t REG_ECTYPE = 4;    /* Invalid character class name.  */
+static const reg_error_t REG_EESCAPE = 5;   /* Trailing backslash.  */
+static const reg_error_t REG_ESUBREG = 6;   /* Invalid back reference.  */
+static const reg_error_t REG_EBRACK = 7;    /* Unmatched left bracket.  */
+static const reg_error_t REG_EPAREN = 8;    /* Parenthesis imbalance.  */
+static const reg_error_t REG_EBRACE = 9;    /* Unmatched \{.  */
+static const reg_error_t REG_BADBR = 10;    /* Invalid contents of \{\}.  */
+static const reg_error_t REG_ERANGE = 11;   /* Invalid range end.  */
+static const reg_error_t REG_ESPACE = 12;   /* Ran out of memory.  */
+static const reg_error_t REG_BADRPT = 13;   /* No preceding re for repetition op.  */
+static const reg_error_t REG_EEND = 14;     /* unexpected end of expression */
+static const reg_error_t REG_ESIZE = 15;    /* expression too big */
+static const reg_error_t REG_ERPAREN = 8;   /* = REG_EPAREN : unmatched right parenthesis */
+static const reg_error_t REG_EMPTY = 17;    /* empty expression */
+static const reg_error_t REG_E_MEMORY = 15; /* = REG_ESIZE : out of memory */
+static const reg_error_t REG_ECOMPLEXITY = 18; /* complexity too high */
+static const reg_error_t REG_ESTACK = 19;   /* out of stack space */
+static const reg_error_t REG_E_UNKNOWN = 20; /* unknown error */
+static const reg_error_t REG_ENOSYS = 20;   /* = REG_E_UNKNOWN : Reserved. */
+
+BOOST_REGEX_DECL int BOOST_REGEX_CCALL regcompA(regex_tA*, const char*, int);
+BOOST_REGEX_DECL regsize_t BOOST_REGEX_CCALL regerrorA(int, const regex_tA*, char*, regsize_t);
+BOOST_REGEX_DECL int BOOST_REGEX_CCALL regexecA(const regex_tA*, const char*, regsize_t, regmatch_t*, int);
+BOOST_REGEX_DECL void BOOST_REGEX_CCALL regfreeA(regex_tA*);
+
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL int BOOST_REGEX_CCALL regcompW(regex_tW*, const wchar_t*, int);
+BOOST_REGEX_DECL regsize_t BOOST_REGEX_CCALL regerrorW(int, const regex_tW*, wchar_t*, regsize_t);
+BOOST_REGEX_DECL int BOOST_REGEX_CCALL regexecW(const regex_tW*, const wchar_t*, regsize_t, regmatch_t*, int);
+BOOST_REGEX_DECL void BOOST_REGEX_CCALL regfreeW(regex_tW*);
+#endif
+
+#ifdef UNICODE
+#define regcomp regcompW
+#define regerror regerrorW
+#define regexec regexecW
+#define regfree regfreeW
+#define regex_t regex_tW
+#else
+#define regcomp regcompA
+#define regerror regerrorA
+#define regexec regexecA
+#define regfree regfreeA
+#define regex_t regex_tA
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef __cplusplus
+} // extern "C"
+} // namespace
+#endif
+
+//
+// C++ high level wrapper goes here:
+//
+#if defined(__cplusplus)
+#include <string>
+#include <vector>
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+class RegEx;
+
+namespace re_detail{
+
+class RegExData;
+struct pred1;
+struct pred2;
+struct pred3;
+struct pred4;
+
+}  // namespace re_detail
+
+#if (defined(BOOST_MSVC) || defined(__BORLANDC__)) && !defined(BOOST_DISABLE_WIN32)
+typedef bool (__cdecl *GrepCallback)(const RegEx& expression);
+typedef bool (__cdecl *GrepFileCallback)(const char* file, const RegEx& expression);
+typedef bool (__cdecl *FindFilesCallback)(const char* file);
+#else
+typedef bool (*GrepCallback)(const RegEx& expression);
+typedef bool (*GrepFileCallback)(const char* file, const RegEx& expression);
+typedef bool (*FindFilesCallback)(const char* file);
+#endif
+
+class BOOST_REGEX_DECL RegEx
+{
+private:
+   re_detail::RegExData* pdata;
+public:
+   RegEx();
+   RegEx(const RegEx& o);
+   ~RegEx();
+   explicit RegEx(const char* c, bool icase = false);
+   explicit RegEx(const std::string& s, bool icase = false);
+   RegEx& operator=(const RegEx& o);
+   RegEx& operator=(const char* p);
+   RegEx& operator=(const std::string& s){ return this->operator=(s.c_str()); }
+   unsigned int SetExpression(const char* p, bool icase = false);
+   unsigned int SetExpression(const std::string& s, bool icase = false){ return SetExpression(s.c_str(), icase); }
+   std::string Expression()const;
+   unsigned int error_code()const;
+   //
+   // now matching operators:
+   //
+   bool Match(const char* p, match_flag_type flags = match_default);
+   bool Match(const std::string& s, match_flag_type flags = match_default) { return Match(s.c_str(), flags); }
+   bool Search(const char* p, match_flag_type flags = match_default);
+   bool Search(const std::string& s, match_flag_type flags = match_default) { return Search(s.c_str(), flags); }
+   unsigned int Grep(GrepCallback cb, const char* p, match_flag_type flags = match_default);
+   unsigned int Grep(GrepCallback cb, const std::string& s, match_flag_type flags = match_default) { return Grep(cb, s.c_str(), flags); }
+   unsigned int Grep(std::vector<std::string>& v, const char* p, match_flag_type flags = match_default);
+   unsigned int Grep(std::vector<std::string>& v, const std::string& s, match_flag_type flags = match_default) { return Grep(v, s.c_str(), flags); }
+   unsigned int Grep(std::vector<std::size_t>& v, const char* p, match_flag_type flags = match_default);
+   unsigned int Grep(std::vector<std::size_t>& v, const std::string& s, match_flag_type flags = match_default) { return Grep(v, s.c_str(), flags); }
+#ifndef BOOST_REGEX_NO_FILEITER
+   unsigned int GrepFiles(GrepFileCallback cb, const char* files, bool recurse = false, match_flag_type flags = match_default);
+   unsigned int GrepFiles(GrepFileCallback cb, const std::string& files, bool recurse = false, match_flag_type flags = match_default) { return GrepFiles(cb, files.c_str(), recurse, flags); }
+   unsigned int FindFiles(FindFilesCallback cb, const char* files, bool recurse = false, match_flag_type flags = match_default);
+   unsigned int FindFiles(FindFilesCallback cb, const std::string& files, bool recurse = false, match_flag_type flags = match_default) { return FindFiles(cb, files.c_str(), recurse, flags); }
+#endif
+
+   std::string Merge(const std::string& in, const std::string& fmt,
+                       bool copy = true, match_flag_type flags = match_default);
+   std::string Merge(const char* in, const char* fmt,
+                       bool copy = true, match_flag_type flags = match_default);
+
+   std::size_t Split(std::vector<std::string>& v, std::string& s, match_flag_type flags = match_default, unsigned max_count = ~0);
+   //
+   // now operators for returning what matched in more detail:
+   //
+   std::size_t Position(int i = 0)const;
+   std::size_t Length(int i = 0)const;
+   bool Matched(int i = 0)const;
+   std::size_t Marks()const;
+   std::string What(int i = 0)const;
+   std::string operator[](int i)const { return What(i); }
+
+   static const std::size_t npos;
+
+   friend struct re_detail::pred1;
+   friend struct re_detail::pred2;
+   friend struct re_detail::pred3;
+   friend struct re_detail::pred4;
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif
+
+#endif // include guard
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/error_type.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,58 @@
+/*
+ *
+ * Copyright (c) 2003-2005
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0. (See accompanying file
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         error_type.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression error type enumerator.
+  */
+
+#ifndef BOOST_REGEX_ERROR_TYPE_HPP
+#define BOOST_REGEX_ERROR_TYPE_HPP
+
+#ifdef __cplusplus
+namespace boost{
+#endif
+
+#ifdef __cplusplus
+namespace regex_constants{
+
+enum error_type{
+
+   error_ok = 0,         // not used
+   error_no_match = 1,   // not used
+   error_bad_pattern = 2,
+   error_collate = 3,
+   error_ctype = 4,
+   error_escape = 5,
+   error_backref = 6,
+   error_brack = 7,
+   error_paren = 8,
+   error_brace = 9,
+   error_badbrace = 10,
+   error_range = 11,
+   error_space = 12,
+   error_badrepeat = 13,
+   error_end = 14,    // not used
+   error_size = 15,
+   error_right_paren = 16,  // not used
+   error_empty = 17,
+   error_complexity = 18,
+   error_stack = 19,
+   error_unknown = 20
+};
+
+}
+}
+#endif // __cplusplus
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/fileiter.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,455 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         fileiter.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares various platform independent file and
+  *                directory iterators, plus binary file input in
+  *                the form of class map_file.
+  */
+
+#ifndef BOOST_RE_FILEITER_HPP_INCLUDED
+#define BOOST_RE_FILEITER_HPP_INCLUDED
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+#include <boost/assert.hpp>
+
+#ifndef BOOST_REGEX_NO_FILEITER
+
+#if (defined(__CYGWIN__) || defined(__CYGWIN32__)) && !defined(BOOST_REGEX_NO_W32)
+#error "Sorry, can't mix <windows.h> with STL code and gcc compiler: if you ran configure, try again with configure --disable-ms-windows"
+#define BOOST_REGEX_FI_WIN32_MAP
+#define BOOST_REGEX_FI_POSIX_DIR
+#elif (defined(__WIN32__) || defined(_WIN32) || defined(WIN32)) && !defined(BOOST_REGEX_NO_W32)
+#define BOOST_REGEX_FI_WIN32_MAP
+#define BOOST_REGEX_FI_WIN32_DIR
+#else
+#define BOOST_REGEX_FI_POSIX_MAP
+#define BOOST_REGEX_FI_POSIX_DIR
+#endif
+
+#if defined(BOOST_REGEX_FI_WIN32_MAP)||defined(BOOST_REGEX_FI_WIN32_DIR)
+#include <windows.h>
+#endif
+
+#if defined(BOOST_REGEX_FI_WIN32_DIR)
+
+#include <cstddef>
+
+namespace boost{
+   namespace re_detail{
+
+#ifndef BOOST_NO_ANSI_APIS
+typedef WIN32_FIND_DATAA _fi_find_data;
+#else
+typedef WIN32_FIND_DATAW _fi_find_data;
+#endif
+typedef HANDLE _fi_find_handle;
+
+   } // namespace re_detail
+
+} // namespace boost
+
+#define _fi_invalid_handle INVALID_HANDLE_VALUE
+#define _fi_dir FILE_ATTRIBUTE_DIRECTORY
+
+#elif defined(BOOST_REGEX_FI_POSIX_DIR)
+
+#include <cstddef>
+#include <cstdio>
+#include <cctype>
+#include <iterator>
+#include <list>
+#include <cassert>
+#include <dirent.h>
+
+#if defined(__SUNPRO_CC)
+using std::list;
+#endif
+
+#ifndef MAX_PATH
+#define MAX_PATH 256
+#endif
+
+namespace boost{
+   namespace re_detail{
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+struct _fi_find_data
+{
+   unsigned dwFileAttributes;
+   char cFileName[MAX_PATH];
+};
+
+struct _fi_priv_data;
+
+typedef _fi_priv_data* _fi_find_handle;
+#define _fi_invalid_handle 0
+#define _fi_dir 1
+
+_fi_find_handle _fi_FindFirstFile(const char* lpFileName, _fi_find_data* lpFindFileData);
+bool _fi_FindNextFile(_fi_find_handle hFindFile,   _fi_find_data* lpFindFileData);
+bool _fi_FindClose(_fi_find_handle hFindFile);
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+   } // namespace re_detail
+} // namespace boost
+
+#ifdef FindFirstFile
+ #undef FindFirstFile
+#endif
+#ifdef FindNextFile
+ #undef FindNextFile
+#endif
+#ifdef FindClose
+ #undef FindClose
+#endif
+
+#define FindFirstFileA _fi_FindFirstFile
+#define FindNextFileA _fi_FindNextFile
+#define FindClose _fi_FindClose
+
+#endif
+
+namespace boost{
+   namespace re_detail{
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+#ifdef BOOST_REGEX_FI_WIN32_MAP // win32 mapfile
+
+class BOOST_REGEX_DECL mapfile
+{
+   HANDLE hfile;
+   HANDLE hmap;
+   const char* _first;
+   const char* _last;
+public:
+
+   typedef const char* iterator;
+
+   mapfile(){ hfile = hmap = 0; _first = _last = 0; }
+   mapfile(const char* file){ hfile = hmap = 0; _first = _last = 0; open(file); }
+   ~mapfile(){ close(); }
+   void open(const char* file);
+   void close();
+   const char* begin(){ return _first; }
+   const char* end(){ return _last; }
+   size_t size(){ return _last - _first; }
+   bool valid(){ return (hfile != 0) && (hfile != INVALID_HANDLE_VALUE); }
+};
+
+
+#else
+
+class BOOST_REGEX_DECL mapfile_iterator;
+
+class BOOST_REGEX_DECL mapfile
+{
+   typedef char* pointer;
+   std::FILE* hfile;
+   long int _size;
+   pointer* _first;
+   pointer* _last;
+   mutable std::list<pointer*> condemed;
+   enum sizes
+   {
+      buf_size = 4096
+   };
+   void lock(pointer* node)const;
+   void unlock(pointer* node)const;
+public:
+
+   typedef mapfile_iterator iterator;
+
+   mapfile(){ hfile = 0; _size = 0; _first = _last = 0; }
+   mapfile(const char* file){ hfile = 0; _size = 0; _first = _last = 0; open(file); }
+   ~mapfile(){ close(); }
+   void open(const char* file);
+   void close();
+   iterator begin()const;
+   iterator end()const;
+   unsigned long size()const{ return _size; }
+   bool valid()const{ return hfile != 0; }
+   friend class mapfile_iterator;
+};
+
+class BOOST_REGEX_DECL mapfile_iterator
+#if !defined(BOOST_NO_STD_ITERATOR) || defined(BOOST_MSVC_STD_ITERATOR)
+: public std::iterator<std::random_access_iterator_tag, char>
+#endif
+{
+   typedef mapfile::pointer internal_pointer;
+   internal_pointer* node;
+   const mapfile* file;
+   unsigned long offset;
+   long position()const
+   {
+      return file ? ((node - file->_first) * mapfile::buf_size + offset) : 0;
+   }
+   void position(long pos)
+   {
+      if(file)
+      {
+         node = file->_first + (pos / mapfile::buf_size);
+         offset = pos % mapfile::buf_size;
+      }
+   }
+public:
+   typedef std::ptrdiff_t                  difference_type;
+   typedef char                            value_type;
+   typedef const char*                     pointer;
+   typedef const char&                     reference;
+   typedef std::random_access_iterator_tag iterator_category;
+
+   mapfile_iterator() { node = 0; file = 0; offset = 0; }
+   mapfile_iterator(const mapfile* f, long arg_position)
+   {
+      file = f;
+      node = f->_first + arg_position / mapfile::buf_size;
+      offset = arg_position % mapfile::buf_size;
+      if(file)
+         file->lock(node);
+   }
+   mapfile_iterator(const mapfile_iterator& i)
+   {
+      file = i.file;
+      node = i.node;
+      offset = i.offset;
+      if(file)
+         file->lock(node);
+   }
+   ~mapfile_iterator()
+   {
+      if(file && node)
+         file->unlock(node);
+   }
+   mapfile_iterator& operator = (const mapfile_iterator& i);
+   char operator* ()const
+   {
+      BOOST_ASSERT(node >= file->_first);
+      BOOST_ASSERT(node < file->_last);
+      return file ? *(*node + sizeof(int) + offset) : char(0);
+   }
+   char operator[] (long off)const
+   {
+      mapfile_iterator tmp(*this);
+      tmp += off;
+      return *tmp;
+   }
+   mapfile_iterator& operator++ ();
+   mapfile_iterator operator++ (int);
+   mapfile_iterator& operator-- ();
+   mapfile_iterator operator-- (int);
+
+   mapfile_iterator& operator += (long off)
+   {
+      position(position() + off);
+      return *this;
+   }
+   mapfile_iterator& operator -= (long off)
+   {
+      position(position() - off);
+      return *this;
+   }
+
+   friend inline bool operator==(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return (i.file == j.file) && (i.node == j.node) && (i.offset == j.offset);
+   }
+
+   friend inline bool operator!=(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return !(i == j);
+   }
+
+   friend inline bool operator<(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return i.position() < j.position();
+   }
+   friend inline bool operator>(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return i.position() > j.position();
+   }
+   friend inline bool operator<=(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return i.position() <= j.position();
+   }
+   friend inline bool operator>=(const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return i.position() >= j.position();
+   }
+
+   friend mapfile_iterator operator + (const mapfile_iterator& i, long off);
+   friend mapfile_iterator operator + (long off, const mapfile_iterator& i)
+   {
+      mapfile_iterator tmp(i);
+      return tmp += off;
+   }
+   friend mapfile_iterator operator - (const mapfile_iterator& i, long off);
+   friend inline long operator - (const mapfile_iterator& i, const mapfile_iterator& j)
+   {
+      return i.position() - j.position();
+   }
+};
+
+#endif
+
+// _fi_sep determines the directory separator, either '\\' or '/'
+BOOST_REGEX_DECL extern const char* _fi_sep;
+
+struct file_iterator_ref
+{
+   _fi_find_handle hf;
+   _fi_find_data _data;
+   long count;
+};
+
+
+class BOOST_REGEX_DECL file_iterator 
+{
+   char* _root;
+   char* _path;
+   char* ptr;
+   file_iterator_ref* ref;
+
+public:
+   typedef std::ptrdiff_t            difference_type;
+   typedef const char*               value_type;
+   typedef const char**              pointer;
+   typedef const char*&              reference;
+   typedef std::input_iterator_tag   iterator_category;
+
+   file_iterator();
+   file_iterator(const char* wild);
+   ~file_iterator();
+   file_iterator(const file_iterator&);
+   file_iterator& operator=(const file_iterator&);
+   const char* root()const { return _root; }
+   const char* path()const { return _path; }
+   const char* name()const { return ptr; }
+   _fi_find_data* data() { return &(ref->_data); }
+   void next();
+   file_iterator& operator++() { next(); return *this; }
+   file_iterator operator++(int);
+   const char* operator*() { return path(); }
+
+   friend inline bool operator == (const file_iterator& f1, const file_iterator& f2)
+   {
+      return ((f1.ref->hf == _fi_invalid_handle) && (f2.ref->hf == _fi_invalid_handle));
+   }
+
+   friend inline bool operator != (const file_iterator& f1, const file_iterator& f2)
+   {
+      return !(f1 == f2);
+   }
+
+};
+
+// dwa 9/13/00 - suppress unused parameter warning
+inline bool operator < (const file_iterator&, const file_iterator&)
+{
+   return false;
+}
+
+
+class BOOST_REGEX_DECL directory_iterator
+{
+   char* _root;
+   char* _path;
+   char* ptr;
+   file_iterator_ref* ref;
+
+public:
+   typedef std::ptrdiff_t            difference_type;
+   typedef const char*               value_type;
+   typedef const char**              pointer;
+   typedef const char*&              reference;
+   typedef std::input_iterator_tag   iterator_category;
+
+   directory_iterator();
+   directory_iterator(const char* wild);
+   ~directory_iterator();
+   directory_iterator(const directory_iterator& other);
+   directory_iterator& operator=(const directory_iterator& other);
+
+   const char* root()const { return _root; }
+   const char* path()const { return _path; }
+   const char* name()const { return ptr; }
+   _fi_find_data* data() { return &(ref->_data); }
+   void next();
+   directory_iterator& operator++() { next(); return *this; }
+   directory_iterator operator++(int);
+   const char* operator*() { return path(); }
+
+   static const char* separator() { return _fi_sep; }
+
+   friend inline bool operator == (const directory_iterator& f1, const directory_iterator& f2)
+   {
+      return ((f1.ref->hf == _fi_invalid_handle) && (f2.ref->hf == _fi_invalid_handle));
+   }
+
+
+   friend inline bool operator != (const directory_iterator& f1, const directory_iterator& f2)
+   {
+      return !(f1 == f2);
+   }
+
+   };
+
+inline bool operator < (const directory_iterator&, const directory_iterator&)
+{
+   return false;
+}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+
+} // namespace re_detail
+using boost::re_detail::directory_iterator;
+using boost::re_detail::file_iterator;
+using boost::re_detail::mapfile;
+} // namespace boost
+
+#endif     // BOOST_REGEX_NO_FILEITER
+#endif     // BOOST_RE_FILEITER_HPP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/instances.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,215 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the
+ * Boost Software License, Version 1.0. (See accompanying file
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         instances.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Defines those template instances that are placed in the
+  *                library rather than in the users object files.
+  */
+
+//
+// note no include guard, we may include this multiple times:
+//
+#ifndef BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+
+namespace boost{
+
+//
+// this header can be included multiple times, each time with
+// a different character type, BOOST_REGEX_CHAR_T must be defined
+// first:
+//
+#ifndef BOOST_REGEX_CHAR_T
+#  error "BOOST_REGEX_CHAR_T not defined"
+#endif
+
+#ifndef BOOST_REGEX_TRAITS_T
+#  define BOOST_REGEX_TRAITS_T , boost::regex_traits<BOOST_REGEX_CHAR_T >
+#endif
+
+//
+// what follows is compiler specific:
+//
+
+#if  defined(__BORLANDC__) && (__BORLANDC__ < 0x600)
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+#  ifndef BOOST_REGEX_INSTANTIATE
+#     pragma option push -Jgx
+#  endif
+
+template class BOOST_REGEX_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >;
+template class BOOST_REGEX_DECL match_results< const BOOST_REGEX_CHAR_T* >;
+#ifndef BOOST_NO_STD_ALLOCATOR
+template class BOOST_REGEX_DECL ::boost::re_detail::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
+#endif
+
+#  ifndef BOOST_REGEX_INSTANTIATE
+#     pragma option pop
+#  endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#elif defined(BOOST_MSVC) || defined(__ICL)
+
+#  ifndef BOOST_REGEX_INSTANTIATE
+#     ifdef __GNUC__
+#        define template __extension__ extern template
+#     else
+#        if BOOST_MSVC > 1310
+#           define BOOST_REGEX_TEMPLATE_DECL
+#        endif
+#        define template extern template
+#     endif
+#  endif
+
+#ifndef BOOST_REGEX_TEMPLATE_DECL
+#  define BOOST_REGEX_TEMPLATE_DECL BOOST_REGEX_DECL
+#endif
+
+#  ifdef BOOST_MSVC
+#     pragma warning(push)
+#     pragma warning(disable : 4251 4231 4660)
+#  endif
+
+template class BOOST_REGEX_TEMPLATE_DECL basic_regex< BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >;
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+template class BOOST_REGEX_TEMPLATE_DECL match_results< const BOOST_REGEX_CHAR_T* >;
+#endif
+#ifndef BOOST_NO_STD_ALLOCATOR
+template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >;
+#endif
+#if !(defined(BOOST_DINKUMWARE_STDLIB) && (BOOST_DINKUMWARE_STDLIB <= 1))\
+   && !(defined(BOOST_INTEL_CXX_VERSION) && (BOOST_INTEL_CXX_VERSION <= 800))\
+   && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))\
+   && !defined(BOOST_REGEX_ICU_INSTANCES)
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+template class BOOST_REGEX_TEMPLATE_DECL match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >;
+#endif
+#ifndef BOOST_NO_STD_ALLOCATOR
+template class BOOST_REGEX_TEMPLATE_DECL ::boost::re_detail::perl_matcher< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >;
+#endif
+#endif
+
+
+#  ifdef BOOST_MSVC
+#     pragma warning(pop)
+#  endif
+
+#  ifdef template
+#     undef template
+#  endif
+
+#undef BOOST_REGEX_TEMPLATE_DECL
+
+#elif (defined(__GNUC__) && (__GNUC__ >= 3))
+
+#  ifndef BOOST_REGEX_INSTANTIATE
+#     define template __extension__ extern template
+#  endif
+
+#if !defined(BOOST_NO_STD_LOCALE) && !defined(BOOST_REGEX_ICU_INSTANCES)
+namespace re_detail{
+template BOOST_REGEX_DECL
+std::locale cpp_regex_traits_base<BOOST_REGEX_CHAR_T>::imbue(const std::locale& l);
+
+template BOOST_REGEX_DECL
+cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type 
+   cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::transform_primary(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
+template BOOST_REGEX_DECL
+cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type 
+   cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::transform(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
+template BOOST_REGEX_DECL
+cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::string_type 
+   cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::lookup_collatename(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
+template BOOST_REGEX_DECL
+void cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::init();
+template BOOST_REGEX_DECL
+cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::char_class_type 
+   cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::lookup_classname_imp(const BOOST_REGEX_CHAR_T* p1, const BOOST_REGEX_CHAR_T* p2) const;
+#ifdef BOOST_REGEX_BUGGY_CTYPE_FACET
+template BOOST_REGEX_DECL
+bool cpp_regex_traits_implementation<BOOST_REGEX_CHAR_T>::isctype(const BOOST_REGEX_CHAR_T c, char_class_type mask) const;
+#endif
+} // namespace
+template BOOST_REGEX_DECL
+int cpp_regex_traits<BOOST_REGEX_CHAR_T>::toi(const BOOST_REGEX_CHAR_T*& first, const BOOST_REGEX_CHAR_T* last, int radix)const;
+template BOOST_REGEX_DECL
+std::string cpp_regex_traits<BOOST_REGEX_CHAR_T>::catalog_name(const std::string& name);
+template BOOST_REGEX_DECL
+std::string& cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_catalog_name_inst();
+template BOOST_REGEX_DECL
+std::string cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_catalog_name();
+#ifdef BOOST_HAS_THREADS
+template BOOST_REGEX_DECL
+static_mutex& cpp_regex_traits<BOOST_REGEX_CHAR_T>::get_mutex_inst();
+#endif
+#endif
+
+template BOOST_REGEX_DECL basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >& 
+   basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::do_assign(
+      const BOOST_REGEX_CHAR_T* p1, 
+      const BOOST_REGEX_CHAR_T* p2, 
+      flag_type f);
+template BOOST_REGEX_DECL basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::locale_type BOOST_REGEX_CALL 
+   basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >::imbue(locale_type l);
+
+template BOOST_REGEX_DECL void BOOST_REGEX_CALL 
+   match_results<const BOOST_REGEX_CHAR_T*>::maybe_assign(
+      const match_results<const BOOST_REGEX_CHAR_T*>& m);
+
+namespace re_detail{
+template BOOST_REGEX_DECL void perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::construct_init(
+      const basic_regex<BOOST_REGEX_CHAR_T BOOST_REGEX_TRAITS_T >& e, match_flag_type f);
+template BOOST_REGEX_DECL bool perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::match();
+template BOOST_REGEX_DECL bool perl_matcher<BOOST_REGEX_CHAR_T const *, match_results< const BOOST_REGEX_CHAR_T* >::allocator_type BOOST_REGEX_TRAITS_T >::find();
+} // namespace
+
+#if (defined(__GLIBCPP__) || defined(__GLIBCXX__)) \
+   && !defined(BOOST_REGEX_ICU_INSTANCES)\
+   && !defined(__SGI_STL_PORT)\
+   && !defined(_STLPORT_VERSION)
+// std:basic_string<>::const_iterator instances as well:
+template BOOST_REGEX_DECL void BOOST_REGEX_CALL 
+   match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>::maybe_assign(
+      const match_results<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator>& m);
+
+namespace re_detail{
+template BOOST_REGEX_DECL void perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::construct_init(
+      const basic_regex<BOOST_REGEX_CHAR_T>& e, match_flag_type f);
+template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::match();
+template BOOST_REGEX_DECL bool perl_matcher<std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator, match_results< std::basic_string<BOOST_REGEX_CHAR_T>::const_iterator >::allocator_type, boost::regex_traits<BOOST_REGEX_CHAR_T > >::find();
+} // namespace
+#endif
+
+#  ifdef template
+#     undef template
+#  endif
+
+
+#endif
+
+} // namespace boost
+
+#endif // BOOST_REGEX_NO_EXTERNAL_TEMPLATES
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/iterator_category.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,87 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_match.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Iterator traits for selecting an iterator type as
+  *                an integral constant expression.
+  */
+
+
+#ifndef BOOST_REGEX_ITERATOR_CATEGORY_HPP
+#define BOOST_REGEX_ITERATOR_CATEGORY_HPP
+
+#include <iterator>
+#include <boost/type_traits/is_convertible.hpp>
+#include <boost/type_traits/is_pointer.hpp>
+
+namespace boost{
+namespace detail{
+
+template <class I>
+struct is_random_imp
+{
+private:
+   typedef typename std::iterator_traits<I>::iterator_category cat;
+public:
+   BOOST_STATIC_CONSTANT(bool, value = (::boost::is_convertible<cat*, std::random_access_iterator_tag*>::value));
+};
+
+template <class I>
+struct is_random_pointer_imp
+{
+   BOOST_STATIC_CONSTANT(bool, value = true);
+};
+
+template <bool is_pointer_type>
+struct is_random_imp_selector
+{
+   template <class I>
+   struct rebind
+   {
+      typedef is_random_imp<I> type;
+   };
+};
+
+template <>
+struct is_random_imp_selector<true>
+{
+   template <class I>
+   struct rebind
+   {
+      typedef is_random_pointer_imp<I> type;
+   };
+};
+
+}
+
+template <class I>
+struct is_random_access_iterator
+{
+private:
+   typedef detail::is_random_imp_selector< ::boost::is_pointer<I>::value> selector;
+   typedef typename selector::template rebind<I> bound_type;
+   typedef typename bound_type::type answer;
+public:
+   BOOST_STATIC_CONSTANT(bool, value = answer::value);
+};
+
+#ifndef BOOST_NO_INCLASS_MEMBER_INITIALIZATION
+template <class I>
+const bool is_random_access_iterator<I>::value;
+#endif
+
+}
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/iterator_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,135 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         iterator_traits.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares iterator traits workarounds.
+  */
+
+#ifndef BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
+#define BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+#if defined(BOOST_NO_STD_ITERATOR_TRAITS) || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+template <class T>
+struct regex_iterator_traits 
+{
+  typedef typename T::iterator_category iterator_category;
+  typedef typename T::value_type        value_type;
+#if !defined(BOOST_NO_STD_ITERATOR)
+  typedef typename T::difference_type   difference_type;
+  typedef typename T::pointer           pointer;
+  typedef typename T::reference         reference;
+#else
+  typedef std::ptrdiff_t                difference_type;
+  typedef value_type*                   pointer;
+  typedef value_type&                   reference;
+#endif
+};
+
+template <class T>
+struct pointer_iterator_traits
+{
+   typedef std::ptrdiff_t difference_type;
+   typedef T value_type;
+   typedef T* pointer;
+   typedef T& reference;
+   typedef std::random_access_iterator_tag iterator_category;
+};
+template <class T>
+struct const_pointer_iterator_traits
+{
+   typedef std::ptrdiff_t difference_type;
+   typedef T value_type;
+   typedef const T* pointer;
+   typedef const T& reference;
+   typedef std::random_access_iterator_tag iterator_category;
+};
+
+template<>
+struct regex_iterator_traits<char*> : pointer_iterator_traits<char>{};
+template<>
+struct regex_iterator_traits<const char*> : const_pointer_iterator_traits<char>{};
+template<>
+struct regex_iterator_traits<wchar_t*> : pointer_iterator_traits<wchar_t>{};
+template<>
+struct regex_iterator_traits<const wchar_t*> : const_pointer_iterator_traits<wchar_t>{};
+//
+// the follwoing are needed for ICU support:
+//
+template<>
+struct regex_iterator_traits<unsigned char*> : pointer_iterator_traits<char>{};
+template<>
+struct regex_iterator_traits<const unsigned char*> : const_pointer_iterator_traits<char>{};
+template<>
+struct regex_iterator_traits<int*> : pointer_iterator_traits<int>{};
+template<>
+struct regex_iterator_traits<const int*> : const_pointer_iterator_traits<int>{};
+
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+template<>
+struct regex_iterator_traits<unsigned short*> : pointer_iterator_traits<unsigned short>{};
+template<>
+struct regex_iterator_traits<const unsigned short*> : const_pointer_iterator_traits<unsigned short>{};
+#endif
+
+#if defined(__SGI_STL_PORT) && defined(__STL_DEBUG)
+template<>
+struct regex_iterator_traits<std::string::iterator> : pointer_iterator_traits<char>{};
+template<>
+struct regex_iterator_traits<std::string::const_iterator> : const_pointer_iterator_traits<char>{};
+#ifndef BOOST_NO_STD_WSTRING
+template<>
+struct regex_iterator_traits<std::wstring::iterator> : pointer_iterator_traits<wchar_t>{};
+template<>
+struct regex_iterator_traits<std::wstring::const_iterator> : const_pointer_iterator_traits<wchar_t>{};
+#endif // BOOST_NO_WSTRING
+#endif // stport
+
+#else
+
+template <class T>
+struct regex_iterator_traits : public std::iterator_traits<T> {};
+
+#endif
+
+} // namespace re_detail
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/match_flags.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,138 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         match_flags.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares match_flags type.
+  */
+
+#ifndef BOOST_REGEX_V4_MATCH_FLAGS
+#define BOOST_REGEX_V4_MATCH_FLAGS
+
+#ifdef __cplusplus
+#  include <boost/cstdint.hpp>
+#endif
+
+#ifdef __cplusplus
+namespace boost{
+   namespace regex_constants{
+#endif
+
+typedef enum _match_flags
+{
+   match_default = 0,
+   match_not_bol = 1,                                // first is not start of line
+   match_not_eol = match_not_bol << 1,               // last is not end of line
+   match_not_bob = match_not_eol << 1,               // first is not start of buffer
+   match_not_eob = match_not_bob << 1,               // last is not end of buffer
+   match_not_bow = match_not_eob << 1,               // first is not start of word
+   match_not_eow = match_not_bow << 1,               // last is not end of word
+   match_not_dot_newline = match_not_eow << 1,       // \n is not matched by '.'
+   match_not_dot_null = match_not_dot_newline << 1,  // '\0' is not matched by '.'
+   match_prev_avail = match_not_dot_null << 1,       // *--first is a valid expression
+   match_init = match_prev_avail << 1,               // internal use
+   match_any = match_init << 1,                      // don't care what we match
+   match_not_null = match_any << 1,                  // string can't be null
+   match_continuous = match_not_null << 1,           // each grep match must continue from
+                                                     // uninterupted from the previous one
+   match_partial = match_continuous << 1,            // find partial matches
+   
+   match_stop = match_partial << 1,                  // stop after first match (grep) V3 only
+   match_not_initial_null = match_stop,              // don't match initial null, V4 only
+   match_all = match_stop << 1,                      // must find the whole of input even if match_any is set
+   match_perl = match_all << 1,                      // Use perl matching rules
+   match_posix = match_perl << 1,                    // Use POSIX matching rules
+   match_nosubs = match_posix << 1,                  // don't trap marked subs
+   match_extra = match_nosubs << 1,                  // include full capture information for repeated captures
+   match_single_line = match_extra << 1,             // treat text as single line and ignor any \n's when matching ^ and $.
+   match_unused1 = match_single_line << 1,           // unused
+   match_unused2 = match_unused1 << 1,               // unused
+   match_unused3 = match_unused2 << 1,               // unused
+   match_max = match_unused3,
+
+   format_perl = 0,                                  // perl style replacement
+   format_default = 0,                               // ditto.
+   format_sed = match_max << 1,                      // sed style replacement.
+   format_all = format_sed << 1,                     // enable all extentions to sytax.
+   format_no_copy = format_all << 1,                 // don't copy non-matching segments.
+   format_first_only = format_no_copy << 1,          // Only replace first occurance.
+   format_is_if = format_first_only << 1,            // internal use only.
+   format_literal = format_is_if << 1                // treat string as a literal
+
+} match_flags;
+
+#if (defined(_MSC_VER) && (_MSC_VER < 1300)) || defined(__BORLANDC__)
+typedef unsigned long match_flag_type;
+#else
+typedef match_flags match_flag_type;
+
+
+#ifdef __cplusplus
+inline match_flags operator&(match_flags m1, match_flags m2)
+{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) & static_cast<boost::int32_t>(m2)); }
+inline match_flags operator|(match_flags m1, match_flags m2)
+{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) | static_cast<boost::int32_t>(m2)); }
+inline match_flags operator^(match_flags m1, match_flags m2)
+{ return static_cast<match_flags>(static_cast<boost::int32_t>(m1) ^ static_cast<boost::int32_t>(m2)); }
+inline match_flags operator~(match_flags m1)
+{ return static_cast<match_flags>(~static_cast<boost::int32_t>(m1)); }
+inline match_flags& operator&=(match_flags& m1, match_flags m2)
+{ m1 = m1&m2; return m1; }
+inline match_flags& operator|=(match_flags& m1, match_flags m2)
+{ m1 = m1|m2; return m1; }
+inline match_flags& operator^=(match_flags& m1, match_flags m2)
+{ m1 = m1^m2; return m1; }
+#endif
+#endif
+
+#ifdef __cplusplus
+} // namespace regex_constants
+//
+// import names into boost for backwards compatiblity:
+//
+using regex_constants::match_flag_type;
+using regex_constants::match_default;
+using regex_constants::match_not_bol;
+using regex_constants::match_not_eol;
+using regex_constants::match_not_bob;
+using regex_constants::match_not_eob;
+using regex_constants::match_not_bow;
+using regex_constants::match_not_eow;
+using regex_constants::match_not_dot_newline;
+using regex_constants::match_not_dot_null;
+using regex_constants::match_prev_avail;
+//using regex_constants::match_init;
+using regex_constants::match_any;
+using regex_constants::match_not_null;
+using regex_constants::match_continuous;
+using regex_constants::match_partial;
+//using regex_constants::match_stop;
+using regex_constants::match_all;
+using regex_constants::match_perl;
+using regex_constants::match_posix;
+using regex_constants::match_nosubs;
+using regex_constants::match_extra;
+using regex_constants::match_single_line;
+//using regex_constants::match_max;
+using regex_constants::format_all;
+using regex_constants::format_sed;
+using regex_constants::format_perl;
+using regex_constants::format_default;
+using regex_constants::format_no_copy;
+using regex_constants::format_first_only;
+//using regex_constants::format_is_if;
+
+} // namespace boost
+#endif // __cplusplus
+#endif // include guard
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/match_results.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,427 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         match_results.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class match_results.
+  */
+
+#ifndef BOOST_REGEX_V4_MATCH_RESULTS_HPP
+#define BOOST_REGEX_V4_MATCH_RESULTS_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4251 4231 4660)
+#endif
+
+template <class BidiIterator, class Allocator>
+class match_results
+{ 
+private:
+#ifndef BOOST_NO_STD_ALLOCATOR
+   typedef          std::vector<sub_match<BidiIterator>, Allocator> vector_type;
+#else
+   typedef          std::vector<sub_match<BidiIterator> >           vector_type;
+#endif
+public: 
+   typedef          sub_match<BidiIterator>                         value_type;
+#if  !defined(BOOST_NO_STD_ALLOCATOR) && !(defined(BOOST_MSVC) && defined(_STLPORT_VERSION))
+   typedef typename Allocator::const_reference                              const_reference;
+#else
+   typedef          const value_type&                                       const_reference;
+#endif
+   typedef          const_reference                                         reference;
+   typedef typename vector_type::const_iterator                             const_iterator;
+   typedef          const_iterator                                          iterator;
+   typedef typename re_detail::regex_iterator_traits<
+                                    BidiIterator>::difference_type          difference_type;
+   typedef typename Allocator::size_type                                    size_type;
+   typedef          Allocator                                               allocator_type;
+   typedef typename re_detail::regex_iterator_traits<
+                                    BidiIterator>::value_type               char_type;
+   typedef          std::basic_string<char_type>                            string_type;
+
+   // construct/copy/destroy:
+   explicit match_results(const Allocator& a = Allocator())
+#ifndef BOOST_NO_STD_ALLOCATOR
+      : m_subs(a), m_base() {}
+#else
+      : m_subs(), m_base() { (void)a; }
+#endif
+   match_results(const match_results& m)
+      : m_subs(m.m_subs), m_base(m.m_base) {}
+   match_results& operator=(const match_results& m)
+   {
+      m_subs = m.m_subs;
+      m_base = m.m_base;
+      return *this;
+   }
+   ~match_results(){}
+
+   // size:
+   size_type size() const
+   { return empty() ? 0 : m_subs.size() - 2; }
+   size_type max_size() const
+   { return m_subs.max_size(); }
+   bool empty() const
+   { return m_subs.size() < 2; }
+   // element access:
+   difference_type length(int sub = 0) const
+   {
+      sub += 2;
+      if((sub < (int)m_subs.size()) && (sub > 0))
+         return m_subs[sub].length();
+      return 0;
+   }
+   difference_type position(size_type sub = 0) const
+   {
+      sub += 2;
+      if(sub < m_subs.size())
+      {
+         const sub_match<BidiIterator>& s = m_subs[sub];
+         if(s.matched || (sub == 2))
+         {
+            return ::boost::re_detail::distance((BidiIterator)(m_base), (BidiIterator)(s.first));
+         }
+      }
+      return ~static_cast<difference_type>(0);
+   }
+   string_type str(int sub = 0) const
+   {
+      sub += 2;
+      string_type result;
+      if(sub < (int)m_subs.size() && (sub > 0))
+      {
+         const sub_match<BidiIterator>& s = m_subs[sub];
+         if(s.matched)
+         {
+            result = s.str();
+         }
+      }
+      return result;
+   }
+   const_reference operator[](int sub) const
+   {
+      sub += 2;
+      if(sub < (int)m_subs.size() && (sub >= 0))
+      {
+         return m_subs[sub];
+      }
+      return m_null;
+   }
+
+   const_reference prefix() const
+   {
+      return (*this)[-1];
+   }
+
+   const_reference suffix() const
+   {
+      return (*this)[-2];
+   }
+   const_iterator begin() const
+   {
+      return (m_subs.size() > 2) ? (m_subs.begin() + 2) : m_subs.end();
+   }
+   const_iterator end() const
+   {
+      return m_subs.end();
+   }
+   // format:
+   template <class OutputIterator>
+   OutputIterator format(OutputIterator out,
+                         const string_type& fmt,
+                         match_flag_type flags = format_default) const
+   {
+      re_detail::trivial_format_traits<char_type> traits;
+      return re_detail::regex_format_imp(out, *this, fmt.data(), fmt.data() + fmt.size(), flags, traits);
+   }
+   string_type format(const string_type& fmt,
+                      match_flag_type flags = format_default) const
+   {
+      string_type result;
+      re_detail::string_out_iterator<string_type> i(result);
+      re_detail::trivial_format_traits<char_type> traits;
+      re_detail::regex_format_imp(i, *this, fmt.data(), fmt.data() + fmt.size(), flags, traits);
+      return result;
+   }
+   // format with locale:
+   template <class OutputIterator, class RegexT>
+   OutputIterator format(OutputIterator out,
+                         const string_type& fmt,
+                         match_flag_type flags,
+                         const RegexT& re) const
+   {
+      return ::boost::re_detail::regex_format_imp(out, *this, fmt.data(), fmt.data() + fmt.size(), flags, re.get_traits());
+   }
+   template <class RegexT>
+   string_type format(const string_type& fmt,
+                      match_flag_type flags,
+                      const RegexT& re) const
+   {
+      string_type result;
+      re_detail::string_out_iterator<string_type> i(result);
+      ::boost::re_detail::regex_format_imp(i, *this, fmt.data(), fmt.data() + fmt.size(), flags, re.get_traits());
+      return result;
+   }
+
+   allocator_type get_allocator() const
+   {
+#ifndef BOOST_NO_STD_ALLOCATOR
+      return m_subs.get_allocator();
+#else
+     return allocator_type();
+#endif
+   }
+   void swap(match_results& that)
+   {
+      std::swap(m_subs, that.m_subs);
+      std::swap(m_base, that.m_base);
+   }
+   bool operator==(const match_results& that)const
+   {
+      return (m_subs == that.m_subs) && (m_base == that.m_base);
+   }
+   bool operator!=(const match_results& that)const
+   { return !(*this == that); }
+
+#ifdef BOOST_REGEX_MATCH_EXTRA
+   typedef typename sub_match<BidiIterator>::capture_sequence_type capture_sequence_type;
+
+   const capture_sequence_type& captures(int i)const
+   {
+      return (*this)[i].captures();
+   }
+#endif
+
+   //
+   // private access functions:
+   void BOOST_REGEX_CALL set_second(BidiIterator i)
+   {
+      BOOST_ASSERT(m_subs.size() > 2);
+      m_subs[2].second = i;
+      m_subs[2].matched = true;
+      m_subs[0].first = i;
+      m_subs[0].matched = (m_subs[0].first != m_subs[0].second);
+      m_null.first = i;
+      m_null.second = i;
+      m_null.matched = false;
+   }
+
+   void BOOST_REGEX_CALL set_second(BidiIterator i, size_type pos, bool m = true)
+   {
+      pos += 2;
+      BOOST_ASSERT(m_subs.size() > pos);
+      m_subs[pos].second = i;
+      m_subs[pos].matched = m;
+      if(pos == 2)
+      {
+         m_subs[0].first = i;
+         m_subs[0].matched = (m_subs[0].first != m_subs[0].second);
+         m_null.first = i;
+         m_null.second = i;
+         m_null.matched = false;
+      }
+   }
+   void BOOST_REGEX_CALL set_size(size_type n, BidiIterator i, BidiIterator j)
+   {
+      value_type v(j);
+      size_type len = m_subs.size();
+      if(len > n + 2)
+      {
+         m_subs.erase(m_subs.begin()+n+2, m_subs.end());
+         std::fill(m_subs.begin(), m_subs.end(), v);
+      }
+      else
+      {
+         std::fill(m_subs.begin(), m_subs.end(), v);
+         if(n+2 != len)
+            m_subs.insert(m_subs.end(), n+2-len, v);
+      }
+      m_subs[1].first = i;
+   }
+   void BOOST_REGEX_CALL set_base(BidiIterator pos)
+   {
+      m_base = pos;
+   }
+   BidiIterator base()const
+   {
+      return m_base;
+   }
+   void BOOST_REGEX_CALL set_first(BidiIterator i)
+   {
+      // set up prefix:
+      m_subs[1].second = i;
+      m_subs[1].matched = (m_subs[1].first != i);
+      // set up $0:
+      m_subs[2].first = i;
+      // zero out everything else:
+      for(size_type n = 3; n < m_subs.size(); ++n)
+      {
+         m_subs[n].first = m_subs[n].second = m_subs[0].second;
+         m_subs[n].matched = false;
+      }
+   }
+   void BOOST_REGEX_CALL set_first(BidiIterator i, size_type pos)
+   {
+      BOOST_ASSERT(pos+2 < m_subs.size());
+      if(pos)
+         m_subs[pos+2].first = i;
+      else
+         set_first(i);
+   }
+   void BOOST_REGEX_CALL maybe_assign(const match_results<BidiIterator, Allocator>& m);
+
+
+private:
+   vector_type            m_subs; // subexpressions
+   BidiIterator   m_base; // where the search started from
+   sub_match<BidiIterator> m_null; // a null match
+};
+
+template <class BidiIterator, class Allocator>
+void BOOST_REGEX_CALL match_results<BidiIterator, Allocator>::maybe_assign(const match_results<BidiIterator, Allocator>& m)
+{
+   const_iterator p1, p2;
+   p1 = begin();
+   p2 = m.begin();
+   //
+   // Distances are measured from the start of *this* match, unless this isn't
+   // a valid match in which case we use the start of the whole sequence.  Note that
+   // no subsequent match-candidate can ever be to the left of the first match found.
+   // This ensures that when we are using bidirectional iterators, that distances 
+   // measured are as short as possible, and therefore as efficient as possible
+   // to compute.  Finally note that we don't use the "matched" data member to test
+   // whether a sub-expression is a valid match, because partial matches set this
+   // to false for sub-expression 0.
+   //
+   BidiIterator l_end = this->suffix().second;
+   BidiIterator l_base = (p1->first == l_end) ? this->prefix().first : (*this)[0].first;
+   difference_type len1 = 0;
+   difference_type len2 = 0;
+   difference_type base1 = 0;
+   difference_type base2 = 0;
+   std::size_t i;
+   for(i = 0; i < size(); ++i, ++p1, ++p2)
+   {
+      //
+      // Leftmost takes priority over longest; handle special cases
+      // where distances need not be computed first (an optimisation
+      // for bidirectional iterators: ensure that we don't accidently
+      // compute the length of the whole sequence, as this can be really
+      // expensive).
+      //
+      if(p1->first == l_end)
+      {
+         if(p2->first != l_end)
+         {
+            // p2 must be better than p1, and no need to calculate
+            // actual distances:
+            base1 = 1;
+            base2 = 0;
+            break;
+         }
+         else
+         {
+            // *p1 and *p2 are either unmatched or match end-of sequence,
+            // either way no need to calculate distances:
+            if((p1->matched == false) && (p2->matched == true))
+               break;
+            if((p1->matched == true) && (p2->matched == false))
+               return;
+            continue;
+         }
+      }
+      else if(p2->first == l_end)
+      {
+         // p1 better than p2, and no need to calculate distances:
+         return;
+      }
+      base1 = ::boost::re_detail::distance(l_base, p1->first);
+      base2 = ::boost::re_detail::distance(l_base, p2->first);
+      BOOST_ASSERT(base1 >= 0);
+      BOOST_ASSERT(base2 >= 0);
+      if(base1 < base2) return;
+      if(base2 < base1) break;
+
+      len1 = ::boost::re_detail::distance((BidiIterator)p1->first, (BidiIterator)p1->second);
+      len2 = ::boost::re_detail::distance((BidiIterator)p2->first, (BidiIterator)p2->second);
+      BOOST_ASSERT(len1 >= 0);
+      BOOST_ASSERT(len2 >= 0);
+      if((len1 != len2) || ((p1->matched == false) && (p2->matched == true)))
+         break;
+      if((p1->matched == true) && (p2->matched == false))
+         return;
+   }
+   if(i == size())
+      return;
+   if(base2 < base1)
+      *this = m;
+   else if((len2 > len1) || ((p1->matched == false) && (p2->matched == true)) )
+      *this = m;
+}
+
+template <class BidiIterator, class Allocator>
+void swap(match_results<BidiIterator, Allocator>& a, match_results<BidiIterator, Allocator>& b)
+{
+   a.swap(b);
+}
+
+#ifndef BOOST_NO_STD_LOCALE
+template <class charT, class traits, class BidiIterator, class Allocator>
+std::basic_ostream<charT, traits>&
+   operator << (std::basic_ostream<charT, traits>& os,
+                const match_results<BidiIterator, Allocator>& s)
+{
+   return (os << s.str());
+}
+#else
+template <class BidiIterator, class Allocator>
+std::ostream& operator << (std::ostream& os,
+                           const match_results<BidiIterator, Allocator>& s)
+{
+   return (os << s.str());
+}
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/mem_block_cache.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,99 @@
+ /*
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         mem_block_cache.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: memory block cache used by the non-recursive matcher.
+  */
+
+#ifndef BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
+#define BOOST_REGEX_V4_MEM_BLOCK_CACHE_HPP
+
+#include <new>
+#ifdef BOOST_HAS_THREADS
+#include <boost/regex/pending/static_mutex.hpp>
+#endif
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+namespace boost{
+namespace re_detail{
+
+struct mem_block_node
+{
+   mem_block_node* next;
+};
+
+struct mem_block_cache
+{
+   // this member has to be statically initialsed:
+   mem_block_node* next;
+   unsigned cached_blocks;
+#ifdef BOOST_HAS_THREADS
+   boost::static_mutex mut;
+#endif
+
+   ~mem_block_cache()
+   {
+      while(next)
+      {
+         mem_block_node* old = next;
+         next = next->next;
+         ::operator delete(old);
+      }
+   }
+   void* get()
+   {
+#ifdef BOOST_HAS_THREADS
+      boost::static_mutex::scoped_lock g(mut);
+#endif
+     if(next)
+      {
+         mem_block_node* result = next;
+         next = next->next;
+         --cached_blocks;
+         return result;
+      }
+      return ::operator new(BOOST_REGEX_BLOCKSIZE);
+   }
+   void put(void* p)
+   {
+#ifdef BOOST_HAS_THREADS
+      boost::static_mutex::scoped_lock g(mut);
+#endif
+      if(cached_blocks >= BOOST_REGEX_MAX_CACHE_BLOCKS)
+      {
+         ::operator delete(p);
+      }
+      else
+      {
+         mem_block_node* old = static_cast<mem_block_node*>(p);
+         old->next = next;
+         next = old;
+         ++cached_blocks;
+      }
+   }
+};
+
+extern mem_block_cache block_cache;
+
+}
+} // namespace boost
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,556 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+#ifndef BOOST_REGEX_MATCHER_HPP
+#define BOOST_REGEX_MATCHER_HPP
+
+#include <boost/regex/v4/iterator_category.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4800)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+//
+// error checking API:
+//
+BOOST_REGEX_DECL void BOOST_REGEX_CALL verify_options(boost::regex_constants::syntax_option_type ef, match_flag_type mf);
+//
+// function can_start:
+//
+template <class charT>
+inline bool can_start(charT c, const unsigned char* map, unsigned char mask)
+{
+   return ((c < static_cast<charT>(0)) ? true : ((c >= static_cast<charT>(1 << CHAR_BIT)) ? true : map[c] & mask));
+}
+inline bool can_start(char c, const unsigned char* map, unsigned char mask)
+{
+   return map[(unsigned char)c] & mask;
+}
+inline bool can_start(signed char c, const unsigned char* map, unsigned char mask)
+{
+   return map[(unsigned char)c] & mask;
+}
+inline bool can_start(unsigned char c, const unsigned char* map, unsigned char mask)
+{
+   return map[c] & mask;
+}
+inline bool can_start(unsigned short c, const unsigned char* map, unsigned char mask)
+{
+   return ((c >= (1 << CHAR_BIT)) ? true : map[c] & mask);
+}
+#if !defined(__hpux) // WCHAR_MIN not usable in pp-directives.
+#if defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+inline bool can_start(wchar_t c, const unsigned char* map, unsigned char mask)
+{
+   return ((c >= static_cast<wchar_t>(1u << CHAR_BIT)) ? true : map[c] & mask);
+}
+#endif
+#endif
+#if !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+inline bool can_start(unsigned int c, const unsigned char* map, unsigned char mask)
+{
+   return (((c >= static_cast<unsigned int>(1u << CHAR_BIT)) ? true : map[c] & mask));
+}
+#endif
+
+
+//
+// Unfortunately Rogue Waves standard library appears to have a bug
+// in std::basic_string::compare that results in eroneous answers
+// in some cases (tested with Borland C++ 5.1, Rogue Wave lib version
+// 0x020101) the test case was:
+// {39135,0} < {0xff,0}
+// which succeeds when it should not.
+//
+#ifndef _RWSTD_VER
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
+template <class C, class T, class A>
+inline int string_compare(const std::basic_string<C,T,A>& s, const C* p)
+{ 
+   if(0 == *p)
+   {
+      if(s.empty() || ((s.size() == 1) && (s[0] == 0)))
+         return 0;
+   }
+   return s.compare(p); 
+}
+#endif
+#else
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
+template <class C, class T, class A>
+inline int string_compare(const std::basic_string<C,T,A>& s, const C* p)
+{ 
+   if(0 == *p)
+   {
+      if(s.empty() || ((s.size() == 1) && (s[0] == 0)))
+         return 0;
+   }
+   return s.compare(p); 
+}
+#endif
+inline int string_compare(const std::string& s, const char* p)
+{ return std::strcmp(s.c_str(), p); }
+# ifndef BOOST_NO_WREGEX
+inline int string_compare(const std::wstring& s, const wchar_t* p)
+{ return std::wcscmp(s.c_str(), p); }
+#endif
+#endif
+template <class Seq, class C>
+inline int string_compare(const Seq& s, const C* p)
+{
+   std::size_t i = 0;
+   while((i < s.size()) && (p[i] == s[i]))
+   {
+      ++i;
+   }
+   return (i == s.size()) ? -p[i] : s[i] - p[i];
+}
+# define STR_COMP(s,p) string_compare(s,p)
+
+template<class charT>
+inline const charT* re_skip_past_null(const charT* p)
+{
+  while (*p != static_cast<charT>(0)) ++p;
+  return ++p;
+}
+
+template <class iterator, class charT, class traits_type, class char_classT>
+iterator BOOST_REGEX_CALL re_is_set_member(iterator next, 
+                          iterator last, 
+                          const re_set_long<char_classT>* set_, 
+                          const regex_data<charT, traits_type>& e, bool icase)
+{   
+   const charT* p = reinterpret_cast<const charT*>(set_+1);
+   iterator ptr;
+   unsigned int i;
+   //bool icase = e.m_flags & regex_constants::icase;
+
+   if(next == last) return next;
+
+   typedef typename traits_type::string_type traits_string_type;
+   const ::boost::regex_traits_wrapper<traits_type>& traits_inst = *(e.m_ptraits);
+   
+   // dwa 9/13/00 suppress incorrect MSVC warning - it claims this is never
+   // referenced
+   (void)traits_inst;
+
+   // try and match a single character, could be a multi-character
+   // collating element...
+   for(i = 0; i < set_->csingles; ++i)
+   {
+      ptr = next;
+      if(*p == static_cast<charT>(0))
+      {
+         // treat null string as special case:
+         if(traits_inst.translate(*ptr, icase) != *p)
+         {
+            while(*p == static_cast<charT>(0))++p;
+            continue;
+         }
+         return set_->isnot ? next : (ptr == next) ? ++next : ptr;
+      }
+      else
+      {
+         while(*p && (ptr != last))
+         {
+            if(traits_inst.translate(*ptr, icase) != *p)
+               break;
+            ++p;
+            ++ptr;
+         }
+
+         if(*p == static_cast<charT>(0)) // if null we've matched
+            return set_->isnot ? next : (ptr == next) ? ++next : ptr;
+
+         p = re_skip_past_null(p);     // skip null
+      }
+   }
+
+   charT col = traits_inst.translate(*next, icase);
+
+
+   if(set_->cranges || set_->cequivalents)
+   {
+      traits_string_type s1;
+      //
+      // try and match a range, NB only a single character can match
+      if(set_->cranges)
+      {
+         if((e.m_flags & regex_constants::collate) == 0)
+            s1.assign(1, col);
+         else
+         {
+            charT a[2] = { col, charT(0), };
+            s1 = traits_inst.transform(a, a + 1);
+         }
+         for(i = 0; i < set_->cranges; ++i)
+         {
+            if(STR_COMP(s1, p) >= 0)
+            {
+               do{ ++p; }while(*p);
+               ++p;
+               if(STR_COMP(s1, p) <= 0)
+                  return set_->isnot ? next : ++next;
+            }
+            else
+            {
+               // skip first string
+               do{ ++p; }while(*p);
+               ++p;
+            }
+            // skip second string
+            do{ ++p; }while(*p);
+            ++p;
+         }
+      }
+      //
+      // try and match an equivalence class, NB only a single character can match
+      if(set_->cequivalents)
+      {
+         charT a[2] = { col, charT(0), };
+         s1 = traits_inst.transform_primary(a, a +1);
+         for(i = 0; i < set_->cequivalents; ++i)
+         {
+            if(STR_COMP(s1, p) == 0)
+               return set_->isnot ? next : ++next;
+            // skip string
+            do{ ++p; }while(*p);
+            ++p;
+         }
+      }
+   }
+   if(traits_inst.isctype(col, set_->cclasses) == true)
+      return set_->isnot ? next : ++next;
+   if((set_->cnclasses != 0) && (traits_inst.isctype(col, set_->cnclasses) == false))
+      return set_->isnot ? next : ++next;
+   return set_->isnot ? ++next : next;
+}
+
+template <class BidiIterator>
+class repeater_count
+{
+   repeater_count** stack;
+   repeater_count* next;
+   int state_id;
+   std::size_t count;        // the number of iterations so far
+   BidiIterator start_pos;   // where the last repeat started
+public:
+   repeater_count(repeater_count** s)
+   {
+      stack = s;
+      next = 0;
+      state_id = -1;
+      count = 0;
+   }
+   repeater_count(int i, repeater_count** s, BidiIterator start)
+      : start_pos(start)
+   {
+      state_id = i;
+      stack = s;
+      next = *stack;
+      *stack = this;
+      if(state_id > next->state_id)
+         count = 0;
+      else
+      {
+         repeater_count* p = next;
+         while(p->state_id != state_id)
+            p = p->next;
+         count = p->count;
+         start_pos = p->start_pos;
+      }
+   }
+   ~repeater_count()
+   {
+      *stack = next;
+   }
+   std::size_t get_count() { return count; }
+   int get_id() { return state_id; }
+   std::size_t operator++() { return ++count; }
+   bool check_null_repeat(const BidiIterator& pos, std::size_t max)
+   {
+      // this is called when we are about to start a new repeat,
+      // if the last one was NULL move our count to max,
+      // otherwise save the current position.
+      bool result = (count == 0) ? false : (pos == start_pos);
+      if(result)
+         count = max;
+      else
+         start_pos = pos;
+      return result;
+   }
+};
+
+struct saved_state;
+
+enum saved_state_type
+{
+   saved_type_end = 0,
+   saved_type_paren = 1,
+   saved_type_recurse = 2,
+   saved_type_assertion = 3,
+   saved_state_alt = 4,
+   saved_state_repeater_count = 5,
+   saved_state_extra_block = 6,
+   saved_state_greedy_single_repeat = 7,
+   saved_state_rep_slow_dot = 8,
+   saved_state_rep_fast_dot = 9,
+   saved_state_rep_char = 10,
+   saved_state_rep_short_set = 11,
+   saved_state_rep_long_set = 12,
+   saved_state_non_greedy_long_repeat = 13, 
+   saved_state_count = 14
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable : 4251 4231 4660)
+#endif
+
+template <class BidiIterator, class Allocator, class traits>
+class perl_matcher
+{
+public:
+   typedef typename traits::char_type char_type;
+   typedef perl_matcher<BidiIterator, Allocator, traits> self_type;
+   typedef bool (self_type::*matcher_proc_type)(void);
+   typedef std::size_t traits_size_type;
+   typedef typename is_byte<char_type>::width_type width_type;
+   typedef typename regex_iterator_traits<BidiIterator>::difference_type difference_type;
+
+   perl_matcher(BidiIterator first, BidiIterator end, 
+      match_results<BidiIterator, Allocator>& what, 
+      const basic_regex<char_type, traits>& e,
+      match_flag_type f,
+      BidiIterator l_base)
+      :  m_result(what), base(first), last(end), 
+         position(first), backstop(l_base), re(e), traits_inst(e.get_traits()), 
+         m_independent(false), next_count(&rep_obj), rep_obj(&next_count)
+   {
+      construct_init(e, f);
+   }
+
+   bool match();
+   bool find();
+
+   void setf(match_flag_type f)
+   { m_match_flags |= f; }
+   void unsetf(match_flag_type f)
+   { m_match_flags &= ~f; }
+
+private:
+   void construct_init(const basic_regex<char_type, traits>& e, match_flag_type f);
+
+   bool find_imp();
+   bool match_imp();
+#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
+   typedef bool (perl_matcher::*protected_proc_type)();
+   bool protected_call(protected_proc_type);
+#endif
+   void estimate_max_state_count(std::random_access_iterator_tag*);
+   void estimate_max_state_count(void*);
+   bool match_prefix();
+   bool match_all_states();
+
+   // match procs, stored in s_match_vtable:
+   bool match_startmark();
+   bool match_endmark();
+   bool match_literal();
+   bool match_start_line();
+   bool match_end_line();
+   bool match_wild();
+   bool match_match();
+   bool match_word_boundary();
+   bool match_within_word();
+   bool match_word_start();
+   bool match_word_end();
+   bool match_buffer_start();
+   bool match_buffer_end();
+   bool match_backref();
+   bool match_long_set();
+   bool match_set();
+   bool match_jump();
+   bool match_alt();
+   bool match_rep();
+   bool match_combining();
+   bool match_soft_buffer_end();
+   bool match_restart_continue();
+   bool match_long_set_repeat();
+   bool match_set_repeat();
+   bool match_char_repeat();
+   bool match_dot_repeat_fast();
+   bool match_dot_repeat_slow();
+   bool match_backstep();
+   bool match_assert_backref();
+   bool match_toggle_case();
+#ifdef BOOST_REGEX_RECURSIVE
+   bool backtrack_till_match(std::size_t count);
+#endif
+
+   // find procs stored in s_find_vtable:
+   bool find_restart_any();
+   bool find_restart_word();
+   bool find_restart_line();
+   bool find_restart_buf();
+   bool find_restart_lit();
+
+private:
+   // final result structure to be filled in:
+   match_results<BidiIterator, Allocator>& m_result;
+   // temporary result for POSIX matches:
+   scoped_ptr<match_results<BidiIterator, Allocator> > m_temp_match;
+   // pointer to actual result structure to fill in:
+   match_results<BidiIterator, Allocator>* m_presult;
+   // start of sequence being searched:
+   BidiIterator base;
+   // end of sequence being searched:
+   BidiIterator last; 
+   // current character being examined:
+   BidiIterator position;
+   // where to restart next search after failed match attempt:
+   BidiIterator restart;
+   // where the current search started from, acts as base for $` during grep:
+   BidiIterator search_base;
+   // how far we can go back when matching lookbehind:
+   BidiIterator backstop;
+   // the expression being examined:
+   const basic_regex<char_type, traits>& re;
+   // the expression's traits class:
+   const ::boost::regex_traits_wrapper<traits>& traits_inst;
+   // the next state in the machine being matched:
+   const re_syntax_base* pstate;
+   // matching flags in use:
+   match_flag_type m_match_flags;
+   // how many states we have examined so far:
+   boost::uintmax_t state_count;
+   // max number of states to examine before giving up:
+   boost::uintmax_t max_state_count;
+   // whether we should ignore case or not:
+   bool icase;
+   // set to true when (position == last), indicates that we may have a partial match:
+   bool m_has_partial_match;
+   // set to true whenever we get a match:
+   bool m_has_found_match;
+   // set to true whenever we're inside an independent sub-expression:
+   bool m_independent;
+   // the current repeat being examined:
+   repeater_count<BidiIterator>* next_count;
+   // the first repeat being examined (top of linked list):
+   repeater_count<BidiIterator> rep_obj;
+   // the mask to pass when matching word boundaries:
+   typename traits::char_class_type m_word_mask;
+   // the bitmask to use when determining whether a match_any matches a newline or not:
+   unsigned char match_any_mask;
+
+#ifdef BOOST_REGEX_NON_RECURSIVE
+   //
+   // additional members for non-recursive version:
+   //
+   typedef bool (self_type::*unwind_proc_type)(bool);
+
+   void extend_stack();
+   bool unwind(bool);
+   bool unwind_end(bool);
+   bool unwind_paren(bool);
+   bool unwind_recursion_stopper(bool);
+   bool unwind_assertion(bool);
+   bool unwind_alt(bool);
+   bool unwind_repeater_counter(bool);
+   bool unwind_extra_block(bool);
+   bool unwind_greedy_single_repeat(bool);
+   bool unwind_slow_dot_repeat(bool);
+   bool unwind_fast_dot_repeat(bool);
+   bool unwind_char_repeat(bool);
+   bool unwind_short_set_repeat(bool);
+   bool unwind_long_set_repeat(bool);
+   bool unwind_non_greedy_repeat(bool);
+   void destroy_single_repeat();
+   void push_matched_paren(int index, const sub_match<BidiIterator>& sub);
+   void push_recursion_stopper();
+   void push_assertion(const re_syntax_base* ps, bool positive);
+   void push_alt(const re_syntax_base* ps);
+   void push_repeater_count(int i, repeater_count<BidiIterator>** s);
+   void push_single_repeat(std::size_t c, const re_repeat* r, BidiIterator last_position, int state_id);
+   void push_non_greedy_repeat(const re_syntax_base* ps);
+
+
+   // pointer to base of stack:
+   saved_state* m_stack_base;
+   // pointer to current stack position:
+   saved_state* m_backup_state;
+   // determines what value to return when unwinding from recursion,
+   // allows for mixed recursive/non-recursive algorithm:
+   bool m_recursive_result;
+   // how many memory blocks have we used up?:
+   unsigned used_block_count;
+#endif
+
+   // these operations aren't allowed, so are declared private,
+   // bodies are provided to keep explicit-instantiation requests happy:
+   perl_matcher& operator=(const perl_matcher&)
+   {
+      return *this;
+   }
+   perl_matcher(const perl_matcher& that)
+      : m_result(that.m_result), re(that.re), traits_inst(that.traits_inst), rep_obj(0) {}
+};
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace re_detail
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+//
+// include the implementation of perl_matcher:
+//
+#ifdef BOOST_REGEX_RECURSIVE
+#include <boost/regex/v4/perl_matcher_recursive.hpp>
+#else
+#include <boost/regex/v4/perl_matcher_non_recursive.hpp>
+#endif
+// this one has to be last:
+#include <boost/regex/v4/perl_matcher_common.hpp>
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher_common.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,971 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         perl_matcher_common.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Definitions of perl_matcher member functions that are 
+  *                common to both the recursive and non-recursive versions.
+  */
+
+#ifndef BOOST_REGEX_V4_PERL_MATCHER_COMMON_HPP
+#define BOOST_REGEX_V4_PERL_MATCHER_COMMON_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef __BORLANDC__
+#  pragma option push -w-8008 -w-8066
+#endif
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4800)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+template <class BidiIterator, class Allocator, class traits>
+void perl_matcher<BidiIterator, Allocator, traits>::construct_init(const basic_regex<char_type, traits>& e, match_flag_type f)
+{ 
+   typedef typename regex_iterator_traits<BidiIterator>::iterator_category category;
+   typedef typename basic_regex<char_type, traits>::flag_type expression_flag_type;
+   
+   if(e.empty())
+   {
+      // precondition failure: e is not a valid regex.
+      std::invalid_argument ex("Invalid regular expression object");
+      boost::throw_exception(ex);
+   }
+   pstate = 0;
+   m_match_flags = f;
+   estimate_max_state_count(static_cast<category*>(0));
+   expression_flag_type re_f = re.flags();
+   icase = re_f & regex_constants::icase;
+   if(!(m_match_flags & (match_perl|match_posix)))
+   {
+      if((re_f & (regbase::main_option_type|regbase::no_perl_ex)) == 0)
+         m_match_flags |= match_perl;
+      else if((re_f & (regbase::main_option_type|regbase::emacs_ex)) == (regbase::basic_syntax_group|regbase::emacs_ex))
+         m_match_flags |= match_perl;
+      else
+         m_match_flags |= match_posix;
+   }
+   if(m_match_flags & match_posix)
+   {
+      m_temp_match.reset(new match_results<BidiIterator, Allocator>());
+      m_presult = m_temp_match.get();
+   }
+   else
+      m_presult = &m_result;
+#ifdef BOOST_REGEX_NON_RECURSIVE
+   m_stack_base = 0;
+   m_backup_state = 0;
+#endif
+   // find the value to use for matching word boundaries:
+   m_word_mask = re.get_data().m_word_mask; 
+   // find bitmask to use for matching '.':
+   match_any_mask = static_cast<unsigned char>((f & match_not_dot_newline) ? re_detail::test_not_newline : re_detail::test_newline);
+}
+
+template <class BidiIterator, class Allocator, class traits>
+void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(std::random_access_iterator_tag*)
+{
+   //
+   // How many states should we allow our machine to visit before giving up?
+   // This is a heuristic: it takes the greater of O(N^2) and O(NS^2)
+   // where N is the length of the string, and S is the number of states
+   // in the machine.  It's tempting to up this to O(N^2S) or even O(N^2S^2)
+   // but these take unreasonably amounts of time to bale out in pathological
+   // cases.
+   //
+   // Calculate NS^2 first:
+   //
+   static const boost::uintmax_t k = 100000;
+   boost::uintmax_t dist = boost::re_detail::distance(base, last);
+   if(dist == 0)
+      dist = 1;
+   boost::uintmax_t states = re.size();
+   if(states == 0)
+      states = 1;
+   states *= states;
+   if((std::numeric_limits<boost::uintmax_t>::max)() / dist < states)
+   {
+      max_state_count = (std::numeric_limits<boost::uintmax_t>::max)() - 2;
+      return;
+   }
+   states *= dist;
+   if((std::numeric_limits<boost::uintmax_t>::max)() - k < states)
+   {
+      max_state_count = (std::numeric_limits<boost::uintmax_t>::max)() - 2;
+      return;
+   }
+   states += k;
+
+   max_state_count = states;
+
+   //
+   // Now calculate N^2:
+   //
+   states = dist;
+   if((std::numeric_limits<boost::uintmax_t>::max)() / dist < states)
+   {
+      max_state_count = (std::numeric_limits<boost::uintmax_t>::max)() - 2;
+      return;
+   }
+   states *= dist;
+   if((std::numeric_limits<boost::uintmax_t>::max)() - k < states)
+   {
+      max_state_count = (std::numeric_limits<boost::uintmax_t>::max)() - 2;
+      return;
+   }
+   states += k;
+   //
+   // N^2 can be a very large number indeed, to prevent things getting out
+   // of control, cap the max states:
+   //
+   if(states > BOOST_REGEX_MAX_STATE_COUNT)
+      states = BOOST_REGEX_MAX_STATE_COUNT;
+   //
+   // If (the possibly capped) N^2 is larger than our first estimate,
+   // use this instead:
+   //
+   if(states > max_state_count)
+      max_state_count = states;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::estimate_max_state_count(void*)
+{
+   // we don't know how long the sequence is:
+   max_state_count = BOOST_REGEX_MAX_STATE_COUNT;
+}
+
+#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
+template <class BidiIterator, class Allocator, class traits>
+inline bool perl_matcher<BidiIterator, Allocator, traits>::protected_call(
+   protected_proc_type proc)
+{
+   ::boost::re_detail::concrete_protected_call
+      <perl_matcher<BidiIterator, Allocator, traits> >
+      obj(this, proc);
+   return obj.execute();
+
+}
+#endif
+
+template <class BidiIterator, class Allocator, class traits>
+inline bool perl_matcher<BidiIterator, Allocator, traits>::match()
+{
+#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
+   return protected_call(&perl_matcher<BidiIterator, Allocator, traits>::match_imp);
+#else
+   return match_imp();
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_imp()
+{
+   // initialise our stack if we are non-recursive:
+#ifdef BOOST_REGEX_NON_RECURSIVE
+   save_state_init init(&m_stack_base, &m_backup_state);
+   used_block_count = BOOST_REGEX_MAX_BLOCKS;
+#if !defined(BOOST_NO_EXCEPTIONS)
+   try{
+#endif
+#endif
+
+   // reset our state machine:
+   position = base;
+   search_base = base;
+   state_count = 0;
+   m_match_flags |= regex_constants::match_all;
+   m_presult->set_size((m_match_flags & match_nosubs) ? 1 : re.mark_count(), search_base, last);
+   m_presult->set_base(base);
+   if(m_match_flags & match_posix)
+      m_result = *m_presult;
+   verify_options(re.flags(), m_match_flags);
+   if(0 == match_prefix())
+      return false;
+   return m_result[0].second == last;
+
+#if defined(BOOST_REGEX_NON_RECURSIVE) && !defined(BOOST_NO_EXCEPTIONS)
+   }
+   catch(...)
+   {
+      // unwind all pushed states, apart from anything else this
+      // ensures that all the states are correctly destructed
+      // not just the memory freed.
+      while(unwind(true)){}
+      throw;
+   }
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline bool perl_matcher<BidiIterator, Allocator, traits>::find()
+{
+#ifdef BOOST_REGEX_HAS_MS_STACK_GUARD
+   return protected_call(&perl_matcher<BidiIterator, Allocator, traits>::find_imp);
+#else
+   return find_imp();
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_imp()
+{
+   static matcher_proc_type const s_find_vtable[7] = 
+   {
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_any,
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_word,
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_line,
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_buf,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_prefix,
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit,
+      &perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit,
+   };
+
+   // initialise our stack if we are non-recursive:
+#ifdef BOOST_REGEX_NON_RECURSIVE
+   save_state_init init(&m_stack_base, &m_backup_state);
+   used_block_count = BOOST_REGEX_MAX_BLOCKS;
+#if !defined(BOOST_NO_EXCEPTIONS)
+   try{
+#endif
+#endif
+
+   state_count = 0;
+   if((m_match_flags & regex_constants::match_init) == 0)
+   {
+      // reset our state machine:
+      search_base = position = base;
+      pstate = re.get_first_state();
+      m_presult->set_size((m_match_flags & match_nosubs) ? 1 : re.mark_count(), base, last);
+      m_presult->set_base(base);
+      m_match_flags |= regex_constants::match_init;
+   }
+   else
+   {
+      // start again:
+      search_base = position = m_result[0].second;
+      // If last match was null and match_not_null was not set then increment
+      // our start position, otherwise we go into an infinite loop:
+      if(((m_match_flags & match_not_null) == 0) && (m_result.length() == 0))
+      {
+         if(position == last)
+            return false;
+         else 
+            ++position;
+      }
+      // reset $` start:
+      m_presult->set_size((m_match_flags & match_nosubs) ? 1 : re.mark_count(), search_base, last);
+      //if((base != search_base) && (base == backstop))
+      //   m_match_flags |= match_prev_avail;
+   }
+   if(m_match_flags & match_posix)
+   {
+      m_result.set_size(re.mark_count(), base, last);
+      m_result.set_base(base);
+   }
+
+   verify_options(re.flags(), m_match_flags);
+   // find out what kind of expression we have:
+   unsigned type = (m_match_flags & match_continuous) ? 
+      static_cast<unsigned int>(regbase::restart_continue) 
+         : static_cast<unsigned int>(re.get_restart_type());
+
+   // call the appropriate search routine:
+   matcher_proc_type proc = s_find_vtable[type];
+   return (this->*proc)();
+
+#if defined(BOOST_REGEX_NON_RECURSIVE) && !defined(BOOST_NO_EXCEPTIONS)
+   }
+   catch(...)
+   {
+      // unwind all pushed states, apart from anything else this
+      // ensures that all the states are correctly destructed
+      // not just the memory freed.
+      while(unwind(true)){}
+      throw;
+   }
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_prefix()
+{
+   m_has_partial_match = false;
+   m_has_found_match = false;
+   pstate = re.get_first_state();
+   m_presult->set_first(position);
+   restart = position;
+   match_all_states();
+   if(!m_has_found_match && m_has_partial_match && (m_match_flags & match_partial))
+   {
+      m_has_found_match = true;
+      m_presult->set_second(last, 0, false);
+      position = last;
+   }
+#ifdef BOOST_REGEX_MATCH_EXTRA
+   if(m_has_found_match && (match_extra & m_match_flags))
+   {
+      //
+      // we have a match, reverse the capture information:
+      //
+      for(unsigned i = 0; i < m_presult->size(); ++i)
+      {
+         typename sub_match<BidiIterator>::capture_sequence_type & seq = ((*m_presult)[i]).get_captures();
+         std::reverse(seq.begin(), seq.end());
+      }
+   }
+#endif
+   if(!m_has_found_match)
+      position = restart; // reset search postion
+   return m_has_found_match;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_endmark()
+{
+   int index = static_cast<const re_brace*>(pstate)->index;
+   if(index > 0)
+   {
+      if((m_match_flags & match_nosubs) == 0)
+         m_presult->set_second(position, index);
+   }
+   else if((index < 0) && (index != -4))
+   {
+      // matched forward lookahead:
+      pstate = 0;
+      return true;
+   }
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_literal()
+{
+   unsigned int len = static_cast<const re_literal*>(pstate)->length;
+   const char_type* what = reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
+   //
+   // compare string with what we stored in
+   // our records:
+   for(unsigned int i = 0; i < len; ++i, ++position)
+   {
+      if((position == last) || (traits_inst.translate(*position, icase) != what[i]))
+         return false;
+   }
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_start_line()
+{
+   if(position == backstop)
+   {
+      if((m_match_flags & match_prev_avail) == 0)
+      {
+         if((m_match_flags & match_not_bol) == 0)
+         {
+            pstate = pstate->next.p;
+            return true;
+         }
+         return false;
+      }
+   }
+   else if(m_match_flags & match_single_line)
+      return false;
+
+   // check the previous value character:
+   BidiIterator t(position);
+   --t;
+   if(position != last)
+   {
+      if(is_separator(*t) && !((*t == static_cast<char_type>('\r')) && (*position == static_cast<char_type>('\n'))) )
+      {
+         pstate = pstate->next.p;
+         return true;
+      }
+   }
+   else if(is_separator(*t))
+   {
+      pstate = pstate->next.p;
+      return true;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_end_line()
+{
+   if(position != last)
+   {
+      if(m_match_flags & match_single_line)
+         return false;
+      // we're not yet at the end so *first is always valid:
+      if(is_separator(*position))
+      {
+         if((position != backstop) || (m_match_flags & match_prev_avail))
+         {
+            // check that we're not in the middle of \r\n sequence
+            BidiIterator t(position);
+            --t;
+            if((*t == static_cast<char_type>('\r')) && (*position == static_cast<char_type>('\n')))
+            {
+               return false;
+            }
+         }
+         pstate = pstate->next.p;
+         return true;
+      }
+   }
+   else if((m_match_flags & match_not_eol) == 0)
+   {
+      pstate = pstate->next.p;
+      return true;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_wild()
+{
+   if(position == last) 
+      return false;
+   if(is_separator(*position) && ((match_any_mask & static_cast<const re_dot*>(pstate)->mask) == 0))
+      return false;
+   if((*position == char_type(0)) && (m_match_flags & match_not_dot_null))
+      return false;
+   pstate = pstate->next.p;
+   ++position;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_match()
+{
+   if((m_match_flags & match_not_null) && (position == (*m_presult)[0].first))
+      return false;
+   if((m_match_flags & match_all) && (position != last))
+      return false;
+   if((m_match_flags & regex_constants::match_not_initial_null) && (position == search_base))
+      return false;
+   m_presult->set_second(position);
+   pstate = 0;
+   m_has_found_match = true;
+   if((m_match_flags & match_posix) == match_posix)
+   {
+      m_result.maybe_assign(*m_presult);
+      if((m_match_flags & match_any) == 0)
+         return false;
+   }
+#ifdef BOOST_REGEX_MATCH_EXTRA
+   if(match_extra & m_match_flags)
+   {
+      for(unsigned i = 0; i < m_presult->size(); ++i)
+         if((*m_presult)[i].matched)
+            ((*m_presult)[i]).get_captures().push_back((*m_presult)[i]);
+   }
+#endif
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary()
+{
+   bool b; // indcates whether next character is a word character
+   if(position != last)
+   {
+      // prev and this character must be opposites:
+   #if defined(BOOST_REGEX_USE_C_LOCALE) && defined(__GNUC__) && (__GNUC__ == 2) && (__GNUC_MINOR__ < 95)
+      b = traits::isctype(*position, m_word_mask);
+   #else
+      b = traits_inst.isctype(*position, m_word_mask);
+   #endif
+   }
+   else
+   {
+      b = (m_match_flags & match_not_eow) ? true : false;
+   }
+   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
+   {
+      if(m_match_flags & match_not_bow)
+         b ^= true;
+      else
+         b ^= false;
+   }
+   else
+   {
+      --position;
+      b ^= traits_inst.isctype(*position, m_word_mask);
+      ++position;
+   }
+   if(b)
+   {
+      pstate = pstate->next.p;
+      return true;
+   }
+   return false; // no match if we get to here...
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_within_word()
+{
+   if(position == last)
+      return false;
+   // both prev and this character must be m_word_mask:
+   bool prev = traits_inst.isctype(*position, m_word_mask);
+   {
+      bool b;
+      if((position == backstop) && ((m_match_flags & match_prev_avail) == 0)) 
+         return false;
+      else
+      {
+         --position;
+         b = traits_inst.isctype(*position, m_word_mask);
+         ++position;
+      }
+      if(b == prev)
+      {
+         pstate = pstate->next.p;
+         return true;
+      }
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_word_start()
+{
+   if(position == last)
+      return false; // can't be starting a word if we're already at the end of input
+   if(!traits_inst.isctype(*position, m_word_mask))
+      return false; // next character isn't a word character
+   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
+   {
+      if(m_match_flags & match_not_bow)
+         return false; // no previous input
+   }
+   else
+   {
+      // otherwise inside buffer:
+      BidiIterator t(position);
+      --t;
+      if(traits_inst.isctype(*t, m_word_mask))
+         return false; // previous character not non-word
+   }
+   // OK we have a match:
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_word_end()
+{
+   if((position == backstop) && ((m_match_flags & match_prev_avail) == 0))
+      return false;  // start of buffer can't be end of word
+   BidiIterator t(position);
+   --t;
+   if(traits_inst.isctype(*t, m_word_mask) == false)
+      return false;  // previous character wasn't a word character
+
+   if(position == last)
+   {
+      if(m_match_flags & match_not_eow)
+         return false; // end of buffer but not end of word
+   }
+   else
+   {
+      // otherwise inside buffer:
+      if(traits_inst.isctype(*position, m_word_mask))
+         return false; // next character is a word character
+   }
+   pstate = pstate->next.p;
+   return true;      // if we fall through to here then we've succeeded
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start()
+{
+   if((position != backstop) || (m_match_flags & match_not_bob))
+      return false;
+   // OK match:
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end()
+{
+   if((position != last) || (m_match_flags & match_not_eob))
+      return false;
+   // OK match:
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_backref()
+{
+   //
+   // Compare with what we previously matched.
+   // Note that this succeeds if the backref did not partisipate
+   // in the match, this is in line with ECMAScript, but not Perl
+   // or PCRE.
+   //
+   BidiIterator i = (*m_presult)[static_cast<const re_brace*>(pstate)->index].first;
+   BidiIterator j = (*m_presult)[static_cast<const re_brace*>(pstate)->index].second;
+   while(i != j)
+   {
+      if((position == last) || (traits_inst.translate(*position, icase) != traits_inst.translate(*i, icase)))
+         return false;
+      ++i;
+      ++position;
+   }
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set()
+{
+   typedef typename traits::char_class_type char_class_type;
+   // let the traits class do the work:
+   if(position == last)
+      return false;
+   BidiIterator t = re_is_set_member(position, last, static_cast<const re_set_long<char_class_type>*>(pstate), re.get_data(), icase);
+   if(t != position)
+   {
+      pstate = pstate->next.p;
+      position = t;
+      return true;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_set()
+{
+   if(position == last)
+      return false;
+   if(static_cast<const re_set*>(pstate)->_map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+   {
+      pstate = pstate->next.p;
+      ++position;
+      return true;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_jump()
+{
+   pstate = static_cast<const re_jump*>(pstate)->alt.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_combining()
+{
+   if(position == last)
+      return false;
+   if(is_combining(traits_inst.translate(*position, icase)))
+      return false;
+   ++position;
+   while((position != last) && is_combining(traits_inst.translate(*position, icase)))
+      ++position;
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end()
+{
+   if(m_match_flags & match_not_eob)
+      return false;
+   BidiIterator p(position);
+   while((p != last) && is_separator(traits_inst.translate(*p, icase)))++p;
+   if(p != last)
+      return false;
+   pstate = pstate->next.p;
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue()
+{
+   if(position == search_base)
+   {
+      pstate = pstate->next.p;
+      return true;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_backstep()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   if( ::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      std::ptrdiff_t maxlen = ::boost::re_detail::distance(backstop, position);
+      if(maxlen < static_cast<const re_brace*>(pstate)->index)
+         return false;
+      std::advance(position, -static_cast<const re_brace*>(pstate)->index);
+   }
+   else
+   {
+      int c = static_cast<const re_brace*>(pstate)->index;
+      while(c--)
+      {
+         if(position == backstop)
+            return false;
+         --position;
+      }
+   }
+   pstate = pstate->next.p;
+   return true;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline bool perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref()
+{
+   // return true if marked sub-expression N has been matched:
+   bool result = (*m_presult)[static_cast<const re_brace*>(pstate)->index].matched;
+   pstate = pstate->next.p;
+   return result;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case()
+{
+   // change our case sensitivity:
+   this->icase = static_cast<const re_case*>(pstate)->icase;
+   pstate = pstate->next.p;
+   return true;
+}
+
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_any()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   const unsigned char* _map = re.get_map();
+   while(true)
+   {
+      // skip everything we can't match:
+      while((position != last) && !can_start(*position, _map, (unsigned char)mask_any) )
+         ++position;
+      if(position == last)
+      {
+         // run out of characters, try a null match if possible:
+         if(re.can_be_null())
+            return match_prefix();
+         break;
+      }
+      // now try and obtain a match:
+      if(match_prefix())
+         return true;
+      if(position == last)
+         return false;
+      ++position;
+   }
+   return false;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_word()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   // do search optimised for word starts:
+   const unsigned char* _map = re.get_map();
+   if((m_match_flags & match_prev_avail) || (position != base))
+      --position;
+   else if(match_prefix())
+      return true;
+   do
+   {
+      while((position != last) && traits_inst.isctype(*position, m_word_mask))
+         ++position;
+      while((position != last) && !traits_inst.isctype(*position, m_word_mask))
+         ++position;
+      if(position == last)
+         break;
+
+      if(can_start(*position, _map, (unsigned char)mask_any) )
+      {
+         if(match_prefix())
+            return true;
+      }
+      if(position == last)
+         break;
+   } while(true);
+   return false;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_line()
+{
+   // do search optimised for line starts:
+   const unsigned char* _map = re.get_map();
+   if(match_prefix())
+      return true;
+   while(position != last)
+   {
+      while((position != last) && !is_separator(*position))
+         ++position;
+      if(position == last)
+         return false;
+      ++position;
+      if(position == last)
+      {
+         if(re.can_be_null() && match_prefix())
+            return true;
+         return false;
+      }
+
+      if( can_start(*position, _map, (unsigned char)mask_any) )
+      {
+         if(match_prefix())
+            return true;
+      }
+      if(position == last)
+         return false;
+      //++position;
+   }
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_buf()
+{
+   if((position == base) && ((m_match_flags & match_not_bob) == 0))
+      return match_prefix();
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::find_restart_lit()
+{
+#if 0
+   if(position == last)
+      return false; // can't possibly match if we're at the end already
+
+   unsigned type = (m_match_flags & match_continuous) ? 
+      static_cast<unsigned int>(regbase::restart_continue) 
+         : static_cast<unsigned int>(re.get_restart_type());
+
+   const kmp_info<char_type>* info = access::get_kmp(re);
+   int len = info->len;
+   const char_type* x = info->pstr;
+   int j = 0; 
+   while (position != last) 
+   {
+      while((j > -1) && (x[j] != traits_inst.translate(*position, icase))) 
+         j = info->kmp_next[j];
+      ++position;
+      ++j;
+      if(j >= len) 
+      {
+         if(type == regbase::restart_fixed_lit)
+         {
+            std::advance(position, -j);
+            restart = position;
+            std::advance(restart, len);
+            m_result.set_first(position);
+            m_result.set_second(restart);
+            position = restart;
+            return true;
+         }
+         else
+         {
+            restart = position;
+            std::advance(position, -j);
+            if(match_prefix())
+               return true;
+            else
+            {
+               for(int k = 0; (restart != position) && (k < j); ++k, --restart)
+                     {} // dwa 10/20/2000 - warning suppression for MWCW
+               if(restart != last)
+                  ++restart;
+               position = restart;
+               j = 0;  //we could do better than this...
+            }
+         }
+      }
+   }
+   if((m_match_flags & match_partial) && (position == last) && j)
+   {
+      // we need to check for a partial match:
+      restart = position;
+      std::advance(position, -j);
+      return match_prefix();
+   }
+#endif
+   return false;
+}
+
+} // namespace re_detail
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+#ifdef __BORLANDC__
+#  pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher_non_recursive.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1400 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         perl_matcher_common.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Definitions of perl_matcher member functions that are 
+  *                specific to the non-recursive implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
+#define BOOST_REGEX_V4_PERL_MATCHER_NON_RECURSIVE_HPP
+
+#include <new>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4800)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+template <class T>
+inline void inplace_destroy(T* p)
+{
+   (void)p;  // warning suppression
+   p->~T();
+}
+
+struct saved_state
+{
+   union{
+      unsigned int state_id;
+      // this padding ensures correct alignment on 64-bit platforms:
+      std::size_t padding1;
+      std::ptrdiff_t padding2;
+      void* padding3;
+   };
+   saved_state(unsigned i) : state_id(i) {}
+};
+
+template <class BidiIterator>
+struct saved_matched_paren : public saved_state
+{
+   int index;
+   sub_match<BidiIterator> sub;
+   saved_matched_paren(int i, const sub_match<BidiIterator>& s) : saved_state(1), index(i), sub(s){};
+};
+
+template <class BidiIterator>
+struct saved_position : public saved_state
+{
+   const re_syntax_base* pstate;
+   BidiIterator position;
+   saved_position(const re_syntax_base* ps, BidiIterator pos, int i) : saved_state(i), pstate(ps), position(pos){};
+};
+
+template <class BidiIterator>
+struct saved_assertion : public saved_position<BidiIterator>
+{
+   bool positive;
+   saved_assertion(bool p, const re_syntax_base* ps, BidiIterator pos) 
+      : saved_position<BidiIterator>(ps, pos, saved_type_assertion), positive(p){};
+};
+
+template <class BidiIterator>
+struct saved_repeater : public saved_state
+{
+   repeater_count<BidiIterator> count;
+   saved_repeater(int i, repeater_count<BidiIterator>** s, BidiIterator start) 
+      : saved_state(saved_state_repeater_count), count(i,s,start){}
+};
+
+struct saved_extra_block : public saved_state
+{
+   saved_state *base, *end;
+   saved_extra_block(saved_state* b, saved_state* e) 
+      : saved_state(saved_state_extra_block), base(b), end(e) {}
+};
+
+struct save_state_init
+{
+   saved_state** stack;
+   save_state_init(saved_state** base, saved_state** end)
+      : stack(base)
+   {
+      *base = static_cast<saved_state*>(get_mem_block());
+      *end = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(*base)+BOOST_REGEX_BLOCKSIZE);
+      --(*end);
+      (void) new (*end)saved_state(0);
+      BOOST_ASSERT(*end > *base);
+   }
+   ~save_state_init()
+   {
+      put_mem_block(*stack);
+      *stack = 0;
+   }
+};
+
+template <class BidiIterator>
+struct saved_single_repeat : public saved_state
+{
+   std::size_t count;
+   const re_repeat* rep;
+   BidiIterator last_position;
+   saved_single_repeat(std::size_t c, const re_repeat* r, BidiIterator lp, int arg_id) 
+      : saved_state(arg_id), count(c), rep(r), last_position(lp){}
+};
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
+{
+   static matcher_proc_type const s_match_vtable[29] = 
+   {
+      (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
+      &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_match,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_set,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
+      (::boost::is_random_access_iterator<BidiIterator>::value ? &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast : &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow),
+      &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
+   };
+
+   push_recursion_stopper();
+   do{
+      while(pstate)
+      {
+         matcher_proc_type proc = s_match_vtable[pstate->type];
+         ++state_count;
+         if(!(this->*proc)())
+         {
+            if(state_count > max_state_count)
+               raise_error(traits_inst, regex_constants::error_space);
+            if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+               m_has_partial_match = true;
+            bool successful_unwind = unwind(false);
+            if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+               m_has_partial_match = true;
+            if(false == successful_unwind)
+               return m_recursive_result;
+         }
+      }
+   }while(unwind(true));
+   return m_recursive_result;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+void perl_matcher<BidiIterator, Allocator, traits>::extend_stack()
+{
+   if(used_block_count)
+   {
+      --used_block_count;
+      saved_state* stack_base;
+      saved_state* backup_state;
+      stack_base = static_cast<saved_state*>(get_mem_block());
+      backup_state = reinterpret_cast<saved_state*>(reinterpret_cast<char*>(stack_base)+BOOST_REGEX_BLOCKSIZE);
+      saved_extra_block* block = static_cast<saved_extra_block*>(backup_state);
+      --block;
+      (void) new (block) saved_extra_block(m_stack_base, m_backup_state);
+      m_stack_base = stack_base;
+      m_backup_state = block;
+   }
+   else
+      raise_error(traits_inst, regex_constants::error_size);
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_matched_paren(int index, const sub_match<BidiIterator>& sub)
+{
+   BOOST_ASSERT(index);
+   saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_matched_paren<BidiIterator>(index, sub);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_recursion_stopper()
+{
+   saved_state* pmp = m_backup_state;
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = m_backup_state;
+      --pmp;
+   }
+   (void) new (pmp)saved_state(saved_type_recurse);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_assertion(const re_syntax_base* ps, bool positive)
+{
+   saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_assertion<BidiIterator>(positive, ps, position);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_alt(const re_syntax_base* ps)
+{
+   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_alt);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_non_greedy_repeat(const re_syntax_base* ps)
+{
+   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_position<BidiIterator>(ps, position, saved_state_non_greedy_long_repeat);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_repeater_count(int i, repeater_count<BidiIterator>** s)
+{
+   saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_repeater<BidiIterator>(i, s, position);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::push_single_repeat(std::size_t c, const re_repeat* r, BidiIterator last_position, int state_id)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+   --pmp;
+   if(pmp < m_stack_base)
+   {
+      extend_stack();
+      pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+      --pmp;
+   }
+   (void) new (pmp)saved_single_repeat<BidiIterator>(c, r, last_position, state_id);
+   m_backup_state = pmp;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
+{
+   int index = static_cast<const re_brace*>(pstate)->index;
+   switch(index)
+   {
+   case 0:
+      pstate = pstate->next.p;
+      break;
+   case -1:
+   case -2:
+      {
+         // forward lookahead assert:
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         push_assertion(next_pstate, index == -1);
+         break;
+      }
+   case -3:
+      {
+         // independent sub-expression, currently this is always recursive:
+         bool old_independent = m_independent;
+         m_independent = true;
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         bool r = match_all_states();
+         pstate = next_pstate;
+         m_independent = old_independent;
+#ifdef BOOST_REGEX_MATCH_EXTRA
+         if(r && (m_match_flags & match_extra))
+         {
+            //
+            // our captures have been stored in *m_presult
+            // we need to unpack them, and insert them
+            // back in the right order when we unwind the stack:
+            //
+            match_results<BidiIterator, Allocator> temp_match(*m_presult);
+            unsigned i;
+            for(i = 0; i < temp_match.size(); ++i)
+               (*m_presult)[i].get_captures().clear();
+            // match everything else:
+            r = match_all_states();
+            // now place the stored captures back:
+            for(i = 0; i < temp_match.size(); ++i)
+            {
+               typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
+               seq& s1 = (*m_presult)[i].get_captures();
+               const seq& s2 = temp_match[i].captures();
+               s1.insert(
+                  s1.end(), 
+                  s2.begin(), 
+                  s2.end());
+            }
+         }
+#endif
+         return r;
+      }
+   case -4:
+      {
+      // conditional expression:
+      const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
+      BOOST_ASSERT(alt->type == syntax_element_alt);
+      pstate = alt->next.p;
+      if(pstate->type == syntax_element_assert_backref)
+      {
+         if(!match_assert_backref())
+            pstate = alt->alt.p;
+         break;
+      }
+      else
+      {
+         // zero width assertion, have to match this recursively:
+         BOOST_ASSERT(pstate->type == syntax_element_startmark);
+         bool negated = static_cast<const re_brace*>(pstate)->index == -2;
+         BidiIterator saved_position = position;
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         bool r = match_all_states();
+         position = saved_position;
+         if(negated)
+            r = !r;
+         if(r)
+            pstate = next_pstate;
+         else
+            pstate = alt->alt.p;
+         break;
+      }
+      }
+   default:
+   {
+      BOOST_ASSERT(index > 0);
+      if((m_match_flags & match_nosubs) == 0)
+      {
+         push_matched_paren(index, (*m_presult)[index]);
+         m_presult->set_first(position, index);
+      }
+      pstate = pstate->next.p;
+      break;
+   }
+   }
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
+{
+   bool take_first, take_second;
+   const re_alt* jmp = static_cast<const re_alt*>(pstate);
+
+   // find out which of these two alternatives we need to take:
+   if(position == last)
+   {
+      take_first = jmp->can_be_null & mask_take;
+      take_second = jmp->can_be_null & mask_skip;
+   }
+   else
+   {
+      take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
+      take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
+  }
+
+   if(take_first)
+   {
+      // we can take the first alternative,
+      // see if we need to push next alternative:
+      if(take_second)
+      {
+         push_alt(jmp->alt.p);
+      }
+      pstate = pstate->next.p;
+      return true;
+   }
+   if(take_second)
+   {
+      pstate = jmp->alt.p;
+      return true;
+   }
+   return false;  // neither option is possible
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127 4244)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+
+   // find out which of these two alternatives we need to take:
+   bool take_first, take_second;
+   if(position == last)
+   {
+      take_first = rep->can_be_null & mask_take;
+      take_second = rep->can_be_null & mask_skip;
+   }
+   else
+   {
+      take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
+      take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
+   }
+
+   if((m_backup_state->state_id != saved_state_repeater_count) 
+      || (static_cast<saved_repeater<BidiIterator>*>(m_backup_state)->count.get_id() != rep->state_id)
+      || (next_count->get_id() != rep->state_id))
+   {
+      // we're moving to a different repeat from the last
+      // one, so set up a counter object:
+      push_repeater_count(rep->state_id, &next_count);
+   }
+   //
+   // If we've had at least one repeat already, and the last one 
+   // matched the NULL string then set the repeat count to
+   // maximum:
+   //
+   next_count->check_null_repeat(position, rep->max);
+
+   if(next_count->get_count() < rep->min)
+   {
+      // we must take the repeat:
+      if(take_first)
+      {
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         return true;
+      }
+      return false;
+   }
+
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   if(greedy)
+   {
+      // try and take the repeat if we can:
+      if((next_count->get_count() < rep->max) && take_first)
+      {
+         if(take_second)
+         {
+            // store position in case we fail:
+            push_alt(rep->alt.p);
+         }
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         return true;
+      }
+      else if(take_second)
+      {
+         pstate = rep->alt.p;
+         return true;
+      }
+      return false; // can't take anything, fail...
+   }
+   else // non-greedy
+   {
+      // try and skip the repeat if we can:
+      if(take_second)
+      {
+         if((next_count->get_count() < rep->max) && take_first)
+         {
+            // store position in case we fail:
+            push_non_greedy_repeat(rep->next.p);
+         }
+         pstate = rep->alt.p;
+         return true;
+      }
+      if((next_count->get_count() < rep->max) && take_first)
+      {
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         return true;
+      }
+   }
+   return false;
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
+{
+   unsigned count = 0;
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   re_syntax_base* psingle = rep->next.p;
+   // match compulsary repeats first:
+   while(count < rep->min)
+   {
+      pstate = psingle;
+      if(!match_wild())
+         return false;
+      ++count;
+   }
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   if(greedy)
+   {
+      // repeat for as long as we can:
+      while(count < rep->max)
+      {
+         pstate = psingle;
+         if(!match_wild())
+            break;
+         ++count;
+      }
+      // remember where we got to if this is a leading repeat:
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      // push backtrack info if available:
+      if(count - rep->min)
+         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
+      // jump to next state:
+      pstate = rep->alt.p;
+      return true;
+   }
+   else
+   {
+      // non-greedy, push state and return true if we can skip:
+      if(count < rep->max)
+         push_single_repeat(count, rep, position, saved_state_rep_slow_dot);
+      pstate = rep->alt.p;
+      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
+   }
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
+{
+   if(m_match_flags & match_not_dot_null)
+      return match_dot_repeat_slow();
+   if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
+      return match_dot_repeat_slow();
+
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   unsigned count = static_cast<unsigned>((std::min)(static_cast<unsigned>(::boost::re_detail::distance(position, last)), static_cast<unsigned>(greedy ? rep->max : rep->min)));
+   if(rep->min > count)
+   {
+      position = last;
+      return false;  // not enough text left to match
+   }
+   std::advance(position, count);
+
+   if(greedy)
+   {
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      // push backtrack info if available:
+      if(count - rep->min)
+         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
+      // jump to next state:
+      pstate = rep->alt.p;
+      return true;
+   }
+   else
+   {
+      // non-greedy, push state and return true if we can skip:
+      if(count < rep->max)
+         push_single_repeat(count, rep, position, saved_state_rep_fast_dot);
+      pstate = rep->alt.p;
+      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
+   }
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
+   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
+   std::size_t count = 0;
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t desired = greedy ? rep->max : rep->min;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      BidiIterator end = position;
+      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
+      BidiIterator origin(position);
+      while((position != end) && (traits_inst.translate(*position, icase) == what))
+      {
+         ++position;
+      }
+      count = (unsigned)::boost::re_detail::distance(origin, position);
+   }
+   else
+   {
+      while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
+      {
+         ++position;
+         ++count;
+      }
+   }
+
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+   {
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      // push backtrack info if available:
+      if(count - rep->min)
+         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
+      // jump to next state:
+      pstate = rep->alt.p;
+      return true;
+   }
+   else
+   {
+      // non-greedy, push state and return true if we can skip:
+      if(count < rep->max)
+         push_single_repeat(count, rep, position, saved_state_rep_char);
+      pstate = rep->alt.p;
+      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
+   }
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
+   std::size_t count = 0;
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t desired = greedy ? rep->max : rep->min;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      BidiIterator end = position;
+      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
+      BidiIterator origin(position);
+      while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+      {
+         ++position;
+      }
+      count = (unsigned)::boost::re_detail::distance(origin, position);
+   }
+   else
+   {
+      while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+      {
+         ++position;
+         ++count;
+      }
+   }
+
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+   {
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      // push backtrack info if available:
+      if(count - rep->min)
+         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
+      // jump to next state:
+      pstate = rep->alt.p;
+      return true;
+   }
+   else
+   {
+      // non-greedy, push state and return true if we can skip:
+      if(count < rep->max)
+         push_single_repeat(count, rep, position, saved_state_rep_short_set);
+      pstate = rep->alt.p;
+      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
+   }
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   typedef typename traits::char_class_type mask_type;
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   const re_set_long<mask_type>* set = static_cast<const re_set_long<mask_type>*>(pstate->next.p);
+   std::size_t count = 0;
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t desired = greedy ? rep->max : rep->min;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      BidiIterator end = position;
+      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
+      BidiIterator origin(position);
+      while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
+      {
+         ++position;
+      }
+      count = (unsigned)::boost::re_detail::distance(origin, position);
+   }
+   else
+   {
+      while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
+      {
+         ++position;
+         ++count;
+      }
+   }
+
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+   {
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      // push backtrack info if available:
+      if(count - rep->min)
+         push_single_repeat(count, rep, position, saved_state_greedy_single_repeat);
+      // jump to next state:
+      pstate = rep->alt.p;
+      return true;
+   }
+   else
+   {
+      // non-greedy, push state and return true if we can skip:
+      if(count < rep->max)
+         push_single_repeat(count, rep, position, saved_state_rep_long_set);
+      pstate = rep->alt.p;
+      return (position == last) ? (rep->can_be_null & mask_skip) : can_start(*position, rep->_map, mask_skip);
+   }
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+/****************************************************************************
+
+Unwind and associated proceedures follow, these perform what normal stack
+unwinding does in the recursive implementation.
+
+****************************************************************************/
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind(bool have_match)
+{
+   static unwind_proc_type const s_unwind_table[14] = 
+   {
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_paren,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_alt,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat,
+   };
+
+   m_recursive_result = have_match;
+   unwind_proc_type unwinder;
+   bool cont;
+   //
+   // keep unwinding our stack until we have something to do:
+   //
+   do
+   {
+      unwinder = s_unwind_table[m_backup_state->state_id];
+      cont = (this->*unwinder)(m_recursive_result);
+   }while(cont);
+   //
+   // return true if we have more states to try:
+   //
+   return pstate ? true : false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_end(bool)
+{
+   pstate = 0;   // nothing left to search
+   return false; // end of stack nothing more to search
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_paren(bool have_match)
+{
+   saved_matched_paren<BidiIterator>* pmp = static_cast<saved_matched_paren<BidiIterator>*>(m_backup_state);
+   // restore previous values if no match was found:
+   if(have_match == false)
+   {
+      m_presult->set_first(pmp->sub.first, pmp->index);
+      m_presult->set_second(pmp->sub.second, pmp->index, pmp->sub.matched);
+   }
+#ifdef BOOST_REGEX_MATCH_EXTRA
+   //
+   // we have a match, push the capture information onto the stack:
+   //
+   else if(pmp->sub.matched && (match_extra & m_match_flags))
+      ((*m_presult)[pmp->index]).get_captures().push_back(pmp->sub);
+#endif
+   // unwind stack:
+   m_backup_state = pmp+1;
+   boost::re_detail::inplace_destroy(pmp);
+   return true; // keep looking
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_recursion_stopper(bool)
+{
+   boost::re_detail::inplace_destroy(m_backup_state++);
+   pstate = 0;   // nothing left to search
+   return false; // end of stack nothing more to search
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_assertion(bool r)
+{
+   saved_assertion<BidiIterator>* pmp = static_cast<saved_assertion<BidiIterator>*>(m_backup_state);
+   pstate = pmp->pstate;
+   position = pmp->position;
+   bool result = (r == pmp->positive);
+   m_recursive_result = pmp->positive ? r : !r;
+   boost::re_detail::inplace_destroy(pmp++);
+   m_backup_state = pmp;
+   return !result; // return false if the assertion was matched to stop search.
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_alt(bool r)
+{
+   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+   if(!r)
+   {
+      pstate = pmp->pstate;
+      position = pmp->position;
+   }
+   boost::re_detail::inplace_destroy(pmp++);
+   m_backup_state = pmp;
+   return r; 
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_repeater_counter(bool)
+{
+   saved_repeater<BidiIterator>* pmp = static_cast<saved_repeater<BidiIterator>*>(m_backup_state);
+   boost::re_detail::inplace_destroy(pmp++);
+   m_backup_state = pmp;
+   return true; // keep looking
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_extra_block(bool)
+{
+   saved_extra_block* pmp = static_cast<saved_extra_block*>(m_backup_state);
+   void* condemmed = m_stack_base;
+   m_stack_base = pmp->base;
+   m_backup_state = pmp->end;
+   boost::re_detail::inplace_destroy(pmp);
+   put_mem_block(condemmed);
+   return true; // keep looking
+}
+
+template <class BidiIterator, class Allocator, class traits>
+inline void perl_matcher<BidiIterator, Allocator, traits>::destroy_single_repeat()
+{
+   saved_single_repeat<BidiIterator>* p = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+   boost::re_detail::inplace_destroy(p++);
+   m_backup_state = p;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_greedy_single_repeat(bool r)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r) 
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+   BOOST_ASSERT(rep->next.p != 0);
+   BOOST_ASSERT(rep->alt.p != 0);
+
+   count -= rep->min;
+   
+   if((m_match_flags & match_partial) && (position == last))
+      m_has_partial_match = true;
+
+   BOOST_ASSERT(count);
+   position = pmp->last_position;
+
+   // backtrack till we can skip out:
+   do
+   {
+      --position;
+      --count;
+      ++state_count;
+   }while(count && !can_start(*position, rep->_map, mask_skip));
+
+   // if we've hit base, destroy this state:
+   if(count == 0)
+   {
+         destroy_single_repeat();
+         if(!can_start(*position, rep->_map, mask_skip))
+            return true;
+   }
+   else
+   {
+      pmp->count = count + rep->min;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_slow_dot_repeat(bool r)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r) 
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+   BOOST_ASSERT(rep->type == syntax_element_dot_rep);
+   BOOST_ASSERT(rep->next.p != 0);
+   BOOST_ASSERT(rep->alt.p != 0);
+   BOOST_ASSERT(rep->next.p->type == syntax_element_wild);
+
+   BOOST_ASSERT(count < rep->max);
+   pstate = rep->next.p;
+   position = pmp->last_position;
+
+   if(position != last)
+   {
+      // wind forward until we can skip out of the repeat:
+      do
+      {
+         if(!match_wild())
+         {
+            // failed repeat match, discard this state and look for another:
+            destroy_single_repeat();
+            return true;
+         }
+         ++count;
+         ++state_count;
+         pstate = rep->next.p;
+      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
+   }   
+   if(position == last)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+         m_has_partial_match = true;
+      if(0 == (rep->can_be_null & mask_skip))
+         return true;
+   }
+   else if(count == rep->max)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if(!can_start(*position, rep->_map, mask_skip))
+         return true;
+   }
+   else
+   {
+      pmp->count = count;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_fast_dot_repeat(bool r)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r) 
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+
+   BOOST_ASSERT(count < rep->max);
+   position = pmp->last_position;
+   if(position != last)
+   {
+
+      // wind forward until we can skip out of the repeat:
+      do
+      {
+         ++position;
+         ++count;
+         ++state_count;
+      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
+   }
+
+   if(position == last)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+         m_has_partial_match = true;
+      if(0 == (rep->can_be_null & mask_skip))
+         return true;
+   }
+   else if(count == rep->max)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if(!can_start(*position, rep->_map, mask_skip))
+         return true;
+   }
+   else
+   {
+      pmp->count = count;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_char_repeat(bool r)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r) 
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+   pstate = rep->next.p;
+   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(pstate) + 1);
+   position = pmp->last_position;
+
+   BOOST_ASSERT(rep->type == syntax_element_char_rep);
+   BOOST_ASSERT(rep->next.p != 0);
+   BOOST_ASSERT(rep->alt.p != 0);
+   BOOST_ASSERT(rep->next.p->type == syntax_element_literal);
+   BOOST_ASSERT(count < rep->max);
+
+   if(position != last)
+   {
+      // wind forward until we can skip out of the repeat:
+      do
+      {
+         if(traits_inst.translate(*position, icase) != what)
+         {
+            // failed repeat match, discard this state and look for another:
+            destroy_single_repeat();
+            return true;
+         }
+         ++count;
+         ++ position;
+         ++state_count;
+         pstate = rep->next.p;
+      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
+   }   
+   // remember where we got to if this is a leading repeat:
+   if((rep->leading) && (count < rep->max))
+      restart = position;
+   if(position == last)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+         m_has_partial_match = true;
+      if(0 == (rep->can_be_null & mask_skip))
+         return true;
+   }
+   else if(count == rep->max)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if(!can_start(*position, rep->_map, mask_skip))
+         return true;
+   }
+   else
+   {
+      pmp->count = count;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_short_set_repeat(bool r)
+{
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r) 
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+   pstate = rep->next.p;
+   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
+   position = pmp->last_position;
+
+   BOOST_ASSERT(rep->type == syntax_element_short_set_rep);
+   BOOST_ASSERT(rep->next.p != 0);
+   BOOST_ASSERT(rep->alt.p != 0);
+   BOOST_ASSERT(rep->next.p->type == syntax_element_set);
+   BOOST_ASSERT(count < rep->max);
+   
+   if(position != last)
+   {
+      // wind forward until we can skip out of the repeat:
+      do
+      {
+         if(!map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+         {
+            // failed repeat match, discard this state and look for another:
+            destroy_single_repeat();
+            return true;
+         }
+         ++count;
+         ++ position;
+         ++state_count;
+         pstate = rep->next.p;
+      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
+   }   
+   // remember where we got to if this is a leading repeat:
+   if((rep->leading) && (count < rep->max))
+      restart = position;
+   if(position == last)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+         m_has_partial_match = true;
+      if(0 == (rep->can_be_null & mask_skip))
+         return true;
+   }
+   else if(count == rep->max)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if(!can_start(*position, rep->_map, mask_skip))
+         return true;
+   }
+   else
+   {
+      pmp->count = count;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_long_set_repeat(bool r)
+{
+   typedef typename traits::char_class_type mask_type;
+   saved_single_repeat<BidiIterator>* pmp = static_cast<saved_single_repeat<BidiIterator>*>(m_backup_state);
+
+   // if we have a match, just discard this state:
+   if(r)
+   {
+      destroy_single_repeat();
+      return true;
+   }
+
+   const re_repeat* rep = pmp->rep;
+   std::size_t count = pmp->count;
+   pstate = rep->next.p;
+   const re_set_long<mask_type>* set = static_cast<const re_set_long<mask_type>*>(pstate);
+   position = pmp->last_position;
+
+   BOOST_ASSERT(rep->type == syntax_element_long_set_rep);
+   BOOST_ASSERT(rep->next.p != 0);
+   BOOST_ASSERT(rep->alt.p != 0);
+   BOOST_ASSERT(rep->next.p->type == syntax_element_long_set);
+   BOOST_ASSERT(count < rep->max);
+
+   if(position != last)
+   {
+      // wind forward until we can skip out of the repeat:
+      do
+      {
+         if(position == re_is_set_member(position, last, set, re.get_data(), icase))
+         {
+            // failed repeat match, discard this state and look for another:
+            destroy_single_repeat();
+            return true;
+         }
+         ++position;
+         ++count;
+         ++state_count;
+         pstate = rep->next.p;
+      }while((count < rep->max) && (position != last) && !can_start(*position, rep->_map, mask_skip));
+   }   
+   // remember where we got to if this is a leading repeat:
+   if((rep->leading) && (count < rep->max))
+      restart = position;
+   if(position == last)
+   {
+      // can't repeat any more, remove the pushed state:
+      destroy_single_repeat();
+      if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+         m_has_partial_match = true;
+      if(0 == (rep->can_be_null & mask_skip))
+         return true;
+   }
+   else if(count == rep->max)
+   {
+      // can't repeat any more, remove the pushed state: 
+      destroy_single_repeat();
+      if(!can_start(*position, rep->_map, mask_skip))
+         return true;
+   }
+   else
+   {
+      pmp->count = count;
+      pmp->last_position = position;
+   }
+   pstate = rep->alt.p;
+   return false;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::unwind_non_greedy_repeat(bool r)
+{
+   saved_position<BidiIterator>* pmp = static_cast<saved_position<BidiIterator>*>(m_backup_state);
+   if(!r)
+   {
+      position = pmp->position;
+      pstate = pmp->pstate;
+      ++(*next_count);
+   }
+   boost::re_detail::inplace_destroy(pmp++);
+   m_backup_state = pmp;
+   return r;
+}
+
+} // namespace re_detail
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/perl_matcher_recursive.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,854 @@
+/*
+ *
+ * Copyright (c) 2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         perl_matcher_common.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Definitions of perl_matcher member functions that are 
+  *                specific to the recursive implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
+#define BOOST_REGEX_V4_PERL_MATCHER_RECURSIVE_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4800)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+template <class BidiIterator>
+class backup_subex
+{
+   int index;
+   sub_match<BidiIterator> sub;
+public:
+   template <class A>
+   backup_subex(const match_results<BidiIterator, A>& w, int i)
+      : index(i), sub(w[i], false) {}
+   template <class A>
+   void restore(match_results<BidiIterator, A>& w)
+   {
+      w.set_first(sub.first, index);
+      w.set_second(sub.second, index, sub.matched);
+   }
+   const sub_match<BidiIterator>& get() { return sub; }
+};
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_all_states()
+{
+   static matcher_proc_type const s_match_vtable[29] = 
+   {
+      (&perl_matcher<BidiIterator, Allocator, traits>::match_startmark),
+      &perl_matcher<BidiIterator, Allocator, traits>::match_endmark,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_literal,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_start_line,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_end_line,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_wild,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_match,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_boundary,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_within_word,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_start,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_word_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_start,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_buffer_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_backref,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_set,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_jump,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_alt,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_rep,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_combining,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_soft_buffer_end,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_restart_continue,
+      (::boost::is_random_access_iterator<BidiIterator>::value ? &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast : &perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow),
+      &perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_backstep,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_assert_backref,
+      &perl_matcher<BidiIterator, Allocator, traits>::match_toggle_case,
+   };
+
+   if(state_count > max_state_count)
+      raise_error(traits_inst, regex_constants::error_space);
+   while(pstate)
+   {
+      matcher_proc_type proc = s_match_vtable[pstate->type];
+      ++state_count;
+      if(!(this->*proc)())
+      {
+         if((m_match_flags & match_partial) && (position == last) && (position != search_base))
+            m_has_partial_match = true;
+         return 0;
+      }
+   }
+   return true;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_startmark()
+{
+   int index = static_cast<const re_brace*>(pstate)->index;
+   bool r = true;
+   switch(index)
+   {
+   case 0:
+      pstate = pstate->next.p;
+      break;
+   case -1:
+   case -2:
+      {
+         // forward lookahead assert:
+         BidiIterator old_position(position);
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         r = match_all_states();
+         pstate = next_pstate;
+         position = old_position;
+         if((r && (index != -1)) || (!r && (index != -2)))
+            r = false;
+         else
+            r = true;
+         break;
+      }
+   case -3:
+      {
+         // independent sub-expression:
+         bool old_independent = m_independent;
+         m_independent = true;
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         r = match_all_states();
+         pstate = next_pstate;
+         m_independent = old_independent;
+#ifdef BOOST_REGEX_MATCH_EXTRA
+         if(r && (m_match_flags & match_extra))
+         {
+            //
+            // our captures have been stored in *m_presult
+            // we need to unpack them, and insert them
+            // back in the right order when we unwind the stack:
+            //
+            unsigned i;
+            match_results<BidiIterator, Allocator> tm(*m_presult);
+            for(i = 0; i < tm.size(); ++i)
+               (*m_presult)[i].get_captures().clear();
+            // match everything else:
+            r = match_all_states();
+            // now place the stored captures back:
+            for(i = 0; i < tm.size(); ++i)
+            {
+               typedef typename sub_match<BidiIterator>::capture_sequence_type seq;
+               seq& s1 = (*m_presult)[i].get_captures();
+               const seq& s2 = tm[i].captures();
+               s1.insert(
+                  s1.end(), 
+                  s2.begin(), 
+                  s2.end());
+            }
+         }
+#endif
+         break;
+      }
+   case -4:
+      {
+      // conditional expression:
+      const re_alt* alt = static_cast<const re_alt*>(pstate->next.p);
+      BOOST_ASSERT(alt->type == syntax_element_alt);
+      pstate = alt->next.p;
+      if(pstate->type == syntax_element_assert_backref)
+      {
+         if(!match_assert_backref())
+            pstate = alt->alt.p;
+         break;
+      }
+      else
+      {
+         // zero width assertion, have to match this recursively:
+         BOOST_ASSERT(pstate->type == syntax_element_startmark);
+         bool negated = static_cast<const re_brace*>(pstate)->index == -2;
+         BidiIterator saved_position = position;
+         const re_syntax_base* next_pstate = static_cast<const re_jump*>(pstate->next.p)->alt.p->next.p;
+         pstate = pstate->next.p->next.p;
+         bool r = match_all_states();
+         position = saved_position;
+         if(negated)
+            r = !r;
+         if(r)
+            pstate = next_pstate;
+         else
+            pstate = alt->alt.p;
+         break;
+      }
+      }
+   default:
+   {
+      BOOST_ASSERT(index > 0);
+      if((m_match_flags & match_nosubs) == 0)
+      {
+         backup_subex<BidiIterator> sub(*m_presult, index);
+         m_presult->set_first(position, index);
+         pstate = pstate->next.p;
+         r = match_all_states();
+         if(r == false)
+            sub.restore(*m_presult);
+#ifdef BOOST_REGEX_MATCH_EXTRA
+         //
+         // we have a match, push the capture information onto the stack:
+         //
+         else if(sub.get().matched && (match_extra & m_match_flags))
+            ((*m_presult)[index]).get_captures().push_back(sub.get());
+#endif
+      }
+      else
+      {
+         pstate = pstate->next.p;
+      }
+      break;
+   }
+   }
+   return r;
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_alt()
+{
+   bool take_first, take_second;
+   const re_alt* jmp = static_cast<const re_alt*>(pstate);
+
+   // find out which of these two alternatives we need to take:
+   if(position == last)
+   {
+      take_first = jmp->can_be_null & mask_take;
+      take_second = jmp->can_be_null & mask_skip;
+   }
+   else
+   {
+      take_first = can_start(*position, jmp->_map, (unsigned char)mask_take);
+      take_second = can_start(*position, jmp->_map, (unsigned char)mask_skip);
+  }
+
+   if(take_first)
+   {
+      // we can take the first alternative,
+      // see if we need to push next alternative:
+      if(take_second)
+      {
+         BidiIterator oldposition(position);
+         const re_syntax_base* old_pstate = jmp->alt.p;
+         pstate = pstate->next.p;
+         if(!match_all_states())
+         {
+            pstate = old_pstate;
+            position = oldposition;
+         }
+         return true;
+      }
+      pstate = pstate->next.p;
+      return true;
+   }
+   if(take_second)
+   {
+      pstate = jmp->alt.p;
+      return true;
+   }
+   return false;  // neither option is possible
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_rep()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127 4244)
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   //
+   // Always copy the repeat count, so that the state is restored
+   // when we exit this scope:
+   //
+   repeater_count<BidiIterator> r(rep->state_id, &next_count, position);
+   //
+   // If we've had at least one repeat already, and the last one 
+   // matched the NULL string then set the repeat count to
+   // maximum:
+   //
+   next_count->check_null_repeat(position, rep->max);
+
+   // find out which of these two alternatives we need to take:
+   bool take_first, take_second;
+   if(position == last)
+   {
+      take_first = rep->can_be_null & mask_take;
+      take_second = rep->can_be_null & mask_skip;
+   }
+   else
+   {
+      take_first = can_start(*position, rep->_map, (unsigned char)mask_take);
+      take_second = can_start(*position, rep->_map, (unsigned char)mask_skip);
+   }
+
+   if(next_count->get_count() < rep->min)
+   {
+      // we must take the repeat:
+      if(take_first)
+      {
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         return match_all_states();
+      }
+      return false;
+   }
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   if(greedy)
+   {
+      // try and take the repeat if we can:
+      if((next_count->get_count() < rep->max) && take_first)
+      {
+         // store position in case we fail:
+         BidiIterator pos = position;
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         if(match_all_states())
+            return true;
+         // failed repeat, reset posistion and fall through for alternative:
+         position = pos;
+      }
+      if(take_second)
+      {
+         pstate = rep->alt.p;
+         return true;
+      }
+      return false; // can't take anything, fail...
+   }
+   else // non-greedy
+   {
+      // try and skip the repeat if we can:
+      if(take_second)
+      {
+         // store position in case we fail:
+         BidiIterator pos = position;
+         pstate = rep->alt.p;
+         if(match_all_states())
+            return true;
+         // failed alternative, reset posistion and fall through for repeat:
+         position = pos;
+      }
+      if((next_count->get_count() < rep->max) && take_first)
+      {
+         // increase the counter:
+         ++(*next_count);
+         pstate = rep->next.p;
+         return match_all_states();
+      }
+   }
+   return false;
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_slow()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   unsigned count = 0;
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   re_syntax_base* psingle = rep->next.p;
+   // match compulsary repeats first:
+   while(count < rep->min)
+   {
+      pstate = psingle;
+      if(!match_wild())
+         return false;
+      ++count;
+   }
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   if(greedy)
+   {
+      // normal repeat:
+      while(count < rep->max)
+      {
+         pstate = psingle;
+         if(!match_wild())
+            break;
+         ++count;
+      }
+      if((rep->leading) && (count < rep->max))
+         restart = position;
+      pstate = rep;
+      return backtrack_till_match(count - rep->min);
+   }
+   else
+   {
+      // non-greedy, keep trying till we get a match:
+      BidiIterator save_pos;
+      do
+      {
+         if((rep->leading) && (rep->max == UINT_MAX))
+            restart = position;
+         pstate = rep->alt.p;
+         save_pos = position;
+         ++state_count;
+         if(match_all_states())
+            return true;
+         if(count >= rep->max)
+            return false;
+         ++count;
+         pstate = psingle;
+         position = save_pos;
+         if(!match_wild())
+            return false;
+      }while(true);
+   }
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_dot_repeat_fast()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   if(m_match_flags & match_not_dot_null)
+      return match_dot_repeat_slow();
+   if((static_cast<const re_dot*>(pstate->next.p)->mask & match_any_mask) == 0)
+      return match_dot_repeat_slow();
+   //
+   // start by working out how much we can skip:
+   //
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4267)
+#endif
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t count = (std::min)(static_cast<std::size_t>(::boost::re_detail::distance(position, last)), static_cast<std::size_t>(greedy ? rep->max : rep->min));
+   if(rep->min > count)
+   {
+      position = last;
+      return false;  // not enough text left to match
+   }
+   std::advance(position, count);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+   if((rep->leading) && (count < rep->max) && greedy)
+      restart = position;
+   if(greedy)
+      return backtrack_till_match(count - rep->min);
+
+   // non-greedy, keep trying till we get a match:
+   BidiIterator save_pos;
+   do
+   {
+      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
+      {
+         ++position;
+         ++count;
+      }
+      if((rep->leading) && (rep->max == UINT_MAX))
+         restart = position;
+      pstate = rep->alt.p;
+      save_pos = position;
+      ++state_count;
+      if(match_all_states())
+         return true;
+      if(count >= rep->max)
+         return false;
+      if(save_pos == last)
+         return false;
+      position = ++save_pos;
+      ++count;
+   }while(true);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_char_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#pragma warning(disable:4267)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   BOOST_ASSERT(1 == static_cast<const re_literal*>(rep->next.p)->length);
+   const char_type what = *reinterpret_cast<const char_type*>(static_cast<const re_literal*>(rep->next.p) + 1);
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t count, desired;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      desired = 
+         (std::min)(
+            (std::size_t)(greedy ? rep->max : rep->min),
+            (std::size_t)::boost::re_detail::distance(position, last));
+      count = desired;
+      ++desired;
+      if(icase)
+      {
+         while(--desired && (traits_inst.translate_nocase(*position) == what))
+         {
+            ++position;
+         }
+      }
+      else
+      {
+         while(--desired && (traits_inst.translate(*position) == what))
+         {
+            ++position;
+         }
+      }
+      count = count - desired;
+   }
+   else
+   {
+      count = 0;
+      desired = greedy ? rep->max : rep->min;
+      while((count < desired) && (position != last) && (traits_inst.translate(*position, icase) == what))
+      {
+         ++position;
+         ++count;
+      }
+   }
+   if((rep->leading) && (count < rep->max) && greedy)
+      restart = position;
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+      return backtrack_till_match(count - rep->min);
+
+   // non-greedy, keep trying till we get a match:
+   BidiIterator save_pos;
+   do
+   {
+      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
+      {
+         if((traits_inst.translate(*position, icase) == what))
+         {
+            ++position;
+            ++count;
+         }
+         else
+            return false;  // counldn't repeat even though it was the only option
+      }
+      if((rep->leading) && (rep->max == UINT_MAX))
+         restart = position;
+      pstate = rep->alt.p;
+      save_pos = position;
+      ++state_count;
+      if(match_all_states())
+         return true;
+      if(count >= rep->max)
+         return false;
+      position = save_pos;
+      if(position == last)
+         return false;
+      if(traits_inst.translate(*position, icase) == what)
+      {
+         ++position;
+         ++count;
+      }
+      else
+      {
+         return false;
+      }
+   }while(true);
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_set_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   const unsigned char* map = static_cast<const re_set*>(rep->next.p)->_map;
+   unsigned count = 0;
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t desired = greedy ? rep->max : rep->min;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      BidiIterator end = position;
+      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
+      BidiIterator origin(position);
+      while((position != end) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+      {
+         ++position;
+      }
+      count = (unsigned)::boost::re_detail::distance(origin, position);
+   }
+   else
+   {
+      while((count < desired) && (position != last) && map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+      {
+         ++position;
+         ++count;
+      }
+   }
+   if((rep->leading) && (count < rep->max) && greedy)
+      restart = position;
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+      return backtrack_till_match(count - rep->min);
+
+   // non-greedy, keep trying till we get a match:
+   BidiIterator save_pos;
+   do
+   {
+      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
+      {
+         if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+         {
+            ++position;
+            ++count;
+         }
+         else
+            return false;  // counldn't repeat even though it was the only option
+      }
+      if((rep->leading) && (rep->max == UINT_MAX))
+         restart = position;
+      pstate = rep->alt.p;
+      save_pos = position;
+      ++state_count;
+      if(match_all_states())
+         return true;
+      if(count >= rep->max)
+         return false;
+      position = save_pos;
+      if(position == last)
+         return false;
+      if(map[static_cast<unsigned char>(traits_inst.translate(*position, icase))])
+      {
+         ++position;
+         ++count;
+      }
+      else
+      {
+         return false;
+      }
+   }while(true);
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::match_long_set_repeat()
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+#ifdef __BORLANDC__
+#pragma option push -w-8008 -w-8066 -w-8004
+#endif
+   typedef typename traits::char_class_type char_class_type;
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   const re_set_long<char_class_type>* set = static_cast<const re_set_long<char_class_type>*>(pstate->next.p);
+   unsigned count = 0;
+   //
+   // start by working out how much we can skip:
+   //
+   bool greedy = (rep->greedy) && (!(m_match_flags & regex_constants::match_any) || m_independent);   
+   std::size_t desired = greedy ? rep->max : rep->min;
+   if(::boost::is_random_access_iterator<BidiIterator>::value)
+   {
+      BidiIterator end = position;
+      std::advance(end, (std::min)((std::size_t)::boost::re_detail::distance(position, last), desired));
+      BidiIterator origin(position);
+      while((position != end) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
+      {
+         ++position;
+      }
+      count = (unsigned)::boost::re_detail::distance(origin, position);
+   }
+   else
+   {
+      while((count < desired) && (position != last) && (position != re_is_set_member(position, last, set, re.get_data(), icase)))
+      {
+         ++position;
+         ++count;
+      }
+   }
+   if((rep->leading) && (count < rep->max) && greedy)
+      restart = position;
+   if(count < rep->min)
+      return false;
+
+   if(greedy)
+      return backtrack_till_match(count - rep->min);
+
+   // non-greedy, keep trying till we get a match:
+   BidiIterator save_pos;
+   do
+   {
+      while((position != last) && (count < rep->max) && !can_start(*position, rep->_map, mask_skip))
+      {
+         if(position != re_is_set_member(position, last, set, re.get_data(), icase))
+         {
+            ++position;
+            ++count;
+         }
+         else
+            return false;  // counldn't repeat even though it was the only option
+      }
+      if((rep->leading) && (rep->max == UINT_MAX))
+         restart = position;
+      pstate = rep->alt.p;
+      save_pos = position;
+      ++state_count;
+      if(match_all_states())
+         return true;
+      if(count >= rep->max)
+         return false;
+      position = save_pos;
+      if(position == last)
+         return false;
+      if(position != re_is_set_member(position, last, set, re.get_data(), icase))
+      {
+         ++position;
+         ++count;
+      }
+      else
+      {
+         return false;
+      }
+   }while(true);
+#ifdef __BORLANDC__
+#pragma option pop
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+template <class BidiIterator, class Allocator, class traits>
+bool perl_matcher<BidiIterator, Allocator, traits>::backtrack_till_match(std::size_t count)
+{
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4127)
+#endif
+   if((m_match_flags & match_partial) && (position == last))
+      m_has_partial_match = true;
+
+   const re_repeat* rep = static_cast<const re_repeat*>(pstate);
+   BidiIterator backtrack = position;
+   if(position == last)
+   {
+      if(rep->can_be_null & mask_skip) 
+      {
+         pstate = rep->alt.p;
+         if(match_all_states())
+            return true;
+      }
+      if(count)
+      {
+         position = --backtrack;
+         --count;
+      }
+      else
+         return false;
+   }
+   do
+   {
+      while(count && !can_start(*position, rep->_map, mask_skip))
+      {
+         --position;
+         --count;
+         ++state_count;
+      }
+      pstate = rep->alt.p;
+      backtrack = position;
+      if(match_all_states())
+         return true;
+      if(count == 0)
+         return false;
+      position = --backtrack;
+      ++state_count;
+      --count;
+   }while(true);
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+}
+
+} // namespace re_detail
+} // namespace boost
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/primary_transform.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE:        primary_transform.hpp
+  *   VERSION:     see <boost/version.hpp>
+  *   DESCRIPTION: Heuristically determines the sort string format in use
+  *                by the current locale.
+  */
+
+#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
+#define BOOST_REGEX_PRIMARY_TRANSFORM
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+   namespace re_detail{
+
+
+enum{
+   sort_C,
+   sort_fixed,
+   sort_delim,
+   sort_unknown
+};
+
+template <class S, class charT>
+unsigned count_chars(const S& s, charT c)
+{
+   //
+   // Count how many occurances of character c occur
+   // in string s: if c is a delimeter between collation
+   // fields, then this should be the same value for all
+   // sort keys:
+   //
+   unsigned int count = 0;
+   for(unsigned pos = 0; pos < s.size(); ++pos)
+   {
+      if(s[pos] == c) ++count;
+   }
+   return count;
+}
+
+
+template <class traits, class charT>
+unsigned find_sort_syntax(const traits* pt, charT* delim)
+{
+   //
+   // compare 'a' with 'A' to see how similar they are,
+   // should really use a-accute but we can't portably do that,
+   //
+   typedef typename traits::string_type string_type;
+   typedef typename traits::char_type char_type;
+
+   // Suppress incorrect warning for MSVC
+   (void)pt;
+
+   char_type a[2] = {'a', '\0', };
+   string_type sa(pt->transform(a, a+1));
+   if(sa == a)
+   {
+      *delim = 0;
+      return sort_C;
+   }
+   char_type A[2] = { 'A', '\0', };
+   string_type sA(pt->transform(A, A+1));
+   char_type c[2] = { ';', '\0', };
+   string_type sc(pt->transform(c, c+1));
+
+   int pos = 0;
+   while((pos <= static_cast<int>(sa.size())) && (pos <= static_cast<int>(sA.size())) && (sa[pos] == sA[pos])) ++pos;
+   --pos;
+   if(pos < 0)
+   {
+      *delim = 0;
+      return sort_unknown;
+   }
+   //
+   // at this point sa[pos] is either the end of a fixed width field
+   // or the character that acts as a delimiter:
+   //
+   charT maybe_delim = sa[pos];
+   if((pos != 0) && (count_chars(sa, maybe_delim) == count_chars(sA, maybe_delim)) && (count_chars(sa, maybe_delim) == count_chars(sc, maybe_delim)))
+   {
+      *delim = maybe_delim;
+      return sort_delim;
+   }
+   //
+   // OK doen't look like a delimiter, try for fixed width field:
+   //
+   if((sa.size() == sA.size()) && (sa.size() == sc.size()))
+   {
+      // note assumes that the fixed width field is less than
+      // (numeric_limits<charT>::max)(), should be true for all types
+      // I can't imagine 127 character fields...
+      *delim = static_cast<charT>(++pos);
+      return sort_fixed;
+   }
+   //
+   // don't know what it is:
+   //
+   *delim = 0;
+   return sort_unknown;
+}
+
+
+   } // namespace re_detail
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/protected_call.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,81 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         basic_regex_creator.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class basic_regex_creator which fills in
+  *                the data members of a regex_data object.
+  */
+
+#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
+#define BOOST_REGEX_V4_PROTECTED_CALL_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+class BOOST_REGEX_DECL abstract_protected_call
+{
+public:
+   bool BOOST_REGEX_CALL execute()const;
+   // this stops gcc-4 from complaining:
+   virtual ~abstract_protected_call(){}
+private:
+   virtual bool call()const = 0;
+};
+
+template <class T>
+class concrete_protected_call
+   : public abstract_protected_call
+{
+public:
+   typedef bool (T::*proc_type)();
+   concrete_protected_call(T* o, proc_type p)
+      : obj(o), proc(p) {}
+private:
+   virtual bool call()const;
+   T* obj;
+   proc_type proc;
+};
+
+template <class T>
+bool concrete_protected_call<T>::call()const
+{
+   return (obj->*proc)();
+}
+
+}
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regbase.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,180 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regbase.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares class regbase.
+  */
+
+#ifndef BOOST_REGEX_V4_REGBASE_HPP
+#define BOOST_REGEX_V4_REGBASE_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+//
+// class regbase
+// handles error codes and flags
+//
+class BOOST_REGEX_DECL regbase
+{
+public:
+   enum flag_type_
+   {
+      //
+      // Divide the flags up into logical groups:
+      // bits 0-7 indicate main synatx type.
+      // bits 8-15 indicate syntax subtype.
+      // bits 16-31 indicate options that are common to all
+      // regex syntaxes.
+      // In all cases the default is 0.
+      //
+      // Main synatx group:
+      //
+      perl_syntax_group = 0,                      // default
+      basic_syntax_group = 1,                     // POSIX basic
+      literal = 2,                                // all characters are literals
+      main_option_type = literal | basic_syntax_group | perl_syntax_group, // everything!
+      //
+      // options specific to perl group:
+      //
+      no_bk_refs = 1 << 8,                        // \d not allowed
+      no_perl_ex = 1 << 9,                        // disable perl extensions
+      no_mod_m = 1 << 10,                         // disable Perl m modifier
+      mod_x = 1 << 11,                            // Perl x modifier
+      mod_s = 1 << 12,                            // force s modifier on (overrides match_not_dot_newline)
+      no_mod_s = 1 << 13,                         // force s modifier off (overrides match_not_dot_newline)
+
+      //
+      // options specific to basic group:
+      //
+      no_char_classes = 1 << 8,                   // [[:CLASS:]] not allowed
+      no_intervals = 1 << 9,                      // {x,y} not allowed
+      bk_plus_qm = 1 << 10,                       // uses \+ and \?
+      bk_vbar = 1 << 11,                          // use \| for alternatives
+      emacs_ex = 1 << 12,                         // enables emacs extensions
+
+      //
+      // options common to all groups:
+      //
+      no_escape_in_lists = 1 << 16,                     // '\' not special inside [...]
+      newline_alt = 1 << 17,                            // \n is the same as |
+      no_except = 1 << 18,                              // no exception on error
+      failbit = 1 << 19,                                // error flag
+      icase = 1 << 20,                                  // characters are matched regardless of case
+      nocollate = 0,                                    // don't use locale specific collation (deprecated)
+      collate = 1 << 21,                                // use locale specific collation
+      nosubs = 1 << 22,                                 // don't mark sub-expressions
+      save_subexpression_location = 1 << 23,            // save subexpression locations
+      no_empty_expressions = 1 << 24,                   // no empty expressions allowed
+      optimize = 0,                                     // not really supported
+      
+
+
+      basic = basic_syntax_group | collate | no_escape_in_lists,
+      extended = no_bk_refs | collate | no_perl_ex | no_escape_in_lists,
+      normal = 0,
+      emacs = basic_syntax_group | collate | emacs_ex | bk_vbar,
+      awk = no_bk_refs | collate | no_perl_ex,
+      grep = basic | newline_alt,
+      egrep = extended | newline_alt,
+      sed = basic,
+      perl = normal,
+      ECMAScript = normal,
+      JavaScript = normal,
+      JScript = normal
+   };
+   typedef unsigned int flag_type;
+
+   enum restart_info
+   {
+      restart_any = 0,
+      restart_word = 1,
+      restart_line = 2,
+      restart_buf = 3,
+      restart_continue = 4,
+      restart_lit = 5,
+      restart_fixed_lit = 6, 
+      restart_count = 7
+   };
+};
+
+//
+// provide std lib proposal compatible constants:
+//
+namespace regex_constants{
+
+   enum flag_type_
+   {
+
+      no_except = ::boost::regbase::no_except,
+      failbit = ::boost::regbase::failbit,
+      literal = ::boost::regbase::literal,
+      icase = ::boost::regbase::icase,
+      nocollate = ::boost::regbase::nocollate,
+      collate = ::boost::regbase::collate,
+      nosubs = ::boost::regbase::nosubs,
+      optimize = ::boost::regbase::optimize,
+      bk_plus_qm = ::boost::regbase::bk_plus_qm,
+      bk_vbar = ::boost::regbase::bk_vbar,
+      no_intervals = ::boost::regbase::no_intervals,
+      no_char_classes = ::boost::regbase::no_char_classes,
+      no_escape_in_lists = ::boost::regbase::no_escape_in_lists,
+      no_mod_m = ::boost::regbase::no_mod_m,
+      mod_x = ::boost::regbase::mod_x,
+      mod_s = ::boost::regbase::mod_s,
+      no_mod_s = ::boost::regbase::no_mod_s,
+      save_subexpression_location = ::boost::regbase::save_subexpression_location,
+      no_empty_expressions = ::boost::regbase::no_empty_expressions,
+
+      basic = ::boost::regbase::basic,
+      extended = ::boost::regbase::extended,
+      normal = ::boost::regbase::normal,
+      emacs = ::boost::regbase::emacs,
+      awk = ::boost::regbase::awk,
+      grep = ::boost::regbase::grep,
+      egrep = ::boost::regbase::egrep,
+      sed = basic,
+      perl = normal,
+      ECMAScript = normal,
+      JavaScript = normal,
+      JScript = normal
+   };
+   typedef ::boost::regbase::flag_type syntax_option_type;
+
+} // namespace regex_constants
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,202 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares boost::basic_regex<> and associated
+  *                functions and classes. This header is the main
+  *                entry point for the template regex code.
+  */
+
+#ifndef BOOST_RE_REGEX_HPP_INCLUDED
+#define BOOST_RE_REGEX_HPP_INCLUDED
+
+#ifdef __cplusplus
+
+// what follows is all C++ don't include in C builds!!
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+#ifndef BOOST_REGEX_WORKAROUND_HPP
+#include <boost/regex/v4/regex_workaround.hpp>
+#endif
+
+#ifndef BOOST_REGEX_FWD_HPP
+#include <boost/regex_fwd.hpp>
+#endif
+#ifndef BOOST_REGEX_TRAITS_HPP
+#include <boost/regex/regex_traits.hpp>
+#endif
+#ifndef BOOST_REGEX_RAW_BUFFER_HPP
+#include <boost/regex/v4/error_type.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_MATCH_FLAGS
+#include <boost/regex/v4/match_flags.hpp>
+#endif
+#ifndef BOOST_REGEX_RAW_BUFFER_HPP
+#include <boost/regex/v4/regex_raw_buffer.hpp>
+#endif
+#ifndef BOOST_RE_PAT_EXCEPT_HPP
+#include <boost/regex/pattern_except.hpp>
+#endif
+
+#ifndef BOOST_REGEX_V4_CHAR_REGEX_TRAITS_HPP
+#include <boost/regex/v4/char_regex_traits.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_STATES_HPP
+#include <boost/regex/v4/states.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_REGBASE_HPP
+#include <boost/regex/v4/regbase.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_ITERATOR_TRAITS_HPP
+#include <boost/regex/v4/iterator_traits.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_HPP
+#include <boost/regex/v4/basic_regex.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_CREATOR_HPP
+#include <boost/regex/v4/basic_regex_creator.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_BASIC_REGEX_PARSER_HPP
+#include <boost/regex/v4/basic_regex_parser.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_SUB_MATCH_HPP
+#include <boost/regex/v4/sub_match.hpp>
+#endif
+#ifndef BOOST_REGEX_FORMAT_HPP
+#include <boost/regex/v4/regex_format.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_MATCH_RESULTS_HPP
+#include <boost/regex/v4/match_results.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_PROTECTED_CALL_HPP
+#include <boost/regex/v4/protected_call.hpp>
+#endif
+#ifndef BOOST_REGEX_MATCHER_HPP
+#include <boost/regex/v4/perl_matcher.hpp>
+#endif
+//
+// template instances:
+//
+#define BOOST_REGEX_CHAR_T char
+#ifdef BOOST_REGEX_NARROW_INSTANTIATE
+#  define BOOST_REGEX_INSTANTIATE
+#endif
+#include <boost/regex/v4/instances.hpp>
+#undef BOOST_REGEX_CHAR_T
+#ifdef BOOST_REGEX_INSTANTIATE
+#  undef BOOST_REGEX_INSTANTIATE
+#endif
+
+#ifndef BOOST_NO_WREGEX
+#define BOOST_REGEX_CHAR_T wchar_t
+#ifdef BOOST_REGEX_WIDE_INSTANTIATE
+#  define BOOST_REGEX_INSTANTIATE
+#endif
+#include <boost/regex/v4/instances.hpp>
+#undef BOOST_REGEX_CHAR_T
+#ifdef BOOST_REGEX_INSTANTIATE
+#  undef BOOST_REGEX_INSTANTIATE
+#endif
+#endif
+
+#if !defined(BOOST_NO_WREGEX) && defined(BOOST_REGEX_HAS_OTHER_WCHAR_T)
+#define BOOST_REGEX_CHAR_T unsigned short
+#ifdef BOOST_REGEX_US_INSTANTIATE
+#  define BOOST_REGEX_INSTANTIATE
+#endif
+#include <boost/regex/v4/instances.hpp>
+#undef BOOST_REGEX_CHAR_T
+#ifdef BOOST_REGEX_INSTANTIATE
+#  undef BOOST_REGEX_INSTANTIATE
+#endif
+#endif
+
+
+namespace boost{
+#ifdef BOOST_REGEX_NO_FWD
+typedef basic_regex<char, regex_traits<char> > regex;
+#ifndef BOOST_NO_WREGEX
+typedef basic_regex<wchar_t, regex_traits<wchar_t> > wregex;
+#endif
+#endif
+
+typedef match_results<const char*> cmatch;
+typedef match_results<std::string::const_iterator> smatch;
+#ifndef BOOST_NO_WREGEX
+typedef match_results<const wchar_t*> wcmatch;
+typedef match_results<std::wstring::const_iterator> wsmatch;
+#endif
+
+} // namespace boost
+#ifndef BOOST_REGEX_MATCH_HPP
+#include <boost/regex/v4/regex_match.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_REGEX_SEARCH_HPP
+#include <boost/regex/v4/regex_search.hpp>
+#endif
+#ifndef BOOST_REGEX_ITERATOR_HPP
+#include <boost/regex/v4/regex_iterator.hpp>
+#endif
+#ifndef BOOST_REGEX_TOKEN_ITERATOR_HPP
+#include <boost/regex/v4/regex_token_iterator.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_REGEX_GREP_HPP
+#include <boost/regex/v4/regex_grep.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_REGEX_REPLACE_HPP
+#include <boost/regex/v4/regex_replace.hpp>
+#endif
+#ifndef BOOST_REGEX_V4_REGEX_MERGE_HPP
+#include <boost/regex/v4/regex_merge.hpp>
+#endif
+#ifndef BOOST_REGEX_SPLIT_HPP
+#include <boost/regex/v4/regex_split.hpp>
+#endif
+
+#endif  // __cplusplus
+
+#endif  // include
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_format.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,662 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_format.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides formatting output routines for search and replace
+  *                operations.  Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+#ifndef BOOST_REGEX_FORMAT_HPP
+#define BOOST_REGEX_FORMAT_HPP
+
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+//
+// Forward declaration:
+//
+   template <class BidiIterator, class Allocator = BOOST_DEDUCED_TYPENAME std::vector<sub_match<BidiIterator> >::allocator_type >
+class match_results;
+
+namespace re_detail{
+
+//
+// struct trivial_format_traits:
+// defines minimum localisation support for formatting
+// in the case that the actual regex traits is unavailable.
+//
+template <class charT>
+struct trivial_format_traits
+{
+   typedef charT char_type;
+
+   static std::ptrdiff_t length(const charT* p)
+   {
+      return global_length(p);
+   }
+   static charT tolower(charT c)
+   {
+      return ::boost::re_detail::global_lower(c);
+   }
+   static charT toupper(charT c)
+   {
+      return ::boost::re_detail::global_upper(c);
+   }
+   static int value(const charT c, int radix)
+   {
+      int result = global_value(c);
+      return result >= radix ? -1 : result;
+   }
+   int toi(const charT*& p1, const charT* p2, int radix)const
+   {
+      return global_toi(p1, p2, radix, *this);
+   }
+};
+
+template <class OutputIterator, class Results, class traits>
+class basic_regex_formatter
+{
+public:
+   typedef typename traits::char_type char_type;
+   basic_regex_formatter(OutputIterator o, const Results& r, const traits& t)
+      : m_traits(t), m_results(r), m_out(o), m_state(output_copy), m_restore_state(output_copy), m_have_conditional(false) {}
+   OutputIterator format(const char_type* p1, const char_type* p2, match_flag_type f);
+   OutputIterator format(const char_type* p1, match_flag_type f)
+   {
+      return format(p1, p1 + m_traits.length(p1), f);
+   }
+private:
+   typedef typename Results::value_type sub_match_type;
+   enum output_state
+   {
+      output_copy,
+      output_next_lower,
+      output_next_upper,
+      output_lower,
+      output_upper,
+      output_none
+   };
+
+   void put(char_type c);
+   void put(const sub_match_type& sub);
+   void format_all();
+   void format_perl();
+   void format_escape();
+   void format_conditional();
+   void format_until_scope_end();
+
+   const traits& m_traits;       // the traits class for localised formatting operations
+   const Results& m_results;     // the match_results being used.
+   OutputIterator m_out;         // where to send output.
+   const char_type* m_position;  // format string, current position
+   const char_type* m_end;       // format string end
+   match_flag_type m_flags;      // format flags to use
+   output_state    m_state;      // what to do with the next character
+   output_state    m_restore_state;  // what state to restore to.
+   bool            m_have_conditional; // we are parsing a conditional
+private:
+   basic_regex_formatter(const basic_regex_formatter&);
+   basic_regex_formatter& operator=(const basic_regex_formatter&);
+};
+
+template <class OutputIterator, class Results, class traits>
+OutputIterator basic_regex_formatter<OutputIterator, Results, traits>::format(const char_type* p1, const char_type* p2, match_flag_type f)
+{
+   m_position = p1;
+   m_end = p2;
+   m_flags = f;
+   format_all();
+   return m_out;
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::format_all()
+{
+   // over and over:
+   while(m_position != m_end)
+   {
+      switch(*m_position)
+      {
+      case '&':
+         if(m_flags & ::boost::regex_constants::format_sed)
+         {
+            ++m_position;
+            put(m_results[0]);
+            break;
+         }
+         put(*m_position++);
+         break;
+      case '\\':
+         format_escape();
+         break;
+      case '(':
+         if(m_flags & boost::regex_constants::format_all)
+         {
+            ++m_position;
+            bool have_conditional = m_have_conditional;
+            m_have_conditional = false;
+            format_until_scope_end();
+            m_have_conditional = have_conditional;
+            if(m_position == m_end)
+               return;
+            BOOST_ASSERT(*m_position == static_cast<char_type>(')'));
+            ++m_position;  // skip the closing ')'
+            break;
+         }
+         put(*m_position);
+         ++m_position;
+         break;
+      case ')':
+         if(m_flags & boost::regex_constants::format_all)
+         {
+            return;
+         }
+         put(*m_position);
+         ++m_position;
+         break;
+      case ':':
+         if((m_flags & boost::regex_constants::format_all) && m_have_conditional)
+         {
+            return;
+         }
+         put(*m_position);
+         ++m_position;
+         break;
+      case '?':
+         if(m_flags & boost::regex_constants::format_all)
+         {
+            ++m_position;
+            format_conditional();
+            break;
+         }
+         put(*m_position);
+         ++m_position;
+         break;
+      case '$':
+         if((m_flags & format_sed) == 0)
+         {
+            format_perl();
+            break;
+         }
+         // fall through, not a special character:
+      default:
+         put(*m_position);
+         ++m_position;
+         break;
+      }
+   }
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::format_perl()
+{
+   //
+   // On entry *m_position points to a '$' character
+   // output the information that goes with it:
+   //
+   BOOST_ASSERT(*m_position == '$');
+   //
+   // see if this is a trailing '$':
+   //
+   if(++m_position == m_end)
+   {
+      --m_position;
+      put(*m_position);
+      ++m_position;
+      return;
+   }
+   //
+   // OK find out what kind it is:
+   //
+   bool have_brace = false;
+   const char_type* save_position = m_position;
+   switch(*m_position)
+   {
+   case '&':
+      ++m_position;
+      put(this->m_results[0]);
+      break;
+   case '`':
+      ++m_position;
+      put(this->m_results.prefix());
+      break;
+   case '\'':
+      ++m_position;
+      put(this->m_results.suffix());
+      break;
+   case '$':
+      put(*m_position++);
+      break;
+   case '{':
+      have_brace = true;
+      ++m_position;
+      // fall through....
+   default:
+      // see if we have a number:
+      {
+         std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+         len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
+         int v = m_traits.toi(m_position, m_position + len, 10);
+         if((v < 0) || (have_brace && ((m_position == m_end) || (*m_position != '}'))))
+         {
+            // leave the $ as is, and carry on:
+            m_position = --save_position;
+            put(*m_position);
+            ++m_position;
+            break;
+         }
+         // otherwise output sub v:
+         put(this->m_results[v]);
+         if(have_brace)
+            ++m_position;
+      }
+   }
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::format_escape()
+{
+   // skip the escape and check for trailing escape:
+   if(++m_position == m_end)
+   {
+      put(static_cast<char_type>('\\'));
+      return;
+   }
+   // now switch on the escape type:
+   switch(*m_position)
+   {
+   case 'a':
+      put(static_cast<char_type>('\a'));
+      ++m_position;
+      break;
+   case 'f':
+      put(static_cast<char_type>('\f'));
+      ++m_position;
+      break;
+   case 'n':
+      put(static_cast<char_type>('\n'));
+      ++m_position;
+      break;
+   case 'r':
+      put(static_cast<char_type>('\r'));
+      ++m_position;
+      break;
+   case 't':
+      put(static_cast<char_type>('\t'));
+      ++m_position;
+      break;
+   case 'v':
+      put(static_cast<char_type>('\v'));
+      ++m_position;
+      break;
+   case 'x':
+      if(++m_position == m_end)
+      {
+         put(static_cast<char_type>('x'));
+         return;
+      }
+      // maybe have \x{ddd}
+      if(*m_position == static_cast<char_type>('{'))
+      {
+         ++m_position;
+         int val = m_traits.toi(m_position, m_end, 16);
+         if(val < 0)
+         {
+            // invalid value treat everything as literals:
+            put(static_cast<char_type>('x'));
+            put(static_cast<char_type>('{'));
+            return;
+         }
+         if(*m_position != static_cast<char_type>('}'))
+         {
+            while(*m_position != static_cast<char_type>('\\'))
+               --m_position;
+            ++m_position;
+            put(*m_position++);
+            return;
+         }
+         ++m_position;
+         put(static_cast<char_type>(val));
+         return;
+      }
+      else
+      {
+         std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+         len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
+         int val = m_traits.toi(m_position, m_position + len, 16);
+         if(val < 0)
+         {
+            --m_position;
+            put(*m_position++);
+            return;
+         }
+         put(static_cast<char_type>(val));
+      }
+      break;
+   case 'c':
+      if(++m_position == m_end)
+      {
+         --m_position;
+         put(*m_position++);
+         return;
+      }
+      put(static_cast<char_type>(*m_position++ % 32));
+      break;
+   case 'e':
+      put(static_cast<char_type>(27));
+      ++m_position;
+      break;
+   default:
+      // see if we have a perl specific escape:
+      if((m_flags & boost::regex_constants::format_sed) == 0)
+      {
+         bool breakout = false;
+         switch(*m_position)
+         {
+         case 'l':
+            ++m_position;
+            m_restore_state = m_state;
+            m_state = output_next_lower;
+            breakout = true;
+            break;
+         case 'L':
+            ++m_position;
+            m_state = output_lower;
+            breakout = true;
+            break;
+         case 'u':
+            ++m_position;
+            m_restore_state = m_state;
+            m_state = output_next_upper;
+            breakout = true;
+            break;
+         case 'U':
+            ++m_position;
+            m_state = output_upper;
+            breakout = true;
+            break;
+         case 'E':
+            ++m_position;
+            m_state = output_copy;
+            breakout = true;
+            break;
+         }
+         if(breakout)
+            break;
+      }
+      // see if we have a \n sed style backreference:
+      int v = m_traits.toi(m_position, m_position+1, 10);
+      if((v > 0) || ((v == 0) && (m_flags & ::boost::regex_constants::format_sed)))
+      {
+         put(m_results[v]);
+         break;
+      }
+      else if(v == 0)
+      {
+         // octal ecape sequence:
+         --m_position;
+         std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+         len = (std::min)(static_cast<std::ptrdiff_t>(4), len);
+         v = m_traits.toi(m_position, m_position + len, 8);
+         BOOST_ASSERT(v >= 0);
+         put(static_cast<char_type>(v));
+         break;
+      }
+      // Otherwise output the character "as is":
+      put(*m_position++);
+      break;
+   }
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::format_conditional()
+{
+   if(m_position == m_end)
+   {
+      // oops trailing '?':
+      put(static_cast<char_type>('?'));
+      return;
+   }
+   std::ptrdiff_t len = ::boost::re_detail::distance(m_position, m_end);
+   len = (std::min)(static_cast<std::ptrdiff_t>(2), len);
+   int v = m_traits.toi(m_position, m_position + len, 10);
+   if(v < 0)
+   {
+      // oops not a number:
+      put(static_cast<char_type>('?'));
+      return;
+   }
+
+   // output varies depending upon whether sub-expression v matched or not:
+   if(m_results[v].matched)
+   {
+      m_have_conditional = true;
+      format_all();
+      m_have_conditional = false;
+      if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))
+      {
+         // skip the ':':
+         ++m_position;
+         // save output state, then turn it off:
+         output_state saved_state = m_state;
+         m_state = output_none;
+         // format the rest of this scope:
+         format_until_scope_end();
+         // restore output state:
+         m_state = saved_state;
+      }
+   }
+   else
+   {
+      // save output state, then turn it off:
+      output_state saved_state = m_state;
+      m_state = output_none;
+      // format until ':' or ')':
+      m_have_conditional = true;
+      format_all();
+      m_have_conditional = false;
+      // restore state:
+      m_state = saved_state;
+      if((m_position != m_end) && (*m_position == static_cast<char_type>(':')))
+      {
+         // skip the ':':
+         ++m_position;
+         // format the rest of this scope:
+         format_until_scope_end();
+      }
+   }
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::format_until_scope_end()
+{
+   do
+   {
+      format_all();
+      if((m_position == m_end) || (*m_position == static_cast<char_type>(')')))
+         return;
+      put(*m_position++);
+   }while(m_position != m_end);
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::put(char_type c)
+{
+   // write a single character to output
+   // according to which case translation mode we are in:
+   switch(this->m_state)
+   {
+   case output_none:
+      return;
+   case output_next_lower:
+      c = m_traits.tolower(c);
+      this->m_state = m_restore_state;
+      break;
+   case output_next_upper:
+      c = m_traits.toupper(c);
+      this->m_state = m_restore_state;
+      break;
+   case output_lower:
+      c = m_traits.tolower(c);
+      break;
+   case output_upper:
+      c = m_traits.toupper(c);
+      break;
+   default:
+      break;
+   }
+   *m_out = c;
+   ++m_out;
+}
+
+template <class OutputIterator, class Results, class traits>
+void basic_regex_formatter<OutputIterator, Results, traits>::put(const sub_match_type& sub)
+{
+   typedef typename sub_match_type::iterator iterator_type;
+   iterator_type i = sub.first;
+   while(i != sub.second)
+   {
+      put(*i);
+      ++i;
+   }
+}
+
+template <class S>
+class string_out_iterator
+#ifndef BOOST_NO_STD_ITERATOR
+   : public std::iterator<std::output_iterator_tag, typename S::value_type>
+#endif
+{
+   S* out;
+public:
+   string_out_iterator(S& s) : out(&s) {}
+   string_out_iterator& operator++() { return *this; }
+   string_out_iterator& operator++(int) { return *this; }
+   string_out_iterator& operator*() { return *this; }
+   string_out_iterator& operator=(typename S::value_type v) 
+   { 
+      out->append(1, v); 
+      return *this; 
+   }
+
+#ifdef BOOST_NO_STD_ITERATOR
+   typedef std::ptrdiff_t difference_type;
+   typedef typename S::value_type value_type;
+   typedef value_type* pointer;
+   typedef value_type& reference;
+   typedef std::output_iterator_tag iterator_category;
+#endif
+};
+
+template <class OutputIterator, class Iterator, class Alloc, class charT, class traits>
+OutputIterator regex_format_imp(OutputIterator out,
+                          const match_results<Iterator, Alloc>& m,
+                          const charT* p1, const charT* p2,
+                          match_flag_type flags,
+                          const traits& t
+                         )
+{
+   if(flags & regex_constants::format_literal)
+   {
+      return re_detail::copy(p1, p2, out);
+   }
+
+   re_detail::basic_regex_formatter<
+      OutputIterator, 
+      match_results<Iterator, Alloc>, 
+      traits > f(out, m, t);
+   return f.format(p1, p2, flags);
+}
+
+
+} // namespace re_detail
+
+template <class OutputIterator, class Iterator, class charT>
+OutputIterator regex_format(OutputIterator out,
+                          const match_results<Iterator>& m,
+                          const charT* fmt,
+                          match_flag_type flags = format_all
+                         )
+{
+   re_detail::trivial_format_traits<charT> traits;
+   return re_detail::regex_format_imp(out, m, fmt, fmt + traits.length(fmt), flags, traits);
+}
+
+template <class OutputIterator, class Iterator, class charT>
+OutputIterator regex_format(OutputIterator out,
+                          const match_results<Iterator>& m,
+                          const std::basic_string<charT>& fmt,
+                          match_flag_type flags = format_all
+                         )
+{
+   re_detail::trivial_format_traits<charT> traits;
+   return re_detail::regex_format_imp(out, m, fmt.data(), fmt.data() + fmt.size(), flags, traits);
+}  
+
+template <class Iterator, class charT>
+std::basic_string<charT> regex_format(const match_results<Iterator>& m, 
+                                      const charT* fmt, 
+                                      match_flag_type flags = format_all)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   re_detail::trivial_format_traits<charT> traits;
+   re_detail::regex_format_imp(i, m, fmt, fmt + traits.length(fmt), flags, traits);
+   return result;
+}
+
+template <class Iterator, class charT>
+std::basic_string<charT> regex_format(const match_results<Iterator>& m, 
+                                      const std::basic_string<charT>& fmt, 
+                                      match_flag_type flags = format_all)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   re_detail::trivial_format_traits<charT> traits;
+   re_detail::regex_format_imp(i, m, fmt.data(), fmt.data() + fmt.size(), flags, traits);
+   return result;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_FORMAT_HPP
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_fwd.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,73 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_fwd.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Forward declares boost::basic_regex<> and
+  *                associated typedefs.
+  */
+
+#ifndef BOOST_REGEX_FWD_HPP_INCLUDED
+#define BOOST_REGEX_FWD_HPP_INCLUDED
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+
+//
+// define BOOST_REGEX_NO_FWD if this
+// header doesn't work!
+//
+#ifdef BOOST_REGEX_NO_FWD
+#  ifndef BOOST_RE_REGEX_HPP
+#     include <boost/regex.hpp>
+#  endif
+#else
+
+namespace boost{
+
+template <class charT>
+class cpp_regex_traits;
+template <class charT>
+struct c_regex_traits;
+template <class charT>
+class w32_regex_traits;
+
+#ifdef BOOST_REGEX_USE_WIN32_LOCALE
+template <class charT, class implementationT = w32_regex_traits<charT> >
+struct regex_traits;
+#elif defined(BOOST_REGEX_USE_CPP_LOCALE)
+template <class charT, class implementationT = cpp_regex_traits<charT> >
+struct regex_traits;
+#else
+template <class charT, class implementationT = c_regex_traits<charT> >
+struct regex_traits;
+#endif
+
+template <class charT, class traits = regex_traits<charT> >
+class basic_regex;
+
+typedef basic_regex<char, regex_traits<char> > regex;
+#ifndef BOOST_NO_WREGEX
+typedef basic_regex<wchar_t, regex_traits<wchar_t> > wregex;
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_NO_FWD
+
+#endif
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_grep.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,155 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_grep.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides regex_grep implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_GREP_HPP
+#define BOOST_REGEX_V4_REGEX_GREP_HPP
+
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+//
+// regex_grep:
+// find all non-overlapping matches within the sequence first last:
+//
+template <class Predicate, class BidiIterator, class charT, class traits>
+inline unsigned int regex_grep(Predicate foo, 
+                               BidiIterator first, 
+                               BidiIterator last, 
+                               const basic_regex<charT, traits>& e, 
+                               match_flag_type flags = match_default)
+{
+   if(e.flags() & regex_constants::failbit)
+      return false;
+
+   typedef typename match_results<BidiIterator>::allocator_type match_allocator_type;
+
+   match_results<BidiIterator> m;
+   re_detail::perl_matcher<BidiIterator, match_allocator_type, traits> matcher(first, last, m, e, flags, first);
+   unsigned int count = 0;
+   while(matcher.find())
+   {
+      ++count;
+      if(0 == foo(m))
+         return count; // caller doesn't want to go on
+      if(m[0].second == last)
+         return count; // we've reached the end, don't try and find an extra null match.
+      if(m.length() == 0)
+      {
+         if(m[0].second == last)
+            return count;
+         // we found a NULL-match, now try to find
+         // a non-NULL one at the same position:
+         match_results<BidiIterator, match_allocator_type> m2(m);
+         matcher.setf(match_not_null | match_continuous);
+         if(matcher.find())
+         {
+            ++count;
+            if(0 == foo(m))
+               return count;
+         }
+         else
+         {
+            // reset match back to where it was:
+            m = m2;
+         }
+         matcher.unsetf((match_not_null | match_continuous) & ~flags);
+      }
+   }
+   return count;
+}
+
+//
+// regex_grep convenience interfaces:
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+//
+// this isn't really a partial specialisation, but template function
+// overloading - if the compiler doesn't support partial specialisation
+// then it really won't support this either:
+template <class Predicate, class charT, class traits>
+inline unsigned int regex_grep(Predicate foo, const charT* str, 
+                        const basic_regex<charT, traits>& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_grep(foo, str, str + traits::length(str), e, flags);
+}
+
+template <class Predicate, class ST, class SA, class charT, class traits>
+inline unsigned int regex_grep(Predicate foo, const std::basic_string<charT, ST, SA>& s, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   return regex_grep(foo, s.begin(), s.end(), e, flags);
+}
+#else  // partial specialisation
+inline unsigned int regex_grep(bool (*foo)(const cmatch&), const char* str, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_grep(foo, str, str + regex::traits_type::length(str), e, flags);
+}
+#ifndef BOOST_NO_WREGEX
+inline unsigned int regex_grep(bool (*foo)(const wcmatch&), const wchar_t* str, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_grep(foo, str, str + wregex::traits_type::length(str), e, flags);
+}
+#endif
+inline unsigned int regex_grep(bool (*foo)(const match_results<std::string::const_iterator>&), const std::string& s,
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_grep(foo, s.begin(), s.end(), e, flags);
+}
+#if !defined(BOOST_NO_WREGEX)
+inline unsigned int regex_grep(bool (*foo)(const match_results<std::basic_string<wchar_t>::const_iterator>&), 
+                     const std::basic_string<wchar_t>& s, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_grep(foo, s.begin(), s.end(), e, flags);
+}
+#endif
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_V4_REGEX_GREP_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,201 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_iterator.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides regex_iterator implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_ITERATOR_HPP
+#define BOOST_REGEX_V4_REGEX_ITERATOR_HPP
+
+#include <boost/shared_ptr.hpp>
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class BidirectionalIterator, 
+          class charT,
+          class traits>
+class regex_iterator_implementation 
+{
+   typedef basic_regex<charT, traits> regex_type;
+
+   match_results<BidirectionalIterator> what;  // current match
+   BidirectionalIterator                base;  // start of sequence
+   BidirectionalIterator                end;   // end of sequence
+   const regex_type                     re;   // the expression
+   match_flag_type                      flags; // flags for matching
+
+public:
+   regex_iterator_implementation(const regex_type* p, BidirectionalIterator last, match_flag_type f)
+      : base(), end(last), re(*p), flags(f){}
+   bool init(BidirectionalIterator first)
+   {
+      base = first;
+      return regex_search(first, end, what, re, flags);
+   }
+   bool compare(const regex_iterator_implementation& that)
+   {
+      if(this == &that) return true;
+      return (&re.get_data() == &that.re.get_data()) && (end == that.end) && (flags == that.flags) && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second);
+   }
+   const match_results<BidirectionalIterator>& get()
+   { return what; }
+   bool next()
+   {
+      //if(what.prefix().first != what[0].second)
+      //   flags |= match_prev_avail;
+      BidirectionalIterator next_start = what[0].second;
+      match_flag_type f(flags);
+      if(!what.length())
+         f |= regex_constants::match_not_initial_null;
+      //if(base != next_start)
+      //   f |= regex_constants::match_not_bob;
+      bool result = regex_search(next_start, end, what, re, f, base);
+      if(result)
+         what.set_base(base);
+      return result;
+   }
+private:
+   regex_iterator_implementation& operator=(const regex_iterator_implementation&);
+};
+
+template <class BidirectionalIterator, 
+          class charT = BOOST_DEDUCED_TYPENAME re_detail::regex_iterator_traits<BidirectionalIterator>::value_type,
+          class traits = regex_traits<charT> >
+class regex_iterator 
+#ifndef BOOST_NO_STD_ITERATOR
+   : public std::iterator<
+         std::forward_iterator_tag, 
+         match_results<BidirectionalIterator>,
+         typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+         const match_results<BidirectionalIterator>*,
+         const match_results<BidirectionalIterator>& >         
+#endif
+{
+private:
+   typedef regex_iterator_implementation<BidirectionalIterator, charT, traits> impl;
+   typedef shared_ptr<impl> pimpl;
+public:
+   typedef          basic_regex<charT, traits>                   regex_type;
+   typedef          match_results<BidirectionalIterator>                    value_type;
+   typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type 
+                                                                            difference_type;
+   typedef          const value_type*                                       pointer;
+   typedef          const value_type&                                       reference; 
+   typedef          std::forward_iterator_tag                               iterator_category;
+   
+   regex_iterator(){}
+   regex_iterator(BidirectionalIterator a, BidirectionalIterator b, 
+                  const regex_type& re, 
+                  match_flag_type m = match_default)
+                  : pdata(new impl(&re, b, m))
+   {
+      if(!pdata->init(a))
+      {
+         pdata.reset();
+      }
+   }
+   regex_iterator(const regex_iterator& that)
+      : pdata(that.pdata) {}
+   regex_iterator& operator=(const regex_iterator& that)
+   {
+      pdata = that.pdata;
+      return *this;
+   }
+   bool operator==(const regex_iterator& that)const
+   { 
+      if((pdata.get() == 0) || (that.pdata.get() == 0))
+         return pdata.get() == that.pdata.get();
+      return pdata->compare(*(that.pdata.get())); 
+   }
+   bool operator!=(const regex_iterator& that)const
+   { return !(*this == that); }
+   const value_type& operator*()const
+   { return pdata->get(); }
+   const value_type* operator->()const
+   { return &(pdata->get()); }
+   regex_iterator& operator++()
+   {
+      cow();
+      if(0 == pdata->next())
+      {
+         pdata.reset();
+      }
+      return *this;
+   }
+   regex_iterator operator++(int)
+   {
+      regex_iterator result(*this);
+      ++(*this);
+      return result;
+   }
+private:
+
+   pimpl pdata;
+
+   void cow()
+   {
+      // copy-on-write
+      if(pdata.get() && !pdata.unique())
+      {
+         pdata.reset(new impl(*(pdata.get())));
+      }
+   }
+};
+
+typedef regex_iterator<const char*> cregex_iterator;
+typedef regex_iterator<std::string::const_iterator> sregex_iterator;
+#ifndef BOOST_NO_WREGEX
+typedef regex_iterator<const wchar_t*> wcregex_iterator;
+typedef regex_iterator<std::wstring::const_iterator> wsregex_iterator;
+#endif
+
+// make_regex_iterator:
+template <class charT, class traits>
+inline regex_iterator<const charT*, charT, traits> make_regex_iterator(const charT* p, const basic_regex<charT, traits>& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, m);
+}
+template <class charT, class traits, class ST, class SA>
+inline regex_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, m);
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif // BOOST_REGEX_V4_REGEX_ITERATOR_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_match.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,382 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_match.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Regular expression matching algorithms.
+  *                Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+
+#ifndef BOOST_REGEX_MATCH_HPP
+#define BOOST_REGEX_MATCH_HPP
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+//
+// proc regex_match
+// returns true if the specified regular expression matches
+// the whole of the input.  Fills in what matched in m.
+//
+template <class BidiIterator, class Allocator, class charT, class traits>
+bool regex_match(BidiIterator first, BidiIterator last, 
+                 match_results<BidiIterator, Allocator>& m, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   re_detail::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, first);
+   return matcher.match();
+}
+template <class iterator, class charT, class traits>
+bool regex_match(iterator first, iterator last, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   match_results<iterator> m;
+   return regex_match(first, last, m, e, flags | regex_constants::match_any);
+}
+//
+// query_match convenience interfaces:
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+//
+// this isn't really a partial specialisation, but template function
+// overloading - if the compiler doesn't support partial specialisation
+// then it really won't support this either:
+template <class charT, class Allocator, class traits>
+inline bool regex_match(const charT* str, 
+                        match_results<const charT*, Allocator>& m, 
+                        const basic_regex<charT, traits>& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + traits::length(str), m, e, flags);
+}
+
+template <class ST, class SA, class Allocator, class charT, class traits>
+inline bool regex_match(const std::basic_string<charT, ST, SA>& s, 
+                 match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+template <class charT, class traits>
+inline bool regex_match(const charT* str, 
+                        const basic_regex<charT, traits>& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const charT*> m;
+   return regex_match(str, str + traits::length(str), m, e, flags | regex_constants::match_any);
+}
+
+template <class ST, class SA, class charT, class traits>
+inline bool regex_match(const std::basic_string<charT, ST, SA>& s, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   typedef typename std::basic_string<charT, ST, SA>::const_iterator iterator;
+   match_results<iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#else  // partial ordering
+inline bool regex_match(const char* str, 
+                        cmatch& m, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const char* str, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#ifndef BOOST_NO_STD_LOCALE
+inline bool regex_match(const char* str, 
+                        cmatch& m, 
+                        const basic_regex<char, cpp_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const char* str, 
+                        const basic_regex<char, cpp_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_match(const char* str, 
+                        cmatch& m, 
+                        const basic_regex<char, c_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const char* str, 
+                        const basic_regex<char, c_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
+inline bool regex_match(const char* str, 
+                        cmatch& m, 
+                        const basic_regex<char, w32_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const char* str, 
+                        const basic_regex<char, w32_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const char*> m;
+   return regex_match(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#endif
+#ifndef BOOST_NO_WREGEX
+inline bool regex_match(const wchar_t* str, 
+                        wcmatch& m, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const wchar_t* str, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#ifndef BOOST_NO_STD_LOCALE
+inline bool regex_match(const wchar_t* str, 
+                        wcmatch& m, 
+                        const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const wchar_t* str, 
+                        const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_match(const wchar_t* str, 
+                        wcmatch& m, 
+                        const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const wchar_t* str, 
+                        const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
+inline bool regex_match(const wchar_t* str, 
+                        wcmatch& m, 
+                        const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_match(const wchar_t* str, 
+                        const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<const wchar_t*> m;
+   return regex_match(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#endif
+#endif
+inline bool regex_match(const std::string& s, 
+                        smatch& m,
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::string& s, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#ifndef BOOST_NO_STD_LOCALE
+inline bool regex_match(const std::string& s, 
+                        smatch& m,
+                        const basic_regex<char, cpp_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::string& s, 
+                        const basic_regex<char, cpp_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_match(const std::string& s, 
+                        smatch& m,
+                        const basic_regex<char, c_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::string& s, 
+                        const basic_regex<char, c_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
+inline bool regex_match(const std::string& s, 
+                        smatch& m,
+                        const basic_regex<char, w32_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::string& s, 
+                        const basic_regex<char, w32_regex_traits<char> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::string::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#endif
+#if !defined(BOOST_NO_WREGEX)
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        match_results<std::basic_string<wchar_t>::const_iterator>& m,
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::basic_string<wchar_t>::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#ifndef BOOST_NO_STD_LOCALE
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        match_results<std::basic_string<wchar_t>::const_iterator>& m,
+                        const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        const basic_regex<wchar_t, cpp_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::basic_string<wchar_t>::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        match_results<std::basic_string<wchar_t>::const_iterator>& m,
+                        const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        const basic_regex<wchar_t, c_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::basic_string<wchar_t>::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        match_results<std::basic_string<wchar_t>::const_iterator>& m,
+                        const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_match(s.begin(), s.end(), m, e, flags);
+}
+inline bool regex_match(const std::basic_string<wchar_t>& s, 
+                        const basic_regex<wchar_t, w32_regex_traits<wchar_t> >& e, 
+                        match_flag_type flags = match_default)
+{
+   match_results<std::basic_string<wchar_t>::const_iterator> m;
+   return regex_match(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#endif
+#endif
+
+#endif
+
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif   // BOOST_REGEX_MATCH_HPP
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_merge.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,93 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_format.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides formatting output routines for search and replace
+  *                operations.  Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_MERGE_HPP
+#define BOOST_REGEX_V4_REGEX_MERGE_HPP
+
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class OutputIterator, class Iterator, class traits, class charT>
+inline OutputIterator regex_merge(OutputIterator out,
+                         Iterator first,
+                         Iterator last,
+                         const basic_regex<charT, traits>& e, 
+                         const charT* fmt, 
+                         match_flag_type flags = match_default)
+{
+   return regex_replace(out, first, last, e, fmt, flags);
+}
+
+template <class OutputIterator, class Iterator, class traits, class charT>
+inline OutputIterator regex_merge(OutputIterator out,
+                         Iterator first,
+                         Iterator last,
+                         const basic_regex<charT, traits>& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   return regex_merge(out, first, last, e, fmt.c_str(), flags);
+}
+
+template <class traits, class charT>
+inline std::basic_string<charT> regex_merge(const std::basic_string<charT>& s,
+                         const basic_regex<charT, traits>& e, 
+                         const charT* fmt,
+                         match_flag_type flags = match_default)
+{
+   return regex_replace(s, e, fmt, flags);
+}
+
+template <class traits, class charT>
+inline std::basic_string<charT> regex_merge(const std::basic_string<charT>& s,
+                         const basic_regex<charT, traits>& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   return regex_replace(s, e, fmt, flags);
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_V4_REGEX_MERGE_HPP
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_raw_buffer.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,210 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_raw_buffer.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Raw character buffer for regex code.
+  *                Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+#ifndef BOOST_REGEX_RAW_BUFFER_HPP
+#define BOOST_REGEX_RAW_BUFFER_HPP
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+
+#include <algorithm>
+#include <cstddef>
+
+namespace boost{
+   namespace re_detail{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+struct empty_padding{};
+
+union padding
+{
+   void* p;
+   unsigned int i;
+};
+
+template <int N>
+struct padding3
+{
+   enum{
+      padding_size = 8,
+      padding_mask = 7
+   };
+};
+
+template<>
+struct padding3<2>
+{
+   enum{
+      padding_size = 2,
+      padding_mask = 1
+   };
+};
+
+template<>
+struct padding3<4>
+{
+   enum{
+      padding_size = 4,
+      padding_mask = 3
+   };
+};
+
+template<>
+struct padding3<8>
+{
+   enum{
+      padding_size = 8,
+      padding_mask = 7
+   };
+};
+
+template<>
+struct padding3<16>
+{
+   enum{
+      padding_size = 16,
+      padding_mask = 15
+   };
+};
+
+enum{
+   padding_size = padding3<sizeof(padding)>::padding_size,
+   padding_mask = padding3<sizeof(padding)>::padding_mask
+};
+
+//
+// class raw_storage
+// basically this is a simplified vector<unsigned char>
+// this is used by basic_regex for expression storage
+//
+
+class BOOST_REGEX_DECL raw_storage
+{
+public:
+   typedef std::size_t           size_type;
+   typedef unsigned char*        pointer;
+private:
+   pointer last, start, end;
+public:
+
+   raw_storage();
+   raw_storage(size_type n);
+
+   ~raw_storage()
+   {
+      ::operator delete(start);
+   }
+
+   void BOOST_REGEX_CALL resize(size_type n);
+   
+   void* BOOST_REGEX_CALL extend(size_type n)
+   {
+      if(size_type(last - end) < n)
+         resize(n + (end - start));
+      register pointer result = end;
+      end += n;
+      return result;
+   }
+
+   void* BOOST_REGEX_CALL insert(size_type pos, size_type n);
+
+   size_type BOOST_REGEX_CALL size()
+   {
+      return end - start;
+   }
+
+   size_type BOOST_REGEX_CALL capacity()
+   {
+      return last - start;
+   }
+
+   void* BOOST_REGEX_CALL data()const
+   {
+      return start;
+   }
+
+   size_type BOOST_REGEX_CALL index(void* ptr)
+   {
+      return static_cast<pointer>(ptr) - static_cast<pointer>(data());
+   }
+
+   void BOOST_REGEX_CALL clear()
+   {
+      end = start;
+   }
+
+   void BOOST_REGEX_CALL align()
+   {
+      // move end up to a boundary:
+      end = start + (((end - start) + padding_mask) & ~padding_mask);
+   }
+   void swap(raw_storage& that)
+   {
+      std::swap(start, that.start);
+      std::swap(end, that.end);
+      std::swap(last, that.last);
+  }
+};
+
+inline raw_storage::raw_storage()
+{
+   last = start = end = 0;
+}
+
+inline raw_storage::raw_storage(size_type n)
+{
+   start = end = static_cast<pointer>(::operator new(n));
+   BOOST_REGEX_NOEH_ASSERT(start)
+   last = start + n;
+}
+
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace re_detail
+} // namespace boost
+
+#endif
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_replace.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,122 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_format.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides formatting output routines for search and replace
+  *                operations.  Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_REPLACE_HPP
+#define BOOST_REGEX_V4_REGEX_REPLACE_HPP
+
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class OutputIterator, class BidirectionalIterator, class traits, class charT>
+OutputIterator regex_replace(OutputIterator out,
+                         BidirectionalIterator first,
+                         BidirectionalIterator last,
+                         const basic_regex<charT, traits>& e, 
+                         const charT* fmt, 
+                         match_flag_type flags = match_default)
+{
+   regex_iterator<BidirectionalIterator, charT, traits> i(first, last, e, flags);
+   regex_iterator<BidirectionalIterator, charT, traits> j;
+   if(i == j)
+   {
+      if(!(flags & regex_constants::format_no_copy))
+         out = re_detail::copy(first, last, out);
+   }
+   else
+   {
+      BidirectionalIterator last_m(first);
+      while(i != j)
+      {
+         if(!(flags & regex_constants::format_no_copy))
+            out = re_detail::copy(i->prefix().first, i->prefix().second, out); 
+         out = i->format(out, fmt, flags, e);
+         last_m = (*i)[0].second;
+         if(flags & regex_constants::format_first_only)
+            break;
+         ++i;
+      }
+      if(!(flags & regex_constants::format_no_copy))
+         out = re_detail::copy(last_m, last, out);
+   }
+   return out;
+}
+
+template <class OutputIterator, class Iterator, class traits, class charT>
+inline OutputIterator regex_replace(OutputIterator out,
+                         Iterator first,
+                         Iterator last,
+                         const basic_regex<charT, traits>& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   return regex_replace(out, first, last, e, fmt.c_str(), flags);
+}
+
+template <class traits, class charT>
+std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,
+                         const basic_regex<charT, traits>& e, 
+                         const charT* fmt,
+                         match_flag_type flags = match_default)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   regex_replace(i, s.begin(), s.end(), e, fmt, flags);
+   return result;
+}
+
+template <class traits, class charT>
+std::basic_string<charT> regex_replace(const std::basic_string<charT>& s,
+                         const basic_regex<charT, traits>& e, 
+                         const std::basic_string<charT>& fmt,
+                         match_flag_type flags = match_default)
+{
+   std::basic_string<charT> result;
+   re_detail::string_out_iterator<std::basic_string<charT> > i(result);
+   regex_replace(i, s.begin(), s.end(), e, fmt.c_str(), flags);
+   return result;
+}
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_V4_REGEX_REPLACE_HPP
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_search.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,217 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_search.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides regex_search implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_SEARCH_HPP
+#define BOOST_REGEX_V4_REGEX_SEARCH_HPP
+
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+template <class BidiIterator, class Allocator, class charT, class traits>
+bool regex_search(BidiIterator first, BidiIterator last, 
+                  match_results<BidiIterator, Allocator>& m, 
+                  const basic_regex<charT, traits>& e, 
+                  match_flag_type flags = match_default)
+{
+   return regex_search(first, last, m, e, flags, first);
+}
+
+template <class BidiIterator, class Allocator, class charT, class traits>
+bool regex_search(BidiIterator first, BidiIterator last, 
+                  match_results<BidiIterator, Allocator>& m, 
+                  const basic_regex<charT, traits>& e, 
+                  match_flag_type flags,
+                  BidiIterator base)
+{
+   if(e.flags() & regex_constants::failbit)
+      return false;
+
+   re_detail::perl_matcher<BidiIterator, Allocator, traits> matcher(first, last, m, e, flags, base);
+   return matcher.find();
+}
+
+//
+// regex_search convenience interfaces:
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+//
+// this isn't really a partial specialisation, but template function
+// overloading - if the compiler doesn't support partial specialisation
+// then it really won't support this either:
+template <class charT, class Allocator, class traits>
+inline bool regex_search(const charT* str, 
+                        match_results<const charT*, Allocator>& m, 
+                        const basic_regex<charT, traits>& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(str, str + traits::length(str), m, e, flags);
+}
+
+template <class ST, class SA, class Allocator, class charT, class traits>
+inline bool regex_search(const std::basic_string<charT, ST, SA>& s, 
+                 match_results<typename std::basic_string<charT, ST, SA>::const_iterator, Allocator>& m, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   return regex_search(s.begin(), s.end(), m, e, flags);
+}
+#else  // partial overloads:
+inline bool regex_search(const char* str, 
+                        cmatch& m, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(str, str + regex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_search(const char* first, const char* last, 
+                  const regex& e, 
+                  match_flag_type flags = match_default)
+{
+   cmatch m;
+   return regex_search(first, last, m, e, flags | regex_constants::match_any);
+}
+
+#ifndef BOOST_NO_WREGEX
+inline bool regex_search(const wchar_t* str, 
+                        wcmatch& m, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(str, str + wregex::traits_type::length(str), m, e, flags);
+}
+inline bool regex_search(const wchar_t* first, const wchar_t* last, 
+                  const wregex& e, 
+                  match_flag_type flags = match_default)
+{
+   wcmatch m;
+   return regex_search(first, last, m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_search(const std::string& s, 
+                        smatch& m,
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(s.begin(), s.end(), m, e, flags);
+}
+#if !defined(BOOST_NO_WREGEX)
+inline bool regex_search(const std::basic_string<wchar_t>& s, 
+                        wsmatch& m,
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(s.begin(), s.end(), m, e, flags);
+}
+#endif
+
+#endif
+
+template <class BidiIterator, class charT, class traits>
+bool regex_search(BidiIterator first, BidiIterator last, 
+                  const basic_regex<charT, traits>& e, 
+                  match_flag_type flags = match_default)
+{
+   if(e.flags() & regex_constants::failbit)
+      return false;
+
+   match_results<BidiIterator> m;
+   typedef typename match_results<BidiIterator>::allocator_type match_alloc_type;
+   re_detail::perl_matcher<BidiIterator, match_alloc_type, traits> matcher(first, last, m, e, flags | regex_constants::match_any, first);
+   return matcher.find();
+}
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+
+template <class charT, class traits>
+inline bool regex_search(const charT* str, 
+                        const basic_regex<charT, traits>& e, 
+                        match_flag_type flags = match_default)
+{
+   return regex_search(str, str + traits::length(str), e, flags);
+}
+
+template <class ST, class SA, class charT, class traits>
+inline bool regex_search(const std::basic_string<charT, ST, SA>& s, 
+                 const basic_regex<charT, traits>& e, 
+                 match_flag_type flags = match_default)
+{
+   return regex_search(s.begin(), s.end(), e, flags);
+}
+#else  // non-template function overloads
+inline bool regex_search(const char* str, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   cmatch m;
+   return regex_search(str, str + regex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#ifndef BOOST_NO_WREGEX
+inline bool regex_search(const wchar_t* str, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   wcmatch m;
+   return regex_search(str, str + wregex::traits_type::length(str), m, e, flags | regex_constants::match_any);
+}
+#endif
+inline bool regex_search(const std::string& s, 
+                        const regex& e, 
+                        match_flag_type flags = match_default)
+{
+   smatch m;
+   return regex_search(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+#if !defined(BOOST_NO_WREGEX)
+inline bool regex_search(const std::basic_string<wchar_t>& s, 
+                        const wregex& e, 
+                        match_flag_type flags = match_default)
+{
+   wsmatch m;
+   return regex_search(s.begin(), s.end(), m, e, flags | regex_constants::match_any);
+}
+
+#endif // BOOST_NO_WREGEX
+
+#endif // partial overload
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif  // BOOST_REGEX_V4_REGEX_SEARCH_HPP
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_split.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,172 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_split.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Implements regex_split and associated functions.
+  *                Note this is an internal header file included
+  *                by regex.hpp, do not include on its own.
+  */
+
+#ifndef BOOST_REGEX_SPLIT_HPP
+#define BOOST_REGEX_SPLIT_HPP
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#  pragma warning(push)
+#  pragma warning(disable: 4800)
+#endif
+
+namespace re_detail{
+
+template <class charT>
+const basic_regex<charT>& get_default_expression(charT)
+{
+   static const charT expression_text[4] = { '\\', 's', '+', '\00', };
+   static const basic_regex<charT> e(expression_text);
+   return e;
+}
+
+template <class OutputIterator, class charT, class Traits1, class Alloc1>
+class split_pred
+{
+   typedef std::basic_string<charT, Traits1, Alloc1> string_type;
+   typedef typename string_type::const_iterator iterator_type;
+   iterator_type* p_last;
+   OutputIterator* p_out;
+   std::size_t* p_max;
+   std::size_t initial_max;
+public:
+   split_pred(iterator_type* a, OutputIterator* b, std::size_t* c)
+      : p_last(a), p_out(b), p_max(c), initial_max(*c) {}
+
+   bool operator()(const match_results<iterator_type>& what);
+};
+
+template <class OutputIterator, class charT, class Traits1, class Alloc1>
+bool split_pred<OutputIterator, charT, Traits1, Alloc1>::operator()
+   (const match_results<iterator_type>& what)
+{
+   *p_last = what[0].second;
+   if(what.size() > 1)
+   {
+      // output sub-expressions only:
+      for(unsigned i = 1; i < what.size(); ++i)
+      {
+         *(*p_out) = what.str(i);
+         ++(*p_out);
+         if(0 == --*p_max) return false;
+      }
+      return *p_max != 0;
+   }
+   else
+   {
+      // output $` only if it's not-null or not at the start of the input:
+      const sub_match<iterator_type>& sub = what[-1];
+      if((sub.first != sub.second) || (*p_max != initial_max))
+      {
+         *(*p_out) = sub.str();
+         ++(*p_out);
+         return --*p_max;
+      }
+   }
+   //
+   // initial null, do nothing:
+   return true;
+}
+
+} // namespace re_detail
+
+template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
+std::size_t regex_split(OutputIterator out,
+                   std::basic_string<charT, Traits1, Alloc1>& s, 
+                   const basic_regex<charT, Traits2>& e,
+                   match_flag_type flags,
+                   std::size_t max_split)
+{
+   typedef typename std::basic_string<charT, Traits1, Alloc1>::const_iterator  ci_t;
+   typedef typename match_results<ci_t>::allocator_type                        match_allocator;
+   ci_t last = s.begin();
+   std::size_t init_size = max_split;
+   re_detail::split_pred<OutputIterator, charT, Traits1, Alloc1> pred(&last, &out, &max_split);
+   ci_t i, j;
+   i = s.begin();
+   j = s.end();
+   regex_grep(pred, i, j, e, flags);
+   //
+   // if there is still input left, do a final push as long as max_split
+   // is not exhausted, and we're not splitting sub-expressions rather 
+   // than whitespace:
+   if(max_split && (last != s.end()) && (e.mark_count() == 1))
+   {
+      *out = std::basic_string<charT, Traits1, Alloc1>((ci_t)last, (ci_t)s.end());
+      ++out;
+      last = s.end();
+      --max_split;
+   }
+   //
+   // delete from the string everything that has been processed so far:
+   s.erase(0, last - s.begin());
+   //
+   // return the number of new records pushed:
+   return init_size - max_split;
+}
+
+template <class OutputIterator, class charT, class Traits1, class Alloc1, class Traits2>
+inline std::size_t regex_split(OutputIterator out,
+                   std::basic_string<charT, Traits1, Alloc1>& s, 
+                   const basic_regex<charT, Traits2>& e,
+                   match_flag_type flags = match_default)
+{
+   return regex_split(out, s, e, flags, UINT_MAX);
+}
+
+template <class OutputIterator, class charT, class Traits1, class Alloc1>
+inline std::size_t regex_split(OutputIterator out,
+                   std::basic_string<charT, Traits1, Alloc1>& s)
+{
+   return regex_split(out, s, re_detail::get_default_expression(charT(0)), match_default, UINT_MAX);
+}
+
+#ifdef BOOST_MSVC
+#  pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_token_iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,342 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_token_iterator.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides regex_token_iterator implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
+#define BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
+
+#include <boost/shared_ptr.hpp>
+#include <boost/detail/workaround.hpp>
+#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
+//
+// Borland C++ Builder 6, and Visual C++ 6,
+// can't cope with the array template constructor
+// so we have a template member that will accept any type as 
+// argument, and then assert that is really is an array:
+//
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_array.hpp>
+#endif
+
+namespace boost{
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, > 1300)
+#  pragma warning(push)
+#  pragma warning(disable:4700)
+#endif
+
+template <class BidirectionalIterator,
+          class charT,
+          class traits>
+class regex_token_iterator_implementation 
+{
+   typedef basic_regex<charT, traits> regex_type;
+   typedef sub_match<BidirectionalIterator>      value_type;
+
+   match_results<BidirectionalIterator> what;   // current match
+   BidirectionalIterator                base;    // start of search area
+   BidirectionalIterator                end;    // end of search area
+   const regex_type                     re;    // the expression
+   match_flag_type                      flags;  // match flags
+   value_type                           result; // the current string result
+   int                                  N;      // the current sub-expression being enumerated
+   std::vector<int>                     subs;   // the sub-expressions to enumerate
+
+public:
+   regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, int sub, match_flag_type f)
+      : end(last), re(*p), flags(f){ subs.push_back(sub); }
+   regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const std::vector<int>& v, match_flag_type f)
+      : end(last), re(*p), flags(f), subs(v){}
+#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
+#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
+      || BOOST_WORKAROUND(__HP_aCC, < 60700)
+   template <class T>
+   regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const T& submatches, match_flag_type f)
+      : end(last), re(*p), flags(f)
+   {
+      // assert that T really is an array:
+      BOOST_STATIC_ASSERT(::boost::is_array<T>::value);
+      const std::size_t array_size = sizeof(T) / sizeof(submatches[0]);
+      for(std::size_t i = 0; i < array_size; ++i)
+      {
+         subs.push_back(submatches[i]);
+      }
+   }
+#else
+   template <std::size_t CN>
+   regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const int (&submatches)[CN], match_flag_type f)
+      : end(last), re(*p), flags(f)
+   {
+      for(std::size_t i = 0; i < CN; ++i)
+      {
+         subs.push_back(submatches[i]);
+      }
+   }
+#endif
+#endif
+   bool init(BidirectionalIterator first)
+   {
+      N = 0;
+      base = first;
+      if(regex_search(first, end, what, re, flags, base) == true)
+      {
+         N = 0;
+         result = ((subs[N] == -1) ? what.prefix() : what[(int)subs[N]]);
+         return true;
+      }
+      else if((subs[N] == -1) && (first != end))
+      {
+         result.first = first;
+         result.second = end;
+         result.matched = (first != end);
+         N = -1;
+         return true;
+      }
+      return false;
+   }
+   bool compare(const regex_token_iterator_implementation& that)
+   {
+      if(this == &that) return true;
+      return (&re.get_data() == &that.re.get_data()) 
+         && (end == that.end) 
+         && (flags == that.flags) 
+         && (N == that.N) 
+         && (what[0].first == that.what[0].first) 
+         && (what[0].second == that.what[0].second);
+   }
+   const value_type& get()
+   { return result; }
+   bool next()
+   {
+      if(N == -1)
+         return false;
+      if(N+1 < (int)subs.size())
+      {
+         ++N;
+         result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
+         return true;
+      }
+      //if(what.prefix().first != what[0].second)
+      //   flags |= /*match_prev_avail |*/ regex_constants::match_not_bob;
+      BidirectionalIterator last_end(what[0].second);
+      if(regex_search(last_end, end, what, re, ((what[0].first == what[0].second) ? flags | regex_constants::match_not_initial_null : flags), base))
+      {
+         N =0;
+         result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
+         return true;
+      }
+      else if((last_end != end) && (subs[0] == -1))
+      {
+         N =-1;
+         result.first = last_end;
+         result.second = end;
+         result.matched = (last_end != end);
+         return true;
+      }
+      return false;
+   }
+private:
+   regex_token_iterator_implementation& operator=(const regex_token_iterator_implementation&);
+};
+
+template <class BidirectionalIterator, 
+          class charT = BOOST_DEDUCED_TYPENAME re_detail::regex_iterator_traits<BidirectionalIterator>::value_type,
+          class traits = regex_traits<charT> >
+class regex_token_iterator 
+#ifndef BOOST_NO_STD_ITERATOR
+   : public std::iterator<
+         std::forward_iterator_tag, 
+         sub_match<BidirectionalIterator>,
+         typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+         const sub_match<BidirectionalIterator>*,
+         const sub_match<BidirectionalIterator>& >         
+#endif
+{
+private:
+   typedef regex_token_iterator_implementation<BidirectionalIterator, charT, traits> impl;
+   typedef shared_ptr<impl> pimpl;
+public:
+   typedef          basic_regex<charT, traits>                   regex_type;
+   typedef          sub_match<BidirectionalIterator>                        value_type;
+   typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type 
+                                                                            difference_type;
+   typedef          const value_type*                                       pointer;
+   typedef          const value_type&                                       reference; 
+   typedef          std::forward_iterator_tag                               iterator_category;
+   
+   regex_token_iterator(){}
+   regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, 
+                        int submatch = 0, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatch, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+   regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, 
+                        const std::vector<int>& submatches, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#if !BOOST_WORKAROUND(__HP_aCC, < 60700)
+#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
+      || BOOST_WORKAROUND(__HP_aCC, < 60700)
+   template <class T>
+   regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
+                        const T& submatches, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#else
+   template <std::size_t N>
+   regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
+                        const int (&submatches)[N], match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#endif
+#endif
+   regex_token_iterator(const regex_token_iterator& that)
+      : pdata(that.pdata) {}
+   regex_token_iterator& operator=(const regex_token_iterator& that)
+   {
+      pdata = that.pdata;
+      return *this;
+   }
+   bool operator==(const regex_token_iterator& that)const
+   { 
+      if((pdata.get() == 0) || (that.pdata.get() == 0))
+         return pdata.get() == that.pdata.get();
+      return pdata->compare(*(that.pdata.get())); 
+   }
+   bool operator!=(const regex_token_iterator& that)const
+   { return !(*this == that); }
+   const value_type& operator*()const
+   { return pdata->get(); }
+   const value_type* operator->()const
+   { return &(pdata->get()); }
+   regex_token_iterator& operator++()
+   {
+      cow();
+      if(0 == pdata->next())
+      {
+         pdata.reset();
+      }
+      return *this;
+   }
+   regex_token_iterator operator++(int)
+   {
+      regex_token_iterator result(*this);
+      ++(*this);
+      return result;
+   }
+private:
+
+   pimpl pdata;
+
+   void cow()
+   {
+      // copy-on-write
+      if(pdata.get() && !pdata.unique())
+      {
+         pdata.reset(new impl(*(pdata.get())));
+      }
+   }
+};
+
+typedef regex_token_iterator<const char*> cregex_token_iterator;
+typedef regex_token_iterator<std::string::const_iterator> sregex_token_iterator;
+#ifndef BOOST_NO_WREGEX
+typedef regex_token_iterator<const wchar_t*> wcregex_token_iterator;
+typedef regex_token_iterator<std::wstring::const_iterator> wsregex_token_iterator;
+#endif
+
+template <class charT, class traits>
+inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
+}
+template <class charT, class traits, class ST, class SA>
+inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
+}
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+template <class charT, class traits, std::size_t N>
+inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
+}
+template <class charT, class traits, class ST, class SA, std::size_t N>
+inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
+}
+#endif
+template <class charT, class traits>
+inline regex_token_iterator<const charT*, charT, traits> make_regex_token_iterator(const charT* p, const basic_regex<charT, traits>& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<const charT*, charT, traits>(p, p+traits::length(p), e, submatch, m);
+}
+template <class charT, class traits, class ST, class SA>
+inline regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits> make_regex_token_iterator(const std::basic_string<charT, ST, SA>& p, const basic_regex<charT, traits>& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return regex_token_iterator<typename std::basic_string<charT, ST, SA>::const_iterator, charT, traits>(p.begin(), p.end(), e, submatch, m);
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, > 1300)
+#  pragma warning(pop)
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+} // namespace boost
+
+#endif // BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,189 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_traits.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression traits classes.
+  */
+
+#ifndef BOOST_REGEX_TRAITS_HPP_INCLUDED
+#define BOOST_REGEX_TRAITS_HPP_INCLUDED
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+#ifndef BOOST_REGEX_WORKAROUND_HPP
+#include <boost/regex/v4/regex_workaround.hpp>
+#endif
+#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
+#include <boost/regex/v4/syntax_type.hpp>
+#endif
+#ifndef BOOST_REGEX_ERROR_TYPE_HPP
+#include <boost/regex/v4/error_type.hpp>
+#endif
+#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
+#include <boost/regex/v4/regex_traits_defaults.hpp>
+#endif
+#ifndef BOOST_NO_STD_LOCALE
+#  ifndef BOOST_CPP_REGEX_TRAITS_HPP_INCLUDED
+#     include <boost/regex/v4/cpp_regex_traits.hpp>
+#  endif
+#endif
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x560)
+#  ifndef BOOST_C_REGEX_TRAITS_HPP_INCLUDED
+#     include <boost/regex/v4/c_regex_traits.hpp>
+#  endif
+#endif
+#if defined(_WIN32) && !defined(BOOST_REGEX_NO_W32)
+#  ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
+#     include <boost/regex/v4/w32_regex_traits.hpp>
+#  endif
+#endif
+#ifndef BOOST_REGEX_FWD_HPP_INCLUDED
+#include <boost/regex_fwd.hpp>
+#endif
+
+#include "boost/mpl/has_xxx.hpp"
+#include <boost/static_assert.hpp>
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+
+template <class charT, class implementationT >
+struct regex_traits : public implementationT
+{
+   regex_traits() : implementationT() {}
+};
+
+//
+// class regex_traits_wrapper.
+// this is what our implementation will actually store;
+// it provides default implementations of the "optional"
+// interfaces that we support, in addition to the
+// required "standard" ones:
+//
+namespace re_detail{
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, < 60000)
+BOOST_MPL_HAS_XXX_TRAIT_DEF(boost_extensions_tag)
+#else
+template<class T>
+struct has_boost_extensions_tag
+{
+   BOOST_STATIC_CONSTANT(bool, value = false);
+};
+#endif
+
+template <class BaseT>
+struct default_wrapper : public BaseT
+{
+   typedef typename BaseT::char_type char_type;
+   std::string error_string(::boost::regex_constants::error_type e)const
+   {
+      return ::boost::re_detail::get_default_error_string(e);
+   }
+   ::boost::regex_constants::syntax_type syntax_type(char_type c)const
+   {
+      return ((c & 0x7f) == c) ? get_default_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::syntax_char;
+   }
+   ::boost::regex_constants::escape_syntax_type escape_syntax_type(char_type c)const
+   {
+      return ((c & 0x7f) == c) ? get_default_escape_syntax_type(static_cast<char>(c)) : ::boost::regex_constants::escape_type_identity;
+   }
+   int toi(const char_type*& p1, const char_type* p2, int radix)const
+   {
+      return ::boost::re_detail::global_toi(p1, p2, radix, *this);
+   }
+   char_type translate(char_type c, bool icase)const
+   {
+      return (icase ? this->translate_nocase(c) : this->translate(c));
+   }
+   char_type translate(char_type c)const
+   {
+      return BaseT::translate(c);
+   }
+   char_type tolower(char_type c)const
+   {
+      return ::boost::re_detail::global_lower(c);
+   }
+   char_type toupper(char_type c)const
+   {
+      return ::boost::re_detail::global_upper(c);
+   }
+};
+
+template <class BaseT, bool has_extensions>
+struct compute_wrapper_base
+{
+   typedef BaseT type;
+};
+#if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) && !BOOST_WORKAROUND(__HP_aCC, < 60000)
+template <class BaseT>
+struct compute_wrapper_base<BaseT, false>
+{
+   typedef default_wrapper<BaseT> type;
+};
+#else
+template <>
+struct compute_wrapper_base<c_regex_traits<char>, false>
+{
+   typedef default_wrapper<c_regex_traits<char> > type;
+};
+#ifndef BOOST_NO_WREGEX
+template <>
+struct compute_wrapper_base<c_regex_traits<wchar_t>, false>
+{
+   typedef default_wrapper<c_regex_traits<wchar_t> > type;
+};
+#endif
+#endif
+
+} // namespace re_detail
+
+template <class BaseT>
+struct regex_traits_wrapper 
+   : public ::boost::re_detail::compute_wrapper_base<
+               BaseT, 
+               ::boost::re_detail::has_boost_extensions_tag<BaseT>::value
+            >::type
+{
+   regex_traits_wrapper(){}
+private:
+   regex_traits_wrapper(const regex_traits_wrapper&);
+   regex_traits_wrapper& operator=(const regex_traits_wrapper&);
+};
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif // include
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_traits_defaults.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,331 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_traits_defaults.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares API's for access to regex_traits default properties.
+  */
+
+#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
+#define BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
+#include <boost/regex/v4/syntax_type.hpp>
+#endif
+#ifndef BOOST_REGEX_ERROR_TYPE_HPP
+#include <boost/regex/v4/error_type.hpp>
+#endif
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+namespace std{
+   using ::strlen;
+}
+#endif
+
+namespace boost{ namespace re_detail{
+
+
+//
+// helpers to suppress warnings:
+//
+template <class charT>
+inline bool is_extended(charT c)
+{ return c > 256; }
+inline bool is_extended(char)
+{ return false; }
+
+
+BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_syntax(regex_constants::syntax_type n);
+BOOST_REGEX_DECL const char* BOOST_REGEX_CALL get_default_error_string(regex_constants::error_type n);
+BOOST_REGEX_DECL regex_constants::syntax_type BOOST_REGEX_CALL get_default_syntax_type(char c);
+BOOST_REGEX_DECL regex_constants::escape_syntax_type BOOST_REGEX_CALL get_default_escape_syntax_type(char c);
+
+// is charT c a combining character?
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL is_combining_implementation(uint_least16_t s);
+
+template <class charT>
+inline bool is_combining(charT c)
+{
+   return (c <= static_cast<charT>(0)) ? false : ((c >= static_cast<charT>((std::numeric_limits<uint_least16_t>::max)())) ? false : is_combining_implementation(static_cast<unsigned short>(c)));
+}
+template <>
+inline bool is_combining<char>(char)
+{
+   return false;
+}
+template <>
+inline bool is_combining<signed char>(signed char)
+{
+   return false;
+}
+template <>
+inline bool is_combining<unsigned char>(unsigned char)
+{
+   return false;
+}
+#ifndef __hpux // can't use WCHAR_MAX/MIN in pp-directives
+#ifdef _MSC_VER 
+template<>
+inline bool is_combining<wchar_t>(wchar_t c)
+{
+   return is_combining_implementation(static_cast<unsigned short>(c));
+}
+#elif !defined(__DECCXX) && !defined(__osf__) && !defined(__OSF__) && defined(WCHAR_MIN) && (WCHAR_MIN == 0) && !defined(BOOST_NO_INTRINSIC_WCHAR_T)
+#if defined(WCHAR_MAX) && (WCHAR_MAX <= USHRT_MAX)
+template<>
+inline bool is_combining<wchar_t>(wchar_t c)
+{
+   return is_combining_implementation(static_cast<unsigned short>(c));
+}
+#else
+template<>
+inline bool is_combining<wchar_t>(wchar_t c)
+{
+   return (c >= (std::numeric_limits<uint_least16_t>::max)()) ? false : is_combining_implementation(static_cast<unsigned short>(c));
+}
+#endif
+#endif
+#endif
+
+//
+// is a charT c a line separator?
+//
+template <class charT>
+inline bool is_separator(charT c)
+{
+   return BOOST_REGEX_MAKE_BOOL(
+      (c == static_cast<charT>('\n')) 
+      || (c == static_cast<charT>('\r')) 
+      || (c == static_cast<charT>('\f')) 
+      || (static_cast<boost::uint16_t>(c) == 0x2028u) 
+      || (static_cast<boost::uint16_t>(c) == 0x2029u) 
+      || (static_cast<boost::uint16_t>(c) == 0x85u));
+}
+template <>
+inline bool is_separator<char>(char c)
+{
+   return BOOST_REGEX_MAKE_BOOL((c == '\n') || (c == '\r') || (c == '\f'));
+}
+
+//
+// get a default collating element:
+//
+BOOST_REGEX_DECL std::string BOOST_REGEX_CALL lookup_default_collate_name(const std::string& name);
+
+//
+// get the state_id of a character clasification, the individual
+// traits classes then transform that state_id into a bitmask:
+//
+template <class charT>
+struct character_pointer_range
+{
+   const charT* p1;
+   const charT* p2;
+
+   bool operator < (const character_pointer_range& r)const
+   {
+      return std::lexicographical_compare(p1, p2, r.p1, r.p2);
+   }
+   bool operator == (const character_pointer_range& r)const
+   {
+      // Not only do we check that the ranges are of equal size before
+      // calling std::equal, but there is no other algorithm available:
+      // not even a non-standard MS one.  So forward to unchecked_equal
+      // in the MS case.
+      return ((p2 - p1) == (r.p2 - r.p1)) && re_detail::equal(p1, p2, r.p1);
+   }
+};
+template <class charT>
+int get_default_class_id(const charT* p1, const charT* p2)
+{
+   static const charT data[72] = {
+      'a', 'l', 'n', 'u', 'm',
+      'a', 'l', 'p', 'h', 'a',
+      'b', 'l', 'a', 'n', 'k',
+      'c', 'n', 't', 'r', 'l',
+      'd', 'i', 'g', 'i', 't',
+      'g', 'r', 'a', 'p', 'h',
+      'l', 'o', 'w', 'e', 'r',
+      'p', 'r', 'i', 'n', 't',
+      'p', 'u', 'n', 'c', 't',
+      's', 'p', 'a', 'c', 'e',
+      'u', 'n', 'i', 'c', 'o', 'd', 'e',
+      'u', 'p', 'p', 'e', 'r',
+      'w', 'o', 'r', 'd',
+      'x', 'd', 'i', 'g', 'i', 't',
+   };
+
+   static const character_pointer_range<charT> ranges[19] = 
+   {
+      {data+0, data+5,}, // alnum
+      {data+5, data+10,}, // alpha
+      {data+10, data+15,}, // blank
+      {data+15, data+20,}, // cntrl
+      {data+20, data+21,}, // d
+      {data+20, data+25,}, // digit
+      {data+25, data+30,}, // graph
+      {data+30, data+31,}, // l
+      {data+30, data+35,}, // lower
+      {data+35, data+40,}, // print
+      {data+40, data+45,}, // punct
+      {data+45, data+46,}, // s
+      {data+45, data+50,}, // space
+      {data+57, data+58,}, // u
+      {data+50, data+57,}, // unicode
+      {data+57, data+62,}, // upper
+      {data+62, data+63,}, // w
+      {data+62, data+66,}, // word
+      {data+66, data+72,}, // xdigit
+   };
+   static const character_pointer_range<charT>* ranges_begin = ranges;
+   static const character_pointer_range<charT>* ranges_end = ranges + (sizeof(ranges)/sizeof(ranges[0]));
+   
+   character_pointer_range<charT> t = { p1, p2, };
+   const character_pointer_range<charT>* p = std::lower_bound(ranges_begin, ranges_end, t);
+   if((p != ranges_end) && (t == *p))
+      return static_cast<int>(p - ranges);
+   return -1;
+}
+
+//
+// helper functions:
+//
+template <class charT>
+std::ptrdiff_t global_length(const charT* p)
+{
+   std::ptrdiff_t n = 0;
+   while(*p)
+   {
+      ++p;
+      ++n;
+   }
+   return n;
+}
+template<>
+inline std::ptrdiff_t global_length<char>(const char* p)
+{
+   return (std::strlen)(p);
+}
+#ifndef BOOST_NO_WREGEX
+template<>
+inline std::ptrdiff_t global_length<wchar_t>(const wchar_t* p)
+{
+   return (std::wcslen)(p);
+}
+#endif
+template <class charT>
+inline charT BOOST_REGEX_CALL global_lower(charT c)
+{
+   return c;
+}
+template <class charT>
+inline charT BOOST_REGEX_CALL global_upper(charT c)
+{
+   return c;
+}
+
+BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_lower(char c);
+BOOST_REGEX_DECL char BOOST_REGEX_CALL do_global_upper(char c);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_lower(wchar_t c);
+BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL do_global_upper(wchar_t c);
+#endif
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_lower(unsigned short c);
+BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL do_global_upper(unsigned short c);
+#endif
+//
+// This sucks: declare template specialisations of global_lower/global_upper
+// that just forward to the non-template implementation functions.  We do
+// this because there is one compiler (Compaq Tru64 C++) that doesn't seem
+// to differentiate between templates and non-template overloads....
+// what's more, the primary template, plus all overloads have to be
+// defined in the same translation unit (if one is inline they all must be)
+// otherwise the "local template instantiation" compiler option can pick
+// the wrong instantiation when linking:
+//
+template<> inline char BOOST_REGEX_CALL global_lower<char>(char c){ return do_global_lower(c); }
+template<> inline char BOOST_REGEX_CALL global_upper<char>(char c){ return do_global_upper(c); }
+#ifndef BOOST_NO_WREGEX
+template<> inline wchar_t BOOST_REGEX_CALL global_lower<wchar_t>(wchar_t c){ return do_global_lower(c); }
+template<> inline wchar_t BOOST_REGEX_CALL global_upper<wchar_t>(wchar_t c){ return do_global_upper(c); }
+#endif
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+template<> inline unsigned short BOOST_REGEX_CALL global_lower<unsigned short>(unsigned short c){ return do_global_lower(c); }
+template<> inline unsigned short BOOST_REGEX_CALL global_upper<unsigned short>(unsigned short c){ return do_global_upper(c); }
+#endif
+
+template <class charT>
+int global_value(charT c)
+{
+   static const charT zero = '0';
+   static const charT nine = '9';
+   static const charT a = 'a';
+   static const charT f = 'f';
+   static const charT A = 'A';
+   static const charT F = 'F';
+
+   if(c > f) return -1;
+   if(c >= a) return 10 + (c - a);
+   if(c > F) return -1;
+   if(c >= A) return 10 + (c - A);
+   if(c > nine) return -1;
+   if(c >= zero) return c - zero;
+   return -1;
+}
+template <class charT, class traits>
+int global_toi(const charT*& p1, const charT* p2, int radix, const traits& t)
+{
+   (void)t; // warning suppression
+   int next_value = t.value(*p1, radix);
+   if((p1 == p2) || (next_value < 0) || (next_value >= radix))
+      return -1;
+   int result = 0;
+   while(p1 != p2)
+   {
+      next_value = t.value(*p1, radix);
+      if((next_value < 0) || (next_value >= radix))
+         break;
+      result *= radix;
+      result += next_value;
+      ++p1;
+   }
+   return result;
+}
+
+} // re_detail
+} // boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/regex_workaround.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,202 @@
+/*
+ *
+ * Copyright (c) 1998-2005
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         regex_workarounds.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares Misc workarounds.
+  */
+
+#ifndef BOOST_REGEX_WORKAROUND_HPP
+#define BOOST_REGEX_WORKAROUND_HPP
+
+
+#include <new>
+#include <cstring>
+#include <cstdlib>
+#include <cstddef>
+#include <cassert>
+#include <cstdio>
+#include <climits>
+#include <string>
+#include <stdexcept>
+#include <iterator>
+#include <algorithm>
+#include <iosfwd>
+#include <vector>
+#include <map>
+#include <boost/limits.hpp>
+#include <boost/assert.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/throw_exception.hpp>
+#include <boost/scoped_ptr.hpp>
+#include <boost/scoped_array.hpp>
+#include <boost/shared_ptr.hpp>
+#include <boost/mpl/bool_fwd.hpp>
+#ifndef BOOST_NO_STD_LOCALE
+#   include <locale>
+#endif
+
+#if defined(BOOST_NO_STDC_NAMESPACE)
+namespace std{
+   using ::sprintf; using ::strcpy; using ::strcat; using ::strlen;
+}
+#endif
+
+namespace boost{ namespace re_detail{
+#ifdef BOOST_NO_STD_DISTANCE
+template <class T>
+std::ptrdiff_t distance(const T& x, const T& y)
+{ return y - x; }
+#else
+using std::distance;
+#endif
+}}
+
+
+#ifdef BOOST_REGEX_NO_BOOL
+#  define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>((x) ? true : false)
+#else
+#  define BOOST_REGEX_MAKE_BOOL(x) static_cast<bool>(x)
+#endif
+
+/*****************************************************************************
+ *
+ *  Fix broken broken namespace support:
+ *
+ ****************************************************************************/
+
+#if defined(BOOST_NO_STDC_NAMESPACE) && defined(__cplusplus)
+
+namespace std{
+   using ::ptrdiff_t;
+   using ::size_t;
+   using ::abs;
+   using ::memset;
+   using ::memcpy;
+}
+
+#endif
+
+/*****************************************************************************
+ *
+ *  helper functions pointer_construct/pointer_destroy:
+ *
+ ****************************************************************************/
+
+#ifdef __cplusplus
+namespace boost{ namespace re_detail{
+
+#ifdef BOOST_MSVC
+#pragma warning (push)
+#pragma warning (disable : 4100)
+#endif
+
+template <class T>
+inline void pointer_destroy(T* p)
+{ p->~T(); (void)p; }
+
+#ifdef BOOST_MSVC
+#pragma warning (pop)
+#endif
+
+template <class T>
+inline void pointer_construct(T* p, const T& t)
+{ new (p) T(t); }
+
+}} // namespaces
+#endif
+
+/*****************************************************************************
+ *
+ *  helper function copy:
+ *
+ ****************************************************************************/
+
+#ifdef __cplusplus
+namespace boost{ namespace re_detail{
+#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(_CPPLIB_VER) && defined(BOOST_DINKUMWARE_STDLIB) && !(defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION))
+   //
+   // MSVC 8 will either emit warnings or else refuse to compile
+   // code that makes perfectly legitimate use of std::copy, when
+   // the OutputIterator type is a user-defined class (apparently all user 
+   // defined iterators are "unsafe").  This code works around that:
+   //
+   template<class InputIterator, class OutputIterator>
+   inline OutputIterator copy(
+      InputIterator first, 
+      InputIterator last, 
+      OutputIterator dest
+   )
+   {
+      return stdext::unchecked_copy(first, last, dest);
+   }
+   template<class InputIterator1, class InputIterator2>
+   inline bool equal(
+      InputIterator1 first, 
+      InputIterator1 last, 
+      InputIterator2 with
+   )
+   {
+      return stdext::unchecked_equal(first, last, with);
+   }
+
+#else 
+   using std::copy; 
+   using std::equal; 
+#endif 
+#if BOOST_WORKAROUND(BOOST_MSVC,>=1400) && defined(__STDC_WANT_SECURE_LIB__) && __STDC_WANT_SECURE_LIB__ 
+
+   // use safe versions of strcpy etc:
+   using ::strcpy_s;
+   using ::strcat_s;
+#else
+   inline std::size_t strcpy_s(
+      char *strDestination,
+      std::size_t sizeInBytes,
+      const char *strSource 
+   )
+   {
+      if(std::strlen(strSource)+1 > sizeInBytes)
+         return 1;
+      std::strcpy(strDestination, strSource);
+      return 0;
+   }
+   inline std::size_t strcat_s(
+      char *strDestination,
+      std::size_t sizeInBytes,
+      const char *strSource 
+   )
+   {
+      if(std::strlen(strSource) + std::strlen(strDestination) + 1 > sizeInBytes)
+         return 1;
+      std::strcat(strDestination, strSource);
+      return 0;
+   }
+
+#endif
+
+   inline void overflow_error_if_not_zero(std::size_t i)
+   {
+      if(i)
+      {
+         std::overflow_error e("String buffer too small");
+         boost::throw_exception(e);
+      }
+   }
+
+}} // namespaces
+
+#endif // __cplusplus
+
+#endif // include guard
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/states.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,290 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         states.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares internal state machine structures.
+  */
+
+#ifndef BOOST_REGEX_V4_STATES_HPP
+#define BOOST_REGEX_V4_STATES_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+namespace re_detail{
+
+/*** mask_type *******************************************************
+Whenever we have a choice of two alternatives, we use an array of bytes
+to indicate which of the two alternatives it is possible to take for any
+given input character.  If mask_take is set, then we can take the next 
+state, and if mask_skip is set then we can take the alternative.
+***********************************************************************/
+enum mask_type
+{
+   mask_take = 1,
+   mask_skip = 2,
+   mask_init = 4,
+   mask_any = mask_skip | mask_take,
+   mask_all = mask_any
+};
+
+/*** helpers **********************************************************
+These helpers let us use function overload resolution to detect whether
+we have narrow or wide character strings:
+***********************************************************************/
+struct _narrow_type{};
+struct _wide_type{};
+template <class charT> struct is_byte;
+template<>             struct is_byte<char>         { typedef _narrow_type width_type; };
+template<>             struct is_byte<unsigned char>{ typedef _narrow_type width_type; };
+template<>             struct is_byte<signed char>  { typedef _narrow_type width_type; };
+template <class charT> struct is_byte               { typedef _wide_type width_type; };
+
+/*** enum syntax_element_type ******************************************
+Every record in the state machine falls into one of the following types:
+***********************************************************************/
+enum syntax_element_type
+{
+   // start of a marked sub-expression, or perl-style (?...) extension
+   syntax_element_startmark = 0,
+   // end of a marked sub-expression, or perl-style (?...) extension
+   syntax_element_endmark = syntax_element_startmark + 1,
+   // any sequence of literal characters
+   syntax_element_literal = syntax_element_endmark + 1,
+   // start of line assertion: ^
+   syntax_element_start_line = syntax_element_literal + 1,
+   // end of line assertion $
+   syntax_element_end_line = syntax_element_start_line + 1,
+   // match any character: .
+   syntax_element_wild = syntax_element_end_line + 1,
+   // end of expression: we have a match when we get here
+   syntax_element_match = syntax_element_wild + 1,
+   // perl style word boundary: \b
+   syntax_element_word_boundary = syntax_element_match + 1,
+   // perl style within word boundary: \B
+   syntax_element_within_word = syntax_element_word_boundary + 1,
+   // start of word assertion: \<
+   syntax_element_word_start = syntax_element_within_word + 1,
+   // end of word assertion: \>
+   syntax_element_word_end = syntax_element_word_start + 1,
+   // start of buffer assertion: \`
+   syntax_element_buffer_start = syntax_element_word_end + 1,
+   // end of buffer assertion: \'
+   syntax_element_buffer_end = syntax_element_buffer_start + 1,
+   // backreference to previously matched sub-expression
+   syntax_element_backref = syntax_element_buffer_end + 1,
+   // either a wide character set [..] or one with multicharacter collating elements:
+   syntax_element_long_set = syntax_element_backref + 1,
+   // narrow character set: [...]
+   syntax_element_set = syntax_element_long_set + 1,
+   // jump to a new state in the machine:
+   syntax_element_jump = syntax_element_set + 1,
+   // choose between two production states:
+   syntax_element_alt = syntax_element_jump + 1,
+   // a repeat
+   syntax_element_rep = syntax_element_alt + 1,
+   // match a combining character sequence
+   syntax_element_combining = syntax_element_rep + 1,
+   // perl style soft buffer end: \z
+   syntax_element_soft_buffer_end = syntax_element_combining + 1,
+   // perl style continuation: \G
+   syntax_element_restart_continue = syntax_element_soft_buffer_end + 1,
+   // single character repeats:
+   syntax_element_dot_rep = syntax_element_restart_continue + 1,
+   syntax_element_char_rep = syntax_element_dot_rep + 1,
+   syntax_element_short_set_rep = syntax_element_char_rep + 1,
+   syntax_element_long_set_rep = syntax_element_short_set_rep + 1,
+   // a backstep for lookbehind repeats:
+   syntax_element_backstep = syntax_element_long_set_rep + 1,
+   // an assertion that a mark was matched:
+   syntax_element_assert_backref = syntax_element_backstep + 1,
+   syntax_element_toggle_case = syntax_element_assert_backref + 1
+};
+
+#ifdef BOOST_REGEX_DEBUG
+// dwa 09/26/00 - This is needed to suppress warnings about an ambiguous conversion
+std::ostream& operator<<(std::ostream&, syntax_element_type);
+#endif
+
+struct re_syntax_base;
+
+/*** union offset_type ************************************************
+Points to another state in the machine.  During machine construction
+we use integral offsets, but these are converted to pointers before
+execution of the machine.
+***********************************************************************/
+union offset_type
+{
+   re_syntax_base*   p;
+   std::ptrdiff_t    i;
+};
+
+/*** struct re_syntax_base ********************************************
+Base class for all states in the machine.
+***********************************************************************/
+struct re_syntax_base
+{
+   syntax_element_type   type;         // what kind of state this is
+   offset_type           next;         // next state in the machine
+};
+
+/*** struct re_brace **************************************************
+A marked parenthesis.
+***********************************************************************/
+struct re_brace : public re_syntax_base
+{
+   // The index to match, can be zero (don't mark the sub-expression)
+   // or negative (for perl style (?...) extentions):
+   int index;
+};
+
+/*** struct re_dot **************************************************
+Match anything.
+***********************************************************************/
+enum
+{
+   dont_care = 1,
+   force_not_newline = 0,
+   force_newline = 2,
+
+   test_not_newline = 2,
+   test_newline = 3
+};
+struct re_dot : public re_syntax_base
+{
+   unsigned char mask;
+};
+
+/*** struct re_literal ************************************************
+A string of literals, following this structure will be an 
+array of characters: charT[length]
+***********************************************************************/
+struct re_literal : public re_syntax_base
+{
+   unsigned int length;
+};
+
+/*** struct re_case ************************************************
+Indicates whether we are moving to a case insensive block or not
+***********************************************************************/
+struct re_case : public re_syntax_base
+{
+   bool icase;
+};
+
+/*** struct re_set_long ***********************************************
+A wide character set of characters, following this structure will be
+an array of type charT:
+First csingles null-terminated strings
+Then 2 * cranges NULL terminated strings
+Then cequivalents NULL terminated strings
+***********************************************************************/
+template <class mask_type>
+struct re_set_long : public re_syntax_base
+{
+   unsigned int            csingles, cranges, cequivalents;
+   mask_type               cclasses;
+   mask_type               cnclasses;
+   bool                    isnot;
+   bool                    singleton;
+};
+
+/*** struct re_set ****************************************************
+A set of narrow-characters, matches any of _map which is none-zero
+***********************************************************************/
+struct re_set : public re_syntax_base
+{
+   unsigned char _map[1 << CHAR_BIT];
+};
+
+/*** struct re_jump ***************************************************
+Jump to a new location in the machine (not next).
+***********************************************************************/
+struct re_jump : public re_syntax_base
+{
+   offset_type     alt;                 // location to jump to
+};
+
+/*** struct re_alt ***************************************************
+Jump to a new location in the machine (possibly next).
+***********************************************************************/
+struct re_alt : public re_jump
+{
+   unsigned char   _map[1 << CHAR_BIT]; // which characters can take the jump
+   unsigned int    can_be_null;         // true if we match a NULL string
+};
+
+/*** struct re_repeat *************************************************
+Repeat a section of the machine
+***********************************************************************/
+struct re_repeat : public re_alt
+{
+   std::size_t   min, max;  // min and max allowable repeats
+   int           state_id;        // Unique identifier for this repeat
+   bool          leading;   // True if this repeat is at the start of the machine (lets us optimize some searches)
+   bool          greedy;    // True if this is a greedy repeat
+};
+
+/*** enum re_jump_size_type *******************************************
+Provides compiled size of re_jump structure (allowing for trailing alignment).
+We provide this so we know how manybytes to insert when constructing the machine
+(The value of padding_mask is defined in regex_raw_buffer.hpp).
+***********************************************************************/
+enum re_jump_size_type
+{
+   re_jump_size = (sizeof(re_jump) + padding_mask) & ~(padding_mask),
+   re_repeater_size = (sizeof(re_repeat) + padding_mask) & ~(padding_mask),
+   re_alt_size = (sizeof(re_alt) + padding_mask) & ~(padding_mask)
+};
+
+/*** proc re_is_set_member *********************************************
+Forward declaration: we'll need this one later...
+***********************************************************************/
+
+template<class charT, class traits>
+struct regex_data;
+
+template <class iterator, class charT, class traits_type, class char_classT>
+iterator BOOST_REGEX_CALL re_is_set_member(iterator next, 
+                          iterator last, 
+                          const re_set_long<char_classT>* set_, 
+                          const regex_data<charT, traits_type>& e, bool icase);
+
+} // namespace re_detail
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/sub_match.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,509 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         sub_match.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares template class sub_match.
+  */
+
+#ifndef BOOST_REGEX_V4_SUB_MATCH_HPP
+#define BOOST_REGEX_V4_SUB_MATCH_HPP
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+namespace boost{
+
+template <class BidiIterator>
+struct sub_match : public std::pair<BidiIterator, BidiIterator>
+{
+   typedef typename re_detail::regex_iterator_traits<BidiIterator>::value_type       value_type;
+#if defined(BOOST_NO_STD_ITERATOR_TRAITS) || defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+   typedef          std::ptrdiff_t                                                   difference_type;
+#else
+   typedef typename re_detail::regex_iterator_traits<BidiIterator>::difference_type  difference_type;
+#endif
+   typedef          BidiIterator                                                     iterator_type;
+   typedef          BidiIterator                                                     iterator;
+   typedef          BidiIterator                                                     const_iterator;
+
+   bool matched;
+
+   sub_match() : std::pair<BidiIterator, BidiIterator>(), matched(false) {}
+   sub_match(BidiIterator i) : std::pair<BidiIterator, BidiIterator>(i, i), matched(false) {}
+#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
+               && !BOOST_WORKAROUND(BOOST_MSVC, < 1310)\
+               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)\
+               && !BOOST_WORKAROUND(__DECCXX_VER, BOOST_TESTED_AT(60590042))
+   template <class T, class A>
+   operator std::basic_string<value_type, T, A> ()const
+   {
+      return std::basic_string<value_type, T, A>(this->first, this->second);
+   }
+#else
+   operator std::basic_string<value_type> ()const
+   {
+      return str();
+   }
+#endif
+   difference_type BOOST_REGEX_CALL length()const
+   {
+      difference_type n = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);
+      return n;
+   }
+   std::basic_string<value_type> str()const
+   {
+      std::basic_string<value_type> result;
+      std::size_t len = ::boost::re_detail::distance((BidiIterator)this->first, (BidiIterator)this->second);
+      result.reserve(len);
+      BidiIterator i = this->first;
+      while(i != this->second)
+      {
+         result.append(1, *i);
+         ++i;
+      }
+      return result;
+   }
+   int compare(const sub_match& s)const
+   {
+      if(matched != s.matched)
+         return static_cast<int>(matched) - static_cast<int>(s.matched);
+      return str().compare(s.str());
+   }
+   int compare(const std::basic_string<value_type>& s)const
+   {
+      return str().compare(s);
+   }
+   int compare(const value_type* p)const
+   {
+      return str().compare(p);
+   }
+
+   bool operator==(const sub_match& that)const
+   { return compare(that) == 0; }
+   bool BOOST_REGEX_CALL operator !=(const sub_match& that)const
+   { return compare(that) != 0; }
+   bool operator<(const sub_match& that)const
+   { return compare(that) < 0; }
+   bool operator>(const sub_match& that)const
+   { return compare(that) > 0; }
+   bool operator<=(const sub_match& that)const
+   { return compare(that) <= 0; }
+   bool operator>=(const sub_match& that)const
+   { return compare(that) >= 0; }
+
+#ifdef BOOST_REGEX_MATCH_EXTRA
+   typedef std::vector<sub_match<BidiIterator> > capture_sequence_type;
+
+   const capture_sequence_type& captures()const
+   {
+      if(!m_captures) 
+         m_captures.reset(new capture_sequence_type());
+      return *m_captures;
+   }
+   //
+   // Private implementation API: DO NOT USE!
+   //
+   capture_sequence_type& get_captures()const
+   {
+      if(!m_captures) 
+         m_captures.reset(new capture_sequence_type());
+      return *m_captures;
+   }
+
+private:
+   mutable boost::scoped_ptr<capture_sequence_type> m_captures;
+public:
+
+#endif
+   sub_match(const sub_match& that, bool 
+#ifdef BOOST_REGEX_MATCH_EXTRA
+      deep_copy
+#endif
+      = true
+      ) 
+      : std::pair<BidiIterator, BidiIterator>(that), 
+        matched(that.matched) 
+   {
+#ifdef BOOST_REGEX_MATCH_EXTRA
+      if(that.m_captures)
+         if(deep_copy)
+            m_captures.reset(new capture_sequence_type(*(that.m_captures)));
+#endif
+   }
+   sub_match& operator=(const sub_match& that)
+   {
+      this->first = that.first;
+      this->second = that.second;
+      matched = that.matched;
+#ifdef BOOST_REGEX_MATCH_EXTRA
+      if(that.m_captures)
+         get_captures() = *(that.m_captures);
+#endif
+      return *this;
+   }
+
+
+#ifdef BOOST_OLD_REGEX_H
+   //
+   // the following are deprecated, do not use!!
+   //
+   operator int()const;
+   operator unsigned int()const;
+   operator short()const
+   {
+      return (short)(int)(*this);
+   }
+   operator unsigned short()const
+   {
+      return (unsigned short)(unsigned int)(*this);
+   }
+#endif
+};
+
+typedef sub_match<const char*> csub_match;
+typedef sub_match<std::string::const_iterator> ssub_match;
+#ifndef BOOST_NO_WREGEX
+typedef sub_match<const wchar_t*> wcsub_match;
+typedef sub_match<std::wstring::const_iterator> wssub_match;
+#endif
+
+// comparison to std::basic_string<> part 1:
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator == (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) == 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator != (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) != 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator < (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                 const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) < 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator <= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) <= 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator >= (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) >= 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator > (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                 const sub_match<RandomAccessIterator>& m)
+{ return s.compare(m.str()) > 0; }
+// comparison to std::basic_string<> part 2:
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator == (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) == 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator != (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) != 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator < (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) < 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator > (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) > 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator <= (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) <= 0; }
+template <class RandomAccessIterator, class traits, class Allocator>
+inline bool operator >= (const sub_match<RandomAccessIterator>& m,
+                  const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{ return m.str().compare(s) >= 0; }
+// comparison to const charT* part 1:
+template <class RandomAccessIterator>
+inline bool operator == (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) == 0; }
+template <class RandomAccessIterator>
+inline bool operator != (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) != 0; }
+template <class RandomAccessIterator>
+inline bool operator > (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) > 0; }
+template <class RandomAccessIterator>
+inline bool operator < (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) < 0; }
+template <class RandomAccessIterator>
+inline bool operator >= (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) >= 0; }
+template <class RandomAccessIterator>
+inline bool operator <= (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s)
+{ return m.str().compare(s) <= 0; }
+// comparison to const charT* part 2:
+template <class RandomAccessIterator>
+inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) == 0; }
+template <class RandomAccessIterator>
+inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) != 0; }
+template <class RandomAccessIterator>
+inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) > 0; }
+template <class RandomAccessIterator>
+inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) < 0; }
+template <class RandomAccessIterator>
+inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) >= 0; }
+template <class RandomAccessIterator>
+inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(s) <= 0; }
+
+// comparison to const charT& part 1:
+template <class RandomAccessIterator>
+inline bool operator == (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) == 0; }
+template <class RandomAccessIterator>
+inline bool operator != (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) != 0; }
+template <class RandomAccessIterator>
+inline bool operator > (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) > 0; }
+template <class RandomAccessIterator>
+inline bool operator < (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) < 0; }
+template <class RandomAccessIterator>
+inline bool operator >= (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
+template <class RandomAccessIterator>
+inline bool operator <= (const sub_match<RandomAccessIterator>& m,
+                  typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
+// comparison to const charT* part 2:
+template <class RandomAccessIterator>
+inline bool operator == (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) == 0; }
+template <class RandomAccessIterator>
+inline bool operator != (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) != 0; }
+template <class RandomAccessIterator>
+inline bool operator < (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) > 0; }
+template <class RandomAccessIterator>
+inline bool operator > (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) < 0; }
+template <class RandomAccessIterator>
+inline bool operator <= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) >= 0; }
+template <class RandomAccessIterator>
+inline bool operator >= (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{ return m.str().compare(0, m.length(), &s, 1) <= 0; }
+
+// addition operators:
+template <class RandomAccessIterator, class traits, class Allocator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> 
+operator + (const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s,
+                  const sub_match<RandomAccessIterator>& m)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
+   result.reserve(s.size() + m.length() + 1);
+   return result.append(s).append(m.first, m.second);
+}
+template <class RandomAccessIterator, class traits, class Allocator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> 
+operator + (const sub_match<RandomAccessIterator>& m,
+            const std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator>& s)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type, traits, Allocator> result;
+   result.reserve(s.size() + m.length() + 1);
+   return result.append(m.first, m.second).append(s);
+}
+#if !(defined(__GNUC__) && defined(BOOST_NO_STD_LOCALE))
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+   result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
+   return result.append(s).append(m.first, m.second);
+}
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (const sub_match<RandomAccessIterator>& m,
+            typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+   result.reserve(std::char_traits<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type>::length(s) + m.length() + 1);
+   return result.append(m.first, m.second).append(s);
+}
+#else
+// worwaround versions:
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const* s,
+                  const sub_match<RandomAccessIterator>& m)
+{
+   return s + m.str();
+}
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (const sub_match<RandomAccessIterator>& m,
+            typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const * s)
+{
+   return m.str() + s;
+}
+#endif
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s,
+                  const sub_match<RandomAccessIterator>& m)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+   result.reserve(m.length() + 2);
+   return result.append(1, s).append(m.first, m.second);
+}
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (const sub_match<RandomAccessIterator>& m,
+            typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type const& s)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+   result.reserve(m.length() + 2);
+   return result.append(m.first, m.second).append(1, s);
+}
+template <class RandomAccessIterator>
+inline std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> 
+operator + (const sub_match<RandomAccessIterator>& m1,
+            const sub_match<RandomAccessIterator>& m2)
+{
+   std::basic_string<typename re_detail::regex_iterator_traits<RandomAccessIterator>::value_type> result;
+   result.reserve(m1.length() + m2.length() + 1);
+   return result.append(m1.first, m1.second).append(m2.first, m2.second);
+}
+#ifndef BOOST_NO_STD_LOCALE
+template <class charT, class traits, class RandomAccessIterator>
+std::basic_ostream<charT, traits>&
+   operator << (std::basic_ostream<charT, traits>& os,
+                const sub_match<RandomAccessIterator>& s)
+{
+   return (os << s.str());
+}
+#else
+template <class RandomAccessIterator>
+std::ostream& operator << (std::ostream& os,
+                           const sub_match<RandomAccessIterator>& s)
+{
+   return (os << s.str());
+}
+#endif
+
+#ifdef BOOST_OLD_REGEX_H
+namespace re_detail{
+template <class BidiIterator, class charT>
+int do_toi(BidiIterator i, BidiIterator j, char c, int radix)
+{
+   std::string s(i, j);
+   char* p;
+   int result = std::strtol(s.c_str(), &p, radix);
+   if(*p)raise_regex_exception("Bad sub-expression");
+   return result;
+}
+
+//
+// helper:
+template <class I, class charT>
+int do_toi(I& i, I j, charT c)
+{
+   int result = 0;
+   while((i != j) && (isdigit(*i)))
+   {
+      result = result*10 + (*i - '0');
+      ++i;
+   }
+   return result;
+}
+}
+
+
+template <class BidiIterator>
+sub_match<BidiIterator>::operator int()const
+{
+   BidiIterator i = first;
+   BidiIterator j = second;
+   if(i == j)raise_regex_exception("Bad sub-expression");
+   int neg = 1;
+   if((i != j) && (*i == '-'))
+   {
+      neg = -1;
+      ++i;
+   }
+   neg *= re_detail::do_toi(i, j, *i);
+   if(i != j)raise_regex_exception("Bad sub-expression");
+   return neg;
+}
+template <class BidiIterator>
+sub_match<BidiIterator>::operator unsigned int()const
+{
+   BidiIterator i = first;
+   BidiIterator j = second;
+   if(i == j)
+      raise_regex_exception("Bad sub-expression");
+   return re_detail::do_toi(i, j, *first);
+}
+#endif
+
+} // namespace boost
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/syntax_type.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,102 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         syntax_type.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression synatx type enumerator.
+  */
+
+#ifndef BOOST_REGEX_SYNTAX_TYPE_HPP
+#define BOOST_REGEX_SYNTAX_TYPE_HPP
+
+namespace boost{
+namespace regex_constants{
+
+typedef unsigned char syntax_type;
+
+//
+// values chosen are binary compatible with previous version:
+//
+static const syntax_type syntax_char = 0;
+static const syntax_type syntax_open_mark = 1;
+static const syntax_type syntax_close_mark = 2;
+static const syntax_type syntax_dollar = 3;
+static const syntax_type syntax_caret = 4;
+static const syntax_type syntax_dot = 5;
+static const syntax_type syntax_star = 6;
+static const syntax_type syntax_plus = 7;
+static const syntax_type syntax_question = 8;
+static const syntax_type syntax_open_set = 9;
+static const syntax_type syntax_close_set = 10;
+static const syntax_type syntax_or = 11;
+static const syntax_type syntax_escape = 12;
+static const syntax_type syntax_dash = 14;
+static const syntax_type syntax_open_brace = 15;
+static const syntax_type syntax_close_brace = 16;
+static const syntax_type syntax_digit = 17;
+static const syntax_type syntax_comma = 27;
+static const syntax_type syntax_equal = 37;
+static const syntax_type syntax_colon = 36;
+static const syntax_type syntax_not = 53;
+
+// extensions:
+
+static const syntax_type syntax_hash = 13;
+static const syntax_type syntax_newline = 26;
+
+// escapes:
+
+typedef syntax_type escape_syntax_type;
+
+static const escape_syntax_type escape_type_word_assert = 18;
+static const escape_syntax_type escape_type_not_word_assert = 19;
+static const escape_syntax_type escape_type_control_f = 29;
+static const escape_syntax_type escape_type_control_n = 30;
+static const escape_syntax_type escape_type_control_r = 31;
+static const escape_syntax_type escape_type_control_t = 32;
+static const escape_syntax_type escape_type_control_v = 33;
+static const escape_syntax_type escape_type_ascii_control = 35;
+static const escape_syntax_type escape_type_hex = 34;
+static const escape_syntax_type escape_type_unicode = 0; // not used
+static const escape_syntax_type escape_type_identity = 0; // not used
+static const escape_syntax_type escape_type_backref = syntax_digit;
+static const escape_syntax_type escape_type_decimal = syntax_digit; // not used
+static const escape_syntax_type escape_type_class = 22; 
+static const escape_syntax_type escape_type_not_class = 23; 
+
+// extensions:
+
+static const escape_syntax_type escape_type_left_word = 20;
+static const escape_syntax_type escape_type_right_word = 21;
+static const escape_syntax_type escape_type_start_buffer = 24;                 // for \`
+static const escape_syntax_type escape_type_end_buffer = 25;                   // for \'
+static const escape_syntax_type escape_type_control_a = 28;                    // for \a
+static const escape_syntax_type escape_type_e = 38;                            // for \e
+static const escape_syntax_type escape_type_E = 47;                            // for \Q\E
+static const escape_syntax_type escape_type_Q = 48;                            // for \Q\E
+static const escape_syntax_type escape_type_X = 49;                            // for \X
+static const escape_syntax_type escape_type_C = 50;                            // for \C
+static const escape_syntax_type escape_type_Z = 51;                            // for \Z
+static const escape_syntax_type escape_type_G = 52;                            // for \G
+
+static const escape_syntax_type escape_type_property = 54;                     // for \p
+static const escape_syntax_type escape_type_not_property = 55;                 // for \P
+static const escape_syntax_type escape_type_named_char = 56;                   // for \N
+
+static const escape_syntax_type syntax_max = 57;
+
+}
+}
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/u32regex_iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,193 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         u32regex_iterator.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides u32regex_iterator implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_U32REGEX_ITERATOR_HPP
+#define BOOST_REGEX_V4_U32REGEX_ITERATOR_HPP
+
+namespace boost{
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+
+template <class BidirectionalIterator>
+class u32regex_iterator_implementation 
+{
+   typedef u32regex regex_type;
+
+   match_results<BidirectionalIterator> what;  // current match
+   BidirectionalIterator                base;  // start of sequence
+   BidirectionalIterator                end;   // end of sequence
+   const regex_type                     re;   // the expression
+   match_flag_type                      flags; // flags for matching
+
+public:
+   u32regex_iterator_implementation(const regex_type* p, BidirectionalIterator last, match_flag_type f)
+      : base(), end(last), re(*p), flags(f){}
+   bool init(BidirectionalIterator first)
+   {
+      base = first;
+      return u32regex_search(first, end, what, re, flags, base);
+   }
+   bool compare(const u32regex_iterator_implementation& that)
+   {
+      if(this == &that) return true;
+      return (&re.get_data() == &that.re.get_data()) && (end == that.end) && (flags == that.flags) && (what[0].first == that.what[0].first) && (what[0].second == that.what[0].second);
+   }
+   const match_results<BidirectionalIterator>& get()
+   { return what; }
+   bool next()
+   {
+      //if(what.prefix().first != what[0].second)
+      //   flags |= match_prev_avail;
+      BidirectionalIterator next_start = what[0].second;
+      match_flag_type f(flags);
+      if(!what.length())
+         f |= regex_constants::match_not_initial_null;
+      //if(base != next_start)
+      //   f |= regex_constants::match_not_bob;
+      bool result = u32regex_search(next_start, end, what, re, f, base);
+      if(result)
+         what.set_base(base);
+      return result;
+   }
+private:
+   u32regex_iterator_implementation& operator=(const u32regex_iterator_implementation&);
+};
+
+template <class BidirectionalIterator>
+class u32regex_iterator 
+#ifndef BOOST_NO_STD_ITERATOR
+   : public std::iterator<
+         std::forward_iterator_tag, 
+         match_results<BidirectionalIterator>,
+         typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+         const match_results<BidirectionalIterator>*,
+         const match_results<BidirectionalIterator>& >         
+#endif
+{
+private:
+   typedef u32regex_iterator_implementation<BidirectionalIterator> impl;
+   typedef shared_ptr<impl> pimpl;
+public:
+   typedef          u32regex                                                regex_type;
+   typedef          match_results<BidirectionalIterator>                    value_type;
+   typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type 
+                                                                            difference_type;
+   typedef          const value_type*                                       pointer;
+   typedef          const value_type&                                       reference; 
+   typedef          std::forward_iterator_tag                               iterator_category;
+   
+   u32regex_iterator(){}
+   u32regex_iterator(BidirectionalIterator a, BidirectionalIterator b, 
+                  const regex_type& re, 
+                  match_flag_type m = match_default)
+                  : pdata(new impl(&re, b, m))
+   {
+      if(!pdata->init(a))
+      {
+         pdata.reset();
+      }
+   }
+   u32regex_iterator(const u32regex_iterator& that)
+      : pdata(that.pdata) {}
+   u32regex_iterator& operator=(const u32regex_iterator& that)
+   {
+      pdata = that.pdata;
+      return *this;
+   }
+   bool operator==(const u32regex_iterator& that)const
+   { 
+      if((pdata.get() == 0) || (that.pdata.get() == 0))
+         return pdata.get() == that.pdata.get();
+      return pdata->compare(*(that.pdata.get())); 
+   }
+   bool operator!=(const u32regex_iterator& that)const
+   { return !(*this == that); }
+   const value_type& operator*()const
+   { return pdata->get(); }
+   const value_type* operator->()const
+   { return &(pdata->get()); }
+   u32regex_iterator& operator++()
+   {
+      cow();
+      if(0 == pdata->next())
+      {
+         pdata.reset();
+      }
+      return *this;
+   }
+   u32regex_iterator operator++(int)
+   {
+      u32regex_iterator result(*this);
+      ++(*this);
+      return result;
+   }
+private:
+
+   pimpl pdata;
+
+   void cow()
+   {
+      // copy-on-write
+      if(pdata.get() && !pdata.unique())
+      {
+         pdata.reset(new impl(*(pdata.get())));
+      }
+   }
+};
+
+typedef u32regex_iterator<const char*> utf8regex_iterator;
+typedef u32regex_iterator<const UChar*> utf16regex_iterator;
+typedef u32regex_iterator<const UChar32*> utf32regex_iterator;
+
+inline u32regex_iterator<const char*> make_u32regex_iterator(const char* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_iterator<const char*>(p, p+std::strlen(p), e, m);
+}
+#ifndef BOOST_NO_WREGEX
+inline u32regex_iterator<const wchar_t*> make_u32regex_iterator(const wchar_t* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_iterator<const wchar_t*>(p, p+std::wcslen(p), e, m);
+}
+#endif
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
+inline u32regex_iterator<const UChar*> make_u32regex_iterator(const UChar* p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_iterator<const UChar*>(p, p+u_strlen(p), e, m);
+}
+#endif
+template <class charT, class Traits, class Alloc>
+inline u32regex_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
+   return u32regex_iterator<iter_type>(p.begin(), p.end(), e, m);
+}
+inline u32regex_iterator<const UChar*> make_u32regex_iterator(const UnicodeString& s, const u32regex& e, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, m);
+}
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+} // namespace boost
+
+#endif // BOOST_REGEX_V4_REGEX_ITERATOR_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/u32regex_token_iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,377 @@
+/*
+ *
+ * Copyright (c) 2003
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         u32regex_token_iterator.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Provides u32regex_token_iterator implementation.
+  */
+
+#ifndef BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
+#define BOOST_REGEX_V4_U32REGEX_TOKEN_ITERATOR_HPP
+
+#if (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003))
+//
+// Borland C++ Builder 6, and Visual C++ 6,
+// can't cope with the array template constructor
+// so we have a template member that will accept any type as 
+// argument, and then assert that is really is an array:
+//
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/is_array.hpp>
+#endif
+
+namespace boost{
+
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#if BOOST_WORKAROUND(BOOST_MSVC, > 1300)
+#  pragma warning(push)
+#  pragma warning(disable:4700)
+#endif
+
+template <class BidirectionalIterator>
+class u32regex_token_iterator_implementation 
+{
+   typedef u32regex                              regex_type;
+   typedef sub_match<BidirectionalIterator>      value_type;
+
+   match_results<BidirectionalIterator> what;   // current match
+   BidirectionalIterator                end;    // end of search area
+   BidirectionalIterator                base;   // start of search area
+   const regex_type                     re;     // the expression
+   match_flag_type                      flags;  // match flags
+   value_type                           result; // the current string result
+   int                                  N;      // the current sub-expression being enumerated
+   std::vector<int>                     subs;   // the sub-expressions to enumerate
+
+public:
+   u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, int sub, match_flag_type f)
+      : end(last), re(*p), flags(f){ subs.push_back(sub); }
+   u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const std::vector<int>& v, match_flag_type f)
+      : end(last), re(*p), flags(f), subs(v){}
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+      // can't reliably get this to work....
+#elif (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
+      || BOOST_WORKAROUND(__HP_aCC, < 60700)
+   template <class T>
+   u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const T& submatches, match_flag_type f)
+      : end(last), re(*p), flags(f)
+   {
+      // assert that T really is an array:
+      BOOST_STATIC_ASSERT(::boost::is_array<T>::value);
+      const std::size_t array_size = sizeof(T) / sizeof(submatches[0]);
+      for(std::size_t i = 0; i < array_size; ++i)
+      {
+         subs.push_back(submatches[i]);
+      }
+   }
+#else
+   template <std::size_t CN>
+   u32regex_token_iterator_implementation(const regex_type* p, BidirectionalIterator last, const int (&submatches)[CN], match_flag_type f)
+      : end(last), re(*p), flags(f)
+   {
+      for(std::size_t i = 0; i < CN; ++i)
+      {
+         subs.push_back(submatches[i]);
+      }
+   }
+#endif
+
+   bool init(BidirectionalIterator first)
+   {
+      base = first;
+      N = 0;
+      if(u32regex_search(first, end, what, re, flags, base) == true)
+      {
+         N = 0;
+         result = ((subs[N] == -1) ? what.prefix() : what[(int)subs[N]]);
+         return true;
+      }
+      else if((subs[N] == -1) && (first != end))
+      {
+         result.first = first;
+         result.second = end;
+         result.matched = (first != end);
+         N = -1;
+         return true;
+      }
+      return false;
+   }
+   bool compare(const u32regex_token_iterator_implementation& that)
+   {
+      if(this == &that) return true;
+      return (&re.get_data() == &that.re.get_data()) 
+         && (end == that.end) 
+         && (flags == that.flags) 
+         && (N == that.N) 
+         && (what[0].first == that.what[0].first) 
+         && (what[0].second == that.what[0].second);
+   }
+   const value_type& get()
+   { return result; }
+   bool next()
+   {
+      if(N == -1)
+         return false;
+      if(N+1 < (int)subs.size())
+      {
+         ++N;
+         result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
+         return true;
+      }
+      //if(what.prefix().first != what[0].second)
+      //   flags |= match_prev_avail | regex_constants::match_not_bob;
+      BidirectionalIterator last_end(what[0].second);
+      if(u32regex_search(last_end, end, what, re, ((what[0].first == what[0].second) ? flags | regex_constants::match_not_initial_null : flags), base))
+      {
+         N =0;
+         result =((subs[N] == -1) ? what.prefix() : what[subs[N]]);
+         return true;
+      }
+      else if((last_end != end) && (subs[0] == -1))
+      {
+         N =-1;
+         result.first = last_end;
+         result.second = end;
+         result.matched = (last_end != end);
+         return true;
+      }
+      return false;
+   }
+private:
+   u32regex_token_iterator_implementation& operator=(const u32regex_token_iterator_implementation&);
+};
+
+template <class BidirectionalIterator>
+class u32regex_token_iterator 
+#ifndef BOOST_NO_STD_ITERATOR
+   : public std::iterator<
+         std::forward_iterator_tag, 
+         sub_match<BidirectionalIterator>,
+         typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type,
+         const sub_match<BidirectionalIterator>*,
+         const sub_match<BidirectionalIterator>& >         
+#endif
+{
+private:
+   typedef u32regex_token_iterator_implementation<BidirectionalIterator> impl;
+   typedef shared_ptr<impl> pimpl;
+public:
+   typedef          u32regex                                                regex_type;
+   typedef          sub_match<BidirectionalIterator>                        value_type;
+   typedef typename re_detail::regex_iterator_traits<BidirectionalIterator>::difference_type 
+                                                                            difference_type;
+   typedef          const value_type*                                       pointer;
+   typedef          const value_type&                                       reference; 
+   typedef          std::forward_iterator_tag                               iterator_category;
+   
+   u32regex_token_iterator(){}
+   u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, 
+                        int submatch = 0, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatch, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+   u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re, 
+                        const std::vector<int>& submatches, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#if BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+      // can't reliably get this to work....
+#elif (BOOST_WORKAROUND(__BORLANDC__, >= 0x560) && BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570)))\
+      || BOOST_WORKAROUND(BOOST_MSVC, < 1300) \
+      || BOOST_WORKAROUND(__MWERKS__, BOOST_TESTED_AT(0x3003)) \
+      || BOOST_WORKAROUND(__HP_aCC, < 60700)
+   template <class T>
+   u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
+                        const T& submatches, match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#else
+   template <std::size_t N>
+   u32regex_token_iterator(BidirectionalIterator a, BidirectionalIterator b, const regex_type& re,
+                        const int (&submatches)[N], match_flag_type m = match_default)
+                        : pdata(new impl(&re, b, submatches, m))
+   {
+      if(!pdata->init(a))
+         pdata.reset();
+   }
+#endif
+   u32regex_token_iterator(const u32regex_token_iterator& that)
+      : pdata(that.pdata) {}
+   u32regex_token_iterator& operator=(const u32regex_token_iterator& that)
+   {
+      pdata = that.pdata;
+      return *this;
+   }
+   bool operator==(const u32regex_token_iterator& that)const
+   { 
+      if((pdata.get() == 0) || (that.pdata.get() == 0))
+         return pdata.get() == that.pdata.get();
+      return pdata->compare(*(that.pdata.get())); 
+   }
+   bool operator!=(const u32regex_token_iterator& that)const
+   { return !(*this == that); }
+   const value_type& operator*()const
+   { return pdata->get(); }
+   const value_type* operator->()const
+   { return &(pdata->get()); }
+   u32regex_token_iterator& operator++()
+   {
+      cow();
+      if(0 == pdata->next())
+      {
+         pdata.reset();
+      }
+      return *this;
+   }
+   u32regex_token_iterator operator++(int)
+   {
+      u32regex_token_iterator result(*this);
+      ++(*this);
+      return result;
+   }
+private:
+
+   pimpl pdata;
+
+   void cow()
+   {
+      // copy-on-write
+      if(pdata.get() && !pdata.unique())
+      {
+         pdata.reset(new impl(*(pdata.get())));
+      }
+   }
+};
+
+typedef u32regex_token_iterator<const char*> utf8regex_token_iterator;
+typedef u32regex_token_iterator<const UChar*> utf16regex_token_iterator;
+typedef u32regex_token_iterator<const UChar32*> utf32regex_token_iterator;
+
+// construction from an integral sub_match state_id:
+inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
+}
+#ifndef BOOST_NO_WREGEX
+inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
+}
+#endif
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, submatch, m);
+}
+#endif
+template <class charT, class Traits, class Alloc>
+inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
+   return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, m);
+}
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, int submatch = 0, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
+}
+
+#if !BOOST_WORKAROUND(BOOST_MSVC, < 1300)
+// construction from a reference to an array:
+template <std::size_t N>
+inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
+}
+#ifndef BOOST_NO_WREGEX
+template <std::size_t N>
+inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
+}
+#endif
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
+template <std::size_t N>
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, m);
+}
+#endif
+template <class charT, class Traits, class Alloc, std::size_t N>
+inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
+   return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, m);
+}
+template <std::size_t N>
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, const int (&submatch)[N], regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
+}
+#endif // BOOST_MSVC < 1300
+
+// construction from a vector of sub_match state_id's:
+inline u32regex_token_iterator<const char*> make_u32regex_token_iterator(const char* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const char*>(p, p+std::strlen(p), e, submatch, m);
+}
+#ifndef BOOST_NO_WREGEX
+inline u32regex_token_iterator<const wchar_t*> make_u32regex_token_iterator(const wchar_t* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const wchar_t*>(p, p+std::wcslen(p), e, submatch, m);
+}
+#endif
+#if !defined(U_WCHAR_IS_UTF16) && (U_SIZEOF_WCHAR_T != 2)
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UChar* p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(p, p+u_strlen(p), e, submatch, m);
+}
+#endif
+template <class charT, class Traits, class Alloc>
+inline u32regex_token_iterator<typename std::basic_string<charT, Traits, Alloc>::const_iterator> make_u32regex_token_iterator(const std::basic_string<charT, Traits, Alloc>& p, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   typedef typename std::basic_string<charT, Traits, Alloc>::const_iterator iter_type;
+   return u32regex_token_iterator<iter_type>(p.begin(), p.end(), e, m);
+}
+inline u32regex_token_iterator<const UChar*> make_u32regex_token_iterator(const UnicodeString& s, const u32regex& e, const std::vector<int>& submatch, regex_constants::match_flag_type m = regex_constants::match_default)
+{
+   return u32regex_token_iterator<const UChar*>(s.getBuffer(), s.getBuffer() + s.length(), e, submatch, m);
+}
+
+#if BOOST_WORKAROUND(BOOST_MSVC, == 1310)
+#  pragma warning(pop)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+
+} // namespace boost
+
+#endif // BOOST_REGEX_V4_REGEX_TOKEN_ITERATOR_HPP
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex/v4/w32_regex_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,731 @@
+/*
+ *
+ * Copyright (c) 2004
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+ 
+ /*
+  *   LOCATION:    see http://www.boost.org for most recent version.
+  *   FILE         w32_regex_traits.hpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Declares regular expression traits class w32_regex_traits.
+  */
+
+#ifndef BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
+#define BOOST_W32_REGEX_TRAITS_HPP_INCLUDED
+
+#ifndef BOOST_RE_PAT_EXCEPT_HPP
+#include <boost/regex/pattern_except.hpp>
+#endif
+#ifndef BOOST_REGEX_TRAITS_DEFAULTS_HPP_INCLUDED
+#include <boost/regex/v4/regex_traits_defaults.hpp>
+#endif
+#ifdef BOOST_HAS_THREADS
+#include <boost/regex/pending/static_mutex.hpp>
+#endif
+#ifndef BOOST_REGEX_PRIMARY_TRANSFORM
+#include <boost/regex/v4/primary_transform.hpp>
+#endif
+#ifndef BOOST_REGEX_OBJECT_CACHE_HPP
+#include <boost/regex/pending/object_cache.hpp>
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_PREFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable:4786)
+#pragma warning(disable:4800)
+#endif
+
+namespace boost{ 
+
+//
+// forward declaration is needed by some compilers:
+//
+template <class charT>
+class w32_regex_traits;
+   
+namespace re_detail{
+
+//
+// start by typedeffing the types we'll need:
+//
+typedef ::boost::uint32_t lcid_type;   // placeholder for LCID.
+typedef ::boost::shared_ptr<void> cat_type; // placeholder for dll HANDLE.
+
+//
+// then add wrappers around the actual Win32 API's (ie implementation hiding):
+//
+BOOST_REGEX_DECL lcid_type BOOST_REGEX_CALL w32_get_default_locale();
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(char, lcid_type);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(wchar_t, lcid_type);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_lower(unsigned short ca, lcid_type state_id);
+#endif
+#endif
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(char, lcid_type);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(wchar_t, lcid_type);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is_upper(unsigned short ca, lcid_type state_id);
+#endif
+#endif
+BOOST_REGEX_DECL cat_type BOOST_REGEX_CALL w32_cat_open(const std::string& name);
+BOOST_REGEX_DECL std::string BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::string& def);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL std::wstring BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type state_id, int i, const std::wstring& def);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL std::basic_string<unsigned short> BOOST_REGEX_CALL w32_cat_get(const cat_type& cat, lcid_type, int i, const std::basic_string<unsigned short>& def);
+#endif
+#endif
+BOOST_REGEX_DECL std::string BOOST_REGEX_CALL w32_transform(lcid_type state_id, const char* p1, const char* p2);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL std::wstring BOOST_REGEX_CALL w32_transform(lcid_type state_id, const wchar_t* p1, const wchar_t* p2);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL std::basic_string<unsigned short> BOOST_REGEX_CALL w32_transform(lcid_type state_id, const unsigned short* p1, const unsigned short* p2);
+#endif
+#endif
+BOOST_REGEX_DECL char BOOST_REGEX_CALL w32_tolower(char c, lcid_type);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL w32_tolower(wchar_t c, lcid_type);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL unsigned short BOOST_REGEX_CALL w32_tolower(unsigned short c, lcid_type state_id);
+#endif
+#endif
+BOOST_REGEX_DECL char BOOST_REGEX_CALL w32_toupper(char c, lcid_type);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL wchar_t BOOST_REGEX_CALL w32_toupper(wchar_t c, lcid_type);
+#endif
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, char c);
+#ifndef BOOST_NO_WREGEX
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type, boost::uint32_t mask, wchar_t c);
+#ifdef BOOST_REGEX_HAS_OTHER_WCHAR_T
+BOOST_REGEX_DECL bool BOOST_REGEX_CALL w32_is(lcid_type state_id, boost::uint32_t m, unsigned short c);
+#endif
+#endif
+//
+// class w32_regex_traits_base:
+// acts as a container for locale and the facets we are using.
+//
+template <class charT>
+struct w32_regex_traits_base
+{
+   w32_regex_traits_base(lcid_type l)
+   { imbue(l); }
+   lcid_type imbue(lcid_type l);
+
+   lcid_type m_locale;
+};
+
+template <class charT>
+inline lcid_type w32_regex_traits_base<charT>::imbue(lcid_type l)
+{
+   lcid_type result(m_locale);
+   m_locale = l;
+   return result;
+}
+
+//
+// class w32_regex_traits_char_layer:
+// implements methods that require specialisation for narrow characters:
+//
+template <class charT>
+class w32_regex_traits_char_layer : public w32_regex_traits_base<charT>
+{
+   typedef std::basic_string<charT> string_type;
+   typedef std::map<charT, regex_constants::syntax_type> map_type;
+   typedef typename map_type::const_iterator map_iterator_type;
+public:
+   w32_regex_traits_char_layer(const lcid_type l);
+
+   regex_constants::syntax_type syntax_type(charT c)const
+   {
+      map_iterator_type i = m_char_map.find(c);
+      return ((i == m_char_map.end()) ? 0 : i->second);
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(charT c) const
+   {
+      map_iterator_type i = m_char_map.find(c);
+      if(i == m_char_map.end())
+      {
+         if(::boost::re_detail::w32_is_lower(c, this->m_locale)) return regex_constants::escape_type_class;
+         if(::boost::re_detail::w32_is_upper(c, this->m_locale)) return regex_constants::escape_type_not_class;
+         return 0;
+      }
+      return i->second;
+   }
+   charT tolower(charT c)const
+   {
+      return ::boost::re_detail::w32_tolower(c, this->m_locale);
+   }
+   bool isctype(boost::uint32_t mask, charT c)const
+   {
+      return ::boost::re_detail::w32_is(this->m_locale, mask, c);
+   }
+
+private:
+   string_type get_default_message(regex_constants::syntax_type);
+   // TODO: use a hash table when available!
+   map_type m_char_map;
+};
+
+template <class charT>
+w32_regex_traits_char_layer<charT>::w32_regex_traits_char_layer(::boost::re_detail::lcid_type l) 
+   : w32_regex_traits_base<charT>(l)
+{
+   // we need to start by initialising our syntax map so we know which
+   // character is used for which purpose:
+   cat_type cat;
+   std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
+   if(cat_name.size())
+   {
+      cat = ::boost::re_detail::w32_cat_open(cat_name);
+      if(!cat)
+      {
+         std::string m("Unable to open message catalog: ");
+         std::runtime_error err(m + cat_name);
+         boost::re_detail::raise_runtime_error(err);
+      }
+   }
+   //
+   // if we have a valid catalog then load our messages:
+   //
+   if(cat)
+   {
+      for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
+      {
+         string_type mss = ::boost::re_detail::w32_cat_get(cat, this->m_locale, i, get_default_message(i));
+         for(typename string_type::size_type j = 0; j < mss.size(); ++j)
+         {
+            this->m_char_map[mss[j]] = i;
+         }
+      }
+   }
+   else
+   {
+      for(regex_constants::syntax_type i = 1; i < regex_constants::syntax_max; ++i)
+      {
+         const char* ptr = get_default_syntax(i);
+         while(ptr && *ptr)
+         {
+            this->m_char_map[static_cast<charT>(*ptr)] = i;
+            ++ptr;
+         }
+      }
+   }
+}
+
+template <class charT>
+typename w32_regex_traits_char_layer<charT>::string_type 
+   w32_regex_traits_char_layer<charT>::get_default_message(regex_constants::syntax_type i)
+{
+   const char* ptr = get_default_syntax(i);
+   string_type result;
+   while(ptr && *ptr)
+   {
+      result.append(1, static_cast<charT>(*ptr));
+      ++ptr;
+   }
+   return result;
+}
+
+//
+// specialised version for narrow characters:
+//
+template <>
+class BOOST_REGEX_DECL w32_regex_traits_char_layer<char> : public w32_regex_traits_base<char>
+{
+   typedef std::string string_type;
+public:
+   w32_regex_traits_char_layer(::boost::re_detail::lcid_type l)
+   : w32_regex_traits_base<char>(l)
+   {
+      init();
+   }
+
+   regex_constants::syntax_type syntax_type(char c)const
+   {
+      return m_char_map[static_cast<unsigned char>(c)];
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(char c) const
+   {
+      return m_char_map[static_cast<unsigned char>(c)];
+   }
+   char tolower(char c)const
+   {
+      return m_lower_map[static_cast<unsigned char>(c)];
+   }
+   bool isctype(boost::uint32_t mask, char c)const
+   {
+      return m_type_map[static_cast<unsigned char>(c)] & mask;
+   }
+
+private:
+   regex_constants::syntax_type m_char_map[1u << CHAR_BIT];
+   char m_lower_map[1u << CHAR_BIT];
+   boost::uint16_t m_type_map[1u << CHAR_BIT];
+   void init();
+};
+
+//
+// class w32_regex_traits_implementation:
+// provides pimpl implementation for w32_regex_traits.
+//
+template <class charT>
+class w32_regex_traits_implementation : public w32_regex_traits_char_layer<charT>
+{
+public:
+   typedef typename w32_regex_traits<charT>::char_class_type char_class_type;
+   BOOST_STATIC_CONSTANT(char_class_type, mask_word = 0x0400); // must be C1_DEFINED << 1
+   BOOST_STATIC_CONSTANT(char_class_type, mask_unicode = 0x0800); // must be C1_DEFINED << 2
+   BOOST_STATIC_CONSTANT(char_class_type, mask_base = 0x3ff);  // all the masks used by the CT_CTYPE1 group
+
+   typedef std::basic_string<charT> string_type;
+   typedef charT char_type;
+   w32_regex_traits_implementation(::boost::re_detail::lcid_type l);
+   std::string error_string(regex_constants::error_type n) const
+   {
+      if(!m_error_strings.empty())
+      {
+         std::map<int, std::string>::const_iterator p = m_error_strings.find(n);
+         return (p == m_error_strings.end()) ? std::string(get_default_error_string(n)) : p->second;
+      }
+      return get_default_error_string(n);
+   }
+   char_class_type lookup_classname(const charT* p1, const charT* p2) const
+   {
+      char_class_type result = lookup_classname_imp(p1, p2);
+      if(result == 0)
+      {
+         typedef typename string_type::size_type size_type;
+         string_type temp(p1, p2);
+         for(size_type i = 0; i < temp.size(); ++i)
+            temp[i] = this->tolower(temp[i]);
+         result = lookup_classname_imp(&*temp.begin(), &*temp.begin() + temp.size());
+      }
+      return result;
+   }
+   string_type lookup_collatename(const charT* p1, const charT* p2) const;
+   string_type transform_primary(const charT* p1, const charT* p2) const;
+   string_type transform(const charT* p1, const charT* p2) const
+   {
+      return ::boost::re_detail::w32_transform(this->m_locale, p1, p2);
+   }
+private:
+   std::map<int, std::string>     m_error_strings;   // error messages indexed by numberic ID
+   std::map<string_type, char_class_type>  m_custom_class_names; // character class names
+   std::map<string_type, string_type>      m_custom_collate_names; // collating element names
+   unsigned                       m_collate_type;    // the form of the collation string
+   charT                          m_collate_delim;   // the collation group delimiter
+   //
+   // helpers:
+   //
+   char_class_type lookup_classname_imp(const charT* p1, const charT* p2) const;
+};
+
+template <class charT>
+typename w32_regex_traits_implementation<charT>::string_type 
+   w32_regex_traits_implementation<charT>::transform_primary(const charT* p1, const charT* p2) const
+{
+   string_type result;
+   //
+   // What we do here depends upon the format of the sort key returned by
+   // sort key returned by this->transform:
+   //
+   switch(m_collate_type)
+   {
+   case sort_C:
+   case sort_unknown:
+      // the best we can do is translate to lower case, then get a regular sort key:
+      {
+         result.assign(p1, p2);
+         typedef typename string_type::size_type size_type;
+         for(size_type i = 0; i < result.size(); ++i)
+            result[i] = this->tolower(result[i]);
+         result = this->transform(&*result.begin(), &*result.begin() + result.size());
+         break;
+      }
+   case sort_fixed:
+      {
+         // get a regular sort key, and then truncate it:
+         result.assign(this->transform(p1, p2));
+         result.erase(this->m_collate_delim);
+         break;
+      }
+   case sort_delim:
+         // get a regular sort key, and then truncate everything after the delim:
+         result.assign(this->transform(p1, p2));
+         std::size_t i;
+         for(i = 0; i < result.size(); ++i)
+         {
+            if(result[i] == m_collate_delim)
+               break;
+         }
+         result.erase(i);
+         break;
+   }
+   if(result.empty())
+      result = string_type(1, charT(0));
+   return result;
+}
+
+template <class charT>
+typename w32_regex_traits_implementation<charT>::string_type 
+   w32_regex_traits_implementation<charT>::lookup_collatename(const charT* p1, const charT* p2) const
+{
+   typedef typename std::map<string_type, string_type>::const_iterator iter_type;
+   if(m_custom_collate_names.size())
+   {
+      iter_type pos = m_custom_collate_names.find(string_type(p1, p2));
+      if(pos != m_custom_collate_names.end())
+         return pos->second;
+   }
+#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
+               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\
+               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
+   std::string name(p1, p2);
+#else
+   std::string name;
+   const charT* p0 = p1;
+   while(p0 != p2)
+      name.append(1, char(*p0++));
+#endif
+   name = lookup_default_collate_name(name);
+#if !defined(BOOST_NO_TEMPLATED_ITERATOR_CONSTRUCTORS)\
+               && !BOOST_WORKAROUND(BOOST_MSVC, < 1300)\
+               && !BOOST_WORKAROUND(__BORLANDC__, <= 0x0551)
+   if(name.size())
+      return string_type(name.begin(), name.end());
+#else
+   if(name.size())
+   {
+      string_type result;
+      typedef std::string::const_iterator iter;
+      iter b = name.begin();
+      iter e = name.end();
+      while(b != e)
+         result.append(1, charT(*b++));
+      return result;
+   }
+#endif
+   if(p2 - p1 == 1)
+      return string_type(1, *p1);
+   return string_type();
+}
+
+template <class charT>
+w32_regex_traits_implementation<charT>::w32_regex_traits_implementation(::boost::re_detail::lcid_type l)
+: w32_regex_traits_char_layer<charT>(l)
+{
+   cat_type cat;
+   std::string cat_name(w32_regex_traits<charT>::get_catalog_name());
+   if(cat_name.size())
+   {
+      cat = ::boost::re_detail::w32_cat_open(cat_name);
+      if(!cat)
+      {
+         std::string m("Unable to open message catalog: ");
+         std::runtime_error err(m + cat_name);
+         boost::re_detail::raise_runtime_error(err);
+      }
+   }
+   //
+   // if we have a valid catalog then load our messages:
+   //
+   if(cat)
+   {
+      //
+      // Error messages:
+      //
+      for(boost::regex_constants::error_type i = static_cast<boost::regex_constants::error_type>(0); 
+         i <= boost::regex_constants::error_unknown; 
+         i = static_cast<boost::regex_constants::error_type>(i + 1))
+      {
+         const char* p = get_default_error_string(i);
+         string_type default_message;
+         while(*p)
+         {
+            default_message.append(1, static_cast<charT>(*p));
+            ++p;
+         }
+         string_type s = ::boost::re_detail::w32_cat_get(cat, this->m_locale, i+200, default_message);
+         std::string result;
+         for(std::string::size_type j = 0; j < s.size(); ++j)
+         {
+            result.append(1, static_cast<char>(s[j]));
+         }
+         m_error_strings[i] = result;
+      }
+      //
+      // Custom class names:
+      //
+      static const char_class_type masks[14] = 
+      {
+         0x0104u, // C1_ALPHA | C1_DIGIT
+         0x0100u, // C1_ALPHA
+         0x0020u, // C1_CNTRL
+         0x0004u, // C1_DIGIT
+         (~(0x0020u|0x0008u) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE
+         0x0002u, // C1_LOWER
+         (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL
+         0x0010u, // C1_PUNCT
+         0x0008u, // C1_SPACE
+         0x0001u, // C1_UPPER
+         0x0080u, // C1_XDIGIT
+         0x0040u, // C1_BLANK
+         w32_regex_traits_implementation<charT>::mask_word,
+         w32_regex_traits_implementation<charT>::mask_unicode,
+      };
+      static const string_type null_string;
+      for(unsigned int j = 0; j <= 13; ++j)
+      {
+         string_type s(::boost::re_detail::w32_cat_get(cat, this->m_locale, j+300, null_string));
+         if(s.size())
+            this->m_custom_class_names[s] = masks[j];
+      }
+   }
+   //
+   // get the collation format used by m_pcollate:
+   //
+   m_collate_type = re_detail::find_sort_syntax(this, &m_collate_delim);
+}
+
+template <class charT>
+typename w32_regex_traits_implementation<charT>::char_class_type 
+   w32_regex_traits_implementation<charT>::lookup_classname_imp(const charT* p1, const charT* p2) const
+{
+   static const char_class_type masks[20] = 
+   {
+      0,
+      0x0104u, // C1_ALPHA | C1_DIGIT
+      0x0100u, // C1_ALPHA
+      0x0040u, // C1_BLANK
+      0x0020u, // C1_CNTRL
+      0x0004u, // C1_DIGIT
+      0x0004u, // C1_DIGIT
+      (~(0x0020u|0x0008u|0x0040) & 0x01ffu) | 0x0400u, // not C1_CNTRL or C1_SPACE or C1_BLANK
+      0x0002u, // C1_LOWER
+      0x0002u, // C1_LOWER
+      (~0x0020u & 0x01ffu) | 0x0400, // not C1_CNTRL
+      0x0010u, // C1_PUNCT
+      0x0008u, // C1_SPACE
+      0x0008u, // C1_SPACE
+      0x0001u, // C1_UPPER
+      w32_regex_traits_implementation<charT>::mask_unicode,
+      0x0001u, // C1_UPPER
+      0x0104u | w32_regex_traits_implementation<charT>::mask_word, 
+      0x0104u | w32_regex_traits_implementation<charT>::mask_word, 
+      0x0080u, // C1_XDIGIT
+   };
+   if(m_custom_class_names.size())
+   {
+      typedef typename std::map<std::basic_string<charT>, char_class_type>::const_iterator map_iter;
+      map_iter pos = m_custom_class_names.find(string_type(p1, p2));
+      if(pos != m_custom_class_names.end())
+         return pos->second;
+   }
+   std::size_t state_id = 1 + re_detail::get_default_class_id(p1, p2);
+   if(state_id < sizeof(masks) / sizeof(masks[0]))
+      return masks[state_id];
+   return masks[0];
+}
+
+
+template <class charT>
+boost::shared_ptr<const w32_regex_traits_implementation<charT> > create_w32_regex_traits(::boost::re_detail::lcid_type l BOOST_APPEND_EXPLICIT_TEMPLATE_TYPE(charT))
+{
+   // TODO: create a cache for previously constructed objects.
+   return boost::object_cache< ::boost::re_detail::lcid_type, w32_regex_traits_implementation<charT> >::get(l, 5);
+}
+
+} // re_detail
+
+template <class charT>
+class w32_regex_traits
+{
+public:
+   typedef charT                         char_type;
+   typedef std::size_t                   size_type;
+   typedef std::basic_string<char_type>  string_type;
+   typedef ::boost::re_detail::lcid_type locale_type;
+   typedef boost::uint_least32_t         char_class_type;
+
+   struct boost_extensions_tag{};
+
+   w32_regex_traits()
+      : m_pimpl(re_detail::create_w32_regex_traits<charT>(::boost::re_detail::w32_get_default_locale()))
+   { }
+   static size_type length(const char_type* p)
+   {
+      return std::char_traits<charT>::length(p);
+   }
+   regex_constants::syntax_type syntax_type(charT c)const
+   {
+      return m_pimpl->syntax_type(c);
+   }
+   regex_constants::escape_syntax_type escape_syntax_type(charT c) const
+   {
+      return m_pimpl->escape_syntax_type(c);
+   }
+   charT translate(charT c) const
+   {
+      return c;
+   }
+   charT translate_nocase(charT c) const
+   {
+      return this->m_pimpl->tolower(c);
+   }
+   charT translate(charT c, bool icase) const
+   {
+      return icase ? this->m_pimpl->tolower(c) : c;
+   }
+   charT tolower(charT c) const
+   {
+      return this->m_pimpl->tolower(c);
+   }
+   charT toupper(charT c) const
+   {
+      return ::boost::re_detail::w32_toupper(c, this->m_pimpl->m_locale);
+   }
+   string_type transform(const charT* p1, const charT* p2) const
+   {
+      return ::boost::re_detail::w32_transform(this->m_pimpl->m_locale, p1, p2);
+   }
+   string_type transform_primary(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->transform_primary(p1, p2);
+   }
+   char_class_type lookup_classname(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->lookup_classname(p1, p2);
+   }
+   string_type lookup_collatename(const charT* p1, const charT* p2) const
+   {
+      return m_pimpl->lookup_collatename(p1, p2);
+   }
+   bool isctype(charT c, char_class_type f) const
+   {
+      if((f & re_detail::w32_regex_traits_implementation<charT>::mask_base) 
+         && (this->m_pimpl->isctype(f & re_detail::w32_regex_traits_implementation<charT>::mask_base, c)))
+         return true;
+      else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_unicode) && re_detail::is_extended(c))
+         return true;
+      else if((f & re_detail::w32_regex_traits_implementation<charT>::mask_word) && (c == '_'))
+         return true;
+      return false;
+   }
+   int toi(const charT*& p1, const charT* p2, int radix)const
+   {
+      return ::boost::re_detail::global_toi(p1, p2, radix, *this);
+   }
+   int value(charT c, int radix)const
+   {
+      int result = ::boost::re_detail::global_value(c);
+      return result < radix ? result : -1;
+   }
+   locale_type imbue(locale_type l)
+   {
+      ::boost::re_detail::lcid_type result(getloc());
+      m_pimpl = re_detail::create_w32_regex_traits<charT>(l);
+      return result;
+   }
+   locale_type getloc()const
+   {
+      return m_pimpl->m_locale;
+   }
+   std::string error_string(regex_constants::error_type n) const
+   {
+      return m_pimpl->error_string(n);
+   }
+
+   //
+   // extension:
+   // set the name of the message catalog in use (defaults to "boost_regex").
+   //
+   static std::string catalog_name(const std::string& name);
+   static std::string get_catalog_name();
+
+private:
+   boost::shared_ptr<const re_detail::w32_regex_traits_implementation<charT> > m_pimpl;
+   //
+   // catalog name handler:
+   //
+   static std::string& get_catalog_name_inst();
+
+#ifdef BOOST_HAS_THREADS
+   static static_mutex& get_mutex_inst();
+#endif
+};
+
+template <class charT>
+std::string w32_regex_traits<charT>::catalog_name(const std::string& name)
+{
+#ifdef BOOST_HAS_THREADS
+   static_mutex::scoped_lock lk(get_mutex_inst());
+#endif
+   std::string result(get_catalog_name_inst());
+   get_catalog_name_inst() = name;
+   return result;
+}
+
+template <class charT>
+std::string& w32_regex_traits<charT>::get_catalog_name_inst()
+{
+   static std::string s_name;
+   return s_name;
+}
+
+template <class charT>
+std::string w32_regex_traits<charT>::get_catalog_name()
+{
+#ifdef BOOST_HAS_THREADS
+   static_mutex::scoped_lock lk(get_mutex_inst());
+#endif
+   std::string result(get_catalog_name_inst());
+   return result;
+}
+
+#ifdef BOOST_HAS_THREADS
+template <class charT>
+static_mutex& w32_regex_traits<charT>::get_mutex_inst()
+{
+   static static_mutex s_mutex = BOOST_STATIC_MUTEX_INIT;
+   return s_mutex;
+}
+#endif
+
+
+} // boost
+
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#ifdef BOOST_MSVC
+#pragma warning(push)
+#pragma warning(disable: 4103)
+#endif
+#ifdef BOOST_HAS_ABI_HEADERS
+#  include BOOST_ABI_SUFFIX
+#endif
+#ifdef BOOST_MSVC
+#pragma warning(pop)
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/regex_fwd.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+/*
+ *
+ * Copyright (c) 1998-2002
+ * John Maddock
+ *
+ * Use, modification and distribution are subject to the 
+ * Boost Software License, Version 1.0. (See accompanying file 
+ * LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+ *
+ */
+
+ /*
+  *   LOCATION:    see http://www.boost.org/libs/regex for documentation.
+  *   FILE         regex_fwd.cpp
+  *   VERSION      see <boost/version.hpp>
+  *   DESCRIPTION: Forward declares boost::basic_regex<> and
+  *                associated typedefs.
+  */
+
+#ifndef BOOST_REGEX_FWD_HPP
+#define BOOST_REGEX_FWD_HPP
+
+#ifndef BOOST_REGEX_CONFIG_HPP
+#include <boost/regex/config.hpp>
+#endif
+
+#include <boost/regex/v4/regex_fwd.hpp>
+
+#endif
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/scoped_array.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,16 @@
+#ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
+#define BOOST_SCOPED_ARRAY_HPP_INCLUDED
+
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org/libs/smart_ptr/scoped_array.htm
+//
+
+#include <boost/smart_ptr/scoped_array.hpp>
+
+#endif  // #ifndef BOOST_SCOPED_ARRAY_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/scoped_ptr.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,16 @@
+#ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
+#define BOOST_SCOPED_PTR_HPP_INCLUDED
+
+//  (C) Copyright Greg Colvin and Beman Dawes 1998, 1999.
+//  Copyright (c) 2001, 2002 Peter Dimov
+//
+//  Distributed under the Boost Software License, Version 1.0. (See
+//  accompanying file LICENSE_1_0.txt or copy at
+//  http://www.boost.org/LICENSE_1_0.txt)
+//
+//  http://www.boost.org/libs/smart_ptr/scoped_ptr.htm
+//
+
+#include <boost/smart_ptr/scoped_ptr.hpp>
+
+#endif // #ifndef BOOST_SCOPED_PTR_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/config.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,75 @@
+//  boost/system/config.hpp  -------------------------------------------------//
+
+//  Copyright Beman Dawes 2003, 2006
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See http://www.boost.org/libs/system for documentation.
+
+#ifndef BOOST_SYSTEM_CONFIG_HPP                  
+#define BOOST_SYSTEM_CONFIG_HPP
+
+#include <boost/config.hpp>
+
+//  BOOST_POSIX_API or BOOST_WINDOWS_API specify which API to use.
+//  If not specified, a sensible default will be applied.
+
+# if defined( BOOST_WINDOWS_API ) && defined( BOOST_POSIX_API )
+#   error both BOOST_WINDOWS_API and BOOST_POSIX_API are defined
+# elif !defined( BOOST_WINDOWS_API ) && !defined( BOOST_POSIX_API )
+#   if defined(_WIN32) || defined(__WIN32__) || defined(WIN32) || defined(__CYGWIN__)
+#     define BOOST_WINDOWS_API
+#   else
+#     define BOOST_POSIX_API 
+#   endif
+# endif
+
+//  enable dynamic linking on Windows  ---------------------------------------//
+
+//#  if (defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SYSTEM_DYN_LINK)) && defined(__BORLANDC__) && defined(__WIN32__)
+//#    error Dynamic linking Boost.System does not work for Borland; use static linking instead
+//#  endif
+
+#ifdef BOOST_HAS_DECLSPEC // defined in config system
+// we need to import/export our code only if the user has specifically
+// asked for it by defining either BOOST_ALL_DYN_LINK if they want all boost
+// libraries to be dynamically linked, or BOOST_SYSTEM_DYN_LINK
+// if they want just this one to be dynamically liked:
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SYSTEM_DYN_LINK)
+// export if this is our own source, otherwise import:
+#ifdef BOOST_SYSTEM_SOURCE
+# define BOOST_SYSTEM_DECL __declspec(dllexport)
+#else
+# define BOOST_SYSTEM_DECL __declspec(dllimport)
+#endif  // BOOST_SYSTEM_SOURCE
+#endif  // DYN_LINK
+#endif  // BOOST_HAS_DECLSPEC
+//
+// if BOOST_SYSTEM_DECL isn't defined yet define it now:
+#ifndef BOOST_SYSTEM_DECL
+#define BOOST_SYSTEM_DECL
+#endif
+
+//  enable automatic library variant selection  ------------------------------// 
+
+#if !defined(BOOST_SYSTEM_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_SYSTEM_NO_LIB)
+//
+// Set the name of our library, this will get undef'ed by auto_link.hpp
+// once it's done with it:
+//
+#define BOOST_LIB_NAME boost_system
+//
+// If we're importing code from a dll, then tell auto_link.hpp about it:
+//
+#if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_SYSTEM_DYN_LINK)
+#  define BOOST_DYN_LINK
+#endif
+//
+// And include the header that does the work:
+//
+#include <boost/config/auto_link.hpp>
+#endif  // auto-linking disabled
+
+#endif // BOOST_SYSTEM_CONFIG_HPP
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/cygwin_error.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,56 @@
+//  boost/system/cygwin_error.hpp  -------------------------------------------//
+
+//  Copyright Beman Dawes 2007
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+#ifndef BOOST_CYGWIN_ERROR_HPP
+#define BOOST_CYGWIN_ERROR_HPP
+
+//  This header is effectively empty for compiles on operating systems where
+//  it is not applicable.
+
+# ifdef __CYGWIN__
+
+#include <boost/system/error_code.hpp>
+
+namespace boost
+{
+  namespace system
+  {
+    //  To construct an error_code after a API error:
+    //
+    //      error_code( errno, system_category )
+
+    //  User code should use the portable "posix" enums for POSIX errors; this
+    //  allows such code to be portable to non-POSIX systems. For the non-POSIX
+    //  errno values that POSIX-based systems typically provide in addition to 
+    //  POSIX values, use the system specific enums below.
+
+   namespace cygwin_error
+    {
+      enum cygwin_errno
+      {
+        no_net = ENONET,
+        no_package = ENOPKG,
+        no_share = ENOSHARE
+      };
+    }  // namespace cygwin_error
+
+    template<> struct is_error_code_enum<cygwin_error::cygwin_errno>
+      { static const bool value = true; };
+
+    namespace cygwin_error
+    {
+      inline error_code make_error_code( cygwin_errno e )
+        { return error_code( e, get_system_category() ); }
+    }
+  }
+}
+
+#endif  // __CYGWIN__
+
+#endif  // BOOST_CYGWIN_ERROR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/error_code.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,501 @@
+//  boost/system/error_code.hpp  ---------------------------------------------//
+
+//  Copyright Beman Dawes 2006, 2007
+//  Copyright Christoper Kohlhoff 2007
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+#ifndef BOOST_ERROR_CODE_HPP
+#define BOOST_ERROR_CODE_HPP
+
+#include <boost/system/config.hpp>
+#include <boost/cstdint.hpp>
+#include <boost/assert.hpp>
+#include <boost/operators.hpp>
+#include <boost/noncopyable.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <ostream>
+#include <string>
+#include <stdexcept>
+#include <functional>
+
+// TODO: undef these macros if not already defined
+#include <boost/cerrno.hpp> 
+
+#if !defined(BOOST_POSIX_API) && !defined(BOOST_WINDOWS_API)
+#  error BOOST_POSIX_API or BOOST_WINDOWS_API must be defined
+#endif
+
+#include <boost/config/abi_prefix.hpp> // must be the last #include
+
+namespace boost
+{
+  namespace system
+  {
+
+    class error_code;
+    class error_condition;
+
+    //  "Concept" helpers  ---------------------------------------------------//
+
+    template< class T >
+    struct is_error_code_enum { static const bool value = false; };
+
+    template< class T >
+    struct is_error_condition_enum { static const bool value = false; };
+
+    //  generic error_conditions  --------------------------------------------//
+
+    namespace errc
+    {
+      enum errc_t
+      {
+        success = 0,
+        address_family_not_supported = EAFNOSUPPORT,
+        address_in_use = EADDRINUSE,
+        address_not_available = EADDRNOTAVAIL,
+        already_connected = EISCONN,
+        argument_list_too_long = E2BIG,
+        argument_out_of_domain = EDOM,
+        bad_address = EFAULT,
+        bad_file_descriptor = EBADF,
+        bad_message = EBADMSG,
+        broken_pipe = EPIPE,
+        connection_aborted = ECONNABORTED,
+        connection_already_in_progress = EALREADY,
+        connection_refused = ECONNREFUSED,
+        connection_reset = ECONNRESET,
+        cross_device_link = EXDEV,
+        destination_address_required = EDESTADDRREQ,
+        device_or_resource_busy = EBUSY,
+        directory_not_empty = ENOTEMPTY,
+        executable_format_error = ENOEXEC,
+        file_exists = EEXIST,
+        file_too_large = EFBIG,
+        filename_too_long = ENAMETOOLONG,
+        function_not_supported = ENOSYS,
+        host_unreachable = EHOSTUNREACH,
+        identifier_removed = EIDRM,
+        illegal_byte_sequence = EILSEQ,
+        inappropriate_io_control_operation = ENOTTY,
+        interrupted = EINTR,
+        invalid_argument = EINVAL,
+        invalid_seek = ESPIPE,
+        io_error = EIO,
+        is_a_directory = EISDIR,
+        message_size = EMSGSIZE,
+        network_down = ENETDOWN,
+        network_reset = ENETRESET,
+        network_unreachable = ENETUNREACH,
+        no_buffer_space = ENOBUFS,
+        no_child_process = ECHILD,
+        no_link = ENOLINK,
+        no_lock_available = ENOLCK,
+        no_message_available = ENODATA,
+        no_message = ENOMSG,
+        no_protocol_option = ENOPROTOOPT,
+        no_space_on_device = ENOSPC,
+        no_stream_resources = ENOSR,
+        no_such_device_or_address = ENXIO,
+        no_such_device = ENODEV,
+        no_such_file_or_directory = ENOENT,
+        no_such_process = ESRCH,
+        not_a_directory = ENOTDIR,
+        not_a_socket = ENOTSOCK,
+        not_a_stream = ENOSTR,
+        not_connected = ENOTCONN,
+        not_enough_memory = ENOMEM,
+        not_supported = ENOTSUP,
+        operation_canceled = ECANCELED,
+        operation_in_progress = EINPROGRESS,
+        operation_not_permitted = EPERM,
+        operation_not_supported = EOPNOTSUPP,
+        operation_would_block = EWOULDBLOCK,
+        owner_dead = EOWNERDEAD,
+        permission_denied = EACCES,
+        protocol_error = EPROTO,
+        protocol_not_supported = EPROTONOSUPPORT,
+        read_only_file_system = EROFS,
+        resource_deadlock_would_occur = EDEADLK,
+        resource_unavailable_try_again = EAGAIN,
+        result_out_of_range = ERANGE,
+        state_not_recoverable = ENOTRECOVERABLE,
+        stream_timeout = ETIME,
+        text_file_busy = ETXTBSY,
+        timed_out = ETIMEDOUT,
+        too_many_files_open_in_system = ENFILE,
+        too_many_files_open = EMFILE,
+        too_many_links = EMLINK,
+        too_many_synbolic_link_levels = ELOOP,
+        value_too_large = EOVERFLOW,
+        wrong_protocol_type = EPROTOTYPE
+      };
+
+    } // namespace errc
+
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+    namespace posix = errc;
+    namespace posix_error = errc;
+# endif
+
+    template<> struct is_error_condition_enum<errc::errc_t>
+      { static const bool value = true; };
+
+
+    //  ----------------------------------------------------------------------//
+
+    //  Operating system specific interfaces  --------------------------------//
+
+
+    //  The interface is divided into general and system-specific portions to
+    //  meet these requirements:
+    //
+    //  * Code calling an operating system API can create an error_code with
+    //    a single category (system_category), even for POSIX-like operating
+    //    systems that return some POSIX errno values and some native errno
+    //    values. This code should not have to pay the cost of distinguishing
+    //    between categories, since it is not yet known if that is needed.
+    //
+    //  * Users wishing to write system-specific code should be given enums for
+    //    at least the common error cases.
+    //
+    //  * System specific code should fail at compile time if moved to another
+    //    operating system.
+
+    //  The system specific portions of the interface are located in headers
+    //  with names reflecting the operating system. For example,
+    //
+    //       <boost/system/cygwin_error.hpp>
+    //       <boost/system/linux_error.hpp>
+    //       <boost/system/windows_error.hpp>
+    //
+    //  These headers are effectively empty for compiles on operating systems
+    //  where they are not applicable.
+
+    //  ----------------------------------------------------------------------//
+
+    //  class error_category  ------------------------------------------------//
+
+    class error_category : public noncopyable
+    {
+    public:
+      virtual ~error_category(){}
+      virtual inline const char *    name() const;  // see implementation note below
+      virtual inline std::string     message( int ev ) const;   // see implementation note below
+      virtual inline error_condition default_error_condition( int ev ) const;
+      virtual inline bool equivalent( int code, const error_condition & condition ) const;
+      virtual inline bool equivalent( const error_code & code, int condition ) const;
+
+      bool operator==(const error_category & rhs) const { return this == &rhs; }
+      bool operator!=(const error_category & rhs) const { return this != &rhs; }
+      bool operator<( const error_category & rhs ) const
+      {
+        return std::less<const error_category*>()( this, &rhs );
+      }
+    };
+
+    //  predefined error categories  -----------------------------------------//
+
+    BOOST_SYSTEM_DECL const error_category &  get_system_category();
+    BOOST_SYSTEM_DECL const error_category &  get_generic_category();
+
+    static const error_category &  system_category = get_system_category();
+    static const error_category &  generic_category = get_generic_category();
+    
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+    //  deprecated synonyms
+    inline const error_category &  get_posix_category() { return get_generic_category(); }
+    static const error_category &  posix_category = get_generic_category();
+    static const error_category &  errno_ecat     = get_generic_category();
+    static const error_category &  native_ecat    = get_system_category();
+# endif
+
+    //  class error_condition  -----------------------------------------------//
+
+    //  error_conditions are portable, error_codes are system or library specific
+
+    class error_condition
+    {
+    public:
+
+      // constructors:
+      error_condition() : m_val(0), m_cat(&get_generic_category()) {}
+      error_condition( int val, const error_category & cat ) : m_val(val), m_cat(&cat) {}
+
+      template <class ErrorConditionEnum>
+        error_condition(ErrorConditionEnum e,
+          typename boost::enable_if<is_error_condition_enum<ErrorConditionEnum> >::type* = 0)
+      {
+        *this = make_error_condition(e);
+      }
+
+      // modifiers:
+
+      void assign( int val, const error_category & cat )
+      { 
+        m_val = val;
+        m_cat = &cat;
+      }
+                                             
+      template<typename ErrorConditionEnum>
+        typename boost::enable_if<is_error_condition_enum<ErrorConditionEnum>, error_condition>::type &
+          operator=( ErrorConditionEnum val )
+      { 
+        *this = make_error_condition(val);
+        return *this;
+      }
+
+      void clear()
+      {
+        m_val = 0;
+        m_cat = &get_generic_category();
+      }
+
+      // observers:
+      int                     value() const    { return m_val; }
+      const error_category &  category() const { return *m_cat; }
+      std::string             message() const  { return m_cat->message(value()); }
+
+      typedef void (*unspecified_bool_type)();
+      static void unspecified_bool_true() {}
+
+      operator unspecified_bool_type() const  // true if error
+      { 
+        return m_val == 0 ? 0 : unspecified_bool_true;
+      }
+
+      bool operator!() const  // true if no error
+      {
+        return m_val == 0;
+      }
+
+      // relationals:
+      //  the more symmetrical non-member syntax allows enum
+      //  conversions work for both rhs and lhs.
+      inline friend bool operator==( const error_condition & lhs,
+                                     const error_condition & rhs )
+      {
+        return lhs.m_cat == rhs.m_cat && lhs.m_val == rhs.m_val;
+      }                  
+
+      inline friend bool operator<( const error_condition & lhs,
+                                    const error_condition & rhs )
+        //  the more symmetrical non-member syntax allows enum
+        //  conversions work for both rhs and lhs.
+      {
+        return lhs.m_cat < rhs.m_cat
+          || (lhs.m_cat == rhs.m_cat && lhs.m_val < rhs.m_val);
+      }
+
+    private:
+      int                     m_val;
+      const error_category *  m_cat;
+
+    };
+
+    //  class error_code  ----------------------------------------------------//
+
+    //  We want error_code to be a value type that can be copied without slicing
+    //  and without requiring heap allocation, but we also want it to have
+    //  polymorphic behavior based on the error category. This is achieved by
+    //  abstract base class error_category supplying the polymorphic behavior,
+    //  and error_code containing a pointer to an object of a type derived
+    //  from error_category.
+    class error_code
+    {
+    public:
+
+      // constructors:
+      error_code() : m_val(0), m_cat(&get_system_category()) {}
+      error_code( int val, const error_category & cat ) : m_val(val), m_cat(&cat) {}
+
+      template <class ErrorCodeEnum>
+        error_code(ErrorCodeEnum e,
+          typename boost::enable_if<is_error_code_enum<ErrorCodeEnum> >::type* = 0)
+      {
+        *this = make_error_code(e);
+      }
+
+      // modifiers:
+      void assign( int val, const error_category & cat )
+      { 
+        m_val = val;
+        m_cat = &cat;
+      }
+                                             
+      template<typename ErrorCodeEnum>
+        typename boost::enable_if<is_error_code_enum<ErrorCodeEnum>, error_code>::type &
+          operator=( ErrorCodeEnum val )
+      { 
+        *this = make_error_code(val);
+        return *this;
+      }
+
+      void clear()
+      {
+        m_val = 0;
+        m_cat = &get_system_category();
+      }
+
+      // observers:
+      int                     value() const    { return m_val; }
+      const error_category &  category() const { return *m_cat; }
+      error_condition         default_error_condition() const  { return m_cat->default_error_condition(value()); }
+      std::string             message() const  { return m_cat->message(value()); }
+
+      typedef void (*unspecified_bool_type)();
+      static void unspecified_bool_true() {}
+
+      operator unspecified_bool_type() const  // true if error
+      { 
+        return m_val == 0 ? 0 : unspecified_bool_true;
+      }
+
+      bool operator!() const  // true if no error
+      {
+        return m_val == 0;
+      }
+
+      // relationals:
+      inline friend bool operator==( const error_code & lhs,
+                                     const error_code & rhs )
+        //  the more symmetrical non-member syntax allows enum
+        //  conversions work for both rhs and lhs.
+      {
+        return lhs.m_cat == rhs.m_cat && lhs.m_val == rhs.m_val;
+      }
+
+      inline friend bool operator<( const error_code & lhs,
+                                    const error_code & rhs )
+        //  the more symmetrical non-member syntax allows enum
+        //  conversions work for both rhs and lhs.
+      {
+        return lhs.m_cat < rhs.m_cat
+          || (lhs.m_cat == rhs.m_cat && lhs.m_val < rhs.m_val);
+      }
+                  
+      private:
+      int                     m_val;
+      const error_category *  m_cat;
+
+    };
+
+    //  predefined error_code object used as "throw on error" tag
+    BOOST_SYSTEM_DECL extern error_code throws;
+
+    //  non-member functions  ------------------------------------------------//
+
+    inline bool operator!=( const error_code & lhs,
+                            const error_code & rhs )
+    {
+      return !(lhs == rhs);
+    }
+
+    inline bool operator!=( const error_condition & lhs,
+                            const error_condition & rhs )
+    {
+      return !(lhs == rhs);
+    }
+
+    inline bool operator==( const error_code & code,
+                            const error_condition & condition )
+    {
+      return code.category().equivalent( code.value(), condition )
+        || condition.category().equivalent( code, condition.value() );
+    }
+                
+    inline bool operator!=( const error_code & lhs,
+                            const error_condition & rhs )
+    {
+      return !(lhs == rhs);
+    }
+                
+    inline bool operator==( const error_condition & condition,
+                            const error_code & code )
+    {
+      return condition.category().equivalent( code, condition.value() )
+        || code.category().equivalent( code.value(), condition );
+    }
+                
+    inline bool operator!=( const error_condition & lhs,
+                            const error_code & rhs )
+    {
+      return !(lhs == rhs);
+    }
+                  
+    // TODO: both of these may move elsewhere, but the LWG hasn't spoken yet.
+
+    template <class charT, class traits>
+    inline std::basic_ostream<charT,traits>&
+      operator<< (std::basic_ostream<charT,traits>& os, error_code ec)
+    {
+      os << ec.category().name() << ':' << ec.value();
+      return os;
+    }
+
+    inline std::size_t hash_value( const error_code & ec )
+    {
+      return static_cast<std::size_t>(ec.value())
+        + reinterpret_cast<std::size_t>(&ec.category());
+    }
+
+    //  make_* functions for errc::errc_t  -----------------------------//
+
+    namespace errc
+    {
+      //  explicit conversion:
+      inline error_code make_error_code( errc_t e )
+        { return error_code( e, get_generic_category() ); }
+
+      //  implicit conversion:
+      inline error_condition make_error_condition( errc_t e )
+        { return error_condition( e, get_generic_category() ); }
+    }
+
+    //  error_category default implementation  -------------------------------//
+
+    inline error_condition error_category::default_error_condition( int ev ) const
+    { 
+      return error_condition( ev, *this );
+    }
+
+    inline bool error_category::equivalent( int code,
+      const error_condition & condition ) const
+    {
+      return default_error_condition( code ) == condition;
+    }
+
+    inline bool error_category::equivalent( const error_code & code,
+      int condition ) const
+    {
+      return *this == code.category() && code.value() == condition;
+    }
+
+    //  error_category implementation note: VC++ 8.0 objects to name() and
+    //  message() being pure virtual functions. Thus these implementations.
+    inline const char * error_category::name() const
+    { 
+      return "error: should never be called";
+    }
+
+    inline std::string error_category::message( int ) const
+    { 
+      static std::string s("error: should never be called");
+      return s;
+    }
+
+  } // namespace system
+} // namespace boost
+
+#include <boost/config/abi_suffix.hpp> // pops abi_prefix.hpp pragmas
+
+# ifdef BOOST_ERROR_CODE_HEADER_ONLY
+#   include <boost/../libs/system/src/error_code.cpp>
+# endif
+
+#endif // BOOST_ERROR_CODE_HPP
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/linux_error.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,110 @@
+//  boost/system/linux_error.hpp  -------------------------------------------//
+
+//  Copyright Beman Dawes 2007
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+#ifndef BOOST_LINUX_ERROR_HPP
+#define BOOST_LINUX_ERROR_HPP
+
+//  This header is effectively empty for compiles on operating systems where
+//  it is not applicable.
+
+#if defined(linux) || defined(__linux) || defined(__linux__)
+
+#include <boost/system/error_code.hpp>
+
+namespace boost
+{
+  namespace system
+  {
+    //  To construct an error_code after a API error:
+    //
+    //      error_code( errno, system_category )
+
+    //  User code should use the portable "posix" enums for POSIX errors; this
+    //  allows such code to be portable to non-POSIX systems. For the non-POSIX
+    //  errno values that POSIX-based systems typically provide in addition to 
+    //  POSIX values, use the system specific enums below.
+
+    namespace linux_error
+    {
+      enum linux_errno
+      {
+        advertise_error = EADV,
+        bad_exchange = EBADE,
+        bad_file_number = EBADFD,
+        bad_font_format = EBFONT,
+        bad_request_code = EBADRQC,
+        bad_request_descriptor = EBADR,
+        bad_slot = EBADSLT,
+        channel_range = ECHRNG,
+        communication_error = ECOMM,
+        dot_dot_error = EDOTDOT,
+        exchange_full = EXFULL,
+        host_down = EHOSTDOWN,
+        is_named_file_type= EISNAM,
+        key_expired = EKEYEXPIRED,
+        key_rejected = EKEYREJECTED,
+        key_revoked = EKEYREVOKED,
+        level2_halt= EL2HLT,
+        level2_no_syncronized= EL2NSYNC,
+        level3_halt = EL3HLT,
+        level3_reset = EL3RST,
+        link_range = ELNRNG,
+        medium_type = EMEDIUMTYPE,
+        no_anode= ENOANO,
+        no_block_device = ENOTBLK,
+        no_csi = ENOCSI,
+        no_key = ENOKEY,
+        no_medium = ENOMEDIUM,
+        no_network = ENONET,
+        no_package = ENOPKG,
+        not_avail = ENAVAIL,
+        not_named_file_type= ENOTNAM,
+        not_recoverable = ENOTRECOVERABLE,
+        not_unique = ENOTUNIQ,
+        owner_dead = EOWNERDEAD,
+        protocol_no_supported = EPFNOSUPPORT,
+        remote_address_changed = EREMCHG,
+        remote_io_error = EREMOTEIO,
+        remote_object = EREMOTE,
+        restart_needed = ERESTART,
+        shared_library_access = ELIBACC,
+        shared_library_bad = ELIBBAD,
+        shared_library_execute = ELIBEXEC,
+        shared_library_max_ = ELIBMAX,
+        shared_library_section= ELIBSCN,
+        shutdown = ESHUTDOWN,
+        socket_type_not_supported = ESOCKTNOSUPPORT,
+        srmount_error = ESRMNT,
+        stream_pipe_error = ESTRPIPE,
+        too_many_references = ETOOMANYREFS,
+        too_many_users = EUSERS,
+        unattached = EUNATCH,
+        unclean = EUCLEAN
+      };
+    }  // namespace linux_error
+
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+    namespace Linux = linux_error;
+# endif
+
+    template<> struct is_error_code_enum<linux_error::linux_errno>
+      { static const bool value = true; };
+
+    namespace linux_error
+    {
+      inline error_code make_error_code( linux_errno e )
+        { return error_code( e, get_system_category() ); }
+    }
+
+  }  // namespace system
+}  // namespace boost 
+
+#endif  // Linux
+
+#endif  // BOOST_LINUX_ERROR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/system_error.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,81 @@
+//  Boost system_error.hpp  --------------------------------------------------//
+
+//  Copyright Beman Dawes 2006
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_SYSTEM_ERROR_HPP
+#define BOOST_SYSTEM_ERROR_HPP
+
+#include <string>
+#include <stdexcept>
+#include <cassert>
+#include <boost/system/error_code.hpp>
+
+namespace boost
+{
+  namespace system
+  {
+    //  class system_error  --------------------------------------------------//
+
+    class system_error : public std::runtime_error
+    {
+    public:
+      system_error( error_code ec )
+          : std::runtime_error(""), m_error_code(ec) {}
+
+      system_error( error_code ec, const std::string & what_arg )
+          : std::runtime_error(what_arg), m_error_code(ec) {}
+
+      system_error( error_code ec, const char* what_arg )
+          : std::runtime_error(what_arg), m_error_code(ec) {}
+
+      system_error( int ev, const error_category & ecat )
+          : std::runtime_error(""), m_error_code(ev,ecat) {}
+
+      system_error( int ev, const error_category & ecat,
+        const std::string & what_arg )
+          : std::runtime_error(what_arg), m_error_code(ev,ecat) {}
+
+      system_error( int ev, const error_category & ecat,
+        const char * what_arg )
+          : std::runtime_error(what_arg), m_error_code(ev,ecat) {}
+
+      virtual ~system_error() throw() {}
+
+      const error_code &  code() const throw() { return m_error_code; }
+      const char *        what() const throw();
+
+    private:
+      error_code           m_error_code;
+      mutable std::string  m_what;
+    };
+
+    //  implementation  ------------------------------------------------------//
+
+    inline const char * system_error::what() const throw()
+    // see http://www.boost.org/more/error_handling.html for lazy build rationale
+    {
+      if ( m_what.empty() )
+      {
+        try
+        {
+          m_what = this->std::runtime_error::what();
+          if ( m_error_code )
+          {
+            if ( !m_what.empty() ) m_what += ": ";
+            m_what += m_error_code.message();
+          }
+        }
+        catch (...) { return std::runtime_error::what(); }
+      }
+      return m_what.c_str();
+    }
+
+  } // namespace system
+} // namespace boost
+
+#endif // BOOST_SYSTEM_ERROR_HPP
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/system/windows_error.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,118 @@
+//  boost/system/windows_error.hpp  ------------------------------------------//
+
+//  Copyright Beman Dawes 2007
+
+//  Distributed under the Boost Software License, Version 1.0. (See accompanying
+//  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//  See library home page at http://www.boost.org/libs/system
+
+#ifndef BOOST_WINDOWS_ERROR_HPP
+#define BOOST_WINDOWS_ERROR_HPP
+
+//  This header is effectively empty for compiles on operating systems where
+//  it is not applicable.
+
+#include <boost/system/config.hpp>
+
+#ifdef BOOST_WINDOWS_API
+
+#include <boost/system/error_code.hpp>
+#include <winerror.h>
+
+namespace boost
+{
+  namespace system
+  {
+
+    //  Microsoft Windows  ---------------------------------------------------//
+
+    //  To construct an error_code after a API error:
+    //
+    //      error_code( ::GetLastError(), system_category )
+
+    namespace windows_error
+    {
+      enum windows_error_code
+      {
+        success = 0,
+        // These names and values are based on Windows winerror.h
+        invalid_function = ERROR_INVALID_FUNCTION,
+        file_not_found = ERROR_FILE_NOT_FOUND,
+        path_not_found = ERROR_PATH_NOT_FOUND,
+        too_many_open_files = ERROR_TOO_MANY_OPEN_FILES,
+        access_denied = ERROR_ACCESS_DENIED,
+        invalid_handle = ERROR_INVALID_HANDLE,
+        arena_trashed = ERROR_ARENA_TRASHED,
+        not_enough_memory = ERROR_NOT_ENOUGH_MEMORY,
+        invalid_block = ERROR_INVALID_BLOCK,
+        bad_environment = ERROR_BAD_ENVIRONMENT,
+        bad_format = ERROR_BAD_FORMAT,
+        invalid_access = ERROR_INVALID_ACCESS,
+        outofmemory = ERROR_OUTOFMEMORY,
+        invalid_drive = ERROR_INVALID_DRIVE,
+        current_directory = ERROR_CURRENT_DIRECTORY,
+        not_same_device = ERROR_NOT_SAME_DEVICE,
+        no_more_files = ERROR_NO_MORE_FILES,
+        write_protect = ERROR_WRITE_PROTECT,
+        bad_unit = ERROR_BAD_UNIT,
+        not_ready = ERROR_NOT_READY,
+        bad_command = ERROR_BAD_COMMAND,
+        crc = ERROR_CRC,
+        bad_length = ERROR_BAD_LENGTH,
+        seek = ERROR_SEEK,
+        not_dos_disk = ERROR_NOT_DOS_DISK,
+        sector_not_found = ERROR_SECTOR_NOT_FOUND,
+        out_of_paper = ERROR_OUT_OF_PAPER,
+        write_fault = ERROR_WRITE_FAULT,
+        read_fault = ERROR_READ_FAULT,
+        gen_failure = ERROR_GEN_FAILURE,
+        sharing_violation = ERROR_SHARING_VIOLATION,
+        lock_violation = ERROR_LOCK_VIOLATION,
+        wrong_disk = ERROR_WRONG_DISK,
+        sharing_buffer_exceeded = ERROR_SHARING_BUFFER_EXCEEDED,
+        handle_eof = ERROR_HANDLE_EOF,
+        handle_disk_full= ERROR_HANDLE_DISK_FULL,
+        rem_not_list = ERROR_REM_NOT_LIST,
+        dup_name = ERROR_DUP_NAME,
+        bad_net_path = ERROR_BAD_NETPATH,
+        network_busy = ERROR_NETWORK_BUSY,
+        // ...
+        file_exists = ERROR_FILE_EXISTS,
+        cannot_make = ERROR_CANNOT_MAKE,
+        // ...
+        broken_pipe = ERROR_BROKEN_PIPE,
+        open_failed = ERROR_OPEN_FAILED,
+        buffer_overflow = ERROR_BUFFER_OVERFLOW,
+        disk_full= ERROR_DISK_FULL,
+        // ...
+        lock_failed = ERROR_LOCK_FAILED,
+        busy = ERROR_BUSY,
+        cancel_violation = ERROR_CANCEL_VIOLATION,
+        already_exists = ERROR_ALREADY_EXISTS
+        // ...
+
+        // TODO: add more Windows errors
+      };
+
+    }  // namespace windows
+
+# ifndef BOOST_SYSTEM_NO_DEPRECATED
+    namespace windows = windows_error;
+# endif
+
+    template<> struct is_error_code_enum<windows_error::windows_error_code>
+      { static const bool value = true; };
+
+    namespace windows_error
+    {
+      inline error_code make_error_code( windows_error_code e )
+        { return error_code( e, get_system_category() ); }
+    }
+
+  }  // namespace system
+}  // namespace boost
+
+#endif  // BOOST_WINDOWS_API
+
+#endif  // BOOST_WINDOWS_ERROR_HPP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/array.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,88 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_ARRAY_HPP_INCLUDED
+#  define BOOST_TR1_ARRAY_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_ARRAY
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(array)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(array))
+#  endif
+
+#else
+
+#include <boost/array.hpp>
+#include <boost/static_assert.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/detail/workaround.hpp>
+
+namespace std{ namespace tr1{
+
+using ::boost::array;
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
+// [6.1.3.2] Tuple creation functions
+using ::boost::swap;
+#endif
+
+#if !defined(BOOST_TR1_USE_OLD_TUPLE)
+}} namespace boost{ namespace fusion{
+#endif
+
+// [6.2.2.5] Tuple interface to class template array
+template <class T> struct tuple_size; // forward declaration
+template <int I, class T> struct tuple_element; // forward declaration
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+template <class T, size_t N>
+struct tuple_size< ::boost::array<T, N> >
+   : public ::boost::integral_constant< ::std::size_t, N>{};
+
+
+template <int I, class T, size_t N>
+struct tuple_element<I, ::boost::array<T, N> >
+{
+#if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x570))
+   BOOST_STATIC_ASSERT(I < (int)N);
+   BOOST_STATIC_ASSERT(I >= 0);
+#endif
+   typedef T type;
+};
+#endif
+template <int I, class T, size_t N>
+T& get( ::boost::array<T, N>& a)
+{
+   BOOST_STATIC_ASSERT(I < N);
+   BOOST_STATIC_ASSERT(I >= 0);
+   return a[I];
+}
+
+template <int I, class T, size_t N>
+const T& get(const array<T, N>& a)
+{
+   BOOST_STATIC_ASSERT(I < N);
+   BOOST_STATIC_ASSERT(I >= 0);
+   return a[I];
+}
+
+#if !defined(BOOST_TR1_USE_OLD_TUPLE)
+}} namespace std{ namespace tr1{
+
+   using ::boost::fusion::tuple_size;
+   using ::boost::fusion::tuple_element;
+   using ::boost::fusion::get;
+
+#endif
+
+
+} } // namespaces
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/cmath.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,267 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_CMATH_HPP_INCLUDED
+#  define BOOST_TR1_CMATH_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_CMATH
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(cmath)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_HEADER(cmath)
+#  endif
+
+#else
+
+#include <boost/math/tr1.hpp>
+
+namespace std{ namespace tr1{
+
+using boost::math::tr1::assoc_laguerre;
+using boost::math::tr1::assoc_laguerref;
+using boost::math::tr1::assoc_laguerrel;
+// [5.2.1.2] associated Legendre functions:
+using boost::math::tr1::assoc_legendre;
+using boost::math::tr1::assoc_legendref;
+using boost::math::tr1::assoc_legendrel;
+// [5.2.1.3] beta function:
+using boost::math::tr1::beta;
+using boost::math::tr1::betaf;
+using boost::math::tr1::betal;
+// [5.2.1.4] (complete) elliptic integral of the first kind:
+using boost::math::tr1::comp_ellint_1;
+using boost::math::tr1::comp_ellint_1f;
+using boost::math::tr1::comp_ellint_1l;
+// [5.2.1.5] (complete) elliptic integral of the second kind:
+using boost::math::tr1::comp_ellint_2;
+using boost::math::tr1::comp_ellint_2f;
+using boost::math::tr1::comp_ellint_2l;
+// [5.2.1.6] (complete) elliptic integral of the third kind:
+using boost::math::tr1::comp_ellint_3;
+using boost::math::tr1::comp_ellint_3f;
+using boost::math::tr1::comp_ellint_3l;
+#if 0
+// [5.2.1.7] confluent hypergeometric functions:
+using boost::math::tr1::conf_hyperg;
+using boost::math::tr1::conf_hypergf;
+using boost::math::tr1::conf_hypergl;
+#endif
+// [5.2.1.8] regular modified cylindrical Bessel functions:
+using boost::math::tr1::cyl_bessel_i;
+using boost::math::tr1::cyl_bessel_if;
+using boost::math::tr1::cyl_bessel_il;
+// [5.2.1.9] cylindrical Bessel functions (of the first kind):
+using boost::math::tr1::cyl_bessel_j;
+using boost::math::tr1::cyl_bessel_jf;
+using boost::math::tr1::cyl_bessel_jl;
+// [5.2.1.10] irregular modified cylindrical Bessel functions:
+using boost::math::tr1::cyl_bessel_k;
+using boost::math::tr1::cyl_bessel_kf;
+using boost::math::tr1::cyl_bessel_kl;
+// [5.2.1.11] cylindrical Neumann functions;
+// cylindrical Bessel functions (of the second kind):
+using boost::math::tr1::cyl_neumann;
+using boost::math::tr1::cyl_neumannf;
+using boost::math::tr1::cyl_neumannl;
+// [5.2.1.12] (incomplete) elliptic integral of the first kind:
+using boost::math::tr1::ellint_1;
+using boost::math::tr1::ellint_1f;
+using boost::math::tr1::ellint_1l;
+// [5.2.1.13] (incomplete) elliptic integral of the second kind:
+using boost::math::tr1::ellint_2;
+using boost::math::tr1::ellint_2f;
+using boost::math::tr1::ellint_2l;
+// [5.2.1.14] (incomplete) elliptic integral of the third kind:
+using boost::math::tr1::ellint_3;
+using boost::math::tr1::ellint_3f;
+using boost::math::tr1::ellint_3l;
+// [5.2.1.15] exponential integral:
+using boost::math::tr1::expint;
+using boost::math::tr1::expintf;
+using boost::math::tr1::expintl;
+// [5.2.1.16] Hermite polynomials:
+using boost::math::tr1::hermite;
+using boost::math::tr1::hermitef;
+using boost::math::tr1::hermitel;
+#if 0
+// [5.2.1.17] hypergeometric functions:
+using boost::math::tr1::hyperg;
+using boost::math::tr1::hypergf;
+using boost::math::tr1::hypergl;
+#endif
+// [5.2.1.18] Laguerre polynomials:
+using boost::math::tr1::laguerre;
+using boost::math::tr1::laguerref;
+using boost::math::tr1::laguerrel;
+// [5.2.1.19] Legendre polynomials:
+using boost::math::tr1::legendre;
+using boost::math::tr1::legendref;
+using boost::math::tr1::legendrel;
+// [5.2.1.20] Riemann zeta function:
+using boost::math::tr1::riemann_zeta;
+using boost::math::tr1::riemann_zetaf;
+using boost::math::tr1::riemann_zetal;
+// [5.2.1.21] spherical Bessel functions (of the first kind):
+using boost::math::tr1::sph_bessel;
+using boost::math::tr1::sph_besself;
+using boost::math::tr1::sph_bessell;
+// [5.2.1.22] spherical associated Legendre functions:
+using boost::math::tr1::sph_legendre;
+using boost::math::tr1::sph_legendref;
+using boost::math::tr1::sph_legendrel;
+// [5.2.1.23] spherical Neumann functions;
+// spherical Bessel functions (of the second kind):
+using boost::math::tr1::sph_neumann;
+using boost::math::tr1::sph_neumannf;
+using boost::math::tr1::sph_neumannl;
+
+// types
+using boost::math::tr1::double_t;
+using boost::math::tr1::float_t;
+// functions
+using boost::math::tr1::acosh;
+using boost::math::tr1::acoshf;
+using boost::math::tr1::acoshl;
+using boost::math::tr1::asinh;
+using boost::math::tr1::asinhf;
+using boost::math::tr1::asinhl;
+using boost::math::tr1::atanh;
+using boost::math::tr1::atanhf;
+using boost::math::tr1::atanhl;
+using boost::math::tr1::cbrt;
+using boost::math::tr1::cbrtf;
+using boost::math::tr1::cbrtl;
+using boost::math::tr1::copysign;
+using boost::math::tr1::copysignf;
+using boost::math::tr1::copysignl;
+using boost::math::tr1::erf;
+using boost::math::tr1::erff;
+using boost::math::tr1::erfl;
+using boost::math::tr1::erfc;
+using boost::math::tr1::erfcf;
+using boost::math::tr1::erfcl;
+#if 0
+using boost::math::tr1::exp2;
+using boost::math::tr1::exp2f;
+using boost::math::tr1::exp2l;
+#endif
+using boost::math::tr1::expm1;
+using boost::math::tr1::expm1f;
+using boost::math::tr1::expm1l;
+#if 0
+using boost::math::tr1::fdim;
+using boost::math::tr1::fdimf;
+using boost::math::tr1::fdiml;
+using boost::math::tr1::fma;
+using boost::math::tr1::fmaf;
+using boost::math::tr1::fmal;
+#endif
+using boost::math::tr1::fmax;
+using boost::math::tr1::fmaxf;
+using boost::math::tr1::fmaxl;
+using boost::math::tr1::fmin;
+using boost::math::tr1::fminf;
+using boost::math::tr1::fminl;
+using boost::math::tr1::hypot;
+using boost::math::tr1::hypotf;
+using boost::math::tr1::hypotl;
+#if 0
+using boost::math::tr1::ilogb;
+using boost::math::tr1::ilogbf;
+using boost::math::tr1::ilogbl;
+#endif
+using boost::math::tr1::lgamma;
+using boost::math::tr1::lgammaf;
+using boost::math::tr1::lgammal;
+#if 0
+using boost::math::tr1::llrint;
+using boost::math::tr1::llrintf;
+using boost::math::tr1::llrintl;
+#endif
+using boost::math::tr1::llround;
+using boost::math::tr1::llroundf;
+using boost::math::tr1::llroundl;
+using boost::math::tr1::log1p;
+using boost::math::tr1::log1pf;
+using boost::math::tr1::log1pl;
+#if 0
+using boost::math::tr1::log2;
+using boost::math::tr1::log2f;
+using boost::math::tr1::log2l;
+using boost::math::tr1::logb;
+using boost::math::tr1::logbf;
+using boost::math::tr1::logbl;
+using boost::math::tr1::lrint;
+using boost::math::tr1::lrintf;
+using boost::math::tr1::lrintl;
+#endif
+using boost::math::tr1::lround;
+using boost::math::tr1::lroundf;
+using boost::math::tr1::lroundl;
+#if 0
+using boost::math::tr1::nan;
+using boost::math::tr1::nanf;
+using boost::math::tr1::nanl;
+using boost::math::tr1::nearbyint;
+using boost::math::tr1::nearbyintf;
+using boost::math::tr1::nearbyintl;
+#endif
+using boost::math::tr1::nextafter;
+using boost::math::tr1::nextafterf;
+using boost::math::tr1::nextafterl;
+using boost::math::tr1::nexttoward;
+using boost::math::tr1::nexttowardf;
+using boost::math::tr1::nexttowardl;
+#if 0
+using boost::math::tr1::remainder;
+using boost::math::tr1::remainderf;
+using boost::math::tr1::remainderl;
+using boost::math::tr1::remquo;
+using boost::math::tr1::remquof;
+using boost::math::tr1::remquol;
+using boost::math::tr1::rint;
+using boost::math::tr1::rintf;
+using boost::math::tr1::rintl;
+#endif
+using boost::math::tr1::round;
+using boost::math::tr1::roundf;
+using boost::math::tr1::roundl;
+#if 0
+using boost::math::tr1::scalbln;
+using boost::math::tr1::scalblnf;
+using boost::math::tr1::scalblnl;
+using boost::math::tr1::scalbn;
+using boost::math::tr1::scalbnf;
+using boost::math::tr1::scalbnl;
+#endif
+using boost::math::tr1::tgamma;
+using boost::math::tr1::tgammaf;
+using boost::math::tr1::tgammal;
+using boost::math::tr1::trunc;
+using boost::math::tr1::truncf;
+using boost::math::tr1::truncl;
+// C99 macros defined as C++ templates
+using boost::math::tr1::signbit;
+using boost::math::tr1::fpclassify;
+using boost::math::tr1::isfinite;
+using boost::math::tr1::isinf;
+using boost::math::tr1::isnan;
+using boost::math::tr1::isnormal;
+#if 0
+using boost::math::tr1::isgreater;
+using boost::math::tr1::isgreaterequal;
+using boost::math::tr1::isless;
+using boost::math::tr1::islessequal;
+using boost::math::tr1::islessgreater;
+using boost::math::tr1::isunordered;
+#endif
+} } // namespaces
+
+#endif // BOOST_HAS_TR1_CMATH
+
+#endif // BOOST_TR1_CMATH_HPP_INCLUDED
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/complex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,244 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_COMPLEX_HPP_INCLUDED
+#  define BOOST_TR1_COMPLEX_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+#  include <complex>
+
+#ifndef BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
+
+#include <boost/math/complex.hpp>
+
+namespace std {
+namespace tr1 {
+
+using boost::math::acos;
+using boost::math::asin;
+using boost::math::atan;
+using boost::math::acosh;
+using boost::math::asinh;
+using boost::math::atanh;
+using boost::math::fabs;
+
+} }
+
+#else
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(complex)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(complex))
+#  endif
+
+#endif
+
+#ifndef BOOST_HAS_TR1_COMPLEX_OVERLOADS
+
+#include <boost/tr1/detail/math_overloads.hpp>
+#include <boost/assert.hpp>
+#include <boost/detail/workaround.hpp>
+#include <boost/config/no_tr1/cmath.hpp>
+
+namespace std{ 
+
+#ifdef BOOST_NO_STDC_NAMESPACE
+   using :: atan2;
+#endif
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template <class T>
+inline BOOST_TR1_MATH_RETURN(double) arg(const T& t)
+{
+   return ::std::atan2(0.0, static_cast<double>(t));
+}
+#else
+inline double arg(const double& t)
+{
+   return ::std::atan2(0.0, t);
+}
+#endif
+inline long double arg(const long double& t)
+{
+   return ::std::atan2(0.0L, static_cast<long double>(t));
+}
+inline float arg(const float& t)
+{
+   return ::std::atan2(0.0F, static_cast<float>(t));
+}
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template <class T>
+inline BOOST_TR1_MATH_RETURN(double) norm(const T& t)
+{
+   double r = static_cast<double>(t);
+   return r*r;
+}
+#else
+inline double norm(const double& t)
+{
+   return t*t;
+}
+#endif
+inline long double norm(const long double& t)
+{
+   long double l = t;
+   return l*l;
+}
+inline float norm(const float& t)
+{
+   float f = t;
+   return f*f;
+}
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template <class T>
+inline BOOST_TR1_MATH_RETURN(std::complex<double>) conj(const T& t)
+{
+   return ::std::conj(std::complex<double>(static_cast<double>(t)));
+}
+#else
+inline std::complex<double> conj(const double& t)
+{
+   return ::std::conj(std::complex<double>(t));
+}
+#endif
+inline std::complex<long double> conj(const long double& t)
+{
+   return ::std::conj(std::complex<long double>(t));
+}
+inline std::complex<float> conj(const float& t)
+{
+   std::complex<float> ct(t);
+   ct = ::std::conj(ct);
+   return ct;
+}
+
+#if !BOOST_WORKAROUND(__BORLANDC__, <=0x570) && !BOOST_WORKAROUND(BOOST_MSVC, < 1310)
+inline complex<double> polar(const char& rho, const char& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned char& rho, const unsigned char& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const signed char& rho, const signed char& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const short& rho, const short& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned short& rho, const unsigned short& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const int& rho, const int& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned int& rho, const unsigned int& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const long& rho, const long& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned long& rho, const unsigned long& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+#ifdef BOOST_HAS_LONG_LONG
+inline complex<double> polar(const long long& rho, const long long& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned long long& rho, const unsigned long long& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+#elif defined(BOOST_HAS_MS_INT64)
+inline complex<double> polar(const __int64& rho, const __int64& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+inline complex<double> polar(const unsigned __int64& rho, const unsigned __int64& theta = 0)
+{ return ::std::polar(static_cast<double>(rho), static_cast<double>(theta)); }
+#endif
+
+template<class T, class U> 
+inline complex<typename boost::tr1_detail::promote_to_real<T, U>::type> 
+   polar(const T& rho, const U& theta)
+{
+   typedef typename boost::tr1_detail::promote_to_real<T, U>::type real_type;
+   return std::polar(static_cast<real_type>(rho), static_cast<real_type>(theta));
+}
+#endif
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template <class T>
+inline BOOST_TR1_MATH_RETURN(double) imag(const T& )
+{
+   return 0;
+}
+#else
+inline double imag(const double& )
+{
+   return 0;
+}
+#endif
+inline long double imag(const long double& )
+{
+   return 0;
+}
+inline float imag(const float& )
+{
+   return 0;
+}
+
+#ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
+template <class T>
+inline BOOST_TR1_MATH_RETURN(double) real(const T& t)
+{
+   return static_cast<double>(t);
+}
+#else
+inline double real(const double& t)
+{
+   return t;
+}
+#endif
+inline long double real(const long double& t)
+{
+   return t;
+}
+inline float real(const float& t)
+{
+   return t;
+}
+
+template<class T, class U>
+inline complex<typename boost::tr1_detail::largest_real<T, U>::type>
+   pow(const complex<T>& x, const complex<U>& y)
+{
+   typedef complex<typename boost::tr1_detail::largest_real<T, U>::type> result_type;
+   typedef typename boost::mpl::if_<boost::is_same<result_type, complex<T> >, result_type const&, result_type>::type cast1_type;
+   typedef typename boost::mpl::if_<boost::is_same<result_type, complex<U> >, result_type const&, result_type>::type cast2_type;
+   cast1_type x1(x);
+   cast2_type y1(y);
+   return std::pow(x1, y1);
+}
+template<class T, class U> 
+inline complex<typename boost::tr1_detail::promote_to_real<T, U>::type>
+   pow (const complex<T>& x, const U& y)
+{
+   typedef typename boost::tr1_detail::promote_to_real<T, U>::type real_type;
+   typedef complex<typename boost::tr1_detail::promote_to_real<T, U>::type> result_type;
+   typedef typename boost::mpl::if_<boost::is_same<result_type, complex<T> >, result_type const&, result_type>::type cast1_type;
+   real_type r = y;
+   cast1_type x1(x);
+   std::complex<real_type> y1(r);
+   return std::pow(x1, y1);
+}
+
+template<class T, class U> 
+inline complex<typename boost::tr1_detail::promote_to_real<T, U>::type>
+   pow (const T& x, const complex<U>& y)
+{
+   typedef typename boost::tr1_detail::promote_to_real<T, U>::type real_type;
+   typedef complex<typename boost::tr1_detail::promote_to_real<T, U>::type> result_type;
+   typedef typename boost::mpl::if_<boost::is_same<result_type, complex<U> >, result_type const&, result_type>::type cast_type;
+   real_type r = x;
+   std::complex<real_type> x1(r);
+   cast_type y1(y);
+   return std::pow(x1, y1);
+}
+
+}
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/detail/config.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,163 @@
+//  (C) Copyright John Maddock 2005-7.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+#  define BOOST_TR1_DETAIL_CONFIG_HPP_INCLUDED
+
+#include <cstddef>
+
+#if defined(__GNUC__) || (!defined(_AIX) && defined(__IBMCPP__)  && (__IBMCPP__ >= 800)) 
+#if !defined(BOOST_HAS_INCLUDE_NEXT)
+#  define BOOST_HAS_INCLUDE_NEXT
+#endif
+// Need to find out if we're using GLIBC:
+#ifdef BOOST_TR1_UTILITY_INCLUDED
+// Oops we're in a recursive include path!!
+// Need to include utility, or some std lib header,
+// but *not* via <utility> or <boost/config/no_tr1/utility.hpp>
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_CONFIG_RECURSION
+#  endif
+#  if defined(BOOST_HAS_INCLUDE_NEXT) && !defined(BOOST_TR1_DISABLE_INCLUDE_NEXT)
+#     include_next <utility>
+#  else
+#     include BOOST_TR1_STD_HEADER(utility)
+#  endif
+#  ifdef BOOST_TR1_NO_CONFIG_RECURSION
+#     undef BOOST_TR1_NO_CONFIG_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#else
+#include <boost/config/no_tr1/utility.hpp>
+#endif
+#endif
+
+#if defined(__GLIBCXX__) && !defined(BOOST_TR1_PATH)
+#  define BOOST_TR1_PATH(name) tr1/name
+#endif
+#if !defined(BOOST_TR1_PATH)
+#  define BOOST_TR1_PATH(name) name
+#endif
+
+#define BOOST_TR1_HEADER(name) <BOOST_TR1_PATH(name)>
+
+// Can't use BOOST_WORKAROUND here, it leads to recursive includes:
+#if (defined(__BORLANDC__) && (__BORLANDC__ <= 0x600)) || (defined(_MSC_VER) && (_MSC_VER < 1310))
+#  define BOOST_TR1_USE_OLD_TUPLE
+#endif
+
+#ifdef __IBMCPP_TR1__
+   // turn on support for everything:
+#  define BOOST_HAS_TR1
+#endif
+
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS
+#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
+#endif
+
+#ifdef BOOST_HAS_TR1
+   // turn on support for everything:
+#  define BOOST_HAS_TR1_ARRAY
+#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS
+#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
+#  define BOOST_HAS_TR1_REFERENCE_WRAPPER
+#  define BOOST_HAS_TR1_RESULT_OF
+#  define BOOST_HAS_TR1_MEM_FN
+#  define BOOST_HAS_TR1_BIND
+#  define BOOST_HAS_TR1_FUNCTION
+#  define BOOST_HAS_TR1_HASH
+#  define BOOST_HAS_TR1_SHARED_PTR
+#  define BOOST_HAS_TR1_RANDOM
+#  define BOOST_HAS_TR1_REGEX
+#  define BOOST_HAS_TR1_TUPLE
+#  define BOOST_HAS_TR1_TYPE_TRAITS
+#  define BOOST_HAS_TR1_UTILITY
+#  define BOOST_HAS_TR1_UNORDERED_MAP
+#  define BOOST_HAS_TR1_UNORDERED_SET
+#  define BOOST_HAS_TR1_CMATH
+
+#endif
+
+#if defined(__MWERKS__) && (__MWERKS__ >= 0x3205)
+//
+// Very preliminary MWCW support, may not be right:
+//
+#  define BOOST_HAS_TR1_SHARED_PTR
+#  define BOOST_HAS_TR1_REFERENCE_WRAPPER
+#  define BOOST_HAS_TR1_FUNCTION
+#  define BOOST_HAS_TR1_TUPLE
+#  define BOOST_HAS_TR1_RESULT_OF
+#endif
+
+#ifdef BOOST_HAS_GCC_TR1
+   // turn on support for everything in gcc 4.0.x:
+#  define BOOST_HAS_TR1_ARRAY
+#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+//#  define BOOST_HAS_TR1_COMPLEX_OVERLOADS
+#  define BOOST_HAS_TR1_COMPLEX_INVERSE_TRIG
+#endif
+#  define BOOST_HAS_TR1_REFERENCE_WRAPPER
+#  define BOOST_HAS_TR1_RESULT_OF
+#  define BOOST_HAS_TR1_MEM_FN
+#  define BOOST_HAS_TR1_BIND
+#  define BOOST_HAS_TR1_FUNCTION
+#  define BOOST_HAS_TR1_HASH
+#  define BOOST_HAS_TR1_SHARED_PTR
+#if (__GNUC__ * 100 + __GNUC_MINOR__) >= 403
+#  define BOOST_HAS_TR1_RANDOM
+//#  define BOOST_HAS_TR1_REGEX
+#ifdef _GLIBCXX_USE_C99_MATH_TR1
+#  define BOOST_HAS_TR1_CMATH
+#endif
+#endif
+#  define BOOST_HAS_TR1_TUPLE
+#  define BOOST_HAS_TR1_TYPE_TRAITS
+#  define BOOST_HAS_TR1_UTILITY
+#  define BOOST_HAS_TR1_UNORDERED_MAP
+#  define BOOST_HAS_TR1_UNORDERED_SET
+
+#endif
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1500) \
+   && defined(_MSC_FULL_VER) && \
+   !defined(__SGI_STL_PORT) && \
+   !defined(_STLPORT_VERSION) && \
+   !defined(_RWSTD_VER_STR) && \
+   !defined(_RWSTD_VER)
+//
+// MSVC-9.0 defines a not-quite TR1 conforming hash
+// function object in <functional>, so we must define
+// this here, in addition the feature pack for VC9
+// provides a more or less full TR1 implementation:
+//
+#if defined(_HAS_TR1) && (_HAS_TR1 + 0)
+#  define BOOST_HAS_TR1_ARRAY
+#  define BOOST_HAS_TR1_REFERENCE_WRAPPER
+#  define BOOST_HAS_TR1_RESULT_OF
+#  define BOOST_HAS_TR1_MEM_FN
+#  define BOOST_HAS_TR1_BIND
+#  define BOOST_HAS_TR1_FUNCTION
+#  define BOOST_HAS_TR1_HASH
+#  define BOOST_HAS_TR1_SHARED_PTR
+#  define BOOST_HAS_TR1_RANDOM
+#  define BOOST_HAS_TR1_REGEX
+#  define BOOST_HAS_TR1_TUPLE
+#  define BOOST_HAS_TR1_TYPE_TRAITS
+#  define BOOST_HAS_TR1_UTILITY
+#  define BOOST_HAS_TR1_UNORDERED_MAP
+#  define BOOST_HAS_TR1_UNORDERED_SET
+#else
+#  define BOOST_HAS_TR1_HASH
+#endif
+#endif
+
+#include <boost/config.hpp>
+
+#endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/detail/config_all.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,158 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+/*
+ * The gcc include path logic is derived from STLport:
+ *
+ * Copyright (c) 1994
+ * Hewlett-Packard Company
+ *
+ * Copyright (c) 1996-1999
+ * Silicon Graphics Computer Systems, Inc.
+ *
+ * Copyright (c) 1997
+ * Moscow Center for SPARC Technology
+ *
+ * Copyright (c) 1999-2003
+ * Boris Fomitchev
+ *
+ * This material is provided "as is", with absolutely no warranty expressed
+ * or implied. Any use is at your own risk.
+ *
+ * Permission to use or copy this software for any purpose is hereby granted 
+ * without fee, provided the above notices are retained on all copies.
+ * Permission to modify the code and to distribute modified code is granted,
+ * provided the above notices are retained, and a notice that the code was
+ * modified is included with the above copyright notice.
+ *
+ */
+
+#ifndef BOOST_TR1_DETAIL_CONFIG_ALL_HPP_INCLUDED
+#  define BOOST_TR1_DETAIL_CONFIG_ALL_HPP_INCLUDED
+
+//
+// IMPORTANT: we must figure out the basics, such as how to
+// forward to the real std lib headers *without* including
+// boost/config.hpp or any of the std lib headers.  A classic 
+// chicken and the egg problem....
+//
+// Including <cstddef> at least lets us detect STLport:
+//
+#include <cstddef>
+
+// Including <cstdlib> allows us to use __GLIBCXX__ to
+// determine the version of the stdc++ library in use
+// under Darwin.
+#include <cstdlib>
+
+#  if defined(_RWSTD_VER) && _RWSTD_VER >= 0x04010200
+#     if !defined (__SUNPRO_CC) && !defined (__DECCXX)
+#        define BOOST_TR1_STD_CHEADER(name) <../include/ansi/name>
+#     endif
+#  endif
+
+
+#  if (defined(__SGI_STL_PORT) || defined(_STLPORT_VERSION)) && !defined(__BORLANDC__)
+#     ifdef __SUNPRO_CC
+         // can't use <../stlport/name> since some compilers put stlport in a different directory:
+#        define BOOST_TR1_STD_HEADER(name) <../stlport4/name>
+#     elif defined(__PGI)
+#        define BOOST_TR1_STD_HEADER(name) <../CC/name>
+#     else
+#        define BOOST_TR1_STD_HEADER(name) <../stlport/name>
+#     endif
+
+#  elif defined(__HP_aCC)
+      // HP aCC include path:
+#     define BOOST_TR1_STD_HEADER(name) <../include_std/name>
+
+#  elif defined(__DECCXX)
+#     define BOOST_TR1_STD_HEADER(name) <../cxx/name>
+
+#  elif defined(__BORLANDC__) && __BORLANDC__ >= 0x570
+#     define BOOST_TR1_STD_HEADER(name) <../include/dinkumware/name>
+
+#  elif defined(__GNUC__) && __GNUC__ >= 3
+#    if defined(BOOST_TR1_GCC_INCLUDE_PATH)
+#      define BOOST_TR1_STD_HEADER(name) <../BOOST_TR1_GCC_INCLUDE_PATH/name>
+#    elif ( (__GNUC__ == 3 ) && ((__GNUC_MINOR__ == 0) || ((__GNUC_MINOR__ < 3) && defined(__APPLE_CC__))))
+#      define BOOST_TR1_STD_HEADER(name) <../g++-v3/name>
+#    else
+#      if ( ((__GNUC__ == 3 ) && (__GNUC_MINOR__ >= 3)) && (defined(__APPLE_CC__) || defined(__CYGWIN__)))
+#        define BOOST_TR1_STD_HEADER(name) <../c++/name>
+#      elif ((__GLIBCXX__ == 20050421) && defined(__APPLE_CC__))
+         // Some Darwin tools fix libstdc++ at 4.0.0 irrespective of the actual
+         // compiler version:
+#        define BOOST_TR1_STD_HEADER(name) <../4.0.0/name>
+         /*
+          *  Before version 3.4.0 the 0 patch level was not part of the include path:
+          */
+#      elif defined (__GNUC_PATCHLEVEL__) && ((__GNUC_PATCHLEVEL__ > 0) || \
+                                              (__GNUC__ == 3 && __GNUC_MINOR__ >= 4) || \
+                                              (__GNUC__ > 3))
+#        define BOOST_TR1_STD_HEADER(name) <../__GNUC__.__GNUC_MINOR__.__GNUC_PATCHLEVEL__/name>
+#      else
+#        define BOOST_TR1_STD_HEADER(name) <../__GNUC__.__GNUC_MINOR__/name>
+#      endif
+#    endif
+
+#      if !defined(BOOST_TR1_DISABLE_INCLUDE_NEXT) && !defined(__ICC) \
+            && (defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__))
+         // Disable use of #include_next on Linux as typically we are installed in a directory that is searched
+         // *after* the std lib include path:
+#        define BOOST_TR1_DISABLE_INCLUDE_NEXT
+#      endif
+
+#  else
+#     define BOOST_TR1_STD_HEADER(name) <../include/name>
+#  endif
+
+#if !defined(BOOST_TR1_STD_CHEADER)
+#  define BOOST_TR1_STD_CHEADER(name) BOOST_TR1_STD_HEADER(name)
+#endif
+
+#if defined(__GNUC__) && !defined(BOOST_HAS_INCLUDE_NEXT)
+#  define BOOST_HAS_INCLUDE_NEXT
+#endif
+#ifdef __GXX_EXPERIMENTAL_CXX0X__
+#  define BOOST_HAS_CPP_0X
+#endif
+
+//
+// We may be in the middle of parsing boost/config.hpp
+// when this header is included, so don't rely on config
+// stuff in the rest of this header...
+//
+// Find our actual std lib:
+//
+#if defined(BOOST_HAS_INCLUDE_NEXT) && !defined(BOOST_TR1_DISABLE_INCLUDE_NEXT)
+//
+// We don't take this branch if BOOST_TR1_DISABLE_INCLUDE_NEXT
+// is defined as we may be installed in 
+// /usr/include, in which case #include_next won't work as our
+// include path will occur AFTER the regular std lib one :-(
+//
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_CONFIG_ALL_RECURSION
+#  endif
+#  include_next <utility>
+#  if (__GNUC__ < 3)
+#     include_next <algorithm>
+#     include_next <iterator>
+#  endif
+#  ifdef BOOST_TR1_NO_CONFIG_ALL_RECURSION
+#     undef BOOST_TR1_NO_CONFIG_ALL_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#else
+#  include BOOST_TR1_STD_HEADER(utility)
+#endif
+
+#include <boost/tr1/detail/config.hpp>
+
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/detail/functor2iterator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_FUNCTOR_IT_HPP_INCLUDED
+#  define BOOST_TR1_FUNCTOR_IT_HPP_INCLUDED
+
+# include <boost/iterator/iterator_facade.hpp>
+
+namespace boost{ namespace tr1_details{
+
+template <class Func, class R>
+struct functor2iterator : boost::iterator_facade<functor2iterator<Func,R>, const R, std::input_iterator_tag>
+{
+   functor2iterator() : m_func(0){}
+   functor2iterator(Func& f)
+      : m_func(&f)
+   {
+      m_val = (*m_func)();
+   }
+   const R& dereference()const
+   { return m_val; }
+   void increment(){ m_val = (*m_func)(); }
+   bool equal(const functor2iterator&)const
+   { return false; }
+private:
+   Func* m_func;
+   R m_val;
+};
+
+} }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/detail/math_overloads.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,58 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_MATH_OVERLOADS_HPP_INCLUDED
+#  define BOOST_TR1_MATH_OVERLOADS_HPP_INCLUDED
+#  include <boost/config.hpp>
+
+#  ifndef BOOST_NO_SFINAE
+#     include <boost/utility/enable_if.hpp>
+#     include <boost/type_traits/is_convertible.hpp>
+#     define BOOST_TR1_MATH_RETURN(RET) typename ::boost::enable_if< ::boost::is_convertible<T,double>, RET >::type
+#  else
+#     define BOOST_TR1_MATH_RETURN(RET) RET
+#  endif
+
+#  include <boost/type_traits/is_floating_point.hpp>
+#  include <boost/type_traits/is_same.hpp>
+#  include <boost/mpl/if.hpp>
+
+namespace boost{ namespace tr1_detail{
+
+template <class T, class U>
+struct largest_real
+{
+   typedef typename boost::mpl::if_<
+      boost::is_same<long double, T>,
+      long double,
+      typename boost::mpl::if_<
+         boost::is_same<long double, U>,
+         long double,
+         typename boost::mpl::if_<
+            boost::is_same<double, T>,
+            double,
+            typename boost::mpl::if_<
+               boost::is_same<double, U>,
+               double,
+               float
+            >::type
+         >::type
+      >::type
+   >::type type;
+};
+
+template <class T, class U>
+struct promote_to_real
+{
+   typedef typename largest_real<
+      typename boost::mpl::if_< boost::is_floating_point<T>, T, double>::type,
+      typename boost::mpl::if_< boost::is_floating_point<U>, U, double>::type
+   >::type type;
+};
+
+} }
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/functional.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,137 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_FUNCTIONAL_HPP_INCLUDED
+#  define BOOST_TR1_FUNCTIONAL_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+#  include <functional>
+
+#if defined(BOOST_HAS_TR1_REFERENCE_WRAPPER) \
+   || defined(BOOST_HAS_TR1_RESULT_OF)\
+   || defined(BOOST_HAS_TR1_MEM_FN)\
+   || defined(BOOST_HAS_TR1_BIND)\
+   || defined(BOOST_HAS_TR1_FUNCTION)\
+   || defined(BOOST_HAS_TR1_HASH)
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(functional)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(functional))
+#  endif
+#endif
+
+#ifndef BOOST_HAS_TR1_REFERENCE_WRAPPER
+
+#include <boost/ref.hpp>
+
+namespace std{ namespace tr1{
+
+   using ::boost::reference_wrapper;
+   using ::boost::ref;
+   using ::boost::cref;
+
+} }
+
+#endif  // BOOST_HAS_TR1_REFERENCE_WRAPPER
+
+#if !defined(BOOST_HAS_TR1_RESULT_OF)\
+   && !defined(BOOST_NO_SFINAE) && \
+   !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION)
+
+//
+// we can only actually include result_of.hpp if the compiler
+// really does support it, otherwise we just get endless errors...
+//
+#include <boost/utility/result_of.hpp>
+
+namespace std{ namespace tr1{
+
+   using ::boost::result_of;
+
+} }
+
+#endif // BOOST_HAS_TR1_RESULT_OF
+
+#ifndef BOOST_HAS_TR1_MEM_FN
+// mem_fn:
+#include <boost/mem_fn.hpp>
+
+namespace std{ namespace tr1{
+
+using boost::mem_fn;
+
+} }
+
+#endif // BOOST_HAS_TR1_MEM_FN
+
+
+#ifndef BOOST_HAS_TR1_BIND
+// Bind:
+#include <boost/bind.hpp>
+
+namespace std{ namespace tr1{
+
+   using ::boost::is_bind_expression;
+   using ::boost::is_placeholder;
+   using ::boost::bind;
+   namespace placeholders {
+#ifndef BOOST_BIND_NO_PLACEHOLDERS
+      using ::_1;
+      using ::_2;
+      using ::_3;
+      using ::_4;
+      using ::_5;
+      using ::_6;
+      using ::_7;
+      using ::_8;
+      using ::_9;
+#endif
+   } // placeholders
+
+} }
+
+#endif
+
+#ifndef BOOST_HAS_TR1_FUNCTION
+// polymorphic function object wrappers:
+#include <boost/function.hpp>
+#include <boost/detail/workaround.hpp>
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x582) \
+    && !BOOST_WORKAROUND(BOOST_MSVC, < 1310) \
+    && !defined(BOOST_FUNCTION_NO_FUNCTION_TYPE_SYNTAX)
+namespace std{ namespace tr1{
+
+   using ::boost::bad_function_call;
+   using ::boost::function;
+   using ::boost::swap;
+
+}}
+#endif
+
+#endif // BOOST_HAS_TR1_FUNCTION
+
+#ifndef BOOST_HAS_TR1_HASH
+//
+// This header can get included by boost/hash.hpp
+// leading to cyclic dependencies.  As a workaround
+// we forward declare boost::hash and include
+// the actual header later.
+//
+namespace boost{
+template <class T> struct hash;
+}
+
+namespace std{ namespace tr1{
+   using ::boost::hash;
+
+}}
+
+#include <boost/functional/hash.hpp>
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/memory.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_MEMORY_HPP_INCLUDED
+#  define BOOST_TR1_MEMORY_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+#  include <boost/detail/workaround.hpp>
+#  include <memory>
+
+#ifndef BOOST_HAS_TR1_SHARED_PTR
+
+//
+// This header can get included by boost/shared_ptr.hpp which leads
+// to cyclic dependencies, the workaround is to forward declare all 
+// the boost components, and then include the actual headers afterwards.
+// This is fragile, but seems to work, and doesn't require modification
+// of boost/shared_ptr.hpp.
+//
+namespace boost{
+
+class bad_weak_ptr;
+template<class T> class weak_ptr;
+template<class T> class shared_ptr;
+template<class T> void swap(weak_ptr<T> & a, weak_ptr<T> & b);
+template<class T> void swap(shared_ptr<T> & a, shared_ptr<T> & b);
+template<class T, class U> shared_ptr<T> static_pointer_cast(shared_ptr<U> const & r);
+template<class T, class U> shared_ptr<T> dynamic_pointer_cast(shared_ptr<U> const & r);
+template<class T, class U> shared_ptr<T> const_pointer_cast(shared_ptr<U> const & r);
+template<class D, class T> D * get_deleter(shared_ptr<T> const & p);
+template<class T> class enable_shared_from_this;
+
+namespace detail{
+class shared_count;
+class weak_count;
+}
+
+}
+
+namespace std{ namespace tr1{
+
+   using ::boost::bad_weak_ptr;
+   using ::boost::shared_ptr;
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
+   using ::boost::swap;
+#endif
+   using ::boost::static_pointer_cast;
+   using ::boost::dynamic_pointer_cast;
+   using ::boost::const_pointer_cast;
+   using ::boost::get_deleter;
+   using ::boost::weak_ptr;
+   using ::boost::enable_shared_from_this;
+
+} }
+#include <boost/shared_ptr.hpp>
+#include <boost/weak_ptr.hpp>
+#include <boost/enable_shared_from_this.hpp>
+
+#else
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(memory)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(memory))
+#  endif
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/random.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,586 @@
+//  (C) Copyright John Maddock 2005.
+//  (C) Copyright Henry S. Warren 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_RANDOM_HPP_INCLUDED
+#  define BOOST_TR1_RANDOM_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_RANDOM
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(random)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(random))
+#  endif
+#else
+// Boost.Random:
+#include <boost/random.hpp>
+#ifndef __SUNPRO_CC
+    // Sunpros linker complains if we so much as include this...
+#   include <boost/nondet_random.hpp>
+#endif
+#include <boost/tr1/detail/functor2iterator.hpp>
+#include <boost/type_traits/is_fundamental.hpp>
+#include <boost/type_traits/is_same.hpp>
+
+namespace std { namespace tr1{
+
+using ::boost::variate_generator;
+
+template<class UIntType, UIntType a, UIntType c, UIntType m>
+class linear_congruential
+{
+private:
+   typedef ::boost::random::linear_congruential<UIntType, a, c, m, 0> impl_type;
+public:
+   // types
+   typedef UIntType result_type;
+   // parameter values
+   BOOST_STATIC_CONSTANT(UIntType, multiplier = a);
+   BOOST_STATIC_CONSTANT(UIntType, increment = c);
+   BOOST_STATIC_CONSTANT(UIntType, modulus = m);
+   // constructors and member function
+   explicit linear_congruential(unsigned long x0 = 1)
+      : m_gen(x0){}
+   linear_congruential(const linear_congruential& that)
+      : m_gen(that.m_gen){}
+   template<class Gen> linear_congruential(Gen& g)
+   {
+      init1(g, ::boost::is_same<Gen,linear_congruential>());
+   }
+   void seed(unsigned long x0 = 1)
+   { m_gen.seed(x0); }
+   template<class Gen> void seed(Gen& g)
+   { 
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.min)(); }
+   result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.max)(); }
+   result_type operator()()
+   {
+      return m_gen(); 
+   }
+   bool operator==(const linear_congruential& that)const
+   { return m_gen == that.m_gen; }
+   bool operator!=(const linear_congruential& that)const
+   { return m_gen != that.m_gen; }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+  template<class CharT, class Traits>
+  friend std::basic_ostream<CharT,Traits>&
+  operator<<(std::basic_ostream<CharT,Traits>& os,
+             const linear_congruential& lcg)
+  {
+    return os << lcg.m_gen; 
+  }
+
+  template<class CharT, class Traits>
+  friend std::basic_istream<CharT,Traits>&
+  operator>>(std::basic_istream<CharT,Traits>& is,
+             linear_congruential& lcg)
+  {
+    return is >> lcg.m_gen;
+  }
+#endif
+
+private:
+   template <class Gen>
+   void init1(Gen& g, const ::boost::true_type&)
+   {
+      m_gen = g.m_gen;
+   }
+   template <class Gen>
+   void init1(Gen& g, const ::boost::false_type&)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::true_type&)
+   {
+      m_gen.seed(static_cast<unsigned long>(g));
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::false_type&)
+   {
+      //typedef typename Gen::result_type gen_rt;
+      boost::tr1_details::functor2iterator<Gen, unsigned long> f1(g), f2;
+      m_gen.seed(f1, f2);
+   }
+   impl_type m_gen;
+};
+
+template<class UIntType, int w, int n, int m, int r,
+UIntType a, int u, int s, UIntType b, int t, UIntType c, int l>
+class mersenne_twister
+{
+   typedef ::boost::random::mersenne_twister
+      <UIntType, w, n, m, r, a, u, s, b, t, c, l, 0> imp_type;
+public:
+   // types
+   typedef UIntType result_type;
+   // parameter values
+   BOOST_STATIC_CONSTANT(int, word_size = w);
+   BOOST_STATIC_CONSTANT(int, state_size = n);
+   BOOST_STATIC_CONSTANT(int, shift_size = m);
+   BOOST_STATIC_CONSTANT(int, mask_bits = r);
+   BOOST_STATIC_CONSTANT(UIntType, parameter_a = a);
+   BOOST_STATIC_CONSTANT(int, output_u = u);
+   BOOST_STATIC_CONSTANT(int, output_s = s);
+   BOOST_STATIC_CONSTANT(UIntType, output_b = b);
+   BOOST_STATIC_CONSTANT(int, output_t = t);
+   BOOST_STATIC_CONSTANT(UIntType, output_c = c);
+   BOOST_STATIC_CONSTANT(int, output_l = l);
+   // constructors and member function
+   mersenne_twister(){}
+   explicit mersenne_twister(unsigned long value)
+      : m_gen(value == 0 ? 5489UL : value){}
+   template<class Gen> mersenne_twister(Gen& g)
+   {
+      init1(g, ::boost::is_same<mersenne_twister,Gen>());
+   }
+   void seed()
+   { m_gen.seed(); }
+   void seed(unsigned long value)
+   { m_gen.seed(value == 0 ? 5489UL : value); }
+   template<class Gen> void seed(Gen& g)
+   { init2(g, ::boost::is_fundamental<Gen>()); }
+   result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.min)(); }
+   result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.max)(); }
+   result_type operator()()
+   { return m_gen(); }
+   bool operator==(const mersenne_twister& that)const
+   { return m_gen == that.m_gen; }
+   bool operator!=(const mersenne_twister& that)const
+   { return m_gen != that.m_gen; }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+   template<class CharT, class Traits>
+   friend std::basic_ostream<CharT,Traits>&
+   operator<<(std::basic_ostream<CharT,Traits>& os,
+            const mersenne_twister& lcg)
+   {
+      return os << lcg.m_gen;
+   }
+
+   template<class CharT, class Traits>
+   friend std::basic_istream<CharT,Traits>&
+   operator>>(std::basic_istream<CharT,Traits>& is,
+            mersenne_twister& lcg)
+   {
+      return is >> lcg.m_gen;
+   }
+#endif
+private:
+   template <class Gen>
+   void init1(Gen& g, const ::boost::true_type&)
+   {
+      m_gen = g.m_gen;
+   }
+   template <class Gen>
+   void init1(Gen& g, const ::boost::false_type&)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::true_type&)
+   {
+      m_gen.seed(static_cast<unsigned long>(g == 0 ? 4357UL : g));
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::false_type&)
+   {
+      m_gen.seed(g);
+   }
+   imp_type m_gen;
+};
+
+template<class IntType, IntType m, int s, int r>
+class subtract_with_carry
+{
+public:
+   // types
+   typedef IntType result_type;
+   // parameter values
+   BOOST_STATIC_CONSTANT(IntType, modulus = m);
+   BOOST_STATIC_CONSTANT(int, long_lag = r);
+   BOOST_STATIC_CONSTANT(int, short_lag = s);
+
+   // constructors and member function
+   subtract_with_carry(){}
+   explicit subtract_with_carry(unsigned long value)
+      : m_gen(value == 0 ? 19780503UL : value){}
+   template<class Gen> subtract_with_carry(Gen& g)
+   { init1(g, ::boost::is_same<Gen, subtract_with_carry<IntType, m, s, r> >()); }
+   void seed(unsigned long value = 19780503ul)
+   { m_gen.seed(value == 0 ? 19780503UL : value); }
+   template<class Gen> void seed(Gen& g)
+   { init2(g, ::boost::is_fundamental<Gen>()); }
+   result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.min)(); }
+   result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.max)(); }
+   result_type operator()()
+   { return m_gen(); }
+   bool operator==(const subtract_with_carry& that)const
+   { return m_gen == that.m_gen; }
+   bool operator!=(const subtract_with_carry& that)const
+   { return m_gen != that.m_gen; }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+   template<class CharT, class Traits>
+   friend std::basic_ostream<CharT,Traits>&
+   operator<<(std::basic_ostream<CharT,Traits>& os,
+            const subtract_with_carry& lcg)
+   {
+      return os << lcg.m_gen;
+   }
+
+   template<class CharT, class Traits>
+   friend std::basic_istream<CharT,Traits>&
+   operator>>(std::basic_istream<CharT,Traits>& is,
+            subtract_with_carry& lcg)
+   {
+      return is >> lcg.m_gen;
+   }
+#endif
+private:
+   template <class Gen>
+   void init1(Gen& g, const ::boost::true_type&)
+   {
+      m_gen = g.m_gen;
+   }
+   template <class Gen>
+   void init1(Gen& g, const ::boost::false_type&)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::true_type&)
+   {
+      m_gen.seed(static_cast<unsigned long>(g == 0 ? 19780503UL : g));
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::false_type&)
+   {
+      m_gen.seed(g);
+   }
+   ::boost::random::subtract_with_carry<IntType, m, s, r, 0> m_gen;
+};
+
+template<class RealType, int w, int s, int r>
+class subtract_with_carry_01
+{
+public:
+   // types
+   typedef RealType result_type;
+   // parameter values
+   BOOST_STATIC_CONSTANT(int, word_size = w);
+   BOOST_STATIC_CONSTANT(int, long_lag = r);
+   BOOST_STATIC_CONSTANT(int, short_lag = s);
+
+   // constructors and member function
+   subtract_with_carry_01(){}
+   explicit subtract_with_carry_01(unsigned long value)
+      : m_gen(value == 0 ? 19780503UL : value){}
+   template<class Gen> subtract_with_carry_01(Gen& g)
+   { init1(g, ::boost::is_same<Gen, subtract_with_carry_01<RealType, w, s, r> >()); }
+   void seed(unsigned long value = 19780503UL)
+   { m_gen.seed(value == 0 ? 19780503UL : value); }
+   template<class Gen> void seed(Gen& g)
+   { init2(g, ::boost::is_fundamental<Gen>()); }
+   result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.min)(); }
+   result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return (m_gen.max)(); }
+   result_type operator()()
+   { return m_gen(); }
+   bool operator==(const subtract_with_carry_01& that)const
+   { return m_gen == that.m_gen; }
+   bool operator!=(const subtract_with_carry_01& that)const
+   { return m_gen != that.m_gen; }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+   template<class CharT, class Traits>
+   friend std::basic_ostream<CharT,Traits>&
+   operator<<(std::basic_ostream<CharT,Traits>& os,
+            const subtract_with_carry_01& lcg)
+   {
+      return os << lcg.m_gen;
+   }
+
+   template<class CharT, class Traits>
+   friend std::basic_istream<CharT,Traits>&
+   operator>>(std::basic_istream<CharT,Traits>& is,
+            subtract_with_carry_01& lcg)
+   {
+      return is >> lcg.m_gen;
+   }
+#endif
+private:
+   template <class Gen>
+   void init1(Gen& g, const ::boost::true_type&)
+   {
+      m_gen = g.m_gen;
+   }
+   template <class Gen>
+   void init1(Gen& g, const ::boost::false_type&)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::true_type&)
+   {
+      m_gen.seed(static_cast<unsigned long>(g == 0 ? 19780503UL : g));
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::false_type&)
+   {
+      //typedef typename Gen::result_type gen_rt;
+      boost::tr1_details::functor2iterator<Gen, unsigned long> f1(g), f2;
+      m_gen.seed(f1, f2);
+   }
+   ::boost::random::subtract_with_carry_01<RealType, w, s, r, 0> m_gen;
+};
+
+using ::boost::random::discard_block;
+
+template<class UniformRandomNumberGenerator1, int s1, class UniformRandomNumberGenerator2, int s2>
+class xor_combine
+{
+public:
+   // types
+   typedef UniformRandomNumberGenerator1 base1_type;
+   typedef UniformRandomNumberGenerator2 base2_type;
+   typedef unsigned long result_type;
+   // parameter values
+   BOOST_STATIC_CONSTANT(int, shift1 = s1);
+   BOOST_STATIC_CONSTANT(int, shift2 = s2);
+   // constructors and member function
+   xor_combine(){ init_minmax(); }
+   xor_combine(const base1_type & rng1, const base2_type & rng2)
+      : m_b1(rng1), m_b2(rng2) { init_minmax(); }
+   xor_combine(unsigned long s)
+      : m_b1(s), m_b2(s+1) { init_minmax(); }
+   template<class Gen> xor_combine(Gen& g)
+   { 
+      init_minmax(); 
+      init1(g, ::boost::is_same<Gen, xor_combine<UniformRandomNumberGenerator1, s1, UniformRandomNumberGenerator2, s2> >());
+   }
+   void seed()
+   {
+      m_b1.seed();
+      m_b2.seed();
+   }
+   void seed(unsigned long s)
+   {
+      m_b1.seed(s);
+      m_b2.seed(s+1);
+   }
+   template<class Gen> void seed(Gen& g)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+
+   const base1_type& base1() const
+   { return m_b1; }
+   const base2_type& base2() const
+   { return m_b2; }
+   result_type min BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return m_min; }
+   result_type max BOOST_PREVENT_MACRO_SUBSTITUTION() const
+   { return m_max; }
+   result_type operator()()
+   { return (m_b1() << s1) ^ (m_b2() << s2); }
+
+   bool operator == (const xor_combine& that)const
+   { return (m_b1 == that.m_b1) && (m_b2 == that.m_b2); }
+   bool operator != (const xor_combine& that)const
+   { return !(*this == that); }
+
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+   template<class CharT, class Traits>
+   friend std::basic_ostream<CharT,Traits>&
+   operator<<(std::basic_ostream<CharT,Traits>& os,
+            const xor_combine& lcg)
+   {
+      return os << lcg.m_b1 << " " << lcg.m_b2;
+   }
+
+   template<class CharT, class Traits>
+   friend std::basic_istream<CharT,Traits>&
+   operator>>(std::basic_istream<CharT,Traits>& is,
+            xor_combine& lcg)
+   {
+      return is >> lcg.m_b1 >> lcg.m_b2;
+   }
+#endif
+
+private:
+   void init_minmax();
+   base1_type m_b1;
+   base2_type m_b2;
+   result_type m_min;
+   result_type m_max;
+
+   template <class Gen>
+   void init1(Gen& g, const ::boost::true_type&)
+   {
+      m_b1 = g.m_b1;
+      m_b2 = g.m_b2;
+   }
+   template <class Gen>
+   void init1(Gen& g, const ::boost::false_type&)
+   {
+      init2(g, ::boost::is_fundamental<Gen>());
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::true_type&)
+   {
+      m_b1.seed(static_cast<unsigned long>(g));
+      m_b2.seed(static_cast<unsigned long>(g));
+   }
+   template <class Gen>
+   void init2(Gen& g, const ::boost::false_type&)
+   {
+      m_b1.seed(g);
+      m_b2.seed(g);
+   }
+};
+
+template<class UniformRandomNumberGenerator1, int s1, class UniformRandomNumberGenerator2, int s2>
+void xor_combine<UniformRandomNumberGenerator1, s1, UniformRandomNumberGenerator2, s2>::init_minmax()
+{
+   //
+   // The following code is based on that given in "Hacker's Delight"
+   // by Henry S. Warren, (Addison-Wesley, 2003), and at 
+   // http://www.hackersdelight.org/index.htm.
+   // Used here by permission.
+   //
+   // calculation of minimum value:
+   //
+   result_type a = (m_b1.min)() << s1;
+   result_type b = (m_b1.max)() << s1;
+   result_type c = (m_b2.min)() << s2;
+   result_type d = (m_b2.max)() << s2;
+   result_type m, temp;
+
+   m = 0x1uL << ((sizeof(result_type) * CHAR_BIT) - 1);
+   while (m != 0) {
+      if (~a & c & m) {
+         temp = (a | m) & (static_cast<result_type>(0u) - m);
+         if (temp <= b) a = temp;
+      }
+      else if (a & ~c & m) {
+         temp = (c | m) & (static_cast<result_type>(0u) - m);
+         if (temp <= d) c = temp;
+      }
+      m >>= 1;
+   }
+   m_min = a ^ c;
+
+   //
+   // calculation of maximum value:
+   //
+   if((((std::numeric_limits<result_type>::max)() >> s1) < (m_b1.max)())
+      || ((((std::numeric_limits<result_type>::max)()) >> s2) < (m_b2.max)()))
+   {
+      m_max = (std::numeric_limits<result_type>::max)();
+      return;
+   }
+   a = (m_b1.min)() << s1;
+   b = (m_b1.max)() << s1;
+   c = (m_b2.min)() << s2;
+   d = (m_b2.max)() << s2;
+
+   m = 0x1uL << ((sizeof(result_type) * CHAR_BIT) - 1);
+
+   while (m != 0) {
+      if (b & d & m) {
+         temp = (b - m) | (m - 1);
+         if (temp >= a) b = temp;
+         else {
+            temp = (d - m) | (m - 1);
+            if (temp >= c) d = temp;
+         }
+      }
+      m = m >> 1;
+   }
+   m_max = b ^ d;
+}
+
+typedef linear_congruential< ::boost::int32_t, 16807, 0, 2147483647> minstd_rand0;
+typedef linear_congruential< ::boost::int32_t, 48271, 0, 2147483647> minstd_rand;
+typedef mersenne_twister< ::boost::uint32_t, 32,624,397,31,0x9908b0df,11,7,0x9d2c5680,15,0xefc60000,18> mt19937;
+typedef subtract_with_carry_01<float, 24, 10, 24> ranlux_base_01;
+typedef subtract_with_carry_01<double, 48, 10, 24> ranlux64_base_01;
+typedef discard_block<subtract_with_carry< ::boost::int32_t, (1<<24), 10, 24>, 223, 24> ranlux3;
+typedef discard_block<subtract_with_carry< ::boost::int32_t, (1<<24), 10, 24>, 389, 24> ranlux4;
+typedef discard_block<subtract_with_carry_01<float, 24, 10, 24>, 223, 24> ranlux3_01;
+typedef discard_block<subtract_with_carry_01<float, 24, 10, 24>, 389, 24> ranlux4_01;
+
+#ifndef __SUNPRO_CC
+using ::boost::random_device;
+#endif
+using ::boost::uniform_int;
+
+class bernoulli_distribution
+{
+public:
+   // types
+   typedef int input_type;
+   typedef bool result_type;
+   // constructors and member function
+   explicit bernoulli_distribution(double p = 0.5)
+      : m_dist(p){}
+   double p() const
+   { return m_dist.p(); }
+   void reset()
+   { m_dist.reset(); }
+   template<class UniformRandomNumberGenerator>
+   result_type operator()(UniformRandomNumberGenerator& urng)
+   {
+      return m_dist(urng);
+   }
+#if !defined(BOOST_NO_MEMBER_TEMPLATE_FRIENDS) && !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x551))
+   template<class CharT, class Traits>
+   friend std::basic_ostream<CharT,Traits>&
+   operator<<(std::basic_ostream<CharT,Traits>& os,
+            const bernoulli_distribution& lcg)
+   {
+      return os << lcg.m_dist;
+   }
+
+   template<class CharT, class Traits>
+   friend std::basic_istream<CharT,Traits>&
+   operator>>(std::basic_istream<CharT,Traits>& is,
+            bernoulli_distribution& lcg)
+   {
+      return is >> lcg.m_dist;
+   }
+#endif
+
+private:
+   ::boost::bernoulli_distribution<double> m_dist;
+};
+//using ::boost::bernoulli_distribution;
+using ::boost::geometric_distribution;
+using ::boost::poisson_distribution;
+using ::boost::binomial_distribution;
+using ::boost::uniform_real;
+using ::boost::exponential_distribution;
+using ::boost::normal_distribution;
+using ::boost::gamma_distribution;
+
+} }
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/regex.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,147 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_REGEX_HPP_INCLUDED
+#  define BOOST_TR1_REGEX_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_REGEX
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(regex)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(regex))
+#  endif
+
+#else
+
+#include <boost/regex.hpp>
+
+namespace std{ namespace tr1{
+
+// [7.5] Regex constants
+namespace regex_constants {
+
+using ::boost::regex_constants::syntax_option_type;
+using ::boost::regex_constants::icase;
+using ::boost::regex_constants::nosubs;
+using ::boost::regex_constants::optimize;
+using ::boost::regex_constants::collate;
+using ::boost::regex_constants::ECMAScript;
+using ::boost::regex_constants::basic;
+using ::boost::regex_constants::extended;
+using ::boost::regex_constants::awk;
+using ::boost::regex_constants::grep;
+using ::boost::regex_constants::egrep;
+
+using ::boost::regex_constants::match_flag_type;
+using ::boost::regex_constants::match_default;
+using ::boost::regex_constants::match_not_bol;
+using ::boost::regex_constants::match_not_eol;
+using ::boost::regex_constants::match_not_bow;
+using ::boost::regex_constants::match_not_eow;
+using ::boost::regex_constants::match_any;
+using ::boost::regex_constants::match_not_null;
+using ::boost::regex_constants::match_continuous;
+using ::boost::regex_constants::match_prev_avail;
+using ::boost::regex_constants::format_default;
+using ::boost::regex_constants::format_sed;
+using ::boost::regex_constants::format_no_copy;
+using ::boost::regex_constants::format_first_only;
+
+using ::boost::regex_constants::error_type;
+using ::boost::regex_constants::error_collate;
+using ::boost::regex_constants::error_ctype;
+using ::boost::regex_constants::error_escape;
+using ::boost::regex_constants::error_backref;
+using ::boost::regex_constants::error_brack;
+using ::boost::regex_constants::error_paren;
+using ::boost::regex_constants::error_brace;
+using ::boost::regex_constants::error_badbrace;
+using ::boost::regex_constants::error_range;
+using ::boost::regex_constants::error_space;
+using ::boost::regex_constants::error_badrepeat;
+using ::boost::regex_constants::error_complexity;
+using ::boost::regex_constants::error_stack;
+
+} // namespace regex_constants
+
+// [7.6] Class regex_error
+using ::boost::regex_error;
+
+// [7.7] Class template regex_traits
+using ::boost::regex_traits;
+
+// [7.8] Class template basic_regex
+using ::boost::basic_regex;
+using ::boost::regex;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wregex;
+#endif
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
+// [7.8.6] basic_regex swap
+using ::boost::swap;
+#endif
+
+// [7.9] Class template sub_match
+using ::boost::sub_match;
+
+using ::boost::csub_match;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wcsub_match;
+#endif
+using ::boost::ssub_match;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wssub_match;
+#endif
+
+// [7.10] Class template match_results
+using ::boost::match_results;
+using ::boost::cmatch;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wcmatch;
+#endif
+using ::boost::smatch;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wsmatch;
+#endif
+
+using ::boost::regex_match;
+
+// [7.11.3] Function template regex_search
+using ::boost::regex_search;
+
+// [7.11.4] Function template regex_replace
+using ::boost::regex_replace;
+
+// [7.12.1] Class template regex_iterator
+using ::boost::regex_iterator;
+using ::boost::cregex_iterator;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wcregex_iterator;
+#endif
+using ::boost::sregex_iterator;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wsregex_iterator;
+#endif
+
+// [7.12.2] Class template regex_token_iterator
+using ::boost::regex_token_iterator;
+using ::boost::cregex_token_iterator;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wcregex_token_iterator;
+#endif
+using ::boost::sregex_token_iterator;
+#ifndef BOOST_NO_WREGEX
+using ::boost::wsregex_token_iterator;
+#endif
+
+} } // namespaces
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/algorithm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_algorithm_INCLUDED
+#  define BOOST_TR1_algorithm_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_algorithm_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <algorithm>
+#  else
+#     include BOOST_TR1_STD_HEADER(algorithm)
+#  endif
+#  ifdef BOOST_TR1_NO_algorithm_RECURSION
+#     undef BOOST_TR1_NO_algorithm_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/array	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if !defined(BOOST_TR1_ARRAY_INCLUDED)
+#  define BOOST_TR1_ARRAY_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <array>
+#     else
+#        include BOOST_TR1_STD_HEADER(array)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_ARRAY
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(array)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(array))
+#     endif
+#  else
+#     include <boost/tr1/array.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/array.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_ARRAY_H_INCLUDED)
+#  define BOOST_TR1_ARRAY_H_INCLUDED
+#  include <array.>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/random.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_RANDOM_H_INCLUDED)
+#  define BOOST_TR1_RANDOM_H_INCLUDED
+#  include <random.>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/regex.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_REGEX_H_INCLUDED)
+#  define BOOST_TR1_REGEX_H_INCLUDED
+#  include <regex.>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/tuple.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_TUPLE_H_INCLUDED)
+#  define BOOST_TR1_TUPLE_H_INCLUDED
+#  include <tuple.>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/type_tra.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_TYPE_TRAITS_H_INCLUDED)
+#  define BOOST_TR1_TYPE_TRAITS_H_INCLUDED
+#  include <type_traits.>
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bcc32/unordere.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,15 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+//
+// Forwarding header for Borland C++:
+//
+#if !defined(BOOST_TR1_UNORDERED_H_INCLUDED)
+#  define BOOST_TR1_UNORDERED_H_INCLUDED
+#  include <unordered_set.>
+#  include <unordered_map.>
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/bitset	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_bitset_INCLUDED
+#  define BOOST_TR1_bitset_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_bitset_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <bitset>
+#  else
+#     include BOOST_TR1_STD_HEADER(bitset)
+#  endif
+#  ifdef BOOST_TR1_NO_bitset_RECURSION
+#     undef BOOST_TR1_NO_bitset_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/cmath	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if !defined(BOOST_TR1_CMATH_INCLUDED) || defined(BOOST_TR1_NO_RECURSION)
+#ifndef BOOST_TR1_CMATH_INCLUDED
+#  define BOOST_TR1_CMATH_INCLUDED
+#endif
+#  ifdef BOOST_TR1_NO_CMATH_RECURSION2
+#     define BOOST_TR1_NO_CMATH_RECURSION3
+#  elif defined(BOOST_TR1_NO_CMATH_RECURSION)
+#     define BOOST_TR1_NO_CMATH_RECURSION2
+#  elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_CMATH_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <cmath>
+#  else
+#     include BOOST_TR1_STD_CHEADER(cmath)
+#  endif
+#ifdef BOOST_TR1_NO_CMATH_RECURSION3
+#  undef BOOST_TR1_NO_CMATH_RECURSION3
+#elif defined(BOOST_TR1_NO_CMATH_RECURSION2)
+#  undef BOOST_TR1_NO_CMATH_RECURSION2
+#elif defined(BOOST_TR1_NO_CMATH_RECURSION)
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_TR1_NO_CMATH_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_CMATH_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_CMATH_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/cmath.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/complex	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_COMPLEX_INCLUDED
+#  define BOOST_TR1_COMPLEX_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_COMPLEX_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <complex>
+#  else
+#     include BOOST_TR1_STD_HEADER(complex)
+#  endif
+#  ifdef BOOST_TR1_NO_COMPLEX_RECURSION
+#     undef BOOST_TR1_NO_COMPLEX_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_COMPLEX_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_COMPLEX_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/complex.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/deque	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_deque_INCLUDED
+#  define BOOST_TR1_deque_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_deque_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <deque>
+#  else
+#     include BOOST_TR1_STD_HEADER(deque)
+#  endif
+#  ifdef BOOST_TR1_NO_deque_RECURSION
+#     undef BOOST_TR1_NO_deque_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/exception	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+// Important: there are no include guards on this header for Borland C++
+// The Borland version of <exception> has some peculiar circular dependencies
+// that requires multiple inclusion.  Likewise for gcc (gcc-2.95.3 fix).
+//
+#ifdef BOOST_TR1_NO_exception_RECURSION2
+#  define BOOST_TR1_NO_exception_RECURSION3
+#elif defined(BOOST_TR1_NO_exception_RECURSION)
+#  define BOOST_TR1_NO_exception_RECURSION2
+#elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_exception_RECURSION
+#endif
+
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <exception>
+#  else
+#     include BOOST_TR1_STD_HEADER(exception)
+#  endif
+
+#ifdef BOOST_TR1_NO_exception_RECURSION3
+#  undef BOOST_TR1_NO_exception_RECURSION3
+#elif defined(BOOST_TR1_NO_exception_RECURSION2)
+#  undef BOOST_TR1_NO_exception_RECURSION2
+#elif defined(BOOST_TR1_NO_exception_RECURSION)
+#     undef BOOST_TR1_NO_exception_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/fstream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_fstream_INCLUDED
+#  define BOOST_TR1_fstream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_fstream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <fstream>
+#  else
+#     include BOOST_TR1_STD_HEADER(fstream)
+#  endif
+#  ifdef BOOST_TR1_NO_fstream_RECURSION
+#     undef BOOST_TR1_NO_fstream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/functional	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,30 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#if !defined(BOOST_TR1_FUNCTIONAL_INCLUDED)
+#  define BOOST_TR1_FUNCTIONAL_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_FUNCTIONAL_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <functional>
+#  else
+#     include BOOST_TR1_STD_HEADER(functional)
+#  endif
+#  ifdef BOOST_TR1_NO_FUNCTIONAL_RECURSION
+#     undef BOOST_TR1_NO_FUNCTIONAL_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_FUNCTIONAL_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_FUNCTIONAL_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/functional.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/iomanip	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_iomanip_INCLUDED
+#  define BOOST_TR1_iomanip_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_iomanip_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <iomanip>
+#  else
+#     include BOOST_TR1_STD_HEADER(iomanip)
+#  endif
+#  ifdef BOOST_TR1_NO_iomanip_RECURSION
+#     undef BOOST_TR1_NO_iomanip_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/ios	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_ios_INCLUDED
+#  define BOOST_TR1_ios_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_ios_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <ios>
+#  else
+#     include BOOST_TR1_STD_HEADER(ios)
+#  endif
+#  ifdef BOOST_TR1_NO_ios_RECURSION
+#     undef BOOST_TR1_NO_ios_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/iostream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_iostream_INCLUDED
+#  define BOOST_TR1_iostream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_iostream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <iostream>
+#  else
+#     include BOOST_TR1_STD_HEADER(iostream)
+#  endif
+#  ifdef BOOST_TR1_NO_iostream_RECURSION
+#     undef BOOST_TR1_NO_iostream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/istream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_istream_INCLUDED
+#  define BOOST_TR1_istream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_istream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <istream>
+#  else
+#     include BOOST_TR1_STD_HEADER(istream)
+#  endif
+#  ifdef BOOST_TR1_NO_istream_RECURSION
+#     undef BOOST_TR1_NO_istream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/iterator	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_iterator_INCLUDED
+#  define BOOST_TR1_iterator_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_iterator_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <iterator>
+#  else
+#     include BOOST_TR1_STD_HEADER(iterator)
+#  endif
+#  ifdef BOOST_TR1_NO_iterator_RECURSION
+#     undef BOOST_TR1_NO_iterator_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/limits	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_limits_INCLUDED
+#  define BOOST_TR1_limits_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_limits_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <limits>
+#  else
+#     include BOOST_TR1_STD_HEADER(limits)
+#  endif
+#  ifdef BOOST_TR1_NO_limits_RECURSION
+#     undef BOOST_TR1_NO_limits_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/list	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_list_INCLUDED
+#  define BOOST_TR1_list_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_list_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <list>
+#  else
+#     include BOOST_TR1_STD_HEADER(list)
+#  endif
+#  ifdef BOOST_TR1_NO_list_RECURSION
+#     undef BOOST_TR1_NO_list_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/locale	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_locale_INCLUDED
+#  define BOOST_TR1_locale_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_locale_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <locale>
+#  else
+#     include BOOST_TR1_STD_HEADER(locale)
+#  endif
+#  ifdef BOOST_TR1_NO_locale_RECURSION
+#     undef BOOST_TR1_NO_locale_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/map	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_map_INCLUDED
+#  define BOOST_TR1_map_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_map_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <map>
+#  else
+#     include BOOST_TR1_STD_HEADER(map)
+#  endif
+#  ifdef BOOST_TR1_NO_map_RECURSION
+#     undef BOOST_TR1_NO_map_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/memory	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_MEMORY_INCLUDED
+#  define BOOST_TR1_MEMORY_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_MEMORY_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <memory>
+#  else
+#     include BOOST_TR1_STD_HEADER(memory)
+#  endif
+#  ifdef BOOST_TR1_NO_MEMORY_RECURSION
+#     undef BOOST_TR1_NO_MEMORY_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_MEMORY_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_MEMORY_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/memory.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/new	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,35 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifdef BOOST_TR1_NO_new_RECURSION2
+#  define BOOST_TR1_NO_new_RECURSION3
+#elif defined(BOOST_TR1_NO_new_RECURSION)
+#  define BOOST_TR1_NO_new_RECURSION2
+#elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_new_RECURSION
+#endif
+
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <new>
+#  else
+#     include BOOST_TR1_STD_HEADER(new)
+#  endif
+
+#ifdef BOOST_TR1_NO_new_RECURSION3
+#  undef BOOST_TR1_NO_new_RECURSION3
+#elif defined(BOOST_TR1_NO_new_RECURSION2)
+#  undef BOOST_TR1_NO_new_RECURSION2
+#elif defined(BOOST_TR1_NO_new_RECURSION)
+#     undef BOOST_TR1_NO_new_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/numeric	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_numeric_INCLUDED
+#  define BOOST_TR1_numeric_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_numeric_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <numeric>
+#  else
+#     include BOOST_TR1_STD_HEADER(numeric)
+#  endif
+#  ifdef BOOST_TR1_NO_numeric_RECURSION
+#     undef BOOST_TR1_NO_numeric_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/ostream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_ostream_INCLUDED
+#  define BOOST_TR1_ostream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_ostream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <ostream>
+#  else
+#     include BOOST_TR1_STD_HEADER(ostream)
+#  endif
+#  ifdef BOOST_TR1_NO_ostream_RECURSION
+#     undef BOOST_TR1_NO_ostream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/queue	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_queue_INCLUDED
+#  define BOOST_TR1_queue_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_queue_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <queue>
+#  else
+#     include BOOST_TR1_STD_HEADER(queue)
+#  endif
+#  ifdef BOOST_TR1_NO_queue_RECURSION
+#     undef BOOST_TR1_NO_queue_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/random	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_RANDOM_INCLUDED
+#  define BOOST_TR1_RANDOM_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <random>
+#     else
+#        include BOOST_TR1_STD_HEADER(random)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_RANDOM
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(random)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(random))
+#     endif
+#  else
+#     include <boost/tr1/random.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/regex	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_REGEX_INCLUDED
+#  define BOOST_TR1_REGEX_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_TR1_REGEX
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(regex)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(regex))
+#     endif
+#  else
+#     include <boost/tr1/regex.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/set	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_set_INCLUDED
+#  define BOOST_TR1_set_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_set_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <set>
+#  else
+#     include BOOST_TR1_STD_HEADER(set)
+#  endif
+#  ifdef BOOST_TR1_NO_set_RECURSION
+#     undef BOOST_TR1_NO_set_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sstream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_sstream_INCLUDED
+#  define BOOST_TR1_sstream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_sstream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <sstream>
+#  else
+#     include BOOST_TR1_STD_HEADER(sstream)
+#  endif
+#  ifdef BOOST_TR1_NO_sstream_RECURSION
+#     undef BOOST_TR1_NO_sstream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/stack	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_stack_INCLUDED
+#  define BOOST_TR1_stack_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_stack_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <stack>
+#  else
+#     include BOOST_TR1_STD_HEADER(stack)
+#  endif
+#  ifdef BOOST_TR1_NO_stack_RECURSION
+#     undef BOOST_TR1_NO_stack_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/stdexcept	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifdef BOOST_TR1_NO_stdexcept_RECURSION2
+#  define BOOST_TR1_NO_stdexcept_RECURSION3
+#elif defined(BOOST_TR1_NO_stdexcept_RECURSION)
+#  define BOOST_TR1_NO_stdexcept_RECURSION2
+#elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_stdexcept_RECURSION
+#endif
+
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <stdexcept>
+#  else
+#     include BOOST_TR1_STD_HEADER(stdexcept)
+#  endif
+
+#ifdef BOOST_TR1_NO_stdexcept_RECURSION3
+#  undef BOOST_TR1_NO_stdexcept_RECURSION3
+#elif defined(BOOST_TR1_NO_stdexcept_RECURSION2)
+#  undef BOOST_TR1_NO_stdexcept_RECURSION2
+#elif defined(BOOST_TR1_NO_stdexcept_RECURSION)
+#     undef BOOST_TR1_NO_stdexcept_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/streambuf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_streambuf_INCLUDED
+#  define BOOST_TR1_streambuf_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_streambuf_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <streambuf>
+#  else
+#     include BOOST_TR1_STD_HEADER(streambuf)
+#  endif
+#  ifdef BOOST_TR1_NO_streambuf_RECURSION
+#     undef BOOST_TR1_NO_streambuf_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/string	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_string_INCLUDED
+#  define BOOST_TR1_string_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_string_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <string>
+#  else
+#     include BOOST_TR1_STD_HEADER(string)
+#  endif
+#  ifdef BOOST_TR1_NO_string_RECURSION
+#     undef BOOST_TR1_NO_string_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/strstream	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_strstream_INCLUDED
+#  define BOOST_TR1_strstream_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_strstream_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <strstream>
+#  else
+#     include BOOST_TR1_STD_HEADER(strstream)
+#  endif
+#  ifdef BOOST_TR1_NO_strstream_RECURSION
+#     undef BOOST_TR1_NO_strstream_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/algorithm.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../algorithm"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/array.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../array"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/bcc32.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../bcc32"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/bitset.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../bitset"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/cmath.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,7 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../cmath"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/complex.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../complex"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/deque.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../deque"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/exception.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../exception"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/fstream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../fstream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/functional.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../functional"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/iomanip.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../iomanip"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/ios.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../ios"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/iostream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../iostream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/istream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../istream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/iterator.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../iterator"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/limits.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../limits"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/list.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../list"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/locale.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../locale"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/map.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../map"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/memory.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../memory"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/new.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../new"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/numeric.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../numeric"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/ostream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../ostream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/queue.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../queue"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/random.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../random"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/regex.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../regex"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/set.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../set"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/sstream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../sstream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/stack.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../stack"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/stdexcept.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../stdexcept"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/streambuf.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../streambuf"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/string.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../string"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/strstream.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../strstream"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/sun.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../sun"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/tuple.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../tuple"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/type_traits.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../type_traits"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/typeinfo.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../typeinfo"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/unordered_map.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,7 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../unordered_map"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/unordered_set.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,7 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../unordered_set"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/utility.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../utility"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/valarray.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../valarray"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/sun/vector.SUNWCCh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+//  (C) Copyright John Maddock 2006.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+#include "../vector"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/tuple	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_TUPLE_INCLUDED
+#  define BOOST_TR1_TUPLE_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <tuple>
+#     else
+#        include BOOST_TR1_STD_HEADER(tuple)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_TUPLE
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(tuple)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(tuple))
+#     endif
+#  else
+#     include <boost/tr1/tuple.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/type_traits	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#include <boost/tr1/detail/config_all.hpp>
+
+#if (!defined(BOOST_TR1_TYPE_TRAITS_INCLUDED) || defined(BOOST_TR1_NO_RECURSION)) && defined(BOOST_HAS_CPP_0X)
+#ifndef BOOST_TR1_TYPE_TRAITS_INCLUDED
+#  define BOOST_TR1_TYPE_TRAITS_INCLUDED
+#endif
+#  ifdef BOOST_TR1_NO_TYPE_TRAITS_RECURSION2
+#     define BOOST_TR1_NO_TYPE_TRAITS_RECURSION3
+#  elif defined(BOOST_TR1_NO_TYPE_TRAITS_RECURSION)
+#     define BOOST_TR1_NO_TYPE_TRAITS_RECURSION2
+#  elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_TYPE_TRAITS_RECURSION
+#  endif
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <type_traits>
+#  else
+#     include BOOST_TR1_STD_HEADER(type_traits)
+#  endif
+#ifdef BOOST_TR1_NO_TYPE_TRAITS_RECURSION3
+#  undef BOOST_TR1_NO_TYPE_TRAITS_RECURSION3
+#elif defined(BOOST_TR1_NO_TYPE_TRAITS_RECURSION2)
+#  undef BOOST_TR1_NO_TYPE_TRAITS_RECURSION2
+#elif defined(BOOST_TR1_NO_TYPE_TRAITS_RECURSION)
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_TR1_NO_TYPE_TRAITS_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_TYPE_TRAITS_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_TYPE_TRAITS_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/type_traits.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/typeinfo	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_typeinfo_INCLUDED
+#  define BOOST_TR1_typeinfo_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_typeinfo_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <typeinfo>
+#  else
+#     include BOOST_TR1_STD_HEADER(typeinfo)
+#  endif
+#  ifdef BOOST_TR1_NO_typeinfo_RECURSION
+#     undef BOOST_TR1_NO_typeinfo_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/unordered_map	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_UNORDERED_MAP_INCLUDED
+#  define BOOST_TR1_UNORDERED_MAP_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <unordered_map>
+#     else
+#        include BOOST_TR1_STD_HEADER(unordered_map)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_UNORDERED_MAP
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(unordered_map)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(unordered_map))
+#     endif
+#  else
+#     include <boost/tr1/unordered_map.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/unordered_set	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#ifndef BOOST_TR1_UNORDERED_SET_INCLUDED
+#  define BOOST_TR1_UNORDERED_SET_INCLUDED
+#  include <boost/tr1/detail/config_all.hpp>
+
+#  ifdef BOOST_HAS_CPP_0X
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next <unordered_map>
+#     else
+#        include BOOST_TR1_STD_HEADER(unordered_map)
+#     endif
+#  endif
+
+#  if !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_NO_RECURSION
+#  ifdef BOOST_HAS_TR1_UNORDERED_SET
+#     ifdef BOOST_HAS_INCLUDE_NEXT
+#        include_next BOOST_TR1_HEADER(unordered_set)
+#     else
+#        include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(unordered_set))
+#     endif
+#  else
+#     include <boost/tr1/unordered_set.hpp>
+#  endif
+#  undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/utility	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+
+#if !defined(BOOST_TR1_UTILITY_INCLUDED) || defined(BOOST_TR1_NO_RECURSION)
+#ifndef BOOST_TR1_UTILITY_INCLUDED
+#  define BOOST_TR1_UTILITY_INCLUDED
+#endif
+#  ifdef BOOST_TR1_NO_UTILITY_RECURSION2
+#     define BOOST_TR1_NO_UTILITY_RECURSION3
+#  elif defined(BOOST_TR1_NO_UTILITY_RECURSION)
+#     define BOOST_TR1_NO_UTILITY_RECURSION2
+#  elif !defined(BOOST_TR1_NO_RECURSION)
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_UTILITY_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <utility>
+#  else
+#     include BOOST_TR1_STD_HEADER(utility)
+#  endif
+#ifdef BOOST_TR1_NO_UTILITY_RECURSION3
+#  undef BOOST_TR1_NO_UTILITY_RECURSION3
+#elif defined(BOOST_TR1_NO_UTILITY_RECURSION2)
+#  undef BOOST_TR1_NO_UTILITY_RECURSION2
+#elif defined(BOOST_TR1_NO_UTILITY_RECURSION)
+#     undef BOOST_TR1_NO_RECURSION
+#     undef BOOST_TR1_NO_UTILITY_RECURSION
+#  endif
+#endif
+
+#if !defined(BOOST_TR1_FULL_UTILITY_INCLUDED) && !defined(BOOST_TR1_NO_RECURSION)
+#  define BOOST_TR1_FULL_UTILITY_INCLUDED
+#  define BOOST_TR1_NO_RECURSION
+#  include <boost/tr1/utility.hpp>
+#  undef BOOST_TR1_NO_RECURSION
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/valarray	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_valarray_INCLUDED
+#  define BOOST_TR1_valarray_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_valarray_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <valarray>
+#  else
+#     include BOOST_TR1_STD_HEADER(valarray)
+#  endif
+#  ifdef BOOST_TR1_NO_valarray_RECURSION
+#     undef BOOST_TR1_NO_valarray_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tr1/vector	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+//
+//  This file exists to prevent std lib headers from accidentally
+//  including a TR1 extention header; we must suppress this otherwise
+//  we can end up with cyclic dependencies with some std lib implementations.
+//
+#ifndef BOOST_TR1_vector_INCLUDED
+#  define BOOST_TR1_vector_INCLUDED
+#  ifndef BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_RECURSION
+#     define BOOST_TR1_NO_vector_RECURSION
+#  endif
+#  include <boost/tr1/detail/config_all.hpp>
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next <vector>
+#  else
+#     include BOOST_TR1_STD_HEADER(vector)
+#  endif
+#  ifdef BOOST_TR1_NO_vector_RECURSION
+#     undef BOOST_TR1_NO_vector_RECURSION
+#     undef BOOST_TR1_NO_RECURSION
+#  endif
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/tuple.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,82 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_TUPLE_HPP_INCLUDED
+#  define BOOST_TR1_TUPLE_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_TUPLE
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(tuple)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(tuple))
+#  endif
+
+#else
+
+#if defined(BOOST_TR1_USE_OLD_TUPLE)
+
+#include <boost/tuple/tuple.hpp>
+#include <boost/tuple/tuple_comparison.hpp>
+#include <boost/type_traits/integral_constant.hpp>
+
+namespace std{ namespace tr1{
+
+using ::boost::tuple;
+
+// [6.1.3.2] Tuple creation functions
+using ::boost::tuples::ignore;
+using ::boost::make_tuple;
+using ::boost::tie;
+
+// [6.1.3.3] Tuple helper classes
+template <class T> 
+struct tuple_size 
+   : public ::boost::integral_constant
+   < ::std::size_t, ::boost::tuples::length<T>::value>
+{};
+
+template < int I, class T>
+struct tuple_element
+{
+   typedef typename boost::tuples::element<I,T>::type type;
+};
+
+#if !BOOST_WORKAROUND(__BORLANDC__, < 0x0582)
+// [6.1.3.4] Element access
+using ::boost::get;
+#endif
+
+} } // namespaces
+
+#else
+
+#include <boost/fusion/include/tuple.hpp>
+#include <boost/fusion/include/std_pair.hpp>
+
+namespace std{ namespace tr1{
+
+using ::boost::fusion::tuple;
+
+// [6.1.3.2] Tuple creation functions
+using ::boost::fusion::ignore;
+using ::boost::fusion::make_tuple;
+using ::boost::fusion::tie;
+using ::boost::fusion::get;
+
+// [6.1.3.3] Tuple helper classes
+using ::boost::fusion::tuple_size;
+using ::boost::fusion::tuple_element;
+
+}}
+
+#endif
+
+#endif
+
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/type_traits.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,86 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_TYPE_TRAITS_HPP_INCLUDED
+#  define BOOST_TR1_TYPE_TRAITS_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_TYPE_TRAITS
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(type_traits)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(type_traits))
+#  endif
+
+#else
+// Boost Type Traits:
+#include <boost/type_traits.hpp>
+
+namespace std { namespace tr1{
+
+   using ::boost::integral_constant;
+   using ::boost::true_type;
+   using ::boost::false_type;
+   using ::boost::is_void;
+   using ::boost::is_integral;
+   using ::boost::is_floating_point;
+   using ::boost::is_array;
+   using ::boost::is_pointer;
+   using ::boost::is_reference;
+   using ::boost::is_member_object_pointer;
+   using ::boost::is_member_function_pointer;
+   using ::boost::is_enum;
+   using ::boost::is_union;
+   using ::boost::is_class;
+   using ::boost::is_function;
+   using ::boost::is_arithmetic;
+   using ::boost::is_fundamental;
+   using ::boost::is_object;
+   using ::boost::is_scalar;
+   using ::boost::is_compound;
+   using ::boost::is_member_pointer;
+   using ::boost::is_const;
+   using ::boost::is_volatile;
+   using ::boost::is_pod;
+   using ::boost::is_empty;
+   using ::boost::is_polymorphic;
+   using ::boost::is_abstract;
+   using ::boost::has_trivial_constructor;
+   using ::boost::has_trivial_copy;
+   using ::boost::has_trivial_assign;
+   using ::boost::has_trivial_destructor;
+   using ::boost::has_nothrow_constructor;
+   using ::boost::has_nothrow_copy;
+   using ::boost::has_nothrow_assign;
+   using ::boost::has_virtual_destructor;
+   using ::boost::is_signed;
+   using ::boost::is_unsigned;
+   using ::boost::alignment_of;
+   using ::boost::rank;
+   using ::boost::extent;
+   using ::boost::is_same;
+   using ::boost::is_base_of;
+   using ::boost::is_convertible;
+   using ::boost::remove_const;
+   using ::boost::remove_volatile;
+   using ::boost::remove_cv;
+   using ::boost::add_const;
+   using ::boost::add_volatile;
+   using ::boost::add_cv;
+   using ::boost::remove_reference;
+   using ::boost::add_reference;
+   using ::boost::remove_extent;
+   using ::boost::remove_all_extents;
+   using ::boost::remove_pointer;
+   using ::boost::add_pointer;
+   using ::boost::aligned_storage;
+
+} }
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/unordered_map.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_UNORDERED_MAP_HPP_INCLUDED
+#  define BOOST_TR1_UNORDERED_MAP_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_UNORDERED_MAP
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(unordered_map)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(unordered_map))
+#  endif
+
+#else
+
+#include <boost/unordered_map.hpp>
+
+namespace std{ namespace tr1{
+
+   using ::boost::unordered_map;
+   using ::boost::unordered_multimap;
+   using ::boost::swap;
+
+} } // namespaces
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/unordered_set.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+//  (C) Copyright John Maddock 2008.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_UNORDERED_SET_HPP_INCLUDED
+#  define BOOST_TR1_UNORDERED_SET_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_UNORDERED_SET
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(unordered_set)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(unordered_set))
+#  endif
+
+#else
+
+#include <boost/unordered_set.hpp>
+
+namespace std{ namespace tr1{
+
+   using ::boost::unordered_set;
+   using ::boost::unordered_multiset;
+   using ::boost::swap;
+
+} } // namespaces
+
+#endif
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/boostlibrary/boost/tr1/utility.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,123 @@
+//  (C) Copyright John Maddock 2005.
+//  Use, modification and distribution are subject to the
+//  Boost Software License, Version 1.0. (See accompanying file
+//  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
+
+#ifndef BOOST_TR1_UTILITY_HPP_INCLUDED
+#  define BOOST_TR1_UTILITY_HPP_INCLUDED
+#  include <boost/tr1/detail/config.hpp>
+
+#ifdef BOOST_HAS_TR1_UTILITY
+
+#  ifdef BOOST_HAS_INCLUDE_NEXT
+#     include_next BOOST_TR1_HEADER(utility)
+#  else
+#     include <boost/tr1/detail/config_all.hpp>
+#     include BOOST_TR1_STD_HEADER(BOOST_TR1_PATH(utility))
+#  endif
+
+#else
+
+#if defined(BOOST_TR1_USE_OLD_TUPLE)
+
+#include <boost/type_traits/integral_constant.hpp>
+#include <boost/type_traits/add_const.hpp>
+#include <boost/type_traits/add_reference.hpp>
+#include <boost/mpl/if.hpp>
+
+
+namespace std{ namespace tr1{
+
+template <class T> struct tuple_size; // forward declaration
+template < int I, class T> struct tuple_element; // forward declaration
+
+#ifndef BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION
+template <class T1, class T2> 
+struct tuple_size< ::std::pair<T1, T2> >
+   : public ::boost::integral_constant< ::std::size_t, 2>
+{
+};
+
+template <class T1, class T2> 
+struct tuple_element<0, ::std::pair<T1, T2> >
+{
+   typedef typename std::pair<T1, T2>::first_type type;
+};
+
+template <class T1, class T2> 
+struct tuple_element<1, std::pair<T1, T2> >
+{
+   typedef typename std::pair<T1, T2>::second_type type;
+};
+#endif
+
+namespace tuple_detail{
+   template <int I, class T1, class T2>
+   struct tuple_get_result
+   {
+      typedef typename boost::mpl::if_c<I==0, T1, T2>::type t1;
+      typedef typename boost::add_reference<t1>::type type;
+   };
+   template <int I, class T1, class T2>
+   struct const_tuple_get_result
+   {
+      typedef typename boost::mpl::if_c<I==0, T1, T2>::type t1;
+# if BOOST_WORKAROUND( __BORLANDC__, BOOST_TESTED_AT( 0x582))
+      // I have absolutely no idea why add_const is not working here for Borland!
+      // It passes all other free-standing tests, some strange interaction going on
+      typedef typename boost::add_reference< const t1 >::type type;
+# else
+      typedef typename boost::add_const<t1>::type t2;
+      typedef typename boost::add_reference<t2>::type type;
+# endif
+   };
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::tuple_get_result<I,T1,T2>::type get(std::pair<T1, T2>& p, const ::boost::true_type&)
+{
+   return p.first;
+}
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::const_tuple_get_result<I,T1,T2>::type get(const std::pair<T1, T2>& p, const ::boost::true_type&)
+{
+   return p.first;
+}
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::tuple_get_result<I,T1,T2>::type get(std::pair<T1, T2>& p, const ::boost::false_type&)
+{
+   return p.second;
+}
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::const_tuple_get_result<I,T1,T2>::type get(const std::pair<T1, T2>& p, const ::boost::false_type&)
+{
+   return p.second;
+}
+
+}
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::tuple_get_result<I,T1,T2>::type get(std::pair<T1, T2>& p)
+{
+   return tuple_detail::get<I>(p, boost::integral_constant<bool, I==0>());
+}
+
+template<int I, class T1, class T2> 
+inline typename tuple_detail::const_tuple_get_result<I,T1,T2>::type get(const std::pair<T1, T2>& p)
+{
+   return tuple_detail::get<I>(p, boost::integral_constant<bool, I==0>());
+}
+
+} } // namespaces
+
+#else
+
+#include <boost/tr1/tuple.hpp>
+
+#endif
+
+#endif
+
+#endif
--- a/imgtools/imglib/group/bld.inf	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/imglib/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -64,5 +64,4 @@
 patchdataprocessor
 parameterfileprocessor
 memmap
-filesystem
 uidcrc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/group/testutf16str.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,29 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+
+
+TARGET			testutf16str.exe
+TARGETTYPE		exe
+SOURCEPATH		../host
+SOURCE			utf16string.cpp testutf16str.cpp
+USERINCLUDE		../inc
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+VENDORID 0x70000001
+
+option GCC -O2 -Wno-uninitialized
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/host/testutf16str.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,127 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include "UTF16String.h"
+#include <iostream>
+#include <fstream>
+#include <string>
+using namespace std ;
+
+#ifdef __LINUX__
+#define stricmp strcasecmp
+#endif
+
+void PrintHelp(){
+	cout <<  "Syntax: TestUTF16Str  <-[mbtou|utomb] > -i inputfilename -o outputfilename "<<endl; 
+	cout << "	mbtou is by default."<<endl;
+}
+int main(int argc, char* argv[]){
+	const char* input = 0 ;
+	const char* output = 0 ;
+	if(argc < 5){
+		PrintHelp();
+		return 1;
+	}
+	bool mbtou = true ;
+	int i = 1;
+	while(i < argc){
+		if('-' == *argv[i] || '/' == *argv[i]){
+			if(!stricmp(&(argv[i][1]),"utomb"))
+				mbtou = false ;
+			else if((argv[i][1] | 0x20) == 'i'){
+				i++ ;
+				if(i < argc)
+					input = argv[i];
+			}
+			else if((argv[i][1] | 0x20) == 'o'){
+				i++ ;
+				if(i < argc)
+					output = argv[i];
+			}
+			else if(stricmp(&(argv[i][1]),"mbtou")){
+				cerr << "Unrecognized option "<< argv[i] << endl ;
+			}				
+		}
+		else {
+			cerr << "Unrecognized option "<< argv[i] << endl ;
+		}
+		i++ ;			
+	}
+	if(!input || !output){
+		PrintHelp();
+		return 2;
+	}
+	fstream ifs(input, ios_base::in + ios_base::binary);	
+	if(!ifs.is_open()){
+		cerr << "Cannot open \""<< input << "\" for reading."<<endl ;
+		return 3;
+	}
+	fstream ofs(output, ios_base::out + ios_base::binary + ios_base::trunc);
+	if(!ofs.is_open()){
+		cerr << "Cannot open \""<< output << "\" for writing."<<endl ;
+		ifs.close();
+		return 4;
+	}
+	ifs.seekg(0,ios_base::end);
+	size_t length = ifs.tellg();
+	ifs.seekg(0,ios_base::beg);
+	char* buffer = new char[length + 2];
+	ifs.read(buffer,length);
+	buffer[length] = 0 ;
+	buffer[length + 1] = 0 ;
+	ifs.close();
+	static unsigned char const utf16FileHdr[2] = {0xFF,0xFE};
+	static unsigned char const utf8FileHdr[3] = {0xEF,0xBB,0xBF};
+	if(mbtou){
+		char* mbstr = buffer ;
+		if(length > 3){
+			if(memcmp(buffer,utf8FileHdr,sizeof(utf8FileHdr)) == 0){
+				mbstr += 3;
+				length -= 3 ;
+			}
+		}
+		UTF16String theStr(mbstr , length);
+		if(length > 0 && theStr.IsEmpty()){
+			cerr << "Convert Error[From UTF8 To UTF16]."<<endl ;
+		}
+		else{
+			length = theStr.length() << 1;			
+			ofs.write(reinterpret_cast<const char*>(utf16FileHdr),sizeof(utf16FileHdr));
+			ofs.write(reinterpret_cast<const char*>(theStr.c_str()),length);
+			cout << "Done."<<endl ;
+		}		
+	}
+	else{
+		TUint16* unistr = reinterpret_cast<TUint16*>(buffer);
+		length >>= 1;
+		if(*unistr == 0xFEFF){
+			unistr ++ ;
+			length -- ;		
+		}
+		UTF16String theStr(unistr , length);
+		string mbstr ;
+		if(!theStr.ToUTF8(mbstr)){
+			cerr << "Convert Error[From UTF16 To UTF8]."<<endl ;
+		}else{
+			//ofs.write(reinterpret_cast<const char*>(utf8FileHdr),sizeof(utf8FileHdr));
+			ofs.write(mbstr.c_str(),mbstr.length());
+			cout << "Done."<<endl ;
+		}
+	}
+	ofs.close();	
+	delete []buffer ;	
+	return 0;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/host/utf16string.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,262 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* @internalComponent * @released
+*
+*/
+
+#include "utf16string.h"
+#ifdef __LINUX__
+#include <iconv.h>
+#elif defined(WIN32)
+#ifdef _STLP_INTERNAL_WINDOWS_H
+#define __INTERLOCKED_DECLARED
+#endif
+#include <windows.h>
+#endif
+UTF16String::UTF16String() :iData(0), iLength(0){
+}
+UTF16String::UTF16String(const UTF16String& aRight){
+	iLength = aRight.iLength ;
+	iData = new TUint16[iLength + 1];
+	memcpy(iData,aRight.iData, iLength << 1);
+	iData[iLength] = 0;
+}
+UTF16String::UTF16String(const string& aUtf8Str){
+	iData = 0 ;
+	iLength = 0 ;
+	Assign(aUtf8Str.c_str(),aUtf8Str.length());
+}
+UTF16String::UTF16String(const TUint16* aUtf16Str,TInt aLength /* = -1*/){
+	
+	if(aLength < 0){
+		aLength = 0 ;
+		const TUint16* p = aUtf16Str ;
+		while(*p){
+			p++ ;
+			aLength ++ ;
+		}
+	}
+	if(aLength > 0){		
+		iLength = aLength ;
+		aLength <<= 1 ;
+		iData = new TUint16[iLength + 1] ;
+		memcpy(iData,aUtf16Str,aLength);
+		iData[iLength] = 0;
+	}else{
+		iData = 0 ;
+		iLength = 0 ;
+	}
+	
+}
+UTF16String::UTF16String(const char* aUtf8Str,TInt aLength /*= -1 */){
+	iData = 0 ;
+	iLength = 0 ;	
+	Assign(aUtf8Str,aLength);
+}	
+UTF16String::~UTF16String(){
+	if(iData)
+		delete []iData ;
+}	
+
+UTF16String& UTF16String::operator = (const UTF16String& aRight){
+	if(&aRight != this){
+		if(iData) 
+			delete []iData ; 
+		iLength = aRight.iLength ;
+		iData = new TUint16[iLength + 1];
+		memcpy(iData,aRight.iData, iLength << 1);
+		iData[iLength] = 0;
+	}
+	return *this;
+}
+bool UTF16String::FromFile(const char* aFileName){
+	if(!aFileName || !(*aFileName))
+		return false ;
+	ifstream ifs(aFileName,ios_base::in + ios_base::binary); 	
+	if(!ifs.is_open())
+		return false ;
+	
+	ifs.seekg(0,ios_base::end);
+	size_t length = ifs.tellg();
+	if((length % 2) == 1 ){
+		ifs.close() ;
+		return false ;
+	}
+	ifs.seekg(0,ios_base::beg);
+	TUint16 hdr ;
+	size_t readLen = length - sizeof(hdr) ;
+	length >>= 1 ;	
+	TUint16 *newData = new TUint16[length + 1];
+	ifs.read(reinterpret_cast<char*>(&hdr),sizeof(hdr));		
+	if(hdr == 0xFEFF){ 
+		ifs.read(reinterpret_cast<char*>(newData),readLen);
+		length -- ;
+	}
+	else{		 
+		*newData = hdr ;
+		ifs.read(reinterpret_cast<char*>(&newData[1]),readLen);
+	} 
+	ifs.close();
+	iLength = length ;
+	if(iData)
+		delete []iData ;
+	iData = newData ;
+	iData[iLength] = 0;	
+	return true ;
+}
+/**
+* aResult will not changed on error
+*/
+bool UTF16String::ToUTF8(string& aResult) const {
+	if(IsEmpty()){
+		aResult = "";
+		return true;
+	}
+	size_t bufLen = (iLength + 1) << 2 ;
+	char* buffer = new char[bufLen] ;
+#ifdef WIN32
+	int r = WideCharToMultiByte(CP_UTF8,0,reinterpret_cast<WCHAR*>(iData),iLength,buffer,bufLen,NULL,NULL);
+	if(r < 0){
+		delete []buffer ;
+		return false ;
+	}
+	buffer[r] = 0;
+	aResult.assign(buffer,r);
+#else
+	iconv_t it = iconv_open("UTF-8","UTF-16");
+	if((iconv_t)(-1) == it){ 
+		return  false;
+	}
+	char* bufferEnd = buffer ;
+	char* in_ptr = reinterpret_cast<char*>(iData);
+	size_t in_len = iLength << 1 ;
+	iconv(it,&in_ptr,&in_len ,&bufferEnd,&bufLen);
+	iconv_close(it);
+	*bufferEnd = 0 ;
+	size_t length = bufferEnd - buffer ;
+	aResult.assign(buffer,length);
+#endif
+	delete []buffer ;
+	return true ;
+}
+bool UTF16String::Assign(const char* aUtf8Str,TInt aLength /* = -1*/) {
+	if(0 == aUtf8Str) return false ;	
+	if(aLength < 0) aLength = strlen(aUtf8Str); 
+		
+#ifdef WIN32
+	size_t newLength = aLength + 1;
+	TUint16* newData = new TUint16[newLength];
+	int r = MultiByteToWideChar(CP_UTF8,0,aUtf8Str,aLength,reinterpret_cast<WCHAR*>(newData),newLength);
+	if(r < 0){
+		delete []newData ;
+		return false ;
+	}
+	iLength = r ;	
+#else
+	char* forFree = 0 ;
+	if(aUtf8Str[aLength - 1] != 0){
+		forFree = new char[aLength + 1];
+		memcpy(forFree,aUtf8Str,aLength );
+		forFree[aLength] = 0;
+		aUtf8Str = forFree ;
+	}
+	iconv_t it = iconv_open("UTF-16","UTF-8");
+	if((iconv_t)(-1) == it){ 
+		 
+		return  false;
+	}
+	size_t newLength = aLength + 2;
+	TUint16* newData = new TUint16[newLength];
+	newLength <<= 1;
+	char* out_ptr = reinterpret_cast<char*>(newData);
+	size_t in_len = aLength ;
+	char* in_ptr = const_cast<char*>(aUtf8Str);
+	iconv(it,&in_ptr,&in_len ,&out_ptr ,&newLength);
+	newLength = out_ptr - reinterpret_cast<char*>(newData);
+	iconv_close(it);
+	if(newLength % 2 == 1){ //should not be possible
+		delete []newData;
+		return false ;
+	}
+	iLength = (newLength >> 1) ;
+	if(forFree)
+		delete []forFree;
+#endif
+	newData[iLength] = 0 ;
+	if(iData){
+		delete []iData ;
+	}
+	iData = newData ;	
+	if(*iData == 0xFEFF)
+		iLength -- ;
+	
+	return true ;
+}
+static const TUint16 NullUInt16Str[1] = {0};
+const TUint16* UTF16String::c_str() const {
+	if(0 == iData)
+		return NullUInt16Str;
+	else if(0xFEFF != *iData)
+		return iData ;
+	else
+		return iData + 1;
+}
+///
+/// aUtf16Str must end with '\0'
+/// 
+int UTF16String::Compare(const TUint16* aUtf16Str) const {
+	if(!aUtf16Str || !(*aUtf16Str))
+		return (iLength > 0) ? 1 : 0; 
+	size_t i ;
+	for(i = 0 ; aUtf16Str[i] != 0 ; i++) { 
+		if( iData[i] > aUtf16Str[i])
+			return 1;
+		else if(iData[i] < aUtf16Str[i])
+			return -1 ;
+	}
+	return (i < iLength) ? 1 : 0 ; 
+}
+///
+/// aUtf16Str must end with '\0'
+/// 
+int UTF16String::CompareNoCase(const TUint16* aUtf16Str) const {
+	if(!aUtf16Str || !(*aUtf16Str))
+		return (iLength > 0) ? 1 : 0; 
+	size_t i ;
+	TUint16 a, b;
+	for(i = 0 ; aUtf16Str[i] != 0 ; i++) { 
+		a = iData[i];
+		b = aUtf16Str[i] ;
+		if( a >= 'A' && a <= 'Z') a |= 0x20 ;
+		if( b >= 'A' && b <= 'Z') b |= 0x20 ;
+			
+		if( a > b )
+			return 1;
+		else if( a < b )
+			return -1 ;
+	}
+	return (i < iLength) ? 1 : 0 ; 
+}
+TUint16* UTF16String::Alloc(size_t aNewLen) {
+	TUint16* newData = new TUint16[aNewLen + 1] ;
+	if(!newData) return 0;
+	if(iData) delete []iData ;
+	
+	iLength = aNewLen ;
+	iData = newData ;
+	*iData = 0 ;
+	iData[aNewLen] = 0;
+	return iData;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/inc/fatdefines.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,137 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#ifndef __FAT_DEFINES_HEADER__
+#define __FAT_DEFINES_HEADER__
+#include <e32std.h>
+struct TFATBootSector {
+	TUint8 BS_jmpBoot[3];
+	TUint8 BS_OEMName[8];
+	TUint8 BPB_BytsPerSec[2];
+	TUint8 BPB_SecPerClus;
+	TUint8 BPB_RsvdSecCnt[2];
+	TUint8 BPB_NumFATs;
+	TUint8 BPB_RootEntCnt[2];
+	TUint8 BPB_TotSec16[2];
+	TUint8 BPB_Media;
+	TUint8 BPB_FATSz16[2];
+	TUint8 BPB_SecPerTrk[2];
+	TUint8 BPB_NumHeads[2];
+	TUint8 BPB_HiddSec[4];
+	TUint8 BPB_TotSec32[4];	
+};
+struct TFAT32BSExt {
+	TUint8 BPB_FATSz32[4];
+	TUint8 BPB_ExtFlags[2];
+	TUint8 BPB_FSVer[2];
+	TUint8 BPB_RootClus[4];
+	TUint8 BPB_FSInfo[2];
+	TUint8 BPB_BkBootSec[2];
+	TUint8 BPB_Reserved[12];
+};
+
+struct TFATHeader {
+	TUint8 BS_DrvNum ;
+	TUint8 BS_Reserved1;
+	TUint8 BS_BootSig;
+	TUint8 BS_VolID[4];
+	TUint8 BS_VolLab[11];
+	TUint8 BS_FilSysType[8];
+};
+
+struct TFAT32FSInfoSector {
+	TUint8 FSI_LeadSig[4];
+	TUint8 FSI_Reserved1[480];
+	TUint8 FSI_StrucSig[4];
+	TUint8 FSI_Free_Count[4];
+	TUint8 FSI_Nxt_Free[4];
+	TUint8 FSI_Reserved2[12];
+	TUint8 FSI_TrailSig[4];
+};
+struct TShortDirEntry {
+    TUint8 DIR_Name[11];
+    TUint8 DIR_Attr ;
+    TUint8 DIR_NTRes ;
+    TUint8 DIR_CrtTimeTenth ;
+    TUint8 DIR_CrtTime[2] ;
+    TUint8 DIR_CrtDate[2] ;
+    TUint8 DIR_LstAccDate[2] ;
+    TUint8 DIR_FstClusHI[2] ;
+    TUint8 DIR_WrtTime[2] ;
+    TUint8 DIR_WrtDate[2];
+    TUint8 DIR_FstClusLO[2];
+    TUint8 DIR_FileSize[4] ;    
+};
+
+struct TLongDirEntry {
+    TUint8 LDIR_Ord ;
+    TUint8 LDIR_Name1[10] ;
+    TUint8 LDIR_Attr ;
+    TUint8 LDIR_Type ;
+    TUint8 LDIR_Chksum ;
+    TUint8 LDIR_Name2[12] ;
+    TUint8 LDIR_FstClusLO[2] ; 
+    TUint8 LDIR_Name3[4] ;
+};
+const TUint8 ATTR_READ_ONLY = 0x01 ;
+const TUint8 ATTR_HIDDEN = 0x02;
+const TUint8 ATTR_SYSTEM = 0x04;
+const TUint8 ATTR_VOLUME_ID = 0x08;
+const TUint8 ATTR_DIRECTORY = 0x10;
+const TUint8 ATTR_ARCHIVE = 0x20;
+const TUint8 ATTR_LONG_NAME = ATTR_READ_ONLY | ATTR_HIDDEN | ATTR_SYSTEM | ATTR_VOLUME_ID;
+
+//Time format, should be written as a integer in FAT image
+struct FatTime
+{
+	TUint16 Seconds:5;
+	TUint16 Minute:6;
+	TUint16 Hour:5;
+};
+
+//Date format, should be written as a integer in FAT image
+struct FatDate
+{
+	TUint16 Day:5;
+	TUint16 Month:4;
+	TUint16 Year:7;
+};
+
+//This union convention used to convert bit fields into integer
+union TDateInteger
+{
+	FatDate iCurrentDate;
+	TUint16 iImageDate;
+};
+
+//This union convention used to convert bit fields into integer
+union TTimeInteger
+{	
+	FatTime iCurrentTime;
+	TUint16 iImageTime;
+};
+struct ConfigurableFatAttributes
+{
+    char iDriveVolumeLabel[12];
+    TInt64 iImageSize ;
+    TUint16 iDriveSectorSize;
+    TUint8 iSectorPerCluster ;
+    TUint8 iDriveNoOfFATs;    
+    ConfigurableFatAttributes():iImageSize(0),iDriveSectorSize(512),iSectorPerCluster(0),iDriveNoOfFATs(2){
+        memcpy(iDriveVolumeLabel,"NO NAME    \0",12);
+    }
+};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/imglib/inc/utf16string.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,52 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+* @internalComponent * @released
+*
+*/
+
+#ifndef __UTF16_STRING_H__
+#define __UTF16_STRING_H__
+#include <e32std.h> 
+#include <string>
+#include <fstream>
+using namespace std ;
+
+class UTF16String {
+public :
+	
+	UTF16String();
+	UTF16String(const UTF16String& aRight);
+	UTF16String(const string& aUtf8Str);
+	UTF16String(const TUint16* aUtf16Str,TInt aLength = -1);
+	UTF16String(const char* aUtf8Str,TInt aLength = -1);	
+	~UTF16String();	
+	
+	bool FromFile(const char* aFileName);
+	bool ToUTF8(string& aResult) const ;	
+	bool Assign(const char* aUtf8Str,TInt aLength = -1);	
+	inline TUint length() const { return iLength ;} 
+	inline TUint bytes() const { return (iLength << 1) ;} 
+	const TUint16* c_str() const ;
+	inline bool IsEmpty() const { return  (0 == iLength) ;}	
+	UTF16String& operator = (const UTF16String& aRight);
+	int Compare(const TUint16* aUtf16Str) const ;
+	int CompareNoCase(const TUint16* aUtf16Str) const ;
+	TUint16* Alloc(size_t aNewLen);
+	
+protected:
+	TUint16* iData ;
+	TUint iLength ;	
+};
+#endif
--- a/imgtools/romtools/group/release.txt	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -1,3 +1,18 @@
+Version 2.12.0 (ROFSBUILD)
+===============
+Released by Jason Cui, 13/06/2010
+	1)Large FAT image support in Rofsbuild
+
+Version 2.11.5 (ROFSBUILD)
+===============
+Released by Jason Cui, 10/06/2010
+	1)Empty Directory Support in FAT Image
+
+Version 2.10.5 (rofsbuild)
+===============
+Released by Lorence Wang, 01/06/2010
+	1) DPDEF145488 ROFSBUILD crash on extension image creation
+
 Version 1.1.1 (fixupsym.pl)
 ===============
 Released by Lorence Wang, 12/05/2010
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/maksym/fixupsym	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+#!/bin/sh
+perl -S fixupsym.pl $@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/maksym/hpsym	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+#!/bin/sh
+perl -S hpsym.pl $@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/maksym/maksym	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+#!/bin/sh
+perl -S maksym.pl $@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/maksym/maksymrofs	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+#!/bin/sh
+perl -S maksymrofs.pl $@
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fatcluster.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,57 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include "fatcluster.h"
+#include <string.h> 
+#include <iostream>
+#include <new>
+
+TFatCluster::TFatCluster(int aIndex,int aActClustCnt/* = 1*/) :iIndex(aIndex), iActualClusterCount(aActClustCnt), 
+iSize(0) ,iData(0),iFileName(0),iLazy(true){  
+}
+
+TFatCluster::~TFatCluster() {
+	if(iData) 
+		delete []iData ;
+	if(iFileName)
+		delete []iFileName;
+}
+
+ 
+bool TFatCluster::Init(TUint aSize) {
+	if(iData == 0){
+		iData = reinterpret_cast<TUint8*>(new(std::nothrow) char[aSize]);
+		if(iData == 0)
+			return false ;
+		memset(iData,0,aSize);
+		iSize = aSize ;
+		iLazy = false ;
+		return true ;
+	}
+	return false ;
+}
+bool TFatCluster::LazyInit(const char* aFileName,TUint aFileSize){
+	if(iFileName == 0){		
+		int len = strlen(aFileName) + 1;
+		iFileName = new(std::nothrow) char[len] ;
+		if(iFileName == 0)
+			return false ;
+		iLazy = true ; 
+		memcpy(iFileName,aFileName,len);
+		iSize = aFileSize ;
+	}
+	return false;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fatcluster.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#ifndef __FAT_CLUSTER_HEADER__
+#define __FAT_CLUSTER_HEADER__
+#include <e32std.h>
+class TFatCluster {
+public:
+	TFatCluster(int aIndex,int aActClustCnt = 1);
+	~TFatCluster();
+	bool Init(TUint aSize);
+	bool LazyInit(const char* aFileName,TUint aFileSize); 
+	inline TUint8* GetData() const {return iData ;	}
+	inline TUint GetSize() const { return iSize ;}
+	inline const char* GetFileName() const { return iFileName ;}
+	inline bool IsLazy() const { return iLazy;}
+	inline int ActualClusterCount() const { return iActualClusterCount;}
+	inline int GetIndex() const { return iIndex ;}
+protected:
+	int iIndex ; 
+	int iActualClusterCount ;
+	TUint iSize ; // length of file or size of data
+	TUint8* iData ;
+	char* iFileName ;	
+	bool iLazy ;
+};
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fatimagegenerator.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,541 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/ 
+#include "fatimagegenerator.h"
+#include "fatcluster.h"
+#include "fsnode.h"
+#include "h_utl.h"
+
+#include <memory.h>
+#include <time.h>
+#include <iostream>
+#include <fstream>
+#include <iomanip>
+using namespace std;
+
+const TInt KCharsOfCmdWndLine = 80 ;
+const TInt KRootEntryCount = 0x200;
+const TInt KRootClusterIndex = 0;
+
+TFatImgGenerator::TFatImgGenerator(TSupportedFatType aType ,ConfigurableFatAttributes& aAttr ) :
+iType(aType),
+iFatTable(0),
+iFatTableBytes(0), 
+iTotalClusters(0),	
+iBytsPerClus(0)
+{
+	memset(&iBootSector,0,sizeof(iBootSector));
+	memset(&iFat32Ext,0,sizeof(iFat32Ext));
+	memset(&iFatHeader,0,sizeof(iFatHeader));
+	if(aAttr.iDriveSectorSize != 512 && aAttr.iDriveSectorSize != 1024 && aAttr.iDriveSectorSize != 2048 && aAttr.iDriveSectorSize != 4096) {
+		iType = EFatUnknown ;
+		return ;
+	}
+	*((TUint32*)iBootSector.BS_jmpBoot) = 0x00905AEB ; 
+	memcpy(iBootSector.BS_OEMName,"SYMBIAN ",8);
+	*((TUint16 *)iBootSector.BPB_BytsPerSec) = aAttr.iDriveSectorSize;
+	
+	iBootSector.BPB_NumFATs = aAttr.iDriveNoOfFATs;
+	iBootSector.BPB_Media = 0xF8 ;
+	iFatHeader.BS_DrvNum = 0x80 ;
+	iFatHeader.BS_BootSig = 0x29 ;
+
+	time_t rawtime;
+	time(&rawtime);
+	*((TUint32*)iFatHeader.BS_VolID) = (TUint32)rawtime;
+	memcpy(iFatHeader.BS_VolLab,aAttr.iDriveVolumeLabel,sizeof(iFatHeader.BS_VolLab));
+	if(aAttr.iImageSize == 0){
+		if(aType == EFat32)
+			aAttr.iImageSize = 0x100000000LL ;// 4G
+		else
+			aAttr.iImageSize = 0x40000000LL ; // 1G 
+	}
+
+	TUint32 totalSectors = (TUint32)((aAttr.iImageSize + aAttr.iDriveSectorSize - 1) / aAttr.iDriveSectorSize);
+	if(aType == EFat32) {
+		InitAsFat32(totalSectors,aAttr.iSectorPerCluster ,aAttr.iDriveSectorSize);
+	}
+	else if(aType == EFat16) {
+		InitAsFat16(totalSectors,aAttr.iSectorPerCluster,aAttr.iDriveSectorSize); 
+	}
+	if(iType == EFatUnknown) return ;
+	iBytsPerClus = iBootSector.BPB_SecPerClus * aAttr.iDriveSectorSize;
+//	if(iBytsPerClus > KMaxClusterBytes){
+//		Print(EError,"Cluster too large!\n");
+//		iType = EFatUnknown;
+//		return ;
+//	}
+	
+
+}
+TFatImgGenerator::~TFatImgGenerator() {
+	if(iFatTable)
+		delete []iFatTable;  
+	Interator it = iDataClusters.begin();
+	while(it != iDataClusters.end()){
+		TFatCluster* cluster = *it ;
+		delete cluster;
+		it++;
+	}
+}
+
+void TFatImgGenerator::InitAsFat16(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec){
+	
+	TUint32 numOfClusters ;
+	if(aSecPerClus == 0) {
+		//Auto-calc the SecPerClus
+		// FAT32 ,Count of clusters must >= 4085 and < 65525 , however , to avoid the "off by xx" warning, 
+		// proprositional value >= (4085 + 16) && < (65525 - 16)
+		if(aTotalSectors < (4085 + 16)) { //when SecPerClus is 1, numOfClusters eq to aTotalSectors
+			iType = EFatUnknown ;
+			Print(EError,"Size is too small for FAT16, please set a bigger size !\n");
+			return ;
+		}
+		TUint8 secPerClusMax = KMaxClusterBytes / aBytsPerSec; 
+		numOfClusters = (aTotalSectors + secPerClusMax - 1) / secPerClusMax ; 
+		if(numOfClusters >= (65525 - 16)) { // too big 
+			iType = EFatUnknown ;
+			Print(EError,"Size is too big for FAT16, please use the FAT32 format!\n");
+			return ;
+		}
+		
+		aSecPerClus = 1;
+		while(aSecPerClus < secPerClusMax){
+			numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus ;
+			if (numOfClusters >= (4085 + 16) && numOfClusters < (65525 - 16)) {
+				break;
+			}
+			aSecPerClus <<= 1 ; 
+		}	
+	}
+	else {
+		if( (aSecPerClus * aBytsPerSec) > KMaxClusterBytes){
+			Print(EError,"Cluster too large!\n");
+			iType = EFatUnknown;
+			return ;
+		}
+		numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus;
+		if(numOfClusters >= (65525 - 16)){
+      Print(EError,"Cluster count is too big for FAT16, please use the FAT32 format or set a new bigger sector count of cluster!\n");
+			iType = EFatUnknown ;
+			return ;
+		}
+		else if(numOfClusters < (4085 + 16)){
+      Print(EError,"Cluster count is too small for FAT16, please set a new small sector count of cluster or set the size bigger!\n");
+			iType = EFatUnknown ;
+			return ;
+		}
+
+	}
+	iTotalClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus ;
+	iFatTableBytes = ((iTotalClusters << 1) +  aBytsPerSec - 1) & (~(aBytsPerSec - 1)); 
+	iFatTable = new(std::nothrow) char[iFatTableBytes];
+	if(!iFatTable) {
+        Print(EError,"Memory allocation failed for FAT16 Table!\n");
+		iType = EFatUnknown ;
+		return ;
+	}
+	memset(iFatTable,0,iFatTableBytes);
+	*((TUint32*)iFatTable) = 0xFFFFFFF8 ; 
+	iBootSector.BPB_SecPerClus = aSecPerClus;
+	*((TUint16*)iBootSector.BPB_RsvdSecCnt) = 0x0001 ;
+	*((TUint16*)iBootSector.BPB_RootEntCnt) = KRootEntryCount ;
+	if(aTotalSectors > 0xFFFF)
+		*((TUint32*)iBootSector.BPB_TotSec32) = aTotalSectors; 
+	else
+		*((TUint16*)iBootSector.BPB_TotSec16) = (TUint16)aTotalSectors; 
+	TUint16 sectorsForFAT = (TUint16)((iFatTableBytes + aBytsPerSec - 1) / aBytsPerSec);
+	*((TUint16*)iBootSector.BPB_FATSz16) =  sectorsForFAT ; 
+	memcpy(iFatHeader.BS_FilSysType,"FAT16   ",sizeof(iFatHeader.BS_FilSysType));
+}
+void TFatImgGenerator::InitAsFat32(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec) { 
+	
+	TUint32 numOfClusters;
+	if(aSecPerClus == 0) {
+		//Auto-calc the SecPerClus
+		// FAT32 ,Count of clusters must >= 65525, however , to avoid the "off by xx" warning, 
+		// proprositional value >= (65525 + 16)			
+		if(aTotalSectors < (65525 + 16)) { //when SecPerClus is 1, numOfClusters eq to aTotalSectors
+			iType = EFatUnknown ;
+			Print(EError,"Size is too small for FAT32, please use the FAT16 format, or set the data size bigger!\n");
+			return ;
+		}
+
+		TUint8 secPerClusMax = KMaxClusterBytes / aBytsPerSec; 
+		aSecPerClus = secPerClusMax;
+		while(aSecPerClus > 1){
+			numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus ;
+			if (numOfClusters >= (65525 + 16)) {
+				break;
+			}
+			aSecPerClus >>= 1 ; 
+		}	
+	}
+	else {
+		if( (aSecPerClus * aBytsPerSec) > KMaxClusterBytes){
+			Print(EError,"Cluster too large!\n");
+			iType = EFatUnknown;
+			return ;
+		}
+		numOfClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus;
+		if(numOfClusters < (65525 + 16)) {
+            Print(EError,"Cluster count is too small for FAT32, please set a new small sector count of cluster or set the size bigger or use the FAT16 format!\n");
+			iType = EFatUnknown ;
+			return ;
+		}
+
+	}
+	iTotalClusters = (aTotalSectors + aSecPerClus - 1) / aSecPerClus ;
+	iFatTableBytes = ((iTotalClusters << 2) +  aBytsPerSec - 1) & (~(aBytsPerSec - 1));
+	iFatTable = new(std::nothrow) char[iFatTableBytes];
+	if(!iFatTable) {
+        Print(EError,"Memory allocation failed for FAT32 Table!\n");
+		iType = EFatUnknown ;
+		return ;
+	}
+	memset(iFatTable,0,iFatTableBytes);
+	TUint32* fat32table = reinterpret_cast<TUint32*>(iFatTable);
+	fat32table[0] = 0x0FFFFFF8 ;
+	fat32table[1] = 0x0FFFFFFF ;  
+	iBootSector.BPB_SecPerClus = aSecPerClus;
+	iBootSector.BPB_RsvdSecCnt[0] = 0x20 ;
+	*((TUint32*)iBootSector.BPB_TotSec32) = aTotalSectors; 
+	*((TUint32*)iFat32Ext.BPB_FATSz32) =  (iFatTableBytes + aBytsPerSec - 1) / aBytsPerSec; 
+	*((TUint32*)iFat32Ext.BPB_RootClus) = 2 ; 
+	*((TUint16*)iFat32Ext.BPB_FSInfo) = 1 ;
+	*((TUint16*)iFat32Ext.BPB_BkBootSec) = 6 ;
+	memcpy(iFatHeader.BS_FilSysType,"FAT32   ",sizeof(iFatHeader.BS_FilSysType));
+}
+
+bool TFatImgGenerator::Execute(TFSNode* aRootDir , const char* aOutputFile){
+	if(EFatUnknown == iType)
+		return false ;	
+	ofstream o(aOutputFile,ios_base::binary + ios_base::out + ios_base::trunc);
+	TUint32 writtenBytes = 0 ;
+	if(!o.is_open()) {
+  	Print(EError,"Can not open \"%s\" for writing !\n",aOutputFile) ;
+		return false;
+	}
+	TUint16 bytsPerSector = *((TUint16*)iBootSector.BPB_BytsPerSec);
+	Interator it = iDataClusters.begin();
+	while(it != iDataClusters.end()){
+		TFatCluster* cluster = *it ;
+		delete cluster;
+		it++;
+	}
+	iDataClusters.clear();
+	Print(EAlways,"Filesystem ready.\nWriting Header...");
+	
+	if(EFat16 == iType){		 
+		char* header = new(std::nothrow) char[bytsPerSector];
+		if(!header){
+      Print(EError,"Can not allocate memory for FAT16 header!\n");
+			o.close();
+			return false ;
+		}
+		int offset = 0;
+		memcpy(header,&iBootSector,sizeof(iBootSector));
+		offset = sizeof(iBootSector);
+		memcpy(&header[offset],&iFatHeader,sizeof(iFatHeader));
+		offset += sizeof(iFatHeader);
+		memset(&header[offset],0,bytsPerSector - offset);
+		*((TUint16*)(&header[510])) = 0xAA55 ;
+
+		o.write(header,bytsPerSector); 
+		writtenBytes +=  bytsPerSector;
+		delete []header ;		 
+		TUint16 rootDirSectors = (KRootEntryCount * 32) / bytsPerSector ;
+		TUint16 rootDirClusters = (rootDirSectors + iBootSector.BPB_SecPerClus - 1) /iBootSector.BPB_SecPerClus;		 
+		TUint32 rootDirBytes = KRootEntryCount * 32;
+		TFatCluster* rootDir = new(std::nothrow) TFatCluster(0,rootDirClusters);
+		rootDir->Init(rootDirBytes);
+		iDataClusters.push_back(rootDir);
+		aRootDir->WriteDirEntries(KRootClusterIndex,rootDir->GetData());
+		 
+		TUint index = 2 ;
+		Print(EAlways,"    OK.\nPreparing cluster list..."); 
+		TFSNode* child = aRootDir->GetFirstChild() ; 
+		while(child){
+			if(!PrepareClusters(index,child)){
+                Print(EAlways,"    Failed.\nError:Image size is expected to be big enough for all the files.\n");
+				return false ;
+			}
+			child = child->GetSibling() ;
+		}
+	}
+	else if(EFat32 == iType){
+
+		TUint headerSize = ( bytsPerSector << 5 ); // 32 reserved sectors for fat32
+		char* header = new(std::nothrow) char[headerSize];
+		if(!header){
+            Print(EError,"Can not allocate memory for FAT32 header!\n");
+			o.close();
+			return false ;
+		}
+		memset(header,0,headerSize);
+
+		int offset = 0;
+		memcpy(header,&iBootSector,sizeof(iBootSector));
+		offset = sizeof(iBootSector);
+		memcpy(&header[offset],&iFat32Ext,sizeof(iFat32Ext));
+		offset += sizeof(iFat32Ext);
+		memcpy(&header[offset],&iFatHeader,sizeof(iFatHeader));
+		offset += sizeof(iFatHeader);
+
+		TFAT32FSInfoSector* fsinfo = reinterpret_cast<TFAT32FSInfoSector*>(&header[bytsPerSector]);
+		*((TUint32*)fsinfo->FSI_LeadSig) = 0x41615252 ;
+		*((TUint32*)fsinfo->FSI_StrucSig) = 0x61417272 ;
+		memset(fsinfo->FSI_Free_Count,0xFF,8);
+		char* tailed = header + 510 ;
+		for(int i = 0 ; i < 32 ; i++ , tailed += bytsPerSector )
+			*((TUint16*)tailed) = 0xAA55 ;		
+		 
+		TUint index = 2 ;		
+		Print(EAlways,"    OK.\nPreparing cluster list...");
+		if(!PrepareClusters(index,aRootDir)) {
+            Print(EAlways,"    Failed.\nERROR: Image size is expected to be big enough for all the files.\n");
+			delete []header ;
+			return false;
+		}
+	 
+ 
+		*(TUint32*)(fsinfo->FSI_Free_Count) = iTotalClusters - index + 3;
+		*(TUint32*)(fsinfo->FSI_Nxt_Free) =  index ;
+
+		// write bakup boot sectors
+		memcpy(&header[bytsPerSector * 6],header,(bytsPerSector << 1));
+		o.write(header,headerSize); 
+		writtenBytes += headerSize;
+		delete []header ;
+	}
+	//iDataClusters.sort();
+	it = iDataClusters.end() ;
+	it -- ;
+	int clusters = (*it)->GetIndex() + (*it)->ActualClusterCount() - 1;
+
+	Print(EAlways,"    OK.\n%d clusters of data need to be written.\nWriting Fat table...",clusters);
+	for(TUint8 w = 0 ; w < iBootSector.BPB_NumFATs ; w++){
+		o.write(iFatTable,iFatTableBytes);	 
+		if(o.bad() || o.fail()){
+			Print(EAlways,"\nERROR:Writting failed. Please check the filesystem\n");
+			delete []iFatTable,
+			o.close();
+			return false ;
+		}
+		writtenBytes += iFatTableBytes;
+	}
+	char* buffer = new(std::nothrow) char[KBufferedIOBytes];
+	if(!buffer){
+    Print(EError,"Can not allocate memory for I/O buffer !\n");
+		o.close();
+		return false ;
+	}
+	o.flush();
+	Print(EAlways,"    OK.\nWriting clusters data...");
+ 
+	int bytesInBuffer = 0;
+	int writeTimes = 24; 
+ 
+	TFatCluster* lastClust = 0 ;	
+	for(it = iDataClusters.begin(); it != iDataClusters.end() ; it++ ){
+		TFatCluster* cluster = *it ;
+		TUint fileSize = cluster->GetSize(); 		 
+		TUint toProcess = cluster->ActualClusterCount() * iBytsPerClus ; 
+		if(toProcess > KBufferedIOBytes){ // big file 
+			if(bytesInBuffer > 0){
+				o.write(buffer,bytesInBuffer); 
+				if(o.bad() || o.fail()){
+					Print(EError,"Writting failed.\n");
+					delete []buffer,
+					o.close();
+					return false ;
+				}
+				writtenBytes += bytesInBuffer;
+				bytesInBuffer = 0;
+				Print(EAlways,".");
+				writeTimes ++ ;
+				if((writeTimes % KCharsOfCmdWndLine) == 0){
+					o.flush();
+					cout << endl ;
+				} 
+			}
+			if(cluster->IsLazy()){
+				ifstream ifs(cluster->GetFileName(), ios_base::binary + ios_base::in);
+				if(!ifs.is_open()){
+					Print(EError,"Can not open file \"%s\"\n",cluster->GetFileName()) ;
+					o.close();
+					delete []buffer;
+					return false ;
+				}
+				if(!ifs.good()) ifs.clear(); 
+				TUint processedBytes = 0 ; 
+
+				while(processedBytes < 	fileSize){
+					TUint ioBytes = fileSize - processedBytes ;
+					if(ioBytes > KBufferedIOBytes)
+						ioBytes = KBufferedIOBytes;
+					ifs.read(buffer,ioBytes);
+					processedBytes += ioBytes;					 
+					o.write(buffer,ioBytes); 
+					if(o.bad() || o.fail()){
+						Print(EError,"Writting failed.\n");
+						delete []iFatTable,
+						o.close();
+						return false ;
+					}
+					writtenBytes += ioBytes;
+					Print(EAlways,".");
+					writeTimes ++ ;
+					if((writeTimes % KCharsOfCmdWndLine) == 0){
+						o.flush();
+						Print(EAlways,"\n") ;
+					}
+
+				}
+				TUint paddingBytes = toProcess - processedBytes;
+				if( paddingBytes > 0 ){
+					memset(buffer,0,paddingBytes);
+					o.write(buffer,paddingBytes);
+					if(o.bad() || o.fail()){
+						Print(EError,"Writting failed.\n");
+						delete []buffer,
+						o.close();
+						return false ;
+					}
+					writtenBytes += paddingBytes;
+				}
+				ifs.close();
+
+			}
+			else {
+				// impossible 
+        Print(EError,"Unexpected result!\n");
+				o.close();
+				delete []buffer;
+				return false ;
+			}
+		}
+		else {
+			if(toProcess > (KBufferedIOBytes - bytesInBuffer)){
+				o.write(buffer,bytesInBuffer); 
+				if(o.bad() || o.fail()){
+					Print(EError,"Writting failed.\n");
+					delete []buffer,
+					o.close();
+					return false ;
+				}
+				writtenBytes += bytesInBuffer;
+				Print(EAlways,".");
+				writeTimes ++ ;
+				if((writeTimes % KCharsOfCmdWndLine) == 0){
+					o.flush();
+					cout  << endl ;
+				}
+				bytesInBuffer = 0;
+			}
+			if(cluster->IsLazy()){
+				ifstream ifs(cluster->GetFileName(), ios_base::binary + ios_base::in);
+				if(!ifs.is_open()){
+				    Print(EError,"Can not open file \"%s\"\n",cluster->GetFileName()) ;
+					o.close();
+					delete []buffer;
+					return false ;
+				}
+				if(!ifs.good()) ifs.clear(); 
+				ifs.read(&buffer[bytesInBuffer],fileSize);
+				bytesInBuffer += fileSize;
+				if(toProcess > fileSize) { // fill padding bytes 
+					memset(&buffer[bytesInBuffer],0,toProcess - fileSize);
+					bytesInBuffer += (toProcess - fileSize);
+				}
+				ifs.close();
+
+			}
+			else{
+				if(toProcess != cluster->GetSize() && cluster->GetIndex() != KRootClusterIndex){
+        	Print(EError,"Unexpected size!\n");
+					o.close();
+					delete []buffer;
+					return false ;
+				}
+				memcpy(&buffer[bytesInBuffer],cluster->GetData(),cluster->GetSize());
+				bytesInBuffer += cluster->GetSize();
+			}
+
+		} 
+		lastClust = cluster ;	 
+
+	}
+	if(bytesInBuffer > 0){
+		o.write(buffer,bytesInBuffer);
+		if(o.bad() || o.fail()){
+			Print(EError,"Writting failed.\n");
+			delete []buffer,
+			o.close();
+			return false ;
+		}
+		writtenBytes += bytesInBuffer;
+		o.flush();
+	}
+	Print(EAlways,"\nDone.\n\n");
+	o.close();
+
+	return true ;
+}
+bool TFatImgGenerator::PrepareClusters(TUint& aNextClusIndex,TFSNode* aNode) { 
+	TUint sizeOfItem = aNode->GetSize();
+	TUint clusters = (sizeOfItem + iBytsPerClus - 1) / iBytsPerClus;
+	
+	if(iTotalClusters < aNextClusIndex + clusters)
+		return false ;
+		
+	TUint16* fat16Table = reinterpret_cast<TUint16*>(iFatTable);
+	TUint32* fat32Table = reinterpret_cast<TUint32*>(iFatTable);	 
+	 
+	for(TUint i = aNextClusIndex + clusters - 1 ; i > aNextClusIndex  ; i--){
+		if(iType == EFat16)
+			fat16Table[i - 1] = i ;
+		else
+			fat32Table[i - 1] = i ;
+	}
+	if(iType == EFat16)
+		fat16Table[aNextClusIndex + clusters - 1] = 0xffff ;
+	else
+		fat32Table[aNextClusIndex + clusters - 1] = 0x0fffffff ;
+		
+	TFatCluster* cluster = new TFatCluster(aNextClusIndex,clusters);
+	if(aNode->IsDirectory()) {
+    TUint bytes = clusters * iBytsPerClus ;
+		cluster->Init(bytes);
+		aNode->WriteDirEntries(aNextClusIndex,cluster->GetData());
+	}
+	else {
+		cluster->LazyInit(aNode->GetPCSideName(),sizeOfItem);
+		aNode->WriteDirEntries(aNextClusIndex,NULL);
+	}
+	iDataClusters.push_back(cluster);
+ 
+	aNextClusIndex += clusters;
+	if(aNode->GetFirstChild()){
+		if(!PrepareClusters(aNextClusIndex,aNode->GetFirstChild()))
+			return false ;
+	}
+	if(aNode->GetSibling()){
+		if(!PrepareClusters(aNextClusIndex,aNode->GetSibling()))
+			return false;
+	}
+	return true ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fatimagegenerator.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,70 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#ifndef __FAT_IMAGE_GENERATER_HEADER__
+#define __FAT_IMAGE_GENERATER_HEADER__
+
+#include "fatdefines.h"
+
+#include <iostream>
+#include <list>
+#include <fstream>
+using namespace std ;
+const unsigned int KBufferedIOBytes = 0x800000 ; // 8M 
+const unsigned int KMaxClusterBytes = 0x8000; // 32K
+enum TSupportedFatType {
+	EFatUnknown = 0,
+	EFat16 = 1,
+	EFat32 = 2
+};
+ 
+class TFSNode;
+class TFatCluster;
+typedef list<TFatCluster*> PFatClusterList ;
+typedef list<TFatCluster*>::iterator Interator ;
+
+class TFatImgGenerator
+{
+public :
+	//The constructor ,
+	//a TFatImgGenerator is created and initialized,
+	//if the parameters breaks the FAT specification,
+	// then iType is set to EFatUnknown and thus
+	// IsValid return false
+	TFatImgGenerator(TSupportedFatType aType , ConfigurableFatAttributes& aAttr  );
+	~TFatImgGenerator();
+	inline bool IsValid() const { return (EFatUnknown != iType);}
+	
+	//Create the FAT image, 
+	//If FAT image is not valid, or error accurs, return false
+	bool Execute(TFSNode* aRootDir , const char* aOutputFile);
+protected :
+	void InitAsFat16(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec);
+	void InitAsFat32(TUint32 aTotalSectors,TUint8 aSecPerClus,TUint16 aBytsPerSec);
+	bool PrepareClusters(TUint& aNextClusIndex,TFSNode* aNode);
+	TSupportedFatType iType ;
+	char* iFatTable ; 
+	TUint iFatTableBytes ;  
+	TUint iTotalClusters ;	
+	TUint iBytsPerClus ;
+	TFATBootSector iBootSector ;
+	TFAT32BSExt iFat32Ext ;
+	TFATHeader iFatHeader ;	
+	PFatClusterList iDataClusters ;
+};
+
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fsnode.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,518 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#include "fsnode.h"
+#include "fatdefines.h"
+#include "utf16string.h"
+#include <stdio.h> 
+#include <iostream>
+#include <iomanip>
+#include <stdio.h> 
+#include <stdlib.h> 
+ 
+#include <ctype.h> 
+ 
+
+#ifdef __LINUX__
+#include <dirent.h> 
+#include <sys/stat.h>
+#include <unistd.h>
+#define SPLIT_CHAR '/'
+#else
+#include <io.h> 
+#include <direct.h> //TODO: check under MinGW4 + stlport 5.2
+#include <conio.h> 
+#define SPLIT_CHAR '\\'
+#endif
+ 
+using namespace std;
+
+const TUint KBytesPerEntry = 13 ;
+//
+TFSNode::TFSNode(TFSNode* aParent, const char* aFileName, TUint8 aAttrs, const char* aPCSideName)  :
+iParent(aParent),iFirstChild(0),iSibling(0),iAttrs(aAttrs), iPCSideName(0), iWideName(0){
+	
+  // According to the FAT specification, short name should be inited with empty string (' ' string)
+	memset(iShortName,0x20,11);  
+	iShortName[11] = 0 ; 
+	if(aFileName) {
+		iFileName = strdup(aFileName);
+		GenerateBasicName() ;	
+	} 
+	if(aPCSideName) {
+		iPCSideName = strdup(aPCSideName);
+	}
+	iFATEntry = 0;
+	iCrtTimeTenth  = 0;
+	iCrtTime.iImageTime = 0 ;
+	iCrtDate.iImageDate = 0 ;
+	iLstAccDate.iImageDate = 0  ;
+	iWrtTime.iImageTime = 0 ;
+	iWrtDate.iImageDate = 0  ;
+	iFileSize = 0;
+	if(!iParent) return ;
+	
+	if(!iParent->iFirstChild)
+	    iParent->iFirstChild = this ;
+    else {
+        TFSNode* sibling = iParent->iFirstChild;
+        while(sibling->iSibling)
+            sibling = sibling->iSibling ;
+        sibling->iSibling = this ;
+    } 
+
+}
+TFSNode::~TFSNode(){
+	if(iFirstChild)
+		delete iFirstChild ;
+	if(iSibling)
+		delete iSibling ;
+	if(iFileName)
+		free(iFileName) ;
+	if(iWideName)
+		delete iWideName;
+}
+TFSNode* TFSNode::CreateFromFolder(const char* aPath,TFSNode* aParent) { 
+	static char fileName[2048];
+	int len = strlen(aPath);  
+#ifdef __LINUX__
+	DIR* dir = opendir(aPath);
+	if(dir == NULL) {
+		cout << aPath << " does not contain any subfolder/file.\n";     
+			return aParent;
+	}
+	if(!aParent)
+		aParent = new TFSNode(NULL,"/",ATTR_VOLUME_ID);
+	dirent*  entry; 
+	struct stat statbuf ;
+	while ((entry = readdir(dir)) != NULL)  {
+		if(entry->d_name[0] == '.') continue ; 
+			memcpy(fileName,aPath,len); 
+			fileName[len] = SPLIT_CHAR;
+			strcpy(&fileName[len+1],entry->d_name);             
+			stat(fileName , &statbuf);         
+			TFSNode* pNewItem = new TFSNode(aParent,fileName,S_ISDIR(statbuf.st_mode) ? ATTR_DIRECTORY : 0);
+			pNewItem->Init(statbuf.st_ctime,statbuf.st_atime,statbuf.st_mtime,statbuf.st_size);         
+			if(S_ISDIR(statbuf.st_mode)){ 
+				CreateFromFolder(fileName,pNewItem);
+			}  
+	}
+	closedir(dir);
+#else
+	struct _finddata_t data ;
+	memset(&data, 0, sizeof(data)); 	
+	char* pattern = new char[len + 4] ;
+	memcpy(pattern,aPath,len);
+	pattern[len] = SPLIT_CHAR;
+	pattern[len+1] = '*';
+	pattern[len+2] = 0;
+
+	intptr_t hFind =  _findfirst(pattern,&data);
+	delete []pattern ;
+ 
+	if(hFind == (intptr_t)-1 ) {
+		cout << aPath << " does not contain any subfolder/file.\n";		
+		return aParent;
+	}
+	if(!aParent)
+	    aParent = new TFSNode(NULL,"/",ATTR_VOLUME_ID);
+	do {        
+        if(data.name[0] == '.') 
+            continue ; 
+        memcpy(fileName,aPath,len); 
+        fileName[len] = SPLIT_CHAR;
+        strcpy(&fileName[len+1],data.name); 
+        TUint8 attr = 0;
+        if(data.attrib & _A_SUBDIR)  
+            attr |= ATTR_DIRECTORY;
+        if(data.attrib & _A_RDONLY)
+            attr |= ATTR_READ_ONLY ;
+        if(data.attrib &  _A_HIDDEN)
+            attr |= ATTR_HIDDEN ;
+        if(data.attrib & _A_SYSTEM)
+            attr |= ATTR_SYSTEM ;
+        if(data.attrib & _A_ARCH)
+            attr |= ATTR_ARCHIVE;      
+        TFSNode* pNewItem = new TFSNode(aParent,fileName,attr);        
+        pNewItem->Init(data.time_create,data.time_access,data.time_write,data.size);            
+        if(data.attrib & _A_SUBDIR){ 
+            CreateFromFolder(fileName,pNewItem);
+        }  
+ 
+    } while(-1 != _findnext(hFind, &data));
+    _findclose(hFind);
+#endif
+ 
+	return aParent;
+}
+ 	
+
+
+static const char* lbasename(const char* aFullName) {
+	const char* retval = aFullName ;
+	while(*aFullName) {
+		if('\\' == *aFullName || '/' == *aFullName )
+			retval = ++aFullName ;
+		else
+			aFullName ++ ;
+	}
+	return retval ;
+}
+/** GenerateBasicName : Generate the short name according to long name 
+	* 
+	* algorithm :
+	* 
+	* 1.	The UNICODE name passed to the file system is converted to upper case.
+	* 2.	The upper cased UNICODE name is converted to OEM.
+	*     if (the uppercased UNICODE glyph does not exist as an OEM glyph in the OEM code page)
+	*				or	(the OEM glyph is invalid in an 8.3 name)
+	*			{
+	*				Replace the glyph to an OEM '_' (underscore) character.
+	*				Set a "lossy conversion" flag.
+	*			}
+	* 3.	Strip all leading and embedded spaces from the long name.
+	* 4.	Strip all leading periods from the long name.
+	* 5.	While		(not at end of the long name)
+	*					and	(char is not a period)
+	*					and	(total chars copied < 8)
+	*			{
+	*				Copy characters into primary portion of the basis name
+	*			}
+	*	6.	Insert a dot at the end of the primary components of the basis-name 
+	*     if the basis name has an extension after the last period in the name.
+	*
+	* 7.	Scan for the last embedded period in the long name.
+	*     If	(the last embedded period was found)
+	*     {
+	*     	While		(not at end of the long name) and	(total chars copied < 3)
+	*     	{
+	*     		Copy characters into extension portion of the basis name
+	*     	}
+	*     }
+  *
+  */
+void TFSNode::GenerateBasicName() { 
+	const char* filename = lbasename(iFileName);	 
+	TUint length = strlen(filename);
+	if(0 == length)
+	    return ;
+	if(0 == strcmp(filename,".")){
+        iShortName[0] = '.' ;
+        return ;
+	}
+	if(0 == strcmp(filename,"..")){
+        iShortName[0] = '.' ;
+        iShortName[1] = '.' ;
+        return ;
+	}	
+#ifdef _DEBUG
+		cout << "GenericBasicName: \"" << filename ;
+#endif	
+	iWideName = new UTF16String(filename,length); // The unicode string
+	char base[10];
+	const char* ext = filename + length;
+	
+	//Strip all leading periods and spaces from the long name.
+	while(*filename == '.' || *filename == ' ' || *filename == '\t') {
+		filename ++ ;
+		length -- ;
+	}
+	//find the extension
+	while(ext > filename && *ext != '.')
+		ext -- ;
+	if(ext == filename){
+		ext = "" ; 
+	}
+	else {
+		length = ext - filename;
+		ext ++ ;
+	} 
+	bool lossyConv = false ;
+	TUint bl = 0;
+	for(TUint i = 0 ; i < length ; i++) {
+		if(filename[i] >= 'a' && filename[i] <= 'z')
+			base[bl++] = filename[i] + 'A' - 'a';
+		else if(filename[i] >= 'A' && filename[i] <= 'Z')
+			base[bl++] = filename[i];
+		else if(filename[i] == '$' || filename[i] == '%' ||
+			filename[i] == '-' || filename[i] == '_' || filename[i] == '@' ||
+			filename[i] == '~' || filename[i] == '`' || filename[i] == '!' ||
+			filename[i] == '(' || filename[i] == ')' || filename[i] == '{' ||
+			filename[i] == '}' || filename[i] == '^' || filename[i] == '#' ||
+			filename[i] == '&' ||filename[i] == '\'')
+			base[bl++] = filename[i];
+		else if(filename[i] != ' ' && filename[i] != '.'){
+			base[bl++] = '_';
+			lossyConv = true ;
+		}
+		if(bl > 8){
+			bl -- ;
+			lossyConv = true ;
+			break ;
+		}		
+	}
+	if(lossyConv){
+		if(bl > 6) bl = 6 ;		
+		iShortName[bl] = '~';
+		iShortName[bl+1] = '1';		
+	}
+	memcpy(iShortName,base,bl);
+
+	//Copy the extension part.	
+	TUint ei = 8;
+	for(TUint e = 0; ei < 11 && ext[e] != 0 ; e++){
+		if(ext[e] >= 'a' && ext[e] <= 'z')
+			iShortName[ei++] = ext[e] + 'A' - 'a';
+		else if(ext[e] >= 'A' && ext[e] <= 'Z')
+			iShortName[ei++] = ext[e] ;
+		else if(ext[e] == '$' || ext[e] == '%' || ext[e] == '-' || ext[e] == '_' || 
+			ext[e] == '@' || ext[e] == '~' || ext[e] == '`' || ext[e] == '!' || 
+			ext[e] == '(' || ext[e] == ')' || ext[e] == '{' || ext[e] == '}' || 
+			ext[e] == '^' || ext[e] == '#' || ext[e] == '&' ||ext[e] == '\'')
+			iShortName[ei++] = ext[e] ;
+	}
+ 
+	if(iParent) 
+		iParent->MakeUniqueShortName(iShortName,bl);
+#ifdef _DEBUG
+		cout << "\" => \"" << iShortName << "\"\n";
+#endif	
+}
+
+#ifdef _DEBUG
+void TFSNode::PrintTree(int nTab) {
+	for( int i = 0 ; i < nTab ; i++ )
+		cout << " " ;
+	cout << (iFileName ? iFileName : "") << " [" << hex << setw(2) << setfill('0') << (unsigned short)iAttrs << "] \n" ;
+	if(iFirstChild)
+		iFirstChild->PrintTree(nTab + 2);
+	if(iSibling)
+		iSibling->PrintTree(nTab);
+}
+#endif
+bool TFSNode::IsDirectory() const {
+	return 0 != (iAttrs & ATTR_DIRECTORY);
+}
+int TFSNode::GetWideNameLength() const {
+	if(!iWideName)
+		return 0 ;
+	return iWideName->length() ;
+}
+TUint TFSNode::GetSize() const {
+	
+	if(  0 == (iAttrs & ATTR_DIRECTORY))
+		return iFileSize ;
+	TUint retVal = sizeof(TShortDirEntry) ; // the tailed entry 
+	if(iParent)
+		retVal += sizeof(TShortDirEntry) * 2 ;
+	TFSNode* child = iFirstChild ;
+	while(child) {
+		TUint longNameEntries =  (child->GetWideNameLength() + KBytesPerEntry) / KBytesPerEntry  ;
+		retVal += longNameEntries * sizeof(TLongDirEntry) ;
+		retVal += sizeof(TShortDirEntry);
+		child = child->iSibling ;
+	}
+	return retVal ;
+}
+ 
+void TFSNode::Init(time_t aCreateTime, time_t aAccessTime, time_t aWriteTime, TUint aSize ) {
+	
+	struct tm* temp = localtime(&aCreateTime);
+	iCrtDate.iCurrentDate.Day = temp->tm_mday;
+	iCrtDate.iCurrentDate.Month = temp->tm_mon+1; //As per FAT spec
+	iCrtDate.iCurrentDate.Year = temp->tm_year - 80;//As per FAT spec
+	iCrtTime.iCurrentTime.Hour = temp->tm_hour;
+	iCrtTime.iCurrentTime.Minute = temp->tm_min;
+	iCrtTime.iCurrentTime.Seconds = temp->tm_sec / 2;//As per FAT spec
+	iCrtTimeTenth = 0;
+	
+	temp = localtime(&aAccessTime);	
+	iLstAccDate.iCurrentDate.Day = temp->tm_mday;
+	iLstAccDate.iCurrentDate.Month = temp->tm_mon+1; //As per FAT spec
+	iLstAccDate.iCurrentDate.Year = temp->tm_year - 80;//As per FAT spec
+	
+	temp = localtime(&aWriteTime);
+	iWrtDate.iCurrentDate.Day = temp->tm_mday;
+	iWrtDate.iCurrentDate.Month = temp->tm_mon+1; //As per FAT spec
+	iWrtDate.iCurrentDate.Year = temp->tm_year - 80;//As per FAT spec
+	iWrtTime.iCurrentTime.Hour = temp->tm_hour;
+	iWrtTime.iCurrentTime.Minute = temp->tm_min;
+	iWrtTime.iCurrentTime.Seconds = temp->tm_sec / 2;//As per FAT spec 
+	
+	iFileSize = aSize ; 
+}
+/** WriteDirEntries : Write FAT information for this node to a cluster buffer
+	* aStartIndex : [in],the beginning index of the outputed cluster  
+  * aClusterData : [in,out] the cluster buffer
+  * 
+  * notice, aClusterData is only required if node is a directory node.
+  * for a file node, no data will be written out.
+  * in this case, only corresponding cluster index information is updated.
+  */ 
+void TFSNode::WriteDirEntries(TUint aStartIndex,TUint8* aClusterData){
+	if(iFATEntry){
+		*((TUint16*)iFATEntry->DIR_FstClusHI) = (aStartIndex >> 16) ;
+		*((TUint16*)iFATEntry->DIR_FstClusLO) = (aStartIndex & 0xFFFF) ;
+	}
+	 
+	if(iAttrs & ATTR_DIRECTORY) { // Directory , write dir entries ; 
+		TShortDirEntry* entry = reinterpret_cast<TShortDirEntry*>(aClusterData);
+		if(iParent != NULL) {
+			//Make 
+			GetShortEntry(entry); 
+			//TODO: Add comments to avoid mistaken deleting.			
+			memcpy(entry->DIR_Name,".            ",sizeof(entry->DIR_Name));
+			entry ++ ;
+			iParent->GetShortEntry(entry);
+			memcpy(entry->DIR_Name,"..           ",sizeof(entry->DIR_Name));
+			entry ++ ; 
+		}		 
+		TFSNode* child = iFirstChild ;
+		while(child){			
+			int items = child->GetLongEntries(reinterpret_cast<TLongDirEntry*>(entry));
+			entry += items ;
+			child->GetShortEntry(entry);
+			child->iFATEntry = entry ;
+			entry ++ ;
+			child = child->iSibling ; 
+			
+		}
+
+	}
+}
+/** GetShortEntry : Make a short directory entry (FAT16/32 conception)
+  * aEntry : the entry buffer   
+  */ 
+void TFSNode::GetShortEntry(TShortDirEntry* aEntry) {
+  if(!aEntry) return ;
+	if(iFATEntry){
+		if(iFATEntry != aEntry)
+			memcpy(aEntry,iFATEntry,sizeof(TShortDirEntry));
+		return ;
+	}
+	memcpy(aEntry->DIR_Name,iShortName,sizeof(aEntry->DIR_Name)); 
+	aEntry->DIR_Attr = iAttrs;
+	aEntry->DIR_NTRes = 0 ;
+	aEntry->DIR_CrtTimeTenth = 0 ;        
+	memcpy(aEntry->DIR_CrtTime,&iCrtTime,sizeof(aEntry->DIR_CrtTime)); 
+	memcpy(aEntry->DIR_CrtDate,&iCrtDate,sizeof(aEntry->DIR_CrtDate));
+	memcpy(aEntry->DIR_LstAccDate,&iLstAccDate,sizeof(aEntry->DIR_LstAccDate));
+	memset(aEntry->DIR_FstClusHI,0,sizeof(aEntry->DIR_FstClusHI));
+	memcpy(aEntry->DIR_WrtTime,&iWrtTime,sizeof(aEntry->DIR_WrtTime)); 
+	memcpy(aEntry->DIR_WrtDate,&iWrtDate,sizeof(aEntry->DIR_WrtDate)); 
+	memset(aEntry->DIR_FstClusLO,0,sizeof(aEntry->DIR_FstClusLO)); 
+	memcpy(aEntry->DIR_FileSize,&iFileSize,sizeof(aEntry->DIR_FileSize));  
+}
+TUint8 FATChkSum(const char* pFcbName) {
+    short fcbNameLen ;
+    TUint8 sum = 0 ;
+    for(fcbNameLen = 11 ; fcbNameLen != 0 ; fcbNameLen --) {
+        sum = ((sum & 1) ? 0x80 : 0 ) + (sum >> 1 ) + *pFcbName++ ; 
+    }
+    return sum ;        
+}
+/** GetLongEntries : Make a series of long directory entries (FAT16/32 conception)
+  * aEntries : the start addr of the long directory entries buffer
+  *
+  * return value : actual entris count.   
+  */ 
+int TFSNode::GetLongEntries(TLongDirEntry* aEntries) {
+  
+  if(!aEntries) return 0;
+	int packs = (GetWideNameLength() + KBytesPerEntry) / KBytesPerEntry  ;
+	
+	TUint buflen = packs * KBytesPerEntry;
+	TUint16* buffer = new(std::nothrow) TUint16[buflen];
+	if(!buffer)
+	return 0 ;
+	memset(buffer,0xff,(buflen << 1));    
+	if(iWideName) {
+	    memcpy(buffer,iWideName->c_str(),iWideName->bytes()); 
+	    buffer[iWideName->length()] = 0;
+	}
+	TUint8 chkSum = FATChkSum(iShortName);;
+    
+	TUint16* ptr = buffer ;
+	TLongDirEntry* entry = aEntries +(packs - 1);
+  for(int i = 1 ; i <= packs ; i++, entry--) {		
+		entry->LDIR_Ord = i ;
+		entry->LDIR_Chksum = chkSum ;
+		entry->LDIR_Attr = (TUint8)ATTR_LONG_NAME;    
+		*((TUint16*)(entry->LDIR_FstClusLO)) = 0;
+		entry->LDIR_Type = 0;         
+		memcpy(entry->LDIR_Name1,ptr,10); 
+		memcpy(entry->LDIR_Name2,&ptr[5],12); 
+		memcpy(entry->LDIR_Name3,&ptr[11],4);
+		ptr += 13; 
+  }
+	aEntries->LDIR_Ord |= 0x40 ;
+    
+	delete []buffer ;
+	return packs ; 
+}
+/** Make a unique name for a new child which has not been added.
+  * to avoid same short names under a directory
+  * rShortName : [in,out] , The new short name to be checked and changed.
+  * baseNameLength: [in], the length of the base part of the short name 
+  * not including the "~n"
+  * for example, 
+  *  "ABC.LOG" => baseNameLength == 3 ("ABC")
+  *  "AB~1.TXT" => baseNameLength == 2 ("AB")
+  *
+  *
+  *The Numeric-Tail Generation Algorithm
+
+  * If (a "lossy conversion" was not flagged)
+  * 		and	(the long name fits within the 8.3 naming conventions)
+  * 		and	(the basis-name does not collide with any existing short name)
+  * {
+  * 	The short name is only the basis-name without the numeric tail.
+  * }
+  * else {
+  * 	Insert a numeric-tail "~n" to the end of the primary name such that the value of 
+  *		the "~n" is chosen so that the name thus formed does not collide with 
+  *		any existing short name and that the primary name does not exceed eight
+  *		characters in length.
+  * }
+  * The "~n" string can range from "~1" to "~999999". 
+  *
+  */
+
+void TFSNode::MakeUniqueShortName(char rShortName[12],TUint baseNameLength) const { 
+	bool dup ;
+	char nstring[10];
+	int n = 0 ;	
+	do {
+		TFSNode* child = iFirstChild ; 
+		dup = false ;
+		while(child){		 
+			if(0 == memcmp(rShortName,child->iShortName,11)) {
+				dup = true ;
+				break ;
+			}
+			child = child->iSibling ;
+		}
+		if(dup){ //duplex , increase the index , make a new name 
+			int nlen = sprintf(nstring,"~%u",++n);
+			while((baseNameLength + nlen > 8) && baseNameLength > 1)
+				baseNameLength -- ;
+			memcpy(&rShortName[baseNameLength],nstring,nlen);
+			
+		}
+	}while(dup) ;
+		 
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/fsnode.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,85 @@
+/*
+* Copyright (c) 2010 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+#ifndef __FILE_SYSTEM_ITEM_HEADER__
+#define __FILE_SYSTEM_ITEM_HEADER__ 
+#include "fatdefines.h"
+#include <time.h>
+class UTF16String; 
+class TFSNode {
+public :
+   TFSNode(TFSNode* aParent = 0 ,const char* aFileName = 0, TUint8 aAttrs = 0, const char* aPCSideName = 0);
+	~TFSNode() ;
+#ifdef _DEBUG
+	void PrintTree(int nTab = 0);
+#endif
+	inline TUint8 GetAttrs() const { return iAttrs ;}
+	inline const char* GetFileName() const { return (iFileName != 0) ? iFileName : "" ;}
+	inline const char* GetPCSideName() const { return (iPCSideName != 0) ? iPCSideName : "" ;}
+	inline TFSNode* GetParent() const { return iParent;}
+	inline TFSNode* GetFirstChild() const {return iFirstChild;}
+	inline TFSNode* GetSibling() const { return iSibling ;}
+	
+	// return the size of memory needed to store this entry in a FAT system
+	// for a file entry, it's size of file
+	// for a directory entry, it's sumup of memory for subdir and files entry storage
+	TUint GetSize() const ; 
+	
+	bool IsDirectory() const ;
+	
+	//Except for "." and "..", every direcoty/file entry in FAT filesystem are treated as with
+	//"long name", for the purpose of reserving case sensitive file name.
+	// This function is for GetLongEntries() to know length of long name .
+	int GetWideNameLength() const ;
+	
+	// To init the entry,
+	// For a file entry, aSize is the known file size,
+	// For a directory entry, aSize is not cared.	
+	void Init(time_t aCreateTime, time_t aAccessTime, time_t aWriteTime, TUint aSize );
+	
+	//This function is used by TFatImgGenerator::PrepareClusters, to prepare the clusters 
+	// aClusterData should points to a buffer which is at least the size returns by 
+	// GetSize() 
+	void WriteDirEntries(TUint aStartIndex, TUint8* aClusterData ); 
+	
+	static TFSNode* CreateFromFolder(const char* aPath,TFSNode* aParent = NULL);
+	
+	
+	
+protected:
+	void GenerateBasicName();
+	void MakeUniqueShortName(char rShortName[12],TUint baseNameLength) const;
+	void GetShortEntry(TShortDirEntry* aEntry);
+	int GetLongEntries(TLongDirEntry* aEntries) ; 
+	TFSNode* iParent ;
+	TFSNode* iFirstChild ;
+	TFSNode* iSibling ;
+	TUint8 iAttrs ;
+	char* iPCSideName;
+	char* iFileName;
+	char iShortName[12];
+	UTF16String* iWideName ;	
+	TTimeInteger iCrtTime ;
+	TDateInteger iCrtDate ;
+	TUint8 iCrtTimeTenth ;
+	TDateInteger iLstAccDate ;
+	TTimeInteger iWrtTime ;
+	TDateInteger iWrtDate ;
+	TUint iFileSize ;
+	TShortDirEntry* iFATEntry ;
+};
+ 
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cache.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+/**
+ * @file cache.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHE_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHE_H_
+
+
+#define BOOST_FILESYSTEM_NO_DEPRECATED
+
+
+/**
+ * @class Cache
+ * @brief Cache
+ */
+class Cache
+{
+public:
+	/**
+	 * @fn static Cache* Cache::GetInstance(void)
+	 * @brief Retrieve singleton instance of class Cache.
+	 * @return The singleton instance.
+	 */
+	static Cache* GetInstance(void) throw (CacheException);
+
+	/**
+	 * @fn void Cache::Initialize(path* CacheRoot)
+	 * @brief Load Cache meta data file and initialize inner structures.
+	 * @exception CacheException I/O operation failures or resource allocation failures.
+	 */
+	void Initialize(void) throw (CacheException);
+
+	/**
+	 * @fn CacheEntry Cache::GetEntryList(const char* OriginalFilename)
+	 * @param OriginalFilename The filename of original executable which is being cached.
+	 * @return A list of cached items for the original executables or NULL if there's no entries match the original filename.
+	 */
+	CacheEntry* GetEntryList(const char* OriginalFilaname);
+
+	/**
+	 * @fn void Cache::SetEntry(const char* OriginalFilename, CacheEntry* EntryRef)
+	 * @brief Add a new cache entry into cache or update an existing cache entry.
+	 * @param OriginalFilename The filename of the original executable file.
+	 * @param EntryRef The address pointing to an instance of class CacheEntry, must be valid, verified by the caller.
+	 */
+	void AddEntry(const char* OriginalFilename, CacheEntry* EntryRef);
+
+	/**
+	 * @fn void Cache::CloseCache(void)
+	 * @brief Update cache with all cache entries.
+	 * @exception CacheException Catch errors occurring when the Cache gets updated.
+	 */
+	void CloseCache(void) throw (CacheException);
+protected:
+	bool ValidateEntry(std::string& EntryRawText);
+
+	static Cache* Only;
+
+	std::string metafile;
+
+	boost::mutex cachemutex;
+
+	std::map<std::string, CacheEntry*> entrymap;
+private:
+	Cache(void);
+
+	Cache(const Cache&);
+
+	Cache& operator = (const Cache&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHE_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cacheablelist.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,56 @@
+/**
+ * @file cacheablelist.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEABLELIST_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEABLELIST_H_
+
+
+/**
+ * @class CacheableList
+ * @brief CacheableList is used to hold buffers for executable files to be written into the cache.
+ */
+class CacheableList
+{
+public:
+	/**
+	 * @fn CacheableList* CacheableList::GetInstance(void)
+	 * @return The singleton instance of class CacheableList.
+	 * @exception CacheException Not enough system resource to create an instance at the first this method gets called.
+	 */
+	static CacheableList* GetInstance(void) throw (CacheException);
+
+	/**
+	 * @fn void CacheableList::AddCacheable(CacheEntry* EntryRef)
+	 * @brief Add a file which needs to be cached into the list, cache generator will process this list.
+	 * @param EntryRef The instance of CacheEntry, it represents the file which is going to be cached.
+	 */
+	void AddCacheable(CacheEntry* EntryRef);
+
+	/**
+	 * @fn CacheEntry* CacheableList::GetCacheable(void)
+	 * @brief Retrieve a file from this list and write it into cache, the write operation is performed by cache generator.
+	 * @return The instance of CacheEntry, used by cache generator.
+	 */
+	CacheEntry* GetCacheable(void);
+
+	virtual ~CacheableList(void);
+protected:
+	static CacheableList* Only;
+
+	std::queue<CacheEntry*> filelist;
+
+	boost::condition_variable queuecond;
+
+	boost::mutex queuemutex;
+private:
+	CacheableList(void);
+
+	CacheableList(const CacheableList&);
+
+	CacheableList& operator = (const CacheableList&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEABLELIST_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cacheentry.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,96 @@
+/**
+ * @file cacheentry.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEENTRY_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEENTRY_H_
+
+
+/**
+ * @class CacheEntry
+ * @brief CacheEntry holds both original executable data and cached executable data.
+ */
+class CacheEntry
+{
+public:
+	CacheEntry(void);
+
+	/**
+	 * @fn void CacheEntry::SetOriginalFilename(const char* OriginalFilename)
+	 * @brief Assign the original filename of the executable to be cached.
+	 * @param OriginalFilename The original filename.
+	 */
+	void SetOriginalFilename(const char* OriginalFilename);
+
+	/**
+	 * @fn const char* CacheEntry::GetOriginalFilename(void)
+	 * @return The original filename.
+	 */
+	const char* GetOriginalFilename(void) const;
+
+	void SetCachedFilename(const char* CachedFilename);
+
+	const char* GetCachedFilename(void) const;
+
+	void SetOriginalFileCreateTime(time_t* CreateRawTime);
+
+	void SetOriginalFileCreateTime(const char* CreateRawTime);
+
+	const char* GetOriginalFileCreateTime(void) const;
+
+	void SetOriginalFileCompression(const char* CompressionMethodID);
+
+	void SetOriginalFileCompression(unsigned int CompressionMethodID);
+
+	const char* GetOriginalFileCompressionID(void) const;
+
+	void SetCachedFileCompression(const char* CompressionMethodID);
+
+	void SetCachedFileCompression(unsigned int CompressionMethodID);
+
+	const char* GetCachedFileCompressionID(void) const;
+
+	void SetCachedFileBuffer(char* FileBuffer, int FileBufferLen);
+
+	const char* GetCachedFileBuffer(void) const;
+
+	int GetCachedFileBufferLen(void) const;
+
+	void AppendEntry(CacheEntry* EntryRef);
+
+	CacheEntry* GetNextEntry(void) const;
+
+	void SetNextEntry(CacheEntry* EntryRef);
+
+	bool Equals(CacheEntry* EntryRef);
+
+	virtual ~CacheEntry(void);
+protected:
+	std::string originalfile;
+
+	std::string cachedfile;
+
+	std::string originalfilecreatetime;
+
+	std::string originalfilecompression;
+
+	std::string cachedfilecompression;
+
+	std::string compressionenabled;
+
+	std::string compressionindicator;
+
+	CacheEntry* next;
+
+	char* cachedfilebuffer;
+
+	int cachedfilebuffersize;
+private:
+	CacheEntry(const CacheEntry&);
+
+	CacheEntry& operator = (const CacheEntry&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEENTRY_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cacheexception.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,55 @@
+/**
+ * @file cacheexception.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEEXCEPTION_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEEXCEPTION_H_
+
+
+/**
+ * @class CacheException
+ * @brief Encapsulates all possible failures happening inside cache.
+ */
+class CacheException
+{
+public:
+	/**
+	 * @fn CacheException::CacheException(int ErrorCode)
+	 * @brief Constructor
+	 * @param ErrorCode The error code, must be one of the static constants.
+	 */
+	CacheException(int ErrorCode);
+
+	/**
+	 * @fn int CacheException::GetErrorCode(void)
+	 * @brief Retrieve integer error number.
+	 * @reurn The error code.
+	 */
+	int GetErrorCode(void);
+
+	/**
+	 * @fn const char* CacheException::GetErrorMessage(void)
+	 * @brief Retrieve text error message.
+	 * @return The error message.
+	 */
+	const char* GetErrorMessage(void);
+
+	virtual ~CacheException(void);
+
+	static int EPOCROOT_NOT_FOUND         ;
+	static int RESOURCE_ALLOCATION_FAILURE;
+	static int CACHE_NOT_FOUND            ;
+	static int CACHE_INVALID              ;
+	static int CACHE_IS_EMPTY             ;
+	static int HARDDRIVE_FAILURE          ;
+protected:
+	int errcode;
+private:
+	CacheException(void);
+
+	CacheException& operator = (const CacheException&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEEXCEPTION_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cachegenerator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+/**
+ * @file cachegenerator.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEGENERATOR_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEGENERATOR_H_
+
+
+/**
+ * @class CacheGenerator
+ * @brief Cache Generator will be running in a separated thread, its job is to pick up an invalidated entry from the CacheableList and then write the content into the cache.
+ */
+class CacheGenerator : public boost::thread
+{
+public:
+	/**
+	 * @fn static CacheGenerator* CacheGenerator::GetInstance(void)
+	 * @brief Get singleton instance.
+	 * @return The singleton instance.
+	 * @exception CacheException Catch resource allocation failures.
+	 */
+	static CacheGenerator* GetInstance(void) throw (CacheException);
+
+	/**
+	 * @fn void CacheGenerator::ProcessFiles(void)
+	 * @brief Pick up an invalidated entry from the cacheable list and write the content into the cache (i.e. under cache root directory).
+	 */
+	static void ProcessFiles(void) throw (CacheException);
+protected:
+	static CacheGenerator* Only;
+private:
+	CacheGenerator(void);
+
+	CacheGenerator(const CacheGenerator&);
+
+	CacheGenerator& operator = (const CacheGenerator&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEGENERATOR_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cachemanager.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,99 @@
+/**
+ * @file cachemanager.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEMANAGER_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEMANAGER_H_
+
+
+#define BOOST_FILESYSTEM_NO_DEPRECATED
+
+
+/**
+ * @class CacheManager
+ * @brief Managing cache content and the processing of generating/updating cache.
+ * @note CacheManager will accept forward slashes as file separators and all input filenames will be normalized.
+ */
+class CacheManager
+{
+public:
+	/**
+	 * @fn static CacheManager* CacheManager::GetInstance(void)
+	 * @brief This method is thread-safe as it's using double-check pattern for singleton creation.
+	 * @exception CacheException Catch initialization failures.
+	 * @return Retrieve the singleton instance of class CacheManager.
+	 */
+	static CacheManager* GetInstance(void) throw (CacheException);
+
+	/**
+	 * @fn E32ImageFile* CacheManager::GetE32ImageFile(char* Filename, int CurrentCompressionID)
+	 * @brief Retrieve an instance of class E32ImageFile.
+	 * @param OriginalFilename The filename of the original file.
+	 * @param CurrentCompressionID The ID of compression method used over current image build.
+	 * @return Instance of class E32ImageFile or NULL if the original file has not been cached yet.
+	 */
+	E32ImageFile* GetE32ImageFile(char* OriginalFilename, int CurrentCompressionID);
+
+	/**
+	 * @fn CacheEntry* CacheManager::GetE32ImageFileRepresentation(char* OriginalFilename, int CurrentCompressionID, int FileFlags)
+	 * @param OriginalFilename The filename of the original executable file.
+	 * @param CurrentCompressionID
+	 * @return A valid cached entry or NULL if the original file has not been cached yet.
+	 */
+	CacheEntry* GetE32ImageFileRepresentation(char* OriginalFilename, int CurrentCompressionID);
+
+	/**
+	 * @fn void CacheManager::Invalidate(const char* Filename)
+	 * @brief Add an invalidated cache entry into the cacheable list.
+	 * @param Filename The filename of the original file.
+	 * @param EntryRef The reference of newly created CacheEntry instance.
+	 * @exception CacheException Catch resource allocation failures.
+	 */
+	void Invalidate(char* Filename, CacheEntry* EntryRef) throw (CacheException);
+
+	/**
+	 * @fn void CacheManager::CleanCache(void)
+	 * @brief Remove all cache content from hard drive.
+	 * @exception CacheException Catch I/O failures on deletion.
+	 */
+	void CleanCache(void) throw (CacheException);
+
+	/**
+	 * @fn const char* CacheManager::GetCacheRoot(void)
+	 * @brief Retrieve the root directory of cache.
+	 * @return The absolute path of root directory.
+	 */
+	const char* GetCacheRoot(void);
+
+	/**
+	 * @fn CacheManager::~CacheManager(void)
+	 * @brief Clean up allocated resources and writes Cache class back in the cache.
+	 * @note It's important to delete CacheManager instance if you created it with new operation.
+	 */
+	virtual ~CacheManager(void);
+
+	/**
+	 * @fn void CacheManager::NormalizeFilename(char* Filename)
+	 * @brief Convert back slashes into forward slashes and remove redundant slashes.
+	 * @param Filename The filename which will be normalized when this function gets returned.
+	 */
+	void NormalizeFilename(char* Filename);
+protected:
+	void InitializeCache(void) throw (CacheException);
+
+	char* cacheroot;
+
+	static boost::mutex creationlock;
+
+	static CacheManager* Only;
+private:
+	CacheManager(void);
+
+	CacheManager(const CacheManager&);
+
+	CacheManager& operator = (const CacheManager&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEMANAGER_H_ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/inc/cache/cachevalidator.hpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,44 @@
+/**
+ * @file cachevalidator.hpp
+ */
+
+
+#ifndef ROM_TOOLS_ROFSBUILD_CACHE_CACHEVALIDATOR_H_
+#define ROM_TOOLS_ROFSBUILD_CACHE_CACHEVALIDATOR_H_
+
+
+/**
+ * @class CacheValidator
+ * @brief Validate an existing cache entry.
+ */
+class CacheValidator
+{
+public:
+	/**
+	 * @fn CacheValidator* CacheValidator::GetInstance(void)
+	 * @brief Get singleton instance of class CacheValidator.
+	 * @return The singleton instance.
+	 * @exception CacheException Catch allocation failures.
+	 */
+	static CacheValidator* GetInstance(void) throw (CacheException);
+
+	/**
+	 * @fn CacheEntry* CacheValidator::Validate(const char* OriginalFilename, int CurrentCompressionID)
+	 * @brief Validate cached executable with original version.
+	 * @param OriginalFilename The filename of original executable.
+	 * @param CurrentCompressionID The ID of compression method used over current image build.
+	 * @return The entry for cached file or zero if the given executable file is invalidated.
+	 */
+	CacheEntry* Validate(const char* OriginalFilename, int CurrentCompressionID);
+protected:
+	static CacheValidator* Only;
+private:
+	CacheValidator(void);
+
+	CacheValidator(const CacheValidator&);
+
+	CacheValidator& operator = (const CacheValidator&);
+};
+
+
+#endif  /* defined ROM_TOOLS_ROFSBUILD_CACHE_CACHEVALIDATOR_H_ */
--- a/imgtools/romtools/rofsbuild/r_driveimage.cpp	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/r_driveimage.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -20,7 +20,13 @@
 
 #include <stdlib.h>
 #include <string>
-
+#include "fsnode.h"
+#include "fatimagegenerator.h"
+#include <boost/filesystem.hpp>
+#include <stack>
+#include <utility>
+#include <new>
+using namespace boost ;
 #ifdef __LINUX__
 	
 	#include <dirent.h>
@@ -48,125 +54,96 @@
 #include "r_romnode.h"
 #include "r_rofs.h"
 #include "r_driveimage.h"
-
-
-// File format supported by Rofsbuild
-DriveFileFormatSupported CDriveImage::iFormatType[] =
-	{
-		{"FAT16",EFAT16},
-		{"FAT32",EFAT32},
-		{0,EFATINVALID}
-	};
-
-
-/**
-File format conversion from char* to coresponding enum value.
-
-@param aUserFileFormat - pointer to user entered file format.
-@param aDriveFileFormat - Reference to actual variable.
-*/
-TBool CDriveImage::FormatTranslation(const char* aUserFileFormat,enum TFileSystem& aDriveFileFormat)
-	{
-	struct DriveFileFormatSupported* strPointer = iFormatType;
-	for( ; (strPointer->iDriveFileFormat) != '\0' ; ++strPointer )
-		{
-		if(!strcmp(aUserFileFormat,strPointer->iDriveFileFormat))
-			{
-			aDriveFileFormat = strPointer->iFileSystem;
-			return ETrue;
-			}
-		}	
-	return EFalse;
-	}
-
-
+ 
 /**
 Constructor: CDriveImage class 
 
 @param aObey - pointer to Drive obey file.
 */
 CDriveImage::CDriveImage(CObeyFile *aObey)
-	: iObey( aObey ),iParentDirEntry(0),iListReference(0),iTempDirName(NULL), iData(0)
-	{
-	}
-
-
-/**
-Destructor: CDriveImage class 
-
-Release the resources allocated in heap.
-*/
-CDriveImage::~CDriveImage()
-	{
-	iNodeAddStore.clear();
-	iNodeList.clear();
-	if(iData)
-		delete[] iData;
-	if(iTempDirName)
-		delete[] iTempDirName;
-	}
+	: iObey( aObey )
+{
+}
 
 
+CDriveImage::~CDriveImage()
+{
+ 
+}
 /**
-Creates the STL list to interface with file system module.
-Creates the Temp folder for placing the executables
-   (those changed,due to user option like compression,un-compression & fileattribute)
-Updates the excutable options (file attributes, compression etc)
-
-@return Status - 'KErrNone' - successfully done above operations.
-                 'KErrNoMemory' - Not able to allocate the memory.
-				 'KErrGeneral' - Unable to done the above operations.
-*/
-TInt CDriveImage::CreateList()
-	{
-
-	TRomNode* pRootDir = iObey->iRootDirectory;
-	TInt16 dirCheck = 1;
-	TInt retStatus = 0;
-
-	// For Creating the temp folder.	
-	iTempDirName = new char[KMaxGenBuffer];
-	if(!iTempDirName)
-		return KErrNoMemory;
-
-	// Create the temp folder.
-	// Check for folder exist, if exist it loops until dir created or loop exit.
-	while(dirCheck)
-		{
-		sprintf(iTempDirName,"%s%05d","temp",dirCheck); 
-		retStatus = MKDIR(iTempDirName); 
-		if(!retStatus)
-			break;	
-
-		++dirCheck;
+	* 
+  */
+TFSNode* CDriveImage::PrepareFileSystem(TRomNode* aRomNode){ 
+	TUint8 attrib ;
+	TFSNode* root = 0;
+	TRomNode* romNode = aRomNode;
+	stack<pair<TRomNode*,TFSNode*> > nodesStack ;
+	TFSNode* parentFS = 0 ;
+	TFSNode* curFS = 0;
+	bool err = false ;
+    while(1) {
+        attrib = 0 ;
+        if(romNode->iAtt & KEntryAttReadOnly)
+			attrib |= ATTR_READ_ONLY ;
+		if(romNode->iAtt & KEntryAttHidden)
+			attrib |= ATTR_HIDDEN ;
+		if(romNode->iAtt & KEntryAttSystem)
+			attrib |= ATTR_SYSTEM ;  
+		if(romNode->IsDirectory()) {		  
+			curFS = new(std::nothrow)  TFSNode(parentFS,romNode->iName,attrib | ATTR_DIRECTORY);
+			if(!curFS){
+					err = true ;
+					break ;
+			} 
+			if(!root) root = curFS ;  
+			time_t now = time(NULL); 
+			curFS->Init(now,now,now,0); 
+			TRomNode* child = romNode->Currentchild();
+			if(child){
+				TRomNode* sibling = romNode->Currentsibling(); 
+				if(sibling)
+					nodesStack.push(make_pair(sibling,parentFS));
+				romNode = child ;
+				parentFS = curFS ;
+				continue ;
+			}			
 		}
-
-	if(!dirCheck)
-		{
-		Print(EError,"Unable to Create the temp folder,Check directory settings.\n");
-		if(iTempDirName)
-			{
-			delete[] iTempDirName;
-			iTempDirName = 0;
-			}
-		return KErrCancel;
+		else { // file             
+				curFS = new(std::nothrow) TFSNode(parentFS,romNode->iEntry->iName,attrib,romNode->iEntry->iFileName);
+				if(!curFS){
+					err = true ;
+					break ;
+				} 
+					
+				if(!root) root = curFS ;  
+				struct stat statbuf ;
+				stat(romNode->iEntry->iFileName, &statbuf);             
+				curFS->Init(statbuf.st_ctime,statbuf.st_atime,statbuf.st_mtime,statbuf.st_size);   
+		 
+		}
+		
+		TRomNode* sibling = romNode->Currentsibling(); 
+		if(sibling) {
+			romNode = sibling ; 
 		}
-
-	// Construct the file options.
-	if(ConstructOptions() != KErrNone)
-		{
-		return KErrGeneral;
-		}
-
-	// Construct the List.
-	if((GenTreeTraverse(pRootDir,KNodeTypeRoot)) != KErrNone )
-		{
-		return KErrGeneral;
-		}
-
-	return KErrNone;
+		else { 
+			if(nodesStack.empty()) {
+				break ;
+			}
+			else {
+				romNode = nodesStack.top().first;
+				parentFS = nodesStack.top().second ;
+				nodesStack.pop() ;
+				
+			}
+		}		
+    }
+	if(err) {
+		if(root) delete root ;
+		return NULL ;
 	}
-
+    return root ;
+} 
 
 /**
 Creates the Image/Call to file system module.
@@ -179,396 +156,31 @@
 @return Status(r) - returns the status of file system module.
                    'KErrGeneral' - Unable to done the above operations properly.
 */
-TInt CDriveImage::CreateImage(const char* alogfile)
-	{
-
-	TInt retStatus = 0;
-	retStatus = CreateList();
-
-	if((retStatus == KErrCancel) || (retStatus == KErrNoMemory))
-		return KErrGeneral;
-
-	if(retStatus != KErrNone)
-		{
-		Print(EError,"Insufficent Memory/Not able to generate the Structure\n");
-		if(DeleteTempFolder(iTempDirName) != KErrNone )
-			{
-			Print(EWarning,"Not able to delete the temp folder : %s",iTempDirName);
-			}
-		return KErrGeneral;
-		}
-
-	// Close log file.
-	H.CloseLogFile();		
+TInt CDriveImage::CreateImage(const char* alogfile) {
 	
-	// Convert fileformat to corresponding enum value.
-	enum TFileSystem fileFormat = (TFileSystem)0;
-	FormatTranslation(iObey->iDriveFileFormat,fileFormat);
-
-	// Call to file system module. create the image.
-	if(iObey->iDataSize)
-		retStatus = CFileSystemInterFace::CreateFilesystem(&iNodeList,fileFormat,
-														(char*)iObey->iDriveFileName,
-														(char*)alogfile,
-														iObey->iConfigurableFatAttributes,																											
-														iObey->iDataSize); 
-	else
-		retStatus = CFileSystemInterFace::CreateFilesystem(&iNodeList,fileFormat,
-														(char*)iObey->iDriveFileName,
-														(char*)alogfile,
-														iObey->iConfigurableFatAttributes);														; 
-
-	//delete the temp folder.
-	if(DeleteTempFolder(iTempDirName) != KErrNone )
-		{
-		cout << "Warning: Not able to delete the temp folder : " << iTempDirName << "\n" ;
-		}
-	
-	return 	retStatus;
+	TSupportedFatType fst = EFatUnknown ;
+	if(stricmp(iObey->iDriveFileFormat,"FAT16") == 0)
+	    fst = EFat16 ;
+	else if(stricmp(iObey->iDriveFileFormat,"FAT32") == 0)
+	        fst = EFat32 ;
+	if(EFatUnknown == fst){
+        Print(EError,"Unsupported FAT type : %s",iObey->iDriveFileFormat);
+        return KErrGeneral ;
 	}
-
-
-
-/**
-Delete the temp directory.
-
-@param aTempDirName - Temporory folder name to be deleted.
-@return Status(r) - returns the status.
-                   'KErrGeneral' - Unable to done the above operations properly.
-				   'KErrNone' - successfully deleted the folder.
-*/
-TInt CDriveImage::DeleteTempFolder(const char* aTempDirName)
-	{
-
-	TInt fileDeleted = 1;
-	string dirPath(aTempDirName); 
-	string fileName(aTempDirName); 
-
-#ifdef __LINUX__
-
-	// Open directory
-	DIR *dirHandler = opendir(aTempDirName);
-	struct dirent *dirEntry;
-
-	if(!dirHandler)
-		return KErrGeneral;
-
-	dirPath.append("/");
-	fileName.append("/");
-
-	// Go through each entry
-	while((dirEntry = readdir(dirHandler)))
-		{
-		if(dirEntry->d_type != DT_DIR) 
-			{
-			fileName.append((char*)dirEntry->d_name);
-			remove(fileName.c_str());
-			fileName.assign(dirPath);
-			}
-		}
-	//Close dir
-	if(!closedir(dirHandler))
-		{
-		fileDeleted = rmdir(aTempDirName);
-		}
-#else
-
-	WIN32_FIND_DATA FindFileData;
-	HANDLE hFind = INVALID_HANDLE_VALUE;
-
-	dirPath.append("\\*");
-	fileName.append("\\");
-	
-	// find the first file
-	hFind = FindFirstFile(dirPath.c_str(),&FindFileData);
-
-	if(hFind == INVALID_HANDLE_VALUE) 
-		return KErrGeneral;
+	 
+	TFatImgGenerator generator(fst,iObey->iConfigurableFatAttributes);
 	
-	dirPath.assign(fileName);   
-
-	do
-	{
-	// Check for directory or file.
-	if(!(FindFileData.dwFileAttributes  & FILE_ATTRIBUTE_DIRECTORY))
-		{
-		// Delete the file.
-		fileName.append((char*)FindFileData.cFileName);
-		remove(fileName.c_str());
-		fileName.assign(dirPath);
-		}
-	} while(FindNextFile(hFind,&FindFileData));
-
-	FindClose(hFind);
-					
-	if(ERROR_NO_MORE_FILES != GetLastError())
-		{
-		cout << "Warning: FindNextFile error. Error is " << GetLastError() << "\n" ;
-		}
-
-	fileDeleted = _rmdir(aTempDirName);
-
-#endif
-
-	if(!fileDeleted)
-		return KErrNone;
-	else
-		return KErrGeneral;
+	if(!generator.IsValid()){
+	    return KErrGeneral; 
 	}
-
-
-/**
-General Tree Traverse to create the List.
-Recursive call to update the list.
-
-@param anode - Current Node in the tree.
-@param anodeType - Node type(root,child,sibling)
-
-@return r - returns 'KErrNoMemory' if fails to generate the list or memory not allocated.
-            or 'KErrNone'
-*/
-TInt CDriveImage::GenTreeTraverse(TRomNode* anode,enum KNodeType anodeType)    
-	{
-	 
-	TInt r =0;			
-	if((r = CreateDirOrFileEntry(anode,anodeType)) != KErrNone) 
-		return KErrNoMemory;
-	 
-	if(anode->Currentchild())
-		{
-		if((r = GenTreeTraverse(anode->Currentchild(),KNodeTypeChild)) != KErrNone)
-			return KErrNoMemory;
-			
-		if(iNodeAddStore.size())	
-			iNodeAddStore.pop_back();
-
-		--iListReference;
-		}
-
-	if(anode->Currentsibling())
-		{
-		if((r = GenTreeTraverse(anode->Currentsibling(),KNodeTypeSibling)) != KErrNone)
-			return KErrNoMemory;
-		}
-	return r;
-	}
-
-
-/**
-Generate the List. required for drive image creation.
-Hidden file node is not placed in list.
-
-@param atempnode - Current Node in the tree.
-@param aType - Node type(root,child,sibling)
-
-@return r - returns 'KErrNoMemory' if memory is not allocated or 'KErrNone'
-*/
-TInt CDriveImage::CreateDirOrFileEntry(TRomNode* atempnode,enum KNodeType aType)    
-	{
-
-	CDirectory* parentDirectory = NULL ;
-	if(KNodeTypeChild == aType)
-		parentDirectory = iParentDirEntry;
-	else if(KNodeTypeSibling == aType)
-		parentDirectory = (CDirectory*)(iNodeAddStore[iListReference-1]);
+	TFSNode* root = PrepareFileSystem(iObey->iRootDirectory);
+	if(!root)
+	    return KErrGeneral;
 	
-	CDirectory* iDirectory = new CDirectory(atempnode->iName,parentDirectory);
-	if(!iDirectory)									
-		return KErrNoMemory;
+ 
+	TInt retVal = generator.Execute(root,iObey->iDriveFileName) ? KErrNone : KErrGeneral;
+	
+	delete root ;
 		
-	char attrib = 0 ;
-	if(atempnode->iAtt & KEntryAttReadOnly)
-		attrib |= EAttrReadOnly ;
-	if(atempnode->iAtt & KEntryAttHidden)
-		attrib |= EAttrHidden ;
-	if(atempnode->iAtt & KEntryAttSystem)
-		attrib |= EAttrSystem ;
-		
-
-	// for files only.
-	if(atempnode->iEntry)
-		{
-		iDirectory->SetEntryAttribute(attrib);
-
-		// don't place the hidden files to list.
-		if(!atempnode->iHidden)	
-			{
-			iDirectory->SetFilePath(atempnode->iEntry->iFileName);
-			iDirectory->SetFileSize(atempnode->iSize);
-			}
-		else
-			{
-			iNodeAddStore.push_back((void*)iParentDirEntry);
-			++iListReference;
-			return KErrNone;  
-			}	
-		}
-	else
-		iDirectory->SetEntryAttribute(attrib | EAttrDirectory);
-
-
-	switch(aType)
-		{
-		case KNodeTypeRoot:
-			iDirectory->SetEntryAttribute(EAttrVolumeId);
-			iNodeList.push_back(iDirectory);	
-			iParentDirEntry = iDirectory; 
-			break;
-					
-		case KNodeTypeChild:
-			iNodeAddStore.push_back((void*)iParentDirEntry);
-			++iListReference;
-			parentDirectory->InsertIntoEntryList(iDirectory); 
-			iParentDirEntry = iDirectory ;
-			break;
-
-		case KNodeTypeSibling:
-			parentDirectory->InsertIntoEntryList(iDirectory); 
-			iParentDirEntry = iDirectory ;
-			break;
-
-		default: 
-			break;
-		}
-	return KErrNone;                                             
-	}
-
-
-/**
-Traverses all entries and update compress/uncompress and file attribute options.
-
-Place executables in temp folder.(if changed)
-Hidden file node is not placed in temp folder.
-
-@return r - returns 'KErrNoMemory/KErrGeneral' if fails to update the options or memory
-            not allocated or else 'KErrNone' for Succesfully operation.
-*/
-TInt CDriveImage::ConstructOptions()  {
-
-	TInt32 len = 0;
-	TRomNode* node = TRomNode::FirstNode();
-        CBytePair bpe;
-	
-	while(node)
-		{
-		// Don't do anything for hidden files.
-		if(node->IsFile() && (!node->iHidden))
-			{
-		
-			TInt32 size=HFile::GetLength(node->iEntry->iFileName);    
-			if(size <= 0)
-				{
-				Print(EWarning,"File %s does not exist or is 0 bytes in length.\n",node->iEntry->iFileName);
-				}
-			node->iSize = size;
-			if(node->iEntry->iExecutable && (size > 0))
-				{
-				
-				if((node->iFileUpdate) || (node->iOverride))
-					{
-					size_t allocSize = size << 1 ;
-					iData = new char[allocSize];
-					if(!iData)
-						return KErrNoMemory;
-					
-					HMem::Set(iData, 0xff, allocSize);
-                    TUint8* aData = (TUint8*)iData;
-					len = node->PlaceFile(aData,0,allocSize,&bpe);
-					if(len < KErrNone)
-						{	
-						delete[] iData;
-						iData = 0;
-						return KErrGeneral;
-						}
-						
-					// Place the file in Newly created Folder. 
-					TInt r = PlaceFileTemporary(len,node);
-					delete[] iData;
-					iData = 0;
-
-					if(r != KErrNone)
-						{
-						return r;
-						}
-					} // file update end.
-				}
-			} // is file end
-		node = node->NextNode();
-		}
-	return KErrNone;
-	}
-
-
-/**
-Place the modified exe's(e32 format) in Temp Folder. 
-Place executables in temp folder.(if changed)
-
-@param afileSize    - No. of bytes to be palced in the file.
-@param acurrentNode - file node, to modify its source path.
-
-@return r - returns 'KErrNoMemory' if fails to allocate the memory.
-            or 'KErrNone'
-*/
-TInt CDriveImage::PlaceFileTemporary(const TInt afileSize,TRomNode* acurrentNode) 
-	{
-
-	TInt randomValue = 0;
-	char randomString[KMaxGenBuffer] = "\0";
-	char* fileSourcePath = acurrentNode->iEntry->iName;
-	string newFileName;
-
-	do
-		{
-		newFileName.append(iTempDirName);
-		newFileName.append("/");
-
-		if(!randomValue)	
-			{
-			newFileName.append(fileSourcePath);
-			}
-		else
-			{  
-			newFileName.append(randomString);
-			newFileName.append(fileSourcePath);
-			}
-
- 
-		ifstream test(newFileName.c_str());
-		if (!test)
-			{
-			test.close();
-			ofstream driveFile(newFileName.c_str(),ios_base::binary);
-			if (!driveFile)
-				{
-				Print(EError,"Cannot open file %s for output\n",newFileName.c_str());
-				return KErrGeneral;
-				}
-
-			driveFile.write(iData,afileSize);
-			driveFile.close();
-
-			// Update the new source path.
-			delete[] acurrentNode->iEntry->iFileName;
-			acurrentNode->iEntry->iFileName = new char[ newFileName.length() + 1 ];
-			if(!acurrentNode->iEntry->iFileName)
-				return KErrNoMemory;
-				
-			memcpy(acurrentNode->iEntry->iFileName,newFileName.c_str(),newFileName.length());
-			acurrentNode->iEntry->iFileName[newFileName.length()] = 0;
-			break;
-			}
-
-		test.close();
-		newFileName.erase();
-		++randomValue;
-		sprintf(randomString,"%d",randomValue);
-	
-		}
-	while(randomValue);
-
-	return KErrNone;
-	}
-
-
-
-
+	return 	retVal;
+}
--- a/imgtools/romtools/rofsbuild/r_driveimage.h	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/r_driveimage.h	Wed Jun 30 11:35:58 2010 +0800
@@ -21,13 +21,9 @@
 #ifndef __R_DRIVEIMAGE_H__
 #define __R_DRIVEIMAGE_H__
 
-#include <fstream>
-#include "filesysteminterface.h" 
+#include <fstream> 
 #include <vector>
 
-typedef vector<void*> EntryReferenceVector;
-typedef	list<CDirectory*> EntryList; 
-
 const TInt KMaxGenBuffer=0x14;  
 
 // Node Type.
@@ -40,12 +36,8 @@
 	};
 
 // File Format Supported.
-struct DriveFileFormatSupported
-	{
-	const char* iDriveFileFormat;
-	enum TFileSystem iFileSystem;
-	};
 
+class TFSNode ;
 // Image creation class.
 class CDriveImage
 	{
@@ -53,37 +45,14 @@
 	CDriveImage(CObeyFile *aObey);
 	~CDriveImage();
 	TInt CreateImage(const char* alogfile);
-	static TBool FormatTranslation(const char* aUserFileFormat,enum TFileSystem& aDriveFileFormat);
-
+	
 private:
-
-	TInt CreateList();
-	TInt GenTreeTraverse(TRomNode* anode,enum KNodeType anodeType);    
-	TInt CreateDirOrFileEntry(TRomNode* atempnode,enum KNodeType aType);   
-	TInt ConstructOptions();
-	TInt PlaceFileTemporary(const TInt afileSize,TRomNode* acurrentNode); 
-	TInt DeleteTempFolder(const char* aTempDirName);
-
-private:
-
+ 
+	TFSNode* PrepareFileSystem(TRomNode* aRomNode); 	
 	// Holds the address of CObeyFile object. used to get the object information.
-	CObeyFile *iObey;
-	// Container required for file sysem module.
-	EntryList iNodeList;
-	// Pointer for nested Container.
-	CDirectory* iParentDirEntry ;
-
-	// For temp storge of Container address.
-	EntryReferenceVector iNodeAddStore;
-
-	// For file format support.
-	static DriveFileFormatSupported iFormatType[];
-	// Reference variable used for converting tree to list.
-	TInt iListReference;
-	// Holds temp folder name. 
-	char *iTempDirName;
-	// Pointer to buffer, which will be used for compression/un-compression purpose.
-	char *iData;
+	CObeyFile *iObey;	  
+	 
+	 
 	};
 
 #endif
--- a/imgtools/romtools/rofsbuild/r_obey.cpp	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/r_obey.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -37,7 +37,7 @@
 #include "r_obey.h"
 #include "r_coreimage.h"
 #include "patchdataprocessor.h"
-#include "filesysteminterface.h" 
+#include "fatimagegenerator.h" 
 #include "r_driveimage.h"
 
 extern TInt gCodePagingOverride;
@@ -54,6 +54,7 @@
 {
 	{_K("file"),		2,-2, EKeywordFile, "File to be copied into ROFS"},
 	{_K("data"),		2,-2, EKeywordData, "same as file"},
+	{_K("dir"),         2,1, EKeywordDir, "Directory to be created into FAT image"},
 
 	{_K("rofsname"),	1, 1, EKeywordRofsName, "output file for ROFS image"},
 	{_K("romsize"),		1, 1, EKeywordRomSize, "size of ROM image"}, 
@@ -412,8 +413,7 @@
 const FileAttributeKeyword ObeyFileReader::iAttributeKeywords[] =
 {
 	{"attrib",3			,0,1,EAttributeAtt, "File attributes in ROM file system"},
-	{"exattrib",3		,0,1,EAttributeAttExtra, "File extra attributes in ROM file system"},
-	//	{_K("compress")		,1,1,EAttributeCompress, "Compress file"},
+	{"exattrib",3		,0,1,EAttributeAttExtra, "File extra attributes in ROM file system"}, 
 	{"stack",3			,1,1,EAttributeStack, "?"},
 	{"fixed",3			,1,0,EAttributeFixed, "Relocate to a fixed address space"},
 	{"priority",3		,1,1,EAttributePriority, "Override process priority"},
@@ -497,10 +497,8 @@
 iTime(0),
 iRootDirectory(0),
 iNumberOfDataFiles(0),
-iDriveFileName(0),
-iDataSize(0),
-iDriveFileFormat(0),
-iConfigurableFatAttributes(new ConfigurableFatAttributes),
+iDriveFileName(0), 
+iDriveFileFormat(0), 
 iReader(aReader), 
 iMissingFiles(0), 
 iLastExecutable(0),
@@ -539,9 +537,7 @@
 		iRomFileName = 0 ;
 	}
 	if (iRootDirectory)
-		iRootDirectory->Destroy();
-	if(iConfigurableFatAttributes)
-		delete iConfigurableFatAttributes;
+		iRootDirectory->Destroy(); 
 	if(iPatchData)
 		delete iPatchData;
 }
@@ -739,6 +735,7 @@
 
 		case EKeywordHide:						
 		case EKeywordFile:
+		case EKeywordDir:
 		case EKeywordData:
 		case EKeywordFileCompress:
 		case EKeywordFileUncompress:
@@ -789,16 +786,8 @@
 				Print(EWarning,"Not a valid Image Size. Default size is considered\n");		
 				break;
 			}
-#ifdef __LINUX__
-			errno = 0;
-			iDataSize = strtoll(bigString,NULL,10);
-			if((iDataSize == LONG_MAX) || (iDataSize == LONG_MIN) ||(errno == ERANGE))
-			{
-				Print(EWarning,"Invalid Range. Default size is considered\n");		
-			}
-#else
-			iDataSize = _atoi64(bigString);
-#endif
+ 
+			Val(iConfigurableFatAttributes.iImageSize,bigString); 
 		}
 		break;
 	case EKeywordDataImageVolume:
@@ -823,8 +812,13 @@
 				position = volumeLabel.find_first_of("\r\n");
 				if (position != string::npos)
 					volumeLabel = volumeLabel.substr(0,position);
-
-				iConfigurableFatAttributes->iDriveVolumeLabel = volumeLabel.data() ;
+				size_t length = volumeLabel.length() ;
+				if(length > 11) 
+						length = 11 ;
+				memcpy(iConfigurableFatAttributes.iDriveVolumeLabel,volumeLabel.c_str(),length) ;
+				while(length != 11)
+					iConfigurableFatAttributes.iDriveVolumeLabel[length++] = ' ';
+				iConfigurableFatAttributes.iDriveVolumeLabel[length] = 0;
 			}
 			else {
 				Print(EWarning,"Value for Volume Label is not provided. Default value is considered.\n");
@@ -839,7 +833,7 @@
 				Print(EWarning,"Invalid Sector Size value. Default value is considered.\n");
 			}
 			else {
-				iConfigurableFatAttributes->iDriveSectorSize = atoi(bigString);
+				iConfigurableFatAttributes.iDriveSectorSize = atoi(bigString);
 			}
 		}			
 		break;
@@ -850,7 +844,7 @@
 			if (noOfFats <=0)
 				Print(EWarning,"Invalid No of FATs specified. Default value is considered.\n");
 			else
-				iConfigurableFatAttributes->iDriveNoOfFATs = atoi(bigString);			
+				iConfigurableFatAttributes.iDriveNoOfFATs = atoi(bigString);			
 		}			
 		break;			
 	default:
@@ -879,7 +873,7 @@
 		retVal = EFalse;
 	}
 	// Check for '-'ve entered value.
-	if(iDataSize <= 0){
+	if(iConfigurableFatAttributes.iImageSize <= 0){
 		Print(EWarning,"Image Size should be positive. Default size is Considered.\n");
 	}
 
@@ -891,10 +885,8 @@
 	}
 
 	// Checking the validity of file system format.
-	if(iDriveFileFormat){
-		strupr((char *)iDriveFileFormat);
-		enum TFileSystem check = (TFileSystem)0;
-		if(!(CDriveImage::FormatTranslation(iDriveFileFormat,check))) {
+	if(iDriveFileFormat){		 
+		if(stricmp(iDriveFileFormat,"FAT16") && stricmp(iDriveFileFormat,"FAT32")) {
 			Print(EError,"The name of the file system not supported : %s\n",iDriveFileFormat);
 			retVal = EFalse;
 		}
@@ -931,6 +923,7 @@
 	switch (aKeyword)
 	{
 	case EKeywordData:
+	case EKeywordDir:
 	case EKeywordHide:
 		isPeFile = EFalse;
 		break;
@@ -950,7 +943,7 @@
 		return EFalse;
 	}
 
-	if (aKeyword!=EKeywordHide) {
+	if (aKeyword!=EKeywordHide && aKeyword!=EKeywordDir) {
 		// check the PC file exists
 		char* nname = NormaliseFileName(iReader.Word(1));		  
 		ifstream test(nname);
@@ -965,10 +958,15 @@
 	else
 		epocPathStart=1;   
 
-	iNumberOfFiles++;
+	if(aKeyword != EKeywordDir)
+		iNumberOfFiles++;
 
 	TBool endOfName=EFalse;
-	const char *epocStartPtr= IsValidFilePath(iReader.Word(epocPathStart));
+	const char *epocStartPtr;
+	if(aKeyword != EKeywordDir)
+		epocStartPtr = IsValidFilePath(iReader.Word(epocPathStart));
+	else
+		epocStartPtr = IsValidDirPath(iReader.Word(epocPathStart));
 	char *epocEndPtr = const_cast<char*>(epocStartPtr);
 
 	if (epocStartPtr == NULL) {
@@ -982,7 +980,7 @@
 
 	while (!endOfName) {
 		endOfName = GetNextBitOfFileName(epocEndPtr);      
-		if (endOfName) { // file		
+		if (endOfName && (aKeyword!=EKeywordDir)) { // file
 			TRomNode* alreadyExists=dir->FindInDirectory(epocStartPtr);
 			if ((aKeyword != EKeywordHide) && alreadyExists) { // duplicate file		
 				if (gKeepGoing) {
@@ -1034,6 +1032,10 @@
 		}		 
 		else {
 			// directory
+			//for directory creation, given /sys/bin/, it's possible to reach 0 at the end, just ignore that...
+			if(!*epocStartPtr)
+				break;
+
 			subDir = dir->FindInDirectory(epocStartPtr);      
 			if (!subDir){ // sub directory does not exist			
 				if(aKeyword==EKeywordHide) {
@@ -1683,6 +1685,9 @@
 			if (len == 0)
 				return NULL;
 			len=0;
+			p++;
+			continue;
+
 		}
 		len++;
 		p++;
@@ -1690,6 +1695,24 @@
 	return (len ? aPath : NULL);
 }
 
+const char* CObeyFile::IsValidDirPath(const char* aPath)
+{
+	const char* walker = aPath;
+
+	//validate path...
+	while(*walker)
+	{
+		if(((*walker=='/') || (*walker=='\\')) && ((*(walker+1)=='/') || (*(walker+1)=='\\')))
+			return (const char*)0;
+		walker++;
+	}
+
+	if((*aPath=='/') || (*aPath=='\\'))
+		aPath++;
+
+	return aPath;
+}
+
 //
 // Move the end pointer past the next directory separator, replacing it with 0
 //
--- a/imgtools/romtools/rofsbuild/r_obey.h	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/r_obey.h	Wed Jun 30 11:35:58 2010 +0800
@@ -26,6 +26,7 @@
 #include <stdio.h>
 #include <e32capability.h>
 #include <kernel/kernboot.h>
+#include "fatdefines.h"
 
 #include <vector>
 #include <map>
@@ -46,6 +47,7 @@
 	EKeywordNone=0,	// backwards compatibility, but now ignored
 	EKeywordFile,
 	EKeywordData,
+	EKeywordDir,
 	EKeywordRofsName,
 	EKeywordExtensionRofs, 
 	EKeywordCoreRofsName,
@@ -178,7 +180,8 @@
 	};
 
 class CPatchDataProcessor;
-struct ConfigurableFatAttributes;
+// Configurable FAT attributes
+
 
 class CObeyFile
 	{
@@ -194,10 +197,9 @@
 	TRomNode* iRootDirectory;
 	TInt iNumberOfDataFiles;
 	// Added to support Data Drive Images.
-	char* iDriveFileName;
-	TInt64 iDataSize;
+	char* iDriveFileName; 
 	char* iDriveFileFormat;
-	ConfigurableFatAttributes* iConfigurableFatAttributes;
+	ConfigurableFatAttributes iConfigurableFatAttributes;
 
 private:
 	ObeyFileReader& iReader;
@@ -252,6 +254,7 @@
 	
 	static TBool GetNextBitOfFileName(char*& epocEndPtr);
 	static const char *IsValidFilePath(const char *aPath);
+	static const char* IsValidDirPath(const char* aPath);
 
 	TBool iAutoSize;
 	TUint32 iAutoPageSize;
--- a/imgtools/romtools/rofsbuild/rofsbuild.cpp	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/rofsbuild.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -46,8 +46,8 @@
 #endif
 
 static const TInt RofsbuildMajorVersion=2;
-static const TInt RofsbuildMinorVersion=10;
-static const TInt RofsbuildPatchVersion=4;
+static const TInt RofsbuildMinorVersion=12;
+static const TInt RofsbuildPatchVersion=0;
 static TBool SizeSummary=EFalse;
 static TPrintType SizeWhere=EAlways;
 
@@ -313,13 +313,13 @@
 				gLowMem = ETrue;
 			else {
 #ifdef WIN32
-				cout << "Unrecognised option " << argv[i] << "\n";
+				Print (EWarning, "Unrecognised option %s\n",argv[i]);
 #else
 				if(0 == access(argv[i],R_OK)){
 					filename.assign(argv[i]);
 				}
 				else {
-					cout << "Unrecognised option " << argv[i] << "\n";
+					Print (EWarning, "Unrecognised option %s\n",argv[i]);
 				}
 #endif				
 
@@ -335,14 +335,13 @@
 
 	if((gDriveImage == EFalse) && (gSmrImage ==  EFalse) && 
 		(filename.empty() || (gUseCoreImage && gImageFilename.length() == 0))){
-			PrintVersion();
-			cout << HelpText;
+			Print (EAlways, HelpText);
 			if (reallyHelp) {
 				ObeyFileReader::KeywordHelp();
-				cout << ReallyHelpText;
+				Print (EAlways, ReallyHelpText);
 			}
 			else if (filename.empty()){
-				Print(EError, "Obey filename is missing\n");
+				Print(EAlways, "Obey filename is missing\n");
 			}
 	}	
 }
@@ -399,10 +398,10 @@
 			// Drive image creation.
 			retstatus = userImage->CreateImage(alogfile);
 			if(retstatus == KErrNone) {
-				cout << "\nSuccessfully generated the Drive image : " << mainObeyFile->iDriveFileName << "\n";
+				Print (EAlways, "\nSuccessfully generated the Drive image : %s \n",mainObeyFile->iDriveFileName);
 			}
 			else {
-				cout << "\nFailed to generate the Image : " << mainObeyFile->iDriveFileName << "\n";
+				Print (EError, "Failed to generate the Image : %s\n",mainObeyFile->iDriveFileName);
 			}
 			delete userImage; 
 		}
@@ -437,10 +436,10 @@
 				retstatus = smrImage->CreateImage();
 			}
 			if(retstatus == KErrNone) {
-				cout << "\nSuccessfully generated the SMR image : " << smrImage->GetImageName().c_str() << "\n";
+				Print (EAlways,  "\nSuccessfully generated the SMR image : %s\n" ,smrImage->GetImageName().c_str());
 			}
 			else {
-				cout << "\nFailed to generate the Image : " << smrImage->GetImageName().c_str() << "\n";
+				Print (EError, "\nFailed to generate the Image : %s\n" ,smrImage->GetImageName().c_str());
 			}
 			delete smrImage;
 		}
@@ -472,15 +471,16 @@
 #endif		
 	if(gCPUNum > MAXIMUM_THREADS)
 		gCPUNum = MAXIMUM_THREADS;
+	PrintVersion();
 	processCommandLine(argc, argv);
 	//if the user wants to clean up the cache, do it only.
 	if(gCleanCache){
 		try {
 			CacheManager::GetInstance()->CleanCache();
-			printf("Cache has been deleted successfully.\r\n");
+			Print (EAlways, "Cache has been deleted successfully.\n");
 		}
 		catch(CacheException& ce){
-			printf("%s\r\n", ce.GetErrorMessage());
+			Print (EError, "%s\n", ce.GetErrorMessage());
 			return (TInt)1;
 		}
 		return r;
@@ -491,7 +491,7 @@
 			CacheManager::GetInstance();
 		}
 		catch(CacheException ce){
-			printf("%s\r\n", ce.GetErrorMessage());
+			Print (EError, "%s\n", ce.GetErrorMessage());
 			return (TInt)1;
 		}
 	}
@@ -503,11 +503,11 @@
 	}
 	if(gThreadNum == 0) {
 		if(gCPUNum > 0) {
-			printf("The number of processors (%d) is used as the number of concurrent jobs.\n", gCPUNum);
+			Print (EWarning, "The number of processors (%d) is used as the number of concurrent jobs.\n", gCPUNum);
 			gThreadNum = gCPUNum;
 		}
 		else {
-			printf("WARNING: Can't automatically get the valid number of concurrent jobs and %d is used.\n", DEFAULT_THREADS);
+			Print (EWarning, "Can't automatically get the valid number of concurrent jobs and %d is used.\n", DEFAULT_THREADS);
 			gThreadNum = DEFAULT_THREADS;
 		}
 	}
@@ -525,7 +525,6 @@
 				char* logfile = 0;
 				if(Getlogfile(driveobeyFileName,logfile) == KErrNone) {
 					H.SetLogFile(logfile);
-					PrintVersion();
 					GetLocalTime();
 					r = ProcessDataDriveMain(driveobeyFileName,logfile);   
 					H.CloseLogFile();
@@ -534,7 +533,7 @@
 						return KErrNoMemory;
 				}
 				else {
-					cout << "Error : Invalid obey file name : " << driveobeyFileName << "\n" ;   
+					Print(EError,"Invalid obey file name : %s\n", driveobeyFileName);   
 				}
 			}
 			driveobeyFileName = ptr;
@@ -554,7 +553,6 @@
 				char * logfile = 0;
 				if(Getlogfile(smrImageObeyFileName,logfile) == KErrNone){
 					H.SetLogFile(logfile);
-					PrintVersion();
 					GetLocalTime();
 					r = ProcessSmrImageMain(smrImageObeyFileName, logfile);
 					H.CloseLogFile();
@@ -563,7 +561,7 @@
 						return KErrNoMemory;
 				}
 				else {
-					cout << "Error: Invalid obey file name: " << smrImageObeyFileName << "\n";
+					Print(EError,"Invalid obey file name: %s", smrImageObeyFileName);
 				}
 			}
 			smrImageObeyFileName = ptr;
@@ -572,8 +570,7 @@
 	}
 	// Process Rofs Obey files.
 	if(obeyFileName) {
-		H.SetLogFile("ROFSBUILD.LOG");
-		PrintVersion();
+		H.SetLogFile("ROFSBUILD.LOG");		
 		ObeyFileReader *reader = new ObeyFileReader(obeyFileName); 
 		if (!reader->Open())
 			return KErrGeneral;
@@ -661,9 +658,7 @@
 			r = extensionRofs->WriteImage(0);	
 
 			delete extensionRofs;
-			delete extensionObeyFile;			
 			extensionRofs = 0;
-			extensionObeyFile = 0;
 		} while (r == KErrNone);
 		if(RofsImage) {
 			delete RofsImage;									
--- a/imgtools/romtools/rofsbuild/rofsbuild.mmp	Wed Jun 23 17:27:59 2010 +0800
+++ b/imgtools/romtools/rofsbuild/rofsbuild.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -24,6 +24,7 @@
 SOURCEPATH	../rofsbuild
 SOURCE			 r_obey.cpp r_build.cpp r_rofs.cpp r_driveimage.cpp r_driveutl.cpp
 SOURCE			 rofsbuild.cpp r_coreimage.cpp r_smrimage.cpp symbolgenerator.cpp
+SOURCE			 fatcluster.cpp fsnode.cpp fatimagegenerator.cpp
 SOURCEPATH	../../imglib/host
 SOURCE			h_utl.cpp h_file.cpp h_mem.cpp utf16string.cpp
 SOURCEPATH ../rofsbuild/src/cache
@@ -42,14 +43,14 @@
 
 OS_LAYER_SYSTEMINCLUDE_SYMBIAN
 
-USERINCLUDE   ../../imglib/inc ../../imglib/compress ../../imglib/filesystem/include 
+USERINCLUDE   ../../imglib/inc ../../imglib/compress
 USERINCLUDE   ../../imglib/patchdataprocessor/include ../../imglib/parameterfileprocessor/include
 USERINCLUDE	  ../../imglib/memmap/include
 USERINCLUDE   ../rofsbuild/inc
 USERINCLUDE   ../../imglib/boostlibrary/
 USERINCLUDE   ../../imglib/boostlibrary/boost
 
-STATICLIBRARY 	filesystem patchdataprocessor parameterfileprocessor memmap
+STATICLIBRARY 	patchdataprocessor parameterfileprocessor memmap
 STATICLIBRARY   boost_thread-1.39 boost_filesystem-1.39 boost_regex-1.39 boost_system-1.39
 #ifdef TOOLS2_LINUX
 OPTION    GCC -pthread -O2 -Wno-uninitialized
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cache.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,242 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <new>
+#include <cstring>
+#include <string>
+#include <iostream>
+#include <fstream>
+#include <queue>
+#include <map>
+
+#include "e32image.h"
+
+#include <filesystem.hpp>
+#include <thread/thread.hpp>
+#include <thread/mutex.hpp>
+#include <thread/condition_variable.hpp>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+#include "cache/cacheablelist.hpp"
+#include "cache/cache.hpp"
+#include "cache/cachegenerator.hpp"
+#include "cache/cachevalidator.hpp"
+#include "cache/cachemanager.hpp"
+#include <malloc.h>
+#ifdef __LINUX__
+#define _alloca alloca
+#endif
+
+Cache* Cache::Only = (Cache*)0;
+
+
+Cache* Cache::GetInstance(void) throw (CacheException)
+{
+	if(! Cache::Only)
+	{
+		Cache::Only = new (std::nothrow) Cache();
+		if(! Cache::Only)
+			throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+	}
+
+	return Cache::Only;
+}
+
+
+void Cache::Initialize(void) throw (CacheException)
+{
+	//create and open cache meta data file.
+	 
+	 
+	metafile = CacheManager::GetInstance()->GetCacheRoot();
+	metafile +=  "/.rofsmeta"; 
+	boost::filesystem::path metafilepath(metafile.c_str());
+	if(!exists(metafilepath))
+	{
+		//create cache root directory if it's not present.
+		boost::filesystem::path createcacheroot(CacheManager::GetInstance()->GetCacheRoot());
+		create_directory(createcacheroot);
+
+		//create cache index file.
+		ofstream openmetafile(metafilepath.file_string().c_str(), ios_base::app | ios_base::out);
+		if(! openmetafile.is_open())
+			throw CacheException(CacheException::CACHE_INVALID);
+		openmetafile.close();
+	}
+	printf("Loading cache meta file : %s\r\n", metafilepath.file_string().c_str());
+	ifstream metafileref(metafilepath.file_string().c_str(), ios_base::in);
+	if(! metafileref.is_open())
+		throw CacheException(CacheException::HARDDRIVE_FAILURE);
+
+	//read ROFS meta file and construct entry map.
+	string inboundbuffer;
+	while(getline(metafileref, inboundbuffer))
+	{
+		//validate cache index record.
+		if(! ValidateEntry(inboundbuffer))
+			throw CacheException(CacheException::CACHE_INVALID);
+
+		//instantiate a new instance of class CacheEntry.
+		CacheEntry* entryref = new (nothrow) CacheEntry();
+		if(!entryref)
+			throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+
+		//set entry's attributes.
+		
+		char* attrwalker  = (char*)_alloca(inboundbuffer.length() + 1);
+		memcpy(attrwalker,inboundbuffer.c_str(),inboundbuffer.length() + 1);
+		 
+		char* start = attrwalker ;
+		while(*start != ';')
+			start++;
+		*start++ = 0;
+		entryref->SetOriginalFilename(attrwalker);
+		attrwalker = start;
+		while(*start != ';')
+			start++;
+		*start++ = 0;
+		entryref->SetOriginalFileCreateTime(attrwalker);
+		attrwalker = start;
+		while(*start != ';')
+			start++;
+		*start++ = 0;
+		entryref->SetOriginalFileCompression(attrwalker);
+		attrwalker = start;
+		while(*start != ';')
+			start++;
+		*start++ = 0;
+		entryref->SetCachedFilename(attrwalker);
+		attrwalker = start;
+		entryref->SetCachedFileCompression(attrwalker);
+
+		//add newly created entry into entry-map.
+		string newentrystring(entryref->GetOriginalFilename());
+		CacheEntry* existentryref = entrymap[newentrystring];
+		if(existentryref) {
+			while(existentryref->GetNextEntry())
+				existentryref = existentryref->GetNextEntry();
+			existentryref->AppendEntry(entryref);
+		}
+		else {
+			entrymap[newentrystring] = entryref;
+		}
+
+		//reinitialize inbound buffer.
+		inboundbuffer.clear(); 
+	}
+
+	return;
+}
+
+
+CacheEntry* Cache::GetEntryList(const char* OriginalFilename)
+{
+	//retrieval could be performed concurrently.
+	boost::lock_guard<boost::mutex> lock(cachemutex);
+	string originalfile(OriginalFilename);
+	CacheEntry* resultentries = entrymap[originalfile];
+
+	return resultentries;
+}
+
+
+void Cache::AddEntry(const char* OriginalFilename, CacheEntry* EntryRef)
+{
+	string originalfile(OriginalFilename);
+
+	//addtions could be performed concurrently.
+	boost::lock_guard<boost::mutex> lock(cachemutex);
+
+	entrymap[originalfile] = EntryRef;
+
+	return;
+}
+
+
+void Cache::CloseCache(void) throw (CacheException)
+{
+	//open up the cache meta file.
+	boost::filesystem::path metafilepath(metafile);
+	ofstream metafileref;
+	if(! exists(metafilepath))
+		metafileref.open(metafilepath.file_string().c_str(), ios_base::out | ios_base::app);
+	else
+		metafileref.open(metafilepath.file_string().c_str(), ios_base::out | ios_base::trunc);
+	if(! metafileref.is_open())
+		throw CacheException(CacheException::HARDDRIVE_FAILURE);
+
+	//save cache meta onto hard drive along with changed cache files.
+	char* delimiter = ";";
+	map<string, CacheEntry*>::iterator mapitem;
+	for(mapitem=entrymap.begin(); mapitem != entrymap.end(); mapitem++)
+	{
+		CacheEntry* concreteentryref = (*mapitem).second;
+		while(concreteentryref)
+		{
+			metafileref.write(concreteentryref->GetOriginalFilename(), strlen(concreteentryref->GetOriginalFilename()));
+			metafileref.write(delimiter, strlen(delimiter));
+			metafileref.write(concreteentryref->GetOriginalFileCreateTime(), strlen(concreteentryref->GetOriginalFileCreateTime()));
+			metafileref.write(delimiter, strlen(delimiter));
+			metafileref.write(concreteentryref->GetOriginalFileCompressionID(), strlen(concreteentryref->GetOriginalFileCompressionID()));
+			metafileref.write(delimiter, strlen(delimiter));
+			metafileref.write(concreteentryref->GetCachedFilename(), strlen(concreteentryref->GetCachedFilename()));
+			metafileref.write(delimiter, strlen(delimiter));
+			metafileref.write(concreteentryref->GetCachedFileCompressionID(), strlen(concreteentryref->GetCachedFileCompressionID()));
+			metafileref.write("\n", strlen("\n"));
+
+//			CacheEntry* tobedeletedentryref = concreteentryref;
+			concreteentryref = concreteentryref->GetNextEntry();
+//			delete tobedeletedentryref;
+		}
+	}
+
+	//close cache meta file.
+	metafileref.close();
+
+	return;
+}
+
+
+bool Cache::ValidateEntry(string& EntryRawText)
+{
+	//an entry is formed as original_filename;original_file_create_time;original_file_compression_id;cached_filename;cached_file_compression_id(end of line - '\n')
+
+	//format validation.
+	int    semicolon         = 0;
+	size_t semicolonposition = 0;
+	while(1) {
+		semicolonposition = EntryRawText.find(';', semicolonposition);
+		if(semicolonposition != string::npos) {
+			semicolonposition++;
+			semicolon++;
+		}
+		else
+			break;
+	}
+	if(semicolon != 4)
+		return false;
+
+	return true;
+}
+
+
+Cache::Cache(void)
+{
+	 return;
+}
+ 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cacheablelist.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <new>
+#include <queue>
+#include <stdio.h>
+#include <stdlib.h>
+#include <cstring>
+#include <string>
+
+#include <thread/condition_variable.hpp>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+#include "cache/cacheablelist.hpp"
+
+
+CacheableList* CacheableList::Only = (CacheableList*)0;
+
+
+CacheableList* CacheableList::GetInstance(void) throw (CacheException)
+{
+	if(! CacheableList::Only)
+	{
+		CacheableList::Only = new (std::nothrow) CacheableList();
+		if(! CacheableList::Only)
+			throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+	}
+
+	return CacheableList::Only;
+}
+
+
+void CacheableList::AddCacheable(CacheEntry* EntryRef)
+{
+	if(1)
+	{
+		boost::mutex::scoped_lock lock(this->queuemutex);
+		this->filelist.push(EntryRef);
+	}
+
+	this->queuecond.notify_all();
+
+	return;
+}
+
+
+CacheEntry* CacheableList::GetCacheable(void)
+{
+	boost::mutex::scoped_lock lock(this->queuemutex);
+	while(this->filelist.empty())
+		this->queuecond.wait(lock);
+
+	CacheEntry* resref = this->filelist.front();
+	this->filelist.pop();
+
+	return resref;
+}
+
+
+CacheableList::~CacheableList(void)
+{
+	return;
+}
+
+
+CacheableList::CacheableList(void)
+{
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cacheentry.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,225 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <new>
+#include <cstring>
+#include <string>
+#include <queue>
+#include <time.h>
+#include <stdio.h>
+#include <stdlib.h>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+
+
+CacheEntry::CacheEntry(void)
+{
+	this->next                 = (CacheEntry*)0;
+	this->cachedfilebuffer     = (char*)0      ;
+	this->cachedfilebuffersize = 0             ;
+
+	return;
+}
+
+
+void CacheEntry::SetOriginalFilename(const char* OriginalFilename)
+{
+	this->originalfile.clear();
+	this->originalfile.assign(OriginalFilename);
+
+	return;
+}
+
+
+const char* CacheEntry::GetOriginalFilename(void) const
+{
+	return this->originalfile.c_str();
+}
+
+
+void CacheEntry::SetCachedFilename(const char* CachedFilename)
+{
+	this->cachedfile.clear();
+	this->cachedfile.assign(CachedFilename);
+
+	return;
+}
+
+
+const char* CacheEntry::GetCachedFilename(void) const
+{
+	return this->cachedfile.c_str();
+}
+
+
+void CacheEntry::SetOriginalFileCreateTime(time_t* CreateRawTime)
+{
+	this->originalfilecreatetime.clear();
+	this->originalfilecreatetime.assign(ctime(CreateRawTime));
+
+	size_t newlinepos = this->originalfilecreatetime.find("\n");
+	while(newlinepos != std::string::npos)
+	{
+		this->originalfilecreatetime.erase(newlinepos, 1);
+		newlinepos = this->originalfilecreatetime.find(("\n"));
+	}
+
+	return;
+}
+
+
+void CacheEntry::SetOriginalFileCreateTime(const char* CreateRawTime)
+{
+	this->originalfilecreatetime.clear();
+	this->originalfilecreatetime.assign(CreateRawTime);
+
+	return;
+}
+
+
+const char* CacheEntry::GetOriginalFileCreateTime(void) const
+{
+	return this->originalfilecreatetime.c_str();
+}
+
+
+void CacheEntry::SetOriginalFileCompression(const char* CompressionMethodID)
+{
+	this->originalfilecompression.clear();
+	this->originalfilecompression.assign(CompressionMethodID);
+
+	return;
+}
+
+
+void CacheEntry::SetOriginalFileCompression(unsigned int CompressionMethodID)
+{
+	char methodid[30];
+	memset(methodid, 0, sizeof(methodid));
+	sprintf(methodid, "%d", CompressionMethodID);
+
+	this->originalfilecompression.clear();
+	this->originalfilecompression.assign(methodid);
+
+	return;
+}
+
+
+const char* CacheEntry::GetOriginalFileCompressionID(void) const
+{
+	return this->originalfilecompression.c_str();
+}
+
+
+void CacheEntry::SetCachedFileCompression(const char* CompressionMethodID)
+{
+	this->cachedfilecompression.clear();
+	this->cachedfilecompression.assign(CompressionMethodID);
+
+	return;
+}
+
+
+void CacheEntry::SetCachedFileCompression(unsigned int CompressionMethodID)
+{
+	char methodid[128];
+	memset(methodid, 0, sizeof(methodid));
+	sprintf(methodid, "%d", CompressionMethodID);
+
+	this->cachedfilecompression.clear();
+	this->cachedfilecompression.assign(methodid);
+
+	return;
+}
+
+
+const char* CacheEntry::GetCachedFileCompressionID(void) const
+{
+	return this->cachedfilecompression.c_str();
+}
+
+
+void CacheEntry::SetCachedFileBuffer(char* FileBuffer, int FileBufferLen)
+{
+	this->cachedfilebuffer     = (char*)malloc(sizeof(char)*FileBufferLen);
+	memcpy(this->cachedfilebuffer, FileBuffer, FileBufferLen);
+	this->cachedfilebuffersize = FileBufferLen;
+
+	return;
+}
+
+
+const char* CacheEntry::GetCachedFileBuffer(void) const
+{
+	return this->cachedfilebuffer;
+}
+
+
+int CacheEntry::GetCachedFileBufferLen(void) const
+{
+	return this->cachedfilebuffersize;
+}
+
+
+void CacheEntry::AppendEntry(CacheEntry* EntryRef)
+{
+	//the parameter EntryRef must be valid, should be verified by the caller.
+	this->next = EntryRef;
+
+	return;
+}
+
+
+CacheEntry* CacheEntry::GetNextEntry(void) const
+{
+	return this->next;
+}
+
+
+void CacheEntry::SetNextEntry(CacheEntry* EntryRef)
+{
+	this->next = EntryRef;
+
+	return;
+}
+
+
+bool CacheEntry::Equals(CacheEntry* EntryRef)
+{
+	if( (this->originalfile.compare(EntryRef->GetOriginalFilename())==0) &&
+	    (this->originalfilecreatetime.compare(EntryRef->GetOriginalFileCreateTime())==0) &&
+	    (this->originalfilecompression.compare(EntryRef->GetOriginalFileCompressionID())==0) &&
+	    (this->cachedfile.compare(EntryRef->GetCachedFilename())==0) &&
+	    (this->cachedfilecompression.compare(EntryRef->GetCachedFileCompressionID())==0)
+	  )
+		return true;
+
+	return false;
+}
+
+
+CacheEntry::~CacheEntry(void)
+{
+	if(this->cachedfilebuffer)
+	{
+		free(this->cachedfilebuffer);
+		this->cachedfilebuffer = NULL;
+	}
+
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cacheexception.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,65 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include "cache/cacheexception.hpp"
+
+
+int CacheException::EPOCROOT_NOT_FOUND          = 1;
+int CacheException::RESOURCE_ALLOCATION_FAILURE = 2;
+int CacheException::CACHE_NOT_FOUND             = 3;
+int CacheException::CACHE_INVALID               = 4;
+int CacheException::CACHE_IS_EMPTY              = 5;
+int CacheException::HARDDRIVE_FAILURE           = 6;
+
+
+CacheException::CacheException(int ErrorCode)
+{
+	this->errcode = ErrorCode;
+
+	return;
+}
+
+
+int CacheException::GetErrorCode(void)
+{
+	return this->errcode;
+}
+
+
+const char* CacheException::GetErrorMessage(void)
+{
+	if(this->errcode == CacheException::EPOCROOT_NOT_FOUND)
+		return "EPOCROOT environment variable is not set.";
+	else if(this->errcode == CacheException::RESOURCE_ALLOCATION_FAILURE)
+		return "Not enough system resources to initialize cache module.";
+	else if(this->errcode == CacheException::CACHE_NOT_FOUND)
+		return "Cache is not present in the current system.";
+	else if(this->errcode == CacheException::CACHE_INVALID)
+		return "Cache is invalid.";
+	else if(this->errcode == CacheException::CACHE_IS_EMPTY)
+		return "Cache is empty.";
+	else if(this->errcode == CacheException::HARDDRIVE_FAILURE)
+		return "A hard drive failure occurred in Cache operations.";
+
+	return "Undefined error type.";
+}
+
+
+CacheException::~CacheException(void)
+{
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cachegenerator.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,78 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <new>
+#include <queue>
+#include <iostream>
+#include <fstream>
+#include <filesystem.hpp>
+#include <thread/thread.hpp>
+#include <thread/condition_variable.hpp>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+#include "cache/cacheablelist.hpp"
+#include "cache/cachegenerator.hpp"
+
+using namespace std ;
+CacheGenerator* CacheGenerator::Only = (CacheGenerator*)0;
+
+
+CacheGenerator* CacheGenerator::GetInstance(void) throw (CacheException)
+{
+	if(! CacheGenerator::Only)
+	{
+		CacheGenerator::Only = new (nothrow) CacheGenerator();
+		if(! CacheGenerator::Only)
+			throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+	}
+
+	return CacheGenerator::Only;
+}
+
+
+void CacheGenerator::ProcessFiles(void) throw (CacheException)
+{
+	while(1)
+	{
+		//pick one entry from the CacheableList.
+		CacheEntry* entryref = CacheableList::GetInstance()->GetCacheable();
+		if(! entryref->GetCachedFileBuffer())
+			break;
+
+		//write cacheable content into the cache.
+		boost::filesystem::path filepath(entryref->GetCachedFilename());
+		string filename = filepath.file_string(); 	
+		ofstream fileref(filename.c_str(), ios_base::binary | ios_base::out | ios_base::trunc);
+		if(! fileref.is_open())
+		{
+			printf("Cannot write/update cached %s\r\n", filepath.file_string().c_str());
+			continue;
+		}
+
+		fileref.write(entryref->GetCachedFileBuffer(), entryref->GetCachedFileBufferLen());
+		fileref.close();
+	}
+
+	return;
+}
+
+
+CacheGenerator::CacheGenerator(void) :  boost::thread(ProcessFiles)
+{
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cachemanager.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,231 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <stdlib.h>
+#include <string>
+#include <queue>
+#include <new>
+
+#include "e32image.h"
+
+#include <filesystem.hpp>
+#include <thread/thread.hpp>
+#include <thread/mutex.hpp>
+#include <thread/condition_variable.hpp>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+#include "cache/cache.hpp"
+#include "cache/cachegenerator.hpp"
+#include "cache/cachevalidator.hpp"
+#include "cache/cacheablelist.hpp"
+#include "cache/cachemanager.hpp"
+
+using namespace std;
+
+
+CacheManager* CacheManager::Only = (CacheManager*)0;
+boost::mutex  CacheManager::creationlock;
+
+
+CacheManager* CacheManager::GetInstance(void) throw (CacheException)
+{
+	if(! CacheManager::Only)
+	{
+		boost::mutex::scoped_lock lock(CacheManager::creationlock);
+		if(! CacheManager::Only)
+		{
+			CacheManager::Only = new (nothrow) CacheManager();
+			if(!CacheManager::Only)
+				throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+			CacheManager::Only->InitializeCache();
+		}
+	}
+
+	return CacheManager::Only;
+}
+
+
+E32ImageFile* CacheManager::GetE32ImageFile(char* OriginalFilename, int CurrentCompressionID)
+{
+	this->NormalizeFilename(OriginalFilename);
+	CacheEntry* validatedfile =CacheValidator::GetInstance()->Validate(OriginalFilename, CurrentCompressionID);
+	if(! validatedfile)
+		return (E32ImageFile*)0;
+
+	printf("%s is validated in cache.\r\n", OriginalFilename);
+	E32ImageFile* cachedimagefile = new (nothrow) E32ImageFile();
+	if(! cachedimagefile)
+		return (E32ImageFile*)0;
+	boost::filesystem::path cachedfile(validatedfile->GetCachedFilename());
+	ifstream filecontentreader(cachedfile.file_string().c_str(), ios_base::in | ios_base::binary);
+	if(! filecontentreader.is_open())
+		return (E32ImageFile*)0;
+	filecontentreader.seekg(0, ios_base::end);
+	int contentlength = filecontentreader.tellg();
+	cachedimagefile->iData = (char*)malloc(sizeof(char)*contentlength);
+	filecontentreader.seekg(0, ios_base::beg);
+	filecontentreader.read(cachedimagefile->iData, contentlength);
+	cachedimagefile->iHdr->iUncompressedSize = contentlength - cachedimagefile->iHdr->TotalSize();
+
+	return cachedimagefile;
+}
+
+
+CacheEntry* CacheManager::GetE32ImageFileRepresentation(char* OriginalFilename, int CurrentCompressionID)
+{
+	this->NormalizeFilename(OriginalFilename);
+
+	return CacheValidator::GetInstance()->Validate(OriginalFilename, CurrentCompressionID);
+}
+
+
+void CacheManager::Invalidate(char* Filename, CacheEntry* EntryRef) throw (CacheException)
+{
+	//update cache meta file.
+	this->NormalizeFilename(Filename);
+	Cache::GetInstance()->AddEntry(Filename, EntryRef);
+
+	//update cache content.
+	CacheableList::GetInstance()->AddCacheable(EntryRef);
+
+	printf("Caching %s\r\n", Filename);
+
+	return;
+}
+
+
+void CacheManager::CleanCache(void) throw (CacheException)
+{
+	//check if the cache is present in the current system.
+	boost::filesystem::path cacherootdir(this->cacheroot);
+	if(! exists(cacherootdir))
+		throw CacheException(CacheException::CACHE_NOT_FOUND);
+
+	//remove files iteratively from cache root directory.
+	if(remove_all(cacherootdir) <= 0)
+		throw CacheException(CacheException::CACHE_IS_EMPTY);
+
+	return;
+}
+
+
+const char* CacheManager::GetCacheRoot(void)
+{
+	return this->cacheroot;
+}
+
+
+CacheManager::~CacheManager(void)
+{
+	CacheEntry* newentryref = new (nothrow) CacheEntry();
+	CacheableList::GetInstance()->AddCacheable(newentryref);
+	Cache::GetInstance()->CloseCache();
+	CacheGenerator::GetInstance()->join();
+
+	delete CacheValidator::GetInstance();
+	delete Cache::GetInstance();
+	delete CacheGenerator::GetInstance();
+	delete CacheableList::GetInstance();
+
+	return;
+}
+
+
+void CacheManager::InitializeCache(void) throw (CacheException)
+{
+	//assume the root directory is EPOCROOT/epoc32/build/.cache
+	char* epocroot = getenv("EPOCROOT");
+	if(! epocroot)
+		throw CacheException(CacheException::EPOCROOT_NOT_FOUND);
+
+	//initialize cacheroot member variable.
+	int cacherootstrlen = sizeof(char)*(strlen(epocroot)+strlen("/epoc32/build/.cache")+1);
+	this->cacheroot = (char*)malloc(cacherootstrlen);
+	if(! this->cacheroot)
+		throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+	memset(this->cacheroot, 0, cacherootstrlen);
+	sprintf(this->cacheroot, "%s%s", epocroot, "/epoc32/build/.cache");
+
+	//normalize cache root path.
+	this->NormalizeFilename(this->cacheroot);
+
+	//create cache root directory if it is not present.
+	boost::filesystem::path cacherootdir(this->cacheroot);
+	if(! exists(cacherootdir))
+		create_directories(cacherootdir);
+	printf("Using %s as cache root directory.\r\n", cacherootdir.file_string().c_str());
+
+	//create cache instance.
+	Cache* cacheref = Cache::GetInstance();
+	if(! cacheref)
+		throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+
+	//create cache validator instance.
+	if(! CacheValidator::GetInstance())
+		throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+
+	//create cacheable list instance
+	if(! CacheableList::GetInstance())
+		throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+
+	//initialize cache container.
+	cacheref->Initialize();
+
+	//start cache generator.
+	CacheGenerator::GetInstance();
+
+	return;
+}
+
+
+void CacheManager::NormalizeFilename(char* Filename)
+{
+	if(!Filename)
+		return;
+
+	//convert back slashes into forward slashes.
+	char* normalizedfilename = Filename;
+	while(*normalizedfilename)
+	{
+		if(*normalizedfilename == '\\')
+			*normalizedfilename = '/';
+
+		normalizedfilename++;
+	}
+
+	//remove redundant slashes.
+	char* redundantfilename = Filename;
+	while(*redundantfilename)
+	{
+		if((*redundantfilename=='/') && (*(redundantfilename+1)=='/'))
+		{
+			redundantfilename++;
+			continue;
+		}
+		*Filename++ = *redundantfilename++;
+	}
+	*Filename = 0;
+
+	return;
+}
+
+
+CacheManager::CacheManager(void)
+{
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/src/cache/cachevalidator.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description: 
+*
+*/
+
+#include <new>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string>
+#include <cstring>
+#include <time.h>
+#include <map>
+#include <iostream>
+#include <fstream>
+#include <filesystem.hpp>
+#include <thread/mutex.hpp>
+
+#include "cache/cacheexception.hpp"
+#include "cache/cacheentry.hpp"
+#include "cache/cache.hpp"
+#include "cache/cachevalidator.hpp"
+
+using namespace std ;
+CacheValidator* CacheValidator::Only = (CacheValidator*)0;
+
+
+CacheValidator* CacheValidator::GetInstance(void) throw (CacheException)
+{
+	if(! CacheValidator::Only)
+	{
+		CacheValidator::Only = new (nothrow) CacheValidator();
+		if(! CacheValidator::Only)
+			throw CacheException(CacheException::RESOURCE_ALLOCATION_FAILURE);
+	}
+
+	return CacheValidator::Only;
+}
+
+
+CacheEntry* CacheValidator::Validate(const char* OriginalFilename, int CurrentCompressionID)
+{
+	if(! OriginalFilename)
+		return (CacheEntry*)0;
+
+	//an executable will be validated if its creation time does not altered and the compression method is not different against previous image build used.
+	CacheEntry* entryref = Cache::GetInstance()->GetEntryList(OriginalFilename);
+	if(! entryref)
+	{
+		return (CacheEntry*)0;
+	}
+	while(entryref)
+	{
+		boost::filesystem::path originalfile(OriginalFilename);
+		time_t originalcreationtime = last_write_time(originalfile);
+		string creationtime(ctime(&originalcreationtime));
+		size_t newlinepos = creationtime.find("\n");
+		while(newlinepos != string::npos)
+		{
+			creationtime.erase(newlinepos, 1);
+			newlinepos = creationtime.find(("\n"));
+		}
+		if((creationtime.compare(entryref->GetOriginalFileCreateTime())== 0) || (atoi(entryref->GetCachedFileCompressionID())==CurrentCompressionID))
+		{
+			boost::filesystem::path cachedfile(entryref->GetCachedFilename());
+			string filename = cachedfile.file_string(); 
+			ifstream filecontentreader(filename.c_str(), ios_base::in | ios_base::binary);
+			if(! filecontentreader.is_open()){
+				cerr << "Cannot open cached file " << filename << endl ;
+				return NULL;
+			}
+			filecontentreader.seekg(0, ios_base::end);
+			int contentlength = filecontentreader.tellg();
+			char* bufferref = new char[contentlength + 1];
+			filecontentreader.seekg(0, ios_base::beg);
+			filecontentreader.read(bufferref, contentlength);
+			bufferref[contentlength] = 0 ;
+			entryref->SetCachedFileBuffer(bufferref, contentlength);
+			delete []bufferref;
+
+			cout << "Using cached" <<  OriginalFilename << endl ;
+
+			return entryref;
+		}
+
+		entryref = entryref->GetNextEntry();
+	}
+
+	return (CacheEntry*)0;
+}
+
+
+CacheValidator::CacheValidator(void)
+{
+	return;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/symbolgenerator.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,279 @@
+#include <boost/regex.hpp>
+#define MAX_LINE 65535
+#include "symbolgenerator.h"
+#include "e32image.h"
+
+#if defined(__LINUX__)
+#define PATH_SEPARATOR '/'
+#else
+#define PATH_SEPARATOR '\\'
+#endif
+
+boost::mutex SymbolGenerator::iMutexSingleton;
+SymbolGenerator* SymbolGenerator::iInst = NULL;
+SymbolGenerator* SymbolGenerator::GetInstance(){
+    iMutexSingleton.lock();
+    if(iInst == NULL) {
+        iInst = new SymbolGenerator();
+    }
+    iMutexSingleton.unlock();
+    return iInst;
+}
+void SymbolGenerator::Release() {
+    iMutexSingleton.lock();
+    if(iInst != NULL) {
+        delete iInst;
+        iInst = NULL;
+    }
+    iMutexSingleton.unlock();
+}
+void SymbolGenerator::SetSymbolFileName( const string& fileName ){
+    if(iSymFile.is_open())
+        iSymFile.close();
+    string s = fileName.substr(0,fileName.rfind('.'))+".symbol";
+    printf("* Writing %s - ROFS symbol file\n", s.c_str());
+    iSymFile.open(s.c_str());
+}
+void SymbolGenerator::AddFile( const string& fileName, bool isExecutable ){
+    iMutex.lock();
+    iQueueFiles.push(TPlacedEntry(fileName,isExecutable));
+    iMutex.unlock();
+    iCond.notify_all();
+}
+void SymbolGenerator::ProcessExecutable( const string& fileName ){
+    char str[MAX_LINE];
+    string outString;
+    outString = "\nFrom    ";
+    outString += fileName + "\n\n";
+    iSymFile.write(outString.c_str(),outString.length());
+    string mapFile2 = fileName+".map";
+    size_t dot = fileName.rfind('.');
+    string mapFile = fileName.substr(0,dot)+".map";
+    ifstream fMap;
+    fMap.open(mapFile2.c_str());
+    if(!fMap.is_open()) {
+        fMap.open(mapFile.c_str());
+    }
+
+    if(!fMap.is_open()) {
+        printf("%s\nWarning: Can't open \"%s\" or \"%s\"\n",fileName.c_str(),mapFile2.c_str(),mapFile.c_str());
+        int binSize = GetSizeFromBinFile(fileName);
+        memset(str,0,sizeof(str));
+        sprintf(str,"%04x", binSize);
+        outString = "00000000    ";
+        outString += str;
+        outString += "    ";
+        outString += fileName.substr(fileName.rfind(PATH_SEPARATOR)+1)+"\n";
+        iSymFile.write(outString.c_str(),outString.length());
+    }
+    else {
+		if(!fMap.good()) fMap.clear();
+        boost::regex regARMV5("ARMV5", boost::regex::icase);
+        boost::regex regGCCEoARMV4("(GCCE|ARMV4)", boost::regex::icase);
+        boost::cmatch what;
+        if(regex_search(fileName, what, regARMV5)) {
+            ProcessArmv5File(fileName, fMap);
+        }
+        else if(regex_search(fileName, what, regGCCEoARMV4)) {
+            ProcessGcceOrArm4File(fileName, fMap);
+        }
+        else {
+            printf("\nWarning: cannot determine linker type used to create %s\n",fileName.c_str());
+            outString = "00000000    0000    ";
+            outString += fileName.substr(fileName.rfind(PATH_SEPARATOR)+1)+"\n";
+            iSymFile.write(outString.c_str(),outString.length());
+        }
+    }
+}
+void SymbolGenerator::ProcessDatafile( const string& fileName ){
+    string line = "\nFrom    "+fileName+"\n\n00000000    0000    "+fileName.substr(fileName.rfind(PATH_SEPARATOR)+1)+"\n";
+    iSymFile.write(line.c_str(),line.length());
+}
+void SymbolGenerator::ProcessArmv5File( const string& fileName, ifstream& aMap ){
+    aMap.seekg (0, ios::beg);
+    char str[MAX_LINE];
+    string outString;
+    aMap.getline(str,MAX_LINE);
+    boost::cmatch what;
+    boost::regex reg("^ARM Linker");
+    if(!regex_search(str, what, reg)) {
+        printf("\nWarning: expecting %s to be generated by ARM linker\n", fileName.c_str());
+        outString = "00000000    0000    "+fileName.substr(fileName.rfind(PATH_SEPARATOR)+1)+"\n";
+        iSymFile.write(outString.c_str(),outString.length());
+    }
+    reg.assign("Global Symbols");
+    while(aMap.getline(str,MAX_LINE)) {
+        if(regex_search(str, what, reg)) {
+            break;
+        }
+    }
+
+    reg.assign("^\\s*(.+)\\s*0x(\\S+)\\s+[^\\d]*(\\d+)\\s+(.*)$");
+    string sSym,sTmp,sSection;
+    unsigned int addr,size,baseOffset = 0;
+    map<unsigned int,string> syms;
+    char symString[MAX_LINE];
+    while(aMap.getline(str,MAX_LINE)) {
+        if(regex_search(str, what, reg)) {
+            sSym.assign(what[1].first,what[1].second-what[1].first);
+            sTmp.assign(what[2].first,what[2].second-what[2].first);
+            addr = strtol(sTmp.c_str(), NULL, 16);
+            sTmp.assign(what[3].first,what[3].second-what[3].first);
+            size = strtol(sTmp.c_str(), NULL, 10);
+            sSection.assign(what[4].first,what[4].second-what[4].first);
+            if(sSection.find("(StubCode)") != string::npos)
+                size = 8;
+            if(addr > 0) {
+                memset(symString,0,sizeof(symString));
+                sprintf(symString,"%04x    ",size);
+                outString = symString;
+                outString += sSym+" ";
+                outString += sSection;
+                if(baseOffset == 0) 
+                    baseOffset = addr;
+                unsigned int k = addr - baseOffset;
+                if( (syms.find(k) == syms.end()) || size != 0) 
+                    syms[k] = outString;
+            }
+            // end of addr>0
+        }
+        // end of regex_search
+    }
+
+    map<unsigned int,string>::iterator it;
+    for(it = syms.begin(); it != syms.end(); it++) {
+        memset(str,0,sizeof(str));
+        sprintf(str,"%08x",it->first);
+        outString = str;
+        outString += "    ";
+        outString += it->second+"\n";
+        iSymFile.write(outString.c_str(),outString.length());
+    }
+}
+void SymbolGenerator::ProcessGcceOrArm4File( const string& fileName, ifstream& aMap ){
+    aMap.seekg (0, ios_base::beg);
+    char str[MAX_LINE];
+    aMap.getline(str,MAX_LINE);
+    boost::cmatch what;
+    boost::regex reg("^\\.text\\s+");
+    while(aMap.getline(str,MAX_LINE)) {
+        if(regex_search(str, what, reg)) {
+            break;
+        }
+    }
+
+    reg.assign("^\\.text\\s+(\\w+)\\s+\\w+");
+    if(!regex_search(str, what, reg)) {
+        printf("ERROR: Can't get .text section info for \"%s\"\n",fileName.c_str());
+    }
+    else {
+        string sTmp, sLibFile;
+        sTmp.assign(what[1].first,what[1].second-what[1].first);
+        unsigned int imgText = strtol(sTmp.c_str(), NULL, 16);
+
+        reg.assign("^LONG 0x.*", boost::regex::icase);
+        boost::cmatch what1;
+        boost::regex reg1("^\\s(\\.text)?\\s+(0x\\w+)\\s+(0x\\w+)\\s+(.*)$", boost::regex::icase);
+        boost::regex reg2("^\\s+(\\w+)\\s\\s+([a-zA-Z_].+)", boost::regex::icase);
+        boost::regex reg3(".*lib\\(.*d\\d*s_?\\d{5}.o\\)$", boost::regex::icase);
+
+        map<unsigned int,string> syms;
+        unsigned int addr, len, stubhex;
+
+        while(aMap.getline(str,MAX_LINE)) {
+            if(strlen(str) == 0)
+                break;
+            else if(regex_search(str, what, reg1)) {
+                sLibFile.assign(what[4].first,what[4].second-what[4].first);
+                if(!regex_search(sLibFile, what1, reg)) {
+                    sTmp.assign(what[2].first,what[2].second-what[2].first);
+                    addr = strtol(sTmp.c_str(), NULL, 16);
+                    sTmp.assign(what[3].first,what[3].second-what[3].first);
+                    len = strtol(sTmp.c_str(), NULL, 16);
+                    syms[addr+len] = "";
+                    if(regex_search(sLibFile, what, reg3)) {
+                        stubhex = addr;
+                    }
+                }
+            }
+            else if(regex_search(str, what, reg2)) {
+                sTmp.assign(what[1].first,what[1].second-what[1].first);
+                addr = strtol(sTmp.c_str(), NULL, 16);
+                sTmp.assign(what[2].first,what[2].second-what[2].first);
+                syms[addr] = (addr == stubhex)? ("stub "+sTmp) : sTmp;
+            }
+        }
+
+        map<unsigned int,string>::iterator it = syms.begin();
+        map<unsigned int,string>::iterator itp = it++;
+        string outString;
+        for(; it != syms.end(); itp = it++) {
+            if(itp->second != "") {
+                memset(str,0,sizeof(str));
+                sprintf(str,"%08x    %04x    ",(itp->first-imgText), (it->first-itp->first));
+                outString = str;
+                outString += it->second+"\n";
+                iSymFile.write(outString.c_str(),outString.length());
+            }
+        }
+    }
+}
+int SymbolGenerator::GetSizeFromBinFile( const string& fileName ){
+    TInt ret = 0;
+    ifstream aIf(fileName.c_str(), ios_base::binary);
+    if( !aIf.is_open() ) {
+        printf("Warning: Cannot open file \n");
+    }
+    else {
+        E32ImageFile e32Image;
+        TUint32 aSz;
+
+        aIf.seekg(0,ios_base::end);
+        aSz = aIf.tellg();
+
+        e32Image.Adjust(aSz);
+        e32Image.iFileSize = aSz;
+
+        aIf.seekg(0,ios_base::beg);
+        aIf >> e32Image;
+        ret = e32Image.iOrigHdr->iCodeSize;
+    }
+    return ret;
+}
+void SymbolGenerator::thrd_func(){
+    SymbolGenerator* me = GetInstance();
+
+    TPlacedEntry pe("",false);
+    while(1) {
+        if(1) {
+            //scope the code block with if(1) for lock
+            boost::mutex::scoped_lock lock(me->iMutex);
+            while(me->iQueueFiles.empty())
+                me->iCond.wait(lock);
+            /*
+            if(me->iQueueFiles.empty()) {
+                boost::this_thread::sleep(boost::posix_time::milliseconds(10));
+                continue;
+            }
+            */
+
+            pe = me->iQueueFiles.front();
+            me->iQueueFiles.pop();
+        }
+
+        if(pe.iFileName == "")
+            break;
+        else if(pe.iExecutable) 
+            me->ProcessExecutable(pe.iFileName);
+        else
+            me->ProcessDatafile(pe.iFileName);
+    }
+}
+SymbolGenerator::SymbolGenerator() : boost::thread(thrd_func) {
+}
+SymbolGenerator::~SymbolGenerator(){
+    if(joinable())
+        join();
+    iSymFile.flush();
+    iSymFile.close();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rofsbuild/symbolgenerator.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+#ifndef __SYMBOLGENERATOR_H__
+#define __SYMBOLGENERATOR_H__
+#include <queue>
+#include <string>
+#include <fstream>
+using namespace std;
+#include <boost/thread/thread.hpp>
+#include <boost/thread/condition.hpp>
+
+
+struct TPlacedEntry{
+    string iFileName;
+    bool iExecutable;
+    TPlacedEntry(const string& aName, bool aExecutable) {
+        iFileName = aName;
+        iExecutable = aExecutable;
+    }
+};
+class SymbolGenerator : public boost::thread {
+    public:
+        static SymbolGenerator* GetInstance();
+        static void Release();
+        void SetSymbolFileName( const string& fileName );
+        void AddFile( const string& fileName, bool isExecutable );
+    private:
+        SymbolGenerator();
+        ~SymbolGenerator();
+        void ProcessExecutable( const string& fileName );
+        void ProcessDatafile( const string& fileName );
+        void ProcessArmv5File( const string& fileName, ifstream& aMap );
+        void ProcessGcceOrArm4File( const string& fileName, ifstream& aMap );
+        int GetSizeFromBinFile( const string& fileName );
+        static void thrd_func();
+
+        queue<TPlacedEntry> iQueueFiles;
+        boost::mutex iMutex;
+        static boost::mutex iMutexSingleton;
+        static SymbolGenerator* iInst;
+        boost::condition_variable iCond;
+
+        ofstream iSymFile;
+};
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/symbolgenerator.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,536 @@
+#include <e32rom.h>
+#include <algorithm>
+#include "symbolgenerator.h"
+#include "r_rom.h"
+#include <string.h>
+#include "h_utl.h"
+typedef boost::unique_lock<boost::mutex>  scoped_lock ;
+typedef boost::lock_guard<boost::mutex> guarded_lock ;
+
+SymbolGenerator::SymbolGenerator(const char* aSymbolFileName, int aMultiThreadsCount/* = 1*/) :
+iOutput(aSymbolFileName,ios_base::out |ios_base::binary |  ios_base::trunc) {
+	if(iOutput.is_open()){
+		if(aMultiThreadsCount < 1)
+			aMultiThreadsCount = 1;
+		 
+		for(int i = 0 ; i < aMultiThreadsCount ; i++){		
+			iThreads.add_thread(new boost::thread(ThreadFunc,this));
+		}
+	}
+	else {
+		cerr << "\nWarning: Can't write data to \""<<aSymbolFileName << "\" ! \nPlease make sure this file is not locked by other application or you have write permission!"<<endl;
+	} 
+}
+void SymbolGenerator::WaitThreads() {
+	iThreads.join_all(); 
+}
+SymbolGenerator::~SymbolGenerator() {
+	if(iOutput.is_open()){		
+		iOutput.flush();
+		iOutput.close();
+	}
+	for(vector<char*>::iterator i = iErrMsgs.begin() ; i != iErrMsgs.end() ; i++){
+		char* msg = *i ;
+		cerr << msg ;
+		delete []msg ;
+	}
+	iErrMsgs.clear(); 
+}
+
+void SymbolGenerator::AddEntry(const SymGenContext& aEntry){
+	if(iOutput.is_open()){
+		guarded_lock lock(iQueueMutex); 		 
+		iEntries.push(aEntry);		
+		iCond.notify_all();
+	}
+}
+void SymbolGenerator::ThreadFunc(SymbolGenerator* aInst) {		
+		SymGenContext entry ;
+		while(1){ 
+			entry.iFileName = 0;
+			if(1) {
+				scoped_lock lock(aInst->iQueueMutex);
+				while(aInst->iEntries.empty()){
+						aInst->iCond.wait(lock);
+				}
+				entry = aInst->iEntries.front();
+				if(0 == entry.iFileName)  // end , exit
+					return ;
+					
+				aInst->iEntries.pop();
+			}
+			aInst->ProcessEntry(entry);
+		}
+		
+}
+#define MAX_LINE_LENGTH 65535 
+#define SKIP_WS(p)	 while((*p) == ' ' ||  (*p) == '\t') (p)++ 
+#define FIND_WS(p)	 while((*p) != ' ' &&  (*p) != '\t' && (*p) != 0) (p)++ 
+static void split(char* str, vector<char*>& result) {
+	result.clear();
+	while(*str) {
+		SKIP_WS(str);
+		char* saved = str ; 
+		FIND_WS(str);
+		bool end = (0 == *str);
+		*str = 0 ; 
+		if(saved != str)
+			result.push_back(saved);		
+		if(!end) str ++ ; 
+	}	 
+}
+static void make_lower(char* str){
+	while(*str){
+		if(*str >= 'A' && *str >= 'Z') {
+			*str += ('a' - 'A');
+		}
+		str++;
+	}
+}
+bool SymbolGenerator::ProcessEntry(const SymGenContext& aContext) {	
+	size_t allocBytes ;
+	if(aContext.iExecutable ) {
+		string mapFileName(aContext.iFileName);	
+		mapFileName += ".map";
+		ifstream ifs(mapFileName.c_str());
+		if(!ifs.is_open()){
+			int index = mapFileName.length() - 5 ;
+			int count = 1 ;
+			while(index > 0 && mapFileName.at(index) != '.'){
+				index -- ;
+				count ++ ;
+			}
+			mapFileName.erase(index,count);
+			ifs.open(mapFileName.c_str());
+		}
+		if(!ifs.is_open()){		
+			guarded_lock lock(iFileMutex);
+			allocBytes = mapFileName.length() + 60 ;
+			char* msg = new char[ allocBytes] ;
+			snprintf(msg,allocBytes,"\nWarning: Can't open \"%s.map\"\n",aContext.iFileName );
+			iErrMsgs.push_back(msg);
+			msg = new char[allocBytes] ;
+			int n = snprintf(msg,allocBytes,"%08x    %04x    %s\r\n",(unsigned int)aContext.iCodeAddress,(unsigned int)aContext.iTotalSize,aContext.iFileName);			
+			iOutput.write(msg,n);
+			iOutput.flush();
+			return false ;
+		} 
+		if(!ifs.good()) ifs.clear();
+		char buffer[100]; 
+		*buffer = 0;
+		//See if we're dealing with the RVCT output
+		ifs.getline(buffer,100);
+		if(!ifs.good()) { 
+			ifs.close();
+			guarded_lock lock(iFileMutex);
+			allocBytes = mapFileName.length() + 60;
+			char* msg = new char[allocBytes] ; 
+			snprintf(msg,allocBytes,"\nWarning: File \"%s\" is opened yet can not be read!",mapFileName.c_str());
+			iErrMsgs.push_back(msg);  
+			return false ;			 
+		}
+		if(strncmp(buffer,"ARM Linker",10) == 0){  			
+			return ProcessARMV5Map(ifs,aContext);
+		}
+		// See if we're dealing with the GCC output
+		else if ( 0 == strncmp(buffer,"Archive member included",23)){ 
+			return ProcessGCCMap(ifs,aContext);
+		}
+		else { // Must be x86 output
+			ifs.seekg(0,ios_base::beg);
+			return ProcessX86Map(ifs,aContext);		
+		}
+	}
+	else {
+		const char* fileName = aContext.iFileName;	  
+		size_t len = strlen(fileName);
+		size_t index = len - 1;
+		while(index > 0 && (fileName[index] != '\\' && fileName[index] != '/'))
+			index -- ;
+		const char* basename = fileName + index + 1  ;		
+		allocBytes = (len << 1) + 40 ;
+		char* msg = new char[allocBytes] ;
+		int n = snprintf(msg,allocBytes,"\r\nFrom    %s\r\n\r\n%08x    0000    %s\r\n", fileName ,(unsigned int)aContext.iDataAddress,basename);	
+		guarded_lock lock(iFileMutex);
+		iOutput.write(msg,n);
+		iOutput.flush();
+		delete []msg ;
+		return true ;
+	}
+	return true ;
+}
+struct ArmSymbolInfo {
+	string name ;
+	TUint size ;
+	string section ;
+};
+typedef multimap<TUint32,ArmSymbolInfo> ArmSymMap ;
+ 
+bool SymbolGenerator::ProcessARMV5Map(ifstream& aStream, const SymGenContext& aContext) {	
+	string symName ; 
+	ArmSymMap symbols ; 
+	vector<char*> words ;
+	ArmSymbolInfo info;
+	char* lineStart ;
+	char buffer[MAX_LINE_LENGTH];  
+	while(aStream.good() && (!aStream.eof())){
+		*buffer = 0;
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart);	 
+		if(strstr(lineStart,"Global Symbols"))
+			break ;
+		char* armstamp = strstr(lineStart,"ARM Code");
+		if(0 == armstamp)
+			armstamp = strstr(lineStart,"Thumb Code") ;
+		if(0 == armstamp) continue ; 
+		*(armstamp - 1) = 0 ;
+		
+		char* hexStr = lineStart ;
+		char* nameEnd;
+		while(1) {
+			hexStr = strstr(hexStr,"0x");
+			if(0 == hexStr) break ; 		
+			nameEnd = hexStr - 1;
+			if(*nameEnd == ' ' || *nameEnd == '\t') break ;
+			hexStr += 2 ;
+		}	 
+		if(0 == hexStr) continue ; 	
+		while(nameEnd > lineStart && (*nameEnd == ' ' || *nameEnd == '\t'))
+			nameEnd -- ;
+		
+		nameEnd[1] = 0;
+		info.name = lineStart;		
+		char* temp ;
+		TUint32 addr = strtoul(hexStr + 2,&temp,16);
+		char* decStr ;
+		if(*armstamp == 'A')
+			decStr = armstamp + 9 ;
+		else 
+			decStr = armstamp + 11 ;
+		SKIP_WS(decStr);
+		info.size = strtoul(decStr,&temp,10);
+		SKIP_WS(temp);
+		info.section = temp;
+		if(info.section.find("(StubCode)") != string::npos )
+			info.size = 8 ; 			
+		if(addr > 0){
+			symbols.insert(pair<TUint32,ArmSymbolInfo>(addr,info));
+		}
+	}	 
+	size_t lenOfFileName = strlen(aContext.iFileName);
+	while(aStream.good() && (!aStream.eof())){
+		*buffer = 0;
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart); 
+		char* hexStr = lineStart ;
+		char* nameEnd;
+		while(1) {
+			hexStr = strstr(hexStr,"0x");
+			if(0 == hexStr) break ; 		
+			nameEnd = hexStr - 1;
+			if(*nameEnd == ' ' || *nameEnd == '\t') 
+				break ;
+			hexStr += 2 ;
+		}	 
+		if(0 == hexStr) continue ; 
+		while(nameEnd > lineStart && (*nameEnd == ' ' || *nameEnd == '\t')){
+			nameEnd -- ;
+		}
+		nameEnd[1] = 0;
+		info.name = lineStart; 
+		char *temp ;
+		TUint32 addr = strtoul(hexStr + 2,&temp,16);
+		while(*temp < '0' || *temp > '9' )//[^\d]*
+			temp++ ;
+		char* decStr = temp ;
+		info.size = strtoul(decStr,&temp,10);
+		SKIP_WS(temp);
+		info.section = temp;
+		if(info.section.find("(StubCode)") != string::npos )
+			info.size = 8 ; 
+		if(addr > 0){
+			symbols.insert(pair<TUint32,ArmSymbolInfo>(addr,info));
+		} 
+	}
+	
+	TUint32 textSectAddr = 0x00008000;  // .text gets linked at 0x00008000
+	TUint32 dataSectAddr = 0x00400000 ; // .data gets linked at 0x00400000
+	vector<pair<int,char*> > lines ;	
+	size_t allocBytes;
+	for( ArmSymMap::iterator it = symbols.begin(); it != symbols.end() ; it++){
+		TUint32 thisAddr = it->first ;
+		TUint32 romAddr ;
+		ArmSymbolInfo& info = it->second; 
+		if (thisAddr >= textSectAddr && thisAddr <= (textSectAddr + aContext.iTextSize)) {
+				romAddr = thisAddr - textSectAddr + aContext.iCodeAddress ;
+		} 
+		else if ( aContext.iDataAddress && 
+			( thisAddr >= dataSectAddr && thisAddr <= (dataSectAddr + aContext.iTextSize))) {
+			romAddr = thisAddr-dataSectAddr + aContext.iDataBssLinearBase;
+		} 
+		else if ( aContext.iDataBssLinearBase && 
+			( thisAddr >= dataSectAddr && thisAddr <= (dataSectAddr+ aContext.iTotalDataSize))) {
+			romAddr = thisAddr - dataSectAddr + aContext.iDataBssLinearBase;
+		} 
+		else { 
+			guarded_lock  lock(iFileMutex);
+			allocBytes = info.name.length() + 60;
+			char* msg = new char[allocBytes] ;
+			snprintf(msg,allocBytes,"\r\nWarning: Symbol %s @ 0x%08x not in text or data segments\r\n", \
+				info.name.c_str() ,(unsigned int)thisAddr) ; 
+			iErrMsgs.push_back(msg);	
+			allocBytes = lenOfFileName + 80;
+			msg = new char[allocBytes];
+			snprintf(msg,allocBytes,"Warning:  The map file for binary %s is out-of-sync with the binary itself\r\n\r\n",aContext.iFileName);
+			iErrMsgs.push_back(msg);	
+			continue ;
+		}
+		allocBytes =  info.section.length() + info.name.length() + 140;
+		char* outputLine = new char[allocBytes];
+		int len = snprintf(outputLine,allocBytes,"%08x    %04x    %-40s  %s\r\n",(unsigned int)romAddr,info.size,
+			info.name.c_str(),info.section.c_str()); 
+		if((size_t)len > allocBytes) {
+			allocBytes = len + 4 ;
+			delete []outputLine;
+			outputLine = new char[allocBytes];
+			len = snprintf(outputLine,allocBytes,"%08x    %04x    %-40s  %s\r\n",(unsigned int)romAddr,info.size,
+			info.name.c_str(),info.section.c_str()); 
+		}
+		lines.push_back(pair<int,char*>(len,outputLine));
+	 
+	}  
+	guarded_lock lock(iFileMutex);	
+	allocBytes = lenOfFileName + 40;
+	char* outputLine = new char[allocBytes];
+	int n = snprintf(outputLine,allocBytes,"\r\nFrom    %s\r\n\r\n",aContext.iFileName); 
+	iOutput.write(outputLine,n);
+	delete []outputLine ;
+	for (vector<pair<int,char*> >::iterator i = lines.begin() ; i < lines.end(); i ++ ) {
+		int len = i->first ;
+		char* line = i->second; 
+		iOutput.write(line,len);
+		delete []line ;
+	}	
+	iOutput.flush();
+	return true ;
+		
+}
+template<typename M, typename K,typename V> 
+static void put_to_map(M& m,const K& k, const V& v) {
+	typedef typename M::iterator iterator;
+	iterator it = m.find(k);
+	if(m.end() == it){
+		m.insert(pair<K,V>(k,v));
+	}
+	else { 
+		it->second = v ;
+	}	
+}
+bool  SymbolGenerator::ProcessGCCMap(ifstream& aStream, const SymGenContext& aContext){
+ 	char* lineStart; 
+	vector<char*> words ;
+	char buffer[MAX_LINE_LENGTH];
+	while(aStream.good() && (!aStream.eof())){
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart);
+		if( 0 == strncmp(lineStart,".text",5)) {
+			lineStart += 5;
+			break ;
+		}		
+	}
+	split(lineStart,words);
+	TUint32 codeAddr , codeSize;
+	size_t allocBytes ;
+	if(words.size() != 2 ||
+	KErrNone != Val(codeAddr,words.at(0)) || 
+	KErrNone != Val(codeSize,words.at(1))) {
+		allocBytes = strlen(aContext.iFileName) + 60;
+		char* msg = new char[allocBytes];
+		snprintf(msg,allocBytes,"\nError: Can't get .text section info for \"%s\"\r\n",aContext.iFileName);
+		guarded_lock lock(iFileMutex);
+		iErrMsgs.push_back(msg);
+		return false ;
+	}
+	map<TUint32,string> symbols ;
+	TUint32 stubHex = 0;
+	//Slurp symbols 'til the end of the text section
+	while(aStream.good() && (!aStream.eof())){
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart); 
+		if(0 == *lineStart) break ; //blank line marks the end of the text section
+		
+		// .text <addr> <len>  <library(member)>
+		// .text$something
+		//       <addr> <len>  <library(member)>
+		//       <addr> <len>  LONG 0x0
+		// (/^\s(\.text)?\s+(0x\w+)\s+(0x\w+)\s+(.*)$/io)	 
+		if(strncmp(lineStart,".text",5) == 0){
+			lineStart += 5 ;
+			SKIP_WS(lineStart);
+		}
+		char* hex1 = NULL ;
+		char* hex2 = NULL ;
+		char* strAfterhex1 = NULL ;
+		TUint32 addr,size ;
+		if(strncmp(lineStart,"0x",2) == 0){
+			hex1 = lineStart + 2;
+			char* temp ;
+			addr = strtoul(hex1,&temp,16);
+			SKIP_WS(temp);
+			strAfterhex1 = temp ;
+			if(strncmp(temp,"0x",2) == 0){
+				hex2 = temp + 2 ;
+			}
+		}
+		if(NULL != hex2){
+			char* libraryfile ;
+			size = strtoul(hex2,&libraryfile,16);
+			SKIP_WS(libraryfile);  
+			TUint32 key = addr + size ;
+			put_to_map(symbols,key,string(""));//impossible symbol as end marker 
+			make_lower(libraryfile); 
+			// EUSER.LIB(ds01423.o)
+			// EUSER.LIB(C:/TEMP/d1000s_01423.o)
+			size_t len = strlen(libraryfile);
+			char* p1 = strstr(libraryfile,".lib(");
+			if(NULL == p1) 
+				continue ; 
+			p1 += 5;
+			if(strcmp(libraryfile + len - 3,".o)")!= 0)
+				continue ;		 
+			len -= 3 ;
+			libraryfile[len] = 0; 
+			if(EFalse == IsValidNumber(libraryfile + len - 5))
+				continue ;
+			len -= 7 ;
+			if('_' == libraryfile[len])
+				len -- ;
+			if('s' != libraryfile[len])
+				continue ;		 
+			char* p2 = libraryfile + len - 1;
+			while(p2 > p1 ) { 
+				if(*p2 < '0' || *p2 > '9')
+					break ;
+				p2 -- ;
+			}
+			if(*p2 != 'd') 
+				continue ;
+			stubHex = addr ;
+		}
+		else if(NULL != hex1 && NULL != strAfterhex1){ 
+			//#  <addr>  <symbol name possibly including spaces>
+			//(/^\s+(\w+)\s\s+([a-zA-Z_].+)/o) 			 
+			char* symName = strAfterhex1; 
+			if((*symName >= 'A' && *symName <= 'Z') ||
+				(*symName >= 'a' && *symName <= 'z') || *symName == '_') {				 
+				string symbol(symName);
+				if(addr == stubHex) 
+					symbol.insert(0,"stub ");
+			 
+				put_to_map(symbols,addr,symbol);
+				 
+			}			
+		}		
+	}  
+	map<TUint32,string>::iterator it = symbols.begin();
+	TUint32 lastAddr = it->first;
+	string lastSymName = it->second;
+	vector<pair<int,char*> >lines ;
+	it ++ ;
+	while(it != symbols.end()) {		
+		TUint32 addr = it->first ; 
+		unsigned int fixedupAddr = lastAddr - codeAddr + aContext.iCodeAddress;
+		TUint size = addr - lastAddr ;
+		if(!lastSymName.empty()) {
+			allocBytes = lastSymName.length() + 40;
+			char* outputLine = new char[allocBytes];
+			int n = snprintf(outputLine,allocBytes,"%08x    %04x    %s\r\n", fixedupAddr,size,lastSymName.c_str()); 
+			lines.push_back(pair<int,char*>(n,outputLine));
+		}		
+		lastAddr = addr ;
+		lastSymName = it->second;
+		it ++ ;
+	}
+	
+	guarded_lock lock(iFileMutex);
+	allocBytes = strlen(aContext.iFileName) + 40;
+	char* outputLine = new char[allocBytes];
+	int n = snprintf(outputLine,allocBytes,"\r\nFrom    %s\r\n\r\n",aContext.iFileName); 
+	iOutput.write(outputLine,n);
+	delete []outputLine ;
+	vector<pair<int,char*> >::iterator i; 
+	for ( i = lines.begin() ; i < lines.end(); i ++ ) {
+		int len = i->first ;
+		char* line = i->second ;
+		iOutput.write(line,len);
+		delete []line ;
+	}
+	iOutput.flush();	
+	return true ;
+}
+bool SymbolGenerator::ProcessX86Map(ifstream& aStream, const SymGenContext& aContext) {
+	char buffer[MAX_LINE_LENGTH]; 
+	char* lineStart; 
+	while(aStream.good() && (!aStream.eof())){
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart);
+		if( 0 == strncmp(lineStart,"Address",7)) { 
+			break ;
+		}		
+	}
+	aStream.getline(buffer,MAX_LINE_LENGTH);
+	string lastName ;
+	TUint32 lastAddr = 0;
+	size_t allocBytes ;
+	vector<pair<int, char*> >lines ;
+	while(aStream.good() && (!aStream.eof())){
+		aStream.getline(buffer,MAX_LINE_LENGTH);
+		lineStart = buffer ;
+		SKIP_WS(lineStart);
+		if(0 != strncmp(lineStart,"0001:",5))
+			break ;		 
+		char* end ; 
+		TUint32 addr = strtoul(lineStart + 5,&end,16);
+		char* name = end + 1;
+		SKIP_WS(name);
+		end = name + 1;
+		FIND_WS(end);
+		*end = 0 ;
+		if(!lastName.empty()){
+			unsigned int size = addr - lastAddr ; 
+			unsigned int romAddr = lastAddr + aContext.iCodeAddress;
+			allocBytes = lastName.length() + 40;
+			char* outputLine = new char[allocBytes];
+			int n = snprintf(outputLine,allocBytes,"%08x    %04x    %s\r\n",romAddr,size,lastName.c_str());
+			lines.push_back(pair<int, char*>(n,outputLine));
+		}		
+	}
+	guarded_lock lock(iFileMutex);
+	allocBytes = strlen(aContext.iFileName) + 40;
+	char* outputLine = new char[allocBytes];
+	int n = snprintf(outputLine,allocBytes,"\r\nFrom    %s\r\n\r\n",aContext.iFileName); 
+	iOutput.write(outputLine,n);
+	delete []outputLine ;
+	vector<pair<int,char*> >::iterator it; 
+	for ( it = lines.begin() ; it < lines.end(); it ++ ) {
+		int len = it->first ;
+		char* line = it->second  ;
+		iOutput.write(line,len);
+		delete []line ;
+	}	
+	if(!lastName.empty()){
+		allocBytes = lastName.length() + 40 ;
+		outputLine = new char[allocBytes];
+		unsigned int romAddr = lastAddr + aContext.iCodeAddress;
+		n = snprintf(outputLine,allocBytes,"%08x    0000    %s\r\n",romAddr,lastName.c_str());
+		iOutput.write(outputLine,n);
+		delete []outputLine ;
+	}
+	iOutput.flush();
+	return false ;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/imgtools/romtools/rombuild/symbolgenerator.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,51 @@
+#ifndef __SYMBOLSCREATER_H__
+#define __SYMBOLSCREATER_H__
+#include <queue>
+#include <string>
+#include <fstream>
+#include <vector>
+#include <map>
+
+using namespace std;
+
+#include <boost/thread/thread.hpp>
+#include <boost/thread/condition.hpp>
+
+struct SymGenContext {
+	const char* iFileName ;
+	TUint32	iTotalSize ;
+	TUint32 iCodeAddress; 
+	TUint32 iDataAddress; 
+	TUint32 iDataBssLinearBase;	 
+	TInt iTextSize; 
+	TInt iDataSize; 
+	TInt iBssSize;   	
+	TInt iTotalDataSize;
+	TBool iExecutable ;
+};
+
+class SymbolGenerator  {  
+public :
+		SymbolGenerator(const char* aSymbolFileName, int aMultiThreadsCount = 1);
+		~SymbolGenerator();		
+		void AddEntry(const SymGenContext& aEntry); 
+		void WaitThreads();
+private :
+		SymbolGenerator();
+		SymbolGenerator& operator = (const SymbolGenerator& aRight);
+		static void ThreadFunc(SymbolGenerator* aInst); 
+		bool ProcessEntry(const SymGenContext& aContext);
+		bool ProcessARMV5Map(ifstream& aStream, const SymGenContext& aContext);
+		bool ProcessGCCMap(ifstream& aStream, const SymGenContext& aContext);
+		bool ProcessX86Map(ifstream& aStream, const SymGenContext& aContext);
+		ofstream iOutput ; 
+		boost::thread_group iThreads ;
+		boost::condition_variable iCond;
+		boost::mutex iQueueMutex;
+		boost::mutex iFileMutex ;
+		queue<SymGenContext> iEntries ;	
+		vector<char*> iErrMsgs ;
+	
+};
+
+#endif //__ROMSYMBOLGENERATOR_H__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatoolsplat/j2re-1.3.1/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../j2re-1_3_1_01-win-i.exe    /epoc32/tools/distrib/j2re-1_3_1_01-win-i.exe
+
+PRJ_MMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatoolsplat/j2re-1.3.1/group/j2re-1.3.1.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_javatoolsplat_j2re-1.3.1
+
+source \src\tools\build\javatoolsplat\j2re-1.3.1
+exports \src\tools\build\javatoolsplat\j2re-1.3.1\group
+
+notes_source \src\tools\build\javatoolsplat\j2re-1.3.1\group\release.txt
+
+ipr T
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatoolsplat/j2re-1.3.1/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian Software Ltd.
+
+NOTESRC_RELEASE_REASON
+j2re 1.3.1.
Binary file javatoolsplat/j2re-1.3.1/j2re-1_3_1_01-win-i.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javatoolsplat/j2re-1.3.1/java.ipr	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,248 @@
+[purpose]
+
+Java run time envonment
+
+[categories]
+generic
+
+[files]
+tools\distrib\j2re-1_3_1_01-win-i.exe
+
+[owner]
+Developer Kits
+
+[IPR]
+Sun Microsystems, Inc. 
+
+Binary Code License Agreement
+
+
+
+
+READ THE TERMS OF THIS AGREEMENT AND ANY PROVIDED SUPPLEMENTAL LICENSE TERMS
+(COLLECTIVELY "AGREEMENT") CAREFULLY BEFORE OPENING THE SOFTWARE MEDIA
+PACKAGE. BY OPENING THE SOFTWARE MEDIA PACKAGE, YOU AGREE TO THE TERMS OF THIS
+AGREEMENT. IF YOU ARE ACCESSING THE SOFTWARE ELECTRONICALLY, INDICATE YOUR
+ACCEPTANCE OF THESE TERMS BY SELECTING THE "ACCEPT" BUTTON AT THE END OF THIS
+AGREEMENT. IF YOU DO NOT AGREE TO ALL OF THESE TERMS, PROMPTLY RETURN THE
+UNUSED SOFTWARE TO YOUR PLACE OF PURCHASE FOR A REFUND OR, IF THE SOFTWARE IS
+ACCESSED ELECTRONICALLY, SELECT THE "DECLINE" BUTTON AT THE END OF THIS
+AGREEMENT AND THE INSTALLATION PROCESS WILL NOT CONTINUE.
+
+
+
+
+1. License to Use. Sun Microsystems, Inc. ("Sun") grants you a non-exclusive
+and non-transferable license for the internal use only of the accompanying
+software, documentation and any error corrections provided by Sun
+(collectively "Software"), by the number of users and the class of computer
+hardware for which the corresponding fee has been paid.
+
+
+
+
+2. Restrictions. Software is confidential and copyrighted. Title to Software
+and all associated intellectual property rights is retained by Sun and/or its
+licensors. Except as specifically authorized in any Supplemental License
+Terms, you may not make copies of Software, other than a single copy of
+Software for archival purposes. Unless enforcement is prohibited by applicable
+law, you may not modify, decompile, or reverse engineer Software. You
+acknowledge that Software is not designed, licensed or intended for use in the
+design, construction, operation or maintenance of any nuclear facility. Sun
+disclaims any express or implied warranty of fitness for such uses. No right,
+title or interest in or to any trademark, service mark, logo or trade name of
+Sun or its licensors is granted under this Agreement. 
+
+
+
+
+3. Limited Warranty. Sun warrants to you that for a period of ninety (90) days
+from the date of purchase, as evidenced by a copy of the receipt, the media on
+which Software is furnished (if any) will be free of defects in materials and
+workmanship under normal use. Except for the foregoing, Software is provided
+"AS IS". Your exclusive remedy and Sun's entire liability under this limited
+warranty will be at Sun's option to replace Software media or refund the fee
+paid for Software.
+
+
+
+
+4. DISCLAIMER OF WARRANTY. UNLESS SPECIFIED IN THIS AGREEMENT, ALL EXPRESS OR
+IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING ANY IMPLIED
+WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NON-INFRINGEMENT ARE DISCLAIMED, EXCEPT TO THE EXTENT THAT THESE DISCLAIMERS
+ARE HELD TO BE LEGALLY INVALID.
+
+
+
+
+5. LIMITATION OF LIABILITY. TO THE EXTENT NOT PROHIBITED BY LAW, IN NO EVENT
+WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST REVENUE, PROFIT OR DATA, OR
+FOR SPECIAL, INDIRECT, CONSEQUENTIAL, INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER
+CAUSED REGARDLESS OF THE THEORY OF LIABILITY, ARISING OUT OF OR RELATED TO THE
+USE OF OR INABILITY TO USE SOFTWARE, EVEN IF SUN HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES. In no event will Sun's liability to you, whether
+in contract, tort (including negligence), or otherwise, exceed the amount paid
+by you for Software under this Agreement. The foregoing limitations will apply
+even if the above stated warranty fails of its essential purpose.
+
+
+
+
+6. Termination. This Agreement is effective until terminated. You may
+terminate this Agreement at any time by destroying all copies of Software.
+This Agreement will terminate immediately without notice from Sun if you fail
+to comply with any provision of this Agreement. Upon Termination, you must
+destroy all copies of Software.
+
+
+
+
+7. Export Regulations. All Software and any technical data delivered under
+this Agreement are subject to US export control laws and may be subject to
+export or import regulations in other countries. You agree to comply strictly
+with all such laws and regulations and acknowledge that you have the
+responsibility to obtain such licenses to export, re-export, or import as may
+be required after delivery to you.
+
+
+
+
+8. U.S. Government Restricted Rights. If Software is being acquired by or on
+behalf of the U.S. Government or by a U.S. Government prime contractor or
+subcontractor (at any tier), then the Government's rights in Software and
+accompanying documentation will be only as set forth in this Agreement; this
+is in accordance with 48 C.F.R. 227.7202-4 (for Department of Defense (DOD)
+acquisitions) and with 48 C.F.R. 2.101 and 12.212 (for non-DOD acquisitions).
+
+
+
+
+9. Governing Law. Any action related to this Agreement will be governed by
+California law and controlling U.S. federal law. No choice of law rules of any
+jurisdiction will apply.
+
+
+
+
+10. Severability. If any provision of this Agreement is held to be
+unenforceable, this Agreement will remain in effect with the provision
+omitted, unless omission would frustrate the intent of the parties, in which
+case this Agreement will immediately terminate.
+
+
+
+
+11. Integration. This Agreement is the entire agreement between you and Sun
+relating to its subject matter. It supersedes all prior or contemporaneous
+oral or written communications, proposals, representations and warranties and
+prevails over any conflicting or additional terms of any quote, order,
+acknowledgment, or other communication between the parties relating to its
+subject matter during the term of this Agreement. No modification of this
+Agreement will be binding, unless in writing and signed by an authorized
+representative of each party.
+
+
+
+
+For inquiries please contact: Sun Microsystems, Inc. 901 San Antonio Road,
+Palo Alto, California 94303
+
+
+
+
+JAVA 2 RUNTIME ENVIRONMENT (J2RE), VERSION 1.3.x
+
+SUPPLEMENTAL LICENSE TERMS
+
+
+
+
+These supplemental license terms ("Supplemental Terms") add to or modify the
+terms of the Binary Code License Agreement (collectively, the "Agreement").
+Capitalized terms not defined in these Supplemental Terms shall have the same
+meanings ascribed to them in the Agreement. These Supplemental Terms shall
+supersede any inconsistent or conflicting terms in the Agreement, or in any
+license contained within the Software. 
+
+1. Software Internal Use and Development License Grant. Subject to the terms
+and conditions of this Agreement, including, but not limited to Section 4
+(Java(TM) Technology Restrictions) of these Supplemental Terms, Sun grants you
+a non-exclusive, non-transferable, limited license to reproduce internally and
+use internally the binary form of the Software complete and unmodified for the
+sole purpose of designing, developing and testing your Java applets and
+applications intended to run on the Java platform ("Programs"). 
+
+2. License to Distribute Software. Subject to the terms and conditions of this
+Agreement, including, but not limited to Section 4 (Java (TM) Technology
+Restrictions) of these Supplemental Terms, Sun grants you a non-exclusive,
+non-transferable, limited license to reproduce and distribute the Software in
+binary code form only, provided that (i) you distribute the Software complete
+and unmodified and only bundled as part of, and for the sole purpose of 
+running, your Programs, (ii) the Programs add significant and primary
+functionality to the Software, (iii) you do not distribute additional software
+intended to replace any component(s) of the Software, (iv) you do not remove
+or alter any proprietary legends or notices contained in the Software, (v) you
+only distribute the Software subject to a license agreement that protects
+Sun's interests consistent with the terms contained in this Agreement, and
+(vi) you agree to defend and indemnify Sun and its licensors from and against
+any damages, costs, liabilities, settlement amounts and/or expenses (including
+attorneys' fees) incurred in connection with any claim, lawsuit or action by
+any third party that arises or results from the use or distribution of any and
+all Programs and/or Software. 
+
+3. License to Distribute Redistributables. Subject to the terms and conditions
+of this Agreement, including but not limited to Section 4 (Java Technology
+Restrictions) of these Supplemental Terms, Sun grants you a non-exclusive,
+non-transferable, limited license to reproduce and distribute the binary form
+of those files specifically identified as redistributable in the Software
+"README" file ("Redistributables") provided that: (i) you distribute the
+Redistributables complete and unmodified (unless otherwise specified in the
+applicable README file), and only bundled as part of Programs, (ii) you do not
+distribute additional software intended to supersede any component(s) of the
+Redistributables, (iii) you do not remove or alter any proprietary legends or
+notices contained in or on the Redistributables, (iv) you only distribute the
+Redistributables pursuant to a license agreement that protects Sun's interests
+consistent with the terms contained in the Agreement, and (v) you agree to
+defend and indemnify Sun and its licensors from and against any damages,
+costs, liabilities, settlement amounts and/or expenses (including attorneys'
+fees) incurred in connection with any claim, lawsuit or action by any third
+party that arises or results from the use or distribution of any and all
+Programs and/or Software. 
+
+4. Java Technology Restrictions. You may not modify the Java Platform
+Interface ("JPI", identified as classes contained within the "java" package or
+any subpackages of the "java" package), by creating additional classes within
+the JPI or otherwise causing the addition to or modification of the classes in
+the JPI.  In the event that you create an additional class and associated
+API(s) which (i) extends the functionality of the Java platform, and (ii) is
+exposed to third party software developers for the purpose of developing
+additional software which invokes such additional API, you must promptly
+publish broadly an accurate specification for such API for free use by all
+developers.  You may not create, or authorize your licensees to create,
+additional classes, interfaces, or subpackages that are in any way identified
+as "java", "javax", "sun" or similar convention as specified by Sun in any
+naming convention designation. 
+
+5. Trademarks and Logos. You acknowledge and agree as between you and Sun that
+Sun owns the SUN, SOLARIS, JAVA, JINI, FORTE, and iPLANET trademarks and all
+SUN, SOLARIS, JAVA, JINI, FORTE, and iPLANET-related trademarks, service
+marks, logos and other brand designations ("Sun Marks"), and you agree to
+comply with the Sun Trademark and Logo Usage Requirements currently located at
+http://www.sun.com/policies/trademarks. Any use you make of the Sun Marks
+inures to Sun's benefit. 
+
+6. Source Code. Software may contain source code that is provided solely for
+reference purposes pursuant to the terms of this Agreement.  Source code may
+not be redistributed unless expressly provided for in this Agreement. 
+
+7.
+Termination for Infringement. Either party may terminate this Agreement
+immediately should any Software become, or in either party's opinion be likely
+to become, the subject of a claim of infringement of any intellectual property
+right. 
+
+For inquiries please contact: Sun Microsystems, Inc.  901 San Antonio Road,
+Palo Alto, California 94303 
+(LFI#90956/Form ID#011801)
+
Binary file perltoolsplat/activestate-perl-5.6.1/APi518e.exe has changed
Binary file perltoolsplat/activestate-perl-5.6.1/ActivePerl-5.6.1.635-MSWin32-x86.msi has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perltoolsplat/activestate-perl-5.6.1/group/activestate-perl-5.6.1.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_perltoolsplat_activestate-perl-5.6.1
+
+source \src\tools\build\perltoolsplat\activestate-perl-5.6.1
+exports \src\tools\build\perltoolsplat\activestate-perl-5.6.1\group
+
+notes_source \src\tools\build\perltoolsplat\activestate-perl-5.6.1\group\release.txt
+
+ipr T
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perltoolsplat/activestate-perl-5.6.1/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../APi518e.exe    /epoc32/tools/distrib/api518e.exe
+../ActivePerl-5.6.1.635-MSWin32-x86.msi   /epoc32/tools/distrib/activeperl-5.6.1.635-mswin32-x86.msi
+
+PRJ_MMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perltoolsplat/activestate-perl-5.6.1/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian Software Ltd.
+
+NOTESRC_RELEASE_REASON
+activestate perl tools.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/perltoolsplat/activestate-perl-5.6.1/perl.ipr	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,15 @@
+[purpose]
+
+ActivePerl
+
+[categories]
+generic
+
+[files]
+tools\distrib\APi518e.exe	# full distribution of ActivePerl 518
+
+[owner]
+Runtime & Tools
+
+[IPR]
+Copyright (c) 1999 ActiveState Tool Corp. All rights reserved.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,216 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+//
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../perl/archive_path.txt.ex	   /tools/cbr/archive_path.txt.ex
+../perl/BinInfo	   /tools/cbr/BinInfo
+../perl/BinInfo.bat	   /tools/cbr/BinInfo.bat
+../perl/BldDocs	   /tools/cbr/BldDocs
+../perl/BldDocs.bat	   /tools/cbr/BldDocs.bat
+../perl/BuildRel	   /tools/cbr/BuildRel
+../perl/BuildRel.bat	   /tools/cbr/BuildRel.bat
+../perl/CatData.pm	   /tools/cbr/CatData.pm
+../perl/CheckBc	   /tools/cbr/CheckBc
+../perl/CheckBc.bat	   /tools/cbr/CheckBc.bat
+../perl/CheckBc.pm	   /tools/cbr/CheckBc.pm
+../perl/CheckRls	   /tools/cbr/CheckRls
+../perl/CheckRls.bat	   /tools/cbr/CheckRls.bat
+../perl/CleanEnv	   /tools/cbr/CleanEnv
+../perl/CleanEnv.bat	   /tools/cbr/CleanEnv.bat
+../perl/CleanEnv.pm	   /tools/cbr/CleanEnv.pm
+../perl/CleanEnv.pod	   /tools/cbr/CleanEnv.pod
+../perl/Cleaner.pm	   /tools/cbr/Cleaner.pm
+../perl/CleanLocalArch	   /tools/cbr/CleanLocalArch
+../perl/CleanLocalArch.bat	   /tools/cbr/CleanLocalArch.bat
+../perl/cleanremote	   /tools/cbr/cleanremote
+../perl/cleanremote.bat	   /tools/cbr/cleanremote.bat
+../perl/CommandController.pm	   /tools/cbr/CommandController.pm
+../perl/CopyRel	   /tools/cbr/CopyRel
+../perl/CopyRel.bat	   /tools/cbr/CopyRel.bat
+../perl/CopyRel.pm	   /tools/cbr/CopyRel.pm
+../perl/Crypt.pm	   /tools/cbr/Crypt.pm
+../perl/DeltaEnv	   /tools/cbr/DeltaEnv
+../perl/DeltaEnv.bat	   /tools/cbr/DeltaEnv.bat
+../perl/DiffEnv	   /tools/cbr/DiffEnv
+../perl/DiffEnv.bat	   /tools/cbr/DiffEnv.bat
+../perl/DiffRel	   /tools/cbr/DiffRel
+../perl/DiffRel.bat	   /tools/cbr/DiffRel.bat
+../perl/EnvData	   /tools/cbr/EnvData
+../perl/EnvData.bat	   /tools/cbr/EnvData.bat
+../perl/EnvDb.pm	   /tools/cbr/EnvDb.pm
+../perl/EnvDifferencer.pm	   /tools/cbr/EnvDifferencer.pm
+../perl/EnvInfo	   /tools/cbr/EnvInfo
+../perl/EnvInfo.bat	   /tools/cbr/EnvInfo.bat
+../perl/EnvInfoTk	   /tools/cbr/EnvInfoTk
+../perl/EnvInfoTk.bat	   /tools/cbr/EnvInfoTk.bat
+../perl/Environment	   /tools/cbr/Environment
+../perl/envmembership	   /tools/cbr/envmembership
+../perl/envmembership.bat	   /tools/cbr/envmembership.bat
+../perl/envsize	   /tools/cbr/envsize
+../perl/envsize.bat	   /tools/cbr/envsize.bat
+../perl/ExportData.pm	   /tools/cbr/ExportData.pm
+../perl/ExportEnv	   /tools/cbr/ExportEnv
+../perl/ExportEnv.bat	   /tools/cbr/ExportEnv.bat
+../perl/ExportingReleases	   /tools/cbr/ExportingReleases
+../perl/ExportRel	   /tools/cbr/ExportRel
+../perl/ExportRel.bat	   /tools/cbr/ExportRel.bat
+../perl/FAQ	   /tools/cbr/FAQ
+../perl/FundamentalConcepts	   /tools/cbr/FundamentalConcepts
+../perl/FurtherInformation	   /tools/cbr/FurtherInformation
+../perl/GetEnv	   /tools/cbr/GetEnv
+../perl/GetEnv.bat	   /tools/cbr/GetEnv.bat
+../perl/GetEnv.pm	   /tools/cbr/GetEnv.pm
+../perl/getrel	   /tools/cbr/getrel
+../perl/getrel.bat	   /tools/cbr/getrel.bat
+../perl/GetSource	   /tools/cbr/GetSource
+../perl/GetSource.bat	   /tools/cbr/GetSource.bat
+../perl/HistoricPerspective	   /tools/cbr/HistoricPerspective
+../perl/ImportEnv	   /tools/cbr/ImportEnv
+../perl/ImportEnv.bat	   /tools/cbr/ImportEnv.bat
+../perl/ImportRel	   /tools/cbr/ImportRel
+../perl/ImportRel.bat	   /tools/cbr/ImportRel.bat
+../perl/IniData.pm	   /tools/cbr/IniData.pm
+../perl/Installation	   /tools/cbr/Installation
+../perl/InstallSnapShot	   /tools/cbr/InstallSnapShot
+../perl/InstallSnapShot.bat	   /tools/cbr/InstallSnapShot.bat
+../perl/InstCol2	   /tools/cbr/InstCol2
+../perl/InstCol2.bat	   /tools/cbr/InstCol2.bat
+../perl/LatestVer	   /tools/cbr/LatestVer
+../perl/LatestVer.bat	   /tools/cbr/LatestVer.bat
+../perl/listcomponents	   /tools/cbr/listcomponents
+../perl/listcomponents.bat	   /tools/cbr/listcomponents.bat
+../perl/MakeEnv	   /tools/cbr/MakeEnv
+../perl/MakeEnv.bat	   /tools/cbr/MakeEnv.bat
+../perl/MakeRel	   /tools/cbr/MakeRel
+../perl/MakeRel.bat	   /tools/cbr/MakeRel.bat
+../perl/MakeRel.pm	   /tools/cbr/MakeRel.pm
+../perl/MakeSnapShot	   /tools/cbr/MakeSnapShot
+../perl/MakeSnapShot.bat	   /tools/cbr/MakeSnapShot.bat
+../perl/MakingReleases	   /tools/cbr/MakingReleases
+../perl/ManagingEnvironments	   /tools/cbr/ManagingEnvironments
+../perl/mbld	   /tools/cbr/mbld
+../perl/mbld.bat	   /tools/cbr/mbld.bat
+../perl/MergeEnvironments	   /tools/cbr/MergeEnvironments
+../perl/MergeEnvironments.bat	   /tools/cbr/MergeEnvironments.bat
+../perl/MLDBM.pm	   /tools/cbr/MLDBM.pm
+../perl/ModNotes	   /tools/cbr/ModNotes
+../perl/ModNotes.bat	   /tools/cbr/ModNotes.bat
+../perl/MrpComplexity	   /tools/cbr/MrpComplexity
+../perl/MrpComplexity.bat	   /tools/cbr/MrpComplexity.bat
+../perl/MrpData.pm	   /tools/cbr/MrpData.pm
+../perl/NotesCompiler.pm	   /tools/cbr/NotesCompiler.pm
+../perl/Optimisation	   /tools/cbr/Optimisation
+../perl/PathData.pm	   /tools/cbr/PathData.pm
+../perl/PrepEnv	   /tools/cbr/PrepEnv
+../perl/PrepEnv.bat	   /tools/cbr/PrepEnv.bat
+../perl/PrepRel	   /tools/cbr/PrepRel
+../perl/PrepRel.bat	   /tools/cbr/PrepRel.bat
+../perl/PrepRel.pm	   /tools/cbr/PrepRel.pm
+../perl/PullEnv	   /tools/cbr/PullEnv
+../perl/PullEnv.bat	   /tools/cbr/PullEnv.bat
+../perl/pullrel	   /tools/cbr/pullrel
+../perl/pullrel.bat	   /tools/cbr/pullrel.bat
+../perl/PushEnv	   /tools/cbr/PushEnv
+../perl/PushEnv.bat	   /tools/cbr/PushEnv.bat
+../perl/PushPullRel.pm	   /tools/cbr/PushPullRel.pm
+../perl/pushrel	   /tools/cbr/pushrel
+../perl/pushrel.bat	   /tools/cbr/pushrel.bat
+../perl/QuickStart	   /tools/cbr/QuickStart
+../perl/RelData.pm	   /tools/cbr/RelData.pm
+../perl/relnotes.txt	   /tools/cbr/relnotes.txt
+../perl/reltools.ini.ex	   /tools/cbr/reltools.ini.ex
+../perl/RelTransfer.pm	   /tools/cbr/RelTransfer.pm
+../perl/RemoteSite.pm	   /tools/cbr/RemoteSite.pm
+../perl/RemoveRel	   /tools/cbr/RemoveRel
+../perl/RemoveRel.bat	   /tools/cbr/RemoveRel.bat
+../perl/removesource	   /tools/cbr/removesource
+../perl/removesource.bat	   /tools/cbr/removesource.bat
+../perl/SourceInfo	   /tools/cbr/SourceInfo
+../perl/SourceInfo.bat	   /tools/cbr/SourceInfo.bat
+../perl/TableFormatter.pm	   /tools/cbr/TableFormatter.pm
+../perl/Utils.pm	   /tools/cbr/Utils.pm
+../perl/ValidateEnv	   /tools/cbr/ValidateEnv
+../perl/ValidateEnv.bat	   /tools/cbr/ValidateEnv.bat
+../perl/ValidateRel	   /tools/cbr/ValidateRel
+../perl/ValidateRel.bat	   /tools/cbr/ValidateRel.bat
+../perl/version.txt	   /tools/cbr/version.txt
+../perl/ViewNotes	   /tools/cbr/ViewNotes
+../perl/ViewNotes.bat	   /tools/cbr/ViewNotes.bat
+../perl/Archive/Tar.pm	   /tools/cbr/Archive/Tar.pm
+../perl/Archive/Zip.pm	   /tools/cbr/Archive/Zip.pm
+../perl/Archive/Zip/BufferedFileHandle.pm	   /tools/cbr/Archive/Zip/BufferedFileHandle.pm
+../perl/Archive/Zip/MockFileHandle.pm	   /tools/cbr/Archive/Zip/MockFileHandle.pm
+../perl/Archive/Zip/Tree.pm	   /tools/cbr/Archive/Zip/Tree.pm
+../perl/Class/Singleton.pm	   /tools/cbr/Class/Singleton.pm
+../perl/Crypt/GPG.pm	   /tools/cbr/Crypt/GPG.pm
+../perl/Crypt/PGP.pm	   /tools/cbr/Crypt/PGP.pm
+../perl/Digest/Perl/MD5.pm	   /tools/cbr/Digest/Perl/MD5.pm
+../perl/Digest/Perl/readme.txt	   /tools/cbr/Digest/Perl/readme.txt
+../perl/MLDBM/Sync.pm      /tools/cbr/MLDBM/Sync.pm
+../perl/MLDBM/Sync/SDBM_File.pm            /tools/cbr/MLDBM/Sync/SDBM_File.pm
+../perl/MLDBM/Serializer/FreezeThaw.pm	   /tools/cbr/MLDBM/Serializer/FreezeThaw.pm
+../perl/MLDBM/Serializer/Storable.pm	   /tools/cbr/MLDBM/Serializer/Storable.pm
+../perl/MLDBM/Serializer/Data/Dumper.pm	   /tools/cbr/MLDBM/Serializer/Data/Dumper.pm
+../perl/Net/Cmd.pm	   /tools/cbr/Net/Cmd.pm
+../perl/Net/Config.pm	   /tools/cbr/Net/Config.pm
+../perl/Net/Domain.pm	   /tools/cbr/Net/Domain.pm
+../perl/Net/DummyInetd.pm	   /tools/cbr/Net/DummyInetd.pm
+../perl/Net/FTP.pm	   /tools/cbr/Net/FTP.pm
+../perl/Net/libnetFAQ.pod	   /tools/cbr/Net/libnetFAQ.pod
+../perl/Net/Netrc.pm	   /tools/cbr/Net/Netrc.pm
+../perl/Net/NNTP.pm	   /tools/cbr/Net/NNTP.pm
+../perl/Net/PH.pm	   /tools/cbr/Net/PH.pm
+../perl/Net/POP3.pm	   /tools/cbr/Net/POP3.pm
+../perl/Net/SMTP.pm	   /tools/cbr/Net/SMTP.pm
+../perl/Net/SNPP.pm	   /tools/cbr/Net/SNPP.pm
+../perl/Net/Time.pm	   /tools/cbr/Net/Time.pm
+../perl/Net/FTP/A.pm	   /tools/cbr/Net/FTP/A.pm
+../perl/Net/FTP/dataconn.pm	   /tools/cbr/Net/FTP/dataconn.pm
+../perl/Net/FTP/E.pm	   /tools/cbr/Net/FTP/E.pm
+../perl/Net/FTP/I.pm	   /tools/cbr/Net/FTP/I.pm
+../perl/Net/FTP/L.pm	   /tools/cbr/Net/FTP/L.pm
+../perl/PathData/ComponentBased.pm	   /tools/cbr/PathData/ComponentBased.pm
+../perl/PathData/ProjectBased.pm	   /tools/cbr/PathData/ProjectBased.pm
+../perl/RelTransfer/Export.pm	   /tools/cbr/RelTransfer/Export.pm
+../perl/RelTransfer/Import.pm	   /tools/cbr/RelTransfer/Import.pm
+../perl/RemoteSite/FTP.pm	   /tools/cbr/RemoteSite/FTP.pm
+../perl/RemoteSite/NetDrive.pm	   /tools/cbr/RemoteSite/NetDrive.pm
+../perl/RemoteSite/FTP/Experimental.pm	   /tools/cbr/RemoteSite/FTP/Experimental.pm
+../perl/RemoteSite/FTP/Proxy.pm	   /tools/cbr/RemoteSite/FTP/Proxy.pm
+../perl/RemoteSite/FTP/Proxy/Experimental.pm	   /tools/cbr/RemoteSite/FTP/Proxy/Experimental.pm
+../perl/RemoteSite/NetDrive/MultiVolumeExport.pm	   /tools/cbr/RemoteSite/NetDrive/MultiVolumeExport.pm
+../perl/RemoteSite/NetDrive/MultiVolumeImport.pm	   /tools/cbr/RemoteSite/NetDrive/MultiVolumeImport.pm
+../perl/Symbian/DistributionPolicy.pm	   /tools/cbr/Symbian/DistributionPolicy.pm
+../perl/Symbian/IPR.pm	   /tools/cbr/Symbian/IPR.pm
+../perl/Symbian/CBR/ApplyDelta.pm	   /tools/cbr/Symbian/CBR/ApplyDelta.pm
+../perl/Symbian/CBR/CreateDelta.pm	   /tools/cbr/Symbian/CBR/CreateDelta.pm
+../perl/Symbian/CBR/MRP.pm	   /tools/cbr/Symbian/CBR/MRP.pm
+../perl/Symbian/CBR/MRPInterface.pm	   /tools/cbr/Symbian/CBR/MRPInterface.pm
+../perl/Symbian/CBR/Component/Manifest.pm	   /tools/cbr/Symbian/CBR/Component/Manifest.pm
+../perl/Symbian/CBR/DeltaRelease/Manifest.pm	   /tools/cbr/Symbian/CBR/DeltaRelease/Manifest.pm
+../perl/Symbian/CBR/IPR/MRP.pm	   /tools/cbr/Symbian/CBR/IPR/MRP.pm
+../perl/Symbian/CBR/MRP/Reader.pm	   /tools/cbr/Symbian/CBR/MRP/Reader.pm
+../perl/Symbian/CBR/release/Manifest.pm	   /tools/cbr/Symbian/CBR/release/Manifest.pm
+../perl/Symbian/DistributionPolicy/Reader.pm	   /tools/cbr/Symbian/DistributionPolicy/Reader.pm
+../perl/TableFormatter/Auto.pm	   /tools/cbr/TableFormatter/Auto.pm
+../perl/TableFormatter/Csv.pm	   /tools/cbr/TableFormatter/Csv.pm
+../perl/TableFormatter/Excel.pm	   /tools/cbr/TableFormatter/Excel.pm
+../perl/TableFormatter/Html.pm	   /tools/cbr/TableFormatter/Html.pm
+../perl/TableFormatter/Text.pm	   /tools/cbr/TableFormatter/Text.pm
+../perl/Text/Glob.pm	   /tools/cbr/Text/Glob.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/build.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Extension Makefile for creating the CBR tools installable package
+#
+
+# Constants
+TOOLS_DIR = $(EPOCROOT)tools
+WORK_DIR = $(EPOCROOT)temp\cbr
+SRC_DIR = ..\perl
+CUR_DIR = $(shell chdir)
+include version.mk
+
+# Targets
+
+do_nothing: 
+	rem do_nothing
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+FREEZE : do_nothing
+
+SAVESPACE : BLD
+
+LIB: do_nothing
+
+RELEASABLES :
+ifeq ("$(PLATFORM) $(CFG)", "TOOLS REL")
+	@echo $(TOOLS_DIR)\cbr\cbrtools$(VERSION).zip	
+endif
+
+
+# remove jar file and class files
+CLEAN :
+ifeq ("$(PLATFORM) $(CFG)", "TOOLS REL")
+	-del $(TOOLS_DIR)\cbr\cbrtools$(VERSION).zip	
+	-rmdir /s/q $(WORK_DIR)
+endif
+
+# Called with
+#
+# $(PLATFORM) = TOOLS
+# $(CFG)      = DEB, REL
+
+# Note: DISTRIBUTION.POLICY files are only shipped with the example 
+
+BLD	:  
+	@echo BLD called with $(PLATFORM) $(CFG)
+ifeq ("$(PLATFORM) $(CFG)", "TOOLS REL")
+	-rmdir /S/Q $(WORK_DIR)
+	-mkdir $(TOOLS_DIR)\cbr
+	-del $(TOOLS_DIR)\cbr\cbrtools$(VERSION).zip	
+	-mkdir $(WORK_DIR)
+	xcopy /EI $(SRC_DIR) $(WORK_DIR)	
+	cd $(WORK_DIR); zip -9r $(TOOLS_DIR)\cbr\cbrtools$(VERSION).zip *	
+	-rmdir /S/Q $(WORK_DIR)
+endif
+
+FINAL : do_nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/cbr.preconfigure.nsh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,288 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+###########################################################################################
+#  CBR Tools handling
+# 
+!define RELTOOLSKEY "SOFTWARE\Symbian\Release Tools"
+!define CBRTOOLSKEY "SOFTWARE\Symbian\Symbian CBR Tools"
+!define PRODUCT_UNINST_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
+
+VAR CBRUNINSTALL
+
+!macro CBRToolsNSISManualUninstall inVersion inPath
+           SetShellVarContext current
+           RMDir /r "$SMPROGRAMS\Symbian CBR Tools\${inVersion}"
+           RMDir "$SMPROGRAMS\Symbian CBR Tools" ; delete if empty
+           RMDir /r "${inPath}"
+           DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}\Symbian CBR Tools ${inVersion}"
+           DeleteRegKey HKLM "${CBRTOOLSKEY}\${inVersion}"
+           DeleteRegKey /ifempty HKLM "${CBRTOOLSKEY}"
+           Push "${inPath}"
+           !insertmacro PathTypeRmvFromEnvVar "path" "${inPath}" ""
+           !insertmacro SetShellVarCtxt
+!macroend
+
+
+!macro CBRToolsISManualUninstall inVersion inPath inUninstallKey
+           RMDir /r "$SMPROGRAMS\Symbian OS Release Tools\"
+           RMDir /r "${inPath}"
+           ${If} "${inUninstallKey}" != ""
+             DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}\${inUninstallKey}"
+           ${EndIf}
+           DeleteRegKey HKLM "${RELTOOLSKEY}\${inVersion}"
+           DeleteRegKey /ifempty HKLM "${RELTOOLSKEY}"
+           DeleteRegKey /ifempty HKLM "SOFTWARE\Symbian"
+           Push "${inPath}"
+           !insertmacro PathTypeRmvFromEnvVar "path" "${inPath}" ""
+!macroend
+
+
+Function CBRToolsPreConfigureFunction
+exch $0 
+push $1 # counter
+push $2 # version
+push $3 # uninstall string
+push $4
+push $5
+
+push $6
+
+push $R0 # $ReplaceVer
+push $R1 # $ReplaceKey
+
+push $R2 # nsis installations found
+push $R3 # install shield installations found
+      StrCpy $CBRUNINSTALL "no"
+StrCpy $5 1
+SectionGetFlags $0  $R0 
+IntOp $R0 $R0 & ${SF_SELECTED} 
+${If} $R0 == ${SF_SELECTED} 
+
+  StrCpy $R0 "Following CBR Tools version(s) are already installed: "
+  StrCpy $R1 ""
+  StrCpy $R2 "" 
+  StrCpy $R3 ""
+  StrCpy $6 ""
+  StrCpy $1 0
+  loop:           #check if there is install shield installation
+    EnumRegKey $2 HKLM "${RELTOOLSKEY}" $1
+    StrCmp $2 "" checkNsis
+    IntOp $1 $1 + 1
+    readregstr $3 HKLM "${RELTOOLSKEY}\$2" "Path"
+    StrCpy $R3 "1"
+    StrCpy $R0 "$R0$\r$\nVersion $2 is already installed in $3."
+    GoTo loop
+  
+  checkNsis:    # check if there is NSIS installation
+  StrCpy $4 $1  
+  StrCpy $1 0
+  loop1:
+    EnumRegKey $2 HKLM "${CBRTOOLSKEY}" $1
+    StrCmp $2 "" done
+    IntOp $1 $1 + 1
+    readregstr $3 HKLM "${CBRTOOLSKEY}\$2" "Path"
+    StrCpy $R2 "$R2-$2-"  
+    StrCpy $R0 "$R0$\r$\nVersion $2 is already installed in $3."
+    GoTo loop1
+  
+  done:
+    IntOp $1 $1 + $4
+    ${If} $1 > 0
+   
+    ${If} $SILENT == "true"
+    ${AndIf} $DIALOGS == "false"
+      !insertmacro LogStopMessage "CBRTools (Release Tools) already installed. Stopping installation.\
+      $\r$\nPlease uninstall CBRTools (Rlease Tools) before continuing " "${OTHER_ERROR}"
+    ${Else}
+      MessageBox MB_YESNOCANCEL "$R0$\r$\n\
+        Do you want to uninstall previous installation(s) before continuing?" IDYES continue IDNO finish 
+    ${EndIf} 
+
+      cancel:
+      StrCpy $5 0
+      GoTo finish
+      
+      
+      continue:
+      StrCpy $CBRUNINSTALL "yes"
+      
+    ${EndIf}
+  finish:  
+${EndIf}
+  StrCpy $0 "$5"
+  pop $R3
+  pop $R2
+  pop $R1
+  pop $R0
+  pop $6
+  pop $5
+  pop $4
+  pop $3
+  pop $2
+  pop $1
+  exch $0
+FunctionEnd
+
+Function CBRToolsPreviousUninstall
+exch $0 
+push $1 # counter
+push $2 # version
+push $3 # uninstall string
+push $4
+push $5
+
+push $6
+
+push $R0 # $ReplaceVer
+push $R1 # $ReplaceKey
+
+push $R2 # nsis installations found
+push $R3 # install shield installations found
+
+${If} $CBRUNINSTALL == "yes"
+  #uninstall
+  #Uninstall first all NSIS installations
+  StrCpy $1 0
+  EnumRegKey $2 HKLM "${CBRTOOLSKEY}" $1
+  ${While} $2 != ""
+        ReadRegStr $3 HKLM "${PRODUCT_UNINST_KEY}\Symbian CBR Tools $2" "UninstallString"
+        ReadRegStr $4 HKLM "${CBRTOOLSKEY}\$2" "Path"
+        ${If} $3 == "" #no uninstaller found
+          StrCpy $6 "error"
+        ${Else}
+          IfFileExists $3 +2 0
+          StrCpy $6 "error"
+        ${EndIf}
+        
+          ${If} $SILENT == "false" 
+          ${OrIf} $DIALOGS == "true"
+            Banner::show /NOUNLOAD /set 76 "Removing previous installation $2..." "Please wait."
+          ${EndIf}
+          IfFileExists "$4\reltools.ini" 0 +3
+           CreateDirectory "$TEMP\sitk\$2\"
+           CopyFiles /SILENT "$4\reltools.ini" "$TEMP\sitk\$2\"
+          ${If} $6 == "error"
+            !insertmacro CBRToolsNSISManualUninstall "$2" "$4"
+          ${Else}
+            ClearErrors
+            ExecWait '"$3" /S _?=$4\' ;$3: Uninstaller $4:installation path
+            IfErrors +2 0
+            RMDir /r $4 ; delete installation folder
+          ${EndIf}
+          IfFileExists "$TEMP\sitk\$2\reltools.ini" 0 +4
+           CreateDirectory "$4"        
+           CopyFiles /SILENT "$TEMP\sitk\$2\reltools.ini" "$4" 
+           RMDir /r "$TEMP\sitk\$2\"
+          ${If} $SILENT == "false" 
+          ${OrIf} $DIALOGS == "true"
+            Banner::destroy
+          ${EndIf}
+
+     #IntOp $1 $1 + 1
+     EnumRegKey $2 HKLM "${CBRTOOLSKEY}" $1
+  ${EndWhile}
+
+  loop:           #check if there is install shield installation
+
+
+  StrCpy $1 0
+  StrCpy $R3 0
+  EnumRegKey $2 HKLM "${RELTOOLSKEY}" $1 
+  ${While} $2 != ""
+    ReadRegStr $3 HKLM "${RELTOOLSKEY}\$2" "Path"
+    
+           CreateDirectory "$TEMP\sitk\InstallShield\$2\"
+           IfFileExists "$3\reltools.ini" 0 +2
+           CopyFiles /SILENT "$3\reltools.ini" "$TEMP\sitk\InstallShield\$2\"
+           FileOpen $4 "$TEMP\sitk\InstallShield\$2\dir.txt" "w"
+           FileWrite $4 "$3"
+           FileClose $4
+    StrCpy $R3 "1"
+    IntOp $1 $1 + 1
+    EnumRegKey $2 HKLM "${RELTOOLSKEY}" $1
+  ${EndWhile}    
+  
+  
+      ${If} $R3 == "1" #Look for install shield installations to uninstall
+        StrCpy $1 0
+        StrCpy $6 ""
+        EnumRegKey $2 HKLM "${PRODUCT_UNINST_KEY}" $1
+        ${While} $2 != "" 
+           ReadRegStr $3 HKLM "${PRODUCT_UNINST_KEY}\$2" "DisplayName"
+           ${If} $3 == "Release Tools"
+              ${ExitWhile}
+           ${EndIf}
+           IntOp $1 $1 + 1    
+           EnumRegKey $2 HKLM "${PRODUCT_UNINST_KEY}" $1
+        ${EndWhile}
+        
+        ${If} $2 == ""
+          StrCpy $6 "error"
+        ${ElseIf} $3 == "Release Tools"
+          ReadRegStr $3 HKLM "${PRODUCT_UNINST_KEY}\$2" "UninstallString"
+          ${If} $3 == ""
+            StrCpy $6 "error"
+          ${Else}
+            MessageBox MB_OK "InstallShield will be launched, please select <remove> and follow the wizard" /SD IDOK
+            ExecWait $3
+          ${EndIf}
+        ${EndIf}
+        
+        FindFirst $0 $4 "$TEMP\sitk\InstallShield\*"
+        ${While} $4 != ""
+            ${If} $4 != "."
+            ${AndIf} $4 != ".."
+              IfFileExists "$TEMP\sitk\InstallShield\$4\dir.txt" 0 notfound
+
+              FileOpen $3 "$TEMP\sitk\InstallShield\$4\dir.txt" "r"
+              FileRead $3 $1
+              FileClose $3
+              
+              ${If} $6 == "error"
+                !insertmacro CBRToolsISManualUninstall "$4" "$1" "$2"
+              ${EndIf}
+              
+              IfFileExists "$TEMP\sitk\InstallShield\$4\reltools.ini" 0 notfound
+              CreateDirectory "$1" 
+              CopyFiles /SILENT "$TEMP\sitk\InstallShield\$4\reltools.ini" "$1" 
+              notfound:
+              
+            ${EndIf}
+            FindNext $0 $4
+        ${EndWhile}
+        FindClose $0   
+
+      ${EndIf}
+      #uninstal
+${EndIF}
+
+  pop $R3
+  pop $R2
+  pop $R1
+  pop $R0
+  pop $6
+  pop $5
+  pop $4
+  pop $3
+  pop $2
+  pop $1
+  pop $0
+FunctionEnd
+
+!macro CBRToolsPreconfigure inSectionName
+  push "${inSectionName}"
+  call CBRToolsPreConfigureFunction
+!macroend
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/cbr_tools.tdf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,15 @@
+<tool name="CBR Tools" description="Component Based Release tools for integration and transferring releases" version="2.84.3">
+	<properties>
+		<property type="toolLogic" name="Path" value="$INSTDIR\cbr"/>
+	</properties>
+	<templates>
+		<template type="nsis" operation="preconfigure" name="src/tools/product/tools/cbr/group/cbr.preconfigure.nsh" />
+		<template type="xsl" operation="install" name="cbr_installer.xsl"/>
+	</templates>
+	<files>
+		<zip source="\tools\cbr\cbrtools*.zip" target="$INSTDIR/cbr"/>
+	</files>
+	<dependencies>
+		<dependency name="CBR Documentation"/>
+	</dependencies>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/cbrtools.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_releasing_cbrtools
+
+source \src\tools\build\releasing\cbrtools
+
+ipr T
+
+exports \src\tools\build\releasing\cbrtools\group
+
+notes_source \src\tools\build\releasing\cbrtools\group\release.txt
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian.
+
+NOTESRC_RELEASE_REASON
+CBR tools release.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/group/version.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+VERSION = 2.84.3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Archive/Tar.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1242 @@
+# Copyright 1997 Calle Dybedahl. All rights reserved.
+# Copyright 1998 Stephen Zander. All rights reserved.
+#
+# It is currently developed by Stephen Zander <gibreel@pobox.com>
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+package Archive::Tar;
+
+use strict;
+use Carp qw(carp);
+use Cwd;
+use Fcntl qw(O_RDONLY O_RDWR O_WRONLY O_CREAT O_TRUNC F_DUPFD F_GETFL);
+use File::Basename;
+use Symbol;
+require Time::Local if $^O eq "MacOS";
+
+use vars qw($VERSION @ISA @EXPORT_OK %EXPORT_TAGS);
+$VERSION = do { my @a=q$Name: version_0_22 $ =~ /\d+/g; sprintf "%d." . ("%02d" x $#a ),@a };
+
+require Exporter;
+@ISA = qw(Exporter);
+
+@EXPORT_OK = qw(FILE HARDLINK SYMLINK 
+		CHARDEV BLOCKDEV DIR
+		FIFO SOCKET INVALID);
+%EXPORT_TAGS = (filetypes => \@EXPORT_OK);
+
+# Check if symbolic links are available
+my $symlinks = eval { readlink $0 or 1; };
+carp "Symbolic links not available"
+    unless $symlinks || !$^W;
+
+# Check if Compress::Zlib is available
+my $compression = eval { 
+    local $SIG{__DIE__};
+    require Compress::Zlib; 
+    sub Compress::Zlib::gzFile::gzseek {
+	my $tmp;
+
+	$_[0]->gzread ($tmp, 4096), $_[1] -= 4096
+	    while ($_[1] > 4096);
+
+	$_[0]->gzread ($tmp, $_[1])
+	  if $_[1];
+    }
+    1;
+};
+carp "Compression not available"
+    unless $compression || !$^W;
+
+# Check for get* (they don't exist on WinNT)
+my $fake_getpwuid;
+$fake_getpwuid = "unknown"
+    unless eval { $_ = getpwuid (0); }; # Pointless assigment to make -w shut up
+
+my $fake_getgrgid;
+$fake_getgrgid = "unknown"
+    unless eval { $_ = getgrgid (0); }; # Pointless assigment to make -w shut up
+
+# Automagically detect gziped files if they start with this
+my $gzip_magic_number = "^(?:\037\213|\037\235)";
+
+my $tar_unpack_header 
+    = 'A100 A8 A8 A8 A12 A12 A8 A1 A100 A6 A2 A32 A32 A8 A8 A155 x12';
+my $tar_pack_header
+    = 'a100 a8 a8 a8 a12 a12 A8 a1 a100 a6 a2 a32 a32 a8 a8 a155 x12',
+my $tar_header_length = 512;
+
+my $time_offset = ($^O eq "MacOS") ? Time::Local::timelocal(0,0,0,1,0,70) : 0;
+
+## Subroutines to return type constants 
+sub FILE() { return 0; }
+sub HARDLINK() { return 1; }
+sub SYMLINK() { return 2; }
+sub CHARDEV() { return 3; }
+sub BLOCKDEV() { return 4; }
+sub DIR() { return 5; }
+sub FIFO() { return 6; }
+sub SOCKET() { return 8; }
+sub UNKNOWN() { return 9; }
+
+###
+### Non-method functions
+###
+
+my $error;
+sub _drat {
+    $error = $! . '';
+    return;
+}
+
+sub error {
+    $error;
+}
+
+sub set_error {
+    shift;
+    $error = "@_";
+}
+
+## filetype -- Determine the type value for a given file
+sub filetype {
+    my $file = shift;
+
+    return SYMLINK
+	if (-l $file);		# Symlink
+
+    return FILE
+	if (-f _);		# Plain file
+
+    return DIR
+	if (-d _);		# Directory
+
+    return FIFO
+	if (-p _);		# Named pipe
+
+    return SOCKET
+	if (-S _);		# Socket
+
+    return BLOCKDEV
+	if (-b _);		# Block special
+
+    return CHARDEV
+	if (-c _);		# Character special
+
+    return UNKNOWN;		# Something else (like what?)
+}
+
+sub _make_special_file_UNIX {
+    # $file is the last component of $entry->{name}
+    my ($entry, $file) = @_;
+
+    if ($entry->{type} == SYMLINK) {
+	symlink $entry->{linkname}, $file or
+	    $^W && carp ("Making symbolic link from ", $entry->{linkname}, 
+			 " to ", $entry->{name}, ", failed.\n");
+    }
+    elsif ($entry->{type} == HARDLINK) {
+	link $entry->{linkname}, $file or
+	    $^W && carp ("Hard linking ", $entry->{linkname}, 
+			 " to ", $entry->{name}, ", failed.\n");
+    }
+    elsif ($entry->{type} == FIFO) {
+	system("mknod","$file","p") or
+	    $^W && carp "Making fifo ", $entry->{name}, ", failed.\n";
+    }
+    elsif ($entry->{type} == BLOCKDEV) {
+	system("mknod","$file","b",$entry->{devmajor},$entry->{devminor}) or
+	    $^W && carp ("Making block device ", $entry->{name},
+			 " (maj=", $entry->{devmajor}, 
+			 ", min=", $entry->{devminor}, "), failed.\n");
+    }
+    elsif ($entry->{type} == CHARDEV) {
+	system("mknod", "$file", "c", $entry->{devmajor}, $entry->{devminor}) or
+	    $^W && carp ("Making block device ", $entry->{name}, 
+			 " (maj=", $entry->{devmajor}, 
+			 " ,min=", $entry->{devminor}, "), failed.\n");
+    }
+}
+
+sub _make_special_file_Win32 {
+    # $file is the last component of $entry->{name}
+    my ($entry, $file) = @_;
+
+    if ($entry->{type} == SYMLINK) {
+	$^W && carp ("Making symbolic link from ", $entry->{linkname}, 
+		     " to ", $entry->{name}, ", failed.\n");
+    }
+    elsif ($entry->{type} == HARDLINK) {
+	link $entry->{linkname}, $file or
+	    $^W && carp ("Making hard link from ", $entry->{linkname}, 
+			 " to ", $entry->{name}, ", failed.\n");
+    }
+    elsif ($entry->{type} == FIFO) {
+	$^W && carp "Making fifo ", $entry->{name}, ", failed.\n";
+    }
+    elsif ($entry->{type} == BLOCKDEV) {
+	$^W && carp ("Making block device ", $entry->{name},
+		     " (maj=", $entry->{devmajor}, 
+		     ", min=", $entry->{devminor}, "), failed.\n");
+    }
+    elsif ($entry->{type} == CHARDEV) {
+	$^W && carp ("Making block device ", $entry->{name},
+		     " (maj=", $entry->{devmajor}, 
+		     " ,min=", $entry->{devminor}, "), failed.\n");
+    }
+}
+
+*_make_special_file = $^O eq "MSWin32" ? 
+    \&_make_special_file_Win32 : \&_make_special_file_UNIX;
+
+sub _munge_file {
+#
+#  Mac path to the Unix like equivalent to be used in tar archives
+#
+    my $inpath = $_[0];
+#
+#  If there are no :'s in the name at all, assume it's a single item in the
+#  current directory.  Return it, changing any / in the name into :
+#
+    if ($inpath !~ m,:,) {
+	$inpath =~ s,/,:,g;
+	return $inpath;
+    }
+#
+#  If we now split on :, there will be just as many nulls in the list as
+#  there should be up requests, except if it begins with a :, where there
+#  will be one extra.
+#
+    my @names = split (/:/, $inpath);
+    shift (@names)
+	if ($names[0] eq "");
+    my @outname = ();
+#
+#  Work from the end.
+#
+    my $i;
+    for ($i = $#names; $i >= 0; --$i) {
+	if ($names[$i] eq "") {
+	    unshift (@outname, "..");
+	} 
+	else {
+	    $names[$i] =~ s,/,:,g;
+	    unshift (@outname, $names[$i]);
+	}
+    }
+    my $netpath = join ("/", @outname);
+    $netpath = $netpath . "/" if ($inpath =~ /:$/);
+    if ($inpath !~ m,^:,) {
+	return "/".$netpath;
+    } 
+    else {
+	return $netpath;
+    }
+}
+
+sub _get_handle {
+    my ($fh, $flags, $mode);
+
+    sysseek ($_[0], 0, 0)
+	or goto &_drat;
+
+    if ($^O eq "MSWin32") {
+	$fh = $_[0];
+    }
+    else {
+	$fh = fcntl ($_[0], F_DUPFD, 0)
+	    or goto &_drat;
+    }
+    if ($compression && (@_ < 2 || $_[1] != 0)) {
+	$mode = $#_ ? (int($_[1]) > 1 ?
+			  "wb".int($_[1]) : "wb") : "rb";
+
+	$fh = Compress::Zlib::gzdopen_ ($fh, $mode, 0)
+	    or &_drat;
+    }
+    else {
+	$flags = fcntl ($_[0], F_GETFL, 0) & (O_RDONLY | O_WRONLY | O_RDWR);
+	$mode = ($flags == O_WRONLY) ? ">&=$fh" : 
+	    ($flags == O_RDONLY) ? "<&=$fh" : "+>&=$fh";
+	$fh = gensym;
+	open ($fh, $mode)
+	  or goto &_drat;
+
+	$fh = bless *{$fh}{IO}, "Archive::Tar::_io";
+	binmode $fh
+	    or goto &_drat;
+    }
+
+    return $fh;
+}
+
+sub _read_tar {
+    my ($file, $seekable, $extract) = @_;
+    my $tarfile = [];
+    my ($head, $offset, $size);
+
+    $file->gzread ($head, $tar_header_length)
+	or goto &_drat;
+
+    if (substr ($head, 0, 2) =~ /$gzip_magic_number/o) {
+	$error =
+	    "Compression not available\n";
+	return undef;
+    }
+
+    $offset = $tar_header_length
+	if $seekable;
+
+ READLOOP:
+    while (length ($head) == $tar_header_length) {
+	my ($name,		# string
+	    $mode,		# octal number
+	    $uid,		# octal number
+	    $gid,		# octal number
+	    $size,		# octal number
+	    $mtime,		# octal number
+	    $chksum,		# octal number
+	    $type,		# character
+	    $linkname,		# string
+	    $magic,		# string
+	    $version,		# two bytes
+	    $uname,		# string
+	    $gname,		# string
+	    $devmajor,		# octal number
+	    $devminor,		# octal number
+	    $prefix) = unpack ($tar_unpack_header, $head);
+	my ($data, $block, $entry);
+
+	$mode = oct $mode;
+	$uid = oct $uid;
+	$gid = oct $gid;
+	$size = oct $size;
+	$mtime = oct $mtime;
+	$chksum = oct $chksum;
+	$devmajor = oct $devmajor;
+	$devminor = oct $devminor;
+	$name = $prefix."/".$name if $prefix;
+	$prefix = "";
+	# some broken tar-s don't set the type for directories
+	# so we ass_u_me a directory if the name ends in slash
+	$type = DIR
+	    if $name =~ m|/$| and $type == FILE;
+
+	last READLOOP if $head eq "\0" x 512; # End of archive
+	# Apparently this should really be two blocks of 512 zeroes,
+	# but GNU tar sometimes gets it wrong. See comment in the
+	# source code (tar.c) to GNU cpio.
+
+	substr ($head, 148, 8) = "        ";
+	if (unpack ("%16C*", $head) != $chksum) {
+	   warn "$name: checksum error.\n";
+	}
+
+	unless ($extract || $type != FILE) {
+	    # Always read in full 512 byte blocks
+	    $block = $size & 0x01ff ? ($size & ~0x01ff) + 512 : $size;
+	    if ($seekable) {
+		while ($block > 4096) {
+		    $file->gzread ($data, 4096)
+			or goto &_drat;
+		    $block -= 4096;
+		}
+		$file->gzread ($data, $block)
+		    or goto &_drat
+			if ($block);
+
+		# Ignore everything we've just read.
+		undef $data;
+	    } else {
+		if ($file->gzread ($data, $block) < $block) {
+		    $error = "Read error on tarfile.";
+		    return undef;
+		}
+
+		# Throw away any trailing garbage
+		substr ($data, $size) = "";
+	    }
+	}
+
+	# Guard against tarfiles with garbage at the end
+	last READLOOP if $name eq ''; 
+
+	$entry = {name => $name,		    
+		  mode => $mode,
+		  uid => $uid,
+		  gid => $gid,
+		  size => $size,
+		  mtime => $mtime,
+		  chksum => $chksum,
+		  type => $type,
+		  linkname => $linkname,
+		  magic => $magic,
+		  version => $version,
+		  uname => $uname,
+		  gname => $gname,
+		  devmajor => $devmajor,
+		  devminor => $devminor,
+		  prefix => $prefix,
+		  offset => $offset,
+		  data => $data};
+
+	if ($extract) {
+	    _extract_file ($entry, $file);
+	    $file->gzread ($head, 512 - ($size & 0x1ff)) 
+		or goto &_drat
+		    if ($size & 0x1ff && $type == FILE);
+	}
+	else {
+	    push @$tarfile, $entry;
+	}
+
+	if ($seekable) {
+	    $offset += $tar_header_length;
+	    $offset += ($size & 0x01ff) ? ($size & ~0x01ff) + 512 : $size
+		if $type == FILE;
+	}
+	$file->gzread ($head, $tar_header_length) 
+	    or goto &_drat;
+    }
+
+    $file->gzclose ()
+	unless $seekable;
+
+    return $tarfile
+	unless $extract;
+}
+
+sub _format_tar_entry {
+    my ($ref) = shift;
+    my ($tmp,$file,$prefix,$pos);
+
+    $file = $ref->{name};
+    if (length ($file) > 99) {
+	$pos = index $file, "/", (length ($file) - 100);
+	next
+	    if $pos == -1;	# Filename longer than 100 chars!
+
+	$prefix = substr $file,0,$pos;
+	$file = substr $file,$pos+1;
+	substr ($prefix, 0, -155) = ""
+	    if length($prefix)>154;
+    }
+    else {
+	$prefix="";
+    }
+
+    $tmp = pack ($tar_pack_header,
+		 $file,
+		 sprintf("%06o ",$ref->{mode}),
+		 sprintf("%06o ",$ref->{uid}),
+		 sprintf("%06o ",$ref->{gid}),
+		 sprintf("%11o ",$ref->{size}),
+		 sprintf("%11o ",$ref->{mtime}),
+		 "",		#checksum field - space padded by pack("A8")
+		 $ref->{type},
+		 $ref->{linkname},
+		 $ref->{magic},
+		 $ref->{version} || '00',
+		 $ref->{uname},
+		 $ref->{gname},
+		 sprintf("%6o ",$ref->{devmajor}),
+		 sprintf("%6o ",$ref->{devminor}),
+		 $prefix);
+    substr($tmp,148,7) = sprintf("%6o\0", unpack("%16C*",$tmp));
+
+    return $tmp;
+}
+
+sub _format_tar_file {
+    my @tarfile = @_;
+    my $file = "";
+
+    foreach (@tarfile) {
+	$file .= _format_tar_entry $_;
+	$file .= $_->{data};
+	$file .= "\0" x (512 - ($_->{size} & 0x1ff))
+	    if ($_->{size} & 0x1ff);
+    }
+    $file .= "\0" x 1024;
+
+    return $file;
+}
+
+sub _write_tar {
+    my $file = shift;
+    my $entry;
+
+    foreach $entry ((ref ($_[0]) eq 'ARRAY') ? @{$_[0]} : @_) {
+	next
+	    unless (ref ($entry) eq 'HASH');
+
+	my $src;
+        if ($^O eq "MacOS") {  #convert back from Unix to Mac path
+            my @parts = split(/\//, $entry->{name});
+
+            $src = $parts[0] ? ":" : "";
+            foreach (@parts) {
+		next if !$_ || $_ eq ".";  
+                s,:,/,g;
+
+		$_ = ":"
+		    if ($_ eq "..");
+
+		$src .= ($src =~ /:$/) ? $_ : ":$_";
+	    }
+        }
+	else {
+            $src = $entry->{name};
+        }
+	sysopen (FH, $src, O_RDONLY)
+	    && binmode (FH)
+		or next
+		    unless $entry->{type} != FILE || $entry->{data};
+
+	$file->gzwrite (_format_tar_entry ($entry))
+	    or goto &_drat;
+
+	if ($entry->{type} == FILE) {
+	    if ($entry->{data}) {
+		$file->gzwrite ($entry->{data})
+		    or goto &_drat;
+	    }
+	    else {
+		my $size = $entry->{size};
+		my $data;
+		while ($size >= 4096) {
+		    sysread (FH, $data, 4096)
+			&& $file->gzwrite ($data)
+			    or goto &_drat;
+		    $size -= 4096;
+		}
+		sysread (FH, $data, $size)
+		    && $file->gzwrite ($data)
+			or goto &_drat
+			    if $size;
+		close FH;
+	    }
+	    $file->gzwrite ("\0" x (512 - ($entry->{size} & 511)))
+		or goto &_drat
+		    if ($entry->{size} & 511);
+	}
+    }
+
+    $file->gzwrite ("\0" x 1024)
+	and !$file->gzclose ()
+	    or goto &_drat;
+}
+
+sub _add_file {
+    my $file = shift;
+    my ($mode,$nlnk,$uid,$gid,$rdev,$size,$mtime,$type,$linkname);
+
+    if (($mode,$nlnk,$uid,$gid,$rdev,$size,$mtime) = (lstat $file)[2..7,9]) {
+	$linkname = "";
+	$type = filetype ($file);
+
+	$linkname = readlink $file
+	    if ($type == SYMLINK) && $symlinks;
+
+	$file = _munge_file ($file)
+	    if ($^O eq "MacOS");
+
+	return +{name => $file,		    
+		 mode => $mode,
+		 uid => $uid,
+		 gid => $gid,
+		 size => $size,
+		 mtime => (($mtime - $time_offset) | 0),
+		 chksum => "      ",
+		 type => $type, 
+		 linkname => $linkname,
+		 magic => "ustar",
+		 version => "00",
+		 # WinNT protection
+		 uname => ($fake_getpwuid || scalar getpwuid($uid)),
+		 gname => ($fake_getgrgid || scalar getgrgid ($gid)),
+		 devmajor => 0, # We don't handle this yet
+		 devminor => 0, # We don't handle this yet
+		 prefix => "",
+		 data => undef,
+		};
+    }
+}
+
+sub _extract_file {
+    my ($entry, $handle) = @_;
+    my ($file, $cwd, @path);
+
+    # For the moment, we assume that all paths in tarfiles
+    # are given according to Unix standards.
+    # Which they *are*, according to the tar format spec!
+    @path = split(/\//,$entry->{name});
+    $path[0] = '/' unless defined $path[0]; # catch absolute paths
+    $file = pop @path;
+    $file =~ s,:,/,g
+	if $^O eq "MacOS";
+    $cwd = cwd
+	if @path;
+    foreach (@path) {
+	if ($^O eq "MacOS") {
+	    s,:,/,g;
+	    $_ = "::" if $_ eq "..";
+	    $_ = ":" if $_ eq ".";
+	}
+	if (-e $_ && ! -d _) {
+	    $^W && carp "$_ exists but is not a directory!\n";
+	    next;
+	}
+	mkdir $_, 0777 unless -d _;
+	chdir $_;
+    }
+
+    if ($entry->{type} == FILE) {	# Ordinary file
+	sysopen (FH, $file, O_WRONLY|O_CREAT|O_TRUNC)
+	    and binmode FH
+		or goto &_drat;
+
+	if ($handle) {
+	    my $size = $entry->{size};
+	    my $data;
+	    while ($size > 4096) {
+		$handle->gzread ($data, 4096)
+		    and syswrite (FH, $data, length $data)
+			or goto &_drat;
+		$size -= 4096;
+	    }
+	    $handle->gzread ($data, $size)
+		and syswrite (FH, $data, length $data)
+		    or goto &_drat
+			if ($size);
+	}
+	else {
+	    syswrite FH, $entry->{data}, $entry->{size}
+		or goto &_drat
+	}
+	close FH
+	    or goto &_drat
+    }
+    elsif ($entry->{type} == DIR) { # Directory
+	goto &_drat
+	    if (-e $file && ! -d $file);
+
+	mkdir $file,0777
+	    unless -d $file;
+    }
+    elsif ($entry->{type} == UNKNOWN) {
+	$error = "unknown file type: $_->{type}";
+	return undef;
+    }
+    else {
+	_make_special_file ($entry, $file);
+    }
+    utime time, $entry->{mtime} + $time_offset, $file;
+
+    # We are root, and chown exists
+    chown $entry->{uid}, $entry->{gid}, $file
+	if ($> == 0 and $^O ne "MacOS" and $^O ne "MSWin32");
+
+    # chmod is done last, in case it makes file readonly
+    # (this accomodates DOSish OSes)
+    chmod $entry->{mode}, $file;
+    chdir $cwd
+	if @path;
+}
+
+###
+### Methods
+###
+
+##
+## Class methods
+##
+
+# Perfom the equivalent of ->new()->add_files(), ->write() without the
+# overhead of maintaining an Archive::Tar object.
+sub create_archive {
+    my ($handle, $file, $compress) = splice (@_, 0, 3);
+
+    if ($compress && !$compression) {
+	$error = "Compression not available.\n";
+	return undef;
+    }
+
+    $handle = gensym;
+    open $handle, ref ($file) ? ">&". fileno ($file) : ">" . $file
+	and binmode ($handle)
+	    or goto &_drat;
+
+    _write_tar (_get_handle ($handle, int ($compress)),
+		map {_add_file ($_)} @_);
+}
+
+# Perfom the equivalent of ->new()->list_files() without the overhead
+# of maintaining an Archive::Tar object.
+sub list_archive {
+    my ($handle, $file, $fields) = @_;
+
+    $handle = gensym;
+    open $handle, ref ($file) ? "<&". fileno ($file) : "<" . $file
+	and binmode ($handle)
+	    or goto &_drat;
+
+    my $data = _read_tar (_get_handle ($handle), 1);
+
+    return map {my %h; @h{@$fields} = @$_{@$fields}; \%h} @$data
+        if (ref $fields eq 'ARRAY'
+	    && (@$fields > 1 || $fields->[0] ne 'name'));
+
+    return map {$_->{name}} @$data;
+}
+
+# Perform the equivalen of ->new()->extract() without the overhead of
+# maintaining an Archive::Tar object.
+sub extract_archive {
+    my ($handle, $file) = @_;
+
+    $handle = gensym;
+    open $handle, ref ($file) ? "<&". fileno ($file) : "<" . $file
+	and binmode ($handle)
+	    or goto &_drat;
+
+    _read_tar (_get_handle ($handle), 0, 1);
+}
+
+# Constructor. Reads tarfile if given an argument that's the name of a
+# readable file.
+sub new {
+    my ($class, $file) = @_;
+
+    my $self = bless {}, $class;
+
+    $self->read ($file)
+      if defined $file;
+
+    return $self;
+}
+
+
+# Read a tarfile. Returns number of component files.
+sub read {
+    my ($self, $file) = @_;
+
+    $self->{_data} = [];
+
+    $self->{_handle} = gensym;
+    open $self->{_handle}, ref ($file) ? "<&". fileno ($file) : "<" . $file
+	and binmode ($self->{_handle})
+	    or goto &_drat;
+
+    $self->{_data} = _read_tar (_get_handle ($self->{_handle}), 
+				  sysseek $self->{_handle}, 0, 1);
+    return scalar @{$self->{_data}};
+}
+
+# Write a tar archive to file
+sub write {
+    my ($self, $file, $compress) = @_;
+
+    return _format_tar_file (@{$self->{_data}})
+	unless (@_ > 1);
+
+    my $handle = gensym;
+    open $handle, ref ($file) ? ">&". fileno ($file) : ">" . $file
+	and binmode ($handle)
+	    or goto &_drat;
+
+    if ($compress && !$compression) {
+	$error = "Compression not available.\n";
+	return undef;
+    }
+
+    _write_tar (_get_handle ($handle, $compress || 0), $self->{_data});
+}
+
+# Add files to the archive. Returns number of successfully added files.
+sub add_files {
+    my $self = shift;
+    my ($counter, $file, $entry);
+
+    foreach $file (@_) {
+	if ($entry = _add_file ($file)) {
+	    push (@{$self->{'_data'}}, $entry);
+	    ++$counter;
+	}
+    }
+
+    return $counter;
+}
+
+# Add data as a file
+sub add_data {
+    my ($self, $file, $data, $opt) = @_;
+    my $ref = {};
+    my ($key);
+
+    if($^O eq "MacOS") {
+	$file = _munge_file($file);
+    }
+    $ref->{'data'} = $data;
+    $ref->{name} = $file;
+    $ref->{mode} = 0666 & (0777 - umask);
+    $ref->{uid} = $>;
+    $ref->{gid} = (split(/ /,$)))[0]; # Yuck
+    $ref->{size} = length $data;
+    $ref->{mtime} = ((time - $time_offset) | 0),
+    $ref->{chksum} = "      ";	# Utterly pointless
+    $ref->{type} = FILE;		# Ordinary file
+    $ref->{linkname} = "";
+    $ref->{magic} = "ustar";
+    $ref->{version} = "00";
+    # WinNT protection
+    $ref->{uname} = $fake_getpwuid || getpwuid ($>);
+    $ref->{gname} = $fake_getgrgid || getgrgid ($ref->{gid});
+    $ref->{devmajor} = 0;
+    $ref->{devminor} = 0;
+    $ref->{prefix} = "";
+
+    if ($opt) {
+	foreach $key (keys %$opt) {
+	    $ref->{$key} = $opt->{$key}
+	}
+    }
+
+    push (@{$self->{'_data'}}, $ref);
+    return 1;
+}
+
+sub rename {
+    my ($self) = shift;
+    my $entry;
+
+    foreach $entry (@{$self->{_data}}) {
+	@{$self->{_data}} = grep {$_->{name} ne $entry} @{$self->{'_data'}};
+    }
+    return $self;
+}
+
+sub remove {
+    my ($self) = shift;
+    my $entry;
+
+    foreach $entry (@_) {
+	@{$self->{_data}} = grep {$_->{name} ne $entry} @{$self->{'_data'}};
+    }
+    return $self;
+}
+
+# Get the content of a file
+sub get_content {
+    my ($self, $file) = @_;
+    my ($entry, $data);
+
+    foreach $entry (@{$self->{_data}}) {
+	next
+	    unless $entry->{name} eq $file;
+
+	return $entry->{data}
+	    unless $entry->{offset};
+
+	my $handle = _get_handle ($self->{_handle});
+	$handle->gzseek ($entry->{offset}, 0)
+	    or goto &_drat;
+
+	$handle->gzread ($data, $entry->{size}) != -1
+	    or goto &_drat;
+
+	return $data;
+    }
+
+    return;
+}
+
+# Replace the content of a file
+sub replace_content {
+    my ($self, $file, $content) = @_;
+    my $entry;
+
+    foreach $entry (@{$self->{_data}}) {
+	next
+	    unless $entry->{name} eq $file;
+
+	$entry->{data} = $content;
+	$entry->{size} = length $content;
+	$entry->{offset} = undef;
+	return 1;
+    }
+}
+
+# Write a single (probably) file from the in-memory archive to disk
+sub extract {
+    my $self = shift;
+    my @files = @_;
+    my ($file, $entry);
+
+    @files = list_files ($self) unless @files;
+    foreach $entry (@{$self->{_data}}) {
+	my $cnt = 0;
+	foreach $file (@files) {
+	    ++$cnt, next
+		unless $entry->{name} eq $file;
+	    my $handle = $entry->{offset} && _get_handle ($self->{_handle});
+	    $handle->gzseek ($entry->{offset}, 0)
+		or goto &_drat
+		    if $handle;
+	    _extract_file ($entry, $handle);
+	    splice (@_, $cnt, 1);
+	    last;
+	}
+	last
+	    unless @_;
+    }
+    $self;
+}
+
+
+# Return a list names or attribute hashes for all files in the
+# in-memory archive.
+sub list_files {
+ my ($self, $fields) = @_;
+
+    return map {my %h; @h{@$fields} = @$_{@$fields}; \%h} @{$self->{'_data'}}
+    if (ref $fields eq 'ARRAY' && (@$fields > 1 || $fields->[0] ne 'name'));
+
+    return map {$_->{name}} @{$self->{'_data'}}
+}
+
+
+### Standard end of module :-)
+1;
+
+# 
+# Sub-package to hide I/O differences between compressed &
+# uncompressed archives.
+#
+# Yes, I could have used the IO::* class hierarchy here, but I'm
+# trying to minimise the necessity for non-core modules on perl5
+# environments < 5.004
+
+package Archive::Tar::_io;
+
+sub gzseek {
+    sysseek $_[0], $_[1], $_[2];
+}
+
+sub gzread {
+    sysread $_[0], $_[1], $_[2];
+}
+
+sub gzwrite {
+    syswrite $_[0], $_[1], length $_[1];
+}
+
+sub gzclose {
+    !close $_[0];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Tar - module for manipulation of tar archives.
+
+=head1 SYNOPSIS
+
+  use Archive::Tar;
+
+  Archive::Tar->create_archive ("my.tar.gz", 9, "/this/file", "/that/file");
+  print join "\n", Archive::Tar->list_archive ("my.tar.gz"), "";
+
+  $tar = Archive::Tar->new();
+  $tar->read("origin.tar.gz",1);
+  $tar->add_files("file/foo.c", "file/bar.c");
+  $tar->add_data("file/baz.c","This is the file contents");
+  $tar->write("files.tar");
+
+=head1 DESCRIPTION
+
+This is a module for the handling of tar archives. 
+
+Archive::Tar provides an object oriented mechanism for handling tar
+files.  It provides class methods for quick and easy files handling
+while also allowing for the creation of tar file objects for custom
+manipulation.  If you have the Compress::Zlib module installed,
+Archive::Tar will also support compressed or gzipped tar files.
+
+=head2 Class Methods
+
+The class methods should be sufficient for most tar file interaction.
+
+=over 4
+
+=item create_archive ($file, $compression, @filelist)
+
+Creates a tar file from the list of files provided.  The first
+argument can either be the name of the tar file to create or a
+reference to an open file handle (e.g. a GLOB reference).
+
+The second argument specifies the level of compression to be used, if
+any.  Compression of tar files requires the installation of the
+Compress::Zlib module.  Specific levels or compression may be
+requested by passing a value between 2 and 9 as the second argument.
+Any other value evaluating as true will result in the default
+compression level being used.
+
+The remaining arguments list the files to be included in the tar file.
+These files must all exist.  Any files which don\'t exist or can\'t be
+read are silently ignored.
+
+If the archive creation fails for any reason, C<create_archive> will
+return undef.  Please use the C<error> method to find the cause of the
+failure.
+
+=item list_archive ($file, ['property', 'property',...])
+
+=item list_archive ($file)
+
+Returns a list of the names of all the files in the archive.  The
+first argument can either be the name of the tar file to create or a
+reference to an open file handle (e.g. a GLOB reference).
+
+If C<list_archive()> is passed an array reference as its second
+argument it returns a list of hash references containing the requested
+properties of each file.  The following list of properties is
+supported: name, size, mtime (last modified date), mode, uid, gid,
+linkname, uname, gname, devmajor, devminor, prefix.
+
+Passing an array reference containing only one element, 'name', is
+special cased to return a list of names rather than a list of hash
+references.
+
+=item extract_archive ($file)
+
+Extracts the contents of the tar file.  The first argument can either
+be the name of the tar file to create or a reference to an open file
+handle (e.g. a GLOB reference).  All relative paths in the tar file will
+be created underneath the current working directory.
+
+If the archive extraction fails for any reason, C<extract_archive>
+will return undef.  Please use the C<error> method to find the cause
+of the failure.
+
+=item new ($file)
+
+=item new ()
+
+Returns a new Tar object. If given any arguments, C<new()> calls the
+C<read()> method automatically, parsing on the arguments provided L<read()>.
+
+If C<new()> is invoked with arguments and the read method fails for
+any reason, C<new()> returns undef.
+
+=back
+
+=head2 Instance Methods
+
+=over 4
+
+=item read ($ref, $compressed)
+
+Read the given tar file into memory. The first argument can either be
+the name of a file or a reference to an already open file handle (e.g. a
+GLOB reference).  The second argument indicates whether the file
+referenced by the first argument is compressed.
+
+The second argument is now optional as Archive::Tar will automatically
+detect compressed archives.
+
+The C<read> will I<replace> any previous content in C<$tar>!
+
+=item add_files(@filenamelist)
+
+Takes a list of filenames and adds them to the in-memory archive.  On
+MacOS, the path to the file is automatically converted to a Unix like
+equivalent for use in the archive, and the file\'s modification time
+is converted from the MacOS epoch to the Unix epoch.  So tar archives
+created on MacOS with B<Archive::Tar> can be read both with I<tar> on
+Unix and applications like I<suntar> or I<Stuffit Expander> on MacOS.
+Be aware that the file\'s type/creator and resource fork will be lost,
+which is usually what you want in cross-platform archives.
+
+=item add_data ($filename, $data, $opthashref)
+
+Takes a filename, a scalar full of data and optionally a reference to
+a hash with specific options. Will add a file to the in-memory
+archive, with name C<$filename> and content C<$data>. Specific
+properties can be set using C<$opthashref>, The following list of
+properties is supported: name, size, mtime (last modified date), mode,
+uid, gid, linkname, uname, gname, devmajor, devminor, prefix.  (On
+MacOS, the file\'s path and modification times are converted to Unix
+equivalents.)
+
+=item remove (@filenamelist)
+
+Removes any entries with names matching any of the given filenames
+from the in-memory archive. String comparisons are done with C<eq>.
+
+=item write ($file, $compressed)
+
+Write the in-memory archive to disk.  The first argument can either be
+the name of a file or a reference to an already open file handle (be a
+GLOB reference).  If the second argument is true, the module will use
+Compress::Zlib to write the file in a compressed format.  If
+Compress:Zlib is not available, the C<write> method will fail.
+Specific levels of compression can be chosen by passing the values 2
+through 9 as the second parameter.
+
+If no arguments are given, C<write> returns the entire formatted
+archive as a string, which could be useful if you\'d like to stuff the
+archive into a socket or a pipe to gzip or something.  This
+functionality may be deprecated later, however, as you can also do
+this using a GLOB reference for the first argument.
+
+=item extract(@filenames)
+
+Write files whose names are equivalent to any of the names in
+C<@filenames> to disk, creating subdirectories as necessary. This
+might not work too well under VMS.  Under MacPerl, the file\'s
+modification time will be converted to the MacOS zero of time, and
+appropriate conversions will be done to the path.  However, the length
+of each element of the path is not inspected to see whether it\'s
+longer than MacOS currently allows (32 characters).
+
+If C<extract> is called without a list of file names, the entire
+contents of the archive are extracted.
+
+=item list_files(['property', 'property',...])
+
+=item list_files()
+
+Returns a list of the names of all the files in the archive.
+
+If C<list_files()> is passed an array reference as its first argument
+it returns a list of hash references containing the requested
+properties of each file.  The following list of properties is
+supported: name, size, mtime (last modified date), mode, uid, gid,
+linkname, uname, gname, devmajor, devminor, prefix.
+
+Passing an array reference containing only one element, 'name', is
+special cased to return a list of names rather than a list of hash
+references.
+
+=item get_content($file)
+
+Return the content of the named file.
+
+=item replace_content($file,$content)
+
+Make the string $content be the content for the file named $file.
+
+=back
+
+=head1 CHANGES
+
+=over 4
+
+=item Version 0.20
+
+Added class methods for creation, extraction and listing of tar files.
+No longer maintain a complete copy of the tar file in memory.  Removed
+the C<data()> method.
+
+=item Version 0.10
+
+Numerous changes. Brought source under CVS.  All changes now recorded
+in ChangeLog file in distribution.
+
+=item Version 0.08
+
+New developer/maintainer.  Calle has carpal-tunnel syndrome and cannot
+type a great deal. Get better as soon as you can, Calle.
+
+Added proper support for MacOS.  Thanks to Paul J. Schinder
+<schinder@leprss.gsfc.nasa.gov>.
+
+=item Version 0.071
+
+Minor release.
+
+Arrange to chmod() at the very end in case it makes the file read only.
+Win32 is actually picky about that.
+
+SunOS 4.x tar makes tarfiles that contain directory entries that
+don\'t have typeflag set properly.  We use the trailing slash to
+recognise directories in such tar files.
+
+=item Version 0.07
+
+Fixed (hopefully) broken portability to MacOS, reported by Paul J.
+Schinder at Goddard Space Flight Center.
+
+Fixed two bugs with symlink handling, reported in excellent detail by
+an admin at teleport.com called Chris.
+
+Primitive tar program (called ptar) included with distribution. Usage
+should be pretty obvious if you\'ve used a normal tar program.
+
+Added methods get_content and replace_content.
+
+Added support for paths longer than 100 characters, according to
+POSIX. This is compatible with just about everything except GNU tar.
+Way to go, GNU tar (use a better tar, or GNU cpio).
+
+NOTE: When adding files to an archive, files with basenames longer
+      than 100 characters will be silently ignored. If the prefix part
+      of a path is longer than 155 characters, only the last 155
+      characters will be stored.
+
+=item Version 0.06
+
+Added list_files() method, as requested by Michael Wiedman.
+
+Fixed a couple of dysfunctions when run under Windows NT. Michael
+Wiedmann reported the bugs.
+
+Changed the documentation to reflect reality a bit better.
+
+Fixed bug in format_tar_entry. Bug reported by Michael Schilli.
+
+=item Version 0.05
+
+Quoted lots of barewords to make C<use strict;> stop complaining under
+perl version 5.003.
+
+Ties to L<Compress::Zlib> put in. Will warn if it isn\'t available.
+
+$tar->write() with no argument now returns the formatted archive.
+
+=item Version 0.04
+
+Made changes to write_tar so that Solaris tar likes the resulting
+archives better.
+
+Protected the calls to readlink() and symlink(). AFAIK this module
+should now run just fine on Windows NT.
+
+Add method to write a single entry to disk (extract)
+
+Added method to add entries entirely from scratch (add_data)
+
+Changed name of add() to add_file()
+
+All calls to croak() removed and replaced with returning undef and
+setting Tar::error.
+
+Better handling of tarfiles with garbage at the end.
+
+=head1 COPYRIGHT
+
+Archive::Tar is Copyright 1997 Calle Dybedahl. All rights reserved.
+                Copyright 1998 Stephen Zander. All rights reserved.
+
+It is currently developed by Stephen Zander <gibreel@pobox.com>
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Archive/Zip.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3351 @@
+#! perl -w
+# $Revision: 1.39 $
+
+# Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+# software; you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+
+=head1 NAME
+
+Archive::Zip - Provide an interface to ZIP archive files.
+
+=head1 SYNOPSIS
+
+ use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
+
+ my $zip = Archive::Zip->new();
+ my $member = $zip->addDirectory( 'dirname/' );
+ $member = $zip->addString( 'This is a test', 'stringMember.txt' );
+ $member->desiredCompressionMethod( COMPRESSION_DEFLATED );
+ $member = $zip->addFile( 'xyz.pl', 'AnotherName.pl' );
+
+ die 'write error' if $zip->writeToFileNamed( 'someZip.zip' ) != AZ_OK;
+
+ $zip = Archive::Zip->new();
+ die 'read error' if $zip->read( 'someZip.zip' ) != AZ_OK;
+
+ $member = $zip->memberNamed( 'stringMember.txt' );
+ $member->desiredCompressionMethod( COMPRESSION_STORED );
+
+ die 'write error' if $zip->writeToFileNamed( 'someOtherZip.zip' ) != AZ_OK;
+
+=head1 DESCRIPTION
+
+The Archive::Zip module allows a Perl program to create,
+manipulate, read, and write Zip archive files.
+
+Zip archives can be created, or you can read from existing zip files.
+Once created, they can be written to files, streams, or strings.
+
+Members can be added, removed, extracted, replaced, rearranged,
+and enumerated.
+They can also be renamed or have their dates, comments,
+or other attributes queried or modified.
+Their data can be compressed or uncompressed as needed.
+Members can be created from members in existing Zip files,
+or from existing directories, files, or strings.
+
+This module uses the L<Compress::Zlib|Compress::Zlib> library
+to read and write the compressed streams inside the files.
+
+=head1 EXPORTS
+
+=over 4
+
+=item :CONSTANTS
+
+Exports the following constants:
+
+FA_MSDOS FA_UNIX GPBF_ENCRYPTED_MASK
+GPBF_DEFLATING_COMPRESSION_MASK GPBF_HAS_DATA_DESCRIPTOR_MASK
+COMPRESSION_STORED COMPRESSION_DEFLATED
+IFA_TEXT_FILE_MASK IFA_TEXT_FILE IFA_BINARY_FILE
+COMPRESSION_LEVEL_NONE
+COMPRESSION_LEVEL_DEFAULT
+COMPRESSION_LEVEL_FASTEST
+COMPRESSION_LEVEL_BEST_COMPRESSION
+
+=item :MISC_CONSTANTS
+
+Exports the following constants (only necessary for extending the module):
+
+FA_AMIGA FA_VAX_VMS FA_VM_CMS FA_ATARI_ST
+FA_OS2_HPFS FA_MACINTOSH FA_Z_SYSTEM FA_CPM FA_WINDOWS_NTFS
+GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK
+GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK
+GPBF_IS_COMPRESSED_PATCHED_DATA_MASK COMPRESSION_SHRUNK
+DEFLATING_COMPRESSION_NORMAL DEFLATING_COMPRESSION_MAXIMUM
+DEFLATING_COMPRESSION_FAST DEFLATING_COMPRESSION_SUPER_FAST
+COMPRESSION_REDUCED_1 COMPRESSION_REDUCED_2 COMPRESSION_REDUCED_3
+COMPRESSION_REDUCED_4 COMPRESSION_IMPLODED COMPRESSION_TOKENIZED
+COMPRESSION_DEFLATED_ENHANCED
+COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED
+
+=item :ERROR_CODES
+
+Explained below. Returned from most methods.
+
+AZ_OK AZ_STREAM_END AZ_ERROR AZ_FORMAT_ERROR AZ_IO_ERROR
+
+=back
+
+=head1 OBJECT MODEL
+
+=head2 Inheritance
+
+ Exporter
+    Archive::Zip                            Common base class, has defs.
+        Archive::Zip::Archive               A Zip archive.
+        Archive::Zip::Member                Abstract superclass for all members.
+            Archive::Zip::StringMember      Member made from a string
+            Archive::Zip::FileMember        Member made from an external file
+                Archive::Zip::ZipFileMember Member that lives in a zip file
+                Archive::Zip::NewFileMember Member whose data is in a file
+            Archive::Zip::DirectoryMember   Member that is a directory
+
+=cut
+
+# ----------------------------------------------------------------------
+# class Archive::Zip
+# Note that the package Archive::Zip exists only for exporting and
+# sharing constants. Everything else is in another package
+# in this file.
+# Creation of a new Archive::Zip object actually creates a new object
+# of class Archive::Zip::Archive.
+# ----------------------------------------------------------------------
+
+package Archive::Zip;
+require 5.003_96;
+use strict;
+
+use Carp ();
+use IO::File ();
+use IO::Seekable ();
+use Compress::Zlib ();
+use POSIX qw(_exit);
+
+use vars qw( @ISA @EXPORT_OK %EXPORT_TAGS $VERSION $ChunkSize $ErrorHandler );
+
+if ($Compress::Zlib::VERSION < 1.06)
+{
+    if ($] < 5.006001)
+    {
+       print STDERR "Your current perl libraries are too old; please upgrade to Perl 5.6.1\n";
+    }
+    else
+    {
+       print STDERR "There is a problem with your perl run time environment.\n An old version of Zlib is in use,\n please check your perl installation (5.6.1 or later) and your perl libraries\n"; 
+    }
+    STDERR->flush;
+    POSIX:_exit(1);
+}
+
+# This is the size we'll try to read, write, and (de)compress.
+# You could set it to something different if you had lots of memory
+# and needed more speed.
+$ChunkSize = 32768;
+
+$ErrorHandler = \&Carp::carp;
+
+# BEGIN block is necessary here so that other modules can use the constants.
+BEGIN
+{
+	require Exporter;
+
+	$VERSION = "0.11";
+	@ISA = qw( Exporter );
+
+	my @ConstantNames = qw( FA_MSDOS FA_UNIX GPBF_ENCRYPTED_MASK
+	GPBF_DEFLATING_COMPRESSION_MASK GPBF_HAS_DATA_DESCRIPTOR_MASK
+	COMPRESSION_STORED COMPRESSION_DEFLATED COMPRESSION_LEVEL_NONE
+	COMPRESSION_LEVEL_DEFAULT COMPRESSION_LEVEL_FASTEST
+	COMPRESSION_LEVEL_BEST_COMPRESSION IFA_TEXT_FILE_MASK IFA_TEXT_FILE
+	IFA_BINARY_FILE );
+
+	my @MiscConstantNames = qw( FA_AMIGA FA_VAX_VMS FA_VM_CMS FA_ATARI_ST
+	FA_OS2_HPFS FA_MACINTOSH FA_Z_SYSTEM FA_CPM FA_WINDOWS_NTFS
+	GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK
+	GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK
+	GPBF_IS_COMPRESSED_PATCHED_DATA_MASK COMPRESSION_SHRUNK
+	DEFLATING_COMPRESSION_NORMAL DEFLATING_COMPRESSION_MAXIMUM
+	DEFLATING_COMPRESSION_FAST DEFLATING_COMPRESSION_SUPER_FAST
+	COMPRESSION_REDUCED_1 COMPRESSION_REDUCED_2 COMPRESSION_REDUCED_3
+	COMPRESSION_REDUCED_4 COMPRESSION_IMPLODED COMPRESSION_TOKENIZED
+	COMPRESSION_DEFLATED_ENHANCED
+	COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED );
+
+	my @ErrorCodeNames = qw( AZ_OK AZ_STREAM_END AZ_ERROR AZ_FORMAT_ERROR
+	AZ_IO_ERROR );
+
+	my @PKZipConstantNames = qw( SIGNATURE_FORMAT SIGNATURE_LENGTH
+	LOCAL_FILE_HEADER_SIGNATURE LOCAL_FILE_HEADER_FORMAT
+	LOCAL_FILE_HEADER_LENGTH DATA_DESCRIPTOR_FORMAT DATA_DESCRIPTOR_LENGTH
+	CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE
+	CENTRAL_DIRECTORY_FILE_HEADER_FORMAT CENTRAL_DIRECTORY_FILE_HEADER_LENGTH
+	END_OF_CENTRAL_DIRECTORY_SIGNATURE
+	END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING END_OF_CENTRAL_DIRECTORY_FORMAT
+	END_OF_CENTRAL_DIRECTORY_LENGTH );
+
+	my @UtilityMethodNames = qw( _error _ioError _formatError
+		_subclassResponsibility _binmode _isSeekable _newFileHandle);
+
+	@EXPORT_OK = ( 'computeCRC32' );
+	%EXPORT_TAGS = ( 'CONSTANTS' => \@ConstantNames,
+			'MISC_CONSTANTS' => \@MiscConstantNames,
+			'ERROR_CODES' => \@ErrorCodeNames,
+			# The following two sets are for internal use only
+			'PKZIP_CONSTANTS' => \@PKZipConstantNames,
+			'UTILITY_METHODS' => \@UtilityMethodNames );
+
+	# Add all the constant names and error code names to @EXPORT_OK
+	Exporter::export_ok_tags( 'CONSTANTS', 'ERROR_CODES',
+		'PKZIP_CONSTANTS', 'UTILITY_METHODS', 'MISC_CONSTANTS' );
+}
+
+# ------------------------- begin exportable error codes -------------------
+
+=head1 ERROR CODES
+
+Many of the methods in Archive::Zip return error codes.
+These are implemented as inline subroutines, using the C<use constant> pragma.
+They can be imported into your namespace using the C<:CONSTANT>
+tag:
+
+    use Archive::Zip qw( :CONSTANTS );
+    ...
+    die "whoops!" if $zip->read( 'myfile.zip' ) != AZ_OK;
+
+=over 4
+
+=item AZ_OK (0)
+
+Everything is fine.
+
+=item AZ_STREAM_END (1)
+
+The read stream (or central directory) ended normally.
+
+=item AZ_ERROR (2)
+
+There was some generic kind of error.
+
+=item AZ_FORMAT_ERROR (3)
+
+There is a format error in a ZIP file being read.
+
+=item AZ_IO_ERROR (4)
+
+There was an IO error.
+
+=back
+
+=cut
+
+use constant AZ_OK			=> 0;
+use constant AZ_STREAM_END	=> 1;
+use constant AZ_ERROR		=> 2;
+use constant AZ_FORMAT_ERROR => 3;
+use constant AZ_IO_ERROR	=> 4;
+
+# ------------------------- end exportable error codes ---------------------
+# ------------------------- begin exportable constants ---------------------
+
+# File types
+# Values of Archive::Zip::Member->fileAttributeFormat()
+
+use constant FA_MSDOS		=> 0;
+use constant FA_UNIX		=> 3;
+
+# general-purpose bit flag masks
+# Found in Archive::Zip::Member->bitFlag()
+
+use constant GPBF_ENCRYPTED_MASK						=> 1 << 0;
+use constant GPBF_DEFLATING_COMPRESSION_MASK			=> 3 << 1;
+use constant GPBF_HAS_DATA_DESCRIPTOR_MASK				=> 1 << 3;
+
+# deflating compression types, if compressionMethod == COMPRESSION_DEFLATED
+# ( Archive::Zip::Member->bitFlag() & GPBF_DEFLATING_COMPRESSION_MASK )
+
+use constant DEFLATING_COMPRESSION_NORMAL		=> 0 << 1;
+use constant DEFLATING_COMPRESSION_MAXIMUM		=> 1 << 1;
+use constant DEFLATING_COMPRESSION_FAST			=> 2 << 1;
+use constant DEFLATING_COMPRESSION_SUPER_FAST	=> 3 << 1;
+
+# compression method
+
+=head1 COMPRESSION
+
+Archive::Zip allows each member of a ZIP file to be compressed (using
+the Deflate algorithm) or uncompressed. Other compression algorithms
+that some versions of ZIP have been able to produce are not supported.
+
+Each member has two compression methods: the one it's stored as (this
+is always COMPRESSION_STORED for string and external file members),
+and the one you desire for the member in the zip file.
+These can be different, of course, so you can make a zip member that
+is not compressed out of one that is, and vice versa.
+You can inquire about the current compression and set
+the desired compression method:
+
+    my $member = $zip->memberNamed( 'xyz.txt' );
+    $member->compressionMethod();    # return current compression
+    # set to read uncompressed
+    $member->desiredCompressionMethod( COMPRESSION_STORED );
+    # set to read compressed
+    $member->desiredCompressionMethod( COMPRESSION_DEFLATED );
+
+There are two different compression methods:
+
+=over 4
+
+=item COMPRESSION_STORED
+
+file is stored (no compression)
+
+=item COMPRESSION_DEFLATED
+
+file is Deflated
+
+=back
+
+=head2 Compression Levels
+
+If a member's desiredCompressionMethod is COMPRESSION_DEFLATED,
+you can choose different compression levels. This choice may
+affect the speed of compression and decompression, as well as
+the size of the compressed member data.
+
+    $member->desiredCompressionLevel( 9 );
+
+The levels given can be:
+
+=over 4
+
+=item 0 or COMPRESSION_LEVEL_NONE
+
+This is the same as saying
+
+    $member->desiredCompressionMethod( COMPRESSION_STORED );
+
+=item 1 .. 9
+
+1 gives the best speed and worst compression, and 9 gives the best
+compression and worst speed.
+
+=item COMPRESSION_LEVEL_FASTEST
+
+This is a synonym for level 1.
+
+=item COMPRESSION_LEVEL_BEST_COMPRESSION
+
+This is a synonym for level 9.
+
+=item COMPRESSION_LEVEL_DEFAULT
+
+This gives a good compromise between speed and compression, and is
+currently equivalent to 6 (this is in the zlib code).
+
+This is the level that will be used if not specified.
+
+=back
+
+=cut
+
+# these two are the only ones supported in this module
+use constant COMPRESSION_STORED => 0;	# file is stored (no compression)
+use constant COMPRESSION_DEFLATED => 8;	# file is Deflated
+
+use constant COMPRESSION_LEVEL_NONE => 0;
+use constant COMPRESSION_LEVEL_DEFAULT => -1;
+use constant COMPRESSION_LEVEL_FASTEST => 1;
+use constant COMPRESSION_LEVEL_BEST_COMPRESSION => 9;
+
+# internal file attribute bits
+# Found in Archive::Zip::Member::internalFileAttributes()
+
+use constant IFA_TEXT_FILE_MASK	=> 1;
+use constant IFA_TEXT_FILE		=> 1;	# file is apparently text
+use constant IFA_BINARY_FILE	=> 0;
+
+# PKZIP file format miscellaneous constants (for internal use only)
+use constant SIGNATURE_FORMAT => "V";
+use constant SIGNATURE_LENGTH => 4;
+
+use constant LOCAL_FILE_HEADER_SIGNATURE	=> 0x04034b50;
+use constant LOCAL_FILE_HEADER_FORMAT		=> "v3 V4 v2";
+use constant LOCAL_FILE_HEADER_LENGTH		=> 26;
+
+use constant DATA_DESCRIPTOR_FORMAT	=> "V3";
+use constant DATA_DESCRIPTOR_LENGTH	=> 12;
+
+use constant CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE => 0x02014b50;
+use constant CENTRAL_DIRECTORY_FILE_HEADER_FORMAT => "C2 v3 V4 v5 V2";
+use constant CENTRAL_DIRECTORY_FILE_HEADER_LENGTH => 42;
+
+use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE => 0x06054b50;
+use constant END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING => pack( "V",
+	END_OF_CENTRAL_DIRECTORY_SIGNATURE );
+use constant END_OF_CENTRAL_DIRECTORY_FORMAT => "v4 V2 v";
+use constant END_OF_CENTRAL_DIRECTORY_LENGTH => 18;
+
+use constant FA_AMIGA		=> 1;
+use constant FA_VAX_VMS		=> 2;
+use constant FA_VM_CMS		=> 4;
+use constant FA_ATARI_ST	=> 5;
+use constant FA_OS2_HPFS	=> 6;
+use constant FA_MACINTOSH	=> 7;
+use constant FA_Z_SYSTEM	=> 8;
+use constant FA_CPM			=> 9;
+use constant FA_WINDOWS_NTFS => 10;
+
+use constant GPBF_IMPLODING_8K_SLIDING_DICTIONARY_MASK	=> 1 << 1;
+use constant GPBF_IMPLODING_3_SHANNON_FANO_TREES_MASK	=> 1 << 2;
+use constant GPBF_IS_COMPRESSED_PATCHED_DATA_MASK		=> 1 << 5;
+
+# the rest of these are not supported in this module
+use constant COMPRESSION_SHRUNK => 1;	# file is Shrunk
+use constant COMPRESSION_REDUCED_1 => 2;# file is Reduced CF=1
+use constant COMPRESSION_REDUCED_2 => 3;# file is Reduced CF=2
+use constant COMPRESSION_REDUCED_3 => 4;# file is Reduced CF=3
+use constant COMPRESSION_REDUCED_4 => 5;# file is Reduced CF=4
+use constant COMPRESSION_IMPLODED => 6;	# file is Imploded
+use constant COMPRESSION_TOKENIZED => 7;# reserved for Tokenizing compr.
+use constant COMPRESSION_DEFLATED_ENHANCED => 9; # reserved for enh. Deflating
+use constant COMPRESSION_PKWARE_DATA_COMPRESSION_LIBRARY_IMPLODED => 10;
+
+# ------------------------- end of exportable constants ---------------------
+
+=head1  Archive::Zip methods
+
+The Archive::Zip class (and its invisible subclass Archive::Zip::Archive)
+implement generic zip file functionality.
+
+Creating a new Archive::Zip object actually makes an Archive::Zip::Archive
+object, but you don't have to worry about this unless you're subclassing.
+
+=cut
+
+=head2 Constructor
+
+=over 4
+
+=cut
+
+use constant ZIPARCHIVECLASS 	=> 'Archive::Zip::Archive';
+use constant ZIPMEMBERCLASS		=> 'Archive::Zip::Member';
+
+#--------------------------------
+
+=item new( [$fileName] )
+
+Make a new, empty zip archive.
+
+    my $zip = Archive::Zip->new();
+
+If an additional argument is passed, new() will call read() to read the
+contents of an archive:
+
+    my $zip = Archive::Zip->new( 'xyz.zip' );
+
+If a filename argument is passed and the read fails for any reason, new
+will return undef. For this reason, it may be better to call read
+separately.
+
+=cut
+
+sub new	# Archive::Zip
+{
+	my $class = shift;
+	return $class->ZIPARCHIVECLASS->new( @_ );
+}
+
+=back
+
+=head2  Utility Methods
+
+These Archive::Zip methods may be called as functions or as object
+methods. Do not call them as class methods:
+
+    $zip = Archive::Zip->new();
+    $crc = Archive::Zip::computeCRC32( 'ghijkl' );    # OK
+    $crc = $zip->computeCRC32( 'ghijkl' );            # also OK
+
+    $crc = Archive::Zip->computeCRC32( 'ghijkl' );    # NOT OK
+
+=over 4
+
+=cut
+
+#--------------------------------
+
+=item Archive::Zip::computeCRC32( $string [, $crc] )
+
+This is a utility function that uses the Compress::Zlib CRC
+routine to compute a CRC-32.
+
+You can get the CRC of a string:
+
+    $crc = Archive::Zip::computeCRC32( $string );
+
+Or you can compute the running CRC:
+
+    $crc = 0;
+    $crc = Archive::Zip::computeCRC32( 'abcdef', $crc );
+    $crc = Archive::Zip::computeCRC32( 'ghijkl', $crc );
+
+=cut
+
+sub computeCRC32	# Archive::Zip
+{
+	my $data = shift;
+	$data = shift if ref( $data );	# allow calling as an obj method
+	my $crc = shift;
+	return Compress::Zlib::crc32( $data, $crc );
+}
+
+#--------------------------------
+
+=item Archive::Zip::setChunkSize( $number )
+
+Change chunk size used for reading and writing.
+Currently, this defaults to 32K.
+This is not exportable, so you must call it like:
+
+    Archive::Zip::setChunkSize( 4096 );
+
+or as a method on a zip (though this is a global setting).
+Returns old chunk size.
+
+=cut
+
+sub setChunkSize	# Archive::Zip
+{
+	my $chunkSize = shift;
+	$chunkSize = shift if ref( $chunkSize );	# object method on zip?
+	my $oldChunkSize = $Archive::Zip::ChunkSize;
+	$Archive::Zip::ChunkSize = $chunkSize;
+	return $oldChunkSize;
+}
+
+#--------------------------------
+
+=item Archive::Zip::setErrorHandler( \&subroutine )
+
+Change the subroutine called with error strings.
+This defaults to \&Carp::carp, but you may want to change
+it to get the error strings.
+
+This is not exportable, so you must call it like:
+
+    Archive::Zip::setErrorHandler( \&myErrorHandler );
+
+If no error handler is passed, resets handler to default.
+
+Returns old error handler.
+
+Note that if you call Carp::carp or a similar routine
+or if you're chaining to the default error handler
+from your error handler, you may want to increment the number
+of caller levels that are skipped (do not just set it to a number):
+
+    $Carp::CarpLevel++;
+
+=cut
+
+sub setErrorHandler (&)	# Archive::Zip
+{
+	my $errorHandler = shift;
+	$errorHandler = \&Carp::carp if ! defined( $errorHandler );
+	my $oldErrorHandler = $Archive::Zip::ErrorHandler;
+	$Archive::Zip::ErrorHandler = $errorHandler;
+	return $oldErrorHandler;
+}
+
+sub _printError	# Archive::Zip
+{
+	my $string = join( ' ', @_, "\n" );
+	my $oldCarpLevel = $Carp::CarpLevel;
+	$Carp::CarpLevel += 2;
+	&{ $ErrorHandler }( $string );
+	$Carp::CarpLevel = $oldCarpLevel;
+}
+
+# This is called on format errors.
+sub _formatError	# Archive::Zip
+{
+	shift if ref( $_[0] );
+	_printError( 'format error:', @_ );
+	return AZ_FORMAT_ERROR;
+}
+
+# This is called on IO errors.
+sub _ioError	# Archive::Zip
+{
+	shift if ref( $_[0] );
+	_printError( 'IO error:', @_, ':', $! );
+	return AZ_IO_ERROR;
+}
+
+# This is called on generic errors.
+sub _error	# Archive::Zip
+{
+	shift if ref( $_[0] );
+	_printError( 'error:', @_ );
+	return AZ_ERROR;
+}
+
+# Called when a subclass should have implemented
+# something but didn't
+sub _subclassResponsibility 	# Archive::Zip
+{
+	Carp::croak( "subclass Responsibility\n" );
+}
+
+# Try to set the given file handle or object into binary mode.
+sub _binmode	# Archive::Zip
+{
+	my $fh = shift;
+	return $fh->can( 'binmode' )
+		?	$fh->binmode()
+		:	binmode( $fh );
+}
+
+# Attempt to guess whether file handle is seekable.
+sub _isSeekable	# Archive::Zip
+{
+	my $fh = shift;
+	my ($p0, $p1);
+	my $seekable = 
+		( $p0 = $fh->tell() ) >= 0
+		&& $fh->seek( 1, IO::Seekable::SEEK_CUR )
+		&& ( $p1 = $fh->tell() ) >= 0
+		&& $p1 == $p0 + 1
+		&& $fh->seek( -1, IO::Seekable::SEEK_CUR )
+		&& $fh->tell() == $p0;
+	return $seekable;
+}
+
+# Return an opened IO::Handle
+# my ( $status, fh ) = _newFileHandle( 'fileName', 'w' );
+# Can take a filename, file handle, or ref to GLOB
+# Or, if given something that is a ref but not an IO::Handle,
+# passes back the same thing.
+sub _newFileHandle	# Archive::Zip
+{
+	my $fd = shift;
+	my $status = 1;
+	my $handle = IO::File->new();
+
+	if ( ref( $fd ) )
+	{
+		if ( $fd->isa( 'IO::Handle' ) or $fd->isa( 'GLOB' ) )
+		{
+			$status = $handle->fdopen( $fd, @_ );
+		}
+		else
+		{
+			$handle = $fd;
+		}
+	}
+	else
+	{
+		$status = $handle->open( $fd, @_ );
+	}
+
+	return ( $status, $handle );
+}
+
+=back
+
+=cut
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::Archive (concrete)
+# Generic ZIP archive.
+# ----------------------------------------------------------------------
+package Archive::Zip::Archive;
+use File::Path;
+use File::Basename;
+
+use vars qw( @ISA );
+@ISA = qw( Archive::Zip );
+
+BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS
+	:UTILITY_METHODS ) }
+
+#--------------------------------
+# Note that this returns undef on read errors, else new zip object.
+
+sub new	# Archive::Zip::Archive
+{
+	my $class = shift;
+	my $self = bless( {
+		'diskNumber' => 0,
+		'diskNumberWithStartOfCentralDirectory' => 0,
+		'numberOfCentralDirectoriesOnThisDisk' => 0, # shld be # of members
+		'numberOfCentralDirectories' => 0,	# shld be # of members
+		'centralDirectorySize' => 0,	# must re-compute on write
+		'centralDirectoryOffsetWRTStartingDiskNumber' => 0,	# must re-compute
+		'zipfileComment' => ''
+		}, $class );
+	$self->{'members'} = [];
+	if ( @_ )
+	{
+		my $status = $self->read( @_ );
+		return $status == AZ_OK ? $self : undef;
+	}
+	return $self;
+}
+
+=head2 Accessors
+
+=over 4
+
+=cut
+
+#--------------------------------
+
+=item members()
+
+Return a copy of my members array
+
+    my @members = $zip->members();
+
+=cut
+
+sub members	# Archive::Zip::Archive
+{ @{ shift->{'members'} } }
+
+#--------------------------------
+
+=item numberOfMembers()
+
+Return the number of members I have
+
+=cut
+
+sub numberOfMembers	# Archive::Zip::Archive
+{ scalar( shift->members() ) }
+
+#--------------------------------
+
+=item memberNames()
+
+Return a list of the (internal) file names of my members
+
+=cut
+
+sub memberNames	# Archive::Zip::Archive
+{
+	my $self = shift;
+	return map { $_->fileName() } $self->members();
+}
+
+#--------------------------------
+
+=item memberNamed( $string )
+
+Return ref to member whose filename equals given filename or undef
+
+=cut
+
+sub memberNamed	# Archive::Zip::Archive
+{
+	my ( $self, $fileName ) = @_;
+	my ( $retval ) = grep { $_->fileName() eq $fileName } $self->members();
+	return $retval;
+}
+
+#--------------------------------
+
+=item membersMatching( $regex )
+
+Return array of members whose filenames match given regular
+expression in list context.
+Returns number of matching members in scalar context.
+
+    my @textFileMembers = $zip->membersMatching( '.*\.txt' );
+    # or
+    my $numberOfTextFiles = $zip->membersMatching( '.*\.txt' );
+
+=cut
+
+sub membersMatching	# Archive::Zip::Archive
+{
+	my ( $self, $pattern ) = @_;
+	return grep { $_->fileName() =~ /$pattern/ } $self->members();
+}
+
+#--------------------------------
+
+=item diskNumber()
+
+Return the disk that I start on.
+Not used for writing zips, but might be interesting if you read a zip in.
+This had better be 0, as Archive::Zip does not handle multi-volume archives.
+
+=cut
+
+sub diskNumber	# Archive::Zip::Archive
+{ shift->{'diskNumber'} }
+
+#--------------------------------
+
+=item diskNumberWithStartOfCentralDirectory()
+
+Return the disk number that holds the beginning of the central directory.
+Not used for writing zips, but might be interesting if you read a zip in.
+This had better be 0, as Archive::Zip does not handle multi-volume archives.
+
+=cut
+
+sub diskNumberWithStartOfCentralDirectory	# Archive::Zip::Archive
+{ shift->{'diskNumberWithStartOfCentralDirectory'} }
+
+#--------------------------------
+
+=item numberOfCentralDirectoriesOnThisDisk()
+
+Return the number of CD structures on this disk.
+Not used for writing zips, but might be interesting if you read a zip in.
+
+=cut
+
+sub numberOfCentralDirectoriesOnThisDisk	# Archive::Zip::Archive
+{ shift->{'numberOfCentralDirectoriesOnThisDisk'} }
+
+#--------------------------------
+
+=item numberOfCentralDirectories()
+
+Return the number of CD structures in the whole zip.
+Not used for writing zips, but might be interesting if you read a zip in.
+
+=cut
+
+sub numberOfCentralDirectories	# Archive::Zip::Archive
+{ shift->{'numberOfCentralDirectories'} }
+
+#--------------------------------
+
+=item centralDirectorySize()
+
+Returns central directory size, as read from an external zip file.
+Not used for writing zips, but might be interesting if you read a zip in.
+
+=cut
+
+sub centralDirectorySize	# Archive::Zip::Archive
+{ shift->{'centralDirectorySize'} }
+
+#--------------------------------
+
+=item centralDirectoryOffsetWRTStartingDiskNumber()
+
+Returns the offset into the zip file where the CD begins.
+Not used for writing zips, but might be interesting if you read a zip in.
+
+=cut
+
+sub centralDirectoryOffsetWRTStartingDiskNumber	# Archive::Zip::Archive
+{ shift->{'centralDirectoryOffsetWRTStartingDiskNumber'} }
+
+#--------------------------------
+
+=item zipfileComment( [$string] )
+
+Get or set the zipfile comment.
+Returns the old comment.
+
+    print $zip->zipfileComment();
+    $zip->zipfileComment( 'New Comment' );
+
+=cut
+
+sub zipfileComment	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $comment = $self->{'zipfileComment'};
+	if ( @_ )
+	{
+		$self->{'zipfileComment'} = shift;
+	}
+	return $comment;
+}
+
+=back
+
+=head2 Member Operations
+
+Various operations on a zip file modify members.
+When a member is passed as an argument, you can either use a reference
+to the member itself, or the name of a member. Of course, using the
+name requires that names be unique within a zip (this is not enforced).
+
+=over 4
+
+=cut
+
+#--------------------------------
+
+=item removeMember( $memberOrName )
+
+Remove and return the given member, or match its name and remove it.
+Returns undef if member name doesn't exist in this Zip.
+No-op if member does not belong to this zip.
+
+=cut
+
+sub removeMember	# Archive::Zip::Archive
+{
+	my ( $self, $member ) = @_;
+	$member = $self->memberNamed( $member ) if ! ref( $member );
+	return undef if ! $member;
+	my @newMembers = grep { $_ != $member } $self->members();
+	$self->{'members'} = \@newMembers;
+	return $member;
+}
+
+#--------------------------------
+
+=item replaceMember( $memberOrName, $newMember )
+
+Remove and return the given member, or match its name and remove it.
+Replace with new member.
+Returns undef if member name doesn't exist in this Zip.
+
+    my $member1 = $zip->removeMember( 'xyz' );
+    my $member2 = $zip->replaceMember( 'abc', $member1 );
+    # now, $member2 (named 'abc') is not in $zip,
+    # and $member1 (named 'xyz') is, having taken $member2's place.
+
+=cut
+
+sub replaceMember	# Archive::Zip::Archive
+{
+	my ( $self, $oldMember, $newMember ) = @_;
+	$oldMember = $self->memberNamed( $oldMember ) if ! ref( $oldMember );
+	return undef if ! $oldMember;
+	my @newMembers
+		= map { ( $_ == $oldMember ) ? $newMember : $_ } $self->members();
+	$self->{'members'} = \@newMembers;
+	return $oldMember;
+}
+
+#--------------------------------
+
+=item extractMember( $memberOrName [, $extractedName ] )
+
+Extract the given member, or match its name and extract it.
+Returns undef if member doesn't exist in this Zip.
+If optional second arg is given, use it as the name of the
+extracted member. Otherwise, the internal filename of the member is used
+as the name of the extracted file or directory.
+
+All necessary directories will be created.
+
+Returns C<AZ_OK> on success.
+
+=cut
+
+sub extractMember	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $member = shift;
+	$member = $self->memberNamed( $member ) if ! ref( $member );
+	return _error( 'member not found' ) if !$member;
+	my $name = shift;
+	$name = $member->fileName() if not $name;
+	my $dirName = dirname( $name );
+	mkpath( $dirName ) if ( ! -d $dirName );
+	return _ioError( "can't create dir $dirName" ) if ( ! -d $dirName );
+	return $member->extractToFileNamed( $name, @_ );
+}
+
+#--------------------------------
+
+=item extractMemberWithoutPaths( $memberOrName [, $extractedName ] )
+
+Extract the given member, or match its name and extract it.
+Does not use path information (extracts into the current directory).
+Returns undef if member doesn't exist in this Zip.
+If optional second arg is given, use it as the name of the
+extracted member (its paths will be deleted too).
+Otherwise, the internal filename of the member (minus paths) is used
+as the name of the extracted file or directory.
+
+Returns C<AZ_OK> on success.
+
+=cut
+
+sub extractMemberWithoutPaths	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $member = shift;
+	$member = $self->memberNamed( $member ) if ! ref( $member );
+	return _error( 'member not found' ) if !$member;
+	my $name = shift;
+	$name = $member->fileName() if not $name;
+	$name = basename( $name );
+	return $member->extractToFileNamed( $name, @_ );
+}
+
+#--------------------------------
+
+=item addMember( $member )
+
+Append a member (possibly from another zip file) to the zip file.
+Returns the new member.
+Generally, you will use addFile(), addDirectory(), addString(), or read()
+to add members.
+
+    # Move member named 'abc' to end of zip:
+    my $member = $zip->removeMember( 'abc' );
+    $zip->addMember( $member );
+
+=cut
+
+sub addMember	# Archive::Zip::Archive
+{
+	my ( $self, $newMember ) = @_;
+	push( @{ $self->{'members'} }, $newMember ) if $newMember;
+	return $newMember;
+}
+
+#--------------------------------
+
+=item addFile( $fileName [, $newName ] )
+
+Append a member whose data comes from an external file,
+returning the member or undef.
+The member will have its file name set to the name of the external
+file, and its desiredCompressionMethod set to COMPRESSION_DEFLATED.
+The file attributes and last modification time will be set from the file.
+
+If the name given does not represent a readable plain file or symbolic link,
+undef will be returned.
+
+The text mode bit will be set if the contents appears to be text (as returned
+by the C<-T> perl operator).
+
+The optional second argument sets the internal file name to
+something different than the given $fileName.
+
+=cut
+
+sub addFile	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fileName = shift;
+	my $newName = shift;
+	my $newMember = $self->ZIPMEMBERCLASS->newFromFile( $fileName );
+	if (defined($newMember))
+	{
+		$self->addMember( $newMember );
+		$newMember->fileName( $newName ) if defined( $newName );
+	}
+	return $newMember;
+}
+
+#--------------------------------
+
+=item addString( $stringOrStringRef [, $name] )
+
+Append a member created from the given string or string reference.
+The name is given by the optional second argument.
+Returns the new member.
+
+The last modification time will be set to now,
+and the file attributes will be set to permissive defaults.
+
+    my $member = $zip->addString( 'This is a test', 'test.txt' );
+
+=cut
+
+sub addString	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $newMember = $self->ZIPMEMBERCLASS->newFromString( @_ );
+	return $self->addMember( $newMember );
+}
+
+#--------------------------------
+
+=item addDirectory( $directoryName [, $fileName ] )
+
+Append a member created from the given directory name.
+The directory name does not have to name an existing directory.
+If the named directory exists, the file modification time and permissions
+are set from the existing directory, otherwise they are set to now and
+permissive default permissions.
+The optional second argument sets the name of the archive member
+(which defaults to $directoryName)
+
+Returns the new member.
+
+=cut
+
+sub addDirectory	# Archive::Zip::Archive
+{
+	my ( $self, $name, $newName ) = @_;
+	my $newMember = $self->ZIPMEMBERCLASS->newDirectoryNamed( $name );
+	$self->addMember( $newMember );
+	$newMember->fileName( $newName ) if defined( $newName );
+	return $newMember;
+}
+
+#--------------------------------
+
+=item contents( $memberOrMemberName [, $newContents ] )
+
+Returns the uncompressed data for a particular member, or undef.
+
+    print "xyz.txt contains " . $zip->contents( 'xyz.txt' );
+
+Also can change the contents of a member:
+
+    $zip->contents( 'xyz.txt', 'This is the new contents' );
+
+=cut
+
+sub contents	# Archive::Zip::Archive
+{
+	my ( $self, $member, $newContents ) = @_;
+	$member = $self->memberNamed( $member ) if ! ref( $member );
+	return undef if ! $member;
+	return $member->contents( $newContents );
+}
+
+#--------------------------------
+
+=item writeToFileNamed( $fileName )
+
+Write a zip archive to named file.
+Returns C<AZ_OK> on success.
+
+Note that if you use the same name as an existing
+zip file that you read in, you will clobber ZipFileMembers.
+So instead, write to a different file name, then delete
+the original.
+
+    my $status = $zip->writeToFileNamed( 'xx.zip' );
+    die "error somewhere" if $status != AZ_OK;
+
+=cut
+
+sub writeToFileNamed	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fileName = shift;
+	foreach my $member ( $self->members() )
+	{
+		if ( $member->_usesFileNamed( $fileName ) )
+		{
+			return _error("$fileName is needed by member " 
+					. $member->fileName() 
+					. "; try renaming output file");
+		}
+	}
+	my ( $status, $fh ) = _newFileHandle( $fileName, 'w' );
+	return _ioError( "Can't open $fileName for write" ) if !$status;
+	my $retval = $self->writeToFileHandle( $fh, 1 );
+	$fh->close();
+	return $retval;
+}
+
+#--------------------------------
+
+=item writeToFileHandle( $fileHandle [, $seekable] )
+
+Write a zip archive to a file handle.
+Return AZ_OK on success.
+
+The optional second arg tells whether or not to try to seek backwards
+to re-write headers.
+If not provided, it is set by testing seekability. This could fail
+on some operating systems, though.
+
+    my $fh = IO::File->new( 'someFile.zip', 'w' );
+    $zip->writeToFileHandle( $fh );
+
+If you pass a file handle that is not seekable (like if you're writing
+to a pipe or a socket), pass a false as the second argument:
+
+    my $fh = IO::File->new( '| cat > somefile.zip', 'w' );
+    $zip->writeToFileHandle( $fh, 0 );   # fh is not seekable
+
+=cut
+
+sub writeToFileHandle	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fh = shift;
+	my $fhIsSeekable = @_ ? shift : _isSeekable( $fh );
+	_binmode( $fh );
+
+	my $offset = 0;
+	foreach my $member ( $self->members() )
+	{
+		$member->{'writeLocalHeaderRelativeOffset'} = $offset;
+		my $retval = $member->_writeToFileHandle( $fh, $fhIsSeekable );
+		$member->endRead();
+		return $retval if $retval != AZ_OK;
+		$offset += $member->_localHeaderSize() + $member->_writeOffset();
+		$offset += $member->hasDataDescriptor() ? DATA_DESCRIPTOR_LENGTH : 0;
+	}
+	$self->{'writeCentralDirectoryOffset'} = $offset;
+	return $self->_writeCentralDirectory( $fh );
+}
+
+# Returns next signature from given file handle, leaves
+# file handle positioned afterwards.
+# In list context, returns ($status, $signature)
+
+sub _readSignature	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fh = shift;
+	my $fileName = shift;
+	my $signatureData;
+	$fh->read( $signatureData, SIGNATURE_LENGTH )
+		or return _ioError( "reading header signature" );
+	my $signature = unpack( SIGNATURE_FORMAT, $signatureData );
+	my $status = AZ_OK;
+	if ( $signature != CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE
+			and $signature != LOCAL_FILE_HEADER_SIGNATURE
+			and $signature != END_OF_CENTRAL_DIRECTORY_SIGNATURE )
+	{
+		$status = _formatError(
+			sprintf( "bad signature: 0x%08x at offset %d in file \"%s\"",
+				$signature, $fh->tell() - SIGNATURE_LENGTH, $fileName ) );
+	}
+
+	return ( $status, $signature );
+}
+
+# Used only during writing
+sub _writeCentralDirectoryOffset	# Archive::Zip::Archive
+{ shift->{'writeCentralDirectoryOffset'} }
+
+sub _writeEOCDOffset	# Archive::Zip::Archive
+{ shift->{'writeEOCDOffset'} }
+
+# Expects to have _writeEOCDOffset() set
+sub _writeEndOfCentralDirectory	# Archive::Zip::Archive
+{
+	my ( $self, $fh ) = @_;
+
+	$fh->write( END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING, SIGNATURE_LENGTH )
+		or return _ioError( 'writing EOCD Signature' );
+
+	my $header = pack( END_OF_CENTRAL_DIRECTORY_FORMAT,
+		0,	# {'diskNumber'},
+		0,	# {'diskNumberWithStartOfCentralDirectory'},
+		$self->numberOfMembers(),	# {'numberOfCentralDirectoriesOnThisDisk'},
+		$self->numberOfMembers(),	# {'numberOfCentralDirectories'},
+		$self->_writeEOCDOffset() - $self->_writeCentralDirectoryOffset(),
+		$self->_writeCentralDirectoryOffset(),
+		length( $self->zipfileComment() )
+	 );
+	$fh->write( $header, END_OF_CENTRAL_DIRECTORY_LENGTH )
+		or return _ioError( 'writing EOCD header' );
+	if ( length( $self->zipfileComment() ))
+	{
+		$fh->write( $self->zipfileComment(), length( $self->zipfileComment() ))
+			or return _ioError( 'writing zipfile comment' );
+	}
+	return AZ_OK;
+}
+
+sub _writeCentralDirectory	# Archive::Zip::Archive
+{
+	my ( $self, $fh ) = @_;
+
+	my $offset = $self->_writeCentralDirectoryOffset();
+	foreach my $member ( $self->members() )
+	{
+		my $status = $member->_writeCentralDirectoryFileHeader( $fh );
+		return $status if $status != AZ_OK;
+		$offset += $member->_centralDirectoryHeaderSize();
+	}
+	$self->{'writeEOCDOffset'} = $offset;
+	return $self->_writeEndOfCentralDirectory( $fh );
+}
+
+#--------------------------------
+
+=item read( $fileName )
+
+Read zipfile headers from a zip file, appending new members.
+Returns C<AZ_OK> or error code.
+
+    my $zipFile = Archive::Zip->new();
+    my $status = $zipFile->read( '/some/FileName.zip' );
+
+=cut
+
+sub read	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fileName = shift;
+	return _error( 'No filename given' ) if ! $fileName;
+	my ( $status, $fh ) = _newFileHandle( $fileName, 'r' );
+	return _ioError( "opening $fileName for read" ) if !$status;
+	_binmode( $fh );
+
+	$status = $self->_findEndOfCentralDirectory( $fh );
+	return $status if $status != AZ_OK;
+
+	my $eocdPosition = $fh->tell();
+
+	$status = $self->_readEndOfCentralDirectory( $fh );
+	return $status if $status != AZ_OK;
+
+	$fh->seek( $eocdPosition - $self->centralDirectorySize(),
+		IO::Seekable::SEEK_SET )
+			or return _ioError( "Can't seek $fileName" );
+
+	for ( ;; )
+	{
+		my $newMember = 
+			$self->ZIPMEMBERCLASS->_newFromZipFile( $fh, $fileName );
+		my $signature;
+		( $status, $signature ) = $self->_readSignature( $fh, $fileName );
+		return $status if $status != AZ_OK;
+		last if $signature == END_OF_CENTRAL_DIRECTORY_SIGNATURE;
+		$status = $newMember->_readCentralDirectoryFileHeader();
+		return $status if $status != AZ_OK;
+		$status = $newMember->endRead();
+		return $status if $status != AZ_OK;
+		$newMember->_becomeDirectoryIfNecessary();
+		push( @{ $self->{'members'} }, $newMember );
+	}
+
+	$fh->close();
+	return AZ_OK;
+}
+
+# Read EOCD, starting from position before signature.
+# Return AZ_OK on success.
+sub _readEndOfCentralDirectory	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fh = shift;
+
+	# Skip past signature
+	$fh->seek( SIGNATURE_LENGTH, IO::Seekable::SEEK_CUR )
+		or return _ioError( "Can't seek past EOCD signature" );
+
+	my $header = '';
+	$fh->read( $header, END_OF_CENTRAL_DIRECTORY_LENGTH )
+		or return _ioError( "reading end of central directory" );
+
+	my $zipfileCommentLength;
+	(
+		$self->{'diskNumber'},
+		$self->{'diskNumberWithStartOfCentralDirectory'},
+		$self->{'numberOfCentralDirectoriesOnThisDisk'},
+		$self->{'numberOfCentralDirectories'},
+		$self->{'centralDirectorySize'},
+		$self->{'centralDirectoryOffsetWRTStartingDiskNumber'},
+		$zipfileCommentLength
+	 ) = unpack( END_OF_CENTRAL_DIRECTORY_FORMAT, $header );
+
+	if ( $zipfileCommentLength )
+	{
+		my $zipfileComment = '';
+		$fh->read( $zipfileComment, $zipfileCommentLength )
+			or return _ioError( "reading zipfile comment" );
+		$self->{'zipfileComment'} = $zipfileComment;
+	}
+
+	return AZ_OK;
+}
+
+# Seek in my file to the end, then read backwards until we find the
+# signature of the central directory record. Leave the file positioned right
+# before the signature. Returns AZ_OK if success.
+sub _findEndOfCentralDirectory	# Archive::Zip::Archive
+{
+	my $self = shift;
+	my $fh = shift;
+	my $data = '';
+	$fh->seek( 0, IO::Seekable::SEEK_END )
+		or return _ioError( "seeking to end" );
+
+	my $fileLength = $fh->tell();
+	if ( $fileLength < END_OF_CENTRAL_DIRECTORY_LENGTH + 4 )
+	{
+		return _formatError( "file is too short" )
+	}
+
+	my $seekOffset = 0;
+	my $pos = -1;
+	for ( ;; )
+	{
+		$seekOffset += 512;
+		$seekOffset = $fileLength if ( $seekOffset > $fileLength );
+		$fh->seek( -$seekOffset, IO::Seekable::SEEK_END )
+			or return _ioError( "seek failed" );
+		$fh->read( $data, $seekOffset )
+			or return _ioError( "read failed" );
+		$pos = rindex( $data, END_OF_CENTRAL_DIRECTORY_SIGNATURE_STRING );
+		last if ( $pos > 0
+			or $seekOffset == $fileLength
+			or $seekOffset >= $Archive::Zip::ChunkSize );
+	}
+
+	if ( $pos >= 0 )
+	{
+		$fh->seek( $pos - $seekOffset, IO::Seekable::SEEK_CUR )
+			or return _ioError( "seeking to EOCD" );
+		return AZ_OK;
+	}
+	else
+	{
+		return _formatError( "can't find EOCD signature" );
+	}
+}
+
+=back
+
+=head1 MEMBER OPERATIONS
+
+=head2 Class Methods
+
+Several constructors allow you to construct members without adding
+them to a zip archive.
+
+These work the same as the addFile(), addDirectory(), and addString()
+zip instance methods described above, but they don't add the new members
+to a zip.
+
+=over 4
+
+=cut
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::Member
+# A generic member of an archive ( abstract )
+# ----------------------------------------------------------------------
+package Archive::Zip::Member;
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip );
+
+BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS
+	:UTILITY_METHODS ) }
+
+use Time::Local ();
+use Compress::Zlib qw( Z_OK Z_STREAM_END MAX_WBITS );
+use File::Path;
+use File::Basename;
+
+use constant ZIPFILEMEMBERCLASS	=> 'Archive::Zip::ZipFileMember';
+use constant NEWFILEMEMBERCLASS	=> 'Archive::Zip::NewFileMember';
+use constant STRINGMEMBERCLASS	=> 'Archive::Zip::StringMember';
+use constant DIRECTORYMEMBERCLASS	=> 'Archive::Zip::DirectoryMember';
+
+# Unix perms for default creation of files/dirs.
+use constant DEFAULT_DIRECTORY_PERMISSIONS => 040755;
+use constant DEFAULT_FILE_PERMISSIONS => 0100666;
+use constant DIRECTORY_ATTRIB => 040000;
+use constant FILE_ATTRIB => 0100000;
+
+# Returns self if successful, else undef
+# Assumes that fh is positioned at beginning of central directory file header.
+# Leaves fh positioned immediately after file header or EOCD signature.
+sub _newFromZipFile # Archive::Zip::Member
+{
+	my $class = shift;
+	my $self = $class->ZIPFILEMEMBERCLASS->_newFromZipFile( @_ );
+	return $self;
+}
+
+#--------------------------------
+
+=item Archive::Zip::Member->newFromString( $stringOrStringRef [, $fileName] )
+
+Construct a new member from the given string. Returns undef on error.
+
+    my $member = Archive::Zip::Member->newFromString( 'This is a test',
+                                                     'xyz.txt' );
+
+=cut
+
+sub newFromString	# Archive::Zip::Member
+{
+	my $class = shift;
+	my $self = $class->STRINGMEMBERCLASS->_newFromString( @_ );
+	return $self;
+}
+
+#--------------------------------
+
+=item newFromFile( $fileName )
+
+Construct a new member from the given file. Returns undef on error.
+
+    my $member = Archive::Zip::Member->newFromFile( 'xyz.txt' );
+
+=cut
+
+sub newFromFile	# Archive::Zip::Member
+{
+	my $class = shift;
+	my $self = $class->NEWFILEMEMBERCLASS->_newFromFileNamed( @_ );
+	return $self;
+}
+
+#--------------------------------
+
+=item newDirectoryNamed( $directoryName )
+
+Construct a new member from the given directory.
+Returns undef on error.
+
+    my $member = Archive::Zip::Member->newDirectoryNamed( 'CVS/' );
+
+=cut
+
+sub newDirectoryNamed # Archive::Zip::Member
+{
+	my $class = shift;
+	my $self = $class->DIRECTORYMEMBERCLASS->_newNamed( @_ );
+	return $self;
+}
+
+sub new	# Archive::Zip::Member
+{
+	my $class = shift;
+	my $self = {
+		'lastModFileDateTime' => 0,
+		'fileAttributeFormat' => FA_UNIX,
+		'versionMadeBy' => 20,
+		'versionNeededToExtract' => 20,
+		'bitFlag' => 0,
+		'compressionMethod' => COMPRESSION_STORED,
+		'desiredCompressionMethod' => COMPRESSION_STORED,
+		'desiredCompressionLevel' => COMPRESSION_LEVEL_NONE,
+		'internalFileAttributes' => 0,
+		'externalFileAttributes' => 0,	# set later
+		'fileName' => '',
+		'cdExtraField' => '',
+		'localExtraField' => '',
+		'fileComment' => '',
+		'crc32' => 0,
+		'compressedSize' => 0,
+		'uncompressedSize' => 0,
+		@_
+	};
+	bless( $self, $class );
+	$self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS );
+	return $self;
+}
+
+sub _becomeDirectoryIfNecessary	# Archive::Zip::Member
+{
+	my $self = shift;
+	$self->_become( DIRECTORYMEMBERCLASS )
+		if $self->isDirectory();
+	return $self;
+}
+
+# Morph into given class (do whatever cleanup I need to do)
+sub _become	# Archive::Zip::Member
+{
+	return bless( $_[0], $_[1] );
+}
+
+=back
+
+=head2 Simple accessors
+
+These methods get (and/or set) member attribute values.
+
+=over 4
+
+=cut
+
+#--------------------------------
+
+=item versionMadeBy()
+
+Gets the field from my member header.
+
+=cut
+
+sub versionMadeBy	# Archive::Zip::Member
+{ shift->{'versionMadeBy'} }
+
+#--------------------------------
+
+=item fileAttributeFormat( [$format] )
+
+Gets or sets the field from the member header.
+These are C<FA_*> values.
+
+=cut
+
+sub fileAttributeFormat	# Archive::Zip::Member
+{
+	( $#_ > 0 ) ? ( $_[0]->{'fileAttributeFormat'} = $_[1] )
+		: $_[0]->{'fileAttributeFormat'}
+}
+
+#--------------------------------
+
+=item versionNeededToExtract()
+
+Gets the field from my member header.
+
+=cut
+
+sub versionNeededToExtract	# Archive::Zip::Member
+{ shift->{'versionNeededToExtract'} }
+
+#--------------------------------
+
+=item bitFlag()
+
+Gets the general purpose bit field from my member header.
+This is where the C<GPBF_*> bits live.
+
+=cut
+
+sub bitFlag	# Archive::Zip::Member
+{ shift->{'bitFlag'} }
+
+#--------------------------------
+
+=item compressionMethod()
+
+Returns my compression method. This is the method that is
+currently being used to compress my data.
+
+This will be COMPRESSION_STORED for added string or file members,
+or any of the C<COMPRESSION_*> values for members from a zip file.
+However, this module can only handle members whose data is in
+COMPRESSION_STORED or COMPRESSION_DEFLATED format.
+
+=cut
+
+sub compressionMethod	# Archive::Zip::Member
+{ shift->{'compressionMethod'} }
+
+#--------------------------------
+
+=item desiredCompressionMethod( [$method] )
+
+Get or set my desiredCompressionMethod
+This is the method that will be used to write.
+Returns prior desiredCompressionMethod.
+
+Only COMPRESSION_DEFLATED or COMPRESSION_STORED are valid arguments.
+
+Changing to COMPRESSION_STORED will change my desiredCompressionLevel
+to 0; changing to COMPRESSION_DEFLATED will change my
+desiredCompressionLevel to COMPRESSION_LEVEL_DEFAULT.
+
+=cut
+
+sub desiredCompressionMethod	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $newDesiredCompressionMethod = shift;
+	my $oldDesiredCompressionMethod = $self->{'desiredCompressionMethod'};
+	if ( defined( $newDesiredCompressionMethod ))
+	{
+		$self->{'desiredCompressionMethod'} = $newDesiredCompressionMethod;
+		if ( $newDesiredCompressionMethod == COMPRESSION_STORED )
+		{
+			$self->{'desiredCompressionLevel'} = 0;
+		}
+		elsif ( $oldDesiredCompressionMethod == COMPRESSION_STORED )
+		{
+			$self->{'desiredCompressionLevel'} = COMPRESSION_LEVEL_DEFAULT;
+		}
+	}
+	return $oldDesiredCompressionMethod;
+}
+
+#--------------------------------
+
+=item desiredCompressionLevel( [$method] )
+
+Get or set my desiredCompressionLevel
+This is the method that will be used to write.
+Returns prior desiredCompressionLevel.
+
+Valid arguments are 0 through 9, COMPRESSION_LEVEL_NONE,
+COMPRESSION_LEVEL_DEFAULT, COMPRESSION_LEVEL_BEST_COMPRESSION, and
+COMPRESSION_LEVEL_FASTEST.
+
+0 or COMPRESSION_LEVEL_NONE will change the desiredCompressionMethod
+to COMPRESSION_STORED. All other arguments will change the
+desiredCompressionMethod to COMPRESSION_DEFLATED.
+
+=cut
+
+sub desiredCompressionLevel	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $newDesiredCompressionLevel = shift;
+	my $oldDesiredCompressionLevel = $self->{'desiredCompressionLevel'};
+	if ( defined( $newDesiredCompressionLevel ))
+	{
+		$self->{'desiredCompressionLevel'} = $newDesiredCompressionLevel;
+		$self->{'desiredCompressionMethod'} = ( $newDesiredCompressionLevel
+			? COMPRESSION_DEFLATED
+			: COMPRESSION_STORED );
+	}
+	return $oldDesiredCompressionLevel;
+}
+
+#--------------------------------
+
+=item fileName()
+
+Get or set my internal filename.
+Returns the (possibly new) filename.
+
+Names will have backslashes converted to forward slashes,
+and will have multiple consecutive slashes converted to single ones.
+
+=cut
+
+sub fileName	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $newName = shift;
+	if ( $newName )
+	{
+		$newName =~ s{[\\/]+}{/}g;	# deal with dos/windoze problems
+		$self->{'fileName'} = $newName;
+	}
+	return $self->{'fileName'}
+}
+
+#--------------------------------
+
+=item lastModFileDateTime()
+
+Return my last modification date/time stamp in MS-DOS format.
+
+=cut
+
+sub lastModFileDateTime	# Archive::Zip::Member
+{ shift->{'lastModFileDateTime'} }
+
+#--------------------------------
+
+=item lastModTime()
+
+Return my last modification date/time stamp,
+converted to unix localtime format.
+
+    print "Mod Time: " . scalar( localtime( $member->lastModTime() ) );
+
+=cut
+
+sub lastModTime	# Archive::Zip::Member
+{
+	my $self = shift;
+	return _dosToUnixTime( $self->lastModFileDateTime() );
+}
+
+#--------------------------------
+
+=item setLastModFileDateTimeFromUnix()
+
+Set my lastModFileDateTime from the given unix time.
+
+    $member->setLastModFileDateTimeFromUnix( time() );
+
+=cut
+
+sub setLastModFileDateTimeFromUnix	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $time_t = shift;
+	$self->{'lastModFileDateTime'} = _unixToDosTime( $time_t );
+}
+
+# Convert DOS date/time format to unix time_t format
+# NOT AN OBJECT METHOD!
+sub _dosToUnixTime	# Archive::Zip::Member
+{
+	my $dt = shift;
+
+	my $year = ( ( $dt >> 25 ) & 0x7f ) + 80;
+	my $mon  = ( ( $dt >> 21 ) & 0x0f ) - 1;
+	my $mday = ( ( $dt >> 16 ) & 0x1f );
+
+	my $hour = ( ( $dt >> 11 ) & 0x1f );
+	my $min  = ( ( $dt >> 5 ) & 0x3f );
+	my $sec  = ( ( $dt << 1 ) & 0x3e );
+
+	my $time_t = Time::Local::timelocal( $sec, $min, $hour, $mday, $mon, $year );
+	return $time_t;
+}
+
+#--------------------------------
+
+=item internalFileAttributes()
+
+Return the internal file attributes field from the zip header.
+This is only set for members read from a zip file.
+
+=cut
+
+sub internalFileAttributes	# Archive::Zip::Member
+{ shift->{'internalFileAttributes'} }
+
+#--------------------------------
+
+=item externalFileAttributes()
+
+Return member attributes as read from the ZIP file.
+Note that these are NOT UNIX!
+
+=cut
+
+sub externalFileAttributes	# Archive::Zip::Member
+{ shift->{'externalFileAttributes'} }
+
+# Convert UNIX permissions into proper value for zip file
+# NOT A METHOD!
+sub _mapPermissionsFromUnix	# Archive::Zip::Member
+{
+	my $perms = shift;
+	return $perms << 16;
+}
+
+# Convert ZIP permissions into Unix ones
+# NOT A METHOD!
+sub _mapPermissionsToUnix	# Archive::Zip::Member
+{
+	my $perms = shift;
+	return $perms >> 16;
+}
+
+#--------------------------------
+
+=item unixFileAttributes( [$newAttributes] )
+
+Get or set the member's file attributes using UNIX file attributes.
+Returns old attributes.
+
+    my $oldAttribs = $member->unixFileAttributes( 0666 );
+
+Note that the return value has more than just the file permissions,
+so you will have to mask off the lowest bits for comparisions.
+
+=cut
+
+sub unixFileAttributes	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $oldPerms = _mapPermissionsToUnix( $self->{'externalFileAttributes'} );
+	if ( @_ )
+	{
+		my $perms = shift;
+		if ( $self->isDirectory() )
+		{
+			$perms &= ~FILE_ATTRIB;
+			$perms |= DIRECTORY_ATTRIB;
+		}
+		else
+		{
+			$perms &= ~DIRECTORY_ATTRIB;
+			$perms |= FILE_ATTRIB;
+		}
+		$self->{'externalFileAttributes'} = _mapPermissionsFromUnix( $perms);
+	}
+	return $oldPerms;
+}
+
+#--------------------------------
+
+=item localExtraField( [$newField] )
+
+Gets or sets the extra field that was read from the local header.
+This is not set for a member from a zip file until after the
+member has been written out.
+
+The extra field must be in the proper format.
+
+=cut
+
+sub localExtraField	# Archive::Zip::Member
+{
+	( $#_ > 0 ) ? ( $_[0]->{'localExtraField'} = $_[1] )
+		: $_[0]->{'localExtraField'}
+}
+
+#--------------------------------
+
+=item cdExtraField( [$newField] )
+
+Gets or sets the extra field that was read from the central directory header.
+
+The extra field must be in the proper format.
+
+=cut
+
+sub cdExtraField	# Archive::Zip::Member
+{
+	( $#_ > 0 ) ? ( $_[0]->{'cdExtraField'} = $_[1] )
+		: $_[0]->{'cdExtraField'}
+}
+
+#--------------------------------
+
+=item extraFields()
+
+Return both local and CD extra fields, concatenated.
+
+=cut
+
+sub extraFields	# Archive::Zip::Member
+{
+	my $self = shift;
+	return $self->localExtraField() . $self->cdExtraField();
+}
+
+#--------------------------------
+
+=item fileComment( [$newComment] )
+
+Get or set the member's file comment.
+
+=cut
+
+sub fileComment	# Archive::Zip::Member
+{
+	( $#_ > 0 ) ? ( $_[0]->{'fileComment'} = $_[1] )
+		: $_[0]->{'fileComment'}
+}
+
+#--------------------------------
+
+=item hasDataDescriptor()
+
+Get or set the data descriptor flag.
+If this is set, the local header will not necessarily
+have the correct data sizes. Instead, a small structure
+will be stored at the end of the member data with these
+values.
+
+This should be transparent in normal operation.
+
+=cut
+
+sub hasDataDescriptor	# Archive::Zip::Member
+{
+	my $self = shift;
+	if ( @_ )
+	{
+		my $shouldHave = shift;
+		if ( $shouldHave )
+		{
+			$self->{'bitFlag'} |= GPBF_HAS_DATA_DESCRIPTOR_MASK
+		}
+		else
+		{
+			$self->{'bitFlag'} &= ~GPBF_HAS_DATA_DESCRIPTOR_MASK
+		}
+	}
+	return $self->{'bitFlag'} & GPBF_HAS_DATA_DESCRIPTOR_MASK;
+}
+
+#--------------------------------
+
+=item crc32()
+
+Return the CRC-32 value for this member.
+This will not be set for members that were constructed from strings
+or external files until after the member has been written.
+
+=cut
+
+sub crc32	# Archive::Zip::Member
+{ shift->{'crc32'} }
+
+#--------------------------------
+
+=item crc32String()
+
+Return the CRC-32 value for this member as an 8 character printable
+hex string.  This will not be set for members that were constructed
+from strings or external files until after the member has been written.
+
+=cut
+
+sub crc32String	# Archive::Zip::Member
+{ sprintf( "%08x", shift->{'crc32'} ); }
+
+#--------------------------------
+
+=item compressedSize()
+
+Return the compressed size for this member.
+This will not be set for members that were constructed from strings
+or external files until after the member has been written.
+
+=cut
+
+sub compressedSize	# Archive::Zip::Member
+{ shift->{'compressedSize'} }
+
+#--------------------------------
+
+=item uncompressedSize()
+
+Return the uncompressed size for this member.
+
+=cut
+
+sub uncompressedSize	# Archive::Zip::Member
+{ shift->{'uncompressedSize'} }
+
+#--------------------------------
+
+=item isEncrypted()
+
+Return true if this member is encrypted.
+The Archive::Zip module does not currently create or extract
+encrypted members.
+
+=cut
+
+sub isEncrypted	# Archive::Zip::Member
+{ shift->bitFlag() & GPBF_ENCRYPTED_MASK }
+
+
+#--------------------------------
+
+=item isTextFile( [$flag] )
+
+Returns true if I am a text file.
+Also can set the status if given an argument (then returns old state).
+Note that this module does not currently do anything with this flag
+upon extraction or storage.
+That is, bytes are stored in native format whether or not they came
+from a text file.
+
+=cut
+
+sub isTextFile	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK;
+	if ( @_ )
+	{
+		my $flag = shift;
+		$self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK;
+		$self->{'internalFileAttributes'} |=
+			( $flag ? IFA_TEXT_FILE : IFA_BINARY_FILE );
+	}
+	return $bit == IFA_TEXT_FILE;
+}
+
+#--------------------------------
+
+=item isBinaryFile()
+
+Returns true if I am a binary file.
+Also can set the status if given an argument (then returns old state).
+Note that this module does not currently do anything with this flag
+upon extraction or storage.
+That is, bytes are stored in native format whether or not they came
+from a text file.
+
+=cut
+
+sub isBinaryFile	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $bit = $self->internalFileAttributes() & IFA_TEXT_FILE_MASK;
+	if ( @_ )
+	{
+		my $flag = shift;
+		$self->{'internalFileAttributes'} &= ~IFA_TEXT_FILE_MASK;
+		$self->{'internalFileAttributes'} |=
+			( $flag ? IFA_BINARY_FILE : IFA_TEXT_FILE );
+	}
+	return $bit == IFA_BINARY_FILE;
+}
+
+#--------------------------------
+
+=item extractToFileNamed( $fileName )
+
+Extract me to a file with the given name.
+The file will be created with default modes.
+Directories will be created as needed.
+
+Returns AZ_OK on success.
+
+=cut
+
+sub extractToFileNamed	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $name = shift;
+	return _error( "encryption unsupported" ) if $self->isEncrypted();
+	mkpath( dirname( $name ) );	# croaks on error
+	my ( $status, $fh ) = _newFileHandle( $name, 'w' );
+	return _ioError( "Can't open file $name for write" ) if !$status;
+	my $retval = $self->extractToFileHandle( $fh );
+	$fh->close();
+	return $retval;
+}
+
+#--------------------------------
+
+=item isDirectory()
+
+Returns true if I am a directory.
+
+=cut
+
+sub isDirectory	# Archive::Zip::Member
+{ return 0 }
+
+# The following are used when copying data
+sub _writeOffset	# Archive::Zip::Member
+{ shift->{'writeOffset'} }
+
+sub _readOffset	# Archive::Zip::Member
+{ shift->{'readOffset'} }
+
+sub _writeLocalHeaderRelativeOffset	# Archive::Zip::Member
+{ shift->{'writeLocalHeaderRelativeOffset'} }
+
+sub _dataEnded	# Archive::Zip::Member
+{ shift->{'dataEnded'} }
+
+sub _readDataRemaining	# Archive::Zip::Member
+{ shift->{'readDataRemaining'} }
+
+sub _inflater	# Archive::Zip::Member
+{ shift->{'inflater'} }
+
+sub _deflater	# Archive::Zip::Member
+{ shift->{'deflater'} }
+
+# Return the total size of my local header
+sub _localHeaderSize	# Archive::Zip::Member
+{
+	my $self = shift;
+	return SIGNATURE_LENGTH
+		+ LOCAL_FILE_HEADER_LENGTH
+		+ length( $self->fileName() )
+		+ length( $self->localExtraField() )
+}
+
+# Return the total size of my CD header
+sub _centralDirectoryHeaderSize	# Archive::Zip::Member
+{
+	my $self = shift;
+	return SIGNATURE_LENGTH
+		+ CENTRAL_DIRECTORY_FILE_HEADER_LENGTH
+		+ length( $self->fileName() )
+		+ length( $self->cdExtraField() )
+		+ length( $self->fileComment() )
+}
+
+# convert a unix time to DOS date/time
+# NOT AN OBJECT METHOD!
+sub _unixToDosTime	# Archive::Zip::Member
+{
+	my $time_t = shift;
+	my ( $sec,$min,$hour,$mday,$mon,$year ) = localtime( $time_t );
+	my $dt = 0;
+	$dt += ( $sec >> 1 );
+	$dt += ( $min << 5 );
+	$dt += ( $hour << 11 );
+	$dt += ( $mday << 16 );
+	$dt += ( ( $mon + 1 ) << 21 );
+	$dt += ( ( $year - 80 ) << 25 );
+	return $dt;
+}
+
+# Write my local header to a file handle.
+# Stores the offset to the start of the header in my
+# writeLocalHeaderRelativeOffset member.
+# Returns AZ_OK on success.
+sub _writeLocalFileHeader	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $fh = shift;
+
+	my $signatureData = pack( SIGNATURE_FORMAT, LOCAL_FILE_HEADER_SIGNATURE );
+	$fh->write( $signatureData, SIGNATURE_LENGTH )
+		or return _ioError( "writing local header signature" );
+
+	my $header = pack( LOCAL_FILE_HEADER_FORMAT,
+		$self->versionNeededToExtract(),
+		$self->bitFlag(),
+		$self->desiredCompressionMethod(),
+		$self->lastModFileDateTime(),
+		$self->crc32(),
+		$self->compressedSize(),		# may need to be re-written later
+		$self->uncompressedSize(),
+		length( $self->fileName() ),
+		length( $self->localExtraField() )
+		 );
+
+	$fh->write( $header, LOCAL_FILE_HEADER_LENGTH )
+		or return _ioError( "writing local header" );
+	if ( length( $self->fileName() ))
+	{
+		$fh->write( $self->fileName(), length( $self->fileName() ))
+			or return _ioError( "writing local header filename" );
+	}
+	if ( length( $self->localExtraField() ))
+	{
+		$fh->write( $self->localExtraField(), length( $self->localExtraField() ))
+			or return _ioError( "writing local header signature" );
+	}
+
+	return AZ_OK;
+}
+
+sub _writeCentralDirectoryFileHeader	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $fh = shift;
+
+	my $sigData = pack( SIGNATURE_FORMAT,
+		CENTRAL_DIRECTORY_FILE_HEADER_SIGNATURE );
+	$fh->write( $sigData, SIGNATURE_LENGTH )
+		or return _ioError( "writing central directory header signature" );
+
+	my $fileNameLength = length( $self->fileName() );
+	my $extraFieldLength = length( $self->cdExtraField() );
+	my $fileCommentLength = length( $self->fileComment() );
+
+	my $header = pack( CENTRAL_DIRECTORY_FILE_HEADER_FORMAT,
+		$self->versionMadeBy(),
+		$self->fileAttributeFormat(),
+		$self->versionNeededToExtract(),
+		$self->bitFlag(),
+		$self->desiredCompressionMethod(),
+		$self->lastModFileDateTime(),
+		$self->crc32(),			# these three fields should have been updated
+		$self->_writeOffset(),	# by writing the data stream out
+		$self->uncompressedSize(),	#
+		$fileNameLength,
+		$extraFieldLength,
+		$fileCommentLength,
+		0,						# {'diskNumberStart'},
+		$self->internalFileAttributes(),
+		$self->externalFileAttributes(),
+		$self->_writeLocalHeaderRelativeOffset()
+	 );
+
+	$fh->write( $header, CENTRAL_DIRECTORY_FILE_HEADER_LENGTH )
+		or return _ioError( "writing central directory header" );
+	if ( $fileNameLength )
+	{
+		$fh->write( $self->fileName(), $fileNameLength )
+			or return _ioError( "writing central directory header signature" );
+	}
+	if ( $extraFieldLength )
+	{
+		$fh->write( $self->cdExtraField(), $extraFieldLength )
+			or return _ioError( "writing central directory extra field" );
+	}
+	if ( $fileCommentLength )
+	{
+		$fh->write( $self->fileComment(), $fileCommentLength )
+			or return _ioError( "writing central directory file comment" );
+	}
+
+	return AZ_OK;
+}
+
+# This writes a data descriptor to the given file handle.
+# Assumes that crc32, writeOffset, and uncompressedSize are
+# set correctly (they should be after a write).
+# Further, the local file header should have the
+# GPBF_HAS_DATA_DESCRIPTOR_MASK bit set.
+sub _writeDataDescriptor	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $fh = shift;
+	my $header = pack( DATA_DESCRIPTOR_FORMAT,
+		$self->crc32(),
+		$self->_writeOffset(),
+		$self->uncompressedSize()
+	 );
+
+	$fh->write( $header, DATA_DESCRIPTOR_LENGTH )
+		or return _ioError( "writing data descriptor" );
+	return AZ_OK;
+}
+
+# Re-writes the local file header with new crc32 and compressedSize fields.
+# To be called after writing the data stream.
+# Assumes that filename and extraField sizes didn't change since last written.
+sub _refreshLocalFileHeader	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $fh = shift;
+
+	my $here = $fh->tell();
+	$fh->seek( $self->_writeLocalHeaderRelativeOffset() + SIGNATURE_LENGTH,
+		IO::Seekable::SEEK_SET )
+			or return _ioError( "seeking to rewrite local header" );
+
+	my $header = pack( LOCAL_FILE_HEADER_FORMAT,
+		$self->versionNeededToExtract(),
+		$self->bitFlag(),
+		$self->desiredCompressionMethod(),
+		$self->lastModFileDateTime(),
+		$self->crc32(),
+		$self->_writeOffset(),
+		$self->uncompressedSize(),
+		length( $self->fileName() ),
+		length( $self->localExtraField() )
+		 );
+
+	$fh->write( $header, LOCAL_FILE_HEADER_LENGTH )
+		or return _ioError( "re-writing local header" );
+	$fh->seek( $here, IO::Seekable::SEEK_SET )
+			or return _ioError( "seeking after rewrite of local header" );
+
+	return AZ_OK;
+}
+
+=back
+
+=head2 Low-level member data reading
+
+It is possible to use lower-level routines to access member
+data streams, rather than the extract* methods and contents().
+
+For instance, here is how to print the uncompressed contents
+of a member in chunks using these methods:
+
+    my ( $member, $status, $bufferRef );
+    $member = $zip->memberNamed( 'xyz.txt' );
+    $member->desiredCompressionMethod( COMPRESSION_STORED );
+    $status = $member->rewindData();
+    die "error $status" if $status != AZ_OK;
+    while ( ! $member->readIsDone() )
+    {
+        ( $bufferRef, $status ) = $member->readChunk();
+        die "error $status" if $status != AZ_OK;
+        # do something with $bufferRef:
+        print $$bufferRef;
+    }
+    $member->endRead();
+
+=over 4
+
+=cut
+
+#--------------------------------
+
+=item readChunk( [$chunkSize] )
+
+This reads the next chunk of given size from the member's data stream and
+compresses or uncompresses it as necessary, returning a reference to the bytes
+read and a status.
+If size argument is not given, defaults to global set by
+Archive::Zip::setChunkSize.
+Status is AZ_OK on success. Returns C<( \$bytes, $status)>.
+
+    my ( $outRef, $status ) = $self->readChunk();
+    print $$outRef if $status != AZ_OK;
+
+=cut
+
+sub readChunk	# Archive::Zip::Member
+{
+	my ( $self, $chunkSize ) = @_;
+
+	if ( $self->readIsDone() )
+	{
+		$self->endRead();
+		my $dummy = '';
+		return ( \$dummy, AZ_STREAM_END );
+	}
+
+	$chunkSize = $Archive::Zip::ChunkSize if not defined( $chunkSize );
+	$chunkSize = $self->_readDataRemaining()
+		if $chunkSize > $self->_readDataRemaining();
+
+	my $buffer = '';
+	my $outputRef;
+	my ( $bytesRead, $status) = $self->_readRawChunk( \$buffer, $chunkSize );
+	return ( \$buffer, $status) if $status != AZ_OK;
+
+	$self->{'readDataRemaining'} -= $bytesRead;
+	$self->{'readOffset'} += $bytesRead;
+
+	if ( $self->compressionMethod() == COMPRESSION_STORED )
+	{
+		$self->{'crc32'} = $self->computeCRC32( $buffer, $self->{'crc32'} );
+	}
+
+	( $outputRef, $status) = &{$self->{'chunkHandler'}}( $self, \$buffer );
+	$self->{'writeOffset'} += length( $$outputRef );
+
+	$self->endRead()
+		if $self->readIsDone();
+
+	return ( $outputRef, $status);
+}
+
+# Read the next raw chunk of my data. Subclasses MUST implement.
+#	my ( $bytesRead, $status) = $self->_readRawChunk( \$buffer, $chunkSize );
+sub _readRawChunk	# Archive::Zip::Member
+{
+	my $self = shift;
+	return $self->_subclassResponsibility();
+}
+
+# A place holder to catch rewindData errors if someone ignores
+# the error code.
+sub _noChunk	# Archive::Zip::Member
+{
+	my $self = shift;
+	return ( \undef, _error( "trying to copy chunk when init failed" ));
+}
+
+# Basically a no-op so that I can have a consistent interface.
+# ( $outputRef, $status) = $self->_copyChunk( \$buffer );
+sub _copyChunk	# Archive::Zip::Member
+{
+	my ( $self, $dataRef ) = @_;
+	return ( $dataRef, AZ_OK );
+}
+
+
+# ( $outputRef, $status) = $self->_deflateChunk( \$buffer );
+sub _deflateChunk	# Archive::Zip::Member
+{
+	my ( $self, $buffer ) = @_;
+	my ( $out, $status ) = $self->_deflater()->deflate( $buffer );
+
+	if ( $self->_readDataRemaining() == 0 )
+	{
+		my $extraOutput;
+		( $extraOutput, $status ) = $self->_deflater()->flush();
+		$out .= $extraOutput;
+		$self->endRead();
+		return ( \$out, AZ_STREAM_END );
+	}
+	elsif ( $status == Z_OK )
+	{
+		return ( \$out, AZ_OK );
+	}
+	else
+	{
+		$self->endRead();
+		my $retval = _error( 'deflate error', $status);
+		my $dummy = '';
+		return ( \$dummy, $retval );
+	}
+}
+
+# ( $outputRef, $status) = $self->_inflateChunk( \$buffer );
+sub _inflateChunk	# Archive::Zip::Member
+{
+	my ( $self, $buffer ) = @_;
+	my ( $out, $status ) = $self->_inflater()->inflate( $buffer );
+	my $retval;
+	$self->endRead() if ( $status != Z_OK );
+	if ( $status == Z_OK || $status == Z_STREAM_END )
+	{
+		$retval = ( $status == Z_STREAM_END )
+			? AZ_STREAM_END : AZ_OK;
+		return ( \$out, $retval );
+	}
+	else
+	{
+		$retval = _error( 'inflate error', $status);
+		my $dummy = '';
+		return ( \$dummy, $retval );
+	}
+}
+
+#--------------------------------
+
+=item rewindData()
+
+Rewind data and set up for reading data streams or writing zip files.
+Can take options for C<inflateInit()> or C<deflateInit()>,
+but this isn't likely to be necessary.
+Subclass overrides should call this method.
+Returns C<AZ_OK> on success.
+
+=cut
+
+sub rewindData	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $status;
+
+	# set to trap init errors
+	$self->{'chunkHandler'} = $self->can( '_noChunk' );
+
+	# Work around WinZip defect with 0-length DEFLATED files
+	$self->desiredCompressionMethod( COMPRESSION_STORED )
+		if $self->uncompressedSize() == 0;
+
+	# assume that we're going to read the whole file, and compute the CRC anew.
+	$self->{'crc32'} = 0 if ( $self->compressionMethod() == COMPRESSION_STORED );
+
+	# These are the only combinations of methods we deal with right now.
+	if ( $self->compressionMethod() == COMPRESSION_STORED
+			and $self->desiredCompressionMethod() == COMPRESSION_DEFLATED )
+	{
+		( $self->{'deflater'}, $status ) = Compress::Zlib::deflateInit(
+			'-Level' => $self->desiredCompressionLevel(),
+			'-WindowBits' => - MAX_WBITS(), # necessary magic
+			@_ );	# pass additional options
+		return _error( 'deflateInit error:', $status ) if $status != Z_OK;
+		$self->{'chunkHandler'} = $self->can( '_deflateChunk' );
+	}
+	elsif ( $self->compressionMethod() == COMPRESSION_DEFLATED
+			and $self->desiredCompressionMethod() == COMPRESSION_STORED )
+	{
+		( $self->{'inflater'}, $status ) = Compress::Zlib::inflateInit(
+			'-WindowBits' => - MAX_WBITS(), # necessary magic
+			@_ );	# pass additional options
+		return _error( 'inflateInit error:', $status ) if $status != Z_OK;
+		$self->{'chunkHandler'} = $self->can( '_inflateChunk' );
+	}
+	elsif ( $self->compressionMethod() == $self->desiredCompressionMethod() )
+	{
+		$self->{'chunkHandler'} = $self->can( '_copyChunk' );
+	}
+	else
+	{
+		return _error(
+			sprintf( "Unsupported compression combination: read %d, write %d",
+				$self->compressionMethod(),
+				$self->desiredCompressionMethod() )
+		 );
+	}
+
+	$self->{'dataEnded'} = 0;
+	$self->{'readDataRemaining'} = $self->compressedSize();
+	$self->{'readOffset'} = 0;
+
+	return AZ_OK;
+}
+
+#--------------------------------
+
+=item endRead()
+
+Reset the read variables and free the inflater or deflater.
+Must be called to close files, etc.
+
+Returns AZ_OK on success.
+
+=cut
+
+sub endRead	# Archive::Zip::Member
+{
+	my $self = shift;
+	delete $self->{'inflater'};
+	delete $self->{'deflater'};
+	$self->{'dataEnded'} = 1;
+	$self->{'readDataRemaining'} = 0;
+	return AZ_OK;
+}
+
+#--------------------------------
+
+=item readIsDone()
+
+Return true if the read has run out of data or errored out.
+
+=cut
+
+sub readIsDone	# Archive::Zip::Member
+{
+	my $self = shift;
+	return ( $self->_dataEnded() or ! $self->_readDataRemaining() );
+}
+
+#--------------------------------
+
+=item contents()
+
+Return the entire uncompressed member data or undef in scalar context.
+When called in array context, returns C<( $string, $status )>; status
+will be AZ_OK on success:
+
+    my $string = $member->contents();
+    # or
+    my ( $string, $status ) = $member->contents();
+    die "error $status" if $status != AZ_OK;
+
+Can also be used to set the contents of a member (this may change
+the class of the member):
+
+    $member->contents( "this is my new contents" );
+
+=cut
+
+sub contents	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $newContents = shift;
+	if ( defined( $newContents ) )
+	{
+		$self->_become( STRINGMEMBERCLASS );
+		return $self->contents( $newContents );
+	}
+	else
+	{
+		my $oldCompression = 
+			$self->desiredCompressionMethod( COMPRESSION_STORED );
+		my $status = $self->rewindData( @_ );
+		if ( $status != AZ_OK )
+		{
+			$self->endRead();
+			return $status;
+		}
+		my $retval = '';
+		while ( $status == AZ_OK )
+		{
+			my $ref;
+			( $ref, $status ) = $self->readChunk( $self->_readDataRemaining() );
+			# did we get it in one chunk?
+			if ( length( $$ref ) == $self->uncompressedSize() )
+			{ $retval = $$ref }
+			else
+			{ $retval .= $$ref }
+		}
+		$self->desiredCompressionMethod( $oldCompression );
+		$self->endRead();
+		$status = AZ_OK if $status == AZ_STREAM_END;
+		$retval = undef if $status != AZ_OK;
+		return wantarray ? ( $retval, $status ) : $retval;
+	}
+}
+
+#--------------------------------
+
+=item extractToFileHandle( $fh )
+
+Extract (and uncompress, if necessary) my contents to the given file handle.
+Return AZ_OK on success.
+
+=cut
+
+sub extractToFileHandle	# Archive::Zip::Member
+{
+	my $self = shift;
+	return _error( "encryption unsupported" ) if $self->isEncrypted();
+	my $fh = shift;
+	_binmode( $fh );
+	my $oldCompression = $self->desiredCompressionMethod( COMPRESSION_STORED );
+	my $status = $self->rewindData( @_ );
+	$status = $self->_writeData( $fh ) if $status == AZ_OK;
+	$self->desiredCompressionMethod( $oldCompression );
+	$self->endRead();
+	return $status;
+}
+
+# write local header and data stream to file handle
+sub _writeToFileHandle	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $fh = shift;
+	my $fhIsSeekable = shift;
+
+	# Determine if I need to write a data descriptor
+	# I need to do this if I can't refresh the header
+	# and I don't know compressed size or crc32 fields.
+	my $headerFieldsUnknown = ( ( $self->uncompressedSize() > 0 )
+		and ( $self->compressionMethod() == COMPRESSION_STORED
+			or $self->desiredCompressionMethod() == COMPRESSION_DEFLATED ) );
+
+	my $shouldWriteDataDescriptor =
+		( $headerFieldsUnknown and not $fhIsSeekable );
+
+	$self->hasDataDescriptor( 1 )
+		if ( $shouldWriteDataDescriptor );
+
+	$self->{'writeOffset'} = 0;
+
+	my $status = $self->rewindData();
+	( $status = $self->_writeLocalFileHeader( $fh ) )
+		if $status == AZ_OK;
+	( $status = $self->_writeData( $fh ) )
+		if $status == AZ_OK;
+	if ( $status == AZ_OK )
+	{
+		if ( $self->hasDataDescriptor() )
+		{
+			$status = $self->_writeDataDescriptor( $fh );
+		}
+		elsif ( $headerFieldsUnknown )
+		{
+			$status = $self->_refreshLocalFileHeader( $fh );
+		}
+	}
+
+	return $status;
+}
+
+# Copy my (possibly compressed) data to given file handle.
+# Returns C<AZ_OK> on success
+sub _writeData	# Archive::Zip::Member
+{
+	my $self = shift;
+	my $writeFh = shift;
+
+	return AZ_OK if ( $self->uncompressedSize() == 0 );
+	my $status;
+	my $chunkSize = $Archive::Zip::ChunkSize;
+	while ( $self->_readDataRemaining() > 0 )
+	{
+		my $outRef;
+		( $outRef, $status ) = $self->readChunk( $chunkSize );
+		return $status if ( $status != AZ_OK and $status != AZ_STREAM_END );
+
+		$writeFh->write( $$outRef, length( $$outRef ) )
+			or return _ioError( "write error during copy" );
+
+		last if $status == AZ_STREAM_END;
+	}
+	return AZ_OK;
+}
+
+
+# Return true if I depend on the named file
+sub _usesFileNamed
+{
+	return 0;
+}
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::DirectoryMember
+# ----------------------------------------------------------------------
+
+package Archive::Zip::DirectoryMember;
+use File::Path;
+
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip::Member );
+BEGIN { use Archive::Zip qw( :ERROR_CODES :UTILITY_METHODS ) }
+
+sub _newNamed	# Archive::Zip::DirectoryMember
+{
+	my $class = shift;
+	my $name = shift;
+	my $self = $class->new( @_ );
+	$self->fileName( $name );
+	if ( -d $name )
+	{
+		my @stat = stat( _ );
+		$self->unixFileAttributes( $stat[2] );
+		$self->setLastModFileDateTimeFromUnix( $stat[9] );
+	}
+	else
+	{
+		$self->unixFileAttributes( $self->DEFAULT_DIRECTORY_PERMISSIONS );
+		$self->setLastModFileDateTimeFromUnix( time() );
+	}
+	return $self;
+}
+
+sub isDirectory	# Archive::Zip::DirectoryMember
+{ return 1; }
+
+sub extractToFileNamed	# Archive::Zip::DirectoryMember
+{
+	my $self = shift;
+	my $name = shift;
+	my $attribs = $self->unixFileAttributes() & 07777;
+	mkpath( $name, 0, $attribs );	# croaks on error
+	return AZ_OK;
+}
+
+sub fileName	# Archive::Zip::DirectoryMember
+{
+	my $self = shift;
+	my $newName = shift;
+	$newName =~ s{/?$}{/} if defined( $newName );
+	return $self->SUPER::fileName( $newName );
+}
+
+=back
+
+=head1 Archive::Zip::FileMember methods
+
+The Archive::Zip::FileMember class extends Archive::Zip::Member.
+It is the base class for both ZipFileMember and NewFileMember classes.
+This class adds an C<externalFileName> and an C<fh> member to keep
+track of the external file.
+
+=over 4
+
+=cut
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::FileMember
+# Base class for classes that have file handles
+# to external files
+# ----------------------------------------------------------------------
+
+package Archive::Zip::FileMember;
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip::Member );
+BEGIN { use Archive::Zip qw( :UTILITY_METHODS ) }
+
+#--------------------------------
+
+=item externalFileName()
+
+Return my external filename.
+
+=cut
+
+sub externalFileName	# Archive::Zip::FileMember
+{ shift->{'externalFileName'} }
+
+#--------------------------------
+
+# Return true if I depend on the named file
+sub _usesFileNamed
+{
+	my $self = shift;
+	my $fileName = shift;
+	return $self->externalFileName eq $fileName;
+}
+
+=item fh()
+
+Return my read file handle.
+Automatically opens file if necessary.
+
+=cut
+
+sub fh	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	$self->_openFile() if ! $self->{'fh'};
+	return $self->{'fh'};
+}
+
+# opens my file handle from my file name
+sub _openFile	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	my ( $status, $fh ) = _newFileHandle( $self->externalFileName(), 'r' );
+	if ( !$status )
+	{
+		_ioError( "Can't open", $self->externalFileName() );
+		return undef;
+	}
+	$self->{'fh'} = $fh;
+	_binmode( $fh );
+	return $fh;
+}
+
+# Closes my file handle
+sub _closeFile	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	$self->{'fh'} = undef;
+}
+
+# Make sure I close my file handle
+sub endRead	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	$self->_closeFile();
+	return $self->SUPER::endRead( @_ );
+}
+
+sub _become	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	my $newClass = shift;
+	return $self if ref( $self ) eq $newClass;
+	delete( $self->{'externalFileName'} );
+	delete( $self->{'fh'} );
+	return $self->SUPER::_become( $newClass );
+}
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::NewFileMember
+# Used when adding a pre-existing file to an archive
+# ----------------------------------------------------------------------
+
+package Archive::Zip::NewFileMember;
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip::FileMember );
+
+BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :UTILITY_METHODS ) }
+
+# Given a file name, set up for eventual writing.
+sub _newFromFileNamed	# Archive::Zip::NewFileMember
+{
+	my $class = shift;
+	my $fileName = shift;
+	return undef if ! ( -r $fileName && ( -f _ || -l _ ) );
+	my $self = $class->new( @_ );
+	$self->fileName( $fileName );
+	$self->{'externalFileName'} = $fileName;
+	$self->{'compressionMethod'} = COMPRESSION_STORED;
+	my @stat = stat( _ );
+	$self->{'compressedSize'} = $self->{'uncompressedSize'} = $stat[7];
+	$self->desiredCompressionMethod( ( $self->compressedSize() > 0 )
+		? COMPRESSION_DEFLATED
+		: COMPRESSION_STORED );
+	$self->unixFileAttributes( $stat[2] );
+	$self->setLastModFileDateTimeFromUnix( $stat[9] );
+	$self->isTextFile( -T _ );
+	return $self;
+}
+
+sub rewindData	# Archive::Zip::NewFileMember
+{
+	my $self = shift;
+
+	my $status = $self->SUPER::rewindData( @_ );
+	return $status if $status != AZ_OK;
+
+	return AZ_IO_ERROR if ! $self->fh();
+	$self->fh()->clearerr();
+	$self->fh()->seek( 0, IO::Seekable::SEEK_SET )
+		or return _ioError( "rewinding", $self->externalFileName() );
+	return AZ_OK;
+}
+
+# Return bytes read. Note that first parameter is a ref to a buffer.
+# my $data;
+# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
+sub _readRawChunk	# Archive::Zip::NewFileMember
+{
+	my ( $self, $dataRef, $chunkSize ) = @_;
+	return ( 0, AZ_OK ) if ( ! $chunkSize );
+	my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize )
+		or return ( 0, _ioError( "reading data" ) );
+	return ( $bytesRead, AZ_OK );
+}
+
+# If I already exist, extraction is a no-op.
+sub extractToFileNamed	# Archive::Zip::NewFileMember
+{
+	my $self = shift;
+	my $name = shift;
+	if ( $name eq $self->fileName() and -r $name )
+	{
+		return AZ_OK;
+	}
+	else
+	{
+		return $self->SUPER::extractToFileNamed( $name, @_ );
+	}
+}
+
+=back
+
+=head1 Archive::Zip::ZipFileMember methods
+
+The Archive::Zip::ZipFileMember class represents members that have
+been read from external zip files.
+
+=over 4
+
+=cut
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::ZipFileMember
+# This represents a member in an existing zip file on disk.
+# ----------------------------------------------------------------------
+
+package Archive::Zip::ZipFileMember;
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip::FileMember );
+
+BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES :PKZIP_CONSTANTS
+	:UTILITY_METHODS ) }
+
+# Create a new Archive::Zip::ZipFileMember
+# given a filename and optional open file handle
+sub _newFromZipFile	# Archive::Zip::ZipFileMember
+{
+	my $class = shift;
+	my $fh = shift;
+	my $externalFileName = shift;
+	my $self = $class->new(
+		'crc32' => 0,
+		'diskNumberStart' => 0,
+		'localHeaderRelativeOffset' => 0,
+		'dataOffset' =>  0,	# localHeaderRelativeOffset + header length
+		@_
+	 );
+	$self->{'externalFileName'} = $externalFileName;
+	$self->{'fh'} = $fh;
+	return $self;
+}
+
+sub isDirectory	# Archive::Zip::FileMember
+{
+	my $self = shift;
+	return ( substr( $self->fileName(), -1, 1 ) eq '/'
+		and $self->uncompressedSize() == 0 );
+}
+
+# Because I'm going to delete the file handle, read the local file
+# header if the file handle is seekable. If it isn't, I assume that
+# I've already read the local header.
+# Return ( $status, $self )
+
+sub _become	# Archive::Zip::ZipFileMember
+{
+	my $self = shift;
+	my $newClass = shift;
+	return $self if ref( $self ) eq $newClass;
+
+	my $status = AZ_OK;
+
+	if ( _isSeekable( $self->fh() ) )
+	{
+		my $here = $self->fh()->tell();
+		$status = $self->fh()->seek(
+			$self->localHeaderRelativeOffset() + SIGNATURE_LENGTH,
+			IO::Seekable::SEEK_SET );
+		if ( ! $status )
+		{
+			$self->fh()->seek( $here );
+			_ioError( "seeking to local header" );
+			return $self;
+		}
+		$self->_readLocalFileHeader();
+		$self->fh()->seek( $here, IO::Seekable::SEEK_SET );
+	}
+
+	delete( $self->{'diskNumberStart'} );
+	delete( $self->{'localHeaderRelativeOffset'} );
+	delete( $self->{'dataOffset'} );
+
+	return $self->SUPER::_become( $newClass );
+}
+
+#--------------------------------
+
+=item diskNumberStart()
+
+Returns the disk number that my local header resides
+in. Had better be 0.
+
+=cut
+
+sub diskNumberStart	# Archive::Zip::ZipFileMember
+{ shift->{'diskNumberStart'} }
+
+#--------------------------------
+
+=item localHeaderRelativeOffset()
+
+Returns the offset into the zip file where my local header is.
+
+=cut
+
+sub localHeaderRelativeOffset	# Archive::Zip::ZipFileMember
+{ shift->{'localHeaderRelativeOffset'} }
+
+#--------------------------------
+
+=item dataOffset()
+
+Returns the offset from the beginning of the zip file to
+my data.
+
+=cut
+
+sub dataOffset	# Archive::Zip::ZipFileMember
+{ shift->{'dataOffset'} }
+
+# Skip local file header, updating only extra field stuff.
+# Assumes that fh is positioned before signature.
+sub _skipLocalFileHeader	# Archive::Zip::ZipFileMember
+{
+	my $self = shift;
+	my $header;
+	$self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH )
+		or return _ioError( "reading local file header" );
+	my $fileNameLength;
+	my $extraFieldLength;
+	(	undef, 	# $self->{'versionNeededToExtract'},
+		undef,	# $self->{'bitFlag'},
+		undef,	# $self->{'compressionMethod'},
+		undef,	# $self->{'lastModFileDateTime'},
+		undef,	# $crc32,
+		undef,	# $compressedSize,
+		undef,	# $uncompressedSize,
+		$fileNameLength,
+		$extraFieldLength ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header );
+
+	if ( $fileNameLength )
+	{
+		$self->fh()->seek( $fileNameLength, IO::Seekable::SEEK_CUR )
+			or return _ioError( "skipping local file name" );
+	}
+
+	if ( $extraFieldLength )
+	{
+		$self->fh()->read( $self->{'localExtraField'}, $extraFieldLength )
+			or return _ioError( "reading local extra field" );
+	}
+
+	$self->{'dataOffset'} = $self->fh()->tell();
+
+	return AZ_OK;
+}
+
+# Read from a local file header into myself. Returns AZ_OK if successful.
+# Assumes that fh is positioned after signature.
+# Note that crc32, compressedSize, and uncompressedSize will be 0 if
+# GPBF_HAS_DATA_DESCRIPTOR_MASK is set in the bitFlag.
+
+sub _readLocalFileHeader	# Archive::Zip::ZipFileMember
+{
+	my $self = shift;
+	my $header;
+	$self->fh()->read( $header, LOCAL_FILE_HEADER_LENGTH )
+		or return _ioError( "reading local file header" );
+	my $fileNameLength;
+	my $crc32;
+	my $compressedSize;
+	my $uncompressedSize;
+	my $extraFieldLength;
+	(	$self->{'versionNeededToExtract'},
+		$self->{'bitFlag'},
+		$self->{'compressionMethod'},
+		$self->{'lastModFileDateTime'},
+		$crc32,
+		$compressedSize,
+		$uncompressedSize,
+		$fileNameLength,
+		$extraFieldLength ) = unpack( LOCAL_FILE_HEADER_FORMAT, $header );
+
+	if ( $fileNameLength )
+	{
+		my $fileName;
+		$self->fh()->read( $fileName, $fileNameLength )
+			or return _ioError( "reading local file name" );
+		$self->fileName( $fileName );
+	}
+
+	if ( $extraFieldLength )
+	{
+		$self->fh()->read( $self->{'localExtraField'}, $extraFieldLength )
+			or return _ioError( "reading local extra field" );
+	}
+
+	$self->{'dataOffset'} = $self->fh()->tell();
+
+	# Don't trash these fields from the CD if we already have them.
+	if ( not $self->hasDataDescriptor() )
+	{
+		$self->{'crc32'} = $crc32;
+		$self->{'compressedSize'} = $compressedSize;
+		$self->{'uncompressedSize'} = $uncompressedSize;
+	}
+
+	# We ignore data descriptors (we don't read them,
+	# and we compute elsewhere whether we need to write them ).
+	# And, we have the necessary data from the CD header.
+	# So mark this entry as not having a data descriptor.
+	$self->hasDataDescriptor( 0 );
+
+	return AZ_OK;
+}
+
+
+# Read a Central Directory header. Return AZ_OK on success.
+# Assumes that fh is positioned right after the signature.
+
+sub _readCentralDirectoryFileHeader	# Archive::Zip::ZipFileMember
+{
+	my $self = shift;
+	my $fh = $self->fh();
+	my $header = '';
+	$fh->read( $header, CENTRAL_DIRECTORY_FILE_HEADER_LENGTH )
+		or return _ioError( "reading central dir header" );
+	my ( $fileNameLength, $extraFieldLength, $fileCommentLength );
+	(
+		$self->{'versionMadeBy'},
+		$self->{'fileAttributeFormat'},
+		$self->{'versionNeededToExtract'},
+		$self->{'bitFlag'},
+		$self->{'compressionMethod'},
+		$self->{'lastModFileDateTime'},
+		$self->{'crc32'},
+		$self->{'compressedSize'},
+		$self->{'uncompressedSize'},
+		$fileNameLength,
+		$extraFieldLength,
+		$fileCommentLength,
+		$self->{'diskNumberStart'},
+		$self->{'internalFileAttributes'},
+		$self->{'externalFileAttributes'},
+		$self->{'localHeaderRelativeOffset'}
+	 ) = unpack( CENTRAL_DIRECTORY_FILE_HEADER_FORMAT, $header );
+
+	if ( $fileNameLength )
+	{
+		$fh->read( $self->{'fileName'}, $fileNameLength )
+			or return _ioError( "reading central dir filename" );
+	}
+	if ( $extraFieldLength )
+	{
+		$fh->read( $self->{'cdExtraField'}, $extraFieldLength )
+			or return _ioError( "reading central dir extra field" );
+	}
+	if ( $fileCommentLength )
+	{
+		$fh->read( $self->{'fileComment'}, $fileCommentLength )
+			or return _ioError( "reading central dir file comment" );
+	}
+
+	$self->desiredCompressionMethod( $self->compressionMethod() );
+
+	return AZ_OK;
+}
+
+sub rewindData	# Archive::Zip::ZipFileMember
+{
+	my $self = shift;
+
+	my $status = $self->SUPER::rewindData( @_ );
+	return $status if $status != AZ_OK;
+
+	return AZ_IO_ERROR if ! $self->fh();
+
+	$self->fh()->clearerr();
+
+	# Seek to local file header.
+	# The only reason that I'm doing this this way is that the extraField
+	# length seems to be different between the CD header and the LF header.
+	$self->fh()->seek( $self->localHeaderRelativeOffset() + SIGNATURE_LENGTH,
+		IO::Seekable::SEEK_SET )
+			or return _ioError( "seeking to local header" );
+
+	# skip local file header
+	$status = $self->_skipLocalFileHeader();
+	return $status if $status != AZ_OK;
+
+	# Seek to beginning of file data
+	$self->fh()->seek( $self->dataOffset(), IO::Seekable::SEEK_SET )
+		or return _ioError( "seeking to beginning of file data" );
+
+	return AZ_OK;
+}
+
+# Return bytes read. Note that first parameter is a ref to a buffer.
+# my $data;
+# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
+sub _readRawChunk	# Archive::Zip::ZipFileMember
+{
+	my ( $self, $dataRef, $chunkSize ) = @_;
+	return ( 0, AZ_OK )
+		if ( ! $chunkSize );
+	my $bytesRead = $self->fh()->read( $$dataRef, $chunkSize )
+		or return ( 0, _ioError( "reading data" ) );
+	return ( $bytesRead, AZ_OK );
+}
+
+# ----------------------------------------------------------------------
+# class Archive::Zip::StringMember ( concrete )
+# A Zip member whose data lives in a string
+# ----------------------------------------------------------------------
+
+package Archive::Zip::StringMember;
+use vars qw( @ISA );
+@ISA = qw ( Archive::Zip::Member );
+
+BEGIN { use Archive::Zip qw( :CONSTANTS :ERROR_CODES ) }
+
+# Create a new string member. Default is COMPRESSION_STORED.
+# Can take a ref to a string as well.
+sub _newFromString	# Archive::Zip::StringMember
+{
+	my $class = shift;
+	my $string = shift;
+	my $name = shift;
+	my $self = $class->new( @_ );
+	$self->contents( $string );
+	$self->fileName( $name ) if defined( $name );
+	# Set the file date to now
+	$self->setLastModFileDateTimeFromUnix( time() );
+	$self->unixFileAttributes( $self->DEFAULT_FILE_PERMISSIONS );
+	return $self;
+}
+
+sub _become	# Archive::Zip::StringMember
+{
+	my $self = shift;
+	my $newClass = shift;
+	return $self if ref( $self ) eq $newClass;
+	delete( $self->{'contents'} );
+	return $self->SUPER::_become( $newClass );
+}
+
+# Get or set my contents. Note that we do not call the superclass
+# version of this, because it calls us.
+sub contents    # Archive::Zip::StringMember
+{
+	my $self = shift;
+	my $string = shift;
+	if ( defined( $string ) )
+	{
+		$self->{'contents'} = ( ref( $string ) eq 'SCALAR' )
+			? $$string
+			: $string;
+		$self->{'uncompressedSize'}
+			= $self->{'compressedSize'}
+			= length( $self->{'contents'} );
+		$self->{'compressionMethod'} = COMPRESSION_STORED;
+	}
+	return $self->{'contents'};
+}
+
+# Return bytes read. Note that first parameter is a ref to a buffer.
+# my $data;
+# my ( $bytesRead, $status) = $self->readRawChunk( \$data, $chunkSize );
+sub _readRawChunk	# Archive::Zip::StringMember
+{
+	my ( $self, $dataRef, $chunkSize ) = @_;
+	$$dataRef = substr( $self->contents(), $self->_readOffset(), $chunkSize );
+	return ( length( $$dataRef ), AZ_OK );
+}
+
+1;
+__END__
+
+=back
+
+=head1 AUTHOR
+
+Ned Konz, perl@bike-nomad.com
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+software; you can redistribute it and/or modify it under the same terms
+as Perl itself.
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>
+
+=cut
+
+# vim: ts=4 sw=4 columns=80
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Archive/Zip/BufferedFileHandle.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,139 @@
+# Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+# software; you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+
+# File handle that uses a string internally and can seek
+# This is given as a demo for getting a zip file written
+# to a string.
+# I probably should just use IO::Scalar instead.
+# Ned Konz, March 2000
+#
+# $Revision: 1.3 $
+
+use strict;
+package Archive::Zip::BufferedFileHandle;
+use FileHandle ();
+use Carp;
+
+sub new
+{
+	my $class = shift || __PACKAGE__;
+	$class = ref($class) || $class;
+	my $self = bless( { 
+		content => '', 
+		position => 0, 
+		size => 0
+	}, $class );
+	return $self;
+}
+
+# Utility method to read entire file
+sub readFromFile
+{
+	my $self = shift;
+	my $fileName = shift;
+	my $fh = FileHandle->new($fileName, "r");
+	if (! $fh)
+	{
+		Carp::carp("Can't open $fileName: $!\n");
+		return undef;
+	}
+	local $/ = undef;
+	$self->{content} = <$fh>;
+	$self->{size} = length($self->{content});
+	return $self;
+}
+
+sub contents
+{
+	my $self = shift;
+	if (@_)
+	{
+		$self->{content} = shift;
+		$self->{size} = length($self->{content});
+	}
+	return $self->{content};
+}
+
+sub binmode
+{ 1 }
+
+sub close
+{ 1 }
+
+sub eof
+{
+	my $self = shift;
+	return $self->{position} >= $self->{size};
+}
+
+sub seek
+{
+	my $self = shift;
+	my $pos = shift;
+	my $whence = shift;
+
+	# SEEK_SET
+	if ($whence == 0) { $self->{position} = $pos; }
+	# SEEK_CUR
+	elsif ($whence == 1) { $self->{position} += $pos; }
+	# SEEK_END
+	elsif ($whence == 2) { $self->{position} = $self->{size} + $pos; }
+	else { return 0; }
+
+	return 1;
+}
+
+sub tell
+{ return shift->{position}; }
+
+# Copy my data to given buffer
+sub read
+{
+	my $self = shift;
+	my $buf = \($_[0]); shift;
+	my $len = shift;
+	my $offset = shift || 0;
+
+	$$buf = '' if not defined($$buf);
+	my $bytesRead = ($self->{position} + $len > $self->{size})
+		? ($self->{size} - $self->{position})
+		: $len;
+	substr($$buf, $offset, $bytesRead) 
+		= substr($self->{content}, $self->{position}, $bytesRead);
+	$self->{position} += $bytesRead;
+	return $bytesRead;
+}
+
+# Copy given buffer to me
+sub write
+{
+	my $self = shift;
+	my $buf = \($_[0]); shift;
+	my $len = shift;
+	my $offset = shift || 0;
+
+	$$buf = '' if not defined($$buf);
+	my $bufLen = length($$buf);
+	my $bytesWritten = ($offset + $len > $bufLen)
+		? $bufLen - $offset
+		: $len;
+	substr($self->{content}, $self->{position}, $bytesWritten)
+		= substr($$buf, $offset, $bytesWritten);
+	$self->{size} = length($self->{content});
+	return $bytesWritten;
+}
+
+sub clearerr() { 1 }
+
+# vim: ts=4 sw=4
+1;
+__END__
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+software; you can redistribute it and/or modify it under the same terms
+as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Archive/Zip/MockFileHandle.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,87 @@
+# Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+# software; you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+
+# Output file handle that calls a custom write routine
+# Ned Konz, March 2000
+# This is provided to help with writing zip files
+# when you have to process them a chunk at a time.
+#
+# See the examples.
+#
+# $Revision: 1.2 $
+
+use strict;
+package Archive::Zip::MockFileHandle;
+
+sub new
+{
+	my $class = shift || __PACKAGE__;
+	$class = ref($class) || $class;
+	my $self = bless( { 
+		'position' => 0, 
+		'size' => 0
+	}, $class );
+	return $self;
+}
+
+sub eof
+{
+	my $self = shift;
+	return $self->{'position'} >= $self->{'size'};
+}
+
+# Copy given buffer to me
+sub write
+{
+	my $self = shift;
+	my $buf = \($_[0]); shift;
+	my $len = shift;
+	my $offset = shift || 0;
+
+	$$buf = '' if not defined($$buf);
+	my $bufLen = length($$buf);
+	my $bytesWritten = ($offset + $len > $bufLen)
+		? $bufLen - $offset
+		: $len;
+	$bytesWritten = $self->writeHook(substr($$buf, $offset, $bytesWritten));
+	if ($self->{'position'} + $bytesWritten > $self->{'size'})
+	{
+		$self->{'size'} = $self->{'position'} + $bytesWritten
+	}
+	$self->{'position'} += $bytesWritten;
+	return $bytesWritten;
+}
+
+# Called on each write.
+# Override in subclasses.
+# Return number of bytes written (0 on error).
+sub writeHook
+{
+	my $self = shift;
+	my $bytes = shift;
+	return length($bytes);
+}
+
+sub binmode { 1 } 
+
+sub close { 1 } 
+
+sub clearerr { 1 } 
+
+# I'm write-only!
+sub read { 0 } 
+
+sub tell { return shift->{'position'} }
+
+# vim: ts=4 sw=4
+1;
+__END__
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+software; you can redistribute it and/or modify it under the same terms
+as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Archive/Zip/Tree.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,238 @@
+# Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+# software; you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+
+# $Revision: 1.5 $
+package Archive::Zip::Archive;
+use File::Find ();
+use Archive::Zip qw(:ERROR_CODES :UTILITY_METHODS);
+
+=head1 NAME
+
+Archive::Zip::Tree -- methods for adding/extracting trees using Archive::Zip
+
+=head1 SYNOPSIS
+
+  use Archive::Zip;
+  use Archive::Zip::Tree;
+  my $zip = Archive::Zip->new();
+  # add all readable files and directories below . as xyz/*
+  $zip->addTree( '.', 'xyz' );	
+  # add all readable plain files below /abc as /def/*
+  $zip->addTree( '/abc', '/def', sub { -f && -r } );	
+  # add all .c files below /tmp as stuff/*
+  $zip->addTreeMatching( '/tmp', 'stuff', '\.c$' );
+  # add all .o files below /tmp as stuff/* if they aren't writable
+  $zip->addTreeMatching( '/tmp', 'stuff', '\.o$', sub { ! -w } );
+  # and write them into a file
+  $zip->writeToFile('xxx.zip');
+
+  # now extract the same files into /tmpx
+  $zip->extractTree( 'stuff', '/tmpx' );
+
+=head1 METHODS
+
+=over 4
+
+=item $zip->addTree( $root, $dest [,$pred] )
+
+$root is the root of the tree of files and directories to be added
+
+$dest is the name for the root in the zip file (undef or blank means to use
+relative pathnames)
+
+C<$pred> is an optional subroutine reference to select files: it is passed the
+name of the prospective file or directory using C<$_>,
+and if it returns true, the file or
+directory will be included.  The default is to add all readable files and
+directories.
+
+For instance, using
+
+  my $pred = sub { /\.txt/ };
+  $zip->addTree( '.', '.', $pred );
+
+will add all the .txt files in and below the current directory,
+using relative names, and making the names identical in the zipfile:
+
+  original name           zip member name
+  ./xyz                   xyz
+  ./a/                    a/
+  ./a/b                   a/b
+
+To use absolute pathnames, just pass them in:
+
+$zip->addTree( '/a/b', '/a/b' );
+
+  original name           zip member name
+  /a/                     /a/
+  /a/b                    /a/b
+
+To translate relative to absolute pathnames, just pass them in:
+
+$zip->addTree( '.', '/c/d' );
+
+  original name           zip member name
+  ./xyz                   /c/d/xyz
+  ./a/                    /c/d/a/
+  ./a/b                   /c/d/a/b
+
+To translate absolute to relative pathnames, just pass them in:
+
+$zip->addTree( '/c/d', 'a' );
+
+  original name           zip member name
+  /c/d/xyz                a/xyz
+  /c/d/a/                 a/a/
+  /c/d/a/b                a/a/b
+
+Returns AZ_OK on success.
+
+Note that this will not follow symbolic links to directories.
+
+Note also that this does not check for the validity of filenames.
+
+=back
+
+=cut
+
+sub addTree
+{
+	my $self = shift;
+	my $root = shift or return _error("root arg missing in call to addTree()");
+	my $dest = shift || '';
+	my $pred = shift || sub { -r };
+	$root =~ s{\\}{/}g;	# normalize backslashes in case user is misguided
+	$root =~ s{([^/])$}{$1/};	# append slash if necessary
+	$dest =~ s{([^/])$}{$1/} if $dest;	# append slash if necessary
+	my @files;
+	File::Find::find( sub { push( @files, $File::Find::name ) }, $root );
+	@files = grep { &$pred } @files;	# pass arg via local $_
+	foreach my $fileName ( @files )
+	{
+		( my $archiveName = $fileName ) =~ s{^\Q$root}{$dest};
+		$archiveName =~ s{^\./}{};
+		next if $archiveName =~ m{^\.?/?$};	# skip current dir
+		my $member = ( -d $fileName )
+			? $self->addDirectory( $fileName, $archiveName )
+			: $self->addFile( $fileName, $archiveName );
+		return _error( "add $fileName failed in addTree()" ) if !$member;
+	}
+	return AZ_OK;
+}
+
+=over 4
+
+=item $zip->addTreeMatching( $root, $dest, $pattern [,$pred] )
+
+$root is the root of the tree of files and directories to be added
+
+$dest is the name for the root in the zip file (undef means to use relative
+pathnames)
+
+$pattern is a (non-anchored) regular expression for filenames to match
+
+$pred is an optional subroutine reference to select files: it is passed the
+name of the prospective file or directory in C<$_>,
+and if it returns true, the file or
+directory will be included.  The default is to add all readable files and
+directories.
+
+To add all files in and below the current dirctory
+whose names end in C<.pl>, and make them extract into a subdirectory
+named C<xyz>, do this:
+
+  $zip->addTreeMatching( '.', 'xyz', '\.pl$' )
+
+To add all I<writable> files in and below the dirctory named C</abc>
+whose names end in C<.pl>, and make them extract into a subdirectory
+named C<xyz>, do this:
+
+  $zip->addTreeMatching( '/abc', 'xyz', '\.pl$', sub { -w } )
+
+Returns AZ_OK on success.
+
+Note that this will not follow symbolic links to directories.
+
+=back
+
+=cut
+
+sub addTreeMatching
+{
+	my $self = shift;
+	my $root = shift
+		or return _error("root arg missing in call to addTreeMatching()");
+	my $dest = shift || '';
+	my $pattern = shift
+		or return _error("pattern missing in call to addTreeMatching()");
+	my $pred = shift || sub { -r };
+	my $matcher = sub { m{$pattern} && &$pred };
+	return $self->addTree( $root, $dest, $matcher );
+}
+
+=over 4
+
+=item $zip->extractTree( $root, $dest )
+
+Extracts all the members below a given root. Will
+translate that root to a given dest pathname.
+
+For instance,
+
+   $zip->extractTree( '/a/', 'd/e/' );
+
+when applied to a zip containing the files:
+ /a/x /a/b/c /d/e
+
+will extract:
+ /a/x to d/e/x
+ /a/b/c to d/e/b/c
+
+and ignore /d/e
+
+=back 
+
+=cut
+
+sub extractTree
+{
+	my $self = shift();
+	my $root = shift();
+	return _error("root arg missing in call to extractTree()")
+		unless defined($root);
+	my $dest = shift || '.';
+	$root =~ s{\\}{/}g;	# normalize backslashes in case user is misguided
+	$root =~ s{([^/])$}{$1/};	# append slash if necessary
+	my @members = $self->membersMatching( "^$root" );
+	foreach my $member ( @members )
+	{
+		my $fileName = $member->fileName(); 
+		$fileName =~ s{$root}{$dest};
+		my $status = $member->extractToFileNamed( $fileName );
+		return $status if $status != AZ_OK;
+	}
+	return AZ_OK;
+}
+
+1;
+__END__
+
+=head1 AUTHOR
+
+Ned Konz, perl@bike-nomad.com
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Ned Konz. All rights reserved.  This program is free
+software; you can redistribute it and/or modify it under the same terms
+as Perl itself.
+
+=head1 SEE ALSO
+
+L<Compress::Zlib>
+L<Archive::Zip>
+
+=cut
+
+# vim: ts=4 sw=4 columns=80
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BinInfo	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,177 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'BinInfo');
+my $envDb;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  unless (scalar (@ARGV) == 1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+
+  if ($ARGV[0] =~ /[\*\?]/) {
+    my $glob = shift @ARGV;
+    foreach my $entry (@{Utils::ReadGlob($glob)}) {
+      Utils::AbsoluteFileName(\$entry);
+      print "\nFile:        $entry\n";
+      BinInfo($entry);
+    }
+  }
+  elsif (-f $ARGV[0]) {
+    my $binary = shift @ARGV;
+    Utils::AbsoluteFileName(\$binary);
+    BinInfo($binary);
+  }
+  else {
+    my $comp = shift @ARGV;
+    ListBins($comp);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+  
+  Utils::PrintDeathMessage($exitCode, "\nUsage: bininfo [options] <binary_file> | <component>
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub BinInfo {
+  my $binary = shift;
+  my $info = $envDb->BinaryInfo($binary);
+  $iniData->TableFormatter->PrintTable($info);
+}
+
+sub ListBins {
+  my $comp = shift;
+  unless ($envDb->Version($comp)) {
+    print "Error: \"$comp\" is not a file and is not a component that is currently installed\n";
+    Usage(1);
+  }
+  my $info = $envDb->ListBins($comp);
+  $iniData->TableFormatter->PrintTable($info, 1);
+}
+
+
+
+__END__
+
+=head1 NAME
+
+BinInfo - Displays information about a currently installed binary file.
+
+=head1 SYNOPSIS
+
+  bininfo [options] <binary_file> | <component>
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+If given a file name, prints the name of the component that owns the binary, the currently installed version and its status. For example:
+
+ D:\>bininfo \epoc32\release\wins\udeb\brdcst.dll
+ Component:   brdcst
+ Version:     001
+ Status:      pending release
+
+If given a component name, displays a list of all the binary files owned by that component and their status. For example:
+
+ D:\>bininfo brdcst
+ File                                                     Status
+
+ \EPOC32\INCLUDE\brdcst.h                                 clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDCST.DLL                    clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDCST.DLL.MAP                clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDCST.LIB                    clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDSRV.EXE                    clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDSRV.EXE.MAP                clean
+ \EPOC32\RELEASE\THUMB\UREL\BRDSRV.LIB                    clean
+ \EPOC32\RELEASE\WINS\UDEB\BRDCST.DLL                     clean
+ \EPOC32\RELEASE\WINS\UDEB\BRDCST.LIB                     clean
+ \EPOC32\RELEASE\WINS\UDEB\BRDCST.PDB                     clean
+ \EPOC32\RELEASE\WINS\UDEB\BRDSRV.LIB                     clean
+ \EPOC32\RELEASE\WINS\UDEB\Z\SYSTEM\PROGRAMS\BRDSRV.DLL   clean
+ \EPOC32\RELEASE\WINS\UDEB\Z\SYSTEM\PROGRAMS\BRDSRV.PDB   clean
+ \EPOC32\rom\include\brdcst.iby                           clean
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BinInfo.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BldDocs	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,347 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use CGI qw(:standard);
+use FindBin;
+use lib "$FindBin::Bin";
+use Utils;
+use Cwd;
+use File::Basename;
+use Pod::Html;
+use Getopt::Long;
+
+$|++;
+
+#
+# Constants.
+#
+
+my $KDocDir = "..\\doc";
+my @intro = ({fileName => "HistoricPerspective",
+	      caption => "Historic Perspective",
+	      comment => ""},
+#	     {fileName => "Environment",
+#	      caption => "Licensee Product Environment",
+#	      comment => ""},
+	     {fileName => "QuickStart",
+	      caption => "Quick Start",
+	      comment => ""},
+	     {fileName => "MakingReleases",
+	      caption => "Making Releases",
+	      comment => ""},
+	     {fileName => "Installation",
+	      caption => "Installation Guide",
+	      comment => ""},
+	     {fileName => "ExportingReleases",
+	      caption => "Exporting and Importing Releases",
+	      comment => ""},
+	     {fileName => "FurtherInformation",
+	      caption => "Further Information",
+	      comment => ""},
+	     {fileName => "Optimisation",
+	      caption => "Optimisation",
+	      comment => ""},
+	     {fileName => "FAQ",
+	      caption => "Frequently Asked Questions",
+	      comment => ""});
+my @commands = ({fileName => "BinInfo"},
+		{fileName => "BuildRel"},
+		{fileName => "CleanEnv"},
+		{fileName => "CleanLocalArch"},
+		{fileName => "CleanRemote"},
+		{fileName => "CopyRel"},
+		{fileName => "DeltaEnv"},
+		{fileName => "DiffEnv"},
+		{fileName => "DiffRel"},
+		{fileName => "EnvInfo"},
+		{fileName => "ExportEnv"},
+		{fileName => "ExportRel"},
+		{fileName => "EnvMembership"},
+		{fileName => "EnvSize"},
+		{fileName => "GetEnv"},
+		{fileName => "GetRel"},
+		{fileName => "GetSource"},
+		{fileName => "ImportEnv"},
+		{fileName => "ImportRel"},
+		{fileName => "InstallSnapShot"},
+		{fileName => "LatestVer"},
+		{fileName => "ListComponents"},
+		{fileName => "MakeEnv"},
+		{fileName => "MakeRel"},
+		{fileName => "MakeSnapShot"},
+		{fileName => "ModNotes"},
+		{fileName => "MrpComplexity"},
+		{fileName => "RemoveRel"},
+		{fileName => "RemoveSource"},
+		{fileName => "SourceInfo"},
+		{fileName => "PrepEnv"},
+		{fileName => "PrepRel"},
+		{fileName => "PullEnv"},
+		{fileName => "PushEnv"},
+		{fileName => "PullRel"},
+		{fileName => "PushRel"},
+		{fileName => "ValidateEnv"},
+		{fileName => "ValidateRel"},
+		{fileName => "ViewNotes"});
+
+my @utils =({fileName => "BldDocs"},
+	    {fileName => "CheckBc"},
+	    {fileName => "CheckRls"},
+	    {fileName => "InstCol2"},
+	    {fileName => "MBld"},
+	    {fileName => "MergeEnvironments"});
+
+my @modules =({fileName => "CatData.pm"},
+	      {fileName => "CheckBc.pm"},
+	      {fileName => "CleanEnv.pm"},
+	      {fileName => "Cleaner.pm"},
+	      {fileName => "CommandController.pm"},
+	      {fileName => "CopyRel.pm"},
+	      {fileName => "Crypt.pm"},
+	      {fileName => "Crypt/GPG.pm"},
+	      {fileName => "Crypt/PGP.pm"},
+	      {fileName => "EnvDb.pm"},
+	      {fileName => "EnvDifferencer.pm"},
+	      {fileName => "ExportData.pm"},
+	      {fileName => "GetEnv.pm"},
+	      {fileName => "IniData.pm"},
+	      {fileName => "MakeRel.pm"},
+	      {fileName => "MrpData.pm"},
+	      {fileName => "NotesCompiler.pm"},
+	      {fileName => "PathData.pm"},
+	      {fileName => "PathData/ComponentBased.pm"},
+	      {fileName => "PathData/ProjectBased.pm"},
+	      {fileName => "PrepRel.pm"},
+	      {fileName => "RelData.pm"},
+	      {fileName => "RelTransfer.pm"},
+	      {fileName => "RelTransfer/Export.pm"},
+	      {fileName => "RelTransfer/Import.pm"},
+	      {fileName => "RemoteSite.pm"},
+	      {fileName => "RemoteSite/FTP.pm"},
+	      {fileName => "RemoteSite/FTP/Proxy.pm"},
+	      {fileName => "RemoteSite/NetDrive.pm"},
+	      {fileName => "RemoteSite/NetDrive/MultiVolumeExport.pm"},
+	      {fileName => "RemoteSite/NetDrive/MultiVolumeImport.pm"},
+	      {fileName => "Symbian/CBR/ApplyDelta.pm"},
+	      {fileName => "Symbian/CBR/CreateDelta.pm"},
+	      {fileName => "TableFormatter.pm"},
+	      {fileName => "TableFormatter/Text.pm"},
+	      {fileName => "TableFormatter/Excel.pm"},
+	      {fileName => "TableFormatter/Csv.pm"},
+	      {fileName => "TableFormatter/Html.pm"},
+	      {fileName => "TableFormatter/Auto.pm"},
+	      {fileName => "Utils.pm"}
+	     );
+
+
+
+#
+# Globals.
+#
+
+my $docDir;
+my $devDocs = 0;
+my $verbose = 0;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+my $cwd = cwd;
+my $toolsdir = $FindBin::Bin;
+chdir $toolsdir or die "Error: Couldn't chdir to \"$toolsdir\": $!\n";
+ReadCaptions(\@commands);
+ReadCaptions(\@utils);
+ReadCaptions(\@modules);
+chdir $cwd or die "Error: Couldn't chdir to \"cwd\": $!\n";;
+Utils::MakeDir($docDir);
+chdir $docDir or die "Error: Couldn't chdir to \"$docDir\": $!\n";;
+BldIndex();
+BldDocs();
+chdir $cwd or die "Error: Couldn't chdir to \"cwd\": $!\n";;
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'd' => \$devDocs, 'v+' => \$verbose);
+
+  $docDir = shift @ARGV || $KDocDir;
+
+  unless (scalar(@ARGV) == 0) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  if ($help) {
+    Usage(0);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: blddocs [<documentation_directory>]
+
+options:
+
+-h  help
+-d  generate additional documentation relevent to development of the tools
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub BldIndex {
+  print "Generating index.html...\n";
+
+  open INDEX, ">index.html" or die "Couldn't open index.html for writing: $!\n";
+  $CGI::NO_DEBUG = 1;
+  $CGI::NO_DEBUG = 1;
+  my $cgi = new CGI;
+  print INDEX $cgi->start_html("LPD Release Tools Documentation");
+  print INDEX $cgi->h1("LPD Release Tools Documentation");
+  my $version = Utils::ToolsVersion();
+  print INDEX $cgi->h3("Version $version\n");
+
+  AddSection("Introduction", \@intro, *INDEX, $cgi);
+  AddSection("Command reference", \@commands, *INDEX, $cgi);
+  AddSection("Utilities", \@utils, *INDEX, $cgi);
+  AddSection("Implementation notes", \@modules, *INDEX, $cgi) if ($devDocs);
+
+  print INDEX $cgi->hr;
+  print INDEX $cgi->end_html();
+  close INDEX;
+}
+
+sub ReadCaptions {
+  my $list = shift;
+  foreach my $module (@$list) {
+    open (FILE, $module->{fileName}) or die "Error: Couldn't open $module->{fileName} for reading: $!\n";
+
+    # Search through file for name section.
+    while (<FILE>) {
+      if (/^=head1 NAME/) {
+	last;
+      }
+    }
+
+    # Read name section.
+    while (<FILE>) {
+      unless (/^\s*$/) {
+	(my $caption, my $comment) = split (/ - /, $_, 2);
+	die unless defined $caption and defined $comment;
+	$module->{caption} = $caption;
+	$module->{comment} = " - $comment";
+	last;
+      }
+    }
+
+    unless (exists $module->{caption}) {
+      $module->{caption} = "";
+      $module->{comment} = "";
+    }
+
+    close (FILE);
+  }
+}
+
+sub AddSection {
+  my $heading = shift;
+  my $list = shift;
+  local *INDEX = shift;
+  my $cgi = shift;
+
+  print INDEX $cgi->hr;
+  print INDEX $cgi->h2($heading);
+  foreach my $module (@$list) {
+    print INDEX $cgi->a({ -href => "$module->{fileName}.html" }, $module->{caption}), $module->{comment};
+    print INDEX $cgi->p("");
+  }
+}
+
+sub BldDocs {
+  BldList(\@intro);
+  BldList(\@commands);
+  BldList(\@utils);
+  BldList(\@modules) if ($devDocs);
+}
+
+sub BldList {
+  my $listRef = shift;
+
+  foreach my $item (@$listRef) {
+    my $itemMTime = Utils::FileModifiedTime("$toolsdir\\$item->{fileName}");
+    if ($itemMTime == 0 or not -e "$item->{fileName}.html" or $itemMTime > Utils::FileModifiedTime("$item->{fileName}.html")) {
+      my $dirName = dirname($item->{fileName});
+      unless (-e $dirName) {
+        eval {Utils::MakeDir($dirName)};
+        if ($@) {
+          die "Error: Couldn't make directory $docDir/$dirName : $@\n";
+        }
+      }
+      print "Generating $item->{fileName}.html...\n";
+      pod2html("--infile=$toolsdir\\$item->{fileName}", "--outfile=$item->{fileName}.html", "--title=$item->{fileName}");
+    }
+  }
+}
+
+
+=head1 NAME
+
+BldDocs - Builds this HTML documentation set from the POD in the Perl sources.
+
+=head1 SYNOPSIS
+
+  blddocs [<documentation_directory>]
+
+options:
+
+  -h  help
+  -d  generate additional documentation relevent to development of the tools
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Invokes C<pod2html> on each source file, and puts all the generated documentation files into a F<doc> directory. On subsequent calls only generates new html for source files that have been modified. Also generates the file F<doc\index.html> which contains a set of links to the other documentation files.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BldDocs.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BuildRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,219 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use MrpData;
+use CommandController;
+use Cwd;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $comp;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'BuildRel');
+my $envDb;
+my $buildall;
+my $noclean;
+my $dummyrun;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+BuildRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  my $ignore;
+  my $stdin;
+  GetOptions("h" => \$help, "v+" => \$verbose, "a" => \$buildall, "q" => \$noclean, "d" => \$dummyrun, "f" => \$ignore);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+
+  if (@ARGV) {
+    print "Error: too many arguments\n";
+    Usage(1);
+  } elsif ($buildall && $comp) {
+    print "Error: can't use -a with a component name\n";
+    Usage(1);
+  } elsif (!$buildall && !$comp) {
+    print "Error: Must specify -a or a component name\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: buildrel [options] -a | <component>
+
+options:
+
+-a                    build all pending release components
+-h                    help
+-f                    (deprecated)
+-v                    verbose output (-vv very verbose)
+-q                    quick (don't do \"abld reallyclean\")
+-d                    dummy run: just show what would happen\n");
+}
+
+sub BuildRel {
+  if ($buildall) {
+    BuildEnvironment();
+  } else {
+    BuildComp($comp);
+  }
+}
+
+# Implementation
+
+sub BuildComp {
+  my $comp = shift; # could accept a component name or an entry
+
+  print "Building \"$comp\"\n" if ($verbose);
+
+  print "Gathering data from MRP file...\n" if ($verbose>1);
+  my $mrpData = $envDb->GetMrpData($comp);
+  print "Working out build commands...\n" if ($verbose>1);
+  my $cwd = cwd();
+  my $nul = ($verbose > 2)?"":" > NUL";
+  my %commands_by_path;
+
+  foreach my $binset (@{$mrpData->BinSets()}) {
+    my $path = Utils::PrependSourceRoot($binset->{path});
+    unless ($commands_by_path{$path}) {
+      $commands_by_path{$path} = [ "bldmake bldfiles" ];
+      push @{$commands_by_path{$path}}, "abld reallyclean" unless $noclean;
+    }
+    push @{$commands_by_path{$path}}, "abld $binset->{test} build $binset->{plat} $binset->{var} $binset->{mmp}";
+  }
+
+  print "Running build commands...\n" if ($verbose>1);
+  foreach my $path (sort keys %commands_by_path) {
+    chdir($path);
+    my $cmds = $commands_by_path{$path};
+    foreach my $cmd (@$cmds) {
+      print "Build command: $cmd\n" if ($dummyrun || $verbose > 1);
+      next if $dummyrun;
+      open(CMD, "$cmd|") or die "Couldn't start command \"$_\" because $!";
+      my $output = "";
+      my $failure = 0;
+      while (<CMD>) {
+        print $_ if $verbose > 2;
+        $failure = 1 if m/fatal error/i;
+        $output .= $_;
+      }
+      close CMD;
+      die "Error: build failed. Command \"$cmd\" in directory \"$path\" failed with error code $? and output:\n$output\n\n" if ($? || $failure);
+      # ABLD currently doesn't pass through error codes. I have requested
+      # that it be modified to do so.
+    }
+  }
+  chdir $cwd;
+}
+
+sub BuildEnvironment {
+  foreach my $comp (keys %{$envDb->{db}}) {
+    next unless $envDb->Status($comp) == EnvDb::STATUS_PENDING_RELEASE;
+    BuildComp($comp);
+  }
+}
+
+
+__END__
+
+=head1 NAME
+
+BuildRel - Attempt to build a component.
+
+=head1 SYNOPSIS
+
+  buildrel [options] -a | <component>
+
+options:
+
+  -a                    build all components pending release
+  -h                    help
+  -v                    verbose output (-vv  very verbose)
+  -q                    quick (don't do abld reallyclean)
+  -d                    dummy run: just show what would happen
+
+=head1 DESCRIPTION
+
+Attempts to build a component, using all the platforms listed in the
+MRP file. Using -a will build all the components that are pending
+release.
+
+The -d option doesn't do any building. However, in the process of
+reading the details from the MRP it may be forced to run commands
+such as C<bldmake bldfiles> and C<abld makefile>.
+
+The commands this script runs are:
+
+  bldmake bldfiles
+  abld reallyclean (unless you're using -q)
+  abld build XXX XXX (or abld test build XXX XXX)
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/BuildRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CatData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,192 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package CatData;
+
+use strict;
+use Data::Dumper;
+use MrpData;
+use PathData;
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+
+  my $iniData = shift;
+  my $fileToWriteTo = shift;
+  my $mrpData = shift;
+  my $category = shift;
+  
+  $self->{data}->{category} = $category;
+
+  foreach my $exportfile (keys %{$mrpData->ExportInfoForCat($category)}) {
+    my $destination = $mrpData->ExportSourceFileInfoForCat($category, $exportfile);
+
+    # Consider any mappings if defined in the reltools.ini file
+    if($iniData->HasMappings()){
+      $destination = $iniData->PerformReverseMapOnFileName($destination);
+      $destination = Utils::RemoveSourceRoot($destination);
+    }
+    $self->{data}->{exportinfo}->{$exportfile} = $destination;
+  }
+  
+  # Used to write infomation store to to file named $fileToWriteTo
+  $self->WriteToFile($fileToWriteTo);
+}
+
+sub Open {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{iniData} = shift;
+  $self->{comp} = shift;
+  $self->{ver} = shift;
+  $self->{category} = shift;
+  $self->ReadFromFile();
+  return $self;
+}
+
+sub Category {
+  my $self = shift;
+  die unless exists $self->{data}->{category};
+  return $self->{data}->{category};
+}
+
+sub ExportInfo {
+  my $self = shift;
+  die unless exists $self->{data}->{exportinfo};
+  return $self->{data}->{exportinfo};
+}
+
+sub ExportSource {
+  my $self = shift;
+  my $destination = shift;
+  die unless exists $self->{data}->{exportinfo}->{$destination};
+  return $self->{data}->{exportinfo}->{$destination};
+}
+
+#
+# Private.
+#
+
+sub WriteToFile {
+  my $self = shift;
+  my $fileToWriteTo = shift;
+  
+  if (-e $fileToWriteTo) {
+    Utils::SetFileWritable($fileToWriteTo);
+  }
+  open (OUT, ">$fileToWriteTo") or die "Error: Couldn't open \"$fileToWriteTo\" for writing: $!\n";
+  print OUT Data::Dumper->Dump([$self->{data}], ['self->{data}']);
+  close (OUT);
+  Utils::SetFileReadOnly($fileToWriteTo);
+}
+
+sub ReadFromFile {
+  my $self = shift;
+  my $category = $self->{category};
+  my $pathData = $self->{iniData}->PathData;
+  my $comp = $self->{comp};
+  my $ver = $self->{ver};
+  
+  my $relDir = $pathData->LocalArchivePathForExistingComponent($comp, $ver);
+  die "Error: \"$comp $ver\" does not exist\n" unless $relDir;
+  if (!-e "$relDir\\exports$category.txt") {
+    print "Info: Can't find \"$relDir\\exports$category.txt\" \"$comp $ver\" is an incompatible release\n";
+  }
+  else{
+    $self->{project} = $pathData->ComponentProject($comp, $ver);
+    unless (-e $relDir) {
+      die "Error: $comp $ver does not exist\n";
+    }
+    my $file = "$relDir\\exports$category.txt";
+
+    open (IN, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
+    local $/ = undef;
+    my $data = <IN>;
+    die "Error: Reldata in \"$relDir\" is blank" unless $data =~ (m/\S/);
+    eval ($data) or die "Error: Couldn't parse reldata in \"$relDir\"\n";
+    close (IN);
+  }
+}
+
+1;
+
+=head1 NAME
+
+CatData.pm - Provides an interface to data associated with categories for a release.
+
+=head1 DESCRIPTION
+
+Stores the source and export location of export files in a release. All information is stored in a single file named F<catdata> within the release directory using the module Data::Dumper.
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a new C<CatData> object and corresponding data file. Expects to be passed a filename to write to, a C<MrpData> reference, and a category.
+
+=head2 Open
+
+Creates a C<CatData> object from an existing data file. Expects to be passed an C<IniData> reference, a component name, a version and a category.
+
+=head2 Category
+
+Returns the category value.
+
+=head2 ExportInfo
+
+Returns the exportinfo.
+
+=head2 ExportSource
+
+Expects an export destination. Returns the export source location.
+
+=head2 WriteToFile
+
+Expects to be passed a filename which is used to write a F<catdata>.
+
+=head2 ReadFromFile
+
+Enables a F<catdata> file to be read so that all infomation contained can be read.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CheckBc	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,307 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+require 5.006_001;
+use strict;
+use FindBin;
+use Pod::Usage;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use CheckBc;
+
+$|++;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  my $verbose;
+  my @additionalHeaders;
+  my @additionalIncludePaths;
+  my @ignoreClasses;
+  my $ignoreR3Unused = 0;
+  my $whichChecks = { noClassSize => 0, noDef => 0, noVtable => 0 };
+  GetOptions('h' => \$help, 'v+' => \$verbose, 'c' => \$whichChecks->{noClassSize}, 'd' => \$whichChecks->{noDef}, 't' => \$whichChecks->{noVtable}, 'header=s' => \@additionalHeaders, 'include=s' => \@additionalIncludePaths, 'ignore=s' => \@ignoreClasses, 'ignoreR3UNUSED+' => \$ignoreR3Unused);
+
+  if ($help) {
+    Usage($verbose);
+  }
+
+  my $allNo = 1;
+  foreach my $thisCheck (keys %{$whichChecks}) {
+    unless ($whichChecks->{$thisCheck}) {
+      $allNo = 0;
+      last;
+    }
+  }
+  if ($allNo) {
+    print "\nError: Specified options have disabled all the checks\n\n";
+    Usage();
+  }
+
+  if (scalar(@ARGV) == 1) {
+    my $descriptionFile = shift @ARGV;
+    HandleDescriptionFile($descriptionFile, $ignoreR3Unused, $whichChecks, $verbose);
+  }
+  elsif (scalar(@ARGV) == 2) {
+    my $bldInfDir1 = shift @ARGV;
+    my $bldInfDir2 = shift @ARGV;
+    HandleBldInfPair($bldInfDir1, $bldInfDir2, \@additionalHeaders, \@additionalIncludePaths, \@ignoreClasses, $ignoreR3Unused, $whichChecks, $verbose);
+  }
+  else {
+    print "Error: Invalid arguments\n";
+    Usage();
+  }
+}
+
+sub Usage {
+  my $verbose = shift;
+  if ($verbose) {
+    system("perldoc $0");
+  }
+  else {
+    pod2usage(-verbose => 1);
+  }
+  die ("\n");
+}
+
+sub HandleBldInfPair {
+  my $bldInfDir1 = shift;
+  my $bldInfDir2 = shift;
+  my $additionalHeaders = shift;
+  my $additionalIncludePaths = shift;
+  my $ignoreClasses = shift;
+  my $ignoreR3Unused = shift;
+  my $whichChecks = shift;
+  my $verbose = shift;
+  my $checkBc = CheckBc->New($bldInfDir1, $bldInfDir2, $verbose, undef, $additionalHeaders, $additionalIncludePaths, $ignoreClasses, $ignoreR3Unused);
+  if (DoCheck($checkBc, $whichChecks)) {
+    print "Check passed\n";
+  }
+  else {
+    print "Check failed\n";
+  }
+}
+
+sub HandleDescriptionFile {
+  my $descriptionFile = shift;
+  my $ignoreR3Unused = shift;
+  my $whichChecks = shift;
+  my $verbose = shift;
+  open (DESC, $descriptionFile) or die "Error: Couldn't open \"$descriptionFile\": $!\n";
+  my $lineNum = 0;
+  while (my $thisLine = <DESC>) {
+    ++$lineNum;
+    chomp $thisLine;
+    $thisLine =~ s/^\s*$//;
+    $thisLine =~ s/#.*//;
+    next if ($thisLine eq '');
+    $thisLine =~ s/^\s+//;
+    @ARGV = split (/\s+/, $thisLine);
+    my @additionalHeaders;
+    my @additionalIncludePaths;
+    my @ignoreClasses;
+    GetOptions('header=s' => \@additionalHeaders, 'include=s' => \@additionalIncludePaths, 'ignore=s' => \@ignoreClasses);
+    my $component = shift @ARGV;
+    my $bldInfDir1 = shift @ARGV;
+    my $bldInfDir2 = shift @ARGV;
+    unless ($component and $bldInfDir1 and $bldInfDir2) {
+      die "Error: Invalid line in $descriptionFile($lineNum)\n";
+    }
+    print "=== $component\n";
+    eval {
+      my $checkBc = CheckBc->New($bldInfDir1, $bldInfDir2, $verbose, $component, \@additionalHeaders, \@additionalIncludePaths, \@ignoreClasses, $ignoreR3Unused);
+      if (DoCheck($checkBc, $whichChecks)) {
+	print "=== $component passed ===\n";
+      }
+      else {
+	print "=== $component failed ===\n";
+      }
+    };
+    if ($@) {
+      print $@;
+      print "===\n";
+    }
+  }
+  close (DESC);
+}
+
+sub DoCheck {
+  my $checkBc = shift;
+  my $whichChecks = shift;
+  my $passed = 1;
+  unless ($whichChecks->{noDef}) {
+    unless ($checkBc->CheckDefFiles() and $passed) {
+      $passed = 0;
+    }
+  }
+  unless ($whichChecks->{noClassSize}) {
+    unless ($checkBc->CheckClassSizes() and $passed) {
+      $passed = 0;
+    }
+  }
+  unless ($whichChecks->{noVtable}) {
+    unless ($checkBc->CheckVTables() and $passed) {
+      $passed = 0;
+    }
+  }
+  return $passed;
+}
+
+__END__
+
+=head1 NAME
+
+CheckBc - Runs some simple tests to see if one component source tree is backwards compatible another.
+
+=head1 SYNOPSIS
+
+  checkbc [options] (<bld_inf_dir_1> <bld_inf_dir_2>) | <description_file>
+
+Options:
+
+  -h  help
+  -c  don't check class sizes
+  -d  don't check def files
+  -t  don't check vtables
+  -v  verbose output (-vv very verbose)
+
+Additional options for use on a per component basis:
+
+  --ignoreR3UNUSED
+  --ignore  <class_to_ignore>
+  --header  <additional_header_file>
+  --include <additional_include_path>
+
+=head1 DESCRIPTION
+
+C<CheckBc> is a tool that attempts to discover if one release of a component has broken backwards compatibility with another. It is currently able to perform the following checks:
+
+=over 4
+
+=item 1
+
+Compares the ARM F<.def> files to ensure that only new lines have been added to the end of the file.
+
+=item 2
+
+Compares the sizes of any classes that have an exported C++ constructor. This is done by compiling some generated C++ code that uses the C<sizeof> operator to print the relevant class sizes to C<STDOUT>.
+
+=item 3
+
+Compares the v-table layouts of any classes that have an exported C++ constructor. This is done by compiling each source code set to ARM4 assembler listings, comparing the v-table sections.
+
+=back
+
+There are two ways of envoking C<CheckBc>:
+
+=over 4
+
+=item 1 By specifying a pair of F<bld.inf> directories
+
+Given the location of two F<bld.inf> files (say, C<bld_inf_1> and C<bld_inf_2>), C<CheckBc> attempts to discover if the source code referred by by C<bld_inf_2> is backwards compatible with C<bld_inf_1>.
+
+=item 2 By specifying a list of F<bld.inf> directory pairs in a text file
+
+The text file must have the following line format:
+
+  <component_name>  <bld_inf_dir_1>  <bld_inf_dir_2> [options]
+
+Any text following a 'C<#>' character will be ignored.
+
+=back
+
+Using either invokation method, the following options can be specified as many times as required:
+
+=over 4
+
+=item * --ignoreR3UNUSED
+
+Indicates that differences between F<.def> files relating to the R3UNUSED export stub optimisation should be ignored.
+
+=item * --header <additional_header>
+
+Specifies an additional #include statement to be included in the generated C++. This option can be used to get headers that don't include all the headers they need to compile. Common headers are automatically included (e32std.h, e32def.h and e32base.h), but occasionally others are also required.
+
+=item * --include <additional_include_path>
+
+Specifies an additional path that the pre-processor should use to find header files.
+
+=item * --ignore <class_to_ignore>
+
+Specifies the name of a class that should be ignored from a class size point of view. This option can be useful if components release librarys that are intended for debugging purposes only and so are not required to maintain backwards compatibility.
+
+=back
+
+=head1 LIMITATIONS
+
+=over 4
+
+=item 1
+
+The component's headers must compile using Microsoft's Visual C++ compiler.
+
+=item 2
+
+The component's exported headers must compile when they are all #include'd into a single F<.cpp> file. If this isn't the case, then the C<--header> option can be used to add additional headers.
+
+=item 3
+
+Declarations of the component's exported C++ constructors must be found in one of the exported headers.
+
+=item 4
+
+F<.def> file lines are expected to be identical. This can lead to checks failing falsely because, for example, the name of a function may be changed without breaking BC provided the F<.def> file is carefully edited.
+
+=item 5
+
+The components must compile as ARM4. This is likely to mean that each set of source code needs to be accompanied with a suitable F<\epoc32> tree that allows it to be built. The simplest way to acheive this is to prepare a pair of subst'd drives.
+
+=back
+
+=head1 KNOWN BUGS
+
+F<bld.inf>, F<.mmp> and F<.def> file parsing is probably not as industrial strength as it should be.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CheckBc.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CheckBc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1032 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+
+package CheckBc;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  my $bldInfDir1 = shift;
+  my $bldInfDir2 = shift;
+  Utils::AbsoluteFileName(\$bldInfDir1);
+  Utils::AbsoluteFileName(\$bldInfDir2);
+  $self->{verbose} = shift;
+  $self->{compName} = shift;
+  $self->{additionalHeaders} = shift;
+  $self->{additionalIncludePaths} = shift;
+  my $ignoreClasses = shift;
+  foreach my $thisClass (@$ignoreClasses) {
+    $self->{ignoreClasses}->{$thisClass} = 1;
+  }
+  $self->{ignoreR3Unused} = shift;
+  $self->{bldInf1} = BldInf->New($bldInfDir1, $self->{verbose});
+  $self->{bldInf2} = BldInf->New($bldInfDir2, $self->{verbose});
+  return $self;
+}
+
+sub CheckAll {
+  my $self = shift;
+  my $passed = 1;
+  unless ($self->CheckDefFiles()) {
+    $passed = 0;
+  }
+  unless ($self->CheckClassSizes()) {
+    $passed = 0;
+  }
+  unless ($self->CheckVTables()) {
+    $passed = 0;
+  }
+  return $passed;
+}
+
+sub CheckDefFiles {
+  my $self = shift;
+  return $self->{bldInf1}->CheckDefFiles($self->{bldInf2}, $self->{ignoreR3Unused});
+}
+
+sub CheckClassSizes {
+  my $self = shift;
+  my $classSizes1 = $self->GetClassSizes($self->{bldInf1});
+  my $classSizes2 = $self->GetClassSizes($self->{bldInf2});
+  return $classSizes1->Check($classSizes2);
+}
+
+sub CheckVTables {
+  my $self = shift;
+  my $vtable1 = $self->GetVTable($self->{bldInf1});
+  my $vtable2 = $self->GetVTable($self->{bldInf2});
+  return $vtable1->Check($vtable2);
+}
+
+
+#
+# Private.
+#
+
+sub GetClassSizes {
+  my $self = shift;
+  my $bldInf = shift;
+  my $constructorsToCheck = $self->GetConstructorsToCheck($bldInf->ListConstructors());
+  my @headers;
+  if ($self->{additionalHeaders}) {
+    push (@headers, @{$self->{additionalHeaders}});
+  }
+  foreach my $thisExport (@{$bldInf->ListExports()}) {
+    if ($thisExport =~ /\.h$/i) {
+      push (@headers, $thisExport);
+    }
+  }
+  my $includes = $bldInf->ListIncludes();
+  if ($self->{additionalIncludePaths}) {
+    push (@$includes, @{$self->{additionalIncludePaths}});
+  }
+  return ClassSize->New($constructorsToCheck, \@headers, $includes, $self->{verbose}, $self->{compName}, $bldInf->{dir});
+}
+
+sub GetVTable {
+  my $self = shift;
+  my $bldInf = shift;
+  my $constructorsToCheck = $self->GetConstructorsToCheck($bldInf->ListConstructors());
+  return VTable->New($bldInf->{dir}, $constructorsToCheck, $self->{verbose});
+}
+
+sub GetConstructorsToCheck {
+  my $self = shift;
+  my $constructors = shift;
+  my @constructorsToCheck;
+  foreach my $thisConstructor (@$constructors) {
+    unless (exists $self->{ignoreClasses}->{$thisConstructor}) {
+      push (@constructorsToCheck, $thisConstructor);
+    }
+  }
+  return \@constructorsToCheck;
+}
+
+
+#
+# BldInf
+#
+
+package BldInf;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{dir} = shift;
+  $self->{verbose} = shift;
+  $self->Parse();
+  return $self;
+}
+
+sub CheckDefFiles {
+  my $self = shift;
+  my $other = shift;
+  my $ignoreR3Unused = shift;
+  my $passed = 1;
+  foreach my $thisMmp (keys %{$self->{mmps}}) {
+    if (exists $other->{mmps}->{$thisMmp}) {
+      unless ($self->{mmps}->{$thisMmp}->CheckDefFile($other->{mmps}->{$thisMmp}, $ignoreR3Unused)) {
+	$passed = 0;
+      }
+    }
+    else {
+      print "Mmp file \"$thisMmp\" missing for bld.inf \"$other->{dir}\"\n";
+      $passed = 0;
+    }
+  }
+  return $passed;
+}
+
+sub ListConstructors {
+  my $self = shift;
+  my @constructors = ();
+  foreach my $thisMmp (keys %{$self->{mmps}}) {
+    push (@constructors, @{$self->{mmps}->{$thisMmp}->ListConstructors()});
+  }
+  return \@constructors;
+}
+
+sub ListExports {
+  my $self = shift;
+  if (exists $self->{exports}) {
+    return $self->{exports};
+  }
+  return [];
+}
+
+sub ListIncludes {
+  my $self = shift;
+  my %includes = ();
+  foreach my $thisMmp (keys %{$self->{mmps}}) {
+    foreach my $thisInclude (@{$self->{mmps}->{$thisMmp}->ListIncludes()}) {
+      $includes{$thisInclude} = 1;
+    }
+  }
+  my @includes = keys %includes;
+  return \@includes;
+}
+
+
+#
+# Private.
+#
+
+sub Parse {
+  my $self = shift;
+  if ($self->{verbose}) {  print "Parsing $self->{dir}\\bld.inf...\n"; }
+  Utils::PushDir($self->{dir});
+  my $fullName = "$self->{dir}\\bld.inf";
+  unless (open (BLDINF, "cpp -DARM -DMARM $fullName|")) {
+    Utils::PopDir();
+    die "Error: Couldn't open \"cpp -DARM -DMARM $fullName\": $!\n";
+  }
+  my $foundMmps = 0;
+  my $foundExports = 0;
+  my $doDie = 0;
+  my $currentDir = $self->{dir};
+  while (my $line = <BLDINF>) {
+    if ($line =~ /^# \d+ "(.*)" \d+?/) {
+	my $newFile = $1;
+	$newFile =~ s/\\\\/\\/g;
+	$newFile =~ s/\\$//;
+	Utils::AbsoluteFileName(\$newFile);
+	($currentDir) = Utils::SplitFileName($newFile);
+	next;
+      }
+    if ($line =~ /^#/ or $line =~ /^\s*$/) {	
+	# Ignore lines starting with '#' or those filled with white space.
+	next;
+      }
+    chomp $line;
+
+    if ($line =~ /PRJ_MMPFILES/i) {
+      $foundMmps = 1;
+      $foundExports = 0;
+      next;
+    }
+    elsif ($line =~ /PRJ_EXPORTS/i) {
+      $foundMmps = 0;
+      $foundExports = 1;
+      next;
+    }
+    elsif ($line =~ /PRJ_/i) {
+      $foundMmps = 0;
+      $foundExports = 0;
+      next;
+    }
+    if ($foundMmps) {
+      if ($line =~ /makefile\s+(\S+)/i) {
+	if ($self->{verbose}) { print "Info: \"makefile $1\" found in \"$self->{dir}\\bld.inf\", ignoring.\n"; }
+	next;
+      }
+
+      $line =~ /\s*(\S+)/;
+      my $mmpName = lc($1);
+      if (not $mmpName =~ /\.mmp$/) {
+	$mmpName .= '.mmp';
+      }
+      unless (-e $mmpName) {
+	if (-e "$currentDir\\$mmpName") {
+	  $mmpName = "$currentDir\\$mmpName";
+	}
+	elsif (-e "$self->{dir}\\$mmpName") {
+	  $mmpName = "$self->{dir}\\$mmpName";
+	}
+	else {
+	  print "Warning: Couldn't find location of \"$mmpName\n";
+	  next;
+	}
+      }
+      Utils::AbsoluteFileName(\$mmpName);
+      (my $path, my $name, my $ext) = Utils::SplitFileName($mmpName);
+      eval {
+	$self->{mmps}->{lc("$name$ext")} = Mmp->New($mmpName, $self->{verbose});
+      };
+      if ($@) {
+	$doDie = 1;
+	print "$@";
+      }
+      next;
+    }
+    elsif ($foundExports) {
+      my $thisExport;
+      if ($line =~  /^\s*\"([^\"]*)/) {
+	$thisExport = $1;
+      }
+      elsif ($line =~ /\s*(\S+)/) {
+	$thisExport = $1;
+      }
+      else {
+	die;
+      }
+      unless (-e $thisExport) {
+	if (-e "$currentDir\\$thisExport") {
+	  $thisExport = "$currentDir\\$thisExport";
+	}
+	elsif (-e "$self->{dir}\\$thisExport") {
+	  $thisExport = "$self->{dir}\\$thisExport";
+	}
+	else {
+	  print "Warning: Couldn't find location of \"$thisExport\n";
+	  next;
+	}
+      }
+      Utils::AbsoluteFileName(\$thisExport);
+      push (@{$self->{exports}}, $thisExport);
+    }
+  }
+  close (BLDINF);
+  Utils::PopDir();
+  if ($doDie) {
+    die "Aborting due to above errors\n";
+  }
+}
+
+
+#
+# Mmp
+#
+
+package Mmp;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{name} = shift;
+  $self->{verbose} = shift;
+  $self->Parse();
+  return $self;
+}
+
+sub CheckDefFile {
+  my $self = shift;
+  my $other = shift;
+  my $ignoreR3Unused = shift;
+  if ($self->{def}) {
+    return $self->{def}->Check($other->{def}, $ignoreR3Unused);
+  }
+  return 1;
+}
+
+sub ListConstructors {
+  my $self = shift;
+  if ($self->{def}) {
+    return $self->{def}->ListConstructors();
+  }
+  return [];
+}
+
+sub ListIncludes {
+  my $self = shift;
+  if (exists $self->{includes}) {
+    my @includes = keys %{$self->{includes}};
+    return \@includes;
+  }
+  return [];
+}
+
+
+#
+# Private.
+#
+
+sub Parse {
+  my $self = shift;
+  if ($self->{verbose}) {  print "Parsing $self->{name}...\n"; }
+  (my $path) = Utils::SplitFileName($self->{name});
+  $path =~ s/(.*)\\.*/$1/; # Extract path.
+  Utils::PushDir($path);
+  unless (open (MMP, "cpp -DARM -DMARM $self->{name}|")) {
+    Utils::PopDir();
+    die "Error: Couldn't open \"cpp -DARM -DMARM $self->{name}\": $!\n";
+  }
+  my $noStrictDef = 0;
+  my $targetType = '';
+  while (my $line = <MMP>) {
+    if ($line =~ /^#/ or $line =~ /^\s*$/) {	
+	# Ignore lines starting with '#' or those filled with white space.
+	next;
+      }
+    chomp $line;
+    if ($line =~ /^\s*targettype\s+(\S*)\s*$/i) {
+	$targetType = $1;
+    }
+    elsif ($line =~ /^\s*deffile\s+(\S*)\s*$/i) {
+      die if exists $self->{defFileName};
+      $self->{defFileName} = $1;
+    }	 
+    elsif ($line =~ /nostrictdef/i) {
+      $noStrictDef = 1;
+    }
+    elsif ($line =~ /^\s*userinclude\s+(.+)/i) {
+      my @userIncludes = split (/\s+/, $1);
+      foreach my $thisUserInclude (@userIncludes) {
+	$thisUserInclude =~ s/\+/$ENV{EPOCROOT}epoc32/;
+	Utils::AbsoluteFileName(\$thisUserInclude);
+	$self->{includes}->{lc($thisUserInclude)} = 1;
+      }
+    }
+    elsif ($line =~ /^\s*systeminclude\s+(.+)/i) {
+      my @systemIncludes = split (/\s+/, $1);
+      foreach my $thisSystemInclude (@systemIncludes) {
+	$thisSystemInclude =~ s/\+/$ENV{EPOCROOT}epoc32/;
+	Utils::AbsoluteFileName(\$thisSystemInclude);
+	$self->{includes}->{lc($thisSystemInclude)} = 1;
+      }
+    }
+  }
+  close (MMP);
+
+  if ($targetType =~ /^(app|ani|ctl|ctpkg|epocexe|exe|exedll|fsy|kdll|kext|klib|ldd|lib|ecomiic|mda|mdl|notifier|opx|pdd|pdl|rdl|var|wlog)$/i) {
+    # Don't bother looking for the deffile.
+    Utils::PopDir();
+    return;
+  }
+  
+  (my $mmpPath, my $mmpBase) = Utils::SplitFileName($self->{name});
+  if (exists $self->{defFileName}) {
+    (my $path, my $base, my $ext) = Utils::SplitFileName($self->{defFileName});
+    if ($base eq '') {
+      $base = $mmpBase;
+    }
+    if ($ext eq '') {
+      $ext = '.def';
+    }
+    if ($path eq '') {
+      $path = $mmpPath;
+    }
+    unless ($noStrictDef) {
+      $base .= 'u';
+    }
+    unless (-e "$path$base$ext") {
+      $path = "$path..\\bmarm\\";
+    }
+    unless (-e "$path$base$ext") {
+      $path = $mmpPath . $path;
+    }
+    $self->{defFileName} = "$path$base$ext";
+    Utils::AbsoluteFileName(\$self->{defFileName});
+  }
+  else {
+    # Assume default.
+    $self->{defFileName} = $mmpBase;
+    unless ($noStrictDef) {	
+      $self->{defFileName} .= 'u';
+    }
+    $self->{defFileName} .= '.def';
+    $self->AddDefaultDefFilePath();
+  }
+
+  if ($self->{defFileName}) {
+    $self->{def} = Def->New($self->{defFileName}, $self->{verbose});
+  }
+
+  Utils::PopDir();
+}
+
+sub AddDefaultDefFilePath {
+  my $self = shift;
+  (my $path) = Utils::SplitFileName($self->{name});
+  $self->{defFileName} = "$path\\..\\bmarm\\$self->{defFileName}";
+  if (-e $self->{defFileName}) {
+    Utils::AbsoluteFileName(\$self->{defFileName});
+  }
+  else {
+    print "Warning: Unable to find def file in \"$self->{name}\"\n";
+    delete $self->{defFileName};
+  }
+}
+
+
+#
+# Def
+#
+
+package Def;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{name} = shift;
+  $self->{verbose} = shift;
+  $self->Parse();
+  $self->DemangleNames();
+  return $self;
+}
+
+sub Check {
+  my $self = shift;
+  my $other = shift;
+  my $ignoreR3Unused = shift;
+  if ($self->{verbose}) { print "Checking DEF file \"$self->{name}\" against \"$other->{name}\"...\n"; }
+  my $passed = 1;
+  if (exists $self->{data}) {
+    for (my $ii = 0; $ii < scalar(@{$self->{data}}); ++$ii) {
+      my $ordinal = $ii + 1;
+      if ($ii >= scalar @{$other->{data}}) {
+	print "Failure reason: \"$self->{name}\" has more exports than \"$other->{name}\"\n";
+	$passed = 0;
+	last;
+      }
+      my $selfRaw = $self->{data}->[$ii]->{raw};
+      my $otherRaw = $other->{data}->[$ii]->{raw};
+      if ($ignoreR3Unused) {
+	$selfRaw =~ s/R3UNUSED //;
+	$otherRaw =~ s/R3UNUSED //;
+      }
+      unless ($selfRaw eq $otherRaw) {
+	$passed = 0;
+	print "Failure reason: Def file mismatch between \"$self->{name}\" and \"$other->{name}\" at $ordinal\n";
+	if ($self->{verbose}) {
+	  print "\t$self->{data}->[$ii]->{raw}\n\t$other->{data}->[$ii]->{raw}\n";
+	}
+      }
+    }
+  }
+  return $passed;
+}
+
+sub ListConstructors {
+  my $self = shift;
+  my @constructors = ();
+  if (exists $self->{data}) {
+    my $ordinal = 0;
+    foreach my $thisEntry (@{$self->{data}}) {
+      $ordinal++;
+      die unless (exists $thisEntry->{function});
+      if ($thisEntry->{function} =~ /(.+)::(.+)\(/) {
+	if ($1 eq $2) {
+	  push (@constructors, $1);
+	}
+      }
+    }
+  }
+  return \@constructors;
+}
+
+
+#
+# Private.
+#
+
+sub Parse {
+  my $self = shift;
+  open (DEF, $self->{name}) or die "Error: Couldn't open \"$self->{name}\" for reading: $!\n";
+  my $lineNum = 0;
+  while (my $thisLine = <DEF>) {
+    ++$lineNum;
+    chomp $thisLine;
+    if ($thisLine =~ /^(EXPORTS|;|\s*$)/) {
+      next;
+    }
+	my $entry = {};
+    $entry->{raw} = $thisLine;
+	     
+    push (@{$self->{data}}, $entry);
+  }
+      close (DEF);
+}
+
+sub DemangleNames {
+  my $self = shift;
+  open (FILT, "type $self->{name} | c++filt |") or die "Error: Couldn't open \"type $self->{name} | c++filt |\": $!\n";
+  my $lineNum = 0;
+  while (my $line = <FILT>) {
+    ++$lineNum;
+    chomp $line;
+    next if ($line =~ /^(EXPORT|;|\s*$)/);
+    if ($line =~ /^\s+(\"(.+)\"|(.+)) @ (\d+)/) {
+      my $function;
+      if ($2) {
+	$function = $2;
+      }
+      else {
+	die unless $3;
+	$function = $3;
+      }
+      my $ordinal = $4;
+      $self->{data}->[$ordinal - 1]->{function} = $function;
+    }
+    else {
+      die "Error: Unable to parse c++filt output for \"$self->{name}\" at line $lineNum\n";
+    }
+  }
+  close (FILT);
+}
+
+
+#
+# ClassSize
+#
+
+package ClassSize;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{classes} = shift;
+  $self->{headers} = shift;
+  $self->{includes} = shift;
+  $self->{verbose} = shift;
+  $self->{compName} = shift;
+  $self->{bldInfDir} = shift;
+  if (scalar @{$self->{classes}} > 0) {
+    $self->GetClassSizes();
+  }
+  return $self;
+}
+
+sub Check {
+  my $self = shift;
+  my $other = shift;
+  if ($self->{verbose}) { print "Comparing class sizes of \"$self->{bldInfDir}\" against \"$other->{bldInfDir}\"..\n"; }
+  my $passed = 1;
+  foreach my $thisClass (keys %{$self->{classSizes}}) {
+    if ($self->{verbose}) { print "Examining class sizes of \"$thisClass\"...\n"; }
+    unless (exists $other->{classSizes}->{$thisClass}) {
+      print "Failure reason: \"$thisClass\" not found (possibly renamed)\n";
+      $passed = 0;
+      next;
+    }
+    unless ($self->{classSizes}->{$thisClass} == $other->{classSizes}->{$thisClass}) {
+      $passed = 0;
+      print "Failure reason: Class \"$thisClass\" has changed size from $self->{classSizes}->{$thisClass} to $other->{classSizes}->{$thisClass}\n";
+    }
+  }
+  return $passed;
+}
+
+
+#
+# Private.
+#
+
+sub GetClassSizes {
+  my $self = shift;
+  eval {
+    $self->GenerateCode();
+    $self->CompileCode();
+    $self->GetOutput();
+  };
+  $self->CleanUp();
+  if ($@) {
+    die $@;
+  }
+}
+
+sub GenerateCode {
+  my $self = shift;
+  open (CODE, '>__ClassSize.cpp') or die "Error: Couldn't open \"__ClassSize.cpp\" for writing: $!\n";
+  print CODE "#include <stdio.h>\n";
+  print CODE "#include <e32std.h>\n";
+  print CODE "#include <e32def.h>\n";
+  print CODE "#include <e32base.h>\n";
+  foreach my $thisHeader (@{$self->{headers}}) {
+    print CODE "#include <$thisHeader>\n";
+  }
+  print CODE "int main(int argc, char* argv[]) {\n";
+  foreach my $thisClass (@{$self->{classes}}) {
+    print CODE "\tprintf(\"$thisClass\\t%d\\n\", sizeof($thisClass));\n";
+  }
+  print CODE "\treturn 0; }\n";
+  close (CODE);
+}
+
+sub CompileCode {
+  my $self = shift;
+  my $command = 'cl ';
+  foreach my $thisInclude (@{$self->{includes}}) {
+    $command .= " /I$thisInclude";
+  }
+  $command .= " /D__VC32__ /D__WINS__ /D__SYMBIAN32__ /DWIN32 /D_WINDOWS /D_UNICODE __ClassSize.cpp";
+  unless ($self->{verbose}) {
+    $command .= ' /nologo 2>&1 > NUL';
+  }
+  if (system ($command)) {
+    if (exists $self->{compName} and $self->{compName}) {
+      rename ("__ClassSize.cpp", "$self->{compName}.cpp");
+    }
+    else {
+      rename ("__ClassSize.cpp", "unknown.cpp");
+    }
+    die "Error: Problem executing \"$command\"\n";
+  }
+}
+
+sub GetOutput {
+  my $self = shift;
+  open (OUTPUT, '__ClassSize.exe|') or die "Error: Couldn't run \"__ClassSize.exe\": $!\n";
+  while (my $thisLine = <OUTPUT>) {
+    chomp $thisLine;
+    next if ($thisLine =~ /^\s*$/);
+    if ($thisLine =~ /^(\S+)\t(\d+)$/) {
+      $self->{classSizes}->{$1} = $2;
+    }
+    else {
+      die "Error: Problem parsing output of \"__ClassSize.exe\"\n";
+    }
+  }
+  close (OUTPUT);
+}
+
+sub CleanUp {
+  my $self = shift;
+  DeleteFile('__ClassSize.cpp');
+  DeleteFile('__ClassSize.obj');
+  DeleteFile('__ClassSize.exe');
+}
+
+sub DeleteFile {
+  my $file = shift;
+  if (-e $file) {
+    unlink ($file) or die "Error: Couldn't delete \"$file\"\n";
+  }
+}
+
+
+#
+# VTable
+#
+
+package VTable;
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{bldInfDir} = shift;
+  my $classes = shift;
+  foreach my $class (@$classes) {
+    $self->{classes}->{$class} = 1;
+  }
+  $self->{verbose} = shift;
+
+  Utils::PushDir($self->{bldInfDir});
+  eval {
+    $self->BuildAssemblerListings();
+    $self->ParseAssemblerListings();
+    $self->DeleteAssemblerListings();
+    };
+  Utils::PopDir();
+  if ($@) {
+    die $@;
+  }
+  return $self;
+}
+
+sub Check {
+  my $self = shift;
+  my $other = shift;
+  if ($self->{verbose}) { print "Comparing vtable layout of \"$self->{bldInfDir}\" against \"$other->{bldInfDir}\"..\n"; }
+  my $passed = 1;
+  foreach my $class (keys %{$self->{vtables}}) {
+    if (exists $other->{vtables}->{$class}) {
+      if ($self->{verbose}) { print "Examining vtable of class \"$class\"...\n"; }
+      for (my $ii = 0; $ii < scalar (@{$self->{vtables}->{$class}}); ++$ii) {
+	my $thisVTableEntry = $self->{vtables}->{$class}->[$ii];
+	if ($ii >= scalar (@{$other->{vtables}->{$class}})) {
+	  print "Failure reason: Unexpected vtable entry \"$thisVTableEntry\"\n";
+	  $passed = 0;
+	  last;
+	}
+	my $otherVTableEntry = $other->{vtables}->{$class}->[$ii];
+	if ($thisVTableEntry eq $otherVTableEntry) {
+	  if ($self->{verbose}) { print "\tMatched vtable entry \"$thisVTableEntry\"\n"; }
+	}
+	else {
+	  print "Failure reason: Mismatched vtable entries in class \"$class\"\n\t$thisVTableEntry\n\t$otherVTableEntry\n";
+	  $passed = 0;
+	}
+      }
+    }
+    else {
+      print "Failure reason: Vtable for \"$class\" missing from $other->{bldInfDir}\n";
+      $passed = 0;
+    }
+  }
+  return $passed;
+}
+
+
+
+#
+# Private.
+#
+
+sub BuildAssemblerListings {
+  my $self = shift;
+  if ($self->{verbose}) { print "Calling \"bldmake bldfiles\" in \"$self->{bldInfDir}\"\n"; }
+  open (BLDMAKE, "bldmake bldfiles 2>&1 |") or die "Error: Couldn't run \"bldmake bldfiles\" in \"$self->{bldInfDir}\": $!\n";
+  while (my $line = <BLDMAKE>) {
+    if ($line) {
+      if ($self->{verbose}) { print "\t$line"; }
+      die "Error: Problem running \"bldmake bldfiles\" in \"$self->{bldInfDir}\"\n";
+    }
+  }
+  close (BLDMAKE);
+
+  if ($self->{verbose}) { print "Calling \"abld makefile arm4\" in \"$self->{bldInfDir}\"\n"; }
+  open (ABLD, "abld makefile arm4 2>&1 |") or die "Error: Couldn't run \"abld makefile arm4\" in \"$self->{bldInfDir}\": $!\n";
+  while (my $line = <ABLD>) {
+    if ($line) {
+      if ($self->{verbose}) { print "\t$line"; }
+    }
+  }
+  close (ABLD);
+  
+  if ($self->{verbose}) { print "Calling \"abld listing arm4 urel\" in \"$self->{bldInfDir}\"\n"; }
+  open (ABLD, "abld listing arm4 urel 2>&1 |") or die "Error: Couldn't run \"abld listing arm4 urel\" in \"$self->{bldInfDir}\": $!\n";
+  while (my $line = <ABLD>) {
+    if ($line) {
+      if ($self->{verbose}) { print "\t$line"; }
+      if ($line =~ /^Created (.*)/) {
+	my $listingFile = $1;
+	push (@{$self->{listingFiles}}, $listingFile);
+      }
+    }
+  }
+  close (ABLD);
+}
+
+sub ParseAssemblerListings {
+  my $self = shift;
+  foreach my $listing (@{$self->{listingFiles}}) {
+    open (LISTING, $listing) or die "Error: Couldn't open \"$listing\" for reading: $!\n";
+    while (my $line = <LISTING>) {
+      if ($line =~ /^\s.\d+\s+__vt_\d+(\D+):$/) {  # If start of vtable section.
+	my $class = $1;
+	if (exists $self->{classes}->{$class}) { # If one of the classes we're interested in.
+	  while (my $line2 = <LISTING>) {
+	    if ($line2 =~ /^\s.\d+\s[\da-fA-F]{4}\s[\da-fA-F]{8}\s+\.word\s+(.*)/) {  # If this is a valid vtable entry.
+	      my $vtableEntry = $1;
+	      push (@{$self->{vtables}->{$class}}, $vtableEntry);
+	    }
+	    else {
+	      last;
+	    }
+	  }
+	}
+      }
+    }
+    close (LISTING);
+  }
+}
+
+sub DeleteAssemblerListings {
+  my $self = shift;
+  foreach my $listing (@{$self->{listingFiles}}) {
+    unlink $listing or die "Error: Unable to delete \"$listing\": $!\n";
+  }
+}
+
+
+#
+# Utils.
+#
+
+package Utils;
+
+use File::Basename;
+use Cwd 'abs_path', 'cwd';
+use Win32;
+
+sub AbsoluteFileName {
+  my $fileName = shift;
+  unless (-e $$fileName) {
+    die "Error: \"$$fileName\" does not exist\n";
+  }
+  (my $base, my $path) = fileparse($$fileName);
+  my $absPath = abs_path($path);
+  $$fileName = $absPath;
+  unless ($$fileName =~ /[\\\/]$/) {
+    $$fileName .= "\\";
+  }
+  $$fileName .= $base;
+  TidyFileName($fileName);
+}
+
+sub SplitFileName {
+  my $fileName = shift;
+  my $path = '';
+  my $base = '';
+  my $ext = '';
+
+  if ($fileName =~ /\\?([^\\]*?)(\.[^\\\.]*)?$/) {
+    $base = $1;
+  }
+  if ($fileName =~ /^(.*\\)/) {
+    $path = $1;
+  }
+  if ($fileName =~ /(\.[^\\\.]*)$/o) {
+    $ext =  $1;
+  }
+
+  die unless ($fileName eq "$path$base$ext");
+  return ($path, $base, $ext);
+}
+
+sub TidyFileName {
+  my $a = shift;
+  $$a =~ s/\//\\/g;      # Change forward slashes to back slashes.
+  $$a =~ s/\\\.\\/\\/g;  # Change "\.\" into "\".
+
+  if ($$a =~ /^\\\\/) {  # Test for UNC paths.
+    $$a =~ s/\\\\/\\/g;  # Change "\\" into "\".
+    $$a =~ s/^\\/\\\\/;  # Add back a "\\" at the start so that it remains a UNC path.
+  }
+  else {
+    $$a =~ s/\\\\/\\/g;  # Change "\\" into "\".
+  }
+}
+
+my @dirStack;
+
+sub PushDir {
+  my $dir = shift;
+  my $cwd = cwd();
+  chdir ($dir) or die "Error: Couldn't change working directory to \"$dir\": $!\n";
+  push (@dirStack, $cwd);
+}
+
+sub PopDir {
+  if (scalar @dirStack > 0) {
+    my $dir = pop @dirStack;
+    chdir ($dir) or die "Error: Couldn't change working directory to \"$dir\": $!\n";
+  }
+  else {
+    die "Error: Directory stack empty";
+  }
+}
+
+
+1;
+
+=head1 NAME
+
+CheckBc.pm - A module that runs some simple tests to see if one component source tree is backwards compatible another.
+
+=head1 SYNOPSIS
+
+  my $checkBc = CheckBc->New('\branch1\comp\group', '\branch2\comp\group', 0);
+  unless ($checkBc->CheckAll()) {
+    print "Check failed\n";
+  }
+
+=head1 DESCRIPTION
+
+C<CheckBc> does the following checks to see if a backwards compatibility breaking change has been introduced:
+
+=over 4
+
+=item 1
+
+Compares the ARM F<.def> files to ensure that only new lines have been added to the end of the file.
+
+=item 2
+
+Compares the sizes of any classes that have an exported C++ constructor. This is done by compiling some generated C++ code that uses the C<sizeof> operator to print the relevant class sizes to C<STDOUT>. Compilation is done using the MSVC++ compiler.
+
+=item 3
+
+Compares the v-table layouts of any classes that have an exported C++ constructor. This is done by compiling each source code set to ARM4 assembler listings, comparing the v-table sections.
+
+=back
+
+=head1 LIMITATIONS
+
+=over 4
+
+=item 1
+
+The component's headers must compile using Microsoft's Visual C++ compiler.
+
+=item 2
+
+The component's exported headers must compile when they are all #include'd into a single F<.cpp> file. If this is not the case, then additional headers and include paths can be passed into the constructor.
+
+=item 3
+
+Declarations of the component's exported C++ constructors must be found in one of the exported headers.
+
+=item 4
+
+F<.def> file lines are expected to be identical. This can lead to checks failing falsely because, for example, the name of a function may be changed without breaking BC provided the F<.def> file is carefully edited.
+
+=item 5
+
+The components must compile as ARM4. This is likely to mean that each set of source code needs to be accompanied with a suitable F<\epoc32> tree that allows it to be built. The simplest way to acheive this is to prepare a pair of subst'd drives.
+
+=back
+
+=head1 KNOWN BUGS
+
+F<bld.inf>, F<.mmp> and F<.def> file parsing is probably not as industrial strength as it should be.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CheckRls	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,181 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use File::Find;
+use File::Basename;
+use Cwd 'abs_path';
+
+$|++;
+
+my $dir1 = shift @ARGV;
+my $dir2 = shift @ARGV;
+
+unless ($dir1 and -d $dir1 and $dir2 and -d $dir2) {
+  die "Error: Invalid arguments\n";
+}
+
+$dir1 = AbsoluteFileName($dir1);
+$dir2 = AbsoluteFileName($dir2);
+
+my $rlsFiles = FindRlsFiles($dir1, $dir2);
+DiffRlsFiles($dir1, $dir2, $rlsFiles);
+
+
+sub FindRlsFiles {
+  my $dir1 = shift;
+  my $dir2 = shift;
+  my %rlsFiles;
+  my $whichDir = $dir1;
+  my $processFileSub = sub {
+    if (/\.rls$/i) {
+      print '.';
+      my $thisFile = $File::Find::name;
+      $thisFile =~ s/^\Q$whichDir\E//;
+      $thisFile =~ s/^\///;
+      $thisFile =~ s/\//\\/g;
+      $rlsFiles{$thisFile} = 1;
+    }
+  };
+  print 'Scanning for rls files';
+  find($processFileSub, $dir1);
+  $whichDir = $dir2;
+  find($processFileSub, $dir2);
+  print "\n";
+  return \%rlsFiles;
+}
+
+sub DiffRlsFiles {
+  my $dir1 = shift;
+  my $dir2 = shift;
+  my $rlsFiles = shift;
+  foreach my $thisFile (sort keys %$rlsFiles) {
+    my $file1 = ConcatenatePaths($dir1, $thisFile);
+    my $file2 = ConcatenatePaths($dir2, $thisFile);
+    if (-e $file1 and -e $file2) {
+      CompareFiles($file1, $file2);
+    }
+    elsif (-e $file1) {
+      print "Warning: $file2 does not exist\n";
+    }
+    else {
+      print "Warning: $file1 does not exist\n";
+    }
+  }
+}
+
+sub CompareFiles {
+  my $file1 = shift;
+  my $file2 = shift;
+  open(IN1, "cpp $file1 2>NUL|") or die "Error: Unable to open \"$file1\": $!";
+  open(IN2, "cpp $file2 2>NUL|") or die "Error: Unable to open \"$file2\": $!";
+  my $result = 'identical';
+  while (my $file1Line = <IN1>) {
+    my $file2Line = <IN2>;
+    unless ($file2Line) {
+      # file2 has been fully read, so file1 must be longer.
+      $result = 'different';
+      last;
+    }
+    if ($file1Line =~ /^\#/ and $file2Line =~ /^\#/) {
+      # Ignore stuff put in by cpp.
+      next;
+    }
+
+    # Remove whitespace from the ends of lines.
+    chomp $file1Line;
+    chomp $file2Line;
+    $file1Line =~ s/\s*$//;
+    $file2Line =~ s/\s*$//;
+
+    # Do the comparison.
+    if ($file1Line ne $file2Line) {
+      $result = 'different';
+      last;
+    }
+  }
+  if (<IN2>) {
+    # We've compared all lines in file1. Need to check to see if file2 has been fully read.
+    $result = 'different';
+  }
+  close(IN1);
+  close(IN2);
+
+  if ($result eq 'identical') {
+  }
+  else {
+    print "Different: $file1 $file2\n";
+  }
+}
+
+
+sub AbsoluteFileName {
+  my $fileName = shift;
+  (my $base, my $path) = fileparse($fileName);
+  my $absPath = abs_path($path);
+  unless ($absPath =~ /[\\\/]$/) {
+    $absPath .= "\\";
+  }
+  $fileName = $absPath . $base;
+  $fileName =~ s/\//\\/g;
+  return $fileName;
+}
+
+sub ConcatenatePaths {
+  my $path1 = shift;
+  my $path2 = shift;
+  $path1 =~ s/([^\\]$)/$1\\/;
+  $path2 =~ s/^\\//;
+  return $path1.$path2;
+}
+
+=head1 NAME
+
+CheckRls - Compares all rls files found in a pair of directory trees
+
+=head1 SYNOPSIS
+
+  checkrls <dir1> <dir2>
+
+=head1 DESCRIPTION
+
+rls files contain the content of resource files that needs to be translated into different languages. Changes made to a particular language variant therefore potentially need to be applied to all other language variants. It is therefore important that changes to rls files are made in a highly controlled way. This tool provides a means of comparing the rls found in a pair of directory trees, and reporting which ones have changed.
+
+The rls files are run through the C preprocessor before being compared. This means that changes to comments will be ignored. Also, differences in white space (space and tab characters) at the end of a line are ignored. Each file pair that contains any other kind of difference is reported to C<STDOUT>. Use a conventional differencing tool to get a detailed picture of what the differences are.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CheckRls.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Class/DISTRIBUTION.policy	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Class/Singleton.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,352 @@
+#============================================================================
+#
+# Class::Singleton.pm
+#
+# Implementation of a "singleton" module which ensures that a class has
+# only one instance and provides global access to it.  For a description 
+# of the Singleton class, see "Design Patterns", Gamma et al, Addison-
+# Wesley, 1995, ISBN 0-201-63361-2
+#
+# Written by Andy Wardley <abw@cre.canon.co.uk>
+#
+# Copyright (C) 1998 Canon Research Centre Europe Ltd.  All Rights Reserved.
+#
+#----------------------------------------------------------------------------
+#
+# $Id: Singleton.pm,v 1.3 1999/01/19 15:57:43 abw Exp $
+#
+#============================================================================
+
+package Class::Singleton;
+
+require 5.004;
+
+use strict;
+use vars qw( $RCS_ID $VERSION );
+
+$VERSION = sprintf("%d.%02d", q$Revision: 1.3 $ =~ /(\d+)\.(\d+)/);
+$RCS_ID  = q$Id: Singleton.pm,v 1.3 1999/01/19 15:57:43 abw Exp $;
+
+
+
+#========================================================================
+#                      -----  PUBLIC METHODS -----
+#========================================================================
+
+#========================================================================
+#
+# instance()
+#
+# Module constructor.  Creates an Class::Singleton (or derivative) instance 
+# if one doesn't already exist.  The instance reference is stored in the
+# _instance variable of the $class package.  This means that classes 
+# derived from Class::Singleton will have the variables defined in *THEIR*
+# package, rather than the Class::Singleton package.  The impact of this is
+# that you can create any number of classes derived from Class::Singleton
+# and create a single instance of each one.  If the _instance variable
+# was stored in the Class::Singleton package, you could only instantiate 
+# *ONE* object of *ANY* class derived from Class::Singleton.  The first
+# time the instance is created, the _new_instance() constructor is called 
+# which simply returns a reference to a blessed hash.  This can be 
+# overloaded for custom constructors.  Any addtional parameters passed to 
+# instance() are forwarded to _new_instance().
+#
+# Returns a reference to the existing, or a newly created Class::Singleton
+# object.  If the _new_instance() method returns an undefined value
+# then the constructer is deemed to have failed.
+#
+#========================================================================
+
+sub instance {
+    my $class = shift;
+
+    # get a reference to the _instance variable in the $class package 
+    no strict 'refs';
+    my $instance = \${ "$class\::_instance" };
+
+    defined $$instance
+	? $$instance
+	: ($$instance = $class->_new_instance(@_));
+}
+
+
+
+#========================================================================
+#
+# _new_instance(...)
+#
+# Simple constructor which returns a hash reference blessed into the 
+# current class.  May be overloaded to create non-hash objects or 
+# handle any specific initialisation required.
+#
+# Returns a reference to the blessed hash.
+#
+#========================================================================
+
+sub _new_instance {
+    bless { }, $_[0];
+}
+
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Class::Singleton - Implementation of a "Singleton" class 
+
+=head1 SYNOPSIS
+
+    use Class::Singleton;
+
+    my $one = Class::Singleton->instance();   # returns a new instance
+    my $two = Class::Singleton->instance();   # returns same instance
+
+=head1 DESCRIPTION
+
+This is the Class::Singleton module.  A Singleton describes an object class
+that can have only one instance in any system.  An example of a Singleton
+might be a print spooler or system registry.  This module implements a
+Singleton class from which other classes can be derived.  By itself, the
+Class::Singleton module does very little other than manage the instantiation
+of a single object.  In deriving a class from Class::Singleton, your module 
+will inherit the Singleton instantiation method and can implement whatever
+specific functionality is required.
+
+For a description and discussion of the Singleton class, see 
+"Design Patterns", Gamma et al, Addison-Wesley, 1995, ISBN 0-201-63361-2.
+
+=head1 PREREQUISITES
+
+Class::Singleton requires Perl version 5.004 or later.  If you have an older 
+version of Perl, please upgrade to latest version.  Perl 5.004 is known 
+to be stable and includes new features and defect fixes over previous
+versions.  Perl itself is available from your nearest CPAN site (see
+INSTALLATION below).
+
+=head1 INSTALLATION
+
+The Class::Singleton module is available from CPAN. As the 'perlmod' man
+page explains:
+
+    CPAN stands for the Comprehensive Perl Archive Network.
+    This is a globally replicated collection of all known Perl
+    materials, including hundreds of unbunded modules.
+
+    [...]
+
+    For an up-to-date listing of CPAN sites, see
+    http://www.perl.com/perl/ or ftp://ftp.perl.com/perl/ .
+
+The module is available in the following directories:
+
+    /modules/by-module/Class/Class-Singleton-<version>.tar.gz
+    /authors/id/ABW/Class-Singleton-<version>.tar.gz
+
+For the latest information on Class-Singleton or to download the latest
+pre-release/beta version of the module, consult the definitive reference:
+
+    http://www.kfs.org/~abw/perl/
+
+Class::Singleton is distributed as a single gzipped tar archive file:
+
+    Class-Singleton-<version>.tar.gz
+
+Note that "<version>" represents the current version number, of the 
+form "1.23".  See L<REVISION> below to determine the current version 
+number for Class::Singleton.
+
+Unpack the archive to create an installation directory:
+
+    gunzip Class-Singleton-<version>.tar.gz
+    tar xvf Class-Singleton-<version>.tar
+
+'cd' into that directory, make, test and install the module:
+
+    cd Class-Singleton-<version>
+    perl Makefile.PL
+    make
+    make test
+    make install
+
+The 'make install' will install the module on your system.  You may need 
+root access to perform this task.  If you install the module in a local 
+directory (for example, by executing "perl Makefile.PL LIB=~/lib" in the 
+above - see C<perldoc MakeMaker> for full details), you will need to ensure 
+that the PERL5LIB environment variable is set to include the location, or 
+add a line to your scripts explicitly naming the library location:
+
+    use lib '/local/path/to/lib';
+
+=head1 USING THE CLASS::SINGLETON MODULE
+
+To import and use the Class::Singleton module the following line should 
+appear in your Perl script:
+
+    use Class::Singleton;
+
+The instance() method is used to create a new Class::Singleton instance, 
+or return a reference to an existing instance.  Using this method, it
+is only possible to have a single instance of the class in any system.
+
+    my $highlander = Class::Singleton->instance();
+
+Assuming that no Class::Singleton object currently exists, this first
+call to instance() will create a new Class::Singleton and return a reference
+to it.  Future invocations of instance() will return the same reference.
+
+    my $macleod    = Class::Singleton->instance();
+
+In the above example, both $highlander and $macleod contain the same
+reference to a Class::Singleton instance.  There can be only one.
+
+=head1 DERIVING SINGLETON CLASSES
+
+A module class may be derived from Class::Singleton and will inherit the 
+instance() method that correctly instantiates only one object.
+
+    package PrintSpooler;
+    use vars qw(@ISA);
+    @ISA = qw(Class::Singleton);
+
+    # derived class specific code
+    sub submit_job {
+        ...
+    }
+
+    sub cancel_job {
+        ...
+    }
+
+The PrintSpooler class defined above could be used as follows:
+
+    use PrintSpooler;
+
+    my $spooler = PrintSpooler->instance();
+
+    $spooler->submit_job(...);
+
+The instance() method calls the _new_instance() constructor method the 
+first and only time a new instance is created.  All parameters passed to 
+the instance() method are forwarded to _new_instance().  In the base class
+this method returns a blessed reference to an empty hash array.  Derived 
+classes may redefine it to provide specific object initialisation or change
+the underlying object type (to a list reference, for example).
+
+    package MyApp::Database;
+    use vars qw( $ERROR );
+    use base qw( Class::Singleton );
+    use DBI;
+
+    $ERROR = '';
+
+    # this only gets called the first time instance() is called
+    sub _new_instance {
+	my $class = shift;
+	my $self  = bless { }, $class;
+	my $db    = shift || "myappdb";    
+	my $host  = shift || "localhost";
+
+	unless (defined ($self->{ DB } 
+			 = DBI->connect("DBI:mSQL:$db:$host"))) {
+	    $ERROR = "Cannot connect to database: $DBI::errstr\n";
+	    # return failure;
+	    return undef;
+	}
+
+	# any other initialisation...
+	
+	# return sucess
+	$self;
+    }
+
+The above example might be used as follows:
+
+    use MyApp::Database;
+
+    # first use - database gets initialised
+    my $database = MyApp::Database->instance();
+    die $MyApp::Database::ERROR unless defined $database;
+
+Some time later on in a module far, far away...
+
+    package MyApp::FooBar
+    use MyApp::Database;
+
+    sub new {
+	# usual stuff...
+	
+	# this FooBar object needs access to the database; the Singleton
+	# approach gives a nice wrapper around global variables.
+
+	# subsequent use - existing instance gets returned
+	my $database = MyApp::Database->instance();
+
+	# the new() isn't called if an instance already exists,
+	# so the above constructor shouldn't fail, but we check
+	# anyway.  One day things might change and this could be the
+	# first call to instance()...  
+	die $MyAppDatabase::ERROR unless defined $database;
+
+	# more stuff...
+    }
+
+The Class::Singleton instance() method uses a package variable to store a
+reference to any existing instance of the object.  This variable, 
+"_instance", is coerced into the derived class package rather than
+the base class package.
+
+Thus, in the MyApp::Database example above, the instance variable would
+be:
+
+    $MyApp::Database::_instance;
+
+This allows different classes to be derived from Class::Singleton that 
+can co-exist in the same system, while still allowing only one instance
+of any one class to exists.  For example, it would be possible to 
+derive both 'PrintSpooler' and 'MyApp::Database' from Class::Singleton and
+have a single instance of I<each> in a system, rather than a single 
+instance of I<either>.
+
+=head1 AUTHOR
+
+Andy Wardley, C<E<lt>abw@cre.canon.co.ukE<gt>>
+
+Web Technology Group, Canon Research Centre Europe Ltd.
+
+Thanks to Andreas Koenig C<E<lt>andreas.koenig@anima.deE<gt>> for providing
+some significant speedup patches and other ideas.
+
+=head1 REVISION
+
+$Revision: 1.3 $
+
+=head1 COPYRIGHT
+
+Copyright (C) 1998 Canon Research Centre Europe Ltd.  All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it under 
+the term of the Perl Artistic License.
+
+=head1 SEE ALSO
+
+=over 4
+
+=item Canon Research Centre Europe Perl Pages
+
+http://www.cre.canon.co.uk/perl/
+
+=item The Author's Home Page
+
+http://www.kfs.org/~abw/
+
+=item Design Patterns
+
+Class::Singleton is an implementation of the Singleton class described in 
+"Design Patterns", Gamma et al, Addison-Wesley, 1995, ISBN 0-201-63361-2
+
+=back
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,138 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use CleanEnv;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'CleanEnv');
+my $reallyClean = 0;
+my $force = 0;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+CleanEnv::CleanEnv($iniData, $reallyClean, $force, $verbose);
+print "Environment cleaned.\n" if ($force);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'r' => \$reallyClean, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: cleanenv [options]
+
+options:
+
+-h  help
+-r  really clean
+-f  force (don't prompt)
+-v  verbose output (-vv very verbose)\n");
+}
+
+__END__
+
+=head1 NAME
+
+CleanEnv - Restores an environment to a clean state.
+
+=head1 SYNOPSIS
+
+  cleanenv [options]
+
+options:
+
+  -h  help
+  -r  really clean
+  -f  force (don't prompt)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Provides the user with the option of:
+
+=over 4
+
+=item *
+
+Re-installing dirty components.
+
+=item *
+
+Removing files of unknown origin.
+
+=back
+
+Normally when scanning an environment certain directories and files are ignored from the point of view of C<unknown origin> status (see the document I<Installation Guide> for more details), for example intermediate build files. The C<-r> switch causes C<CleanEnv> to not ignore any files when performing it's scan, and hence do a more comprehensive clean.
+
+Normally it will ask you if you want to delete files, and/or reinstall components. The -f flag supresses these questions, and should be used with care.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanEnv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,179 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package CleanEnv;
+
+use strict;
+
+#
+# Globals.
+#
+
+my $reallyClean = 0;
+my $force = 0;
+my $verbose = 0;
+
+
+#
+# Public.
+#
+
+sub CleanEnv {
+  my $iniData = shift;
+  $reallyClean = shift;
+  $force = shift;
+  $verbose = shift;
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  (my $overallStatus, undef, my $dirtyComps, my $unaccountedItems, my $duplicates) = $envDb->CheckEnv(1, $reallyClean, 1);
+
+  if ($overallStatus == EnvDb::STATUS_CLEAN) {
+    print "Environment already clean\n";
+    return 1;
+  }
+  else {
+    my $cleaned = 1;
+    if (scalar(@$unaccountedItems) > 0) {
+      if (not $force or $verbose) {
+        foreach my $line (@$unaccountedItems) {
+          print "$line has unknown origin\n"; 
+        }
+      }
+      if (Query("\nDelete above file(s)? [y/n] ")) {
+        foreach my $file (@$unaccountedItems) {
+          if ($verbose) { print "Deleting $file...\n"; }
+          unlink $file or print "Warning: Couldn't delete $file: $!\n" if (-f $file);
+          RemoveDirIfEmpty($file) if (-d $file);
+
+          (my $dir) = Utils::SplitFileName($file);
+          RemoveDirIfEmpty($dir) if (-d $dir);
+        }
+      }
+      else {
+        $cleaned = 0;
+      }
+    }
+    if (scalar(@$dirtyComps) > 0) {
+      print "\n";
+      if (not $force or $verbose) {
+        foreach my $comp (@$dirtyComps) {
+          print "$comp->{comp} $comp->{ver} is dirty\n";
+        }
+      }
+      if (Query("\nRe-install the above component(s)? [y/n] ")) {
+        foreach my $comp (@$dirtyComps) {
+          $envDb->RefreshComponent($comp->{comp});
+        }
+      }
+      else {
+        $cleaned = 0;
+      }
+    }
+    if (scalar(@$duplicates) > 0) {
+       print "\nThe following components are claiming the ownership of the same file:\n";
+
+       # Compile a hash of conflicting components indexed by file
+       my %duplicateFiles;
+       foreach my $dup (@$duplicates) {
+         # Each list item contains the filename, plus only two conflicting components.
+         my $file = shift @$dup;
+         $duplicateFiles{$file} = [] if !exists $duplicateFiles{$file};
+         foreach my $comp (@$dup) {
+           my $found = 0;
+           foreach my $existingComp (@{$duplicateFiles{$file}}) {
+             if ($existingComp eq $comp) {
+               $found = 1;
+               last;
+             }
+           }
+           push @{$duplicateFiles{$file}}, $comp if !$found;
+         }
+       }
+
+       foreach my $file (keys(%duplicateFiles)) {
+         print join(", ", sort(@{$duplicateFiles{$file}})).": $file\n";
+       }
+       print "\nCleanEnv cannot resolve these duplicates.  To fix this, please remove one or\nmore of the conflicting components\n";
+    }
+    return $cleaned;
+  }
+}
+
+
+#
+# Private.
+#
+
+sub RemoveDirIfEmpty {
+  my $dir = shift;
+  if (DirEmpty($dir)) {
+    rmdir $dir or print "Warning: Couldn't delete \"$dir\": $!\n";
+    $dir =~ s/\\$//; # Remove trailing backslash.
+    (my $parentDir) = Utils::SplitFileName($dir);
+    RemoveDirIfEmpty($parentDir);
+  }
+}
+
+sub DirEmpty {
+  my $dir = shift;
+  return (scalar @{Utils::ReadDir($dir)} == 0);
+}
+
+sub Query {
+  my $question = shift;
+  return 1 if $force;
+  print $question;
+  my $response = lc <STDIN>;
+  chomp $response;
+  return ($response eq 'y')?1:0;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CleanEnv.pm - Provides an interface for cleaning environments.
+
+=head1 INTERFACE
+
+=head2 CleanEnv
+
+Expects to be passed an C<IniData> reference, a flag indicating if a 'really clean' should be done, a flag indiacting of no user interaction (force) should be done, and a verbosity level. Cleans the environment accordingly. Returns true if the environment was cleaned (i.e. the user replied 'y' to all questions), false otherwise.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanEnv.pod	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,73 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+
+=head1 NAME
+
+CleanEnv - Restores an environment to a clean state.
+
+=head1 SYNOPSIS
+
+  cleanenv [options]
+
+options:
+
+  -h  help
+  -r  really clean
+  -f  force (don't prompt)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Provides the user with the option of:
+
+=over 4
+
+=item *
+
+Re-installing dirty components.
+
+=item *
+
+Removing files of unknown origin.
+
+=back
+
+Normally when scanning an environment certain directories and files are ignored from the point of view of C<unknown origin> status (see the document I<Installation Guide> for more details), for example intermediate build files. The C<-r> switch causes C<CleanEnv> to not ignore any files when performing it's scan, and hence do a more comprehensive clean.
+
+Normally it will ask you if you want to delete files, and/or reinstall components. The -f flag supresses these questions, and should be used with care.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanLocalArch	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,486 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use File::Copy;
+use File::Path;
+use File::Spec;
+use File::Basename;
+use Cleaner;
+use Utils;
+use Cwd;
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $overwrite = 0;
+my $dummyRun = 0;
+my $descriptionFile;
+my $iniData = IniData->New();
+my $cleaner; # object that does most of it
+my $cleanTo;
+my $expunge = 0; # don't leave reldatas lying around
+my $reallyClean;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+$cleaner = Cleaner->New($iniData, 0, $verbose, $reallyClean); # 0 = local not remote
+ParseDescriptionFile($descriptionFile);
+$cleaner->SetCleaningSubroutine(\&CleaningSubroutine);
+if (!$expunge) {
+  $cleaner->SetRevertingSubroutine(\&RevertingSubroutine);
+}
+$cleaner->Clean();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'd' => \$dummyRun, 'v+' => \$verbose, 'o' => \$overwrite, 'r' => \$reallyClean);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $descriptionFile = shift @ARGV;
+
+  unless ($descriptionFile) {
+    print "Error: Archive cleaning description file not specified\n";
+    Usage(1);
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  if ($dummyRun and not $verbose) {
+    $verbose = 1;
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: cleanlocalarch [options] description-file
+
+options:
+
+-h  help
+-d  dummy run (don't do anything) - assumes -v
+-r  really clean (removes corrupt and partially released components)
+-v  verbose output (-vv very verbose)
+-o  overwrite destination (delete destination then normal copy)
+
+Please note, if you are in the process of publishing components to the archive
+and specify the -r option you may lose partially released components.\n");
+
+}
+
+sub ParseDescriptionFile {
+  if ($dummyRun) { print "Running in dummy mode...\n"; }
+  if ($verbose) { print "Parsing \"$descriptionFile\"...\n"; }
+  open (DES, $descriptionFile) or die "Unable to open \"$descriptionFile\" for reading: $!\n";
+
+  while (my $line = <DES>) {
+    # Remove line feed, white space and comments.
+    chomp($line);
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+
+    my $keyWord;
+    my @operand;
+    if ($line =~ /^(\w+)\s+(.*)/) {
+      $keyWord = $1;
+      @operand = ();
+      if ($2) {
+        @operand = split /\s+/, $2;
+      }
+    } else {
+      $keyWord = $line;
+    }
+
+    unless (defined $keyWord) {
+      die "Error: Invalid line in \"$descriptionFile\":\n$line\n";
+      next;
+    }
+
+    if ($cleaner->ProcessDescriptionLine($descriptionFile, $keyWord, @operand)) {
+      # We're happy because Cleaner.pm knows what to do with this line
+    } elsif ($keyWord =~ /^clean_to$/) {
+      unless ($#operand == 0) {
+        die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: clean_to <path>\n";
+      }
+      if ($cleanTo) {
+        die "Error: \'$keyWord\' keyword specifed more than once in \"$descriptionFile\"\n";
+      }
+      $cleanTo = $operand[0];
+    } elsif ($keyWord =~ /^delete$/) {
+      if (@operand) {
+        die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: delete\n";
+      }
+    } elsif ($keyWord =~ /^expunge$/) {
+      $expunge = 1;
+      $cleaner->{expunge_already_cleaned} = 1;
+    } elsif ($keyWord =~ /^no_prompt$/) {
+      print "Warning: currently, CleanLocalArch does not prompt. 'no_prompt' keyword is redundant.\n";
+    } else {
+      die "Error: Unknown keyword \'$keyWord\' in \"$descriptionFile\"\n";
+    }
+  }
+
+  close (DES);
+
+  unless ($cleanTo || $expunge) {
+    die "Error: \"Clean to\" path not specified in \"$descriptionFile\"\n";
+  }
+  if ($cleanTo && $expunge) {
+    die "Error: can't specify both \"clean_to\" and \"expunge\" in \"$descriptionFile\"\n";
+  }
+
+  if ($verbose > 1) {
+    $cleaner->PrintEnvsToKeep();
+  }
+}
+
+sub CleaningSubroutine {
+  # This actually gets run by Cleaner.pm (it's a callback)
+  my $thisComp = shift;
+  my $thisVer = shift;
+  my $relDir = shift;
+  if ($expunge) {
+    print "Expunging $thisComp $thisVer from $relDir...\n" if ($verbose);
+    return DeleteComp($relDir);
+  }
+  print "Archiving $thisComp $thisVer from $relDir to $cleanTo...\n" if ($verbose);
+  my $cleanDir = "$cleanTo\\$thisComp\\$thisVer";
+  
+  if (CopyComp($relDir, $cleanDir)) {
+    print "Wiping $thisComp $thisVer from $relDir...\n" if ($verbose);
+    if (DeleteComp("$relDir")) {
+      # Check if the remaining dir is empty
+      my ($parent, $file, $ext) = Utils::SplitFileName($relDir);
+      return DeleteCompIfEmpty($parent);
+    }
+    else {
+      # Call the reverting subroutine here because cleaner.pm will only revert clean components
+      RevertingSubroutine($thisComp, $thisVer, $relDir);
+    }
+  }
+  
+  return 0;
+}
+
+sub RevertingSubroutine {
+  # Again, this gets run by Cleaner.pm
+  my $thisComp = shift;
+  my $thisVer = shift;
+  my $relDir = shift;
+  
+  print "Restoring $thisComp $thisVer to $relDir...\n" if ($verbose);
+  
+  # create the reldir if required
+  if(!-d $relDir) {
+    Utils::MakeDir($relDir);
+  }
+  
+  my $fullCleanToPath = File::Spec->catdir($cleanTo, $thisComp, $thisVer);
+  
+  my $dirContents = Utils::ReadDir($fullCleanToPath);
+  foreach my $thisFile (@$dirContents) {
+     copy(File::Spec->catdir($fullCleanToPath, $thisFile), $relDir);
+  }  
+
+  print "Removing copy of $thisComp $thisVer from $cleanTo...\n" if ($verbose);
+  if (DeleteComp("$cleanTo\\$thisComp\\$thisVer")) {
+    # Check if the remaining dir is empty
+    return DeleteCompIfEmpty("$cleanTo\\$thisComp");
+  }
+  else {
+    # Failed to even delete component
+    return 0;
+  }
+}
+
+sub CopyComp {
+  my $dir = shift;
+  my $destDir = shift;
+
+  if (-e $destDir) {
+    if ($overwrite) {
+      if ($verbose > 0) { print "Overwriting by deleting \"$destDir\"\n"; }
+      DeleteComp("$destDir");
+    }
+    else {
+      print "Error: Can't copy \"$dir\" to \"$destDir\" because directory \"$destDir\" already exists\n";
+      return 0;
+    }
+  }
+
+  my $failed = 0;
+  my @copied;
+  eval {
+    Utils::MakeDir($destDir) unless $dummyRun;
+  };
+  if ($@) {
+    print "$@";
+    $failed = 1;
+  }
+
+  if($failed==0) {
+    my $dirContents = Utils::ReadDir($dir);
+    foreach my $thisFile (@$dirContents) {
+      if ($verbose > 1) { print "\tCopying \"$dir\\$thisFile\" to \"$destDir\"...\n"; }
+      if ($dummyRun) {
+        return 1;
+      }
+      else {
+        if (copy($dir."\\".$thisFile, $destDir)) {
+          push @copied, $thisFile;
+        }
+        else {
+          print "Error: Couldn't copy \"$dir\\$thisFile\" to \"$destDir\": $!\n";
+          $failed = 1;
+          if (-f $destDir."\\".$thisFile) {
+            # Must've part-copied this file
+            push @copied, $thisFile;
+          }
+          last;
+        }
+      }
+    }
+  }
+
+  if ($failed) {
+    # Revert copied files
+    foreach my $thisFile (@copied) {
+      unlink $destDir."\\".$thisFile or print "Error: Couldn't delete $destDir\\$thisFile when cleaning up\n";
+    }
+    DeleteCompIfEmpty($destDir) or print "Error: Couldn't clean up empty directory $destDir\n";
+  }
+
+  return ($failed == 0);
+}
+
+sub DeleteComp {
+  my $dir = shift;
+
+  if (!$dummyRun) {
+    local $SIG{__WARN__} = sub {my $line = shift;
+                                $line =~ s/ at .*$//;
+                                print "Error: $line\n";};
+    
+    my $reldataFile = File::Spec->catdir($dir, 'reldata');
+
+    my $origDir = cwd();
+    chdir(dirname($dir));
+    
+    if (-e $reldataFile) {
+      # Delete the reldata file first, if something goes wrong other tools will identify the archived component
+      # as corrupt by the absence of reldata
+      if (!unlink $reldataFile) {
+        print "Error: Couldn't delete \"$reldataFile\"\n";
+        return 0;
+      }
+    }
+    
+    if (!rmtree($dir, 0, 0) or -d $dir) {
+      print "Error: Couldn't delete \"$dir\"\n";
+      return 0;
+    }
+    else {
+      chdir($origDir);
+      return 1;
+    }
+  }
+  else {
+    return 1;
+  }
+}
+
+sub DeleteCompIfEmpty {
+  my $dir = shift;
+
+  if (!$dummyRun) {
+    if (opendir(DIR, $dir)) {
+      my @files = grep( !/\.\.?$/, readdir DIR);
+      if (!closedir(DIR)) {
+        die "Error: Couldn't close '$dir' after reading. Aborting\n";
+      }
+      if (scalar(@files) == 0) {
+        print "Tidying $dir...\n" if ($verbose);
+        return DeleteComp("$dir");
+
+      }
+      else {
+        return 1; # Nothing to do
+      }
+    }
+    else {
+      print "Warning: Couldn't open '$dir' directory for reading. An empty directory may have been left behind.\n";
+      return 1; # Warning only
+    }
+  }
+  else {
+    return 1; # Dummy run
+  }
+}
+
+__END__
+
+=head1 NAME
+
+CleanLocalArch - Cleans unwanted releases from the local release archive.
+
+=head1 SYNOPSIS
+
+  cleanlocalarch [options] <description_file>
+
+options:
+
+  -h  help
+  -d  dummy run (don't do anything) - assumes -v
+  -r  really clean (removes corrupt and partially released components)
+  -v  verbose output (-vv very verbose)
+  -o  overwrite destination (delete destination then normal copy)
+
+Please note, if you are in the process of publishing components to the archive and specify the -r option you may lose partially released components.
+
+=head1 DESCRIPTION
+
+C<CleanLocalArch> allows releases to be cleaned out of a local archive. This may be useful if a local archive is consuming a large amount of disk space and there are old releases present that are no longer required. Note that releases to be cleaned are normally backed up to a user defined directory before being deleted. This allows the cleaned releases to be permanently archived (to say a writable CDROM) before they are deleted.
+
+If C<CleanLocalArch> encounters an error while backing up releases to be cleaned, it will attempt to back out of the change by deleting the backups of any releases already done. If C<CleanLocalArch> encounters errors while backing out of a clean, it has the potential to leave releases in the backup directory. Similarly, if after backing up all releases to delete, it encounters errors while actually deleting them, it may leave releases in the local archive. However the clean can be repeated to a fresh backup directory once the problem has been isolated to get rid of these releases.
+
+Before using C<CleanLocalArchive> you must write a plain text file that describes which releases you want to keep etc. The following keywords are supported:
+
+=over 4
+
+=item keep_env <component> <version>
+
+Instructs C<CleanLocalArchive> to keep all the component versions in the environment from which the specified component was released. This keyword may be used multiple times.
+
+=item keep_rel <component> <version>
+
+Instructs C<CleanLocalArchive> to keep a specific component release. This keyword may be used multiple times.
+
+=item keep_recent_env <component> <num_days>
+
+Instructs C<CleanLocalArchive> to keep all named component releases, including their environments, where the component release has been made within the specified number of days (since the current time). This keyword may be used multiple times provided it is used for different components each time.
+
+=item keep_recent_rel [component] <num_days>
+
+Instructs C<CleanLocalArchive> to keep any component releases made within the specified number of days (since the current time). If a component name is specified, C<CleanLocalArchive> will only keep component releases which match that name (and are sufficiently recent). This keyword may be used multiple times if the command is used for different components.
+
+=item keep_recent <num_days>
+
+B<Depricated:> Equivalent to keep_recent_rel without a component name entered.
+
+=item clean_to
+
+Specifies where to move release to be cleaned. Use of this keyword is mandatory and may only be used once. There is an alternative, 'expunge', which will actually delete the releases - but this is only intended for test scripts and use on real, important archives is strongly discouraged.
+
+=item force
+
+This keyword, which takes no operands, specifies that cleanlocalarch should be non-interactive.
+
+=back
+
+For example:
+
+ keep_env     pixie alpha
+ keep_env     pixie beta
+ keep_rel     comp1 rel1
+ keep_recent  10
+ clean_to     \\backup\pixie_cleaned_releases
+
+C<CleanLocalArch> will work out which component releases need to be kept in order to satisfy the specified keep criteria. All other component releases found in the archive will be moved to the C<clean_to> directory. B<It is therefore extremely important that the list of environments to keep is complete>. It is recommended that this file be controlled using a configuration management tool. It is also recommended that each project has only one description file, and that all users of C<CleanLocalArch> know where to find it.
+
+Recommended procedure for using C<CleanLocalArch>:
+
+=over 4
+
+=item 1
+
+Inform all users of the archive that a clean is about to be performed, and that the archive will be unavailable whilst this is happening.
+
+=item 2
+
+Take the archive off-line or alter directory permissions such that you are the only person that can access it.
+
+=item 3
+
+Backup the archive.
+
+=item 4
+
+Run C<CleanLocalArchive> and carefully check the list of components that are about to be cleaned. If you are happy, type 'yes' to continue, otherwise type 'no', modify your description file and re-run C<CleanLocalArchive>.
+
+=item 5
+
+Backup the C<clean_to> directory.
+
+=item 6
+
+Bring the archive back on-line.
+
+=item 7
+
+Inform all users of the archive that it is available for use once more.
+
+=back
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CleanLocalArch.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Cleaner.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,522 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use RelData;
+use File::Spec;
+
+package Cleaner;
+
+sub New {
+  my $class = shift;
+  my $iniData = shift;
+  my $remote = shift;
+  my $verbose = shift;
+  my $reallyClean = shift;
+  
+  die "Cleaner didn't get an inidata" unless $iniData;
+  die "Must tell Cleaner whether you want remote or local!!!" unless defined $remote;
+  
+  my $self = {
+    iniData => $iniData,
+    remote => $remote,
+    verbose => $verbose,
+    reallyClean => $reallyClean,
+    force => 0,
+    relsToClean => {},
+    relsToKeep => {},
+    envsToKeep => {},
+    relsToKeepAfter => {},
+    envsToKeepAfter => {},
+    keepAfter => undef,
+    cleanTo => undef,
+    remoteSite => undef,
+    cleaningSubroutine => undef,
+    expunge_already_cleaned => undef
+  };
+
+  bless $self, (ref $class || $class);
+
+  $self->{remoteSite} = $iniData->RemoteSite if ($self->{remote});
+
+  return $self;
+}
+
+sub SetCleaningSubroutine {
+  my $self = shift;
+  my $cleaningsub = shift;
+  $self->{cleaningSubroutine} = $cleaningsub;
+}
+
+sub SetFinishingSubroutine {
+  my $self = shift;
+  $self->{finishingSubroutine} = shift;
+}
+
+sub SetRevertingSubroutine {
+  my $self = shift;
+  $self->{revertingSubroutine} = shift;
+}
+
+sub ProcessDescriptionLine {
+  my $self = shift;
+  my $descriptionFile = shift;
+  my $keyWord = shift;
+  my @operand = @_;
+
+  if ($keyWord =~ /^keep_env$/) {
+    unless ($#operand == 1) {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: keep_env <component> <version>\n";
+    }
+    my $comp = lc($operand[0]);
+    my $ver = lc($operand[1]);
+    if (exists $self->{envsToKeep}->{$comp}->{$ver}) {
+      die "Error: Environment \"$comp $ver\" specified for keeping more than once\n";
+    }
+    $self->{envsToKeep}->{$comp}->{$ver} = 1;
+  }
+  elsif ($keyWord =~ /^keep_rel$/) {
+    unless ($#operand == 1) {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: keep_rel <component> <version>\n";
+    }
+    my $comp = lc($operand[0]);
+    my $ver = lc($operand[1]);
+    $self->{relsToKeep}->{$comp}->{$ver} = 1;
+  }
+  elsif ($keyWord eq "keep_recent_env") {
+    unless ($#operand == 1) {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: keep_recent_env <component> <num_days>\n";
+    }
+    my $comp = lc($operand[0]);
+    
+    my $time = $operand[1];
+    
+    if ($time !~ /^\d+$/) {
+      die "Error: The <num_days> argument for the '$keyWord' keyword must be a positive number\n";
+    }
+    
+    $time = time - ($time * 60 * 60 * 24);   
+    
+    if (exists $self->{envsToKeepAfter}->{$comp}) {
+      die "Error: keep_recent_env called more than once on component \'$comp\' in \"$descriptionFile\"\n";
+    }
+    $self->{envsToKeepAfter}->{$comp} = $time;
+  }
+  elsif ($keyWord eq "keep_recent_rel") {
+    if ($#operand == 0) {
+      if (defined $self->{keepAfter}) {
+        die "Error: \'$keyWord\' keyword used more than once with no component name in \"$descriptionFile\"\n";
+      }
+      else {
+        my $keepAfter = $operand[0];
+        
+        if ($keepAfter !~ /^\d+$/) {
+          die "Error: The <num_days> argument for the '$keyWord' keyword must be a positive number\n";
+        }
+
+        $self->{keepAfter} = time - ($keepAfter * 60 * 60 * 24);
+      }
+    }
+    elsif ($#operand == 1) {
+      my $comp = lc($operand[0]);
+      my $time = $operand[1];
+      
+      if ($time !~ /^\d+$/) {
+        die "Error: Error: The <num_days> argument for the '$keyWord' keyword must be a positive number\n";
+      }
+      
+      $time = time - ($time * 60 * 60 * 24);
+      if (exists $self->{relsToKeepAfter}->{$comp}) {
+        die "Error: keep_recent_rel called more than once on component \'$comp\' in \"$descriptionFile\"\n";
+      }
+      $self->{relsToKeepAfter}->{$comp} = $time;
+    }
+    else {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: keep_recent_rel [<component>] <num_days>\n";
+    }
+  } 
+  elsif ($keyWord =~ /^keep_recent$/) {
+    unless ($#operand == 0) {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: keep_recent <num_days>\n";
+    }
+    if (defined $self->{keepAfter}) {
+      die "Error: \'$keyWord\' keyword used more than once in \"$descriptionFile\"\n";
+    }
+    
+    my $keepAfter = $operand[0];
+    
+    if ($keepAfter !~ /^\d+$/) {
+      die "Error: The <num_days> argument for the '$keyWord' keyword must be a positive number\n";
+    }
+    
+    $self->{keepAfter} = time - ($keepAfter * 60 * 60 * 24);  
+    print "Warning: The 'keep_recent' keyword has been deprecated, as it\nresults in broken environments. You can use the 'keep_recent_rel' keyword\nwithout a component name instead if you really mean this, to get rid of this\nwarning.\n";
+  } elsif ($keyWord =~ /^force$/) {
+    if (@operand) {
+      die "Error: Incorrect number of arguments to \'$keyWord\' keyword in \"$descriptionFile\"\nSyntax: force\n";
+    }
+    if ($self->{force}) {
+      die "Error: \'$keyWord\' keyword used more than once in \"$descriptionFile\"\n";
+    }
+    $self->{force} = 1;
+  }
+  else {
+    return 0;
+    
+  }
+  return 1;
+}
+
+sub PrintEnvsToKeep {
+  my $self = shift;
+  print "Environments to keep:\n";
+  $self->TablePrintHash($self->{envsToKeep});
+}
+
+# Reads {envsToKeep} and {envsToKeepAfter}, updates {envsToKeep}, and fills out {relsToKeep}.
+sub FindRelsToKeep {
+  my $self = shift;
+
+  # Convert envsToKeepAfter into a list of envsToKeep
+  foreach my $keepEnv (keys %{$self->{envsToKeepAfter}}) {
+    my $keepAfter = $self->{envsToKeepAfter}->{$keepEnv};
+
+    foreach my $ver (keys %{$self->{archiveComponents}->{$keepEnv}}) {
+      # Check reldata time
+      my $timestamp;
+      if ($self->{remote}) {
+        my $file = $self->{iniData}->PathData->RemoteArchivePathForExistingComponent($keepEnv, $ver, $self->{iniData}->RemoteSite);
+        die "Failed to find path for \"$keepEnv\" \"$ver\"\n" unless $file;
+        $file .= "/$keepEnv$ver.zip";
+        $timestamp = $self->{remoteSite}->FileModifiedTime($file);
+        
+      } elsif (-e File::Spec->catfile($self->GetPathForExistingComponent($keepEnv, $ver), 'reldata')) {
+        my $relData = RelData->Open($self->{iniData}, $keepEnv, $ver, $self->{verbose});
+        $timestamp = $relData->ReleaseTime();
+      } else {
+        next;
+      }
+
+      if ($timestamp >= $keepAfter) {
+        $self->{envsToKeep}->{$keepEnv}->{$ver} = 1; # It's new; keep it
+      }
+    }
+  }
+
+  # Convert envsToKeep into a list of relsToKeep
+  foreach my $thisComp (sort(keys %{$self->{envsToKeep}})) {
+    foreach my $thisVer (sort(keys %{$self->{envsToKeep}->{$thisComp}})) {
+      if ($self->{verbose}) { print "Reading release data from $thisComp $thisVer...\n"; }
+   
+      my $thisCompPath = $self->{iniData}->PathData->LocalArchivePathForExistingComponent($thisComp, $thisVer);
+     
+      if ($thisCompPath) {
+        $thisCompPath = File::Spec->catfile($thisCompPath, 'reldata'); 
+      } else {
+        if ($self->{remote}) {
+          die "Error: Unable to continue since cleanremote requires a corresponding version of '$thisComp $thisVer' in your local archive(s).  Please check that your CBR configuration file is in order and is pointing to the correct location for your local archive(s).  Failing this you will need to ensure you have a copy of '$thisComp $thisVer' in one of your configured local archives\n";      
+        } else {
+          die "Internal error:  Release not found in local archive when attempting to get environment for kept component\n";
+        }
+      }
+      
+      if (-e $thisCompPath) {  
+        my $thisRelData = RelData->Open($self->{iniData}, $thisComp, $thisVer, $self->{verbose});
+        my $thisRelEnv = $thisRelData->Environment();
+   
+        foreach my $compToKeep (keys %{$thisRelEnv}) {
+          my $verToKeep = $thisRelEnv->{$compToKeep};
+          $self->{relsToKeep}->{lc($compToKeep)}->{lc($verToKeep)} = 1;
+          delete $self->{archiveComponents}->{$compToKeep}->{$verToKeep}; # saves time when finding components to remove
+        }
+      } elsif ($self->{remote}) {
+        die "Error: Unable to continue because the environment for '$thisComp $thisVer' could not be identified (corrupt release; missing reldata file)\n";
+      } else {
+        print "Warning: Unable to identify the environment for '$thisComp $thisVer'. This may result in additional component releases being cleaned from the archive.  (Corrupt release; missing reldata file)\n";
+      }
+    }
+  }
+}
+
+sub Clean {
+  my $self = shift;
+
+  # remoteSite may be defined, or it may not...
+  # If not, then this will operate on the local archive  
+  foreach my $archiveComponent (@{$self->{iniData}->PathData->ListComponents($self->{remoteSite})}) {
+    map {$self->{archiveComponents}->{$archiveComponent}->{$_} = 1} $self->{iniData}->PathData->ListVersions($archiveComponent, $self->{remoteSite});
+  }
+
+  $self->FindRelsToKeep();
+
+  if ($self->{verbose} > 1) {
+    print "Releases to keep:\n";
+    $self->TablePrintHash($self->{relsToKeep});
+  }
+
+  $self->FindRelsToClean();
+  
+  if (%{$self->{relsToClean}}) {
+    print "About to clean the following releases:\n";
+    $self->TablePrintHash($self->{relsToClean});
+    if ($self->Query("Continue?")) {
+      $self->CleanReleases();
+    }
+    else {
+      print "Aborting...\n";
+      exit;
+    }
+  }
+  else {
+    print "Nothing to clean\n";
+  }
+}
+
+# Walks the archive, filling out %relsToClean with releases that are not present in %relsToKeep.
+sub FindRelsToClean {
+  my $self = shift;
+
+  select STDOUT; $|=1;
+  
+  foreach my $thisArchComp (keys %{$self->{archiveComponents}}) {
+    foreach my $ver (keys %{$self->{archiveComponents}->{$thisArchComp}}) {
+      $self->CheckComp($thisArchComp, $ver);
+    }
+  }
+}
+
+sub CheckComp {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $thisVer = shift;
+
+  unless (exists $self->{relsToKeep}->{$comp}->{lc($thisVer)}) {
+    my $timestamp;
+    if ($self->{remote}) {
+      my $file = $self->{iniData}->PathData->RemoteArchivePathForExistingComponent($comp, $thisVer, $self->{iniData}->RemoteSite);
+      die "Failed to find path for \"$comp\" \"$thisVer\"\n" unless $file;
+      $file .= "/$comp$thisVer.zip";
+      $timestamp = $self->{remoteSite}->FileModifiedTime($file);
+    } elsif (-e File::Spec->catfile($self->GetPathForExistingComponent($comp, $thisVer), 'reldata')) {
+          my $relData = RelData->Open($self->{iniData}, $comp, $thisVer, $self->{verbose});
+          $timestamp = $relData->ReleaseTime();
+    } elsif (!$self->{reallyClean}) {
+          print "Warning: $comp $thisVer is not a complete release in " . $self->GetPathForExistingComponent($comp, $thisVer) . '.' .
+          "\nThe component may be in the process of being released into the archive or it may be corrupt." .
+          "\nRe-run with the -r option to remove this release from the archive.\n";
+          return;
+    }
+    else {
+          $self->{relsToClean}->{$comp}->{lc($thisVer)} = $thisVer;
+          return;
+    }
+         
+    if ($self->{keepAfter} && $timestamp >= $self->{keepAfter}) {
+      print "Not cleaning $comp $thisVer - too new\n";
+      return;
+    }
+    if (exists($self->{relsToKeepAfter}->{$comp}) && $timestamp >= $self->{relsToKeepAfter}->{$comp}) {
+      print "Not cleaning $comp $thisVer - too new\n";
+      return;
+    }
+    $self->{relsToClean}->{$comp}->{lc($thisVer)} = $thisVer;
+  }
+}
+
+sub TablePrintHash {
+  my $self = shift;
+  my $hash = shift;
+  my @tableData;
+  foreach my $thisComp (sort keys %{$hash}) {
+    foreach my $thisVer (sort keys %{$hash->{$thisComp}}) {
+      push (@tableData, [$thisComp, $thisVer]);
+    }
+  }
+  $self->{iniData}->TableFormatter->PrintTable(\@tableData);
+  print "\n";
+}
+
+sub CleanReleases {
+  my $self = shift;
+
+  my $cleaningsub = $self->{cleaningSubroutine};
+  die "No execution sub provided" unless ref $cleaningsub;
+
+  my $failed = 0;
+  my $cleaned = {};
+
+  print "Cleaning...\n";
+
+  foreach my $thisComp (sort keys %{$self->{relsToClean}}) {
+    foreach my $thisVer (sort values %{$self->{relsToClean}->{$thisComp}}) { # use values to get correct case
+      my $path = $self->GetPathForExistingComponent($thisComp, $thisVer);
+      if (!defined($path)) {
+        print "Unable to get path for $thisComp $thisVer: possible disconnection of FTP site?\n";
+        $failed = 1;
+        last;
+      }
+      elsif (&$cleaningsub($thisComp, $thisVer, $path)) {
+        # Cleaning worked
+        $cleaned->{$thisComp}->{lc($thisVer)} = [$thisVer, $path];
+      }
+      else {
+        print "Unable to delete $thisComp $thisVer from $path\n";
+        $failed = 1;
+        last;
+      }
+    }
+    if ($failed) {
+      last;
+    }
+  }
+
+  if ($failed) {
+    my $revertsub = $self->{revertingSubroutine};
+    if (ref $revertsub) {
+      # Attempt to roll back
+      print "Warning: Cleaning failed. Rolling back...\n";
+      $failed = 0;
+      foreach my $undoComp (sort keys %$cleaned) {
+	my @vers = map( $_->[0], values %{$cleaned->{$undoComp}} );
+        foreach my $undoVer (sort @vers) {
+          my $path = $cleaned->{$undoComp}->{lc($undoVer)}->[1];
+          if (!&$revertsub($undoComp, $undoVer, $path)) {
+            $failed = 1;
+	  }
+	}
+      }
+      if ($failed) {
+        die "Warning: Cleaning failed and rollback also failed - the archive may have been left in an indeterminate state\n";
+      }
+    }
+    else {
+      # No rollback routine
+      die "Warning: Cleaning failed - the archive may have been left in an indeterminate state\n";
+    }
+  }
+  else {
+    my $finishingsub = $self->{finishingSubroutine};
+    if (ref $finishingsub) {
+      # Finish the job
+      foreach my $thisComp (sort keys %{$cleaned}) {
+	my @vers = map( $_->[0], values %{$cleaned->{$thisComp}} );
+        foreach my $thisVer (sort @vers) {
+          my $path = $cleaned->{$thisComp}->{lc($thisVer)}->[1];
+          if (!&$finishingsub($thisComp, $thisVer, $path)) {
+            print "Warning: Failed to complete cleaning of $thisComp at version $thisVer\n";
+            $failed = 1;
+          }
+        }
+      }
+    }
+    if (!$failed) {
+      print "Cleaning complete.\n";
+    }
+  }
+}
+
+sub GetPathForExistingComponent {
+  my $self = shift;
+  my $thisComp = shift;
+  my $thisVer = shift;
+  my $path;
+  if ($self->{remote}) {
+    $path = $self->{iniData}->PathData->RemoteArchivePathForExistingComponent($thisComp, $thisVer, $self->{remoteSite});
+  } else {
+    $path = $self->{iniData}->PathData->LocalArchivePathForExistingComponent($thisComp, $thisVer);
+  }
+  return $path;
+}
+
+sub Query {
+  my $self = shift;
+  my $msg = shift;
+
+  if ($self->{force}) {
+    print "Skipping question \"$msg\" because of \"force\" keyword - assuming \"yes\"\n" if ($self->{verbose});
+    return 1;
+  }
+
+  print "$msg [yes/no] ";
+  my $response = <STDIN>;
+  chomp $response;
+  return ($response =~ m/^y/i);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Cleaner.pm - A module to clean an archive
+
+=head1 DESCRIPTION
+
+A module to clean an archive. Supposed to implement the common bits between C<cleanlocalarch> and C<cleanremote>, but the first of those commands has been temporarily suspended. The basic plan is: let it process the lines of your cleaning description file, then give it a subroutine to operate on the releases that should be cleaned. It will do the intervening stages of working out what releases should be kept, and which should be clean.
+
+=head1 INTERFACE
+
+=head2 New
+
+Pass it an IniData object, and a 0 or 1 to indicate whether it should act locally or remotely. If it's acting remotely, it will get a RemoteSite object from the IniData object.
+
+=head2 SetCleaningSubroutine
+
+Pass in a reference to a subroutine to actually do the first phase of cleaning. The subroutine will be passed the component name, the version number and the path. If this phase passes, the optional finishing routine will be called next. If it fails at any point, the reverting routine (if defined) will be called on each component which was 'cleaned'.
+
+=head2 SetFinishingSubroutine
+
+Pass in a reference to a 'finishing' subroutine to complete the cleaning (see L<SetCleaningSubroutine|setcleaningsubroutine>). If this routine has not been called then no finishing routine will be set up, and the clean will be said to have completed once the first phase is done. The finishing subroutine will be passed the component name, the version number and the path.
+
+=head2 SetRevertingSubroutine
+
+Pass in a reference to a 'reverting' subroutine to undo any 'cleaned' components (see L<SetCleaningSubroutine|setcleaningsubroutine>). If this routine has not been called then the cleaner will not attempt to revert changes if cleaning fails. The reverting subroutine will be passed the component name, the version number and the (original) path.
+
+=head2 ProcessDescriptionLine
+
+This should be passed the name of the description file (for error messages only), then a keyword, then an array of operands. It will interpret lines keep_rel, keep_env, force, and keep_recent. If it understands a line it returns 1; otherwise it returns 0.
+
+=head2 PrintEnvsToKeep
+
+This just prints a list of the environments it is going to keep.
+
+=head2 Clean
+
+This actually does the cleaning. It first finds the releases to keep, then finds the releases to clean, then runs the cleaning subroutine for each one.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CommandController.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,294 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package CommandController;
+
+use strict;
+
+
+#
+# Constants.
+#
+
+use constant READER_SEMAPHORE_NAME => "CommandControllerReaderSemaphore_";
+use constant WRITER_SEMAPHORE_NAME => "CommandControllerWriterSemaphore_";
+use constant MAX_NUM_CONCURRENT_READERS => 100;
+use constant CMD_INDEPENDANT => 0; # Commands that can be run regardless of what else is running.
+use constant CMD_ENV_READER => 1;  # Commands that only read the environment.
+use constant CMD_ENV_WRITER => 2;  # Commands that modify the environment.
+
+my %commandInfo = (
+ 		   EnvMembership => CMD_INDEPENDANT,
+		   CleanRemote => CMD_INDEPENDANT,
+		   ExportEnv => CMD_INDEPENDANT,
+		   ExportRel => CMD_INDEPENDANT,
+		   CopyRel => CMD_INDEPENDANT,
+		   ImportEnv => CMD_INDEPENDANT,
+		   ImportRel => CMD_INDEPENDANT,		
+		   LatestVer => CMD_INDEPENDANT,
+		   PullEnv => CMD_INDEPENDANT,
+		   PushEnv => CMD_INDEPENDANT,
+		   PushRel => CMD_INDEPENDANT,
+		   PullRel => CMD_INDEPENDANT,
+		   DeltaEnv => CMD_INDEPENDANT,
+		   BinInfo => CMD_ENV_READER,
+		   SourceInfo => CMD_ENV_READER,
+		   DiffEnv => CMD_ENV_READER,
+		   DiffRel => CMD_ENV_READER,
+		   ModNotes => CMD_ENV_READER,
+		   ViewNotes => CMD_ENV_READER,
+		   BuildRel => CMD_ENV_READER,
+		   EnvSize => CMD_ENV_READER,
+		   MakeSnapShot => CMD_ENV_READER,
+		   CleanEnv => CMD_ENV_WRITER,
+		   EnvInfo => CMD_ENV_WRITER,
+		   GetEnv => CMD_ENV_WRITER,
+		   GetRel => CMD_ENV_WRITER,
+		   GetSource => CMD_ENV_WRITER,
+		   InstallSnapShot => CMD_ENV_WRITER,
+		   MakeEnv => CMD_ENV_WRITER,
+		   MakeRel => CMD_ENV_WRITER,
+		   RemoveRel => CMD_ENV_WRITER,
+		   RemoveSource => CMD_ENV_READER,
+		   PrepEnv => CMD_ENV_WRITER,
+		   PrepRel => CMD_ENV_WRITER,
+		   ValidateEnv => CMD_ENV_WRITER,
+		   ValidateRel => CMD_ENV_WRITER,
+		   EnvData => CMD_ENV_WRITER
+		  );
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{iniData} = shift;
+  $self->{command} = shift;
+  unless ($self->{iniData}->Win32ExtensionsDisabled()) {
+    $self->OpenSemaphores();
+    unless ($self->CanRun()) {
+      die "Error: Cannot run $self->{command} because another command is already running\n";
+    }
+  }
+  return $self;
+}
+
+
+#
+# Private.
+#
+
+sub CanRun {
+  my $self = shift;
+  $self->{canRun} = 0;
+  my $commandType = $self->CommandType();
+  if ($commandType == CMD_INDEPENDANT) {
+    $self->{canRun} = 1;
+  }
+  elsif ($commandType == CMD_ENV_READER) {
+    unless ($self->WriterRunning()) {
+      $self->{canRun} = 1;
+      $self->IncReadersRunning();
+    }
+  }
+  elsif ($commandType == CMD_ENV_WRITER) {
+    if (($self->NumReadersRunning() == 0) and not $self->WriterRunning()) {
+      $self->{canRun} = 1;
+      $self->SetWriterRunning();
+    }
+  }
+  return $self->{canRun};
+}
+
+sub DESTROY {
+  my $self = shift;
+  if ($self->{canRun}) {
+    my $commandType = $self->CommandType();
+    if ($commandType == CMD_INDEPENDANT) {
+      # Nothing to do.
+    }
+    elsif ($commandType == CMD_ENV_READER) {
+      $self->DecReadersRunning();
+    }
+    elsif ($commandType == CMD_ENV_WRITER) {
+      $self->ClearWriterRunning();
+    }
+  }
+}
+
+sub OpenSemaphores {
+  my $self = shift;
+  my $currentEnvironment = Utils::CurrentDriveLetter() . lc(Utils::EpocRoot());
+  $currentEnvironment =~ s/[:\\\/]+/_/g; # Can't have slashes in semaphore name
+  
+  require Win32::Semaphore;
+  # No longer 'use', as that fails with some versions of Perl
+  $self->{writerSemaphore} = Win32::Semaphore->new(0, 2, WRITER_SEMAPHORE_NAME . $currentEnvironment) or die; # 2 because when counting the semaphore, it need to be incremented and then decremented (release(0, $var) doesn't work).
+  $self->{readerSemaphore} = Win32::Semaphore->new(0, MAX_NUM_CONCURRENT_READERS, READER_SEMAPHORE_NAME . $currentEnvironment) or die;
+}
+
+sub CommandType {
+  my $self = shift;
+  die unless exists $commandInfo{$self->{command}};
+  return $commandInfo{$self->{command}};
+}
+
+sub WriterRunning {
+  my $self = shift;
+  my $writerRunning = SemaphoreCount($self->{writerSemaphore});
+  die if $writerRunning > 1;
+  return $writerRunning;
+}
+
+sub SetWriterRunning {
+  my $self = shift;
+  SemaphoreInc($self->{writerSemaphore});
+}
+
+sub ClearWriterRunning {
+  my $self = shift;
+  SemaphoreDec($self->{writerSemaphore});
+}
+
+sub NumReadersRunning {
+  my $self = shift;
+  return SemaphoreCount($self->{readerSemaphore});
+}
+
+sub IncReadersRunning {
+  my $self = shift;
+  SemaphoreInc($self->{readerSemaphore});
+}
+
+sub DecReadersRunning {
+  my $self = shift;
+  SemaphoreInc($self->{readerSemaphore});
+}
+
+sub SemaphoreCount {
+  my $semaphore = shift;
+  my $count;
+  $semaphore->release(1, $count) or die;
+  $semaphore->wait();
+  return $count;
+}
+
+sub SemaphoreInc {
+  my $semaphore = shift;
+  $semaphore->release(1) or die;
+}
+
+sub SemaphoreDec {
+  my $semaphore = shift;
+  $semaphore->wait();
+}
+
+1;
+
+=head1 NAME
+
+CommandController.pm - Provides a means of controlling which commands can run concurrently within a single environment.
+
+=head1 DESCRIPTION
+
+Certain commands can reliably be run while others are running, whereas others must be run in isolation. This class has responsibility for defining a set of rules regarding concurrent running of commands and ensuring that they are followed. Each command is classified into one of three types:
+
+=over 4
+
+=item 1 Independant
+
+Commands of this type can be run regardless of whatever else may also be running at the time because they neither read nor modify the environment. Commands of this type:
+
+ 		   EnvMembership
+		   CleanRemote
+		   ExportEnv
+		   ExportRel
+		   ImportEnv
+		   ImportRel		
+		   LatestVer
+		   PullEnv
+		   PullRel
+		   PushEnv
+		   PushRel
+		   DeltaEnv
+
+
+=item 2 Environment readers
+
+Commands of this type can be run provided there aren't any writers running. Commands of this type:
+
+		   BinInfo
+		   DiffEnv
+		   DiffRel
+                   MakeSnapShot
+		   ModNotes
+                   RemoveSource
+		   ViewNotes
+
+=item 3 Environment writers
+
+Commands of this type may modify the state of the environment, and so may only run providing there are no other writers or readers running. Commands of this type:
+
+		   CleanEnv
+		   EnvInfo
+		   GetEnv
+		   GetRel
+		   GetSource
+                   InstallSnapShot
+		   MakeEnv
+		   MakeRel
+		   RemoveRel
+		   PrepEnv
+		   PrepRel
+		   ValidateEnv
+		   ValidateRel
+
+=back
+
+To enforce these runs, multiple instances of C<CommandController> (running in different processes) need to know what else is running at any particular point in time. This information could have been stored in a file, but this has the significant problem that commands that are prematurely killed by the user (perhaps by hitting ctrl-c), they will not cleanup after themselves and so the environment could get stuck in an invalid state. To avoid this problem, a pair of Win32 semaphores are used to count the number of readers and writers currently active at any point in time. Note, only the counting properties of the semaphores are used, which is somewhat unusual (normally semaphores are used to control the execution of threads). The advantage of this scheme is that even if a command is prematurely killed by the user, its handles to the semaphoreswill be released. This may mean that for a period of time the semaphores may have invalid value, but once all commands that are currently running have completed, the semaphores will be destroyed (kernel side) and the environment is guaranteed of being in a 'ready to run' state.
+
+=head1 INTERFACE
+
+=head2 New
+
+Expects to be passed an C<IniData> reference and the name of the command that is about to be run (this is case sensitive). Creates and returns a new C<CommandController> instance if the command if free to run. Dies if not. The C<IniData> reference is used to determine if Win32 extensions have been disabled. If this is the case then the check to see if this command is free to run is not done (since doing so relies on Win32 functionality).
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CopyRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,147 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use CommandController;
+use CopyRel;
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $force = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'CopyRel');
+my $component;
+my $versionToCopy;
+my $version;
+my $internalVersion;
+my $project;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrintHeinousWarning();
+CopyRel();
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "f" => \$force, "v+" => \$verbose, "w=s" => \$project);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $component = shift @ARGV;
+  $versionToCopy = shift @ARGV;
+  $version = shift @ARGV;
+  $internalVersion = shift @ARGV;
+
+  unless (defined $component and defined $versionToCopy and defined $version and defined $internalVersion and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: copyrel [options] <component> <external_version_to_copy> <new_external_version> <new_internal_version>
+
+options:
+
+-h                    help
+-f                    if check fails, overwrite external copy
+-v                    verbose output (-vv very verbose)
+-w <project>          copy the release in given \"project\"
+\n");
+}
+
+sub PrintHeinousWarning {
+  Utils::QueryUnsupportedTool(<<GUILTY, 0);  # Set $reallyrun as 0
+Warning: This operation may pollute the archive if used incorrectly. 
+Also note that if the copy fails because of an interruption, disk 
+full or a network error, you must re-run copyrel with -f. 
+
+Do you want to continue? (y/n)
+GUILTY
+}
+
+sub CopyRel {
+  my $cr = new CopyRel($iniData, $force, $verbose, $project);
+  
+  $cr->CopyRelease($component, $versionToCopy, $version, $internalVersion);
+  $cr->SummariseErrors(1);
+}
+
+
+__END__
+
+=head1 NAME
+
+CopyRel - Modifies an archive so that an additional release version is created which is a copy of a release version input.
+
+=head1 SYNOPSIS
+
+  copyrel [options] <component> <external_version_to_copy> <new_external_version> <new_internal_version>
+
+options:
+
+  -h                    help
+  -f                    if check fails, overwrite external copy
+  -v                    verbose output (-vv very verbose)
+  -w <project>          copy the release in given \"project\"
+
+=head1 DESCRIPTION
+
+The command CopyRel is used to create a new release which is based upon another release. The contents of the new release version is identical to the release input, except the external and internal version is updated as specified.
+
+By using CopyRel a new baseline release can be created, which will inherit the environment of the original baseline release version that was copied. This is useful renumbering a baseline.
+
+By default the new release is created in the same archive as the release which is copied. The option -w <project> changes the default behavior so that the archive to create the new release can be set as <project>.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CopyRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/CopyRel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,179 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# CopyRelease - contains fuctions to copy a release in an archive
+#
+
+package CopyRel;
+
+use strict;
+use RelData;
+use PushPullRel;
+
+BEGIN {
+  @CopyRel::ISA=('PushPullRel');
+};
+
+sub new {
+  my $class = shift;
+  my $inidata = shift; 
+  my $force = shift;
+  my $verbose = shift;
+  my $project = shift;
+
+  my $self = bless {}, (ref $class || $class);
+
+  $self->{iniData} = $inidata;
+  $self->{force} = $force;
+  $self->{verbose} = $verbose;
+  $self->{project} = $project;
+  $self->{errors} = [];
+  
+  return $self;
+}
+
+sub CopyRelease {
+  my $self = shift;
+  my $component = shift;
+  my $versionToCopy = shift;
+  my $version = shift; 
+  my $internalVersion = shift;
+
+  my $releaseDir = $self->ObtainReleaseDir($component, $versionToCopy);
+  my $releaseCopyDir;
+  
+  # Obtain the release copy directory
+  if(defined $self->{project}){
+    $releaseCopyDir = $self->{iniData}->PathData->LocalArchivePathForNewComponent($component, $version, $self->{project});
+  }
+  else{
+    $releaseCopyDir = $releaseDir; 
+    $releaseCopyDir =~ s/$versionToCopy$/$version/; 
+  }
+  
+  eval {
+    
+    # Preform the copying of files
+    $self->PerformCopying($component, $versionToCopy, $releaseCopyDir, $releaseDir);
+    
+    if($versionToCopy !~ /^$version$/i || $versionToCopy !~ /^$internalVersion$/i){
+      # Update the reldata so that the release number is correct...
+      $self->UpdateRelData($component, $version, $internalVersion);
+    }
+  };
+  
+  if ($@) {
+    print "$@";
+    $self->_AddError($@);
+  }
+}
+
+sub UpdateRelData {
+  my $self = shift;
+  my $component = shift;
+  my $version = shift;
+  my $internalVersion = shift;
+  
+  my $reldata;
+  
+  if (!($reldata = RelData->Open($self->{iniData}, $component, $version, 0))) {
+    die "ERROR: Couldn't open version '$version' of '$component'";
+  }
+  
+  $reldata->UpdateProject($self->{project});
+  $reldata->UpdateInternalVersion("$internalVersion");
+
+  my $env = $reldata->Environment;
+
+  foreach my $thisComp (sort keys %{$env}) {
+    
+    if($thisComp =~ /$component/i) {
+      $env->{$thisComp} = $version;
+    }
+  }
+  
+  $reldata->UpdateEnv($env);
+}
+
+sub ObtainReleaseDir {
+  my $self = shift;
+  my $component = shift;
+  my $version = shift;
+  
+  my $releaseDir;
+  
+  if (!($releaseDir = $self->{iniData}->PathData->LocalArchivePathForExistingComponent($component, $version))) {
+    die "ERROR: Couldn't locate component '$component' at version '$version'";
+  }
+
+  return $releaseDir;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+CopyRel.pm - Class for copying a release version.
+
+=head1 DESCRIPTION
+
+Provides an API to create a new release version which is a copy of an another release. This class extends the methods provide by PushPullRel.pm to enable the copying of a release version.
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a new object of this class. Takes four parameters. 1) An IniData object corresponding
+to your local repository. 2) Force (overwrites). 3) Verbose.  4) Project name to uses, which is associated to archive paths as set the reltools.ini.
+
+=head2 CopyRelease
+
+Takes component name, verson to copy, new version and new internal version. Is used to initiate the copying of a release.
+
+=head2 UpdateRelData
+
+Takes component name, version and internal version. Is used to update the reldata of a newly copied release so that the release version information is correct in the reldata file.
+
+=head2 ObtainReleaseDir
+
+Takes component name and version. Is used to get the release dir using the component name and version as input.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Crypt.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,318 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package Crypt;
+
+use strict;
+
+#
+# Constructor
+#
+
+sub New {
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my %args = @_;
+  my $self = {
+	      defaultPath => $args{default_path},
+	      verbose => $args{verbose}
+	     };
+  bless $self, $class;
+  $self->Initialize();
+  return $self;
+}
+
+sub Initialize {
+  my $self = shift;
+  
+  #convert defaultPath attribute to correct format
+  if ($self->{defaultPath}) {
+    $self->DefaultPath($self->{defaultPath});
+  }
+}
+
+#
+# Public getters/setters
+#
+
+sub DefaultPath {
+  my $self = shift;
+  
+  if (defined $_[0]) {
+    my $defaultPath = shift;
+    $defaultPath =~ s/\\/\//g;  #replace '\'s with / 
+    $defaultPath =~ s/\/+$//;   #remove trailing '/'s  
+    $self->{defaultPath} = $defaultPath;
+    delete $self->{publicKeys};   #new default path implies new keyring files so delete  
+    delete $self->{secretKeys};   #the current key lists
+  }
+  return $self->{defaultPath};
+}
+
+#
+# Public methods
+#
+
+sub Encrypt {
+  my $self = shift;
+  my $plainText = shift;
+  my $cipherText = shift;
+  my @recipientKeys = @{$_[0]};
+
+  unless (defined $plainText and defined $cipherText and @recipientKeys) {
+    die "Error: Incorrect arguments for encryption.\n";
+  }
+  $plainText=~ s/\\/\//g;  #replace '\'s with /`s
+  $cipherText=~ s/\\/\//g;
+
+  if ($self->{verbose} > 1) {
+    print "Encrypting $plainText with key(s) ".join(", ",@recipientKeys)."\n";
+  }
+
+  unless (-e $plainText) {
+    die "Error: Encryption aborted. $plainText does not exist.\n";
+  }
+  #check to see if all the recipient keys exist on the public keyring
+  foreach my $recipientKey (@recipientKeys) {
+    $self->PublicKeyExists($recipientKey) 
+      or die "Error: Encryption failed. $recipientKey not in keyring.\n";
+  }
+  
+  #call subclass method to actually encrypt file
+  $self->DoEncrypt($plainText, $cipherText, \@recipientKeys);
+  
+  #throw an error if encrypted file not created
+  unless (-e $cipherText) {
+    die "Error: Encryption of $plainText failed.\n";
+  }
+}
+
+sub Decrypt {
+  my $self = shift;
+  my $cipherText = shift;
+  my $plainText = shift;
+  my $passPhrase = shift;
+
+  unless (defined $plainText and defined $cipherText and defined $passPhrase) {
+    die "Error: Incorrect arguments for decryption.\n";
+  }
+  $plainText=~ s/\\/\//g;  #replace '\'s with /`s
+  $cipherText=~ s/\\/\//g;
+
+  if ($self->{verbose} > 1) {
+    print "Decrypting $cipherText\n";    
+  }
+
+  unless (-e $cipherText) {
+    die "Error: Decryption aborted. $cipherText does not exist.\n";
+  }
+  #call subclass method to actually decrypt file
+  $self->DoDecrypt($cipherText, $plainText, $passPhrase);
+  
+  #throw an error if decrypted file not created
+  unless (-e $plainText) {
+    die "Error: Decryption of $cipherText failed.\n";
+  }	
+}
+
+sub PublicKeyList {
+  my $self = shift;
+
+  unless (exists $self->{publicKeys}) {
+    #call subclass method to get key list
+    foreach my $key (@{$self->GetPublicKeyList()}) {
+      $self->{publicKeys}->{uc($key)} = 1;
+    }	
+  }
+  my @keys = keys %{$self->{publicKeys}};
+  return \@keys;
+}
+
+sub SecretKeyList {
+  my $self = shift;
+
+  unless (exists $self->{secretKeys}) { 
+    #call subclass method to get key list 
+    foreach my $key (@{$self->GetSecretKeyList()}) {
+      $self->{secretKeys}->{uc($key)} = 1;
+    }
+  }
+  my @keys = keys %{$self->{secretKeys}};
+  return \@keys;
+}
+
+
+sub PublicKeyExists {
+  my $self = shift;
+  my $requiredKey = shift;
+
+  unless (exists $self->{publicKeys}) {
+    $self->PublicKeyList();
+  }
+  return ($self->{publicKeys}->{uc($requiredKey)});
+}
+
+sub SecretKeyExists {
+  my $self = shift;
+  my $requiredKey = $_[0];
+
+  unless (exists $self->{secretKeys}) {
+    $self->SecretKeyList();
+  }
+  return ($self->{secretKeys}->{uc($requiredKey)});
+}
+
+#
+# Abstract methods (must be implemented in a subclass)
+#
+
+sub DoEncrypt {
+  die "Error: Call to abstract method ".ref($_[0])."::_DoEncrypt.\n";
+}
+
+sub DoDecrypt {
+  die "Error: Call to abstract method ".ref($_[0])."::_DoDecrypt.\n";
+}
+
+sub GetPublicKeyList {
+  die "Error: Call to abstract method ".ref($_[0])."::_GetPublicKeyList.\n";
+}
+
+sub GetSecretKeyList {
+  die "Error: Call to abstract method ".ref($_[0])."::_GetSecretKeyList.\n";
+}
+
+#
+# Private methods
+#
+
+sub Quoted {
+  my $self = shift;
+  my $string = $_[0];
+  return ($string =~ /^\s*(\".*\")\s*$/) ? $1 : "\"$string\"";
+}
+
+1;
+
+=head1 NAME
+
+Crypt.pm - Abstract base class to crypt modules.
+
+=head1 SYNOPSIS
+
+ use Crypt::PGP;
+
+ $crypt = Crypt::PGP->New(default_path => 'somePath/someDir',
+                          verbose => 1);
+
+ $crypt->DefaultPath('somedir/anotherdir');
+ $defaultpath = $crypt->DefaultPath();
+
+ @publickeys = @{$crypt->PublicKeyList()};
+ @secretkeys = @{$crypt->SecretKeyList()};
+
+ $crypt->Encrypt('somefile.txt', 'somefile.pgp', ['0x24534213', '0x1EA3B4DC', '0x8721DACE']);
+ $crypt->Decrypt('somefile.pgp', 'somefile.txt', 'mypassphrase');
+
+
+=head1 DESCRIPTION
+
+C<Crypt> is the abstract base class to a family of modules of the form C<Crypt::>F<PGPTool> which are simple wrappers over PGP command line tools. Each module in the C<Crypt> directory must implement the following abstract interface...
+
+=over 4
+
+=item * DoEncrypt($plainText, $cipherText, \@recipientKeys)
+
+Should encrypt the C<$plainText> file with the public keys C<@recipientKeys> and store the result in the C<$cipherText> file.
+
+=item * DoDecrypt($cipherText, $plainText, $passPhrase)
+
+Should decrypt the C<$cipherText> file using the secret key with pass phrase C<$passPhrase> and store the result in the C<$plainText> file. Must die with C<"BAD_PASSPHRASE"> if passphrase incorrect and C<"NO_SECKEY"> if secret key not available for decrypting file.
+
+=item * array_ref GetPublicKeyList( )
+
+Should return the list of keyids stored on the public keyring.
+
+=item * array_ref GetSecretKeyList( )
+
+Should return the list of keyids stored on the secret keyring.
+
+=back
+
+B<NOTE:> A key id is an 8 digit hexadecimal number preceeded by a zero and an x (or X) e.g 0x12345678, 0X3eDC2A82
+
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  default_path  => $path_string
+  verbose       => $verbosity_integer
+
+Returns a reference to an object derived from C<Crypt> (C<Crypt> is abstract so cannot be instantiated)
+
+=head2 DefaultPath
+
+Returns the current value of the C<defaultPath> attribute which stores the path to the users configuration and keyring files. If the C<defaultPath> is undefined then the tools default path is used. If passed a path as an argument sets the C<defaultPath> attribute to this value and updates the public and secret keyring file names. 
+
+=head2 Encrypt
+
+Passed a plain text file name, a cipher text file name and a reference to an array of recipients pgp keyids. Encrypts the plain text file with the recipients keys. Outputs the result to the cipher text file.
+
+=head2 Decrypt
+
+Passed a cipher text file name, a plain text file name and the users private key pass phrase. Decrypts the cipher text file with the users private key and outputs the result to the plain text file.
+
+=head2 PublicKeyList
+
+Returns a reference to an array of keyids for keys stored in the public keyring
+
+=head2 SecretKeyList
+
+Returns a reference to an array of keyids for keys stored in the secret keyring
+
+=head2 PublicKeyExists
+
+Passed a public key id. Returns true if the key exists in the public keyring
+
+=head2 SecretKeyExists
+
+Passed a secret key id. Returns true if the key exists in the secret keyring
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Crypt/GPG.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,311 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Crypt::GPG.pm
+#
+
+package Crypt::GPG;
+
+use strict;
+use File::Basename;
+use IPC::Open2;
+use IO::Handle;
+
+use Crypt;
+use vars qw(@ISA);
+@ISA=("Crypt");
+
+# Overidden methods from Crypt.pm
+
+sub Initialize {
+  my $self = shift;
+
+  #check to see if the pgp executable exists
+  grep {-x "$_/gpg.exe"} split /;/, $ENV{PATH}
+    or die "Error: The PGP executable \"gpg.exe\" does not exist in users path\n";
+
+  #call super class method
+  $self->SUPER::Initialize();
+
+  #check for existence of keyrings and keys
+  $self->CheckKeyRings();
+}
+
+#
+# Implemented abstract methods from Crypt.pm
+#
+
+sub DoEncrypt {
+  my $self = shift;
+  my $plainText = shift;
+  my $cipherText = shift;
+  my @recipientKeys = @{$_[0]};
+
+  $self->CheckKeyRings();
+
+  #build options list
+  my @options = qw(--batch --no-tty --yes --always-trust);
+  push @options, '--status-fd 1';
+  push @options, '-o '.$self->Quoted($cipherText);
+  if ($self->DefaultPath()) {
+    push @options, '--homedir '.$self->Quoted($self->DefaultPath());
+  }
+  foreach my $key (@recipientKeys) {
+    if ($key =~ /^0x([0-9a-fA-F]{8})$/i) {
+      push @options, '-r '.$1;
+    }
+  }
+  my @command = '-e '.$self->Quoted($plainText);
+
+  # Do encryption. This occasionally fails due to GPG failing to read
+  # the random_seed file when we get a return value of 2. Until we get
+  # a later version of gpg checked as compatible, just retry if this happens.
+  my $retries = 2;
+  my $retval;
+  do {
+      my $cmd = "gpg @options @command";
+      print "Executing command: $cmd\n" if $self->{verbose} > 1;
+      open GPG, "$cmd 2>&1 |" or die "Error: Encrypt command failed.\n";
+      my $error;
+      while (my $line = <GPG>) {
+        if ($self->{verbose} > 1) {
+          print "\t$line";
+        }
+      }
+      close GPG;
+      $retval = $? >> 8;
+      $retries = 0 unless( $retval == 2 );  # Only retry if retval is 2.
+      if( $retval ) {
+        print "WARNING: GPG failure. Error code $retval. ";
+        print "Retrying GPG..." if( $retries > 0 );
+        print "\n";
+      }
+  } while( $retries-- > 0 );
+  die "ERROR: GPG returned error code $retval.\n" if ($retval > 0);
+}
+
+sub DoDecrypt {
+  my $self = shift;
+  my $cipherText = shift;
+  my $plainText = shift;
+  my $passPhrase = shift;
+
+  $self->CheckKeyRings();
+
+  #build options list
+  my @options = qw(--batch);
+  push @options, '--status-fd 1';
+  push @options, '--passphrase-fd 0';
+  push @options, '-o '.$self->Quoted($plainText);
+  if ($self->DefaultPath()) {
+    push @options, '--homedir '.$self->Quoted($self->DefaultPath());
+  }
+  my @command = '-d '.$self->Quoted($cipherText);
+
+  #do decryption reading passphrase from STDIN writing output to log file
+  my $gpgOutput = '/gpg_output.log';
+  my $cmd = "gpg @options @command";
+
+  # retry 100 times of GPG and opening GPG output
+  my $retries = 100;
+  while ($retries > 0) {
+    print "Executing command: $cmd\n" if $self->{verbose} > 1;
+    if (open GPGIN, "| $cmd 2>NUL 1> $gpgOutput") {
+      print GPGIN "$passPhrase\n";
+      while (my $line  = <GPGIN>) {
+      }
+      close GPGIN;
+	  
+      #open output of gpg command from file for parsing
+      if (open GPGOUT, "$gpgOutput") {
+        #open output of gpg successfully, then jump out and go ahead
+        last;
+      }
+      else {
+        print "Warning: Cannot open gpg output file, $!\n";
+      }
+    }
+    else {
+      print "Warning: Error: Decrypt command failed, $!\n";
+    }
+    $retries--;
+
+    # sleep 10 seconds for next try
+    sleep(10);
+  }
+  die "Error: Cannot create or open output log file for $cipherText.\n" if ($retries<=0);
+  
+  my $badPassPhrase =0;
+  my %enc_to;
+  my %no_seckey;
+  my $keyTally = 0;
+  my $useKeyTally = 0; # Fallback for if parsing fails
+  while (my $line = <GPGOUT>) {
+    if ($self->{verbose} > 1) {
+      print "\t$line";
+    }
+    next if ($line =~ /^\s*$/);
+    if ($line =~ /BAD_PASSPHRASE/) {
+      $badPassPhrase = 1;
+    }
+    elsif ($line =~ /GOOD_PASSPHRASE/) {
+      $badPassPhrase = 0;
+    }
+    elsif ($line =~ /ENC_TO/) {
+      if ($line =~ /ENC_TO\s+([\dA-F]*)/) {
+        $enc_to{$1} = $1; # Value is unimportant
+      } else {
+        $useKeyTally = 1;
+      }
+      --$keyTally;
+    }
+    elsif ($line =~ /NO_SECKEY/) {
+      if ($line =~ /NO_SECKEY\s+([\dA-F]*)/) {
+        $no_seckey{$1} = $1; # Value is unimportant
+      } else {
+        $useKeyTally = 1;
+      }
+      --$keyTally;
+    }
+  }
+  close GPGOUT;
+  my $retval = $? >> 8;
+  unlink $gpgOutput;
+
+  if (!$useKeyTally) {
+    foreach my $key (keys(%no_seckey)) {
+      delete $no_seckey{$key};
+      if (exists $enc_to{$key}) {
+        delete $enc_to{$key};
+      } else {
+        die "Error: Parsing of GPG output failed. Got a NO_SECKEY for no corresponding ENC_TO.\n";
+      }
+    }
+    $keyTally = scalar(keys(%enc_to)); # Number of private keys
+  }
+
+  #handle specific decryption errors
+  if ($badPassPhrase and $keyTally != 0) {
+    die "Error: Decryption of $cipherText failed. BAD_PASSPHRASE\n";
+  }
+  elsif ($keyTally == 0) {
+    die "Error: Decryption of $cipherText failed. No decrypting key available. NO_SECKEY\n";
+  }
+  elsif ($keyTally < 0) {
+    # Parsing failed, and we got spurious NO_SECKEY messages
+    die "Error: Parsing of GPG output failed. Too many NO_SECKEYs\n";
+  }
+  die "Error code returned by gpg: $retval.\n" if ($retval > 0);
+}
+
+sub GetPublicKeyList {
+  my $self = shift;
+
+  my @options;
+  if ($self->DefaultPath()) {
+    push @options, '--homedir '.$self->Quoted($self->DefaultPath());
+  }
+  my @command = qw(--list-keys);
+
+  #list and extract keyids
+  open GPG, "gpg @options @command 2>&1 |" or die "Error: List keys command failed.\n";
+  my @keys;
+  while (my $line = <GPG>) {
+    if ($line =~ /^pub.*?([0-9a-fA-F]{8})\b/i) {
+      push @keys, '0x'.$1;
+    }
+  }
+  close GPG;
+  return \@keys;
+}
+
+sub GetSecretKeyList {
+  my $self = shift;
+
+  my @options;
+  if ($self->DefaultPath()) {
+    push @options, '--homedir '.$self->Quoted($self->DefaultPath());
+  }
+  my @command = qw(--list-secret-keys);
+
+  #list and extract keyids
+  open GPG, "gpg @options @command 2>&1 |" or die "Error: List keys command failed.\n";
+  my @keys;
+  while (my $line = <GPG>) {
+    if ($line =~ /^sec.*?([0-9a-fA-F]{8})\b/i) {
+      push @keys, '0x'.$1;
+    }
+  }
+  close GPG;
+  return \@keys;
+}
+#
+# Private
+#
+
+sub CheckKeyRings {
+  my $self = shift;
+
+  if ($self->DefaultPath) {
+    unless (-e $self->DefaultPath.'/pubring.gpg') {
+      die "Error: PGP Public keyring does not exist\n";
+    }
+    unless (-e $self->DefaultPath.'/secring.gpg') {
+      die "Error: PGP secret keyring does not exist\n";
+    }
+  }
+  unless (@{$self->PublicKeyList}) {
+    die "Error: PGP public keyring is empty\n";
+  }
+  unless (@{$self->SecretKeyList}) {
+    die "Error: PGP secret keyring is empty\n";
+  }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::GPG.pm - A wrapper over the Gnu Privacy Guard command line PGP tool
+
+=head1 DESCRIPTION
+
+C<Crypt::GPG> is inherited from the abstract base class C<Crypt>, implementing the abstract methods required for PGP encryption, decryption, etc... by calling Gnu Privacy Guard PGP command line tool (tested with version 1.0.6). For this module to work the PGP executable must have the name C<gpg.exe> and exist in one of the directories defined in the users path.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Crypt/PGP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,223 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Crypt::PGP.pm
+#
+
+package Crypt::PGP;
+
+use strict;
+
+use Crypt;
+use vars qw(@ISA);
+@ISA=("Crypt");
+
+# Overidden methods from Crypt.pm
+ 
+sub Initialize {
+  my $self = shift;
+
+  #check to see if the pgp executable exists
+  grep {-x "$_/pgp.exe"} split /;/, $ENV{PATH}
+    or die "Error: The PGP executable \"pgp.exe\" does not exist in users path\n";
+  
+  #call super class method
+  $self->SUPER::Initialize();
+ 
+  #check for existence of keyrings and keys
+  $self->CheckKeyRings();
+}
+
+#
+# Implemented abstract methods from Crypt.pm
+#
+
+sub DoEncrypt {
+  my $self = shift;
+  my $plainText = shift;
+  my $cipherText = shift;
+  my @recipientKeys = @{$_[0]};
+
+  $self->CheckKeyRings();
+
+  #build options list
+  my @options = qw(+force +batchmode +verbose=2);
+  push @options, '-o '.$self->Quoted($cipherText);
+  if ($self->DefaultPath()) {
+    push @options, '+PUBRING='.$self->Quoted($self->DefaultPath().'/pubring.pkr');
+  }
+  my @command = '-e '.$self->Quoted($plainText);
+  push @command, @recipientKeys;
+
+  #do encryption
+  open PGP, "pgp @options @command 2>NUL |" or die "Error: Encrypt command failed.\n";
+  my $unsignedKeyError;
+  while (my $line = <PGP>) {
+    if ($self->{verbose} > 1) {print $line;}
+    if ($line =~ /skipping userid/i) { #check for unsigned key errors
+      $unsignedKeyError = 1;
+    }	
+  }
+  close PGP;
+  if ($unsignedKeyError) {
+    die "Error: Encryption failed. Public keys must be signed with the default signing key\n";
+  }
+}
+
+sub DoDecrypt {
+  my $self = shift;
+  my $cipherText = shift;
+  my $plainText = shift;
+  my $passPhrase = shift;
+  
+  $self->CheckKeyRings();
+
+  #build options list
+  my @options =qw(+force +batchmode +verbose=2);
+  push @options, '-o '.$self->Quoted($plainText);
+  if ($self->DefaultPath()) {
+    push @options, '+SECRING='.$self->Quoted($self->DefaultPath().'/secring.skr');
+  }
+  push @options, '-z'.$self->Quoted($passPhrase);
+
+  my @command = ('-d '.$self->Quoted($cipherText));
+
+  #do decryption
+  open PGP, "pgp @options @command 2>NUL |" or die "Error: Decrypt command failed.\n";
+  my ($errorCode, $exitCode);
+  while (my $line = <PGP>) {
+    if ($self->{verbose} > 1) {print $line;}
+    if ($line =~ /error.*?-(\d+)/i) {
+      $errorCode = $1;
+    } 
+    elsif ($line =~ /exitcode.*?(\d+)/i) {
+      $exitCode = $1;
+    }
+  }
+  close PGP;
+
+  #handle specific decryption errors
+  if (defined $errorCode) {
+    if ($errorCode == 11477) {
+      die "Error: Decryption of $cipherText failed. No decrypting key available. NO_SECKEY\n";
+    } 
+    elsif ($errorCode == 11489) {
+      die "Error: Decryption of $cipherText failed. BAD_PASSPHRASE\n";
+    }
+  }	
+}
+
+sub GetPublicKeyList {
+  my $self = shift;
+
+  my @options = qw(+verbose=2);
+  if ($self->DefaultPath()) {
+    push @options, '+PUBRING='.$self->Quoted($self->DefaultPath().'/pubring.pkr');
+  } 
+  my @command = qw(-kv);
+
+  #list and extract keyids
+  open PGP, "pgp @options @command 2>NUL |" or die "Error: List keys command failed.\n";
+  my @keys;
+  while (my $line = <PGP>) {
+    if ($line =~ /(0x[0-9a-fA-F]{8})/i) {
+      push @keys, $1;
+    }
+  }
+  close PGP;
+  return \@keys;
+}
+
+sub GetSecretKeyList {
+  my $self = shift;
+
+  my @options = qw(+verbose=2);
+  if ($self->DefaultPath()) {
+    push @options, '+SECRING='.$self->Quoted($self->DefaultPath().'/secring.skr');
+  } 
+  my @command = qw(-kv);
+
+  #list and extract keyids
+  open PGP, "pgp @options @command 2>NUL |" or die "Error: List keys command failed.\n";
+  my @keys;
+  while (my $line = <PGP>) {
+    if ($self->{verbose} > 1) {print $line;}
+    if ($line =~ /(0x[0-9a-fA-F]{8})/i) {
+      push @keys, $1;
+    }
+  }
+  close PGP;
+  return \@keys;
+}
+
+#
+# Private
+#
+
+sub CheckKeyRings {
+  my $self = shift;
+
+  if ($self->DefaultPath) {
+    unless (-e $self->DefaultPath.'/pubring.pkr') {
+      die "Error: PGP public keyring does not exist\n";
+    }
+    unless (-e $self->DefaultPath.'/secring.skr') {
+      die "Error: PGP secret keyring does not exist\n";
+    }
+  }
+  unless (@{$self->PublicKeyList}) {
+    die "Error: PGP public keyring is empty\n";
+  }
+  unless (@{$self->SecretKeyList}) {
+    die "Error: PGP secret keyring is empty\n";
+  }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Crypt::PGP.pm - A wrapper over Network Associates command line PGP tool
+
+=head1 DESCRIPTION
+
+C<Crypt::PGP> is inherited from the abstract base class C<Crypt>, implementing the abstract methods required for PGP encryption, decryption, etc... by calling NAI Inc. PGP command line tool (tested with version 6). For this module to work the PGP executable must have the name C<pgp.exe> and exist in one of the directories defined in the users path.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DeltaEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,375 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use CommandController;
+use Cwd 'abs_path';
+use Symbian::CBR::CreateDelta;
+use Symbian::CBR::ApplyDelta;
+use Symbian::CBR::Release::Manifest;
+use Carp;
+use File::Spec;
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $overwrite = 0;
+my $noevalid = 0;
+my $nodelta = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New( $iniData, 'DeltaEnv' );
+my $referenceComp;
+my $referenceVer;
+my $nominatedComp;
+my $nominatedVer;
+my $report;
+my $createDelta;
+my $applyDelta;
+my $releaseManifestFile;
+my $receivingArchive;
+my $pgpKey;
+my $deltaPackagePath;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ( "bundling" );
+  my $help;
+  my $maxdeltasize;
+
+  GetOptions( 'h' => \$help, 'o' => \$overwrite, 'v+' => \$verbose, 'noevalid+' => \$noevalid, 'nodelta+' => \$nodelta, 'c+' => \$createDelta, 'a+' => \$applyDelta, 'r+' => \$report, 'rb=s' => \$referenceComp, 'rv=s' => \$referenceVer, 'nb=s' => \$nominatedComp, 'nv=s' => \$nominatedVer, 'rm=s' => \$releaseManifestFile, 'ra=s' => \$receivingArchive, 'p=s' => \$pgpKey, 'dp=s' => \$deltaPackagePath, 'maxdelta=s' => \$maxdeltasize );
+
+  if ( $help ) {
+    Usage(0);
+  }
+  elsif ( $report ) {
+    generateReleaseManifest();
+  }
+  elsif ($createDelta) {
+    createDeltaEnv($maxdeltasize);
+  }
+  elsif ($applyDelta) {
+    ReconstructEnv();
+  }
+  else {
+    print "Error: Invalid option.\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  if ($report) {
+    GenerateReleaseManifestUsage($exitCode);
+  }
+  if ($createDelta) {
+    CreateDeltaUsage($exitCode);
+  }
+  if ($applyDelta) {
+    ApplyDeltaUsage($exitCode);
+  }
+
+  Utils::PrintDeathMessage($exitCode, "\n
+
+options:
+
+-h    help
+-r    generate release manifest mode
+-c    create delta mode
+-a    apply delta mode
+-v    verbose output
+-r -h generate release manifest mode help
+-c -h create delta mode help
+-a -h apply delta mode help \n" );
+}
+
+sub GenerateReleaseManifestUsage {
+  my $exitCode = shift;
+  
+  Utils::PrintDeathMessage($exitCode, "\nUsage: deltaenv -r [options] <component> <version> [report path]
+
+options:
+
+-h help
+-o overwrite existing release manifest file
+-v verbose output \n" );
+}
+
+sub CreateDeltaUsage {
+  my $exitCode = shift;
+    
+  Utils::PrintDeathMessage($exitCode, "\nUsage: deltaenv -c [options] --nb <nominated baseline> --nv <nominated version> [--rm <release manifest>|--rb <reference baseline> --rv <reference version> --ra <receiving archive>] -p <PGP key> [--dp <delta release package>]
+
+options:
+
+-h         help
+-v         verbose output
+-o         overwrite existing delta release package
+--nodelta  include whole files where modified (don't create deltas)
+--noevalid use raw binary comparison (don't use evalid)
+--nb       <nominated baseline> nominated baseline component name
+--nv       <nominated version> nominated baseline component version
+--rm       <release manifest> release manifest file
+--rb       <reference baseline> reference baseline component name
+--rv       <reference version> reference baseline component version
+--ra       <receiving archive> receiving archive path
+-p         <PGP key> PGP key of recipient
+--maxdelta <max size> max size to delta (larger files treated as --nodelta)
+--dp       <delta release package> delta release package path \n" );
+}
+
+sub ApplyDeltaUsage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: deltaenv -a [options] <delta release package>
+
+options:
+
+-h help
+-o overwrite existing components
+-v verbose output \n" );
+}
+
+sub generateReleaseManifest {
+  my $comp = shift @ARGV;
+  my $ver = shift @ARGV;
+  my $destinationManifestPath  = shift @ARGV;
+  unless ( defined $comp and defined $ver and $#ARGV == -1 ) {
+    print "Error: Reference component and version must be specified.\n";
+    GenerateReleaseManifestUsage(1);
+  }
+  my $localArchive = $iniData->PathData->LocalArchivePathForExistingComponent($comp, $ver);
+  die "Error: $comp $ver does not exist.\n" unless (defined $localArchive);
+  
+  if ($localArchive !~ s/\Q$comp\E[\\\/]\Q$ver\E([\\\/])?$//) { # Remove the component name
+    die "Error: (INTERNAL) Unable to remove component information $comp $ver from the archive path $localArchive\n";
+  } 
+  
+  my $archiveReleaseManifestDir = File::Spec->catdir($localArchive, ".cbr");
+  my $archiveFile = $comp."_".$ver."_manifest.xml";
+  $archiveFile = File::Spec->catfile($archiveReleaseManifestDir, $archiveFile);
+
+  my $releaseManifest = Symbian::CBR::Release::Manifest->new( $iniData, $verbose );
+  unless ( defined $destinationManifestPath ) {
+    $destinationManifestPath = Cwd::cwd();
+  }
+
+  if (-e $archiveFile and !$overwrite) {
+    $releaseManifest->Load($archiveFile);
+  }
+  else {
+    $releaseManifest->GenerateManifest($comp, $ver);
+  }
+  
+  if ($overwrite or !-e $archiveFile) {
+    eval{ $releaseManifest->Save($archiveReleaseManifestDir);};
+    print "Warning: Not backing up manifest file in $archiveReleaseManifestDir path because $@" if($@);
+  }
+  
+  $releaseManifest->Save( $destinationManifestPath );
+}
+
+sub createDeltaEnv {
+  my $maxdeltasize = shift;
+  unless ( defined $nominatedComp and defined $nominatedVer and $#ARGV == -1 ) {
+    print "Error: Invalid arguments\n";
+    CreateDeltaUsage(1);
+  }
+  unless (defined $releaseManifestFile or (defined $referenceComp and defined $referenceVer)) {
+    print "Error: Invalid arguments\n";
+    CreateDeltaUsage(1);
+  }
+
+  # Parse max delta file size
+  my $maxdeltabytes;
+  if (defined $maxdeltasize) {
+    if ($maxdeltasize =~ /^\d+$/) {
+      $maxdeltabytes = $maxdeltasize;
+    } elsif ($maxdeltasize =~ /^(\d+)k$/i) {
+      $maxdeltabytes = $1*1024;
+    } elsif ($maxdeltasize =~ /^(\d+)m$/i) {
+      $maxdeltabytes = $1*1024*1024;
+    } elsif ($maxdeltasize =~ /^(\d+)g$/i) {
+      $maxdeltabytes = $1*1024*1024*1024;
+    } else {
+      die "Error: Option '--maxdelta ".$maxdeltasize."' is not a valid size (sizes must be in bytes, or have a K, M or G postfix)\n";
+    }
+  }
+
+  # Get a release manifest to represent the nominated baseline in the receiving archive
+  my $deltaAllFiles;
+  my $releaseManifest = Symbian::CBR::Release::Manifest->new( $iniData, $verbose );
+  if ( defined  $releaseManifestFile) {
+    $releaseManifestFile = File::Spec->rel2abs($releaseManifestFile);
+    print "Reading $releaseManifestFile file.\n";
+    $releaseManifest->Load( $releaseManifestFile );
+  }
+  elsif (defined $receivingArchive) {
+    $releaseManifest->GenerateManifest($referenceComp, $referenceVer, $receivingArchive);
+  }
+  else {
+    $deltaAllFiles = 1;
+  }
+
+  # Create the delta
+  $referenceComp = $releaseManifest->{'baselineName'} unless (defined $referenceComp);
+  $referenceVer = $releaseManifest->{'baselineVersion'} unless (defined $referenceVer);
+  unless ( defined $deltaPackagePath ) {
+    $deltaPackagePath = Cwd::cwd();
+  }
+  my $packageZipFile = $referenceVer."_".$nominatedVer.".zip";
+  $packageZipFile = File::Spec->catfile($deltaPackagePath, $packageZipFile);
+  die "Error: Delta release for $referenceVer and $nominatedVer is already present in $deltaPackagePath. Please use -o option to overwrite.\n" if (-e $packageZipFile and !$overwrite);
+  my $createDelta = Symbian::CBR::CreateDelta->new( $iniData, $pgpKey, $releaseManifest, $verbose, $noevalid, $nodelta, $maxdeltabytes );
+  $createDelta->{deltaAllFiles} = 1 if ($deltaAllFiles);
+  $createDelta->{exportAll} = 1 unless (defined $pgpKey);
+  $createDelta->createDeltaEnv( $referenceComp, $referenceVer, $nominatedComp, $nominatedVer, $deltaPackagePath );
+  print "Successfully created deltas for baseline.\n";
+}
+
+sub ReconstructEnv {
+  my $zipFile = shift @ARGV;
+  unless (defined $zipFile and $#ARGV == -1 ) {
+    print "Error: Invalid arguments\n";
+    ApplyDeltaUsage(1);
+  }
+  print "Reconstructing Environment\n";
+  my $reconstructEnv = Symbian::CBR::ApplyDelta->new($iniData,$verbose);
+  $reconstructEnv->ReconstructEnv($zipFile, $overwrite);
+  print "Reconstructed baseline successfully.\n";
+}
+
+
+__END__
+
+=head1 NAME
+
+DeltaEnv - Creates and applies deltas for modified components between pair of baselines.
+
+=head1 SYNOPSIS
+
+options:
+
+  -h    help
+  -r    generate release manifest mode
+  -c    create delta mode
+  -a    apply delta mode
+  -v    verbose output
+  -r -h generate release manifest mode help
+  -c -h create delta mode help
+  -a -h apply delta mode help
+
+
+Generate release manifest mode
+
+  deltaenv -r [options] <component> <version> [report path]
+
+options:
+
+  -h help
+  -o overwrite existing release manifest file
+  -v verbose output
+
+
+Create delta mode
+
+  deltaenv -c [options] --nb <nominated baseline> --nv <nominated version> [--rm <release manifest>|--rb <reference baseline> --rv <reference version> --ra <receiving archive>] -p <PGP key> [--dp <delta release package>]
+
+options:
+
+  -h         help
+  -v         verbose output
+  -o         overwrite existing delta release package
+  --nodelta  include whole files where modified (don't create deltas)
+  --noevalid use raw binary comparison (don't use evalid)
+  --nb       <nominated baseline> nominated baseline component name
+  --nv       <nominated version> nominated baseline component version
+  --rm       <release manifest> release manifest file
+  --rb       <reference baseline> reference baseline component name
+  --rv       <reference version> reference baseline component version
+  --ra       <receiving archive> receiving archive path
+   -p        <PGP key> PGP key of recipient
+  --maxdelta <max size> max size to delta (larger files treated as --nodelta)
+  --dp       <delta release package> delta release package path
+
+
+Apply delta mode
+
+  deltaenv -a [options] <delta release package>
+
+options:
+
+  -h help
+  -o overwrite existing components
+  -v verbose output
+
+=head1 DESCRIPTION
+
+This command can be used in 3 modes: generate release manifest, create delta, and apply delta.
+
+Generate Release Manifest :
+Generates a release manifest file, which lists all files available in the reference baseline at the receiving archive. It is used in create delta mode, in order that it has an accurate representation of the reference baseline to make the delta against.
+
+The release manifest contains the list of components and their versions in the reference baseline environment. It also lists all the files in each component, and all the metadata files, and each file's size, timestamp and MD5 checksum.
+
+
+Create delta mode :
+Creates a smallest possible delta package, using which whole baseline can be reconstructed at the receiving site. this delta package contains deltas for modified files from reference version to the nominated version of a component, newly added files for the existing components, newly added components for the baseline and delta release manifest file. This delta package can be transferred by the user to receiving site instead of whole baseline.
+
+
+Apply delta mode : 
+Reconstructs a nominated baseline using reference version and delta release package which is created in create delta mode. Using create delta and apply delta mode, amount of data to be transferred from sending site to receiving site can be reduced.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DeltaEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DiffEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,195 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use EnvDifferencer;
+
+
+#
+# Constants.
+#
+
+my $margin = 2;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'DiffEnv');
+my $comp1;
+my $ver1;
+my $comp2;
+my $ver2;
+my $doDateComparison = 0;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+DiffEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'd' => \$doDateComparison, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp1 = shift @ARGV;
+  $ver1 = shift @ARGV;
+  $comp2 = shift @ARGV;
+  $ver2 = shift @ARGV;
+
+  unless (defined $comp1 and defined $ver1 and $#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+  if (defined $comp2) {
+    unless (defined $ver2) {
+      print "Error: Invalid number of arguments\n";
+      Usage(1);
+    }
+  }
+  if ($verbose && $doDateComparison) {
+    print "Warning: -v disables -d\n";
+    $doDateComparison = 0;
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: diffenv [options] <component_1> <version_1> [<component_2> <version_2>]
+
+options:
+
+-h  help
+-d  ignore differences when components in the first environment are younger than the second
+-v  verbose output\n");
+}
+
+sub DiffEnv {
+  my $env1Name;
+  my $env2Name;
+  my $envDifferencer = EnvDifferencer->New($iniData, $verbose);
+  if (defined $comp2 and $ver2) {
+    $envDifferencer->SetStartCompVer($comp1, $ver1);
+    $envDifferencer->SetEndCompVer($comp2, $ver2);
+    $env1Name = "$comp1 $ver1";
+    $env2Name = "$comp2 $ver2";
+  }
+  else {
+    $env1Name = "current";
+    $env2Name = "$comp1 $ver1";
+    $envDifferencer->SetEndCompVer($comp1, $ver1);
+    # no need to specify the other environment since the default
+    # is to use the current environment
+  }
+
+  my @tableData;
+  foreach my $comp (@{$envDifferencer->OnlyEnd()}) {
+    push @tableData, [ $comp, '-', $envDifferencer->EndVersion($comp) ];
+  }
+  foreach my $comp (@{$envDifferencer->OnlyStart()}) {
+    push @tableData, [ $comp, $envDifferencer->StartVersion($comp), '-'  ];
+  }
+  if ($verbose) {
+    foreach my $comp (@{$envDifferencer->UnchangedComps()}) {
+      my $ver = $envDifferencer->StartVersion($comp);
+      push @tableData, [ $comp, $ver, $ver  ];
+    }
+  }
+  if ($doDateComparison) {
+    foreach my $comp (@{$envDifferencer->NewerComps()}) {
+      push @tableData, [ $comp, $envDifferencer->StartVersion($comp), $envDifferencer->EndVersion($comp)  ];
+    }
+  } else {
+    foreach my $comp (@{$envDifferencer->ChangedComps()}) {
+      push @tableData, [ $comp, $envDifferencer->StartVersion($comp), $envDifferencer->EndVersion($comp)  ];
+    }
+  }
+
+  if (@tableData) {
+    my @sortedTableData = sort { $a->[0] cmp $b->[0] } @tableData;
+    unshift @sortedTableData, ['', $env1Name, $env2Name]; # Heading.
+    $iniData->TableFormatter->PrintTable(\@sortedTableData, 1);
+  }
+  else {
+    print "Environments identical\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+DiffEnv - Compare the component versions of a pair of environments.
+
+=head1 SYNOPSIS
+
+  diffenv [options] <component_1> <version_1> [<component_2> <version_2>]
+
+options:
+
+  -h  help
+  -d  ignore differences when components in the first environment are younger than the second
+  -v  verbose output
+
+=head1 DESCRIPTION
+
+Displays a table of component version differences. If the second component / version pair is ommitted, the comparison is made against the current environment. If the C<-v> switch is specified, all versions will be displayed, even those that are identical. The results will be displayed in a table. The C<-d> option may be useful when newer version of a component are known to be backwards compatible with older versions.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DiffEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DiffRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,303 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use Utils;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'DiffRel');
+my $comp;
+my $ver1;
+my $ver2;
+my $specifiedLocalDir;
+my $specifiedReleaseDir;
+my $specifiedDiffTool;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+DoDiff();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'l=s' => \$specifiedLocalDir, 'r=s' => \$specifiedReleaseDir, 'v+' => \$verbose, 't=s' => \$specifiedDiffTool);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver1 = shift @ARGV;
+  $ver2 = shift @ARGV;
+
+  unless ($comp and $#ARGV = -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  if ($ver2 and $specifiedLocalDir) {
+    print "Warning: The '-l' switch has no effect when specifying a pair of versions to difference\n";
+  }
+
+  if ($ver2 and $specifiedReleaseDir) {
+    print "Warning: The '-r' switch has no effect when specifying a pair of versions to difference\n";
+  }
+
+  if ($specifiedReleaseDir and $specifiedReleaseDir !~ /^\\/) {
+    die "Error: Release directories must be absolute (i.e. start with '\\')\n";
+  }
+
+  if ($specifiedLocalDir) {
+    Utils::AbsoluteFileName(\$specifiedLocalDir);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: diffrel [options] <component> [<version_1>] [<version_2>]
+
+options:
+
+-h                help
+-l <local_dir>    specify a specific local directory to difference against
+-r <release_dir>  specify a specific directory within the release zip file to difference against
+-t <tool>         specify a particular diffing tool to use (instead of that specified in reltools.ini)
+-v                verbose output (-vv very verbose)\n");
+}
+
+sub DoDiff {
+  my $diffTool = $specifiedDiffTool || $iniData->DiffTool();
+  unless (defined $diffTool) {
+    die "Error: No differencing tool specified - use diff_tool keyword in reltools.ini\n";
+  }
+
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  unless ($ver1) {
+    $ver1 = $envDb->Version($comp);
+    unless ($ver1) {
+      die "Error: $comp not currently installed\n";
+    }
+  }
+
+  Utils::InitialiseTempDir($iniData);
+  eval {
+    if ($ver2) {
+      DiffPair($envDb, $diffTool);
+    }
+    else {
+      DiffAgainstLocalDir($envDb, $diffTool);
+    }
+  };
+  Utils::RemoveTempDir();
+  if ($@) {
+    die $@;
+  }
+}
+
+sub DiffAgainstLocalDir {
+  my $envDb = shift;
+  my $diffTool = shift;
+  my $tempDir = Utils::TempDir();
+  $envDb->UnpackSource($comp, $ver1, $tempDir, 0, 0, 1); # 0 = overwrite, 0 = do not show progress, 1 = validate
+  my $significantDir = Utils::SignificantDir($tempDir);
+
+  my $localDir;
+  if ($specifiedLocalDir) {
+    $localDir = $specifiedLocalDir;
+  }
+  else {
+    $localDir = $significantDir;
+    $localDir =~ s/\Q$tempDir\E//;
+    unless ($localDir) {
+      $localDir = '\\';
+    }
+    $localDir = Utils::PrependSourceRoot($localDir);
+  }
+  # UnpackSource does not return a success status so we check the dir manually
+  if (!-d $localDir) {
+    warn "Nothing to do".($verbose ? '' : ' (run with -v for more info)').".\n";
+    return;
+  }
+
+  my $releaseDir;
+  if ($specifiedReleaseDir) {
+    $releaseDir = "$tempDir$specifiedReleaseDir";
+  }
+  else {
+    $releaseDir = $significantDir;
+  }
+  # UnpackSource does not return a success status so we check the dir manually
+  if (!-d $releaseDir) {
+    warn "Nothing to do".($verbose ? '' : ' (run with -v for more info)').".\n";
+    return;
+  }
+
+  if ($localDir eq '\\') {
+    print "Warning: About to diff \"$releaseDir\" against the root of your development environment.
+         You could alternatively use the -l and -r options to specify which directories to diff.
+         Are you sure you want to continue? [y/n] ";
+    my $response = <STDIN>;
+    chomp $response;
+    unless ($response eq 'y') {
+      warn "Aborting...\n";
+      return;
+    }
+  }
+
+  $localDir =~ s/^[\\\/]// unless ($localDir =~ m/^[\\\/][\\\/]/);
+  if ($verbose) { print "Envoking \"call $diffTool \"$releaseDir\" \"$localDir\"\"\n"; }
+  system "call \"$diffTool\" \"$releaseDir\" \"$localDir\"";
+}
+
+sub DiffPair {
+  my $envDb = shift;
+  my $diffTool = shift;
+  my $tempDir = Utils::TempDir();
+  my $ver1Dir = "$tempDir\\1";
+  my $ver2Dir = "$tempDir\\2";
+
+  $envDb->UnpackSource($comp, $ver1, $ver1Dir, 0, 0, 1); # 0 = overwrite, 0 = do not show progress, 1 = validate
+  $envDb->UnpackSource($comp, $ver2, $ver2Dir, 0, 0, 1); # 0 = overwrite, 0 = do not show progress, 1 = validate
+
+  if (!-d $ver1Dir or !-d $ver2Dir) {
+    warn "Nothing to do".($verbose ? '' : ' (run with -v for more info)').".\n";
+    return;
+  }
+
+  if ($verbose) { print "Envoking \"call $diffTool $ver1Dir $ver2Dir\"\n"; }
+  system "call \"$diffTool\" \"$ver1Dir\" \"$ver2Dir\"";
+}
+
+
+=head1 NAME
+
+DiffRel - Displays the source differences between two component releases.
+
+=head1 SYNOPSIS
+
+  diffrel [options] <component> [<version_1>] [<version_2>]
+
+options:
+
+  -h                help
+  -l <local_dir>    specify a specific local directory to difference against
+  -r <release_dir>  specify a specific directory within the release zip file to difference against
+  -t <diff_tool>    specify a particular diffing tool to use (instead of that in reltools.ini)
+  -v                verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+C<DiffRel> allows you to lauch a differencing tool of your choice to anyalise the source differences between either a pair of releases or a single release and the source in your development drive. The differencing tool to be used must be specified in C<reltools.ini> using the keyword C<diff_tool> and it must support differencing a pair of directories specified as command line arguments.
+
+There are three main ways of envoking C<DiffRel>:
+
+=over 4
+
+=item * Specifying a component and a pair of versions
+
+C<DiffRel> will difference the source of a pair of component releases. It will unpack the source from the specified versions into two temporary directories. The differencing tool will then be launched with the names of the temporary directories passed as command line arguments.
+
+=item * Specifying a component and a single version
+
+C<DiffRel> will difference the source of the specified version against that present in your development drive. It will unpack the source from the specified version into a temporary directory. It will then attempt to find a suitable pair of directories to difference (this process described in detail later) and then launch the differencing tool, passing the directory names as command line arguments.
+
+=item * Specifying just a component name
+
+As above, except the source of the currently installed version of the component will be differenced against that in your development drive.
+
+=back
+
+As mentioned previously, when C<DiffRel> is asked to perform a diff against the source code in your development drive, it attempts find a suitable pair of directories to pass to your differencing tool. The source code belonging to a particular component often lives in a deeply nested directory structure containing the source for other components also. C<DiffRel> therefore attempts to find the deepest sub-directory that captures all the source belonging to a particular component. It does this as follows:
+
+=over 4
+
+=item 1
+
+C<DiffRel> unpacks the source belonging to the component to be differenced against into a temporary directory.
+
+=item 2
+
+C<DiffRel> then examines the sub-directories of the temporary directory, looking for the deepest sub-directory that captures all files.
+
+=item 3
+
+By default the full path to this sub-directory is used as the first argument to the differencing tool. Optionally, this argument can be manually specified using the C<-r> option. In this case, C<DiffRel> with add the name of the temporary directory to the start of the path you specify.
+
+=item 4
+
+By default, the sub-directory found in (2), minus the leading temporary directory name is used as the second argument to your differencing tool. Optionally, this argument can be manually specified using the C<-l> option. In this case, C<DiffRel> will use the path you specify unaltered.
+
+=back
+
+Normally C<DiffRel>'s default behaviour will do the right thing. Situations where you may want to use the C<-r> and / or the C<-l> option include:
+
+=over 4
+
+=item 1
+
+If the source of the component you need to difference is in a different location in your development environment compared to that of the released version.
+
+=item 2
+
+If the source of the component you need to difference is contained in two or more root level directories. In this case C<DiffRel> will warn that it is about to difference against the root of your development drive (which is unlikely to be a good idea since there are likely to be source directories of other components at this level).
+
+=back
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/DiffRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Digest/Perl/MD5.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,418 @@
+# This library is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+#  Copyright 2000 Christian Lackas, Imperia Software Solutions
+#  Copyright 1998-1999 Gisle Aas.
+#  Copyright 1995-1996 Neil Winton.
+#  Copyright 1991-1992 RSA Data Security, Inc.
+
+#!/usr/local/bin/perl -w
+#$Id: MD5.pm,v 1.16 2000/09/19 22:19:31 lackas Exp $
+
+package Digest::Perl::MD5;
+use strict;
+use integer;
+use Exporter;
+use vars qw($VERSION @ISA @EXPORTER @EXPORT_OK);
+
+@EXPORT_OK = qw(md5 md5_hex md5_base64);
+
+@ISA = 'Exporter';
+$VERSION = '1.5';
+
+# I-Vektor
+sub A() { 0x67_45_23_01 }
+sub B() { 0xef_cd_ab_89 }
+sub C() { 0x98_ba_dc_fe }
+sub D() { 0x10_32_54_76 }
+
+# for internal use
+sub MAX() { 0xFFFFFFFF }
+
+# padd a message to a multiple of 64
+sub padding($) {
+    my $l = length (my $msg = shift() . chr(128));    
+    $msg .= "\0" x (($l%64<=56?56:120)-$l%64);
+    $l = ($l-1)*8;
+    $msg .= pack 'VV', $l & MAX , ($l >> 16 >> 16);
+}
+
+
+sub rotate_left($$) {
+	($_[0] << $_[1]) | (( $_[0] >> (32 - $_[1])  )  & ((1 << $_[1]) - 1));
+}
+
+sub gen_code {
+  # Discard upper 32 bits on 64 bit archs.
+  my $MSK = ((1 << 16) << 16) ? ' & ' . MAX : '';
+  my %f = (
+	FF => "X0=rotate_left((X3^(X1&(X2^X3)))+X0+X4+X6$MSK,X5)+X1$MSK;",
+	GG => "X0=rotate_left((X2^(X3&(X1^X2)))+X0+X4+X6$MSK,X5)+X1$MSK;",
+	HH => "X0=rotate_left((X1^X2^X3)+X0+X4+X6$MSK,X5)+X1$MSK;",
+	II => "X0=rotate_left((X2^(X1|(~X3)))+X0+X4+X6$MSK,X5)+X1$MSK;",
+  );
+
+  my %s = (  # shift lengths
+	S11 => 7, S12 => 12, S13 => 17, S14 => 22, S21 => 5, S22 => 9, S23 => 14,
+	S24 => 20, S31 => 4, S32 => 11, S33 => 16, S34 => 23, S41 => 6, S42 => 10,
+	S43 => 15, S44 => 21
+  );
+
+  my $insert = "";
+  while(<DATA>) {
+	chomp;
+	next unless /^[FGHI]/;
+	my ($func,@x) = split /,/;
+	my $c = $f{$func};
+	$c =~ s/X(\d)/$x[$1]/g;
+	$c =~ s/(S\d{2})/$s{$1}/;
+        $c =~ s/^(.*)=rotate_left\((.*),(.*)\)\+(.*)$//;
+
+	$c = "\$r = $2;
+        $1 = ((\$r << $3) | ((\$r >> (32 - $3))  & ((1 << $3) - 1))) + $4";
+	$insert .= "\t$c\n";
+  }
+  
+  my $dump = '
+  sub round {
+	my ($a,$b,$c,$d) = @_[0 .. 3];
+	my $r;
+
+	' . $insert . '
+	$_[0]+$a' . $MSK . ', $_[1]+$b ' . $MSK . 
+        ', $_[2]+$c' . $MSK . ', $_[3]+$d' . $MSK . ';
+  }';
+  eval $dump;
+}
+
+gen_code();
+
+
+# object part of this module
+sub new {
+	my $class = shift;
+	bless {}, ref($class) || $class;
+}
+
+sub reset {
+	my $self = shift;
+	delete $self->{data};
+	$self
+}
+
+sub add(@) {
+	my $self = shift;
+	$self->{data} .= join'', @_;
+	$self
+}
+
+sub addfile {
+  	my ($self,$fh) = @_;
+	if (!ref($fh) && ref(\$fh) ne "GLOB") {
+	    require Symbol;
+	    $fh = Symbol::qualify($fh, scalar caller);
+	}
+	$self->{data} .= do{local$/;<$fh>};
+	$self
+}
+
+sub digest {
+	md5(shift->{data})
+}
+
+sub hexdigest {
+	md5_hex(shift->{data})
+}
+
+sub b64digest {
+	md5_base64(shift->{data})
+}
+
+sub md5(@) {
+	my $message = padding(join'',@_);
+	my ($a,$b,$c,$d) = (A,B,C,D);
+	my $i;
+	for $i (0 .. (length $message)/64-1) {
+		my @X = unpack 'V16', substr $message,$i*64,64;	
+		($a,$b,$c,$d) = round($a,$b,$c,$d,@X);
+	}
+	pack 'V4',$a,$b,$c,$d;
+}
+
+
+sub md5_hex(@) {  
+  unpack 'H*', &md5;
+}
+
+sub md5_base64(@) {
+  encode_base64(&md5);
+}
+
+
+sub encode_base64 ($) {
+    my $res;
+    while ($_[0] =~ /(.{1,45})/gs) {
+	$res .= substr pack('u', $1), 1;
+	chop $res;
+    }
+    $res =~ tr|` -_|AA-Za-z0-9+/|;#`
+    chop $res;chop $res;
+    $res;
+}
+
+1;
+
+=head1 NAME
+
+Digest::MD5::Perl - Perl implementation of Ron Rivests MD5 Algorithm
+
+=head1 DISCLAIMER
+
+This is B<not> an interface (like C<Digest::MD5>) but a Perl implementation of MD5.
+It is written in perl only and because of this it is slow but it works without C-Code.
+You should use C<Digest::MD5> instead of this module if it is available.
+This module is only usefull for
+
+=over 4
+
+=item
+
+computers where you cannot install C<Digest::MD5> (e.g. lack of a C-Compiler)
+
+=item
+
+encrypting only small amounts of data (less than one million bytes). I use it to
+hash passwords.
+
+=item
+
+educational purposes
+
+=back
+
+=head1 SYNOPSIS
+
+ # Functional style
+ use Digest::MD5  qw(md5 md5_hex md5_base64);
+
+ $hash = md5 $data;
+ $hash = md5_hex $data;
+ $hash = md5_base64 $data;
+    
+
+ # OO style
+ use Digest::MD5;
+
+ $ctx = Digest::MD5->new;
+
+ $ctx->add($data);
+ $ctx->addfile(*FILE);
+
+ $digest = $ctx->digest;
+ $digest = $ctx->hexdigest;
+ $digest = $ctx->b64digest;
+
+=head1 DESCRIPTION
+
+This modules has the same interface as the much faster C<Digest::MD5>. So you can
+easily exchange them, e.g.
+
+	BEGIN {
+	  eval {
+	    require Digest::MD5;
+	    import Digest::MD5 'md5_hex'
+	  };
+	  if ($@) { # ups, no Digest::MD5
+	    require Digest::Perl::MD5;
+	    import Digest::Perl::MD5 'md5_hex'
+	  }		
+	}
+
+If the C<Digest::MD5> module is available it is used and if not you take
+C<Digest::Perl::MD5>.
+
+You can also install the Perl part of Digest::MD5 together with Digest::Perl::MD5
+and use Digest::MD5 as normal, it falls back to Digest::Perl::MD5 if it
+cannot load its object files.
+
+For a detailed Documentation see the C<Digest::MD5> module.
+
+=head1 EXAMPLES
+
+The simplest way to use this library is to import the md5_hex()
+function (or one of its cousins):
+
+    use Digest::Perl::MD5 'md5_hex';
+    print 'Digest is ', md5_hex('foobarbaz'), "\n";
+
+The above example would print out the message
+
+    Digest is 6df23dc03f9b54cc38a0fc1483df6e21
+
+provided that the implementation is working correctly.  The same
+checksum can also be calculated in OO style:
+
+    use Digest::MD5;
+    
+    $md5 = Digest::MD5->new;
+    $md5->add('foo', 'bar');
+    $md5->add('baz');
+    $digest = $md5->hexdigest;
+    
+    print "Digest is $digest\n";
+
+=head1 LIMITATIONS
+
+This implementation of the MD5 algorithm has some limitations:
+
+=over 4
+
+=item
+
+It's slow, very slow. I've done my very best but Digest::MD5 is still about 135 times faster.
+You can only encrypt Data up to one million bytes in an acceptable time. But it's very usefull
+for encrypting small amounts of data like passwords.
+
+=item
+
+You can only encrypt up to 2^32 bits = 512 MB on 32bit archs. You should use C<Digest::MD5>
+for those amounts of data.
+
+=item
+
+C<Digest::Perl::MD5> loads all data to encrypt into memory. This is a todo.
+
+=back
+
+=head1 SEE ALSO
+
+L<Digest::MD5>
+
+L<md5sum(1)>
+
+RFC 1321
+
+=head1 COPYRIGHT
+
+This library is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+ Copyright 2000 Christian Lackas, Imperia Software Solutions
+ Copyright 1998-1999 Gisle Aas.
+ Copyright 1995-1996 Neil Winton.
+ Copyright 1991-1992 RSA Data Security, Inc.
+
+The MD5 algorithm is defined in RFC 1321. The basic C code
+implementing the algorithm is derived from that in the RFC and is
+covered by the following copyright:
+
+=over 4
+
+=item
+
+Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
+rights reserved.
+
+License to copy and use this software is granted provided that it
+is identified as the "RSA Data Security, Inc. MD5 Message-Digest
+Algorithm" in all material mentioning or referencing this software
+or this function.
+
+License is also granted to make and use derivative works provided
+that such works are identified as "derived from the RSA Data
+Security, Inc. MD5 Message-Digest Algorithm" in all material
+mentioning or referencing the derived work.
+
+RSA Data Security, Inc. makes no representations concerning either
+the merchantability of this software or the suitability of this
+software for any particular purpose. It is provided "as is"
+without express or implied warranty of any kind.
+
+These notices must be retained in any copies of any part of this
+documentation and/or software.
+
+=back
+
+This copyright does not prohibit distribution of any version of Perl
+containing this extension under the terms of the GNU or Artistic
+licenses.
+
+=head1 AUTHORS
+
+The original MD5 interface was written by Neil Winton
+(C<N.Winton@axion.bt.co.uk>).
+
+C<Digest::MD5> was made by Gisle Aas <gisle@aas.no> (I took his Interface
+and part of the documentation)
+
+Thanks to Guido Flohr for his 'use integer'-hint.
+
+This release was made by Christian Lackas <delta@clackas.de>.
+
+=cut
+
+__DATA__
+FF,$a,$b,$c,$d,$_[4],7,0xd76aa478,/* 1 */
+FF,$d,$a,$b,$c,$_[5],12,0xe8c7b756,/* 2 */
+FF,$c,$d,$a,$b,$_[6],17,0x242070db,/* 3 */
+FF,$b,$c,$d,$a,$_[7],22,0xc1bdceee,/* 4 */
+FF,$a,$b,$c,$d,$_[8],7,0xf57c0faf,/* 5 */
+FF,$d,$a,$b,$c,$_[9],12,0x4787c62a,/* 6 */
+FF,$c,$d,$a,$b,$_[10],17,0xa8304613,/* 7 */
+FF,$b,$c,$d,$a,$_[11],22,0xfd469501,/* 8 */
+FF,$a,$b,$c,$d,$_[12],7,0x698098d8,/* 9 */
+FF,$d,$a,$b,$c,$_[13],12,0x8b44f7af,/* 10 */
+FF,$c,$d,$a,$b,$_[14],17,0xffff5bb1,/* 11 */
+FF,$b,$c,$d,$a,$_[15],22,0x895cd7be,/* 12 */
+FF,$a,$b,$c,$d,$_[16],7,0x6b901122,/* 13 */
+FF,$d,$a,$b,$c,$_[17],12,0xfd987193,/* 14 */
+FF,$c,$d,$a,$b,$_[18],17,0xa679438e,/* 15 */
+FF,$b,$c,$d,$a,$_[19],22,0x49b40821,/* 16 */ 
+GG,$a,$b,$c,$d,$_[5],5,0xf61e2562,/* 17 */
+GG,$d,$a,$b,$c,$_[10],9,0xc040b340,/* 18 */
+GG,$c,$d,$a,$b,$_[15],14,0x265e5a51,/* 19 */
+GG,$b,$c,$d,$a,$_[4],20,0xe9b6c7aa,/* 20 */
+GG,$a,$b,$c,$d,$_[9],5,0xd62f105d,/* 21 */
+GG,$d,$a,$b,$c,$_[14],9,0x2441453,/* 22 */
+GG,$c,$d,$a,$b,$_[19],14,0xd8a1e681,/* 23 */
+GG,$b,$c,$d,$a,$_[8],20,0xe7d3fbc8,/* 24 */
+GG,$a,$b,$c,$d,$_[13],5,0x21e1cde6,/* 25 */
+GG,$d,$a,$b,$c,$_[18],9,0xc33707d6,/* 26 */
+GG,$c,$d,$a,$b,$_[7],14,0xf4d50d87,/* 27 */
+GG,$b,$c,$d,$a,$_[12],20,0x455a14ed,/* 28 */
+GG,$a,$b,$c,$d,$_[17],5,0xa9e3e905,/* 29 */
+GG,$d,$a,$b,$c,$_[6],9,0xfcefa3f8,/* 30 */
+GG,$c,$d,$a,$b,$_[11],14,0x676f02d9,/* 31 */
+GG,$b,$c,$d,$a,$_[16],20,0x8d2a4c8a,/* 32 */
+HH,$a,$b,$c,$d,$_[9],4,0xfffa3942,/* 33 */
+HH,$d,$a,$b,$c,$_[12],11,0x8771f681,/* 34 */
+HH,$c,$d,$a,$b,$_[15],16,0x6d9d6122,/* 35 */
+HH,$b,$c,$d,$a,$_[18],23,0xfde5380c,/* 36 */
+HH,$a,$b,$c,$d,$_[5],4,0xa4beea44,/* 37 */
+HH,$d,$a,$b,$c,$_[8],11,0x4bdecfa9,/* 38 */
+HH,$c,$d,$a,$b,$_[11],16,0xf6bb4b60,/* 39 */
+HH,$b,$c,$d,$a,$_[14],23,0xbebfbc70,/* 40 */
+HH,$a,$b,$c,$d,$_[17],4,0x289b7ec6,/* 41 */
+HH,$d,$a,$b,$c,$_[4],11,0xeaa127fa,/* 42 */
+HH,$c,$d,$a,$b,$_[7],16,0xd4ef3085,/* 43 */
+HH,$b,$c,$d,$a,$_[10],23,0x4881d05,/* 44 */
+HH,$a,$b,$c,$d,$_[13],4,0xd9d4d039,/* 45 */
+HH,$d,$a,$b,$c,$_[16],11,0xe6db99e5,/* 46 */
+HH,$c,$d,$a,$b,$_[19],16,0x1fa27cf8,/* 47 */
+HH,$b,$c,$d,$a,$_[6],23,0xc4ac5665,/* 48 */
+II,$a,$b,$c,$d,$_[4],6,0xf4292244,/* 49 */
+II,$d,$a,$b,$c,$_[11],10,0x432aff97,/* 50 */
+II,$c,$d,$a,$b,$_[18],15,0xab9423a7,/* 51 */
+II,$b,$c,$d,$a,$_[9],21,0xfc93a039,/* 52 */
+II,$a,$b,$c,$d,$_[16],6,0x655b59c3,/* 53 */
+II,$d,$a,$b,$c,$_[7],10,0x8f0ccc92,/* 54 */
+II,$c,$d,$a,$b,$_[14],15,0xffeff47d,/* 55 */
+II,$b,$c,$d,$a,$_[5],21,0x85845dd1,/* 56 */
+II,$a,$b,$c,$d,$_[12],6,0x6fa87e4f,/* 57 */
+II,$d,$a,$b,$c,$_[19],10,0xfe2ce6e0,/* 58 */
+II,$c,$d,$a,$b,$_[10],15,0xa3014314,/* 59 */
+II,$b,$c,$d,$a,$_[17],21,0x4e0811a1,/* 60 */
+II,$a,$b,$c,$d,$_[8],6,0xf7537e82,/* 61 */
+II,$d,$a,$b,$c,$_[15],10,0xbd3af235,/* 62 */
+II,$c,$d,$a,$b,$_[6],15,0x2ad7d2bb,/* 63 */
+II,$b,$c,$d,$a,$_[13],21,0xeb86d391,/* 64 */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Digest/Perl/readme.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+The module FileCompare.pm needs an MD5 module. If present it will use Digest::MD5, because this is implemented in C and so is faster than this pure Perl version. However, Perl version 5.005_03 (the version currently shipped with the Symbian platform SDK) doesn't contain Digest::MD5. This module is therefore provided as a fall back.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvData	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,207 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+my ($remove, $mrpName, $verbose, $comp, $forceRemove);
+
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'EnvData');
+
+ProcessCommandLine();
+
+my $envDb = EnvDb->Open($iniData, $verbose);
+
+if ($remove) {
+    RemoveEntryFromDB();
+}
+elsif (!$mrpName) {
+    DisplayInformation();
+}
+else {
+    AddEntryToDB();
+}
+
+sub ProcessCommandLine {
+    Getopt::Long::Configure ("bundling");
+    
+    my $help;
+    GetOptions("h" => \$help, "r" => \$remove, "m=s" => \$mrpName, "v+" => \$verbose, "f" => \$forceRemove);
+    
+    if ($help) {
+        Usage(0);
+    }
+
+    $comp = lc(shift @ARGV);
+
+    if (scalar @ARGV) {
+            print "Error: Invalid number of arguments\n";
+            Usage(1);
+        }    
+    elsif ($remove && $mrpName) {
+        print "Error: Can not specify -m and -r options together\n";
+        Usage(1);
+    }
+    elsif (($remove || $mrpName) && !$comp) {
+        print "Error: You must specify a component name\n";
+        Usage(1);       
+    }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: envdata [options] <component>
+EnvData is used for adding components to the evironment database...
+  
+options:
+
+-h             help
+-m <mrp_name>  specify a new mrp file name
+-v             verbose output (-vv very verbose)\n");
+}
+
+sub AddEntryToDB {
+    Utils::CheckExists($mrpName);
+    Utils::AbsoluteFileName(\$mrpName);
+    
+    if($iniData->HasMappings()) {
+      $mrpName = $iniData->PerformReverseMapOnFileName($mrpName);
+    }
+    
+    $mrpName = Utils::RemoveSourceRoot($mrpName);
+    
+    if ($envDb->ComponentExistsInDatabase($comp) && $envDb->Status($comp) != EnvDb::STATUS_INFORMATION_ONLY) {
+        die "EnvData can only be used to update non-installed components\n";
+    }
+
+    $envDb->SetVersion($comp, '__info__');
+    $envDb->SetStatus($comp, EnvDb::STATUS_INFORMATION_ONLY);
+    $envDb->GenerateEmptySignature($comp, '__info__');
+
+    $envDb->SetMrpName($comp, $mrpName);
+    
+    print "Entry for $comp added to the environment database\n";
+}
+
+sub RemoveEntryFromDB {
+    if ($envDb->ComponentExistsInDatabase($comp) && $envDb->Status($comp) != EnvDb::STATUS_INFORMATION_ONLY) {
+        die "EnvData can only be used to update non-installed components\n";
+    }
+
+    my $ver = $envDb->Version($comp, 1);
+    
+    if (defined $ver) {
+        if ($forceRemove) {
+            $envDb->SetVersion($comp, undef);
+        }
+        else {
+            print "Remove environment database entry for $comp? [y/n] ";
+            my $response = <STDIN>;
+            chomp $response;
+            if ($response =~ /^y$/i) {
+                $envDb->SetVersion($comp, undef);
+            }
+            else {
+                die "Remove aborted\n";
+            }
+        }
+    }
+    else {
+        die "Error: No information for $comp exists in the environment database\n";
+    }
+}
+
+sub DisplayInformation {
+    my $versionInfo = $envDb->VersionInfo(1);
+    
+    my $tableData = [["Component", "Status", "MRP"]];
+    
+    if ($comp) {
+        if (exists $versionInfo->{$comp}) {
+            push @{$tableData}, [$comp, EnvDb::StatusString($envDb->Status($comp)), $envDb->MrpName($comp)];
+        }
+    }
+    else {
+        foreach my $entry (sort keys %{$versionInfo}) {
+                push @{$tableData}, [$entry, EnvDb::StatusString($envDb->Status($entry)), $envDb->MrpName($entry)];
+        }
+    }
+
+    if (scalar(@{$tableData}) > 1) {
+        print "\n";
+        $iniData->TableFormatter->PrintTable($tableData, 1);
+    }
+    else {
+        print "No information exists in the environment database". ($comp ? " for $comp" : '') ."\n";        
+    }
+}
+
+
+=head1 NAME
+
+EnvData
+
+=head1 SYNOPSIS
+
+  envdata [options] [<component>]
+
+options:
+  -h             help
+  -m <mrp_name>  specify a new mrp file name
+  -v             verbose output (-vv very verbose)
+  -r             remove entry from database
+  -f             force removal from database (no confirmation prompt)\n");
+
+=head1 DESCRIPTION
+
+Displays the information contained within the environment database.  Can also add
+and delete information about components which are not installed.  This is particularly
+useful for when IPR information needs to be obtained from MRP files, but the MRP file
+locations are not known to the CBR Tools as the components are not already part of
+the environment, for example during the overnight build process.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvData.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvDb.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2145 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+
+
+package EnvDb;
+
+use strict;
+use MLDBM::Sync;                       # this gets the default, SDBM_File
+use MLDBM qw(DB_File Storable);        # use Storable for serializing
+use MLDBM qw(MLDBM::Sync::SDBM_File);  # use extended SDBM_File, handles values > 1024 bytes
+use Fcntl qw(:DEFAULT);                # import symbols O_CREAT & O_RDWR for use with DBMs
+use Cwd;
+use File::Find;
+use File::Copy;
+use File::Basename;
+use File::Path;
+use File::Spec;
+use Fcntl;
+use MrpData;
+use RelData;
+use DirHandle; # we're recursing in CrossCheckSourceDirectory, so this is slightly nicer than DIRHANDLEs
+                # (though not actually necessary, as it happens)
+use Utils;
+use CatData;
+use Carp;
+use Symbian::CBR::Component::Manifest;
+
+#
+# Constants.
+#
+
+use constant DB_NAME => "\\epoc32\\relinfo\\envdb";
+use constant STATUS_CLEAN => 0;
+use constant STATUS_DIRTY => 1;
+use constant STATUS_PENDING_RELEASE => 2;
+use constant STATUS_INFORMATION_ONLY => 5;
+use constant STATUS_NOT_INSTALLED => 3;
+use constant STATUS_DIRTY_SOURCE => 4;
+use constant STATUS_STRING_PASSED => "clean";
+use constant STATUS_STRING_FAILED => "dirty";
+use constant STATUS_STRING_MISSING => "missing";
+use constant STATUS_STRING_PENDING_RELEASE => "pending release";
+use constant STATUS_STRING_NOT_INSTALLED => "not installed";
+use constant STATUS_STRING_DIRTY_SOURCE => "binaries clean, source dirty";
+use constant STATUS_STRING_INFORMATION_ONLY => "Information only";
+use constant SCAN_PROGRESS_TUNER => 50;
+use constant ACCEPTABLE_EVALID_FAILURES => "abld.bat"; # this is a regexp - use | to add more items. It is case-insensitive.
+
+#
+# Public.
+#
+
+sub Open {
+  my $pkg = shift;
+  my $iniData = shift;
+  my $verbose = shift;
+  
+  # Check that the environment is not on an illegal volume - INC105548
+  Utils::CheckIllegalVolume($iniData);
+
+  my $dbName = Utils::PrependEpocRoot(DB_NAME);
+  my $dbDir = dirname($dbName);
+  unless (-e $dbDir) {
+    Utils::MakeDir($dbDir);
+  }
+  my $db;
+  {
+    local $^W = 0;
+    tie (%{$db}, 'MLDBM::Sync', $dbName, O_CREAT|O_RDWR, 0666) || die "Couldn't open database DB_NAME: $!\n";
+  }
+
+  my $self = {iniData => $iniData,
+	      db => $db,
+        mrpcache => {},
+	      verbose => ($verbose || 0)};
+  bless $self, $pkg;
+  return $self;
+}
+
+sub Close {
+  my $self = shift;
+  untie %{$self};
+}
+
+sub ComponentExistsInDatabase {
+  my $self = shift;
+  my $comp = shift;
+  
+  return 1 if (exists $self->{db}->{$comp});
+}
+
+sub Version {
+  my $self = shift;
+  my $comp = shift;
+  my $includeInformationOnlyEntries = shift;
+  
+  $comp = lc($comp); # Note, component names are always stored in lower case.
+  my $entry = $self->{db}->{$comp};
+  
+  if (defined $entry) {
+    if (!$includeInformationOnlyEntries && $entry->{status} eq STATUS_INFORMATION_ONLY) {
+      # Some callers are not interested in information only entries
+      return undef;
+    }
+    
+    return $entry->{ver};
+  }
+  return undef;
+}
+
+sub VersionInfo {
+  my $self = shift;
+  my $includeInformationOnlyEntries = shift;
+  
+  my $versionInfo;
+  foreach my $thisKey (keys %{$self->{db}}) {
+    if (!$includeInformationOnlyEntries) {
+      # Some callers are not interested in information only entries
+      next if ($self->{db}->{$thisKey}->{status} eq STATUS_INFORMATION_ONLY);
+    }
+    
+    $versionInfo->{$thisKey} = $self->{db}->{$thisKey}->{ver};
+  }
+  return $versionInfo;
+}
+
+sub SetVersion {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $ver = shift;
+
+  my $entry = $self->{db}->{$comp};
+  if (defined $ver) {
+    if (defined $entry->{ver} and $entry->{status} != STATUS_PENDING_RELEASE) {
+      $self->DeleteSignature($comp, $entry->{ver});
+    }
+    $entry->{ver} = $ver;
+
+    # Write entry to database.
+    $self->{db}->{$comp} = $entry;
+  }
+  else {
+    # undefined version, so remove entry from database (if it was present).
+    if (defined $entry) {
+      delete $self->{db}->{$comp}
+    }
+  }
+}
+
+sub InternalVersion {
+  my $self = shift;
+  my $comp = shift;
+  $comp = lc($comp); # Note, component names are always stored in lower case.
+  my $entry = $self->{db}->{$comp};
+  if (defined $entry) {
+    return $entry->{intVer};
+  }
+  return undef;
+}
+
+sub SetInternalVersion {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $intVer = shift;
+
+  my $entry = $self->{db}->{$comp};
+  unless (defined $entry) {
+    die "Error: $comp not found in environment database\n";
+  }
+  $entry->{intVer} = $intVer;
+
+  # Write entry to database.
+  $self->{db}->{$comp} = $entry;
+}
+
+sub Status {
+  my $self = shift;
+  my $comp = lc(shift);
+
+  my $entry = $self->{db}->{$comp};
+  unless (defined $entry) {
+    die "Error: $comp not found in environment database\n";
+  }
+
+  return $entry->{status};
+}
+
+sub SetStatus {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $status = shift;
+
+  my $entry = $self->{db}->{$comp};
+  unless (defined $entry) {
+    die "Error: $comp not found in environment database\n";
+  }
+  $entry->{status} = $status;
+
+  # Write entry to database.
+  $self->{db}->{$comp} = $entry;
+}
+
+sub StatusString {
+  my $status = shift;
+  if ($status == STATUS_CLEAN) {
+    return STATUS_STRING_PASSED;
+  }
+  elsif ($status == STATUS_DIRTY) {
+    return STATUS_STRING_FAILED;
+  }
+  elsif ($status == STATUS_PENDING_RELEASE) {
+    return STATUS_STRING_PENDING_RELEASE;
+  }
+  elsif ($status == STATUS_DIRTY_SOURCE) {
+    return STATUS_STRING_DIRTY_SOURCE;
+  }
+  elsif ($status == STATUS_INFORMATION_ONLY) {
+    return STATUS_STRING_INFORMATION_ONLY;
+  }  
+}
+
+sub CheckCompName {
+  my $self = shift;
+  my $comp = shift;
+  die "Error: Component name can't begin with .(dot) \"$comp\".\n" if ($comp =~ m/^\./);
+}
+
+sub MrpName {
+  my $self = shift;
+  my $comp = lc(shift);
+
+  my $entry = $self->{db}->{$comp};
+  unless (defined $entry) {
+    die "Error: $comp not found in environment database\n";
+  }
+
+  return $entry->{mrpName};
+}
+
+sub SetMrpName {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $mrpName = shift;
+
+  my $entry = $self->{db}->{$comp};
+  unless (defined $entry) {
+    die "Error: $comp not found in environment database\n";
+  }
+
+  $entry->{mrpName} = $mrpName;
+
+  # Write entry to database.
+  $self->{db}->{$comp} = $entry;
+}
+
+sub ComponentsPendingRelease {
+  my $self = shift;
+  my %comps;
+  foreach my $thisComp (keys %{$self->{db}}) {
+    my $thisEntry = $self->{db}->{$thisComp};
+    if ($thisEntry->{status} == STATUS_PENDING_RELEASE) {
+      $comps{$thisComp} = {mrpName => $thisEntry->{mrpName},
+			   ver => $thisEntry->{ver},
+			   intVer => $thisEntry->{intVer}};
+    }
+  }
+  return \%comps;
+}
+
+sub GenerateSignature {
+  my $self = shift;
+  my $comp = lc (shift);
+  my $ver = shift;
+  my $sigName = SignatureName($comp, $ver);
+  open (SIG, ">$sigName") or die "Error: Couldn't open $sigName: $!\n";
+  foreach my $thisBinZip (@{$self->RelevantBinaryZips($comp, $ver)}) {
+    foreach my $file (@{Utils::ListZip($thisBinZip, 1)}) {
+      my $fileER = Utils::PrependEpocRoot($file);
+      if (-f $fileER) {
+        (my $mTime, my $size) = Utils::FileModifiedTimeAndSize($fileER);
+        unless (defined $size) {
+          die "Error: Problem reading stats of \"$fileER\"\n";
+        }
+        if ($self->{verbose} > 1) {
+          print "Adding signature entry for \"$file\"\n";
+          print "\tmTime: $mTime (", scalar gmtime($mTime), "\n";
+          print "\tsize:  $size\n";
+        }
+        print SIG "$file\t$mTime\t$size\n";
+      }
+      else {
+        print "Warning: Unexpected entry in \"$thisBinZip\": \"$file\"\n         $comp $ver could be corrupt or tampered with\n";
+      }
+    }
+  }
+  close (SIG);
+}
+
+sub GenerateFakeSignature {
+# As GenerateSignature, except the mtime and size of each file is set to zero.
+# This is intended to be used when validating against an external baseline.
+  my $self = shift;
+  my $comp = lc (shift);
+  my $ver = shift;
+  my $sigName = SignatureName($comp, $ver);
+  open (SIG, ">$sigName") or die "Error: Couldn't open $sigName: $!\n";
+  foreach my $thisBinZip (@{$self->RelevantBinaryZips($comp, $ver)}) {
+    foreach my $file (@{Utils::ListZip($thisBinZip)}) {
+      print SIG "$file\t0\t0\n";
+    }
+  }
+  close (SIG);
+}
+
+sub GenerateEmptySignature {
+  my $self = shift;
+  my $comp = lc (shift);
+  my $ver = shift;
+  my $sigName = SignatureName($comp, $ver);
+  open (SIG, ">$sigName") or die "Error: Couldn't open $sigName: $!\n";
+  close (SIG);
+}
+
+sub RemoveComponent {
+  my $self = shift;
+  my $comp = lc(shift);
+
+  # Read database entry.
+  my $entry = $self->{db}->{$comp};
+
+  if (defined $entry) {
+    # Remove installed binaries.
+    if ($self->{verbose}) { print "Removing binaries from $comp $entry->{ver}...\n"; }
+    $self->DeleteFilesInSignature($comp, $entry->{ver});
+    $self->DeleteSignature($comp, $entry->{ver});
+
+    # Remove the database entry.
+    delete $self->{db}->{$comp};
+  }
+  else {
+    print "$comp not currently installed, aborting removal of binaries\n";
+  }
+}
+
+sub RefreshComponent {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $overwrite = shift;
+
+  # Read database entry.
+  my $entry = $self->{db}->{$comp};
+
+  if (!defined $entry) {
+    print "$comp not currently installed; aborting refreshing of binaries\n";
+  } elsif ($entry->{status} == STATUS_PENDING_RELEASE) {
+    print "$comp is pending release and cannot be refreshed; use 'preprel' to remove it from your environment\n";
+  } else {
+    my $ver = $entry->{ver};
+
+    my $relData = RelData->Open($self->{iniData}, $comp, $ver, $self->{verbose}); # Dies if release not in archive
+    $relData->WarnIfReleaseTooNew();
+
+    print "Removing $comp $ver..\n";
+    if ($self->{verbose}) { print "Removing binaries from $comp $ver...\n"; }
+    $self->DeleteFilesInSignature($comp, $entry->{ver});
+
+    print "Installing $comp $ver...\n";
+    $self->UnpackBinaries($comp, $ver, Utils::EpocRoot(), $overwrite);
+
+    my $status = ($self->CheckComp($comp))[0];
+    if ($status == STATUS_DIRTY) {
+      print "WARNING: Installed component does not match existing signature; updating signature\n";
+      $self->GenerateSignature($comp, $ver);
+    }
+  }
+}
+
+sub DeleteSource {
+  my $self = shift;
+  my $thisComp = shift;
+  my $dryrun = shift;
+  my $force = shift;
+
+  my $ver = $self->Version($thisComp);
+
+  if(!defined $ver) {
+    die "ERROR: Unable to obtain version for $thisComp\n";
+  }
+
+  my $reldata = RelData->Open($self->{iniData}, $thisComp, $ver, $self->{verbose});
+
+  my $srcitems = $reldata->SourceItems;
+  foreach my $thisSrcItem (keys %$srcitems) {
+    # If there are mappings and the source root is \\, perform mappings on filename. Otherwise prepend source root.
+    if($self->{iniData}->HasMappings() && Utils::SourceRoot() eq "\\") {
+      $thisSrcItem = $self->{iniData}->PerformMapOnFileName($thisSrcItem);
+    }
+    else{
+      $thisSrcItem = Utils::PrependSourceRoot($thisSrcItem);
+    }
+
+    if ($self->{verbose} || $dryrun) {
+      my $dir = (-d $thisSrcItem)?" (directory)":"";
+      my $exists = (-e $thisSrcItem)?"":" (doesn't exist)";
+      my $verb = $dryrun?"Would remove":"Removing";
+      print "$verb $thisSrcItem$dir$exists\n";
+    }
+    {
+        local $SIG{__WARN__} = sub {
+            my $warn = shift;
+	    $warn =~ s/ at .*?EnvDb\.pm line \d+//;
+	    print STDERR "WARNING: $warn";
+        };
+        rmtree($thisSrcItem, 0, !$force) unless $dryrun;
+    }
+    my $directory = dirname($thisSrcItem);
+	
+	my @items = @{Utils::ReadDir($directory)};
+
+	if (scalar @items == 1 && $items[0] =~ /^distribution\.policy$/i) {
+	  unlink File::Spec->catdir($directory, shift @items) unless $dryrun;
+	}
+
+    if (-e $directory && (!scalar @items)) { # No items in dir or just a distribution.policy file in dir
+      rmdir $directory or die "Error: Could not remove directory $directory: $!";
+      while (($directory = dirname($directory)) && -e $directory && !scalar @{Utils::ReadDir($directory)}) {
+        rmdir $directory or die "Error: Could not remove directory $directory: $!";
+      }
+    }
+  }
+}
+
+sub CheckEnv {
+  my $self = shift;
+  my $displayProgress = shift;
+  my $ignoreStandardIgnores = shift;
+  my $warnNotError = shift; # When validating the MrpData, warnings will be produced
+                           # instead of errors when checking paths lengths DEF099673
+  
+  unless (defined $displayProgress) {
+    $displayProgress = 0;
+  }
+  unless (defined $ignoreStandardIgnores) {
+    $ignoreStandardIgnores = 0;
+  }
+
+  my $overallStatus = STATUS_CLEAN;
+  my @dirtyComps;
+
+  if ($displayProgress) {
+    print "Scanning environment";
+  }
+
+  $self->InitIgnores($ignoreStandardIgnores);
+  $self->ScanEnv($displayProgress);
+
+  my @mrpData;
+  my @errors;
+  foreach my $thisComp (sort keys %{$self->{db}}) {
+    (my $status, my $mrpData) = $self->CheckComp($thisComp, undef, $warnNotError);
+    my $ver = $self->{db}->{$thisComp}->{ver};
+    if ($status == STATUS_DIRTY || $status == STATUS_DIRTY_SOURCE) {
+      $overallStatus = STATUS_DIRTY;
+      push (@dirtyComps, {comp => $thisComp, ver => $ver});
+    }
+    elsif ($status == STATUS_PENDING_RELEASE) {
+      unless ($overallStatus == STATUS_DIRTY) {
+        $overallStatus = STATUS_PENDING_RELEASE;
+      }
+      if (defined $mrpData) {
+        push @mrpData, $mrpData;
+      }
+      else {
+        push @errors, "Error: Problem extracting mrp data from $thisComp\n";
+      }
+    }
+    if ($displayProgress and not $self->{verbose}) {
+      print '.';
+    }
+  }
+  if ($displayProgress and not $self->{verbose}) {
+    print "\n";
+  }
+
+  if ($#errors >= 0) {
+    chomp $errors[$#errors];
+    print @errors;
+    die "\n";
+  }
+
+  $self->RemoveBinsToIgnore();
+
+  my $unaccountedFiles = $self->UnaccountedEnvFiles();
+  if (scalar(@$unaccountedFiles) >= 1) {
+    $overallStatus = STATUS_DIRTY;
+  }
+
+  my $duplicates = $self->Duplicates(\@mrpData);
+  if (scalar(@$duplicates) >= 1) {
+    $overallStatus = STATUS_DIRTY;
+  }
+
+  return ($overallStatus, \@mrpData, \@dirtyComps, $unaccountedFiles, $duplicates);
+}
+
+sub CheckComp {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $keepGoing = shift;
+  my $warnNotError = shift;
+  
+  unless (defined $keepGoing) {
+    $keepGoing = 1;
+  }
+
+  my $entry = $self->{db}->{$comp};
+  if (!defined $entry || $self->{db}->{$comp}->{status} == STATUS_INFORMATION_ONLY) {
+    return (STATUS_NOT_INSTALLED);
+  }
+  my $oldstatus = $entry->{status};
+  my $ver = $entry->{ver};
+  die unless $ver;
+  my $passed = 1;
+
+  my $doCheck = sub {
+    my $file = shift;
+    my $sigMTime = shift;
+    my $sigSize = shift;
+
+    if (-e $file) { # Files might be installed in directories other than \epoc32, so do an explicit check.
+      $self->CheckFileAgainstEnvScan($file);
+      # Check the signature information against what is physically present in the environment.
+      (my $actualMTime, my $actualSize) = Utils::FileModifiedTimeAndSize($file);
+      if ($sigMTime != $actualMTime or $sigSize != $actualSize) {
+        # File failed check.
+        $passed = 0;
+        if ($self->{verbose}) {
+          print "$comp $ver $file failed check\n";
+        }
+        if ($self->{verbose} > 1) {
+          my $printableActualMTime = gmtime($actualMTime);
+          my $printableSigMTime = gmtime($sigMTime);
+          print "\tcurrent mtime:   $printableActualMTime\n";
+          print "\tsignature mtime: $printableSigMTime\n";
+          print "\tcurrent size:    $actualSize\n";
+          print "\tsignature size:  $sigSize\n";
+        }
+        unless ($keepGoing) {
+          return 0;
+        }
+      }
+      else {
+        # File passed check.
+        if ($self->{verbose} > 1) {
+          print "$comp $ver $file passed\n";
+        }
+      }
+    }
+    else {
+      # File missing.
+      $passed = 0;
+      if ($self->{verbose}) {
+        print "$comp $ver $file missing\n";
+      }
+      unless ($keepGoing) {
+        return 0;
+      }
+    }
+
+    return 1;
+  };
+
+  my $mrpData;
+  die unless defined $entry->{status};
+  if ($entry->{status} == STATUS_PENDING_RELEASE) {
+    eval {
+      unless (defined $entry->{mrpName}) {
+        die "Error: mrp name not specified for $comp\n";
+      }
+      $mrpData = $self->GetMrpData($comp);
+      $mrpData->Validate($warnNotError);
+      foreach my $thisBin (@{$mrpData->BinariesAndExports()}) {
+	$thisBin = Utils::PrependEpocRoot($thisBin);
+        $self->CheckFileAgainstEnvScan($thisBin);
+      }
+    };
+    if ($@) {
+      $mrpData = undef; # splat the MrpData in order to stop
+                        # the envinfo/cleanenv.
+                        # We need to do this because the only
+                        # way we have of returning an error is to
+                        # fail to return the MRP.
+      if ($self->{verbose} == 0) {
+        print "\n";
+      }
+      print "$comp: $@";
+    }
+  }
+  else {
+    ExecuteSignature(SignatureName($comp, $ver), $doCheck);
+
+    if ($passed) {
+      if ($oldstatus == STATUS_DIRTY) {
+        $self->SetStatus($comp, STATUS_CLEAN);
+      } else {
+        # Here we return the original status from the environment database,
+        # which is probably STATUS_CLEAN but might by STATUS_DIRTY_SOURCE
+        $self->SetStatus($comp, $oldstatus);
+      }
+    }
+    else {
+      $self->SetStatus($comp, STATUS_DIRTY);
+    }
+  }
+
+  return ($self->Status($comp), $mrpData);
+}
+
+sub ValidateEnv {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $ver = shift;
+  my $validatesource = shift;
+  my $fullbincheck = shift;
+
+  my $validatingExternalEnv = 0;
+  my $compsToValidate;
+  if (defined $comp and defined $ver) {
+    if (scalar (keys %{$self->{db}}) > 0) {
+      die "Error: Can't validate against an external environment, because the current environment database is not empty\n";
+    }
+    $validatingExternalEnv = 1;
+    my $relData = RelData->Open($self->{iniData}, $comp, $ver, $self->{verbose});
+    $compsToValidate = $relData->Environment();
+  }
+  else {
+    # Use the current environment.
+    foreach my $thisComp (sort keys %{$self->{db}}) {
+      $compsToValidate->{$thisComp} = $self->{db}->{$thisComp}->{ver};
+    }
+  }
+
+  my @failedComps;
+  foreach my $thisComp (sort keys %{$compsToValidate}) {
+    my $thisVer = $compsToValidate->{$thisComp};
+    my $result = $self->ValidateComp($thisComp, $thisVer, 0, $validatesource, 0, $fullbincheck);
+    if ($result == STATUS_DIRTY || $result == STATUS_DIRTY_SOURCE) {
+      push (@failedComps, $thisComp);
+      if ($validatingExternalEnv) {
+        # Add an entry even of components that failed. This makes it easier for the user to specify what needs to be re-released.
+        $self->SetVersion($thisComp, $thisVer);
+        if ($result == STATUS_DIRTY) {
+          $self->GenerateFakeSignature($thisComp, $thisVer);
+        } elsif ($result == STATUS_DIRTY_SOURCE) {
+          $self->GenerateSignature($thisComp, $thisVer);
+        }
+        $self->SetStatus($thisComp, $result);
+        my $relData = RelData->Open($self->{iniData}, $thisComp, $thisVer, $self->{verbose});
+        $self->SetMrpName($thisComp, $relData->MrpName());
+        $self->SetInternalVersion($thisComp, $relData->InternalVersion());
+      }
+    }
+  }
+
+  return \@failedComps;
+}
+
+sub ValidateCompOld {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $ver = shift;
+  my $keepGoing = shift;
+  my $validatesource = shift;
+  my $keeptemp = shift;
+  my $fullbincheck = shift;
+  unless (defined $keepGoing) {
+    $keepGoing = 1;
+  }
+
+  my $status = STATUS_CLEAN;
+  die unless defined $ver;
+
+  my $entry = $self->{db}->{$comp};
+  if (defined $entry and $entry->{status} == STATUS_PENDING_RELEASE) {
+    if ($ver eq $entry->{ver}) { # allow validation against other versions even if we're pending release
+      return STATUS_PENDING_RELEASE;
+    }
+  }
+
+  my $relData = RelData->Open($self->{iniData}, $comp, $ver, $self->{verbose});
+
+  # Always validate binaries
+  # I initially added an option to turn this off, but I decided that was overcomplexity
+  # and I couldn't think of any use cases except tinkering with the release tools...
+  print "Validating binaries $comp $ver...\n";
+  Utils::InitialiseTempDir($self->{iniData});
+  eval {
+    # Get a temporary copy of the released binaries.
+    my $tempDir = Utils::TempDir();
+    $self->UnpackBinaries($comp, $ver, $tempDir, 1); # 1 = overwrite
+
+    # Call evalid to compare these with those installed in the environment.
+    # We now validate everything in the temp dir, not just \epoc32,
+    # because some components release binaries outside \epoc32.
+    my $clean = $self->EvalidateDirectories($tempDir, Utils::PrependEpocRoot('.'), $keepGoing);
+    $status = ($clean)?(STATUS_CLEAN):(STATUS_DIRTY);
+
+    if ($clean and $fullbincheck) {
+      # Ask the current mrp file for a list of binaries (using abld -what)
+      my $mrpData;
+
+      my $mrpPath = $relData->MrpName();
+      if($self->{iniData}->HasMappings() && Utils::SourceRoot() eq "\\") {
+        $mrpPath = $self->{iniData}->PerformMapOnFileName($mrpPath);
+      }
+      else{
+        $mrpPath = Utils::PrependSourceRoot($mrpPath);
+      }
+      if (!-f $mrpPath) {
+        print "Not checking for new binaries; MRP file not present\n";
+      } else {
+        eval {
+          $mrpData = New MrpData($relData->MrpName(), undef, undef, $self->{iniData}, $self->{verbose}); # undef = we're not preprel-ing it
+        };
+
+        if (!defined($mrpData)) {
+          my $error = $@;
+          $error =~ s/\s*$//;
+          print "Not checking for new binaries; $error\n";
+        } else {
+          my @binaries = @{$mrpData->Binaries()};
+          push @binaries, @{$mrpData->Exports()};
+
+          # Get list of binaries in the temporary copy
+          my %oldbinaries;
+
+          my $sub = sub { # Subroutine to add files to %oldbinaries
+            return if -d $_; # Check it's not a directory
+            s/^\Q$tempDir\E[\/\\]?//; # Strip the temp dir path off
+            s/\\/\//g; # Convert backslashes
+            $oldbinaries{lc($_)}=1 unless (/^\.\.?$/) # Add to hash (unless it's .. or .)
+          };
+
+          find( {wanted=>$sub, no_chdir=>1}, $tempDir); # Use no_chdir and s/.../ to get a full relative path. Second s/.../ converts backslashes to normal slashes
+          foreach my $binary (@binaries) {
+            $binary = lc($binary);
+            $binary =~ s/\\/\//g; # Convert backslashes to normal slashes
+            if (exists $oldbinaries{$binary}) {
+              delete $oldbinaries{$binary};
+            } else {
+              print "New binary file: $binary\n";
+              $status = STATUS_DIRTY;
+            }
+          }
+          foreach my $oldbinary (keys(%oldbinaries)) {
+            print "Binary file no longer built: $oldbinary\n";
+	    $status = STATUS_DIRTY;
+          }
+	}
+      }
+    }
+  };
+
+  if ($keeptemp) {
+    print "Old release stored in \"".Utils::TempDir()."\"\n";
+  } else {
+    Utils::RemoveTempDir();
+  }
+  if ($@) {
+    die $@;
+  }
+
+  # We need to check if the categories for exports has changed or not...
+  if ($status == STATUS_CLEAN) {
+    foreach my $thisBinZip (@{$self->RelevantBinaryZips($comp, $ver)}) {
+
+      if($thisBinZip =~ /exports([a-z]).zip/i) {
+        my $catInArchive = $1;
+        # Open and read the corresponding exports category info file in the archive
+        my $catData = CatData->Open($self->{iniData}, $comp, $ver, $catInArchive);
+        my $catWriteInCatDataFile;
+
+        # Obtain the category written the exports category info file, if unable to read skip check
+        eval {
+          $catWriteInCatDataFile = $catData->Category();
+        };
+        if ($@) {
+          last;
+        }
+        # Check the categories match
+        if($catInArchive !~ /^$catWriteInCatDataFile$/i){
+          die "ERROR: Mismatch in category found in exports$catInArchive.txt for $comp $ver\n";
+        }
+
+        my $exportinfo = $catData->ExportInfo();
+        my $destinationDirBuffer;
+
+        # Using the export infomation as read for the exports category info file check the category of the export file.
+        foreach my $export (sort(keys %{$exportinfo})) {
+          my $destinationDir;
+          my $classifySourceFlag = 1; # Classify source using function ClassifySourceFile only if set as 1;
+          my $destination = $catData->ExportSource($export);
+
+          # Consider any mappings if defined
+          if($self->{iniData}->HasMappings()){
+            $destination = $self->{iniData}->PerformMapOnFileName($destination);
+          }
+
+          if(defined $destinationDirBuffer){
+            ($destinationDir) = Utils::SplitFileName($destination);
+
+            if($destinationDirBuffer =~ /^\Q$destinationDir\E$/i){
+              $classifySourceFlag = 0;
+            }
+          }
+
+          my $absolute_path = Utils::PrependSourceRoot($destination);
+
+    	  # validate only if source validation is requested or the source is present
+    	  if($classifySourceFlag and ($validatesource or -e $absolute_path)){
+                # Obtain the category from the source destinaton extracted for the exports category info file
+    	    my ($catInEnv, $errors) = Utils::ClassifyPath($self->{iniData}, $destination, 0, 0, $comp); # verbose = 0 and logErrors = 0
+    	    if ($catInEnv !~ /^$catInArchive$/i){
+                  print "Change in category found (ENV) \"$catInEnv\" : (Archive) \"$catInArchive\" using $thisBinZip for file $export\n";
+    	      $status = STATUS_DIRTY;
+    	      last;
+    	    }
+
+    	    $destinationDirBuffer = Utils::SplitFileName($destination);
+    	  }
+        }
+      }
+    }
+  }
+
+  # We only bother validating source if we've discovered the binaries are clean.
+  # This implies that STATUS_DIRTY means the binaries are dirty, but the status of
+  # the source code is undefined.
+  if ($validatesource && $status == STATUS_CLEAN) {
+    print "Validating source for $comp $ver...\n";
+    Utils::InitialiseTempDir($self->{iniData});
+    eval {
+      # Get a temporary copy of the released source.
+      my $tempDir = Utils::TempDir();
+
+      my $changeInCat = $self->UnpackSource($comp, $ver, $tempDir, 1, 0, 1); # 1 = overwrite, 0 = do not show progress, 1 = validate
+
+      if($changeInCat){
+	print "Change in category found for $comp...\n";
+        $status = STATUS_DIRTY_SOURCE;
+      }
+
+      # The following code is the only place where a component can have its
+      # status set to "dirty source code". This status was added when
+      # the -s switch was added to ValidateEnv/Rel to validate source code.
+      # It would have been simpler to just set a component to 'dirty' when
+      # the source code was dirty, but this was not possible for the following
+      # reason. When envinfo -f gathers the state information of a component
+      # (or, for that matter, some other command checks the environment is clean)
+      # this calls the CheckComp function. This ignores the status stored in
+      # the environment database, and works it out afresh from the timestamps
+      # on the individual files. Hence we needed to add a new status which
+      # CheckComp would propagate through, so it can report the status
+      # on envinfo. (Otherwise we would have to change CheckComp
+      # so it also checked the status of each source code file eacb
+      # time).
+      #
+      # It would be nice here to ensure we have all the source
+      # installed, but I don't think there's a nice way of finding
+      # out the directory that the source comes in. (Not without
+      # unzipping the zip, and we might as well just evalidate it...)
+      #
+      # This grim \. thing is not homage to the Great Geek Website
+      # It is because evalid gets grumpy if you give it either \ or ''
+      # as an argument. The first time is because \\ isn't a valid
+      # directory separator in Win32 (!!) and the second is because
+      # Perl doesn't think '' is a valid directory (which is probably
+      # fair enough). Rather than file a defect against Windows,
+      # let's pass in slightly silly arguments to evalid.
+      if ($status == STATUS_CLEAN) {
+        print "Checking for changed or removed files\n" if ($self->{verbose});
+        my $clean = $self->EvalidateDirectories($tempDir, Utils::PrependSourceRoot('.'), $keepGoing);
+        $status = STATUS_DIRTY_SOURCE unless ($clean);
+      }
+      # The above checks will only have found changed or removed files.
+      # Files that have been added to the source won't be in the $tempDir,
+      # so evalid won't pick them up and test them. So we have to
+      # explicitly check for added files.
+      # Only bother doing this if we haven't found problems already.
+      if ($status == STATUS_CLEAN) {
+        # Recurse through each directory in the temp dir, listing the
+        # equivalent dir on the drive (i.e. the latest source). If there
+        # are more files on the drive than in the source tree, source
+        # is dirty.
+        print "Checking for added files\n" if ($self->{verbose});
+        eval {
+          $status = STATUS_DIRTY_SOURCE if ($self->CheckForAddedFiles($relData, $tempDir));
+        };
+        if ($@) {
+          print "Warning: skipping the check for added files, for the component \"$comp\". All other source code validation checks passed. The reason is: $@";
+        }
+      }
+    };
+    Utils::RemoveTempDir();
+    if ($@) {
+      die $@;
+    }
+  }
+
+  if ($status == STATUS_CLEAN) {
+    # Previously this SetVersion line was wrapped in an "if", so that
+    # it didn't happen if $entry was defined - i.e. it was already in the
+    # environment database. After discussion with Joe and James this behaviour
+    # has been changed.
+    $self->SetVersion($comp, $ver);
+    $self->SetStatus($comp, $status);
+    $self->GenerateSignature($comp, $ver);
+    $self->SetMrpName($comp, $relData->MrpName());
+    $self->SetInternalVersion($comp, $relData->InternalVersion());
+  }
+  elsif ($entry && $entry->{status} &&
+    $entry->{status} == STATUS_PENDING_RELEASE) {
+    # Old status was pending release; so we don't do anything
+  }
+  elsif ($status == STATUS_DIRTY) {
+    if (defined $entry) {
+      # The component used to be in the environment database
+      # We set its status in case it used to be STATUS_DIRTY_SOURCE
+      # and it's now STATUS_DIRTY.
+      $self->SetStatus($comp, $status);
+    }
+    # This component wasn't previously in the environment database;
+    # do nothing
+  }
+  elsif ($status == STATUS_DIRTY_SOURCE) {
+    if (defined $entry) {
+      $self->SetStatus($comp, $status);
+      $self->GenerateSignature($comp, $ver);
+      # Because otherwise any 'envinfo' will reset a component status
+      # to dirty, even if only its source is dirty
+    }
+  }
+  print "Status ", StatusString($status), "\n";
+  return $status;
+}
+
+sub ValidateComp {
+	my $self = shift;
+	my $comp = lc(shift);
+	my $ver = shift;
+	my $keepGoing = shift;
+	my $validatesource = shift;
+	my $keeptemp = shift;
+	my $fullbincheck = shift;
+	unless ( defined $keepGoing ) {
+	  $keepGoing = 1;
+	}
+	my $manifestFromThisComponent = undef;
+	my $status = STATUS_CLEAN;
+	die unless defined $ver;
+
+	my $entry = $self->{db}->{$comp};
+	if (defined $entry and $entry->{status} == STATUS_PENDING_RELEASE) {
+		if ($ver eq $entry->{ver}) { # allow validation against other versions even if we're pending release
+			return STATUS_PENDING_RELEASE;
+		}
+	}
+
+	#Create a relData object for retrieving the mrpPath required for building the manifest object
+	my $relData = RelData->Open( $self->{iniData}, $comp, $ver, $self->{verbose} );
+
+	#Find the archive location for release and build the file path for loading the manifest file from the location
+	my $relDir = $relData->{iniData}->PathData->LocalArchivePathForExistingComponent( $comp, $ver );
+	my $manifestPath = File::Spec->catfile( $relDir, MANIFEST_FILE );
+
+	#Check if manifest file exists
+	if (-e $manifestPath) {
+	#Define callback to validate files which don't have checksum defined in manifest file.
+	my $callback = sub {
+		my $filesToValidate = shift;
+		my $manifestObject = shift;
+		my $keepGoing = shift;
+		{
+			local $" = ", ";
+			print "No checksum found for file(s) @{$filesToValidate} - reverting to old evalid process.\n";
+		}
+		Utils::InitialiseTempDir($self->{iniData});
+		my $tempDir = Utils::TempDir();
+		my $epocFilePath = Utils::EpocRoot();
+		my $sourceFilePath = Utils::SourceRoot();
+		my $fullEvalidName = Utils::FindInPath('evalid.bat');
+		my $clean = 1;
+		my @files;
+		foreach  my $thisFile (@{$filesToValidate}) {
+			my $zipName;
+			my $file;
+			my $fileContentType = $manifestObject->GetFileInfo($thisFile, CONTENT_TYPE);
+			if ($fileContentType  eq 'source' or $fileContentType  eq 'export') {
+				my $cat = $manifestObject->GetFileInfo($thisFile, IPR_CATEGORY);
+				if ($fileContentType eq 'source') {
+					$zipName = "source".$cat;
+					$file = File::Spec->catfile($sourceFilePath, $thisFile) 
+				} else {
+					$zipName = "exports".$cat;
+					$file = File::Spec->catfile($epocFilePath, $thisFile);
+				}
+			}
+			elsif ($fileContentType eq 'binary') {
+				my $platForm = $manifestObject->{files}{$thisFile}{'platform'}; 
+				if (defined $platForm) {
+					$zipName = "binaries"."_".$platForm;
+				}
+				else {
+					$zipName = "binaries";
+				}
+				$file = File::Spec->catfile($epocFilePath, $thisFile);
+			}
+			$zipName = $zipName.".zip";
+			my $zipPath = File::Spec->catfile($relDir,$zipName);  
+			Utils::UnzipSingleFile($zipPath,$thisFile, $tempDir, $self->{verbose}, 1, $comp); #overwrite = 1
+			push @files, [$thisFile, $file];
+		}
+		foreach my $thisFile (@files) {
+			my $firstPath = File::Spec->catfile($tempDir,shift(@$thisFile));
+			my $secondPath = shift(@$thisFile);
+			open EVALID, "$fullEvalidName -c $firstPath $secondPath|" or die "Error: Couldn't run EValid: $!\n";
+			my $thisLine;
+			my $acceptablefailures = ACCEPTABLE_EVALID_FAILURES;
+			while ($thisLine = <EVALID>) {
+				if ($thisLine =~ m/MISSING:|FAILED:|PROBLEM:/ && $thisLine !~ m/$acceptablefailures/i) {
+					print $thisLine  if ($self->{verbose});
+					$clean = 0;
+					unless ($keepGoing) {
+						Utils::RemoveTempDir();
+						return $clean;
+					}
+				}
+			}
+		}
+		Utils::RemoveTempDir();
+		return $clean;
+	};
+
+	#Load the manifest file to create a manifest object
+	my $manifestFromBaselineComponent = Symbian::CBR::Component::Manifest->new( $manifestPath );
+
+	my $mrpPath = Utils::RelativeToAbsolutePath( $relData->MrpName(), $self->{iniData}, SOURCE_RELATIVE );
+
+	if ($fullbincheck && -e $mrpPath) {
+		$manifestFromThisComponent = Symbian::CBR::Component::Manifest->new($mrpPath);
+	} else {
+		if ($fullbincheck) {
+			print "Not checking for new binaries; MRP file not present\n";
+		}
+
+		$manifestFromThisComponent = Symbian::CBR::Component::Manifest->new($manifestPath);
+		$manifestFromThisComponent->RefreshMetaData($comp, $ver);
+	}
+
+	#Compare the manifest objects
+	eval {$status = $manifestFromThisComponent->Compare($manifestFromBaselineComponent, $validatesource, $keepGoing,$callback)};
+
+	#Check if Compare() completed without errors
+	if (!$@) {
+
+		#If $keeptemp set, unpack binaries to temp location
+		if ( $keeptemp ) {
+
+			Utils::InitialiseTempDir($self->{iniData});
+			# Get a temporary copy of the released binaries.
+			my $tempDir = Utils::TempDir();
+			$self->UnpackBinaries($comp, $ver, $tempDir, 1); # 1 = overwrite
+
+			#If $validatesource is set, get temp copy of released sources
+			$self->UnpackSource($comp, $ver, $tempDir, 1, 0, 1) if $validatesource;
+
+			print "Old release stored in \"".Utils::TempDir()."\"\n";
+		}
+
+		#If status is dirty, save manifest to temp location
+		$self->SaveManifestToTempDir($comp, $manifestFromThisComponent) if $status == STATUS_DIRTY;
+
+		#Update the environemnt as done by validatecompold
+		$self->UpdateEnvironment( $status, $entry, $relData );
+
+		print "Status ", StatusString($status), "\n";
+		return $status;
+	}
+
+	else {
+		print "$@Continuing with old validaterel process..\n";
+	}
+
+	}
+	else {
+		print "Manifest file does not exist in the version $ver for component $comp..\nContinuing with old validaterel process..\n";
+	}
+
+	#Call the old validaterel process if manifest comparison is not possible
+	$status = $self->ValidateCompOld( $comp, $ver, $keepGoing, $validatesource, $keeptemp, $fullbincheck );
+
+	#If status is dirty during validatecompold, still we want to save manifest to temp location
+	if ( defined $manifestFromThisComponent and ($status == STATUS_DIRTY or $status == STATUS_DIRTY_SOURCE) ) {
+		$self->SaveManifestToTempDir($comp, $manifestFromThisComponent);
+	}
+
+	return $status;
+}
+
+sub UpdateEnvironment {
+	my $self = shift;
+	my $status = shift;
+	my $entry = shift;
+	my $relData = shift;
+
+	my $comp = $relData->Component();
+	my $ver = $relData->Version();
+
+	if ($status == STATUS_CLEAN) {
+		# Previously this SetVersion line was wrapped in an "if", so that
+		# it didn't happen if $entry was defined - i.e. it was already in the
+		# environment database. After discussion with Joe and James this behaviour
+		# has been changed.
+		$self->SetVersion( $comp, $ver );
+		$self->SetStatus( $comp, $status );
+		$self->GenerateSignature( $comp, $ver );
+		$self->SetMrpName( $comp, $relData->MrpName() );
+		$self->SetInternalVersion( $comp, $relData->InternalVersion() );
+	}
+	elsif ($entry && $entry->{status} &&
+		$entry->{status} == STATUS_PENDING_RELEASE) {
+		# Old status was pending release; so we don't do anything
+	}
+	elsif ($status == STATUS_DIRTY) {
+		if (defined $entry) {
+			# The component used to be in the environment database
+			# We set its status in case it used to be STATUS_DIRTY_SOURCE
+			# and it's now STATUS_DIRTY.
+			$self->SetStatus( $comp, $status );
+		}
+		# This component wasn't previously in the environment database;
+		# do nothing
+	}
+	elsif ($status == STATUS_DIRTY_SOURCE) {
+		if (defined $entry) {
+			$self->SetStatus( $comp, $status );
+			$self->GenerateSignature( $comp, $ver );
+			# Because otherwise any 'envinfo' will reset a component status
+			# to dirty, even if only its source is dirty
+		}
+	}
+}
+
+sub SaveManifestToTempDir {
+	my $self = shift;
+	my $comp = shift;
+	my $manifestFromThisComponent = shift;
+
+	my $manifestTempFile = "manifest_".$comp.".xml";
+	my $manifestFile = $manifestFromThisComponent->Save( File::Spec->tmpdir(), $manifestTempFile );
+#	my $manifestTempFile = File::Spec->catfile( File::Spec->tmpdir(), "manifest_".$comp.".xml" );
+#	rename( $manifestFile, $manifestTempFile );
+}
+
+sub Duplicates {
+  my $self = shift;
+  my $mrpData = shift;
+  my $installedComps = $self->VersionInfo();
+  my %binHash;
+  my @duplicates;
+
+  # First cross-check against the components about to be released.
+  foreach my $thisMrp (@{$mrpData}) {
+    my $comp = lc($thisMrp->Component());
+    my $bins = $thisMrp->BinariesAndExports();
+    foreach my $thisBin (@$bins) {
+      $thisBin = lc(Utils::PrependEpocRoot($thisBin));
+
+      print "Checking $thisBin for duplicateness (pending release)\n" if ($self->{verbose}>1);
+      if (exists $binHash{$thisBin}) {
+ 	push @duplicates, [$thisBin, $comp, $binHash{$thisBin}]; # $comp attempting to release $thisBin which has already been released by $binHash{$thisBin}";
+      }
+      else {
+	$binHash{$thisBin} = $comp;
+      }
+    }
+    delete $installedComps->{$comp};
+  }
+
+  # Now cross-check against the other components in the environment.
+  foreach my $thisComp (keys %{$installedComps}) {
+    my $doCheck = sub {
+      my $file = lc(shift);
+      print "Checking $file for duplicateness\n" if ($self->{verbose}>1);
+      if (exists $binHash{$file}) {
+	push @duplicates, [$file, $binHash{$file}, $thisComp]; #"$binHash{$file} attempting to release $file which has already been released by $thisComp";
+      }
+      else {
+	$binHash{$file} = $thisComp;
+      }
+    };
+    my $sigName = SignatureName($thisComp, $installedComps->{$thisComp});
+    ExecuteSignature($sigName, $doCheck);
+  }
+
+  return \@duplicates;
+}
+
+sub BinaryInfo {
+  my $self = shift;
+  my $binary = shift;
+  unless (-e $binary) {
+    die "Error: \"$binary\" does not exist\n";
+  }
+
+  (my $currentMTime, my $currentSize) = Utils::FileModifiedTimeAndSize($binary);
+  my $sigMTime;
+  my $sigSize;
+  my $sigName;
+
+  my $findBin = sub {
+    my $file = shift;
+    if (lc($binary) eq lc($file)) {
+      $sigMTime = shift;
+      $sigSize = shift;
+      $sigName = shift;
+      return 0;
+    }
+    return 1; # Means continue;
+  };
+  ExecuteAllSignatures($findBin);
+
+  my $comp;
+  my $ver;
+  my $pendingRelease = 0;
+
+  if (defined $sigMTime and defined $sigName) {
+    ($comp, $ver) = $self->DecodeSignatureName($sigName);
+  }
+  else {
+    # Binary not found in the signatures, so check for components pending release.
+    if (Utils::WithinEpocRoot($binary)) {
+	      $binary = Utils::RemoveEpocRoot($binary); # remove EPOCROOT
+    }
+    $binary =~ s!^[\\\/]!!; # remove leading slash
+
+    foreach my $thisComp (keys %{$self->{db}}) {
+      if ($self->Status($thisComp) == STATUS_PENDING_RELEASE) {
+        my $thisVer = $self->{db}->{$thisComp}->{ver};
+        my $thisMrpData = $self->GetMrpData($thisComp);
+        $thisMrpData->EnsureDoesNotExist();
+
+        if (grep /^\Q$binary\E$/i, @{$thisMrpData->Binaries()}) {
+          $pendingRelease = 1;
+          $comp = $thisComp;
+          $ver = $thisVer;
+          last;
+        }
+        elsif (grep /^\Q$binary\E$/i, @{$thisMrpData->Exports()}) {
+          $pendingRelease = 1;
+          $comp = $thisComp;
+          $ver = $thisVer;
+          last;
+        }
+      }
+    }
+    unless (defined $comp and defined $ver) {
+      my $ignoreList = $self->{iniData}->BinariesToIgnore();
+      push (@$ignoreList, Utils::PrependEpocRoot('\\epoc32\\relinfo\\*'));
+      foreach my $ignore (@$ignoreList) {
+      $ignore =~ s/\\/\\\\/g;
+      $ignore =~ s/\./\\\./g;
+      $ignore =~ s/\*/\.\*/g;
+
+      if ($binary !~ /^\\/) {
+        $ignore =~ s/^\\*//;
+      }
+
+      if ($binary =~ /^$ignore$/i) {
+        die "Error: no information available for \"$binary\". It is not part of any component, but it is ignored by the 'ignore_binary' rule '$ignore'. This rule might be in your reltools.ini, or it might be one of the standard ignores.\n";
+      }
+      }
+      die "Error: No information available for \"$binary\". It's not even one of the files/directories that are ignored as standard.\n";
+    }
+  }
+
+  my $info;
+  push (@$info, ['Component:', $comp]);
+  push (@$info, ['Version:', $ver]);
+  if ($pendingRelease) {
+    push (@$info, ['Status:', 'pending release']);
+  }
+  elsif ($currentMTime == $sigMTime and $currentSize == $sigSize) {
+    push (@$info, ['Status:', 'clean']);
+  }
+  else {
+    push (@$info, ['Status:', 'dirty']);
+  }
+
+  return $info;
+}
+
+sub ListBins {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = $self->Version($comp);
+  die unless $ver;
+
+  if ($self->Status($comp) == STATUS_PENDING_RELEASE) {
+    $self->ListBinsPendingRelease($comp, $ver);
+  } else {
+    $self->ListBinsStandard($comp, $ver);
+  }
+}
+
+sub GetMrpData {
+  my $self = shift;
+  my $compname = lc(shift);
+  my $entry = $self->{db}->{$compname};
+  die "Invalid component name \"$compname\"" unless $entry;
+
+  my $name = $entry->{mrpName};
+  unless ($self->{mrpcache}->{$name}) {
+    my $mrpData = MrpData->New($entry->{mrpName}, $entry->{ver}, $entry->{intVer}, $self->{iniData}, $self->{verbose});
+    my $namefrommrp = $mrpData->Component();
+    die "Error: Component name in MRP file is \"$namefrommrp\" whilst the name of this component in the environment database is \"$compname\".\n" unless (lc $compname eq lc $namefrommrp);
+    $self->{mrpcache}->{$name} = $mrpData;
+  }
+  return $self->{mrpcache}->{$name};
+}
+
+
+sub GetMRPLocations {
+  my $self = shift;
+  my $componentName = lc(shift);
+  
+  # If only the MRP location for a specified component is required...
+  if ($componentName) {
+    if (exists $self->{db}->{$componentName}) {
+      return (Utils::PrependSourceRoot($self->{db}->{$componentName}->{mrpName}));
+    }
+    else {
+      return undef;
+    }
+  }
+
+  # Otherwise all MRP locations are returned to the caller
+  my @mrpLocations;
+  
+  foreach my $component (keys %{$self->{db}}) {
+    push @mrpLocations, Utils::PrependSourceRoot($self->{db}->{$component}->{mrpName});
+  }
+  
+  return @mrpLocations;  
+}
+
+#
+# Private.
+#
+
+sub ListBinsStandard {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $info;
+  push (@$info, ['File', 'Status']);
+
+  my $sigName = SignatureName($comp, $ver);
+  my $gatherInfo = sub {
+    my $file = shift;
+    my $sigMTime = shift;
+    my $sigSize = shift;
+
+    if (-e $file) {
+      (my $actualMTime, my $actualSize) = Utils::FileModifiedTimeAndSize($file);
+      if (!defined $actualMTime or !defined $actualSize) {
+	die "Error: Problem stating \"$file\"\n";
+      }
+      elsif ($sigMTime != $actualMTime or $sigSize != $actualSize) {
+	push (@$info, [$file, STATUS_STRING_FAILED]);
+      }
+      else {
+	push (@$info, [$file, STATUS_STRING_PASSED]);
+      }
+    }
+    else {
+      push (@$info, [$file, STATUS_STRING_MISSING]);
+    }
+
+    return 1; # Means continue with next line in signature.
+  };
+
+  ExecuteSignature($sigName, $gatherInfo);
+  return $info;
+}
+
+sub ListBinsPendingRelease {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $mrpData = $self->GetMrpData($comp);
+
+  my @info;
+  push @info, ['File', 'Status', 'Category'];
+  foreach my $cat (@{$mrpData->BinaryCategories()}) {
+    foreach my $file (@{$mrpData->Binaries($cat)}) {
+      push @info, [$file, 'pending release', $cat];
+    }
+  }
+  foreach my $cat (@{$mrpData->ExportCategories()}) {
+    foreach my $file (@{$mrpData->Exports($cat)}) {
+      push @info, [$file, 'pending release', $cat];
+    }
+  }
+  # To do ideally: add another column to report which bld.inf each binary
+  # comes from (if any). This requires quite a lot of internal restructuring
+  # of MrpData.pm so will probably never happen... It's not worth the benefits.
+  return \@info;
+}
+
+sub DESTROY {
+  my $self = shift;
+  $self->Close();
+}
+
+sub EvalidateDirectories {
+  my $self = shift;
+  my $firstdirectory = shift;
+  my $seconddirectory = shift;
+  my $keepGoing = shift;
+
+  my $clean = 1;
+  my $fullEvalidName = Utils::FindInPath('evalid.bat');
+
+  # Call evalid to compare these with those installed in the environment.
+  if ($self->{verbose} > 1) {
+    print "Evalid command is $fullEvalidName -c $firstdirectory $seconddirectory\n";
+  }
+  open EVALID, "$fullEvalidName -c $firstdirectory $seconddirectory|" or die "Error: Couldn't run EValid: $!\n";
+  my $thisLine;
+  while ($thisLine = <EVALID>) {
+    my $acceptablefailures = ACCEPTABLE_EVALID_FAILURES;
+    if ($thisLine =~ m/MISSING:|FAILED:|PROBLEM:/ && $thisLine !~ m/$acceptablefailures/i) {
+      if ($self->{verbose}) { print $thisLine; }
+      $clean = 0;
+      unless ($keepGoing) {
+        last;
+      }
+    }
+    elsif ($self->{verbose} > 1) {
+      print $thisLine;
+    }
+  }
+  close EVALID;
+
+  return $clean;
+}
+
+sub ScanEnv {
+  my $self = shift;
+  my $displayProgress = shift;
+  my $progressTuner = 0;
+
+  my $processFileSub = sub {
+    if ($displayProgress) {
+      ++$progressTuner;
+      if ($progressTuner >= SCAN_PROGRESS_TUNER) {
+        $progressTuner = 0;
+        select STDOUT; $|=1;
+        print ".";
+      }
+    }
+    my $thisFile = lc($File::Find::name);
+    Utils::TidyFileName(\$thisFile);
+    if (-f $thisFile) {
+      $self->{envFileList}->{$thisFile} = 1;
+    }
+    elsif (-d $thisFile and $self->CheckIgnoreDir($thisFile)) {
+      $File::Find::prune = 1;
+    }
+    elsif (-d $thisFile && !@{Utils::ReadDir($thisFile)}) {
+      # This is an empty directory.  It is not possible to own empty directories,
+      #so this will be included in the unowned list
+      $self->{envFileList}->{$thisFile} = 1;
+    }
+  };
+
+  my $cwd = cwd();
+  $cwd =~ s/:$/:\\/; # Needed because if at root, cwd() just returns drive_letter:
+  find($processFileSub, Utils::PrependEpocRoot('\\epoc32'));
+  chdir ($cwd);
+  if ($displayProgress and $self->{verbose}) {
+    print "\n";
+  }
+}
+
+sub CheckIgnoreDir {
+  my $self = shift;
+  my $dir = shift;
+  if (exists $self->{ignoreDirs}->{$dir}) {
+    return 1;
+  }
+  return 0;
+}
+
+# Classify the ignores according to whether they correspond to directories or files. This allows the
+# File::Find scan to prune directories to be ignored efficiently.
+sub InitIgnores {
+  my $self = shift;
+  my $ignoreStandardIgnores = shift;
+  my $ignoreList;
+  unless ($ignoreStandardIgnores) {
+    $ignoreList = $self->{iniData}->BinariesToIgnore();
+  }
+  push (@$ignoreList, '\\epoc32\\relinfo\\*'); # Need to always ignore \epoc32\relinfo since this contains the environment database.
+
+  foreach my $thisIgnore (@$ignoreList) {
+    if ($thisIgnore =~ /(.*)\\\*$/) {
+      my $dir = $1;
+      Utils::TidyFileName(\$dir);
+      $self->{ignoreDirs}->{lc(Utils::PrependEpocRoot($dir))} = 1;  # Store dirs in a hash so they can be looked up fast.
+    }
+    else {
+      push (@{$self->{ignoreFiles}}, Utils::PrependEpocRoot($thisIgnore));
+    }
+  }
+}
+
+sub CheckFileAgainstEnvScan {
+  my $self = shift;
+  my $file = lc(shift);
+  my $ok = 1;
+
+  if (exists $self->{envFileList}) {
+    if (exists $self->{envFileList}->{$file}) {
+      # Exists, so remove from envFileList hash - any file names left in here at the end will be reported to the user.
+      delete $self->{envFileList}->{$file};
+    }
+    else {
+      $ok = 0;
+    }
+  }
+  elsif (not -e $file) {
+    $ok = 0;
+  }
+  return $ok;
+}
+
+sub RemoveBinsToIgnore {
+  my $self = shift;
+  foreach my $thisIgnore (@{$self->{ignoreFiles}}) {
+    $thisIgnore =~ s/\\/\\\\/g;
+    $thisIgnore =~ s/\./\\\./g;
+    $thisIgnore =~ s/\*/\.\*/g;
+    foreach my $thisFile (keys %{$self->{envFileList}}) {
+      if ($thisFile =~ /$thisIgnore/i) {
+	delete $self->{envFileList}->{$thisFile};
+      }
+    }
+  }
+}
+
+sub UnaccountedEnvFiles {
+  my $self = shift;
+  my @unaccountedFiles = sort keys %{$self->{envFileList}};
+  return \@unaccountedFiles;
+}
+
+sub DeleteSignature {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  
+  if ($self->{verbose} > 1) { print "Deleting signature file for $comp $ver\n"; }
+  my $sigName = SignatureName($comp, $ver);
+  unlink ($sigName) or print "Warning: Couldn't delete $sigName: $!\n";
+}
+
+sub ExecuteAllSignatures {
+  my $sub = shift;
+
+  opendir(DIR, Utils::PrependEpocRoot("\\epoc32\\relinfo")) or die "Error: Couldn't open directory \"" . Utils::PrependEpocRoot("\\epoc32\\relinfo") . "\": $!\n";
+  while (defined(my $file = readdir(DIR))) {
+    if ($file =~ /\.sig$/) {
+      my $continue = ExecuteSignature(Utils::PrependEpocRoot("\\epoc32\\relinfo\\$file"), $sub);
+      unless ($continue) {
+	last;
+      }
+    }
+  }
+  closedir(DIR);
+}
+
+sub ExecuteSignature {
+# For each line in the signature file, parse and call the given subroutine with the parsed variables.
+
+  my $sigName = shift;
+  my $filessub = shift;
+  my $directoriesSub = shift;
+
+  my %directories;
+
+  my $continue = 1;
+  open (SIG, $sigName) or die "Couldn't open $sigName for reading: $!\n";
+  while (my $line = <SIG>) {
+    # Parse signature line.
+    (my $file, my $mTime, my $size) = split (/\t/, $line);
+    unless (defined $file and defined $mTime and defined $size) {
+      die "Error: Invalid line in signature file $sigName\n";
+    }
+    $directories{dirname($file)} = 1;
+    # Call subroutine.
+    $continue = &$filessub(Utils::PrependEpocRoot($file), $mTime, $size, $sigName);
+    unless ($continue) {
+      last;
+    }
+  }
+  close (SIG);
+
+  if ($directoriesSub) {
+    foreach my $directory (sort keys %directories) {
+      &$directoriesSub(Utils::PrependEpocRoot($directory), $sigName);
+    }
+  }
+
+  return $continue;
+}
+
+sub DeleteFilesInSignature {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $sigName = SignatureName($comp, $ver);
+  my $filesDeletionSub = sub {
+    my $file = shift;
+    if (-e $file) {
+      if ($self->{verbose} > 1) { print "Deleting \"$file\"...\n"; }
+      unlink ($file) or die "Error: Couldn't delete \"$file\": $!\n";
+    }
+    return 1;
+  };
+  my $directoriesDeletionSub = sub {
+    my $directory = shift;
+
+    if (-e $directory && !scalar @{Utils::ReadDir($directory)} ) {
+      print "Removing directory $directory...\n" if ($self->{verbose});
+      rmdir $directory or die "Error: Could not remove directory $directory: $!\n";
+      while (($directory = dirname($directory)) && -e $directory && !scalar @{Utils::ReadDir($directory)}) {
+        print "Removing directory $directory...\n" if ($self->{verbose});
+        rmdir $directory or die "Error: Could not remove directory $directory: $!\n";
+      }
+    }
+  };
+
+  ExecuteSignature($sigName, $filesDeletionSub, $directoriesDeletionSub);
+}
+
+sub InstallComponent {
+  my $self = shift;
+  my $comp = lc(shift);
+  my $ver = shift;
+  my $overwrite = shift;
+
+  my $relData = RelData->Open($self->{iniData}, $comp, $ver, $self->{verbose});
+  $relData->WarnIfReleaseTooNew();
+  $self->UnpackBinaries($comp, $ver, Utils::EpocRoot(), $overwrite);
+  $self->GenerateSignature($comp, $ver);
+  $self->SetVersion($comp, $ver);
+  $self->SetMrpName($comp, $relData->MrpName());
+  $self->SetInternalVersion($comp, $relData->InternalVersion());
+  $self->SetStatus($comp, STATUS_CLEAN);
+}
+
+sub UnpackBinaries {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $where = shift;
+  my $overwrite = (shift || $self->{overwrite});
+  foreach my $thisBinZip (@{$self->RelevantBinaryZips($comp, $ver)}) {
+    $overwrite = Utils::Unzip($thisBinZip, $where, $self->{verbose}, $overwrite);
+  }
+  
+  $self->{overwrite} = $overwrite;
+}
+
+sub RelevantBinaryZips {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  $self->PathData()->CheckReleaseExists($comp, $ver);
+
+  my $requiredBinaries = $self->{iniData}->RequiredBinaries($comp);
+  my $relDir = $self->PathData->LocalArchivePathForExistingOrNewComponent($comp, $ver);
+  my @relevantBinaries = ();
+  foreach my $thisRelFile (@{Utils::ReadDir($relDir)}) {
+    if ($thisRelFile eq 'binaries.zip') {
+      push (@relevantBinaries, "$relDir\\$thisRelFile");
+      next;
+    }
+    if ($thisRelFile =~ /^binaries_(.*)\.zip$/) {
+      my $category = $1;
+      if ($requiredBinaries) {
+	foreach my $requiredBinary (@$requiredBinaries) {
+	  if (($category =~ /^$requiredBinary\_/) || ($category eq $requiredBinary)) {
+	    push (@relevantBinaries, "$relDir\\$thisRelFile");
+	    last;
+	  }
+	}
+      }
+      else {
+	push (@relevantBinaries, "$relDir\\$thisRelFile");
+      }
+    }
+    elsif ($thisRelFile =~ /^exports[a-z].zip$/i) {
+      push (@relevantBinaries, "$relDir\\$thisRelFile");
+    }
+  }
+  return \@relevantBinaries;
+}
+
+sub UnpackSource {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $where = shift;
+  my $overwrite = shift;
+  my $skipinstall = 0;
+  unless (defined $overwrite) {
+    $overwrite = 0;
+  }
+  my $showProgress = shift;
+  unless (defined $showProgress) {
+    $showProgress = 0;
+  }
+  my $toValidate = shift;
+  unless (defined $toValidate) {
+    $toValidate = 0;
+  }
+
+  my $changeInCat = 0;
+
+  $self->PathData()->CheckReleaseExists($comp, $ver);
+
+  if ($where eq "\\") {
+    $where = Utils::SourceRoot();
+  }
+
+  # Unpack all categories of source code that are available.
+  my $relDir = $self->PathData->LocalArchivePathForExistingOrNewComponent($comp, $ver);
+
+  opendir(RELDIR, $relDir) or die "Error: can't opendir $relDir\n";
+  my @srcZipNames = grep {/source[a-z]\.zip/i} map {"$relDir\\$_"} readdir(RELDIR);
+  close RELDIR;
+
+  if ($self->{verbose} and scalar(@srcZipNames) == 0) {
+    print "No source available for $comp $ver\n";
+  }
+  else {
+    unless ($overwrite) {
+      my $checkFailed = 0;
+      foreach my $thisSrcZip (@srcZipNames) {
+        if (Utils::CheckZipFileContentsNotPresent($thisSrcZip, $where, $self->{iniData})) {
+          $checkFailed = 1;
+        }
+      }
+      if ($checkFailed) {
+        warn "Warning: Above errors found, skipping the unpacking of $comp zips...\n";
+        $skipinstall = 1;
+      }
+    }
+
+    unless($skipinstall){
+      foreach my $thisSrcZip (@srcZipNames) {
+        if ($showProgress) {
+          my $significantDir = Utils::SignificantZipDir($thisSrcZip);
+          my $unzipDir  = Utils::ConcatenateDirNames($where, $significantDir);
+
+          if($self->{iniData}->HasMappings()){
+            $unzipDir = $self->{iniData}->PerformMapOnFileName($unzipDir);
+          }
+
+          print "\tUnpacking \"$thisSrcZip\" into \"$unzipDir\"...\n";
+        }
+
+        $changeInCat = Utils::UnzipSource($thisSrcZip, $where, $self->{verbose}, $overwrite, $self->{iniData}, $toValidate, $comp);
+        if($changeInCat==1 && $toValidate ==1) {
+          last;
+	}
+      }
+    }
+  }
+
+  return $changeInCat; # 1 = change in cat found, 0 = change in cat not found. Return value only used for validation.
+}
+
+sub SignatureName {
+  my $comp = shift;
+  my $ver = shift;
+  croak unless defined $ver;
+  return Utils::PrependEpocRoot("\\epoc32\\relinfo\\$comp.$ver.sig");
+}
+
+sub DecodeSignatureName {
+  my $self = shift;
+  my $sigName = shift;
+  my $comp;
+  my $ver;
+  my $name = $sigName;
+  $name =~ s/.*\\epoc32\\relinfo\\(.*)\.sig/$1/;
+  foreach my $thisComp (keys %{$self->{db}}) {
+    my $thisVer = $self->{db}->{$thisComp}->{ver};
+    if ("$thisComp.$thisVer" eq $name) {
+      $comp = $thisComp;
+      $ver = $thisVer;
+    }
+  }
+
+  unless (defined $comp and defined $ver) {
+    die "Error: Couldn't decode signature name \"$sigName\"\n";
+  }
+
+  return ($comp, $ver);
+}
+
+sub ComponentDir {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub ReleaseDir {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub PathData {
+  my $self = shift;
+  return $self->{iniData}->PathData();
+}
+
+sub CheckForAddedFiles {
+  my $self = shift;
+  my $reldata = shift;
+  my $tempdir = shift;
+
+  # Here we have been asked to search for files that exist in the real source directory,
+  # but don't exist in the temporary source directory.
+
+  my $foundextra = 0; # let's hope this stays zero
+  foreach my $item (keys %{$reldata->SourceItems}) {
+    $item = Utils::PrependSourceRoot($item);
+    next unless -d $item; # we're only checking for added files, so we don't care unless this
+                          # is a directory in which there ought to be files.
+
+    print "Looking for added files inside \"$item\"\n" if ($self->{verbose});
+    # Ah, the lovely Find::File
+    find(sub {
+      my $tempfile = Utils::ConcatenateDirNames($tempdir, Utils::RemoveSourceRoot($File::Find::name));
+      # Be careful with that line - an extra \\ anywhere and it breaks, such is DOS...
+
+      print "Checking existence of \"$tempfile\"\n" if ($self->{verbose}>1);
+      unless (-e $tempfile) {
+        print "\"$File::Find::name\" only exists in new source code.\n" if ($self->{verbose});
+        $foundextra++;
+        $File::Find::prune = 1 unless ($self->{verbose}); # skip some of the rest
+      }
+    }, $item);
+
+    return $foundextra if ($foundextra && !$self->{verbose});
+        # don't bother scanning other directories unless it's verbose
+  }
+    return $foundextra;
+}
+
+sub GetReleaseSize {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  $self->{relsize}->{$comp}->{$ver} = $self->AddUpReleaseSize($comp, $ver) unless defined $self->{relsize}->{$comp}->{$ver};
+  return $self->{relsize}->{$comp}->{$ver};
+}
+
+sub AddUpReleaseSize {
+  my $self = shift;
+  my $comp = shift;
+  my $version = shift;
+  my $pathdata = $self->{iniData}->PathData();
+  my $path = $pathdata->LocalArchivePathForExistingComponent($comp, $version);
+  die "Component $comp $version didn't exist\n" unless $path;
+  opendir(DIR, $path) or die "Couldn't open directory \"$path\" because $!";
+  my @entries = grep { ! m/^\./ } readdir(DIR);
+  closedir DIR;
+  my $size = 0;
+  print "Adding up size of $comp $version\n" if ($self->{verbose});
+  foreach my $file (@entries) {
+    my $full = $path . "\\" . $file;
+    $size += -s $full;
+  }
+  return $size;
+}
+
+sub GetEnvironmentSize {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $deltasize = shift;
+  $self->{envsize}->{$comp}->{$ver} = $self->AddUpEnvSize($comp, $ver, $deltasize) if (!exists $self->{envsize}->{$comp}->{$ver});
+  return $self->{envsize}->{$comp}->{$ver};
+}
+
+sub AddUpEnvSize {
+  my $self = shift;
+  my $maincomp = shift;
+  my $mainver = shift;
+  my $deltasize = shift;
+  my $relData = RelData->Open($self->{iniData}, $maincomp, $mainver, $self->{verbose});
+  die "Component $maincomp version $mainver didn't exist\n" unless $relData;
+  my $compsToValidate = $relData->Environment();
+  my $size = 0;
+  while ((my $comp, my $ver) = each %$compsToValidate) {
+    # If a delta size is requested and the component version does not
+    # match the main component version then don't increment the size
+    next if ($deltasize && ($mainver ne $ver));
+    
+    $size += $self->GetReleaseSize($comp, $ver);
+  }
+  return $size;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+EnvDb.pm - A database to keep track of component versions installed on a development drive.
+
+=head1 DESCRIPTION
+
+The database is implemented as a tied hash. It provides a persistent store of component / version pairs. Also provides facilities for checking and validating the contents of an environemnt.
+
+Each component has a status associated with it. The possible values are as follows:
+
+=over 4
+
+=item C<STATUS_CLEAN>: the binaries on disk match those in the release packet
+
+=item C<STATUS_DIRTY>: the binaries on disk don't appear to match those in the release packet
+
+=item C<STATUS_DIRTY_SOURCE>: the binaries match, but the source code doesn't
+
+=item C<STATUS_PENDING_RELEASE>: the component has been set to 'pending release'
+
+=back
+
+=head1 INTERFACE
+
+=head2 Object Management
+
+=head3 Open
+
+Expects to be passed an C<IniData> reference and a verbosity level. Opens the C<EnvDb> on the current drive. If not already present, an empty databse is created. This must be done before any of the following interfaces are used.
+
+=head3 Close
+
+Closes the database file.
+
+=head2 Data Management
+
+=head3 Version
+
+Expects to be passed a component name. Returns the version of the component that is currently installed. Returns undef if there is no version currently installed.
+
+=head3 VersionInfo
+
+Returns a reference to an in memory hash containing component component name / version pairs for every entry in the database.
+
+=head3 SetVersion
+
+Expects to be passed a component name and a optionally a version. If the version is specified, a database entry for the component is created, or, if it is already present, updated. If the version is not specified, and a database entry for the component entry exists, it is deleted.
+
+=head3 InternalVersion
+
+Expects to be passed a component name. Returns the internal version of the component that is currently installed. Returns undef if the component is not currently installed.
+
+=head3 SetInternalVersion
+
+Expects to be passed a component name and an internal version. Dies if an entry for the component is not already present in the database. Store the component's internal version.
+
+=head3 Status
+
+Expects to be passed a component name. Dies if an entry for the component is not already present in the database. Returns the component's last recorded status (which may be C<STATUS_CLEAN>, C<STATUS_DIRTY> or C<STATUS_PENDING_RELEASE>).
+
+=head3 SetStatus
+
+Expects to be passed a component name and a status integer. Dies if an entry for the component is not already present in the database. Updates the component's database entry with the new status.
+
+=head3 MrpName
+
+Expects to be passed a component name. Dies if an entry for the component is not already present in the database. Returns the corresponding F<mrp> name.
+
+=head3 SetMrpName
+
+Expects to be passed a component name and an F<mrp> name. Dies if an entry for the component is not already present in the database. Stores of the F<mrp> name of the component.
+
+=head3 ComponentsPendingRelease
+
+Returns a reference to a hash of hash references. The primary hash key is component name. The secondary hashes each containing details a component that is pending release. The secondary hashes contain the following keys:
+
+ mrpName
+ ver
+ intVer
+
+=head3 BinaryInfo
+
+Expects to be passed the name of a binary file. Searches for this file name within the component signatures. If it is not found there, then checks for components that are pending release. C<MrpData> objects are then created for each of these to see if the binary file is about to be released. Dies if the file is still not found. Otherwise, returns a two dimentional array containing the component name, verion and current file status.
+
+=head3 ListBins
+
+Expects to be passed a component name. Returns a 2D array containing all the file names owned by component and their current status. These facts will be in the first and second column; subsequent columns may hold further information. The table contains a header row describing what each column is.
+
+=head2 Environment Scans
+
+=head3 CheckEnv
+
+Performs a scan of the F<\epoc32> tree building a hash of all file names. Calls C<CheckComp> for all the components installed on the drive. C<CheckComp> will remove files that pass the check from the F<\epoc32> tree hash. Any file names left in the hash after all components have been checked will be printed to warn the user, since their origin is unknown to the release tools. The F<reltools.ini> keyword C<ignore_binary> my be used to specify (using file names with DOS style wild characters) binary files to be ignored in the checking process. As standard, the following are ignored:
+
+ \epoc32\relinfo\*
+ \epoc32\build\*
+ \epoc32\wins\c\*
+ \epoc32\release\*.ilk
+ \epoc32\release\*.bsc
+ \epoc32\data\emulator\epoc.sys.ini
+
+Returns the overall status of the environement after the check (which may be of value C<STATUS_CLEAN>, C<STATUS_DIRTY> or C<STATUS_PENDING_RELEASE>), a reference to a list of C<MrpData> objects that are pending release, a reference to a list of component that failed their check, and a reference to a list of unaccounted files.
+
+=head3 CheckComp
+
+Expects to be passed a component name and optionally a scalar flag indicating if the check should continue after the first failure is found (true means continue). Details of any files that fail their check will be printed. Returns the status of the component after the check (which may be of value C<STATUS_CLEAN>, C<STATUS_DIRTY>, C<STATUS_DIRTY_SOURCE> or C<STATUS_PENDING_RELEASE>), and a reference to an C<MrpData> object if the status is C<STATUS_PENDING_RELEASE>.
+
+CheckComp does not check the source code files. In fact, if it determines the binaries match, then it returns either C<STATUS_CLEAN> or C<STATUS_DIRTY_SOURCE> depending on what the environment database says. A component will only ever attain the status of C<STATUS_DIRTY_SOURCE> through the operation of ValidateComp: effectively CheckComp just passes that information through, if the component otherwise appears clean.
+
+=head3 ValidateEnv
+
+Calls C<ValidateComp> for all the components installed on the drive that don't have a status of I<pending release>. Returns a reference to a list of components names that failed. May optionally be passed a component name and version of an external environment against which to validate. This mode may only be used when the current environment database is empty. It causes a complete set of database entries to be written corresponding to the external environment. However, a dummy signature file will be generated for components that fail their validation which contains the names of the binaries released in the external environment, but zero last modified times and sizes. This is to ensure that C<CheckEnv> continues to report these components as C<STATUS_DIRTY>.
+
+=head3 ValidateComp
+
+Expects to be passed a component name, a version and optionally two scalar flags indicating:
+
+=over 4
+
+=item whether validation should continue after the first failure is found (true means continue)
+
+=item whether source code should be validated
+
+=back
+
+Makes use of Manifest.pm and constructs manifest object of the current environment using the mrp file for the components and another manifest object using the manifest file available in the archive location of the previous release for the component. These objects are compared for their similarity and shall return STATUS_CLEAN if everything validates OK and returns STATUS_DIRTY otherwise.
+
+If for some reasons, validation through manifest objects is not possible, then the call is transferred to the old process of validation described herewith as follows:
+
+The process returns the overall status of the release, which is C<STATUS_DIRTY> if there are dirty binaries, C<STATUS_DIRTY_SOURCE> if the binaries are clean but there is dirty source code, or C<CLEAN> if everything validates OK. C<STATUS_DIRTY_SOURCE> will only ever be set if source code validation is turned on; otherwise all components will be set to either C<CLEAN> or C<DIRTY>.
+
+If the validation passes, but there is currently no entry for the release in the database, an entry is created with details corresponding to the version being validated. Whether or not an entry previously existed, if the validation passes, the component's status is set to C<STATUS_CLEAN> and a signature file is generated. If the validation failed and there is already an entry in the database for the component, it's status is set to C<STATUS_DIRTY> or C<STATUS_DIRTY_SOURCE> as appropriate.
+
+If the overall process results in validating the component status as DIRTY, then the manifest information for the current environment will be generated and saved as a manifest file in a temporary location within local file system for use during release processes.
+
+=head2 Environment Management
+
+=head3 InstallComponent
+
+Expects to be passed a component name, and a version. Unpacks the component's binaries, and creates (or updates) a complete database entry from the provided version and information read out of the release's C<RelData> object.
+
+=head3 RemoveComponent
+
+Expects to be passed a component name. Removes all the binary files associated with the installed version of the component, the component's signature file and the component's environment database record.
+
+=head3 DeleteSource
+
+Expects to be passed a component name, a dryrun and a force flag. Removes all the source files associated with the installed version of the component. If dryrun is used the script just reports what it would do. If force is used the script would delete write-protected files.
+
+=head3 UnpackBinaries
+
+Expects to be passed a component name, a version and a directory in which the release should be installed. Unpacks the component's binaries into the specified directory. The environment database is neither consulted, nor modified by this interface. It is intended to allow a set of released binaries to be temporarily unpacked (for example, for validation purposes)
+
+=head3 UnpackSource
+
+Expects to be passed a component name, a version, a directory in which the release should be installed, a flag which represents the verbose level, a flag which represents to overwrite or not, an inidata and a flag which represent whether this process is for validation or not. Unpacks the component's source into the specified directory. The environment database is neither consulted, nor modified by this interface. Returns a change in category flag, when flag is 1 a change in category has been found. Change in category flag is only uses when a validation occurs.
+
+=head3 GetReleaseSize
+
+Takes a component name and a version number. Returns the total size (in bytes) of the zips in the local archive making up a release.
+
+=head3 GetEnvironmentSize
+
+Takes a component name and a version number. Returns the total size (in bytes) of the zips in the local archive making up the environment.
+
+=head2 Notable private methods
+
+=head3 EvalidateDirectories
+
+Expects to be passed two directory names; it will then run C<EValid> over the two. Returns a Boolean (whether the two directories match), and prints the results according to the verbosity level. If the verbosity level is 1 or greater, details of failures are printed. If the verbosity level is greater than 1, all C<EValid> output is printed.
+
+=head3 CheckForAddedFiles
+
+This method checks to see if any files have been added to a component since it was packetised. It's part of source validation. It uses C<Find::File> to list all the files that are in a component's source code directory, then checks each of them are in a temporary directory which has been unzipped from the release packet.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvDifferencer.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,386 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package EnvDifferencer;
+
+use strict;
+use RelData;
+
+sub New {
+  my $class = shift;
+  my $self = bless {}, (ref $class || $class);
+  $self->{iniData} = shift;
+  $self->{verbose} = shift;
+  $self->{startcomp} = undef;
+  $self->{endcomp} = undef;
+  $self->{startver} = undef;
+  $self->{endver} = undef;
+  $self->{reldatacache} = {}; # keyed by concatenated of comp and ver
+  $self->{results} = undef;
+  if ($self->{verbose}) {
+    require Data::Dumper ;
+    Data::Dumper->import();
+  }
+  return $self;
+}
+
+sub SetStartCompVer {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  $self->Reset();
+  $self->{startcomp} = $comp;
+  $self->{startver} = $ver;
+}
+
+sub SetEndCompVer {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  $self->Reset();
+  $self->{endcomp} = $comp;
+  $self->{endver} = $ver;
+}
+
+sub Reset {
+  my $self = shift;
+  $self->{results} = undef;
+}
+
+# Accessor methods
+
+sub StartEnvReldata {
+  my $self = shift;
+  die "Start component not defined" unless $self->{startcomp};
+  die "Start version not defined" unless $self->{startver};
+  return $self->RelData($self->{startcomp}, $self->{startver});
+}
+
+sub EndEnvReldata {
+  my $self = shift;
+  die "End component not defined" unless $self->{endcomp};
+  die "End version not defined" unless $self->{endver};
+  return $self->RelData($self->{endcomp}, $self->{endver});
+}
+
+sub StartReldata {
+  my $self = shift;
+  my $comp = shift;
+  return $self->RelData($comp, $self->StartVersion($comp));
+}
+
+sub EndReldata {
+  my $self = shift;
+  my $comp = shift;
+  return $self->RelData($comp, $self->EndVersion($comp));
+}
+
+sub StartVersion {
+  my $self = shift;
+  my $comp = shift;
+  return $self->GetStartEnv()->{$comp};
+}
+
+sub EndVersion {
+  my $self = shift;
+  my $comp = shift;
+  return $self->GetEndEnv()->{$comp};
+}
+
+sub ChangedComps {
+  my $self = shift;
+  $self->DoDiff;
+  return $self->{results}->{diff}->{changed};
+}
+
+sub NewerComps {
+  my $self = shift;
+  $self->CompareDiffDates;
+  return $self->{results}->{diffdates}->{newer};
+}
+
+sub OlderComps {
+  my $self = shift;
+  $self->CompareDiffDates;
+  return $self->{results}->{diffdates}->{older};
+}
+
+sub UnchangedComps {
+  my $self = shift;
+  $self->DoDiff;
+  return $self->{results}->{diff}->{same};
+}
+
+sub OnlyStart {
+  my $self = shift;
+  $self->DoDiff;
+  return $self->{results}->{diff}->{onlystart};
+}
+
+sub OnlyEnd {
+  my $self = shift;
+  $self->DoDiff;
+  return $self->{results}->{diff}->{onlyend};
+}
+
+sub IntermediateReldatas {
+  my $self = shift;
+  my $comp = shift;
+  my $relDataObjects = RelData->OpenSet($self->{iniData}, $comp, $self->{verbose});
+
+  my $startdate = $self->StartReldata($comp)->ReleaseTime();
+  my $enddate = $self->EndReldata($comp)->ReleaseTime();
+
+  # Specifically exclude the start and end reldatas... i.e use < > not <= >=
+  my @results = grep { $_->ReleaseTime() < $enddate and $_->ReleaseTime() > $startdate } @$relDataObjects;
+  return \@results;
+}
+
+sub GetStartEnv {
+  my $self = shift;
+  unless ($self->{results}->{startenv}) {
+    if ($self->{startcomp}) {
+      $self->{results}->{startenv} = $self->StartEnvReldata()->Environment();
+    } else {
+      $self->{results}->{startenv} = $self->CurrentEnv;
+    }
+  }
+  return $self->{results}->{startenv};
+}
+
+sub GetEndEnv {
+  my $self = shift;
+  unless ($self->{results}->{endenv}) {
+    if ($self->{endcomp}) {
+      $self->{results}->{endenv} = $self->EndEnvReldata()->Environment();
+    } else {
+      $self->{results}->{endenv} = $self->CurrentEnv;
+    }
+  }
+  return $self->{results}->{endenv};
+}
+
+### Private
+
+sub CurrentEnv {
+  my $self = shift;
+  my $envDb = EnvDb->Open($self->{iniData}, $self->{verbose});
+  return $envDb->VersionInfo();
+}
+
+sub DoDiff {
+  my $self = shift;
+
+  return if $self->{results}->{diff};
+
+  die "Neither environment was specified.\n" unless ($self->{startcomp} || $self->{endcomp});
+
+  my %env1 = %{$self->GetStartEnv()};
+  my %env2 = %{$self->GetEndEnv()};
+  # Deliberately make copies, as we will be deleting stuff from them
+  
+  if ($self->{verbose}>1) {
+    print "Start environment is ".Dumper(\%env1)."\n";
+    print "End environment is ".Dumper(\%env2)."\n";
+  }
+
+  my @changed;
+  my @onlynew;
+  my @onlyold;
+  my @same;
+
+  # Compare $env1 against $env2 first.
+  foreach my $thisComp (keys %env1) {
+    my $ver1 = $env1{$thisComp};
+    my $ver2 = $env2{$thisComp};
+    if (not defined $ver2) {
+      push @onlyold, $thisComp;
+    }
+    elsif (lc($ver1) eq lc($ver2)) {
+      push @same, $thisComp;
+    }
+    else {
+      push @changed, $thisComp;
+    }
+
+    if (defined $ver2) {
+      # Remove this component from $env2 because it has been accounted for.
+      # Components left over in the $env2 hash are those not present in $env1.
+      delete $env2{$thisComp};
+    }
+  }
+
+  # List the components in $env2 but not in $env1.
+  @onlynew = keys %env2;
+
+  $self->{results}->{diff} = {
+    same => \@same,
+    onlyend => \@onlynew,
+    onlystart => \@onlyold,
+    changed => \@changed
+  };
+
+  print "At end of main comparison... with results ".Dumper($self->{results}->{diff})."\n" if $self->{verbose}>1;
+}
+
+sub CompareDiffDates {
+  my $self = shift;
+  return if $self->{results}->{diffdates};
+  $self->DoDiff; # returns if already completed
+
+  my @older;
+  my @newer;
+  foreach my $thisComp (@{$self->{results}->{diff}->{changed}}) {
+    my $relData1 = $self->StartReldata($thisComp);
+    my $relData2 = $self->EndReldata($thisComp);
+    if ($relData1->ReleaseTime() <= $relData2->ReleaseTime()) {
+      push @newer, $thisComp;
+    } else {
+      push @older, $thisComp;
+    }
+  }
+
+  $self->{results}->{diffdates} = {
+    older => \@older,
+    newer => \@newer
+  };
+  print "At end of date comparison... with results ".Dumper($self->{results}->{diffdates})."\n" if $self->{verbose}>1;
+}
+
+sub RelData {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  print "Asked for reldata for $comp $ver\n" if $self->{verbose}>2;
+
+  die "Can't get reldata for undefined comp" unless $comp;
+  die "Can't get reldata for undefined version of $comp" unless $ver;
+
+  my $key = "$comp$ver";
+  unless ($self->{reldatacache}->{$key}) {
+    $self->{reldatacache}->{$key} = RelData->Open
+      ($self->{iniData}, $comp, $ver, $self->{verbose});
+  }
+  return $self->{reldatacache}->{$key};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+EnvDifferencer.pm - A class to find differences between two environments.
+
+=head1 DESCRIPTION
+
+This class is used by C<DiffEnv> and C<ViewNotes> to examine the differences between two environments. To use it, first create an object, then use the C<SetStartCompVer> and C<SetEndCompVer> methods to set the component name and version that you wish to compare. You can then use any of the other methods to access information about the differences between them.
+
+=head1 INTERFACE
+
+=head2 Necessary calls
+
+=head3 New
+
+Expects to be passed two arguments; firstly, an C<IniData> object, and secondly, a verbosity level.
+
+=head3 SetStartCompVer
+
+=head3 SetEndCompVer
+
+These two methods are each passed a component name a version number. These two environments are used for differencing. Note that no differencing is actually performed until information is requested by one of the accessor methods. These methods also call C<Reset>, which means that all results are deleted and a new diff will be performed whenever information is requested.
+
+If one of these is not called before the comparison, then the current environment (as returned by a C<EnvDb> object) will be used for the missing environment.
+
+=head3 Reset
+
+This method should never be needed. It resets the object so that it performs a new diff the next time some information is requested.
+
+=head2 Accessor Methods
+
+Any of these may trigger a differencing to happen.
+
+=head3 StartReldata
+
+=head3 EndReldata
+
+Takes a component name. Returns a C<RelData> object corresponding to that component in the start or the end environment.
+
+=head3 StartVersion
+
+=head3 EndVersion
+
+Given a component name, returns the version number of that component in the start or the end environment. The behaviour is undefined if that component doesn't exist in the given environment.
+
+=head3 GetStartEnv
+
+=head3 GetEndEnv
+
+Returns a hashref of the components and version numbers in each environment.
+
+=head3 StartEnvReldata
+
+=head3 EndEnvReldata
+
+Returns the C<RelData> object corresponding to the environment itself.
+
+=head3 ChangedComps
+
+Returns a list of component names in both environments, but with different version numbers.
+
+=head3 UnchangedComps
+
+Returns a similar list of those components which are identical in both environments.
+
+=head3 OnlyStart
+
+=head3 OnlyEnd
+
+Return lists of those components only in one or other environment.
+
+=head3 NewerComps
+
+=head3 OlderComps
+
+These two methods trigger some additional differencing, which compares the dates of each changed component. They then return a list of those components which are newer, or older, in the end environment.
+
+=head3 IntermediateReldatas
+
+Given a component name, this returns a list of C<RelData> objects belonging to releases of that component made between the start and end release. It specifically does not include the start or end release.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvInfo	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,335 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $full = 0;
+my $component;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'EnvInfo');
+my $envDb;
+my $overallStatus;
+my $displayClean = 0;
+my $displayDirty = 0;
+my $displayPendingRelease = 0;
+my $noScan = 0;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+CheckEnv();
+DisplayInfo();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "f+" => \$full, "c" => \$displayClean, "d" => \$displayDirty, "p" => \$displayPendingRelease, "n" => \$noScan, "v+" => \$verbose);
+  if ($help) {
+    Usage(0);
+  }
+
+  if (not $full and ($displayClean or $displayDirty or $displayPendingRelease)) {
+    print "Warning: Inappropriate option(s), must be invoked together with -f\n";
+  }
+
+  if (not $displayClean and not $displayDirty and not $displayPendingRelease) {
+    $displayClean = 1;
+    $displayDirty = 1;
+    $displayPendingRelease = 1;
+  }
+
+  $component = $ARGV[0];
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: envinfo [options] [<component>]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-f  display fuller information (the remaining switches only apply when this is used)
+-ff display even fuller information (internal version and mrp name)
+-c  display the components with status \"clean\"
+-d  display the components with status \"dirty\"
+-p  display the components with status \"pending release\"
+-n  no scan\n");
+}
+
+sub CheckEnv {
+  unless ($noScan or not $full) {
+    if (defined $component) {
+      $envDb->CheckComp($component, undef, 1);
+    }
+    else {
+      ($overallStatus, undef, undef, my $unaccountedFiles, my $duplicates) = $envDb->CheckEnv(1, 0, 1);
+      if (scalar (@$unaccountedFiles) > 0) {
+	foreach my $line (@$unaccountedFiles) {
+	  print "Warning: $line has unknown origin\n"; 
+	}
+      }
+      if (scalar (@$duplicates) > 0) {
+	foreach my $args (@$duplicates) {
+	  print "Warning: $args->[1] attempting to release $args->[0] which has already been released by $args->[2]\n"; 
+	}
+      }
+    }
+  }
+}
+
+sub DisplayInfo {
+  # Create a list of the components to be displayed.
+  my @comps;
+  if (defined $component) {
+    my $ver = $envDb->Version($component);
+    unless (defined $ver) {
+      die "Error: $component not found\n";
+    }
+    push @comps, $component;
+  }
+  else {
+    my $versionInfo = $envDb->VersionInfo();
+    foreach my $comp (sort keys %{$versionInfo}) {
+      push @comps, $comp;
+    }
+  }
+
+  my $tableData;
+  if ($full == 1) {
+    $tableData = GenFullInfoTable(\@comps);
+  }
+  elsif ($full > 1) {
+    $tableData = GenEvenFullerInfoTable(\@comps);
+  }
+  else {
+    $tableData = GenMinimalInfoTable(\@comps);
+  }
+
+  # Only print the table if there's something in it.
+  if (scalar(@$tableData) > 1) {
+    print "\n";
+    $iniData->TableFormatter->PrintTable($tableData, 1);
+  }
+
+  # Only display the overall status if a full check was done.
+  if (defined $overallStatus) {
+    print "\nOverall status: ", EnvDb::StatusString($overallStatus), "\n";
+  }
+}
+
+sub GenMinimalInfoTable {
+  my $comps = shift;
+
+  # Create a two dimentional array of the data to be printed.
+  my $tableData = [["Component", "Version"]];
+  my $row = 1;
+  foreach my $comp (@$comps) {
+    my $ver = $envDb->Version($comp);
+    $tableData->[$row++] = [$comp, $ver];
+  }
+  return $tableData;
+}
+
+sub GenFullInfoTable {
+  my $comps = shift;
+
+  # Create a two dimentional array of the data to be printed.
+  my $tableData = [["Component", "Version", "Project", "Status"]];
+  my $row = 1;
+  foreach my $comp (@$comps) {
+    my $ver = $envDb->Version($comp);
+    my $status = $envDb->Status($comp);
+    if (not $displayClean and $status == EnvDb::STATUS_CLEAN) {
+      next;
+    }
+    elsif (not $displayDirty and ($status == EnvDb::STATUS_DIRTY or $status == EnvDb::STATUS_DIRTY_SOURCE)) {
+      next;
+    }
+    elsif (not $displayPendingRelease and $status == EnvDb::STATUS_PENDING_RELEASE) {
+      next;
+    }
+    my $project = $iniData->PathData->ComponentProject($comp, $ver);
+    unless (defined $project) {
+      $project = "-";
+    }
+    $tableData->[$row++] = [$comp, $ver, $project, EnvDb::StatusString($status)];
+  }
+  return $tableData;
+}
+
+sub GenEvenFullerInfoTable {
+  my $comps = shift;
+
+  # Create a two dimentional array of the data to be printed.
+  my $tableData = [["Component", "Version", "Internal version", "Project",  "Status", "Mrp"]];
+  my $row = 1;
+  foreach my $comp (@$comps) {
+    my $ver = $envDb->Version($comp);
+    my $status = $envDb->Status($comp);
+    if (not $displayClean and $status == EnvDb::STATUS_CLEAN) {
+      next;
+    }
+    elsif (not $displayDirty and ($status == EnvDb::STATUS_DIRTY or $status == EnvDb::STATUS_DIRTY_SOURCE)) {
+      next;
+    }
+    elsif (not $displayPendingRelease and $status == EnvDb::STATUS_PENDING_RELEASE) {
+      next;
+    }
+
+    my $mrpName = $envDb->MrpName($comp);
+    unless (defined $mrpName) {
+      $mrpName = "-";
+    }
+    my $intVer = $envDb->InternalVersion($comp);
+    unless (defined $intVer) {
+      $intVer = "-";
+    }
+    my $project = $iniData->PathData->ComponentProject($comp, $ver);
+    unless (defined $project) {
+      $project= "-";
+    }
+    $tableData->[$row++] = [$comp, $ver, $intVer, $project, EnvDb::StatusString($status), $mrpName];
+  }
+  return $tableData;
+}
+
+
+=head1 NAME
+
+EnvInfo - Displays information about the installed components in the current environment.
+
+=head1 SYNOPSIS
+
+  envinfo [options] [<component>]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -f  display fuller information (the remaining switches only apply when this is used)
+  -ff display even fuller information (internal version and mrp name)
+  -c  display the components with status "clean"
+  -d  display the components with status "dirty"
+  -p  display the components with status "pending release"
+  -n  no scan
+
+=head1 DESCRIPTION
+
+By default displays a brief summary table of the information contained in the current drive's environment database. For example:
+
+ Component   Version
+
+ mycomp1     026
+ mycomp2     057
+
+If envoked with the C<-f> switch, a scan is performed of the F<\epoc32> tree and the status of each component is also reported:
+
+ Component   Version   Status
+
+ mycomp1     026       clean
+ mycomp2     057       clean
+
+ Overall status: clean
+
+The C<Status> field may have the following values:
+
+=over 4
+
+=item *
+
+B<clean> - The component's binaries all match the time stamp information that was stored when they were installed (or when they were last validated using either C<ValidateRel> or C<ValidateEnv>).
+
+=item *
+
+B<dirty> - One or more of the component's binaries doesn't match the time stamp information that was stored when they were installed. This may be because the source has been re-built but not changed (see the commands C<ValidateRel> and C<ValidateEnv> for details of how to check if a re-built set of binaries are identical to an already released set), or because changes have been made.
+
+=item *
+
+B<pending release> - The component is waiting to be released (see the commands C<PrepEnv> and C<MakeEnv> for details of how to make releases).
+
+=back
+
+The overall status of the environment is displayed last. This may have the following values:
+
+=over 4
+
+=item *
+
+B<clean> - All the installed components have a status of C<clean> and there are no files in the F<\epoc32> tree that have unkown origins (i.e. they are all known to belong to a component).
+
+=item *
+
+B<dirty> - One or more of the installed components has a status of C<dirty>, or there is one or more files in the F<\epoc32> tree that has unknown origins.
+
+=item *
+
+B<pending release> - All components have a status of either C<clean> or C<pending release> and there are no files in the F<\epoc32> with unknown origins. This status indicates that C<MakeEnv> may be used to release this environment.
+
+=back
+
+
+By default when C<EnvInfo> is envoked with the C<-f> switch, it will perform a scan of the F<\epoc32> tree checking all the time stamps. To avoid this processing, use the C<-n> switch also. This will cause the status of each component when the last scan was performed to be displayed (which may now be out of date). The output of C<EnvInfo> can be filtered according to status using the switches C<-c>, C<-d> and C<-p>. For example, if you wanted to view all the components that are either C<dirty> or C<pending release>, type:
+
+  envinfo -fdp
+
+If envoked with a C<component> argument, then only the details of the specified component will be displayed and a scan of the F<\epoc32> tree will not be performed.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvInfo.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvInfoTk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,326 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Tk; 
+use Tk::Table; 
+use Getopt::Long;
+use IniData;
+use EnvDb;
+
+
+#
+# Constants.
+#
+
+my $margin = 2;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $full = 0;
+my $component;
+my $iniData = IniData->New();
+my $envDb;
+my $overallStatus;
+my $displayClean = 0;
+my $displayDirty = 0;
+my $displayPendingRelease = 0;
+my $noScan = 0;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+CheckEnv();
+DisplayInfo();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "f" => \$full, "c" => \$displayClean, "d" => \$displayDirty, "p" => \$displayPendingRelease, "n" => \$noScan, "v+" => \$verbose);
+  if ($help) {
+    Usage(0);
+  }
+
+  if (not $full and ($displayClean or $displayDirty or $displayPendingRelease)) {
+    print "Warning: Inappropriate option(s)\n";
+  }
+
+  if (not $displayClean and not $displayDirty and not $displayPendingRelease) {
+    $displayClean = 1;
+    $displayDirty = 1;
+    $displayPendingRelease = 1;
+  }
+
+  $component = $ARGV[0];
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: envinfo [options] [<component>]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-f  display full information (the remaining switches only apply when this is used)
+-c  display the components with status \"clean\"
+-d  display the components with status \"dirty\"
+-p  display the components with status \"pending release\"
+-n  no scan");
+}
+
+sub CheckEnv {
+  unless ($noScan or not $full) {
+    if (defined $component) {
+      $envDb->CheckComp($component);
+    }
+    else {
+      ($overallStatus) = $envDb->CheckEnv();
+    }
+  }
+}
+
+sub DisplayInfo {
+  # Create a list of the components to be displayed.
+  my @comps;
+  if (defined $component) {
+    my $ver = $envDb->Version($component);
+    unless (defined $ver) {
+      die "Error: $component not found\n";
+    }
+    push @comps, $component;
+  }
+  else {
+    my $versionInfo = $envDb->VersionInfo();
+    foreach my $comp (sort keys %{$versionInfo}) {
+      push @comps, $comp;
+    }
+  }
+
+  my $tableData;
+  if ($full) {
+    $tableData = GenFullInfoTable(\@comps);
+  }
+  else {
+    $tableData = GenMinimalInfoTable(\@comps);
+  }
+
+  # Only print the table if there's something in it.
+  if (scalar(@$tableData) > 1) {
+    print "\n";
+    DisplayTable($tableData, 1);
+  }
+
+  # Only display the overall status if a full check was done.
+  if (defined $overallStatus) {
+    print "\nOverall status: ", EnvDb::StatusString($overallStatus), "\n";
+  }
+}
+
+sub GenMinimalInfoTable {
+  my $comps = shift;
+
+  # Create a two dimentional array of the data to be printed.
+  my $tableData = [["Component", "Version"]];
+  my $row = 1;
+  foreach my $comp (@$comps) {
+    my $ver = $envDb->Version($comp);
+    $tableData->[$row++] = [$comp, $ver];
+  }
+  return $tableData;
+}
+
+sub GenFullInfoTable {
+  my $comps = shift;
+
+  # Create a two dimentional array of the data to be printed.
+  my $tableData = [["Component", "Version", "Internal version", "Status", "Mrp"]];
+  my $row = 1;
+  foreach my $comp (@$comps) {
+    my $ver = $envDb->Version($comp);
+    my $status = $envDb->Status($comp);
+    if (not $displayClean and $status == EnvDb::STATUS_CLEAN) {
+      next;
+    }
+    elsif (not $displayDirty and ($status == EnvDb::STATUS_DIRTY or $status == EnvDb::STATUS_DIRTY_SOURCE)) {
+      next;
+    }
+    elsif (not $displayPendingRelease and $status == EnvDb::STATUS_PENDING_RELEASE) {
+      next;
+    }
+
+    my $mrpName = $envDb->MrpName($comp);
+    unless (defined $mrpName) {
+      $mrpName = "-";
+    }
+    my $intVer = $envDb->InternalVersion($comp);
+    unless (defined $intVer) {
+      $intVer = "-";
+    }
+    $tableData->[$row++] = [$comp, $ver, $intVer, EnvDb::StatusString($status), $mrpName];
+  }
+  return $tableData;
+}
+
+sub DisplayTable {
+  my $tableData = shift;
+  my $numRows = scalar(@{$tableData});
+  die unless $numRows and defined $tableData->[0]; # There must be at least one column and row.
+  my $numCols = scalar(@{$tableData->[0]});
+
+  my $mw = MainWindow->new();
+  CreateGrid($mw, $tableData);
+  MainLoop();
+}
+
+sub CreateGrid() {
+  my $mw = shift;
+  my $data = shift;
+  my $numRows = scalar(@{$data});
+  die unless $numRows and defined $data->[0]; # There must be at least one column and row.
+  my $numCols = scalar(@{$data->[0]});
+
+  foreach my $row (0 ... $numRows - 1) {
+    my @row;
+    foreach my $col (1 ... $numCols - 1) {
+      $row[$col - 1] = $mw->Label(-text => $data->[$row][$col],
+				  -justify => 'left',
+				  -background => 'blue');
+    }
+    $mw->Label(-text => $data->[$row][0],
+	       -justify => 'left')->grid(@row,
+					 -sticky => 'nsew');
+  }
+}
+
+=head1 NAME
+
+EnvInfoTk - Displays information about the installed components in the current environment.
+
+=head1 SYNOPSIS
+
+  envinfo [options] [<component>]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -f  display full information (the remaining switches only apply when this is used)
+  -c  display the components with status "clean"
+  -d  display the components with status "dirty"
+  -p  display the components with status "pending release"
+  -n  no scan
+
+=head1 DESCRIPTION
+
+By default displays a brief summary table of the information contained in the current drive's environment database. For example:
+
+ Component   Version
+
+ mycomp1     026
+ mycomp2     057
+
+If envoked with the C<-f> switch a full table is displayed:
+
+ Component   Version   Internal version                       Status   Mrp
+
+ mycomp1     026       //myproject/latest/mycomp1/...@10106   clean    \mycomp1\mycomp1.mrp
+ mycomp2     057       //myproject/latest/mycomp1/...@10157   clean    \mycomp2\mycomp2.mrp
+
+ Overall status: clean
+
+The C<Component> and C<Version> fields are self explanatory. The C<Internal version> field is a label used by the site that owns the component, to store an internal reference (normally generated by their source control system). This is likely to be of use only to the owning site. The C<Status> field may have the following values:
+
+=over 4
+
+=item *
+
+B<clean> - The component's binaries all match the time stamp information that was stored when they were installed.
+
+=item *
+
+B<dirty> - One or more of the component's binaries doesn't match the time stamp information that was stored when they were installed. This may be because the source has been re-built but not changed (see the commands C<ValidateRel> and C<ValidateEnv> for details of how to check if a re-built set of binaries are identical to an already released set), or because changes have been made.
+
+=item *
+
+B<pending release> - The component is waiting to be released (see the commands C<PrepEnv> and C<MakeEnv> for details of how to make releases).
+
+=back
+
+The C<Mrp> field contains the name of the F<mrp> file that was used when the release was made. The overall status of the environment is displayed last. This may have the following values:
+
+=over 4
+
+=item *
+
+B<clean> - All the installed components have a status of C<clean> and there are no files in the F<\epoc32> tree that have unkown origins (i.e. they are all known to belong to a component).
+
+=item *
+
+B<dirty> - One or more of the installed components has a status of C<dirty>, or there is one or more files in the F<\epoc32> tree that has unknown origins.
+
+=item *
+
+B<pending release> - All components have a status of either C<clean> or C<pending release> and there are no files in the F<\epoc32> with unknown origins.
+
+=back
+
+
+By default C<EnvInfoTk> will perform a scan of the F<\epoc32> tree checking all the time stamps. To avoid this processing, use the C<-n> switch. This will cause the status of each component when the last scan was performed to be displayed (which may now be out of date). The output of C<EnvInfoTk> can be filtered according to status using the switches C<-c>, C<-d> and C<-p>. For example, if you wanted to view all the components that are either C<dirty> or C<pending release>, type:
+
+  envinfo -dp
+
+If envoked with a C<component> argument, then only the details of the specified component will be displayed and a scan of the F<\epoc32> tree will not be performed.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/EnvInfoTk.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Environment	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,140 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Licensee Product Environment
+#
+
+=head1 Licensee Project Environment
+
+The processes for distributing source code and binaries between engineers has a large impact on the efficiency of both the development and integration phases of a project. The efficiency of these processes is even more significant when a project is being developed between multiple sites that are geographically separated. The LPD release tools address the key elements of this process, making the human tasks required to distribute software as simple as possible. The following points characterise the projects LPD are generally involved with:
+
+=over 4
+
+=item *
+
+Integration is centrally owned and performed by a dedicated integration team. The integration team are responsible for collecting all software modules delivered by multiple external and internal parties, and assembling them into a self-consistent sofware platform.
+
+=item *
+
+Many 3rd parties are involved in delivering software modules into the integration team. It is important, therefore, to have a standard means of delivering software irrespective of the package's origin.
+
+=item *
+
+There are dependancies between the software 3rd parties. 
+
+...delivery of software packets into the integration team is not a one-way process. Unofficial baselines are typically maintained in different sites amongst integration-clusters. All software packets may be delivered to all development groups.
+
+=item *
+
+different 3rd parties have different SLDA's and therefore are entitled to differing source IPR categories
+
+...there is no single customer and so provision must be made for protecting source code IPR and confidentiality.
+
+=item *
+
+contributing software teams may have close dependancies, and form natural integration clusters
+
+...telephony, for example, consists of a number of contributing components and may choose to release a sub-system of components before submitting to the rest of the porject.
+
+=item *
+
+software author's development environments should never become too old, and hence require updating frequently
+
+...developing against an old environment always leads to unecessary integration problems. This most frequently occurs when the cost of upgrading a development environment is large; in terms of time, network bandwidth, and local storage.
+
+=item *
+
+an effective integration team must be capable of fast baseline turnaround
+
+...delays in baseline deliveries result in a larget than normal volume of unintegrated code getting submitted to the next build. It is therefore more likely to be late again.
+
+=back
+
+=head1 Software Distribution
+
+There are two main strategies for distributing source and binaries:
+
+=over 4
+
+=item *
+
+component releases
+
+=item *
+
+monolithic environments
+
+=back
+
+=head2 Component Releases
+
+The component release strategy involves modularising the project into a set of named components. These generally map onto the source level modularisation. Component owners are identified and are responsible for compiling a set of binaries for use by the rest of the developers at regular intervals. An integration team is responsible for identifying a set of versioned releases that work together.
+
+=head2 Monolithic environments
+
+These are the direct ouputs of a centralised build process, where all software components are built from source on a single machine, using a uniform procedure. A build team is employed to perform these builds at regular intervals on the latest source. The results of the build are packaged into a small number of large F<.zip> files for distribution.
+
+Each of these approaches is best suited to particular applications and address some of the same problems. They both have a number of advantages and disadvantages.
+
+In addressing the key aspects of the Licensee project environment described at the start, the LPD Release Tools combine the strengths of both distribution methods:
+
+=over 4
+
+=item *
+
+reduce the data transfer between sites
+
+=item *
+
+reliable environment sharing between sites
+
+=item *
+
+ability to verify the I<current> state of a development drive
+
+=item *
+
+incorporation of I<mainline builds> with I<component releases> (ie, validateenv)
+
+=item *
+
+facilitate I<integration clusters>
+
+=item *
+
+fast baseline turn-around
+
+=back
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,454 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package ExportData;
+use strict;
+use Utils;
+use IniData;
+
+use constant BIN_KEYS => 0;
+use constant RELDATA_KEYS => 1;
+use constant EXP_KEYS => 2;
+use constant SRC_KEYS => 3;
+use constant SRC_EXP_KEYS => 4;
+
+#
+# Constructor
+#
+sub New {
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my %args = @_;
+  my $self = {
+	      exportsFile => $args{exports_file},
+	      verbose => $args{verbose},
+	      iniData => IniData->New(),
+	     };
+  bless $self, $class;
+  
+  $self->ParseExportData();
+  return $self;
+}
+
+#
+# Public
+#
+
+sub PgpKeysForSource {
+  my $self = shift;
+  my $component = lc(shift);
+  my $category = lc(shift);
+
+  return $self->ReconstructData($component, SRC_KEYS, $category);
+}
+
+sub PgpKeysForBinaries {
+  my $self = shift;
+  my $component = lc(shift);
+
+  return $self->ReconstructData($component, BIN_KEYS);
+}
+
+sub PgpKeysForExports {
+  my $self = shift;
+  my $component = lc(shift);
+  my $category = lc(shift);
+
+  return $self->ReconstructData($component, EXP_KEYS, $category);
+}
+
+sub PgpKeysForRelData {
+  my $self = shift;
+  my $component = lc(shift);
+
+  return $self->ReconstructData($component, RELDATA_KEYS);
+}
+
+sub AllPgpKeys {
+  my $self = shift;
+  if (exists $self->{pgpKeys}) {
+    return $self->{pgpKeys};
+  }
+  return [];
+}
+
+sub ExportableComponents {
+  my $self = shift;
+
+  if (exists $self->{components}) {
+    return $self->{components};
+  }
+  return [];
+}
+
+sub ComponentIsExportable {
+  my $self = shift;
+  my $comp = lc(shift);
+
+  foreach my $exportableComp (@{$self->ExportableComponents()}) {
+    if ($comp eq lc($exportableComp)) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+
+#
+# Private
+#
+
+sub ParseExportData {
+  my $self = shift;
+
+  unless ($self->{exportsFile}) {
+    die "Error: Export data filename not defined\n";
+  }
+
+  open EXPORTS, "$self->{exportsFile}" or die "Error: Unable to open $self->{exportsFile} for reading\n";
+
+  if ($self->{verbose}) {
+    print "Parsing export data file $self->{exportsFile} ...\n";
+  }
+
+  my $separator = $self->{iniData}->CsvSeparator();
+
+  my $firstRow = 1;
+  while (my $row = <EXPORTS>) {
+    chomp $row;
+    if ($row =~ /^\s*$/ or $row =~ /^[$separator]*#/) {next;}  #ignore empty rows in table
+    #handle first non empty row
+    if ($firstRow) {
+      $self->HandleFirstRow($row);
+      $firstRow = 0;
+    }
+    #handle subsequent non empty rows
+    else {
+      $self->HandleRow($row);
+    }
+  }
+  close EXPORTS;
+}
+
+sub HandleFirstRow {
+  my $self = shift;
+  my $row = shift;
+
+  #parse row of delimiter-separated values
+  my @cols = $self->ParseCSV($row);
+
+  for (my $i = 1; $i <= $#cols; ++$i) {
+    my $cell = $cols[$i];
+    if (defined $cell) {
+      Utils::StripWhiteSpace(\$cell);
+      my ($pgpKeyid) = ($cell =~ /\b(0X[0-9a-fA-F]{8})\b/i);
+      unless ($pgpKeyid) {
+	die "Error: PGP key ID of the correct format not defined in column header \"$cell\"\n";
+      }
+      push @{$self->{pgpKeys}}, $pgpKeyid;
+      push @{$self->{nonemptyColumns}} ,$i;
+    }
+    else {
+      die "Error: Undefined PGP key in ".$self->{exportsFile}." file.\n";
+    }
+  }
+}
+
+sub HandleRow {
+  my $self = shift;
+  my $row = shift;
+
+  $row = lc($row);
+
+  #parse row of delimiter-separated values
+  my @cols = $self->ParseCSV($row);
+
+  my $component = $cols[0];
+  Utils::StripWhiteSpace(\$component);
+  if ($component =~ /^\s*$/) {
+    die "Error: Export table has wrong format. Must have component name in first column.\n";
+  }
+  push @{$self->{components}}, $component;
+
+  #iterate over columns which have a nonempty recipient heading and store cell data
+  my @cells = @cols[@{$self->{nonemptyColumns}}];
+  for (my $j = 0; $j < @cells; ++$j) {
+    $self->HandleCell($component, $j, $cells[$j]); #$j is the PGP array index
+  }
+}
+
+sub HandleCell {
+  my $self = shift;
+  my $component = shift;
+  my $pgpKeyIndex = shift;
+  my $cell = shift;
+  
+  my $pgpKey = $self->{pgpKeys}->[$pgpKeyIndex];
+
+  # cell must not be undef but may be blank
+  if (!defined $cell) {
+    $cell = '';
+  }
+
+  if ($cell =~ /exclude(?!_)/i) {
+    # Cells containing 'exclude' must not have _any_ release files of this
+    # component exported to this recipient.  However if only you want to stop
+    # binaries, use exclude_bin
+    return;
+  }
+
+  # Other cells must have the recipient's key added to 'relDataPgpKeys' and
+  # possibly also 'srcPgpKeys', 'expPgpKeys or 'binPgpKeys' for this component.
+  # Concatenating the string save memory, over using an array
+  $self->{keys}->{$component}->[RELDATA_KEYS] .= "$pgpKeyIndex,";
+
+  # Include binaries unless 'exclude_bin'
+  if ( $cell !~ s/exclude_bin//i ) {
+    $self->{keys}->{$component}->[BIN_KEYS] .= "$pgpKeyIndex,";
+  }
+
+  # Identify any S() or E() blocks
+  my %blocks;
+  while ($cell =~ s/([a-z])\((.*?)\)//i) {
+    if (!defined $blocks{$1}) {
+      $blocks{$1} = [$1, $2];
+    } else {
+      die "Error: Export table has wrong format. Multiple $1() blocks found in cell for component '$component', PGP key '$pgpKey'\n";
+    }
+  }
+
+  foreach my $block (keys(%blocks)) {
+    my ($origblock, $cats) = @{$blocks{$block}};
+    my $type;
+    if ($block eq "s") {
+      $type = SRC_KEYS;
+    } elsif ($block eq "e") {
+      $type = EXP_KEYS;
+    }
+    if (defined $type) {
+      while ($cats =~ s/([a-z]-[a-z]|\S)//i) { # a letter range (e.g. A-Z) or any non whitespace character
+        my $cat = $1;
+        
+        if ($cat =~ /(.)-(.)/) {
+          my ($from, $to) = ($1, $2);
+      
+          foreach my $cat (ord($from)..ord($to)) { # convert the characters to numbers so that we can do a foreach on the range
+            $cat -= 96;
+            $self->{keys}->{$component}->[$type]->[$cat] .= "$pgpKeyIndex,";
+          }
+        }
+        elsif ($cat =~ /^[a-z]$/i) {
+          $cat = ord($cat) - 96;         
+          $self->{keys}->{$component}->[$type]->[$cat] .= "$pgpKeyIndex,";
+        } else {
+          die "Error: Export table has wrong format. '$cat' is not a valid IPR category in cell for component '$component', PGP key '$pgpKey'\n";
+        }
+      }
+    } else {
+      die "Error: Export table has wrong format. '$origblock()' is not a valid construct in cell for component '$component', PGP key '$pgpKey'\n";
+    }
+  }
+
+  # Handle any 'old format' IPR categories not in blocks
+  while ($cell =~ s/([a-z]-[a-z]|\S)//i) { # a letter range (e.g. A-Z) or any non whitespace character
+    my $cat = $1;
+
+    if ($cat =~ /(.)-(.)/) {
+      my ($from, $to) = ($1, $2);
+
+      foreach my $cat (ord($from)..ord($to)) { # convert the characters to numbers so that we can do a foreach on the range
+        $cat -= 96;
+        $self->{keys}->{$component}->[SRC_EXP_KEYS]->[$cat] .= "$pgpKeyIndex,";
+      }
+    }
+    elsif ($cat !~ /^[a-z]$/i) {
+      die "Error: Export table has wrong format. '$cat' is not a valid IPR category in cell for component '$component', PGP key '$pgpKey'\n";
+    }
+    else {
+      $cat = ord($cat) - 96;
+      $self->{keys}->{$component}->[SRC_EXP_KEYS]->[$cat] .= "$pgpKeyIndex,";
+    }
+  }
+}
+
+sub ParseCSV {
+  my $self = shift;
+  my $text = shift;      # record containing delimited-separated values
+  my @new ;
+  
+  my $separator = $self->{iniData}->CsvSeparator();
+  
+  while ($text =~ m{"([^\"\\]*(?:\\.[^\"\\]*)*)"$separator?|([^$separator]+)$separator?|$separator}gx) {
+    push(@new, $+);
+  }
+  
+  push(@new, undef) if substr($text, -1,1) eq $separator;
+
+  return @new;      # list of values that were delimited-separated
+}
+
+sub ReconstructData {
+  my $self = shift;
+  my $component = shift;
+  my $type = shift;
+  my $category = shift;
+  
+  if ($category) {
+    $category = ord($category) - 96;
+  }
+
+  if (defined $self->{keys}->{$component}) {
+    my @results;
+    my @pgpKeysIndex;
+  
+    if ($type == EXP_KEYS || $type == SRC_KEYS) {
+      # Gets a list of the src or export keys, as well as the list of keys in both source and exports.
+      # Splits the key indexes on ,
+      if (defined $self->{keys}->{$component}->[$type]->[$category]) {
+        @pgpKeysIndex = split /,/, $self->{keys}->{$component}->[$type]->[$category];
+      }
+      if (defined $self->{keys}->{$component}->[SRC_EXP_KEYS]->[$category]) {
+        push @pgpKeysIndex, split /,/, $self->{keys}->{$component}->[SRC_EXP_KEYS]->[$category];
+      }
+    }
+    else { # BIN or RELDATA
+      @pgpKeysIndex = split /,/, $self->{keys}->{$component}->[$type]
+    }
+    
+    @results = map $self->{pgpKeys}->[$_], @pgpKeysIndex;
+    return \@results;
+  }
+  
+  return [];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+ExportData.pm - Provides an interface to the contents of the project's export data file.
+
+=head1 DESCRIPTION
+
+A module used for accessing export restriction information for a component release.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed a named parameter list in the form of hash key value pairs:
+
+ exportsFile => $export_data_filename
+ verbose     => $integer_verbosity_value
+
+Opens and parses the export data file which should contain lines of delimiter separated values representing a table of component name rows and recipient columns, as in the example below:
+
+             | pgpkeyid_1 (recipient) | pgpkeyid_2 (recipient) | pgpkeyid_3 (recipient) |
+ ------------+------------------------+------------------------+------------------------+--
+ component_1 |           DE           |            E           |          CDE           |
+ ------------+------------------------+------------------------+------------------------+--
+ component_2 |          S(CDE) E(DE)  |                        |           DE           |
+ ------------+------------------------+------------------------+------------------------+--
+ component_3 |           D-G  T       |           A-F          |         exclude        |
+ ------------+------------------------+------------------------+------------------------+--
+ component_4 |  exclude_bin DEFG      |       DEFG             |       DEFG             |
+
+
+
+The column headers must contain the recipients PGP key ID - an eight digit hexadecimal number preceeded by C<0x> (e.g C<0xD9A2CE15>). This public PGP key will be used to encrypt all files sent to the recipient. The name of the recipient may also be included in the column header although this is not mandatory.
+
+A cell contains a list of IPR categories available to the recipient of the component.
+ Each category must be a single letter or digit or a range (e.g. A-Z). Empty cells imply that the recipient
+ does not have access to any source for the corresponding component but can still receive
+binaries.
+
+Alternatively, different categories may be specified for source files and export files, using the S(...) and E(...) notations respectively, with '...' being a list of IPR categories.
+
+To prevent a recipient from receiving both source and binaries for the corresponding component, use the keyword C<exclude>. This can be useful when certain recipients may receive releases of some but not all components.
+
+To prevent a recipient from receiving binaries for the corresponding component, use the keyword C<exclude_bin>. Unlike C<exclude>, this does not break any environment.
+
+Components which are not listed in the table but exist on the local site will not be exported to any recipients. However, a warning will be issued to alert the exporter of this situation.
+
+If a licensee or third party does not use C<DISTRIBUTION.POLICY> files to categorize source then all source will have the category X. In this case, putting X in a cell implies that all source for that component will be sent to the recipient, otherwise none will be sent.
+
+Lines starting with a C<#> are treated as comments and ignored.
+
+[NOTE: It is recommended that this file is created and maintained using a spreadsheet
+application (saving as a CSV file) rather than editing it directly.]
+
+If your CSV file does not use a comma ',' as the separator you will need to specify the required
+separator in your reltools.ini, using the syntax F<csv_separator <separator>>, e.g. F<csv_separator ;>.
+
+=head2 PgpKeysForRelData
+
+Expects a component name. Returns a reference to an array of public PGP key ids (corresponding to different
+recipients) to be used to encrypt the component's reldata.
+
+=head2 PgpKeysForSource
+
+Expects a component name and a source category. Returns a reference to an array of public PGP
+ key ids (corresponding to different recipients) to be used to encrypt the component's source of
+ this category.
+
+=head2 PgpKeysForBinaries
+
+Expects a component name. Returns a reference to an array of public PGP key ids (corresponding to different
+recipients) to be used to encrypt the component's binaries.
+
+=head2 PgpKeysForExports
+
+Expects a component name and an IPR category. Returns a reference to an array of public PGP
+ key ids (corresponding to different recipients) to be used to encrypt the component's exports of
+ this category.
+
+=head2 AllPgpKeys
+
+Returns a reference to an array of all PGP key IDs listed in the export table.
+
+=head2 ExportableComponents
+
+Returns a reference to an array of all the components listed in the export table
+
+=head2 ComponentIsExportable
+
+Expects to be passed a component name. Returns true if the component is listed in the
+export table.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,244 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Path;
+use IniData;
+use RelData;
+use RelTransfer::Export;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $dummy = 0;
+my $force = 0;
+my $ftpResume = 0;
+my $iniData;
+my $commandController;
+my $envcomp;
+my $envver;
+my $examining;
+my $excludeSource = 0;
+my %failedExports;
+my %goodExports;
+my %alreadyExported;
+
+#
+# Main
+#
+
+ProcessCommandLine();
+ExportEnvironment();
+PrintReport();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "f" => \$force, "r" => \$ftpResume, "x" => \$examining, "d" => \$dummy, "e" => \$excludeSource);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $envcomp = lc($ARGV[0]);
+  $envver = $ARGV[1];
+
+  unless (defined $envcomp and defined $envver and $#ARGV = -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+  $iniData = IniData->New(undef,1);
+  $commandController = CommandController->New($iniData, 'ExportEnv');
+  #if ftp resume option is used override value in reltools.ini
+  if ($ftpResume) {
+    $iniData->FtpServerSupportsResume(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: exportenv [options] <component> <external_version>
+
+options:
+
+-h  help
+-f  force export overwriting if necessary
+-r  use FTP reconnect and resume transfer mode
+-x  confirm correct size of files on remote site rather than exporting them
+-d  dummy run (don't do anything) - assumes -v
+-e  exclude source
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub ExportEnvironment {
+  my $relData = RelData->Open($iniData, $envcomp, $envver, $verbose);
+  my $env = $relData->Environment();
+
+  my $exporter = RelTransfer::Export->New(ini_data => $iniData,
+					  force => $force,
+					  dummy => $dummy,
+					  excludeSource => $excludeSource,
+					  verbose => $verbose);
+
+  unless ($examining) {
+    foreach my $comp (sort keys %{$env}) {
+      my $ver = $env->{$comp};
+      $exporter->CheckExportable($comp, $ver);
+    }
+  }
+
+  #do the export checking for errors
+  foreach my $comp (sort keys %{$env}) {
+    my $exported;
+    my $ver = $env->{$comp};
+    eval {
+      if ($examining) {
+        $exporter->ExamineExportedRelease($comp, $ver);
+      } else {
+        $exported = $exporter->TransferRelease($comp, $ver);
+      }
+    };
+    if ($@) {
+      print $@;
+      if ($@ =~ /cannot\s+connect/i) {
+        print "\nAborting export of $envcomp $envver environment\n";
+        last;
+      }
+      my $error = $@;
+      chomp $error;
+      $error =~ s/^error: ("?$comp $ver"? )?//i;
+      $failedExports{$comp}->{$ver} = $error;
+    } else {
+      if ($examining || $exported) {
+        push @{$goodExports{$comp}}, $ver;
+      } else {
+        push @{$alreadyExported{$comp}}, $ver;
+      }
+    }
+  }
+}
+
+sub PrintReport {
+  print "\n=========EXPORT SUMMARY==========\n";
+
+  my $tableData = [["Component", "Version", "status"]];
+
+  foreach my $comp (sort keys %goodExports) {
+    foreach my $ver (@{$goodExports{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'successfully exported']);
+    }
+  }
+  
+  foreach my $comp (sort keys %alreadyExported) {
+    foreach my $ver (@{$alreadyExported{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'has already been exported']);
+    }
+  }
+  
+  if (scalar @{$tableData} > 1) {
+    $iniData->TableFormatter->PrintTable($tableData, 1);
+  }
+  
+  #handle failed exports
+  if (keys %failedExports) {
+    print "\n=========FAILED EXPORTS==========\n";
+    print "\nExport Failure Summary\n\n";
+    my $failureTableData = [["Component", "Version", "Failure reason"]];
+    foreach my $comp (sort keys %failedExports) {
+      foreach my $ver (sort keys %{$failedExports{$comp}}) {
+        push (@$failureTableData, [$comp, $ver, $failedExports{$comp}->{$ver}]);
+      }
+    }
+    $iniData->TableFormatter->PrintTable($failureTableData, 1);
+    print "\nError: Unable to export component release successfully\n";
+  }
+  else
+  {
+    if (keys %goodExports) {
+      print "\nEnvironment $envcomp $envver successfully exported\n";
+    } else {
+      print "\nNothing to do!\n";
+    }
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ExportEnv - Exports the environment from which a component release was made.
+
+=head1 SYNOPSIS
+
+  exportenv [options] <component> <version>
+
+options:
+
+  -h  help
+  -f  force export overwriting if necessary
+  -r  use FTP reconnect and resume transfer mode
+  -v  verbose output (-vv very verbose)
+  -d  dummy run (don't do anything) - assumes -v
+  -e  exclude source
+  -x  examine: confirm correct sizes of files on remote site rather than exporting them
+
+=head1 DESCRIPTION
+
+When a release is made, a description of the environment it was made from is stored with it. 
+C<ExportEnv> takes a component name and version number, reads the environment data for this 
+component and builds a list of component names and version numbers. It then encrypts these releases before sending them to the projects shared archive on a remote site.
+
+Using the C<-f> option will force releases to be exported even if they already exist on the remote site (this only applies to components existing in the users export table)
+
+If the C<-r> option is used and the FTP connection is dropped during the upload of a release, the tools will automatically reconnect to the FTP site and resume the upload. This feature may not be supported by some FTP servers.
+
+Using C<-e> option will create a release without source. 
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,267 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Path;
+use IniData;
+use RelTransfer::Export;
+use RelData;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $dummy = 0;
+my $force = 0;
+my $ftpResume = 0;
+my $iniData;
+my $commandController;
+my $excludeSource = 0;
+my %releases; # Data structure changed to a double hash (from a single hash).
+              # Top level keys are (case lowered) component names with has reference values.
+              # Second level hash keys are versions, with a dummy value.
+              # This arrangement makes it possible for a single component to have more than one
+              # version, and to easily delete versions that have already been imported.
+my %failedExports;
+my %goodExports;
+my %alreadyExported;
+  
+#
+# Main.
+#
+
+ProcessCommandLine();
+ExportRelease();
+PrintReport();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "f" => \$force, "r" => \$ftpResume, "d" => \$dummy, "e" => \$excludeSource);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if (scalar(@ARGV) == 1) {
+    if (-f $ARGV[0]) {
+      open IN, $ARGV[0] or die "Error: Couldn't open $ARGV[0] for reading: $!\n";
+      while (my $line = <IN>) {
+	chomp $line;
+	$line =~ s/^\s*$//;
+	$line =~ s/#.*//;
+	if ($line eq '') {
+	  next; #Nothing left
+	}
+	my ($comp, $ver) = split(" ", $line);
+	if (defined $comp and defined $ver) {
+	  $releases{lc($comp)}->{$ver} = 1;
+	}
+	else {
+	  print "Error: Invalid file format in $ARGV[0]\n";
+	  Usage(1);
+	}
+      }
+      close IN;
+    }
+    else {
+      print "Error: $ARGV[0] is not a file\n";
+      Usage(1);
+    }      
+  }	
+  elsif (scalar(@ARGV) == 2) {
+    $releases{lc($ARGV[0])}->{$ARGV[1]} = 1;
+  }
+  else {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+  $iniData = IniData->New(undef,1);
+  $commandController = CommandController->New($iniData, 'ExportRel');
+  #if ftp resume option is used override value in reltools.ini
+  if ($ftpResume) {
+    $iniData->FtpServerSupportsResume(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: exportrel [options] (<component> <version>) | (<component_ver_list_file>)
+
+options:
+
+-h  help
+-f  force export overwriting if necessary
+-r  use FTP reconnect and resume transfer mode
+-d  dummy run (don't do anything) - assumes -v
+-e  exclude source
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub ExportRelease {
+  my $exporter = RelTransfer::Export->New(ini_data => $iniData,
+					  force => $force,
+					  dummy => $dummy,
+					  excludeSource => $excludeSource,
+					  verbose => $verbose);
+  #do the export checking for errors
+  foreach my $comp (sort keys %releases) {
+    foreach my $ver (keys %{$releases{$comp}}) {
+      my $exported;
+      eval {
+        GetCorrectVersionNumber($comp, \$ver);
+        $exported = $exporter->TransferRelease($comp, $ver);
+      };
+      if ($@) {
+        print $@;
+        if ($@ =~ /cannot\s+connect/i) {
+          print "\nConnection to remote site dropped aborting export\n";
+          last;
+        }
+        my $error = $@;
+        chomp $error;
+        $error =~ s/^error: ("?$comp $ver"? )?//i;
+        $failedExports{$comp}->{$ver} = $error;
+      } else {
+        if ($exported) {
+          push @{$goodExports{$comp}}, $ver;
+        } else {
+          push @{$alreadyExported{$comp}}, $ver;
+        }
+      }
+    }
+  }
+}
+
+sub GetCorrectVersionNumber {
+  #This function changes the version number string of each component to that 
+  #stored in its reldata file. This is required because version numbers are case dependent
+  my $comp = shift;
+  my $verRef = shift;
+
+  my $relData = RelData->Open($iniData, $comp, $$verRef, $verbose);
+  my $env = $relData->Environment();
+  $$verRef = $env->{$comp};
+}
+
+sub PrintReport {
+  print "\n=========EXPORT SUMMARY==========\n";
+
+  my $tableData = [["Component", "Version", "status"]];
+
+  foreach my $comp (sort keys %goodExports) {
+    foreach my $ver (@{$goodExports{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'successfully exported']);
+    }
+  }
+  
+  foreach my $comp (sort keys %alreadyExported) {
+    foreach my $ver (@{$alreadyExported{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'has already been exported']);
+    }
+  }
+  
+  if (scalar @{$tableData} > 1) {
+    $iniData->TableFormatter->PrintTable($tableData, 1);
+  }
+  
+  #handle failed exports
+  if (keys %failedExports) {
+    print "\n=========FAILED EXPORTS==========\n";
+    my $failureTableData = [["Component", "Version", "Failure reason"]];
+    foreach my $comp (sort keys %failedExports) {
+      foreach my $ver (sort keys %{$failedExports{$comp}}) {
+        push (@$failureTableData, [$comp, $ver, $failedExports{$comp}->{$ver}]);
+      }
+    }
+    $iniData->TableFormatter->PrintTable($failureTableData, 1);
+    print "\nError: Unable to export component release successfully\n";
+  }
+  else
+  {
+    if (keys %goodExports) {
+      print "\nAll releases exported successfully\n";
+    } else {
+      print "\nNothing to do!\n";
+    }
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ExportRel - Exports a component release to a remote site.
+
+=head1 SYNOPSIS
+
+  exportrel [options] (<component> <version>) | (<component_ver_list_file>)
+
+options:
+
+  -h  help
+  -f  force export overwriting if necessary
+  -r  use FTP reconnect and resume transfer mode
+  -d  dummy run (don't do anything) - assumes -v
+  -e  exclude source
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Takes a C<component> and C<version> number as arguments. Encrypts the release and sends it to the projects shared archive stored on a remote site.
+
+The name of file containing a list of components and versions maybe passed as an argument to the tool instead of a single component to export multiple releases.
+
+Using the C<-f> option will force releases to be exported even if they already exist on the remote site (this only applies to components existing in the users export table)
+
+If the C<-r> option is used and the FTP connection is dropped during the upload of a release, the tools will automatically reconnect to the FTP site and resume the upload. This feature may not be supported by some FTP servers.
+
+Using C<-e> option will create a component release without source.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ExportingReleases	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,215 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Introduction
+
+When a release is created with C<makerel> and C<makeenv> it is stored in the releasers local archive. To share this release with other development teams involved in the project it must be exported to a remote release archive (typically hosted on an FTP server) which all teams have access to. 
+
+This document describes how to configure and use the tools to export a teams releases to the remote archive and import other teams releases from it.
+
+=head1 Configuration
+
+The F<reltools.ini> and export data files must be set up as described in the F<Installation> document. Typically these files will have already been created for the user so no further editing of them is required. (An archive path file may also be needed, depending on your archive arrangement).
+
+Releases exported to the remote site are PGP encrypted for security. To encrypt and decrypt releases a command line PGP tool is used by the tools (defined by the C<pgp_tool> keyword in the F<reltools.ini> file). Both supported PGP clients (GnuPG and NAI PGP) require some configuration before they will work with the tools. 
+
+=head2 Configuring Network Associates PGP
+
+NAI command line PGP (version 6 or 7) must be installed on the users machine. The executable is assumed to have the name C<pgp.exe> and exist somewhere in the users path.
+
+PGP encrypts and decrypts files using keys stored on a public and secret key ring. Before using the export and import tools the user must set up their key rings for the project they are working on. If pre-configured keyrings have not been supplied the steps below should be followed:
+
+=over 4
+
+=item * 
+
+To use keys from another keyring first extract the keys with the command
+
+ pgp -kx <keyid> keyfile
+
+If the keyrings are not stored in the default directory then the options C<+PUBRING> or C<+SECRING> are required. For example
+
+ pgp +PUBRING=keyringPath/pubring.pkr -kx 0x12345678 foo.asc
+ pgp +SECRING=keyringPath/secring.skr -kx 0x87654321 bar.asc
+
+Remember to extract both public and private keys.
+
+To extract keys using the GUI version of PGP use the export key menu option. If the key is private make sure the "include private keys" check box is selected.
+
+=item *
+
+Create empty key ring files F<pubring.pkr> and F<secring.skr>. Add key files to these key rings using the command
+
+ pgp -ka keyfile  
+
+For example
+
+ pgp +PUBRING=keyringPath/pubring.pkr -ka somePublicKeyfile.asc
+ pgp +SECRING=keyringPath/secring.skr -ka someSecretKeyfile.asc
+
+The project key rings must have the names F<pubring.pkr> and F<secring.skr> but can be stored in any directory. If this is not the default directory used by PGP then the user must set the C<pgp_config_path> keyword in the F<reltools.ini> file to the directory where they are stored.
+
+=item *
+
+Check that the keys exist on the key ring using the command
+
+ pgp -kv
+
+For example
+
+ pgp +PUBRING=keyringPath/pubring.pkr -kv
+ pgp +SECRING=keyringPath/secring.skr -kv
+
+=back
+
+Once the keyrings have been created and populated, the keys must be signed with the users private key so that PGP can encrypt non-interactively (a requirement for the export tools to work). To sign all the keys on the project keyring follow the steps below:
+
+=over 4
+
+=item *
+
+First set the users private key to be the most trusted introducer and the default signing key. To do this run the command
+
+ pgp -ke your_private_keyid
+
+For example
+
+ pgp +SECRING=keyringPath/secring.skr -kv
+
+Input the passphrase, then answer 'y' to make the key the ultimately trusted introducer and the default signing key. Answer 'n' to the other questions.
+
+=item *
+
+Sign all the keys on the public key ring with the default signing key by calling the command
+
+ pgp -ks public_keyid 
+
+for each public key. For example
+
+ pgp +PUBRING=keyringPath/pubring.pkr -ks 0x12345678 
+
+=back
+
+Finally, once the key rings have been created and all the keys on them signed they maybe moved to a directory of the users choice (although the file names must be F<pubring.pkr> and F<secring.skr>) The C<pgp_config_path> keyword value in F<reltools.ini> should then be modified to this path. 
+
+=head2 Configuring GnuPG
+
+The tools have been tested with versions 1.06 and 1.4.7 of GnuPG and assume that the C<gpg.exe> executable exists somewhere in the users path.  You can either generate a new key pair or you can import PGP keys.
+
+=head3 Generating a New Key Pair
+
+To generate a new GPG key pair use the command
+
+ gpg --gen-key
+
+and follow the on screen instructions.
+
+=head3 Using existing PGP Keys
+
+GnuPG can use key rings created by Network Associates PGP (see above) just rename the files to F<pubring.gpg> and F<secring.gpg>. If the user wishes to create GnuPG key rings then follow the steps below
+
+=over 4
+
+=item *
+
+Export the keys from a PGP keyring using the method described in the section above
+
+=item *
+
+Import the keys onto the public and private key rings using the command:
+
+ gpg --import keyfile
+
+For GnuPG 1.06 (but not for GnuPG 1.4.7) an additional flag needs to be set to import private keys.  Use the command:
+
+ gpg --allow-secret-keys --import keyfile
+
+If the user wishes to use key rings which are not stored in the default location the '--homedir' option must be used. For example
+
+ gpg --homedir keyringPath --import somePublicKeyFile.asc
+
+As before, if importing private keys using GnuPG 1.06, the '--allow-secret-keys' flag is also needed (this flag is not necessary if using GnuPG 1.4.7).  Use the command:
+
+ gpg --homedir keyringPath --allow-secret-keys --import someSecretKeyFile.asc
+
+=item *
+
+Check that the keys exist on the key rings using
+
+ gpg --homedir keyringPath --list-keys
+ gpg --homedir keyringPath --list-secret-keys
+
+=back
+
+Once the key rings have been created they maybe moved to any directory (keeping the file names as F<pubring.gpg> and F<secring.gpg>). The C<pgp_config_path> keyword value in F<reltools.ini> should then be modified to this path.
+
+=head2 PGP vs GPG compatibility
+
+When exporting or importing with GPG defined as your 'pgp_tool' , and when using keys provided by PGP which employ a patented algorithm such as IDEA, an appropriate plugin will have to be installed for use by GPG.
+
+=head1 Exporting releases
+
+To export a single release to the remote site use the C<exportrel> command. For example 
+
+ exportrel mycomp myver -v
+
+to export a complete environment use the C<exportenv> command. For example
+
+ exportenv mycomp myver -v
+
+C<exportenv> will attempt to export every release in the environment of mycomp myver.
+
+Both commands will only attempt to export a release if it is listed in the export table and does not already exist in the remote archive.
+Using the C<-f> option will force releases to be exported even if they already exist on the remote site (again this only applies to components existing in the users export table)
+
+If the C<-r> option is used and the FTP connection is dropped during the upload of a release, the tools will automatically reconnect to the FTP site and resume the upload. This feature may not be supported by some FTP servers.  
+
+=head1 Importing releases
+
+To import a single release to the remote site use the C<importrel> command. For example 
+
+ importrel mycomp myver -v
+
+to import a complete environment use the C<importenv> command. For example
+
+ importenv mycomp myver -v
+
+C<importenv> will attempt to import every release in the environment of mycomp myver. If mycomp myver does not exist in the local archive it will import it, read its environment information and then import the rest of the environment.
+
+C<importrel> has a C<-f> option which will force the import of a release even if it already 
+exists in the local archive
+
+If the C<-r> option is used and the FTP connection is dropped during the download of a release, the tools will automatically reconnect to the FTP site and resume the download. This feature may not be supported by some FTP servers.  
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/FAQ	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,152 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Frequently Asked Questions
+
+=head3 How do I remove an environment database entry?
+
+Use C<preprel comp_name> - no parameters indicates that you want to remove the entry. This may be useful if you edit the environment database (via either C<PrepRel> or C<PrepEnv>) incorrectly and want to rectify your mistake.
+
+=head3 When making a release, the tools complain about missing files that I don't want to release. How do I avoid this?
+
+F<mrp> statements like...
+
+ binary  \mycomp\mybldinfdir wins
+
+...cause the release tools to get the identity of file that need to be release from the build tools (using their C<-what> switch). It is possible that the build files (F<bld.inf>, F<mmp>s, custom make files, etc.) could list more releasables than you want to actually release. One solution is to modify the build files, but this may not be convenient if you are releasing code that you don't actually own. An alternative is to explicitly exclude certain binary files using the C<-binary> keyword in your F<mrp> file. This supports the same syntax as the C<binary> keyword, but tells the release tools to not release the files specified. It can be used to exclude exported files also. For example, to exclude the file F<\epoc32\release\wins\udeb\mycomp.pdb>:
+
+ -binary \epoc32\release\wins\udeb\mycomp.pdb
+
+To exclude all the files associated with the F<mmp> file F<mymmp>:
+
+ -binary \mycomp\mybldinfdir wins mymmp
+
+See the document I<Making Releases> for more details.
+
+=head3 How can I exclude exported files?
+
+The F<mrp> keyword C<exports> can be used to instruct the release tools to release a component's exports. Note, since version 2.59 of the release tools, it has been possible to categorise exports according to the IPR classifications applied to source code. See the C<categorise_exports> keyword in the section F<Installation> for more details.
+
+=head3 When making a release, the tools complain about files of unknown origin even though I know they were created by building the component. What could the problem be?
+
+The tools use the C<binary> statements in the components F<mrp> file to create a list of binary files associated with the release. 
+If the output of the build generates extra files to those contained in this list then they will be reported as files of unknown origin.
+
+The list of binaries the tools expect to be in the release can be viewed manually by reading the F<mrp> file. The files and directories explicitly defined after C<binary> keywords are included in this list. If a C<binary> keyword is followed by the location of a F<bld.inf> and a target then running C<abld -what build target> will display the binaries contributed to the list by these C<binary> statements.
+
+If the list of binaries created from the F<mrp> file is different to the output of the build then it is likely that the build configuration files (in particular the custom makefiles) have been written in a non-standard way. The ideal solution would be for the user to fix the build configuration files; if this is not possible then an alternative would be to explicitly list the extra files in the F<mrp> file and then make the release.     
+
+=head3 EnvInfo appears to hang after I set some components to pending release. What's going on?
+
+When you set a component's status to C<pending release> and run C<EnvInfo>, instead of checking the component's binaries against the stored signature (which contains the binary file names and their last modified times), the release tools attempt to determine the identity of binaries are are about to be released. This involves parsing the component's F<mrp> file, which in turn may involve generating a set of makefiles. This can take a considerable amount of time for large components.
+
+=head3 Where can I get help in setting up GnuPG?
+
+You can find all the GnuPG documentation you need at C<www.gnupg.org>
+
+=head3 Why is it possible to set PGP key ids in both F<reltools.ini> and the export data table?
+
+The configuration file F<reltools.ini> supports the keyword C<pgp_encryption_keys> which can be used to specify keys which should be used to encrypt B<ALL> exported files. This should be used to specify the outbound public key(s) of the site that is doing the exporting. This allows the site that generated each release to decrypt it if need be. It should not be used to specify the public keys any other sites. These should be specified in the export data table (contains in the file specified using the C<export_data_file> keyword in F<reltools.ini>). This table allows each site's export policy to be carefully defined and controlled. See the F<Installation Guide> for details.
+
+=head3 I get the error "Unable to decrypt any part of <component> <version>" when using C<ImportRel> or C<ImportEnv>. What does this mean?
+
+The exporter of a release may apply different access restrictions to the release files. Source files and exported files (headers etc.) may be given an IPR category. This allows the exporter to control which recipients are allowed to receive which categories. In addition to this a component's binaries may also have restricted access. Binaries aren't categorised - each recipient is either allowed to receive all binaries for a particular component or none. See the section F<Installation> for more details on how to control exports.
+
+Provided a recipient has access to the binary files of a component release, they will be allowed to install that component release into an environment. The above error is generated to alert recipients of the situation where they have attempted to import a release that they don't have access to, and as a result with not be able to install it into an environment.
+
+It's possible that this situation has occurred due to an error on the part of the exporter. If this is suspected, then the exporter should be contacted and asked to check their export table. If the recipient should have been able to access the release, then the exporter will need to update their export table and re-export using the C<-f> option to force an overwrite.
+
+=head3 How large (or small) should I make my components?
+
+Here are some points to bear in mind when deciding upon component granularity:
+
+=over 4
+
+=item 1
+
+A package description (or F<mrp>) file must be written and maintained for each component.
+
+=item 2
+
+The simpler these files are, the easier they are to maintain.
+
+=item 3
+
+Componentising at a granularity of a F<bld.inf> generally results in the simplest F<mrp> files. Such F<mrp> files hardly ever need to be changed once they have been created.
+
+=item 4
+
+Componentising at a granularity less than a F<bld.inf> in terms of F<mmp> files, is possible, however it does introduced some increased complexity in the F<mrp> files. It also may require changes to the source code structure the ensure that the source can be correctly distributed between the fine granularity components. This is almost never required when componentising at the F<bld.inf> granularity.
+
+=item 5
+
+Componentising at a granularity less than an F<mmp> file is again possible, but highly unadvisable since building one component would cause files belonging to another component to get overwritten. It would also significantly increase the complexity of the F<mrp> files. The reason for this is that it would no longer be possible to rely on the build tools to provide the identity of the binary files. They would need to be listed manually (to some extent). Doing so would make maintenance of the F<mrp> files very burdensome. Also, it would not be possible to separate the source in a mutually exclusive way. This would mean that certain source files would need to be distributed with more than one component. This is bad news, because it makes ownership unclear.
+
+=item 6
+
+Minimising component sizes minimises the amount of data that must be transferred between sites and to workstations. This is because if one file has changed within a component, the whole component must be re-released. Keeping components small increases the likely hood that entire components have not changed between builds, and hence do not need to be re-released or distributed.
+
+=item 7
+
+Minimising component sizes maximises customisation flexibility. This is because customisers can branch just the bits they need to, and continue to use the original components for everything else.
+
+=item 8
+
+Minimising component sizes inevitably means that there will be a large number of components. Each component needs to have a new version assigned each time it is released. Large numbers of components therefore increases the workload of the release engineer each time a release is made (thought points 7 and 8 may well out weigh this cost).
+
+=back
+
+=head3 My exporting seems unreliable. How can I improve that?
+
+If you are behind any sort of firewall, you should use passive FTP connections. See the F<Installation> document for details of how.
+
+=head3 How can I run a sequence of Release Tools commands?
+
+Windows supports this syntax: C<command1 && command2>. This will first run C<command1>, then run C<command2> - but only if the first command succeeds. The release tools provide the proper information to Windows to allow it to make these decisions, so you can for example do:
+
+  getenv baseline 001 && getsource component
+
+or
+
+  getenv baseline 001 && cleanenv -rf
+
+or even
+
+  getenv baseline 001 && getsource component && cd \component && bldmake bldfiles && abld build thumb urel
+
+whilst making a cup of tea.
+
+But one caveat: currently, C<abld> doesn't correctly tell Windows whether it succeeded or failed. Any commands after C<abld> will always get run, irrespective of whether the build succeeded or failed.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/FundamentalConcepts	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,54 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# MakingReleases
+#
+
+=head1 Overview
+
+
+
+=head1 Fundamental Concepts
+
+Consider a project that is being developed by three geographically separated sites (A, B and C). Each site is contributes various pieces of software. Site A is responsible for coordinating the software deliveries between all sites. It is critical that all sites develop against a common environment.
+
+The release tools provide an efficient means for the different sites to share environments with one another. Each site defines its deliverables as components (a single site may have a single component, or several smaller ones). B<Arrrgggg, this section needs more thought!!>
+
+=head1 Considerations Before Making a Release
+
+Component releases are fundamentally mechanism for distributing binary files. Source files may also be distributed, but the binary files are the key focus. The release tools are not intended to be a replacement for conventional source control systems. However they do allow sites to store in their source control system only the files that they actually own, and rely on the binaries distributed by the release tools to complete their environment. Source for these binaries may be available for debugging purposes according to licensing agreements.
+
+So the release tools are generally used in conjunction with a source control system during development. Individual developers will use the command C<GetEnv> to install a particual environment onto their workstation. They would then check out of the source control system the components they plan to work on, make changes and perform builds to test those changes.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/FurtherInformation	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,42 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Further Information
+#
+
+=head1 Further Information
+
+There is a PowerPoint presentation available about the release tools.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/GetEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,212 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use EnvDb;
+use CommandController;
+use GetEnv;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $overwriteSource = 0;
+my $sourceInstallPath = undef;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'GetEnv');
+my $comp;
+my $ver;
+my $installSource = 0;
+my $removeSource =0;
+my $excludeComponents = undef;
+my $forceExclusion = 0;
+my $sourceOnly;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+if ($sourceOnly) {
+  GetEnvSource();
+}
+else {
+  GetEnv::GetEnvFromRelData($iniData, $comp, $ver, $installSource, $sourceInstallPath, $overwriteSource, $removeSource, $verbose, $excludeComponents, $forceExclusion);
+  print "Checking environment...\n";
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  (my $status) = $envDb->CheckEnv();
+  print "Status: ", EnvDb::StatusString($status), "\n";
+}
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 's' => \$installSource, 'o' => \$overwriteSource, 'r' => \$removeSource, 'v+' => \$verbose,  'i=s' => \$sourceInstallPath, 'x=s' => \$excludeComponents, 'f' => \$forceExclusion, 'source-only' => \$sourceOnly);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+
+  unless (defined $comp and defined $ver and $#ARGV = -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  if ($sourceInstallPath and not ($installSource || $sourceOnly )) {
+    print "Error: Invalid options - cannot specify install path (using -i) without installing source (using -s or --source-only)\n";
+    Usage(1);
+  }
+  
+  Utils::CheckDirectoryName($sourceInstallPath) if defined $sourceInstallPath;
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: getenv [options] <component> <external_version>
+
+options:
+
+-h  help
+-s  install source also
+-r  remove source which belongs to components deleted during upgrade
+-i  <source_install_directory>
+-o  overwrite any existing source and binaries (including pending release components)
+-v  verbose output (-vv very verbose)
+-x  <component_name> to exclude from installation or <file> with list of components to exclude (sets -r)
+-f  overrides the user prompt when removing components specified with the -x flag. Does nothing if -x not defined
+--source-only Installs the source code for any environment, irrespective of whether it is the current environment or not\n");
+}
+
+sub GetEnvSource {   
+    my $reldata = RelData->Open($iniData, $comp, $ver, $verbose);
+    my $components = $reldata->Environment();    
+    my $envDb = EnvDb->Open($iniData, $verbose);
+    
+    if (defined $excludeComponents) {
+      $components = GetEnv::FilterCompsToExclude($components, $excludeComponents, $verbose, $forceExclusion);
+    }
+    
+    foreach my $thisComp (sort keys %{$components}) {
+        eval {
+            print "Getting source for $thisComp $components->{$thisComp}...\n";
+            $envDb->UnpackSource($thisComp, $components->{$thisComp}, $sourceInstallPath || "\\", $overwriteSource, $verbose);     
+        };
+    }
+}
+
+__END__
+
+=head1 NAME
+
+GetEnv - Installs the environment from which a component release was made.
+
+=head1 SYNOPSIS
+
+  getenv [options] <component> <version>
+
+options:
+
+  -h  help
+  -s  install source also
+  -r  removes source which belongs to components deleted during upgrade
+  -i  <source_install_directory>
+  -o  overwrite any existing source and binaries (including components pending release)
+  -v  verbose output (-vv very verbose)
+  -x  <component_name> to exclude from installation or <file> with list of components to exclude (sets -r)
+  -f  overrides the user prompt when removing components specified with the -x flag. Does nothing if -x not defined.
+  --source-only Installs the source code for any environment, irrespective of whether it is the current environment or not
+
+=head1 DESCRIPTION
+
+When a release is made, a description of the environment it was made from is stored with it. C<GetEnv> reads this and installs the necessary components into the current environment in order to make it identical to the environment from which the release was made. Note, the term I<environment> is used to mean the F<\epoc32> tree. C<GetEnv> will optionally install source code into the root of the current drive, but it makes no attempt to verify the cleanliness of these directories.
+
+Components that were present in the release environment, but which are not present in the current environment are simply installed. Components of a different version in the current environment to that of the release environment are upgraded. The upgrade process involves removing the currently installed binaries, and then unpacking the new binaries. The binaries of components that have the same version in the current environment to that of the release environment are checked against the time stamp information that was stored when they were installed. If the check fails, the component is upgraded. If it succeeds, the component left untouched.
+
+As well as overwriting existing source code, C<-o> will overwrite any binaries which are left on the drive. There will only be leftover binaries in exceptional circumstances; normally C<getenv> will remove old versions of components before trying to install new ones. C<-o> will also force 'pending release' components to be removed if necessary.
+
+Unrequired components, (e.g. documentation), can be optionally excluded from being installed using the -x flag and specifying the component name or a file which contains a list of component names (Wildcards are supported). If the unrequired component exists in the current environment the binaries and source will be removed from the current environment, if it does not currently exist the component will simply not be installed if it is in the new environment. This option should be used cautiously especially if making releases from your local work area.
+
+Examples of -x flag:
+
+	getenv -vos gt_techview_baseline <some_version> -x tools_e32toolp
+	
+	This will exclude the component tools_e32toolp from the new installation if it exists in the archive
+	
+	
+	
+	getenv -vos gt_techview_baseline <some_version> -x tools*
+	
+	This will exclude any components which begin with the string "tools" in their name from the new installation
+	
+	
+	
+	getenv -vos gt_techview_baseline <some_version> -x d:\exclude.txt
+	
+	This will exclude any components that are mentioned in the file from the new installation if they exist in the archive
+	(File can be named anything)
+	
+	
+	Format of the file:
+	
+	component_one
+	component_two
+	component_three
+	component*
+	
+	(All components are to be on seperate lines, empty lines are permitted).
+	
+	When using the * wildcard this must be at the end of the line.
+	
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/GetEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/GetEnv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,307 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package GetEnv;
+
+use strict;
+
+
+#
+# Public.
+#
+
+sub GetEnvFromRelData {
+  my $iniData = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $installSource = shift;
+  my $sourceInstallPath = shift;
+  my $overwriteSource = shift;
+  my $removeSource = shift;
+  my $verbose = shift;
+  my $excludeComponents = shift;
+  my $forceExclusion = shift;
+  
+  
+
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  $iniData->PathData()->CheckReleaseExists($comp, $ver);
+
+  print "Gathering environment information...\n";
+  my $relData = RelData->Open($iniData, $comp, $ver, $verbose);
+  my $env = $relData->Environment();
+  GetEnv($iniData, $env, $installSource, $sourceInstallPath, $overwriteSource, $removeSource, $verbose, $excludeComponents, $forceExclusion);
+}
+
+sub GetEnv {
+  my $iniData = shift;
+  my $env = shift;
+  my $installSource = shift;
+  my $sourceInstallPath = shift;
+  my $overwriteSource = shift;
+  my $removeSource = shift;
+  my $verbose = shift;
+  my $excludeComponents = shift;
+  my $forceExclusion = shift;
+
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  my %compsToInstall;
+  my %cleanComps;
+  my @compsToRemove;
+  
+  
+  # Edit the list of components if $excludeComponents is set
+  if (defined $excludeComponents){
+	  $env = FilterCompsToExclude($env, $excludeComponents, $verbose, $forceExclusion);
+  }
+  
+
+  # Check the status of each component in the new environment.
+  my $error = 0;
+  foreach my $thisComp (sort keys %{$env}) {
+    my $thisVer = $env->{$thisComp};
+    $iniData->PathData()->CheckReleaseExists($thisComp, $thisVer);
+
+    my $installedVer = $envDb->Version($thisComp);
+    if (defined $installedVer) {
+      if ($installedVer eq $thisVer) {
+        # The requested version is already installed, so check its status.
+        (my $status) = $envDb->CheckComp($thisComp);
+        if ($status == EnvDb::STATUS_CLEAN) {
+          # Do nothing.
+          if ($verbose) { print "$thisComp $thisVer is already installed, and is clean\n"; }
+          $cleanComps{$thisComp} = 1;
+        }
+        elsif ($status == EnvDb::STATUS_PENDING_RELEASE && !$overwriteSource) {
+          print "Error: $thisComp is pending release\n";
+          $error = 1;
+        }
+        elsif ($status == EnvDb::STATUS_DIRTY || $status == EnvDb::STATUS_DIRTY_SOURCE || $status == EnvDb::STATUS_PENDING_RELEASE) {
+          if ($verbose) { print "$thisComp $thisVer is already installed, but is dirty\n"; }
+          push (@compsToRemove, $thisComp);
+          $compsToInstall{$thisComp} = $thisVer;
+        }
+        elsif ($status == EnvDb::STATUS_NOT_INSTALLED) {
+          die;
+        }
+      }
+      else {
+        if ($envDb->Status($thisComp) == EnvDb::STATUS_PENDING_RELEASE && !$overwriteSource) {
+          print "Error: $thisComp is pending release\n";
+          $error = 1;
+        }
+        if ($verbose) { print "$thisComp $installedVer currently installed\n"; }
+        push (@compsToRemove, $thisComp);
+        $compsToInstall{$thisComp} = $thisVer;
+      }
+    }
+    else {
+      $compsToInstall{$thisComp} = $thisVer;
+    }
+  }
+
+  if ($error) {
+    die "\n";
+  }
+
+  # Add to the remove list components in the current environment that aren't in the new environment.
+  my $currentEnv = $envDb->VersionInfo();
+  foreach my $thisComp (keys %{$currentEnv}) {
+    unless (exists $compsToInstall{$thisComp} or exists $cleanComps{$thisComp}) {
+      (my $status) = $envDb->CheckComp($thisComp);
+      if ($status == EnvDb::STATUS_CLEAN) {
+	if ($verbose) { print "$thisComp currently installed (clean), but not in new environment - will be removed\n"; }
+	push (@compsToRemove, $thisComp);
+      }
+      elsif ($status == EnvDb::STATUS_DIRTY || $status == EnvDb::STATUS_DIRTY_SOURCE) {
+	if ($verbose) { print "$thisComp currently installed (dirty), but not in new environment - will be removed\n"; }
+	push (@compsToRemove, $thisComp);
+      }
+      elsif ($status == EnvDb::STATUS_PENDING_RELEASE) {
+	print "Warning: $thisComp is pending release - its binaries cannot be automatically removed.\n";
+	print "         Continue with GetEnv? [y/n] ";
+	my $response = <STDIN>;
+	chomp $response;
+	if (lc $response eq 'y') {
+	  # Remove EnvDb entry.
+	  my $ver = $envDb->Version($thisComp);
+	  if (defined $ver) {
+	    $envDb->DeleteSignature($thisComp, $ver);
+	    $envDb->SetVersion($thisComp, undef);
+	  }
+	  else {
+	    die;
+	  }
+	}
+	else {
+	  die "GetEnv aborted\n";
+	}
+      }
+      elsif ($status == EnvDb::STATUS_NOT_INSTALLED) {
+	die;
+      }
+    }
+  }
+
+  # Remove old binaries and source.
+  foreach my $thisComp (@compsToRemove) {
+    print "Removing $thisComp...\n";
+    
+    if ($removeSource) {
+      $envDb->DeleteSource($thisComp, 0, 1);
+    }
+    
+    $envDb->RemoveComponent($thisComp);
+  }
+
+  # Install new binaries (and possibly source).
+  foreach my $thisComp (sort keys %compsToInstall) {
+    my $thisVer = $compsToInstall{$thisComp};
+    print "Installing $thisComp $thisVer...\n";
+    $envDb->InstallComponent($thisComp, $thisVer, $overwriteSource);
+    if ($installSource) {
+      my $installPath = $sourceInstallPath;
+      if (!defined ($installPath)) {
+        $installPath="\\";
+      }
+      $envDb->UnpackSource($thisComp, $thisVer, $installPath, $overwriteSource, 1);
+    }
+  }
+}
+
+
+sub FilterCompsToExclude {
+	my $editEnv = shift;
+	my $excludeComp = lc (shift); 
+	my $verbose = shift;
+	my $forceExclusion = shift;
+	my $editFlag = 0;
+			
+	print "Checking components to exclude...\n";
+	
+	if(-f $excludeComp) {			# file
+		open FILE, "$excludeComp" or die "Unable to open exclude file $excludeComp - $!. Requested components for exclusion will not be excluded. ";
+		
+		while (<FILE>) {	
+			if(ExcludeComp($_, $editEnv, $verbose) and ($editFlag == 0)){
+				$editFlag = 1;
+			}
+		}				
+	}
+	else{							# single component name
+		if(ExcludeComp($excludeComp, $editEnv, $verbose)){
+			$editFlag = 1;
+		}
+	}	
+	
+	# Make user aware of what they are doing
+	if(($editFlag) and not ($forceExclusion)){
+		print "Are you happy to continue installing a Release with excluded components? - y/n\n";
+		my $input = <STDIN>;
+		unless($input =~ /^y$/i){
+			die "Getenv aborted.\n";
+		}	
+	}	
+	print "\n";	
+	return $editEnv;
+}
+
+
+sub ExcludeComp{
+	
+	my $component = shift;
+	my $env = shift;
+	my $verbose = shift;
+	my $editFlag = 0;
+
+	chomp ($component);
+	$component =~ s/\s+$//;
+	$component =~ s/^\s+//;	
+	$component = lc ($component);
+	
+	if($component =~ /^$/){					# empty string
+	}
+	elsif($component =~ /^[\w\.-]+\*$/){			# wild cards
+		$component =~ s!([\w\.-]+)\*$!$1!;
+		foreach my $comp (keys %{$env}){
+			if($comp =~ /^\Q$component\E/){
+				$editFlag = ExcludeComp($comp, $env, $verbose);
+			}
+		}
+	}	
+	elsif($component =~ /\*$/){
+		print "$component - did not understand line - ignoring.\n";	# do nothing
+	}			 
+	elsif($component !~ /\s/){				# possible component name
+		if (exists $$env{$component}){
+			print "$component will be excluded from the new environment as requested.\n" if $verbose;				
+			delete $$env{$component};
+			$editFlag = 1;
+		}
+		else{
+			print "$component is not in the archive so cannot exclude it from the new environment.\n" if $verbose;			
+		}
+	}
+	else{
+		print "'$component' contains spaces in its name - this is not a valid component name.\n";
+	}	
+	return $editFlag;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+GetEnv.pm - Provides an interface for installing and upgrading environments.
+
+=head1 INTERFACE
+
+=head2 GetEnv
+
+Expects to be passed an C<IniData> reference, a reference to a hash containing the required component release versions, a flag indicating if to install source, a source install path (which may be undefined), a flag indicating if to overwrite source, a flag indicating whether there are components to be excluded or not and a verboisty level. Installs the specified component releases by adding, removing and upgrading existing components as required.
+
+=head2 GetEnvFromRelData
+
+Expects to be passed an C<IniData> reference, a component name, a version, a flag indicating if to install source, a source install path (which may be undefined), a flag indicating if to overwrite source, a flag indicating whether there are components to be excluded or not and a verboisty level. Retreives the version information associated with the specified component release version, and calls C<GetEnv> to install them.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+
+__END__
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/GetSource	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,171 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $overwrite = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'GetSource');
+my $envDb;
+my $comp;
+my $ver;
+my $installDir = "\\";
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+GetSource();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'i=s' => \$installDir, 'o' => \$overwrite, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  Utils::CheckDirectoryName($installDir);
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+  
+  if (defined $comp and not defined $ver) {
+    $ver = $envDb->Version($comp);
+    unless (defined $ver) {
+      die "Error: $comp not installed\n";
+    }
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: getsource [options] [<component> [<version>]]
+
+options:
+
+-h  help
+-i  <install_directory>
+-o  overwrite any existing source
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub GetSource {
+  if (defined $comp) {
+    UnpackSource($comp, $ver, $installDir);
+  }
+  else {
+    print "About to unpack the source for the entire environment. Continue? [y/n] ";
+    my $response = <STDIN>;
+    if ($response =~ /^y$/i) {
+      my $versionInfo = $envDb->VersionInfo();
+      foreach my $thisComp (sort keys %{$versionInfo}) {
+        eval {
+          UnpackSource($thisComp, $versionInfo->{$thisComp}, $installDir);
+        };
+ 
+        if ($@) {
+          print $@;
+        }
+      }
+    }
+  }
+}
+
+sub UnpackSource {
+  my $comp = shift;
+  my $ver = shift;
+  my $dir = shift;
+
+  print "Getting source for $comp $ver...\n";
+  $envDb->UnpackSource($comp, $ver, $dir, $overwrite, 1);
+}
+
+
+__END__
+
+=head1 NAME
+
+GetSource - Installs the source code from a component release into the current environment.
+
+=head1 SYNOPSIS
+
+  getsource [options] [<component> [<version>]]
+
+options:
+
+  -h  help
+  -i  <install_directory>
+  -o  overwrite any existing source
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Releases are generally made containing both source and binaries. By default, tools like C<GetEnv> and C<GetRel> only unpack the binaries. C<GetSource> provides a means of installing the source when it is required (e.g. for debugging purposes).
+
+If only a component name is specified, the source for the currently installed version of the component is unpacked into the root of the current drive. If the source code for a version of a component that is not currently installed is required, then specify both the version and a directory in which the source should be unpacked (this will be created if it does not already exist). If no arguments are specified, the source to all the installed components is unpacked into the root of the current drive.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/GetSource.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/HistoricPerspective	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,172 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Overview
+#
+
+=head1 Introduction
+
+The processes for distributing source and binaries between engineers has a large impact on the efficiency of both the development and integration phases of a project. The efficiency of these processes is even more significant when a project is being development between multiple sites that are geographically separated. The LPD release tools were written to make the human tasks necessary to distribute software as simple as possible. This document provides an historic perspective of the way things have been done in the past. It then goes on to present the main features of the release tools.
+
+=head1 History
+
+There have been two different distribution strategies for source and binaries:
+
+=over 4
+
+=item * Component Releases
+
+The component release strategy involves modularising the project into a set of named components. These generally map onto the source level modularisation. Component owners are identified and are responsible for compiling a set of binaries for use by the rest of the developers at regular intervals. An integration team is responsible for identifying a set of versioned releases that work together.
+
+Advantages
+
+=over 8
+
+=item *
+
+B<Pluggable.> Provided a new release is binary compatible with the previous release, it may be installed onto a development environment and run immediately (i.e. without having to re-compile and other components). If a problem is found with the release, the component can be quickly reverted to the previous version.
+
+=item *
+
+B<Easy to patch.> Because the integrated product is assembled from a set of versioned components, it is easy to re-release a single component that is found to be problematic, without having to touch the rest of the system. 
+
+=item *
+
+B<Minimises data transfer between sites.> Only newly released component need be distributed between sites.
+
+=item *
+
+B<Flexible for developers.> Developers can create their own configuration of component versions suitable for the task in hand. Also, developers can share their software with one another in a very efficient way. This is useful for authors of components that are highly dependent on one another, because they can form an 'integration cluster', and solve many problems before their components are released to the project at large.
+
+=item *
+
+B<Easy to reference.> Component version numbers encourage a common vocabulary between engineers ("I've found problem I<x> in verion I<y> of component I<z>", "I've fixed that in version I<y+1>").
+
+=back
+
+Disadvantages
+
+=over 8
+
+=item *
+
+B<Hard to maintain.> The original tools for automating the procedures for generating and unpacking releases were written using DOS-style batch files. These were notoriously cryptic and hard to maintain. As a result, releases were often missing files. Also, component scripts for populating a development drive were often broken.
+
+=item *
+
+B<Time consuming to prepare a new development drive.> Even when the scripts for populating a development drive were working correctly, they invariably took a long time to run. This generally led to developers either using a vastly cut down environment (that would not be suitable for reproducing certain types of problem) or updating their environments very seldomly (which often compounded integration problems).
+
+=item *
+
+B<Reliance on binary compatibility.> As already stated, the benefits of pluggable releases only come when releases are binary compatible with one another. If a component release is made than breaks binary compatibility, all the components that depend on it must be re-released also. This so called batton passing procedure can introduce significant delays and risks to integration.
+
+ 
+
+=back
+
+=item * Monolithic F<.zip> files
+
+Centralised builds were introduced when the EPOC build tools were over-halled. The new build technology allowed all of the components that make up EPOC to be built on the same machine using a uniform procedure (this was a massive step forward from the days when each component has a hand crafted build script). A build team is employed to run builds of the latest source on a regular basis. The output of these builds is then packaged into a small set of large F<.zip> files for distribution.
+
+Advantages
+
+=over 8
+
+=item *
+
+B<Eliminatates binary incompatibilities.> The inherent fragility of component releases as regards binary compatibility is eliminated - if all the project's components have been sucessfully built in the same environment there is no risk of incompatibility.
+
+=item *
+
+B<Simple distribution mechanism.> The set of large F<.zip> files are simple to install and provide a high degree of confidence that the environment generated on the build machine will be faithfully reproduced on other machines.
+
+=back
+
+Disadvantages
+
+=over 8
+
+=item *
+
+B<Slow transfer between sites.> Because the F<.zip> files contain everything, they are inherently large. A large binary transfer must therefore take place in order to distribute changes to even a very small number of components. This can be a huge problem for sites with low bandwidth connections, particularly if the file transfer mechanism is not reliable (as is often the case when using FTP without resume functionality). Transfer of a complete development environment can in the worst cases take several days.
+
+=item *
+
+B<Time consuming to prepare a new development drive.> Again due to the size of the F<.zip> files, even when available on a local network, they can be time consuming to install. As with component releases, this can result in developers not upgrading their development enviroments as often as they would like.
+
+=item *
+
+B<Hard to patch cleanly.> Patches are generally provided in the form of additional F<.zip> files. This introduces another level of complexity (and room for error) due to their ad-hock nature. Subtly different development environments may be produced by unpacking patches in the wrong order, for example.
+
+=item *
+
+B<Build team becomes a bottle neck.> During the integration phase of a project it is desirable for developers to receive environment updates as frequently as possible. However, the build cycle rate dictates the rate at which developers receive new development environments. A delayed build has the nasty side effect that it is likely to cause the next build to be delayed also, since a higher than normal volume of un-integrated code will be submitted. This can result in a very unpredictable build cycle rate, and overall project integration is likely to suffer as a result.
+
+=item *
+
+B<Hard to reference.> Build numbers are extremely coarse for referencing purposes. It is often difficult to get information on the state of an individual component from only a build number. This can make information exchanges between licensees (who only have a build number) and development engineers (who may not have a current installation of the relevant build) error prone and time consuming.
+
+=back
+
+=back
+
+=head1 A combined approach
+
+The previous section described a number of significant problems associated with each of the software distribution strategies that have been used in the past. The LPD release tools have been designed to build on the positive points mentioned above and to minimise the negative points. Fundamentally they opperate in a similar way to the 'component releases' strategy and so gain all the advantages of this approach. However, they also allow the use of a 'centralised build' strategy, thereby most of those advantages also. The main features are as follows:
+
+=over 4
+
+=item *
+
+B<Easy to maintain.> The tools are by and large maintenance free once configured. This is largely due to their reliance on the EPOC build tools to provide information about which binary files to include in a particular release. Also, when any release (or set of releases) is made, the tools store details of the exact environment from which this was done. This information can then be used by others to reproduce the release environment.
+
+=item *
+
+B<Upgradable development environments.> Development environments need not be prepared from scratch (i.e. on an empty drive) to ensure their cleanliness. The tools keep track of what has been installed in a particlar environment, and allow this to be upgraded. They also provide a means for verifying that the cleanliness of an environment (listing files that are known to not have originated from releases). Because development environments can be upgraded incrementally, the time taken to perform this opperation is vastly reduced.
+
+=item *
+
+B<Automatic release generation.> The tools can compare the output of a build (either full, or partial) and re-release only the components whose binaries have changed. This is significant because it allow a centralised build strategy to be married with the component release strategy, thereby eliminating problems concerning binary compatibility. It also means that a new build can be distributed by only transferring the components that have actually changed.
+
+=item *
+
+B<Automated delivery via FTP.> The tools are capable of automatically retrieving component releases made by remote sites from a central FTP server. They also provide a simple means of exporting releases to the FTP server. It is recommended that each project has a single FTP server to facilitate the transfer of releases between sites.
+
+=item *
+
+B<Automatic handling of IPR sensitive source.> When a release is made, the source code is categorized according to the F<distribution.policy> files present using C<IPRTOOL>. Before exporting releases to a central FTP server, these separately categorized source F<.zip> files are encrypted using PGP according to the data present in a project specific export configuration table. This table contains a complete list of each site concerned with the project, and their PGP key ids. It also contains a per-component list of which site is allowed to view which categories of source code. The correct set (according the the export table) of PGP keys are then used to encrypt each source F<.zip> file, thereby significantly reducing the risk of human error.
+
+=back
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ImportEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,258 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Path;
+use IniData;
+use RelData;
+use RelTransfer::Import;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $ftpResume = 0;
+my $iniData;
+my $commandController;
+my $envcomp;
+my $envver;
+my $passphraseFile;
+my $force;
+my $noPassphraseRetry;
+my %goodImports;
+my %failedImports;
+my %alreadyImported;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+ImportEnvironment();
+PrintReport();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "r" => \$ftpResume, "p=s" => \$passphraseFile, "f" => \$force, "noPassphraseRetry" => \$noPassphraseRetry);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $envcomp = lc($ARGV[0]);
+  $envver = $ARGV[1];
+
+  unless (defined $envcomp and defined $envver and $#ARGV = -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+  $iniData = IniData->New(undef,1);
+  $commandController = CommandController->New($iniData, 'ImportEnv');
+  #if ftp resume option is used override value in reltools.ini
+  if ($ftpResume) {
+    $iniData->FtpServerSupportsResume(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: importenv [options] <component> <external_version>
+
+options:
+
+-h  help
+-r  use FTP reconnect and resume transfer mode
+-v  verbose output (-vv very verbose)
+-p <file>  file containing passphrase
+-f  force the re-import of component releases
+--noPassphraseRetry  Will cause ImportEnv to terminate if an incorrect passphrase is specified
+
+N.B. You will be prompted for your passphrase unless the -p option is specified.
+Use of the -p option is NOT recommended though, as storing your passphrase in a file is considered a security risk.\n");
+}
+
+sub ReadPassphraseFile {
+  return undef unless $passphraseFile;
+  open(PP, $passphraseFile) or die "Couldn't open passphrase file \"$passphraseFile\" because $!\n";
+  my $passphrase = join ("\n", <PP>);
+  close PP;
+  return $passphrase;
+}
+
+sub ImportEnvironment {
+  my $importer = RelTransfer::Import->New(ini_data => $iniData, force => $force,
+					  verbose => $verbose, passphrase => ReadPassphraseFile);
+
+  #import the release to get the environment information
+  eval {
+    $importer->TransferRelease($envcomp, $envver, $noPassphraseRetry);
+  };
+  if ($@) {
+    print $@;
+    die "Aborting import of $envcomp $envver environment\n";
+  }
+
+  #read the environment information and transfer releases
+  print "Reading $envcomp $envver environment...\n" if ($verbose);
+  my $relData = RelData->Open($iniData, $envcomp, $envver, $verbose);
+  my %env = %{$relData->Environment()};
+
+  delete $env{$envcomp};
+
+  #do the import checking for errors
+
+  foreach my $comp (sort keys %env) {
+    my $imported;
+    my $ver = $env{$comp};
+    eval {
+      $imported = $importer->TransferRelease($comp, $ver, $noPassphraseRetry);
+    };
+    if ($@) {
+      print $@;
+      if ($@ =~ /cannot\s+connect/i) {
+        print "\nAborting import of $envcomp $envver environment\n";
+        last;
+      }
+      my $error = $@;
+      chomp $error;
+      $error =~ s/^error: ("?$comp $ver"? )?//i;
+      $failedImports{$comp}->{$ver} = $error;
+
+      print "Aborting import of $envcomp $envver environment\n";
+      last;
+    }
+    else {
+      if ($imported) {
+        push (@{$goodImports{$comp}}, $ver);
+      } else {
+        push (@{$alreadyImported{$comp}}, $ver);
+      }
+    }
+  }
+}
+
+sub PrintReport {
+  print "\n=========IMPORT SUMMARY==========\n";
+
+  my $tableData = [["Component", "Version", "status"]];
+
+  foreach my $comp (sort keys %goodImports) {
+    foreach my $ver (@{$goodImports{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'successfully imported']);
+    }
+  }
+    
+  foreach my $comp (sort keys %alreadyImported) {
+    foreach my $ver (@{$alreadyImported{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'has already been imported']);
+    }
+  }
+  
+  $iniData->TableFormatter->PrintTable($tableData, 1);
+
+  if (scalar (keys %alreadyImported) > 0) {
+    print "\nYou can specify the -f option to force the re-import of component releases\n";
+  }
+ 
+  if (keys %failedImports) {
+    print "\n=========FAILED IMPORTS==========\n";
+    print "\nImport Failure Summary\n\n";
+    my $failureTableData = [["Component", "Version", "Failure reason"]];
+    foreach my $comp (sort keys %failedImports) {
+      foreach my $ver (sort keys %{$failedImports{$comp}}) {
+        push (@$failureTableData, [$comp, $ver, $failedImports{$comp}->{$ver}]);
+      }
+    }
+    $iniData->TableFormatter->PrintTable($failureTableData, 1);
+    print "\nError: Unable to import environment successfully. Environment might be corrupted.\n";
+  }
+  else
+  {
+    if (keys %goodImports) {
+      print "\nEnvironment $envcomp $envver successfully imported\n";
+    } else {
+      print "\nNothing to do!\n";
+    }
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ImportEnv - Imports the environment from which a component release was made.
+
+=head1 SYNOPSIS
+
+  importenv [options] <component> <version>
+
+options:
+
+  -h  help
+  -r  use FTP reconnect and resume transfer mode
+  -v  verbose output (-vv very verbose)
+  -p <file>  file containing passphrase
+  -f  force the re-import of component releases
+  --noPassphraseRetry  Will cause ImportEnv to terminate if an incorrect passphrase is specified
+
+=head1 DESCRIPTION
+
+When a release is made, a description of the environment it was made from is stored with it.
+C<ImportEnv> takes a component name and version, reads the environment data for this
+component and imports the necessary releases from a remote site if they do not already
+exist on the local archive. If the environment data is not available from the local archive
+an attempt is made to import this component first.
+
+If the C<-r> option is used and the FTP connection is dropped during the download of a release, the tools will automatically reconnect to the FTP site and resume the download. This feature may not be supported by some FTP servers.
+
+It is recommended NOT to use the -p option; you will be prompted for your
+passphrase. Having a file containing your passphrase is be a security risk.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ImportEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ImportRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,287 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Path;
+use IniData;
+use RelTransfer::Import;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData;
+my $commandController;
+my $force = 0;
+my $ftpResume = 0;
+my %releases; # Data structure changed to a double hash (from a single hash).
+              # Top level keys are (case lowered) component names with has reference values.
+              # Second level hash keys are versions, with a dummy value.
+              # This arrangement makes it possible for a single component to have more than one
+              # version, and to easily delete versions that have already been imported.
+my $passphraseFile;
+my $noPassphraseRetry;
+my %goodImports;
+my %failedImports;
+my %alreadyImported;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+CheckAlreadyImported();
+ImportRelease() if (keys %releases); # It may be that all components have already been imported
+PrintReport();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "f" => \$force, "r" => \$ftpResume, "p=s" => \$passphraseFile, "noPassphraseRetry" => \$noPassphraseRetry);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if (scalar(@ARGV) == 1) {
+    if (-f $ARGV[0]) {
+      open IN, $ARGV[0] or die "Error: Couldn't open $ARGV[0] for reading: $!\n";
+      while (my $line = <IN>) {
+	chomp $line;
+	$line =~ s/^\s*$//;
+	$line =~ s/#.*//;
+	if ($line eq '') {
+	  next; #Nothing left
+	}
+	my ($comp, $ver) = split(" ", $line);
+	if (defined $comp and defined $ver) {
+	  $releases{lc($comp)}->{$ver} = 1;
+	}
+	else {
+	  print "Error: Invalid file format in $ARGV[0]\n";
+	  Usage(1);
+	}
+      }
+      close IN;
+    }
+    else {
+      print "Error: $ARGV[0] is not a file\n";
+      Usage(1);
+    }
+  }	
+  elsif (scalar(@ARGV) == 2) {
+    $releases{lc($ARGV[0])}->{$ARGV[1]} = 1;
+  }
+  else {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+  $iniData = IniData->New(undef,1);
+  $commandController = CommandController->New($iniData, 'ImportRel');
+  #if ftp resume option is used override value in reltools.ini
+  if ($ftpResume) {
+    $iniData->FtpServerSupportsResume(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: importrel [options] (<component> <version>) | (<component_ver_list_file>)
+
+options:
+
+-h  help
+-f  force import overwriting if necessary
+-r  use FTP reconnect and resume transfer mode
+-p <file> file containing passphrase
+-v  verbose output (-vv very verbose)
+--noPassphraseRetry  Will cause ImportRel to terminate if an incorrect passphrase is specified\n");
+}
+
+sub CheckAlreadyImported {
+#remove releases from attempted imports if they already exist locally
+  unless ($force) {
+    foreach my $comp (sort keys %releases) {
+      foreach my $ver (keys %{$releases{$comp}}) {
+	my $loc = $iniData->PathData->LocalArchivePathForExistingComponent($comp, $ver);
+	if ($loc && -d $loc) { 
+	  push (@{$alreadyImported{$comp}}, $ver);          
+	  print "$comp $ver already exists in local archive\n" if ($verbose);
+	  delete $releases{$comp}->{$ver};
+	  unless (scalar(keys %{$releases{$comp}}) > 0) {
+	    delete $releases{$comp};
+	  }
+	}	
+      }
+    }
+  }
+}
+
+sub ReadPassphraseFile {
+  return undef unless $passphraseFile;
+  open(PP, $passphraseFile) or die "Couldn't open passphrase file \"$passphraseFile\" because $!\n";
+  my $passphrase = join ("\n", <PP>);
+  close PP;
+  return $passphrase;
+}
+
+sub ImportRelease {
+  my $importer = RelTransfer::Import->New(ini_data => $iniData,
+					  force => $force,
+					  verbose => $verbose,
+            passphrase => ReadPassphraseFile);
+  #do the import
+  foreach my $comp (sort keys %releases) {
+    my $imported;
+    foreach my $ver (keys %{$releases{$comp}}) {
+      eval {
+        $imported = $importer->TransferRelease($comp, $ver, $noPassphraseRetry);
+      };
+      if ($@) {
+        print $@;
+        if ($@ =~ /cannot\s+connect/i) {
+          print "\nConnection to remote site dropped aborting import\n";
+          last;
+        }
+        my $error = $@;
+        chomp $error;
+        $error =~ s/^error: ("?$comp $ver"? )?//i;
+        $failedImports{$comp}->{$ver} = $error;
+      }
+      else {
+        if ($imported) {
+          push (@{$goodImports{$comp}}, $ver);
+        } else {
+          push (@{$alreadyImported{$comp}}, $ver);
+        }
+      }
+    }
+  }
+}
+
+sub PrintReport { 
+  print "\n=========IMPORT SUMMARY==========\n";
+
+  my $tableData = [["Component", "Version", "status"]];
+
+  foreach my $comp (sort keys %goodImports) {
+    foreach my $ver (@{$goodImports{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'successfully imported']);
+    }
+  }
+    
+  foreach my $comp (sort keys %alreadyImported) {
+    foreach my $ver (@{$alreadyImported{$comp}}) {
+      push (@$tableData, [$comp, $ver, 'has already been imported']);
+    }
+  }
+  
+  if (scalar @{$tableData} > 1) {
+    $iniData->TableFormatter->PrintTable($tableData, 1);
+  }
+  
+  if (scalar (keys %alreadyImported) > 0) {
+    print "\nYou can specify the -f option to force the re-import of component releases\n";
+  }
+  
+  #handle failed imports
+  if (keys %failedImports) {
+    print "\n=========FAILED IMPORTS==========\n";
+    my $failureTableData = [["Component", "Version", "Failure reason"]];
+    foreach my $comp (sort keys %failedImports) {
+      foreach my $ver (sort keys %{$failedImports{$comp}}) {
+        push (@$failureTableData, [$comp, $ver, $failedImports{$comp}->{$ver}]);
+      }
+    }
+    $iniData->TableFormatter->PrintTable($failureTableData, 1);
+    print "\nError: Unable to import component release successfully.  Component release might be corrupted.\n";
+  }
+  else
+  {
+    if (keys %goodImports) {
+      print "\nAll releases imported successfully\n";
+    } else {
+      print "\nNothing to do!\n";
+    }
+  }
+}
+
+  
+__END__
+
+=head1 NAME
+
+ImportRel - Imports a component release from a remote site.
+
+=head1 SYNOPSIS
+
+  importrel [options] (<component> <version>) | (<component_ver_list_file>)
+
+options:
+
+  -h  help
+  -f  force import overwriting if necessary
+  -r  use FTP reconnect and resume transfer mode
+  -p <file> file containing passphrase
+  -v  verbose output (-vv very verbose)
+  --noPassphraseRetry  Will cause ImportRel to terminate if an incorrect passphrase is specified
+
+=head1 DESCRIPTION
+
+Attempts to import the component release specified on the command line from the projects remote site to the local archive.
+
+The name of file containing a list of components and versions maybe passed as an argument to the tool instead of a single component to import multiple releases.
+
+Using the C<-f> option will force releases to be imported even if they already exist in the local archive.
+
+If the C<-r> option is used and the FTP connection is dropped during the download of a release, the tools will automatically reconnect to the FTP site and resume the download. This feature may not be supported by some FTP servers.
+
+It is recommended NOT to use the C<-p> option as it may be a security risk. You will be prompted if a passphrase is needed.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ImportRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/IniData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1267 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package IniData;
+
+use strict;
+use FindBin;
+use File::Path;
+use File::Spec;
+use Utils;
+use PathData;
+
+our $cache = {}; # Persistent (private) cache
+
+$|++;
+
+#
+# Constants.
+#
+
+my $iniName = \ 'reltools.ini';
+my $envDir = undef; # only filled in when we do New()
+my $binDir = \ "$FindBin::Bin\\";
+my @standardIgnores = ('\\epoc32\\build\\*',
+           '\\epoc32\\wins\\c\\*',
+           '\\epoc32\\winscw\\c\\*',
+           '\\epoc32\\release\\*.ilk',
+           '\\epoc32\\release\\*.bsc',
+           '\\epoc32\\data\\emulator\\*.sys.ini',
+           '\\epoc32\\release\\tools\\*',
+           '\\epoc32\\release\\tools2\\*'
+          );
+
+# Support for target alias file
+use constant CBR_TARGET_ALIAS_LOCATION => scalar "\\epoc32\\tools\\variant\\";
+
+#
+# Constructor
+#
+
+sub New {
+  my $pkg = shift;  
+  my $filename = shift;
+  my $ignoreepocroot = shift;
+
+  if ( defined ($ENV{EPOCROOT}) or ! $ignoreepocroot ){
+     $envDir = \ Utils::PrependEpocRoot("\\epoc32\\relinfo\\");
+  }
+  
+  my $self = {};
+  
+  $self->{warnIniLocation} = 0;
+  # Support for target alias file
+  # This is a persistant flag.
+  # If set then a warning must be printed if either HasTargetPlatforms()
+  # or TargetPlatforms() is used. The flag is then cleared thus the warning is a one off.
+  # If clear this is because the cbrtargetsalias.cfg file has been found
+  # or the no_target_alias_warning flag is set in reltools.ini
+  $self->{mustWarnTargetAliasLocation} = 1;
+  if (defined $filename and -e $filename ) {
+    $self->{iniFileName} = $filename;
+  } elsif (defined $$envDir and -e "$$envDir$$iniName" ) {
+    $self->{iniFileName} = "$$envDir$$iniName";
+  } elsif (-e "$$binDir$$iniName") {
+    $self->{warnIniLocation} = 1;
+    $self->{iniFileName} = "$$binDir$$iniName";
+  } else {
+    my $msg = "Error: \"$$iniName\" not found in ";
+    $msg = $msg."either \"$$envDir\" or " if ( defined ($$envDir));
+    $msg = $msg."\"$$binDir\"\n";
+    die $msg;
+  }
+
+  if ($cache->{lc($self->{iniFileName})}) {           
+    return $cache->{lc($self->{iniFileName})};
+  }
+
+  foreach my $thisIgnore (@standardIgnores) {
+    push (@{$self->{binIgnore}}, $thisIgnore);
+  }
+
+  bless $self, $pkg; # $self isn't blessed until we know we need it
+
+  $self->ReadIni();
+
+  # Support for target alias file
+  if (!$ignoreepocroot) {
+    $self->{targetAliasName} = Utils::PrependEpocRoot(CBR_TARGET_ALIAS_LOCATION).'cbrtargetalias.cfg';
+
+    if ($self->ReadTargetAliasFile == 1) {
+      # Successful read so clear the warning flag
+      $self->{mustWarnTargetAliasLocation} = 0;
+    }
+  }
+
+  $cache->{lc($self->{iniFileName})} = $self;
+
+  return $self;
+}
+
+#
+# Public
+#
+
+sub DiffTool {
+  my $self = shift;
+  unless (exists $self->{diff_tool}) {
+    return undef;
+  }
+  return $self->{diff_tool};
+}
+
+sub RequireInternalVersions {
+  my $self = shift;
+  if (exists $self->{require_internal_versions}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub IgnoreSourceFilterErrors {
+  my $self = shift;
+  if (exists $self->{ignore_source_filter_errors}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub RemoteSiteType {
+  my $self = shift;
+
+  unless (exists $self->{remote_site_type}) {
+    $self->{remote_site_type} = 'FTP';
+  }
+  elsif ($self->{remote_site_type} =~ /(network|drive)/i) {
+    $self->{remote_site_type} = 'NetDrive';
+  }
+  elsif ($self->{remote_site_type} =~ /experimentalproxy/i) {
+    $self->{remote_site_type} = 'FTP::Proxy::Experimental';
+  }
+  elsif ($self->{remote_site_type} =~ /experimentalftp/i) {
+    $self->{remote_site_type} = 'FTP::Experimental';
+  }
+  elsif ($self->{remote_site_type} =~ /multivolumeexport/i) {
+    $self->{remote_site_type} = 'NetDrive::MultiVolumeExport';
+  }
+  elsif ($self->{remote_site_type} =~ /multivolumeimport/i) {
+    $self->{remote_site_type} = 'NetDrive::MultiVolumeImport';
+  }
+  elsif ($self->{remote_site_type} =~ /proxy/i) {
+    $self->{remote_site_type} = 'FTP::Proxy';
+  }  
+  else {
+    $self->{remote_site_type} = 'FTP';
+  }
+  return $self->{remote_site_type};
+}
+
+sub RemoteHost {
+  my $self = shift;
+  unless (exists $self->{remote_host}) {
+    return undef;
+  }
+  return $self->{remote_host};
+}
+
+sub RemoteUsername {
+  my $self = shift;
+  unless (exists $self->{remote_username}) {
+    return undef;
+  }
+  return $self->{remote_username};
+}
+
+sub RemotePassword {
+  my $self = shift;
+  unless (exists $self->{remote_password}) {
+    return undef;
+  }
+  return $self->{remote_password};
+}
+
+sub RemoteLogsDir {
+  my $self = shift;
+  unless (exists $self->{remote_logs}) {
+    return undef;
+  }
+  return $self->{remote_logs};
+}
+
+sub Proxy {
+  my $self = shift;
+  unless (exists $self->{proxy}) {
+    return undef;
+  }
+  return $self->{proxy};
+}
+
+sub ProxyUsername {
+  my $self = shift;
+  unless (exists $self->{proxy_username}) {
+    return undef;
+  }
+  return $self->{proxy_username};
+}
+
+sub ProxyPassword {
+  my $self = shift;
+  unless (exists $self->{proxy_password}) {
+    return undef;
+  }
+  return $self->{proxy_password};
+}
+
+sub PasvTransferMode {
+  my $self = shift;
+  if (exists $self->{pasv_transfer_mode}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub FtpServerSupportsResume {
+  my $self = shift;
+  if (defined $_[0]) {
+    $self->{ftp_server_supports_resume} = $_[0];
+  }
+  if (exists $self->{ftp_server_supports_resume}) {
+    return $self->{ftp_server_supports_resume} ? 1 : 0;
+  }
+  return 0;
+}
+
+sub FtpTimeout {
+  my $self = shift;
+  unless (exists $self->{ftp_timeout}) {
+    return undef;
+  }
+  return $self->{ftp_timeout};
+}
+
+sub FtpReconnectAttempts {
+  my $self = shift;
+  unless (exists $self->{ftp_reconnect_attempts}) {
+    return undef;
+  }
+  return $self->{ftp_reconnect_attempts};
+}
+
+sub TempDir {
+  my $self = shift;
+  if (exists $self->{temp_dir}) {
+    return $self->{temp_dir};
+  }
+  return undef;
+}
+
+sub MaxExportVolumeSize {
+  my $self = shift;
+  if (exists $self->{max_export_volume_size}) {
+    return $self->{max_export_volume_size};
+  }
+  else {
+    return 639 * 1024 * 1024;
+  }
+}
+
+sub PgpTool {
+  my $self = shift;
+
+  unless (exists $self->{pgp_tool}) {
+    $self->{pgp_tool} = 'PGP';
+  }
+  elsif ($self->{pgp_tool} =~ /(gpg|gnupg)/i) {
+    $self->{pgp_tool} = 'GPG';
+  }
+  else {
+    $self->{pgp_tool} = 'PGP';
+  }
+  return $self->{pgp_tool};
+}
+
+sub PgpEncryptionKeys {
+  my $self = shift;
+  unless (exists $self->{pgp_encryption_keys}) {
+    return [];
+  }
+  return $self->{pgp_encryption_keys};
+}
+
+sub PgpConfigPath {
+  my $self = shift;
+  unless (exists $self->{pgp_config_path}) {
+    return undef;
+  }
+  return $self->{pgp_config_path};
+}
+
+sub ExportDataFile {
+  my $self = shift;
+  unless (exists $self->{export_data_file}) {
+    die "Error: export_data_file keyword not specified in reltools.ini\n";
+  }
+  return $self->{export_data_file};
+}
+
+sub PathData {
+  my $self = shift;
+  unless (defined $self->{pathData}) {
+    $self->{pathData} = PathData->New($self->{verbose});
+  }
+  return $self->{pathData};
+}
+
+sub HtmlNotes {
+  my $self = shift;
+  return (exists $self->{html_notes});
+}
+
+sub FromMapping {
+  my $self = shift;
+  my @fromMapping;
+
+  if(defined @{$self->{from_mapping}}){
+    @fromMapping = @{$self->{from_mapping}};
+  }
+
+  return @fromMapping;
+}
+
+sub ToMapping {
+  my $self = shift;
+  my @toMapping;
+
+  if(defined @{$self->{to_mapping}}){
+    @toMapping = @{$self->{to_mapping}};
+  }
+
+  return @toMapping;
+}
+
+sub HasMappings {
+  my $self = shift;
+  my $result = 0;
+
+  if(defined @{$self->{from_mapping}} && defined @{$self->{to_mapping}} && Utils::SourceRoot() eq "\\"){
+    $result = 1;
+  }
+
+  return $result;
+}
+
+sub PerformMapOnFileName {
+  my $self = shift;
+  my $operand = shift;
+
+  my @fromMapping = $self->FromMapping();
+  my @toMapping  = $self->ToMapping();
+  my $fromMappingSize = @fromMapping;
+
+  unless($operand =~ /^\\.*/) {
+    $operand = "\\"."$operand";  # Add a \\ to the beginning, which is equal to srcroot.
+  }
+
+  if(@fromMapping) {
+    for(my $position = 0; $position<$fromMappingSize; $position++) {
+      if($operand =~ /^\Q$fromMapping[$position]\E/i){
+        $operand =~ s/^\Q$fromMapping[$position]\E/$toMapping[$position]/i;
+        last;
+      }
+    }
+  }
+
+  return $operand;
+}
+
+sub PerformReverseMapOnFileName {
+  my $self = shift;
+  my $operand = shift;
+
+  my @fromMapping = $self->FromMapping();
+  my @toMapping  = $self->ToMapping();
+  my $toMappingSize = @toMapping;
+
+  unless($operand =~ /^\\(.*)/) {
+    $operand = "\\"."$operand";  # Add a \\ to the beginning, which is equal to srcroot.
+  }
+
+  if(@toMapping) {
+    for(my $position = 0; $position<$toMappingSize; $position++) {
+      if($operand =~ /^\Q$toMapping[$position]\E/i){
+        $operand =~ s/^\Q$toMapping[$position]\E/$fromMapping[$position]/i;
+        last;
+      }
+    }
+  }
+
+  return $operand;
+}
+
+sub CheckFileNameForMappingClash {
+  my $self = shift;
+  my $fileName = shift;
+
+  my @toMapping  = $self->ToMapping();
+  my $dirName;
+
+  if($fileName =~ /^(.*)\\/) {
+    $dirName = $1;
+  }
+
+  if(@toMapping) {
+    foreach my $toMap (@toMapping) {
+      if($dirName =~ /^\Q$toMap\E/i) {
+        die "ERROR: Clash in mappings. The local mapping $toMap clashes with the source directory $dirName.\n";
+      }
+    }
+  }
+}
+
+sub RemoteSite {
+  my $self = shift;
+  my $verbose = shift;
+  unless (defined $self->{remoteSite}) {
+    my $module = 'RemoteSite::'.$self->RemoteSiteType();
+    eval "require $module";
+    $self->{remoteSite} = $module->New(host => $self->RemoteHost(),
+               username => $self->RemoteUsername(),
+               password => $self->RemotePassword(),
+               passive_mode => $self->PasvTransferMode(),
+               resume_mode => $self->FtpServerSupportsResume(),
+               proxy => $self->Proxy(),
+               proxy_username => $self->ProxyUsername(),
+               proxy_password => $self->ProxyPassword(),
+               max_export_volume_size => $self->MaxExportVolumeSize(),
+               verbose => $verbose);
+    die "Failed to create remote site object" unless ref $self->{remoteSite};
+  }
+  return $self->{remoteSite};
+}
+
+sub LocalArchivePath {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub RemoteArchivePath {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub ArchivePathFile {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub ListArchiveComponents {
+  require Carp;
+  Carp->import;
+  confess ("Obsolete method called");
+}
+
+sub BinariesToIgnore {
+  my $self = shift;
+  if (exists $self->{binIgnore}) {
+    return $self->{binIgnore};
+  }
+  return [];
+}
+
+sub DisallowUnclassifiedSource {
+  my $self = shift;
+  if (exists $self->{disallow_unclassified_source}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub Win32ExtensionsDisabled {
+  my $self = shift;
+  
+  if (exists $self->{disable_win32_extensions}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub CategoriseBinaries {
+  my $self = shift;
+  if (exists $self->{categorise_binaries}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub CategoriseExports {
+  my $self = shift;
+  if (exists $self->{categorise_exports}) {
+    return 1;
+  }
+  return 0;
+}
+
+sub RequiredBinaries {
+  my $self = shift;
+  my $component = lc(shift);
+  if (exists $self->{required_binaries}->{$component}) {
+    return $self->{required_binaries}->{$component};
+  }
+  elsif (exists $self->{required_binaries}->{default}) {
+    return $self->{required_binaries}->{default};
+  }
+  return undef;
+}
+
+sub TableFormatter {
+  my $self = shift;
+  require TableFormatter;
+  require POSIX;
+  # Not 'use' because not many commands draw tables so that would be a waste
+
+  if (!POSIX::isatty('STDOUT')) {
+    $self->{table_format} = "text";
+    $self->{table_format_args} = "";
+  }
+
+  unless (defined $self->{table_formatter}) {
+    my $format = $self->{table_format} || "text";
+    $self->{table_formatter} = TableFormatter::CreateFormatter($format, $self, $self->{table_format_args});
+  }
+
+  return $self->{table_formatter};
+}
+
+sub LatestVerFilter {
+  my $self = shift;
+  unless (exists $self->{latestver_filter}) {
+    return undef;
+  }
+  return $self->{latestver_filter};
+}
+
+sub IllegalWorkspaceVolumes {
+  my $self = shift;
+  if (defined $self->{illegal_workspace_volumes}) {
+    return @{$self->{illegal_workspace_volumes}};
+  }
+  return ();
+}
+
+#
+# Private
+#
+
+sub CheckMappingPath {
+  my $self = shift;
+  my $operand = shift;
+
+  # Is used to clean up the mapping path.
+
+  $operand =~ s/\//\\/g;
+
+  die "Error: The source_map path $operand must not include a drive letter.\n" if ($operand =~ /^.:/);
+  die "Error: The source_map path $operand must be an absolute path without a drive letter.\n" if ($operand !~ /^\\/);
+  die "Error: The source_map path $operand must not be a UNC path.\n" if ($operand =~ /^\\\\/);
+
+  #Remove any \\ at the end of the path.
+  if($operand =~ /(.*)\\$/){
+    $operand = $1;
+  }
+
+  return $operand;
+}
+
+sub BuildSystemVersion {
+  my $self = shift;
+  my $verbose = shift;
+  
+  if (exists $self->{sbs_version}) {
+  	print "User set the value of sbs_version to $self->{sbs_version}\n" if($verbose);
+    return $self->{sbs_version};
+  }
+  return "0";
+}
+
+sub ExtractMapping {
+  my $self = shift;
+  my $operand = shift;
+  my $epoc32dir = Utils::EpocRoot()."epoc32";
+
+  $operand =~ s/\s+$//;
+
+  if ($operand =~ /^(\S+)\s+(\S+)$/) {
+    my $archivePath = $self->CheckMappingPath($1);
+    my $localPath = $self->CheckMappingPath($2);
+
+    if($archivePath =~ /^\Q$epoc32dir\E/i){
+      die "ERROR: Archive path $epoc32dir... in source mapping is not allowed.\n";
+    }
+    elsif($localPath =~ /^\Q$epoc32dir\E/i){
+      die "ERROR: Local path $epoc32dir... in source mapping is not allowed.\n";
+    }
+
+    # Need to check whether the from location is already present in from_mapping array
+    if(defined @{$self->{from_mapping}}){
+      foreach my $fromMap (@{$self->{from_mapping}}) {
+        if(($archivePath =~ /^\W*\Q$fromMap\E\W*$/i) || ($fromMap =~ /^\W*\Q$archivePath\E\W*$/i)){
+          die "ERROR: Duplicate <archive_source_directory> $fromMap, <archive_source_directory> $archivePath found in source mappings.\n";
+  }
+      }
+    }
+
+    # Need to check whether the to location is already present in to_mapping array
+    if(defined @{$self->{to_mapping}}){
+      foreach my $toMap (@{$self->{to_mapping}}) {
+        if(($localPath =~ /^\W*\Q$toMap\E\W*$/i) || ($toMap =~ /^\W*\Q$localPath\E\W*$/i)){
+          die "ERROR: Duplicate <local_source_directory> $toMap, <local_source_directory> $localPath found in source mappings.\n";
+    }
+      }
+    }
+
+    push @{$self->{from_mapping}}, $archivePath;
+    push @{$self->{to_mapping}}, $localPath;
+  }
+  else{
+    die "ERROR: Incorrect usage of source_map keyword in reltools.ini. Expected input is source_map <archive_source_directory> <local_source_directory>\n";
+  }
+}
+
+sub ReadIni {
+  my $self = shift;
+
+  open (INI, $self->{iniFileName}) or die "Unable to open \"$self->{iniFileName}\" for reading: $!\n";
+
+  while (local $_ = <INI>) {
+    # Remove line feed, white space and comments.
+    chomp;
+    s/^\s*$//;
+    
+    # INC105677 - Warn user if remote_password contains an unescaped #
+    if (/remote_password\s+\S*[^\\\s]\#/) {
+      warn "Warning: remote_password appears to contain a comment (# characters need to be escaped)\n";
+    }
+    
+    s/(?<!\\)#.*//; # remove comments unless they are immediately preceded by \ (negative lookbehind assertion)
+    s/\\#/#/g; # now remove backslashes before # signs
+    
+    if ($_ eq '') {
+      # Nothing left.
+      next;
+    }
+
+    my $keyWord;
+    my $operand;
+    if (/^(\w+)\s+(.*)/) {
+      $keyWord = $1;
+      $operand = $2;
+    }
+    else {
+      # Must be a line with no operand.
+      $keyWord = $_;
+    }
+
+    unless (defined $keyWord) {
+      die "Error: Invalid line in \"$self->{iniFileName}\":\n\t$_\n";
+      next;
+    }
+
+    if ($keyWord =~ /^diff_tool$/i) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{diff_tool} = $operand;
+    }
+    elsif ($keyWord =~ /^require_internal_versions$/) {
+      $self->{require_internal_versions} = 1;
+    }
+    elsif ($keyWord =~ /^ignore_source_filter_errors$/) {
+      $self->{ignore_source_filter_errors} = 1;
+    }
+    elsif ($keyWord =~ /^html_notes$/) {
+      $self->{html_notes} = 1;
+    }
+    elsif ($keyWord =~ /^temp_dir$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $operand = File::Spec->catdir($operand);
+      $operand =~ s/[\\\/]$//;
+      if (!-d $operand  && length $operand) {
+        die "Error: Invalid line in \"$self->{iniFileName}\":\n\t$_\n$operand does not exist or is an invalid directory name\n";
+      }
+      $self->{temp_dir} = $operand;
+    }   
+    elsif ($keyWord =~ /^remote_site_type$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{remote_site_type} = $operand;
+    }
+    elsif ($keyWord =~ /^remote_host$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{remote_host} = $operand;
+    }
+    elsif ($keyWord =~ /^remote_username$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{remote_username} = $operand;
+    }
+    elsif ($keyWord =~ /^remote_password$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{remote_password} = $operand;
+    }
+    elsif ($keyWord =~ /^remote_logs_dir$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{remote_logs} = $operand;
+    }
+    elsif ($keyWord =~ /^pgp_tool$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{pgp_tool} = $operand;
+    }
+    elsif ($keyWord =~ /^pgp_encryption_key$/) {
+      Utils::StripWhiteSpace(\$operand);
+      push @{$self->{pgp_encryption_keys}}, $operand;
+    }
+    elsif ($keyWord =~ /^pgp_config_path$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{pgp_config_path} = $operand;
+    }
+    elsif ($keyWord =~ /^export_data_file$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{export_data_file} = $operand;
+    }
+    elsif ($keyWord =~ /^archive_path_file$/) {
+      $self->PathData->ProcessLine(\$keyWord, \$operand);
+    }
+    elsif ($keyWord =~ /^archive_path$/) {
+      $self->PathData->ProcessLine(\$keyWord, \$operand);
+    }
+    elsif ($keyWord =~ /^source_map$/) {
+       $self->ExtractMapping($operand);
+    }
+    elsif ($keyWord =~ /^no_ini_location_warning$/) {
+      $self->{warnIniLocation} = 0;
+    }
+    elsif ($keyWord =~ /^ignore_binary$/) {
+      Utils::StripWhiteSpace(\$operand);
+      push (@{$self->{binIgnore}}, $operand);
+    }
+    elsif ($keyWord =~ /^proxy$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{proxy} = $operand;
+    }
+    elsif ($keyWord =~ /^proxy_username$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{proxy_username} = $operand;
+    }
+    elsif ($keyWord =~ /^proxy_password$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{proxy_password} = $operand;
+    }
+    elsif ($keyWord =~ /^pasv_transfer_mode$/) {
+      $self->{pasv_transfer_mode} = 1;
+    }
+    elsif ($keyWord =~ /^ftp_server_supports_resume$/) {
+      $self->{ftp_server_supports_resume} = 1;
+    }
+    elsif ($keyWord =~ /^ftp_timeout$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{ftp_timeout} = $operand;
+    }
+    elsif ($keyWord =~ /^ftp_reconnect_attempts$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{ftp_reconnect_attempts} = $operand;
+    }
+    elsif ($keyWord =~ /^max_export_volume_size$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{max_export_volume_size} = $operand;
+    }
+    elsif ($keyWord =~ /^disallow_unclassified_source$/) {
+      $self->{disallow_unclassified_source} = 1;
+    }
+    elsif ($keyWord =~ /^disable_win32_exten[ts]ions$/) {
+      $self->{disable_win32_extensions} = 1;
+    }
+    elsif ($keyWord =~ /^categori[sz]e_binaries$/) {
+      $self->{categorise_binaries} = 1;
+    }
+    elsif ($keyWord =~ /^categori[sz]e_exports$/) {
+      $self->{categorise_exports} = 1;
+    }
+    elsif ($keyWord =~ /^latestver_filter$/) {
+      Utils::StripWhiteSpace(\$operand);
+      require Text::Glob;
+      $self->{latestver_filter} = Text::Glob::glob_to_regex($operand);;
+    }    
+    elsif ($keyWord =~ /^required_binaries$/) {
+      Utils::StripWhiteSpace(\$operand);
+      (my $component, my $required, my $dummy) = split (/\s+/, $operand);
+      if ($dummy or not ($component and $required)) {
+        die "Error: Invalid line in \"$self->{iniFileName}\":\n\t$_\n";
+        next;
+      }
+      push (@{$self->{required_binaries}->{lc($component)}}, lc($required));
+    }
+    #Support for target alias file
+    elsif ($keyWord =~ /^no_target_alias_warning$/) {
+      $self->{mustWarnTargetAliasLocation} = 0;
+    }
+    elsif ($keyWord =~ /^table_format$/) {
+      Utils::StripWhiteSpace(\$operand);
+      (my $format, my $args) = $operand =~ m/^(\w+)(.*)$/;
+      Utils::StripWhiteSpace(\$args);
+      $self->{table_format} = $format;
+      $self->{table_format_args} = $args;
+    }
+    elsif ($keyWord =~ /^illegal_workspace_volumes$/) {
+      Utils::StripWhiteSpace(\$operand);
+      if ($operand !~ /^[a-z\s,]+$/i) {
+        die "Error: Invalid line in \"$self->{iniFileName}\":\n\t$_\n";
+      }
+      @{$self->{illegal_workspace_volumes}} = split /\s*,\s*/,$operand;
+    }
+    elsif ($keyWord =~ /^use_distribution_policy_files_first/) {
+      $self->{use_distribution_policy_files_first} = 1;
+    }
+    elsif ($keyWord =~ /^csv_separator$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{csv_separator} = $operand;
+    }
+    elsif ($keyWord =~ /^sbs_version$/) {
+      Utils::StripWhiteSpace(\$operand);
+      $self->{sbs_version} = $operand;
+    }
+    else {
+      die "Error: Unknown keyword \"$keyWord\" in \"$self->{iniFileName}\"\n";
+    }
+  }
+  
+  close (INI);
+
+  if ($self->{warnIniLocation}) {
+    if (defined $$envDir){
+       print "Warning: \"$$iniName\" not found in \"$$envDir\", using version found in \"$$binDir\"\n";
+    } else {
+       print "Warning: Using \"$$iniName\" version found in \"$$binDir\"\n";
+    }
+    print "         Use the keyword \"no_ini_location_warning\" to disable this warning.\n";
+  }
+}
+
+sub ReadTargetAliasFile {
+  my $self = shift;
+  
+  if (-e $self->{targetAliasName}) {
+    open (ALIAS, $self->{targetAliasName}) or die "Unable to open \"$self->{targetAliasName}\" for reading: $!\n";
+    # %allValuesSeenSoFar is a temporary hash of all the values seen so far
+    my %allValuesSeenSoFar = ();
+    # %aliasMap is the final hash of keys to values with all aliases expanded out
+    my %aliasMap = ();
+    $self->{alias_map} = {};
+    while (local $_ = <ALIAS>) {
+      # Remove line feed, white space and comments.
+      chomp;
+      s/^\s*$//;
+      s/(?<!\\)#.*//; # remove comments unless they are immediately preceded by \ (negative lookbehind assertion)
+      s/\\#/#/g; # now remove backslashes before # signs
+      if ($_ eq '') {
+        # Nothing left.
+        next;
+      }
+      my $keyWord;        # The key field
+      my @valueList;      # The list of values as read from the line.
+      my %seen = ();      # Temporary hash for making values on the line unique
+      if (/^\s*(\S+)\s+(.+)/) {
+        # Uppercase significant
+        $keyWord = uc($1);
+        @valueList = split /\s+/, uc($2);
+        # Check the key for:
+        # A key that has been seen as already as a value i.e. a forward reference - fatal error
+        # A key that has been seen as already as a key i.e. a duplicate key - fatal error
+        if (exists $allValuesSeenSoFar{$keyWord}) {
+          die "Fatal error: Line \"$_\" in $self->{targetAliasName} has forward reference to \"$keyWord\"\n";
+        }
+        elsif (exists $self->{alias_map}->{$keyWord}) {
+          die "Fatal error: Line \"$_\" in $self->{targetAliasName} has duplicate key \"$keyWord\"\n";
+        }
+        # Check for:
+        # Circular references - fatal error
+        # Duplicates in the value list - warn and ignore
+        foreach my $value (@valueList) {
+          if ($value eq $keyWord) {
+            die "Fatal error: Line \"$_\" in $self->{targetAliasName} has circular reference in \"$keyWord\"\n"
+          }
+          elsif (exists $seen{$value}) {
+            print "Warning Line \"$_\" in $self->{targetAliasName} has duplicate value entry \"$value\" in key $keyWord\n";
+          }
+          else {
+            # Add to seen map and uniqueList
+            $seen{$value} = 1;
+            $allValuesSeenSoFar{$value} = 1;
+          }
+        }
+        my @resolvedList = ();  # Resolved aliases
+        # Check for the special use of the value '<EMPTY>'
+        # If this is present then there must be no other values.
+        if (exists $seen{"<EMPTY>"}) {
+          if (scalar (keys %seen) > 1) {
+            die "Fatal error: Multiple targets in list declared \"<EMPTY>\" for alias \"$keyWord\"\n";
+          }
+        } else {
+          # Now can expand the unique list by resolving aliases against existing keys
+          foreach my $uniqueLine (keys %seen) {
+            if (exists $self->{alias_map}->{$uniqueLine}) {
+              # Expand the list to resolve the aliases
+              push(@resolvedList, @{$self->{alias_map}->{$uniqueLine}});
+            }
+            else {
+              # No alias resolution required, just add it
+              push(@resolvedList, $uniqueLine);
+            }
+          }
+        }
+        # Add the resolved list to the aliasMap
+        push( @{$self->{alias_map}->{$keyWord}}, @resolvedList);
+      }
+      else {
+        # A line with no value is illegal.
+        # Grab the key word
+        if (/^\s*(\S+)/) {
+          # Make uppercase as HasTargetPlatforms(), TargetPlatforms()
+          # expects uppercase keys
+          $keyWord = uc($1);
+        } else {
+          die "Fatal error: Fatal parser error.\n"
+        }
+        die "Fatal error: No targets detected for \"$keyWord\"\n"
+      }
+    unless (defined $keyWord) {
+      die "Error: Invalid line in \"$self->{targetAliasName}\":\n\t$_\n";
+      next;
+    }
+  }
+  close (ALIAS);
+  } else {
+    # Failed to find target alias file
+    return 0;
+  }
+  return 1; # Success at reading the file
+}
+
+# Support for target alias file
+# Returns 1 if target platforms exist for a given alias
+# or 0 if no target platforms exist for a given alias
+sub HasTargetPlatforms {
+  my $self = shift;
+  my $alias = shift;
+  $alias = uc($alias);
+  $self->CheckAliasWarning();
+  if (exists $self->{alias_map}) {
+    if (exists $self->{alias_map}->{$alias}) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+# Support for target alias file
+# Returns the arrary of target platforms for a given alias
+# or undef if no target platforms for a given alias
+sub TargetPlatforms {
+  my $self = shift;
+  my $alias = shift;
+  $self->CheckAliasWarning();
+  $alias = uc($alias);
+  if (exists $self->{alias_map}) {
+    if (exists $self->{alias_map}->{$alias}) {
+      return $self->{alias_map}->{$alias};
+    }
+  }
+  # Nothing found so return the callers argument
+  return [$alias];
+}
+
+sub CheckAliasWarning {
+  my $self = shift;
+  if ($self->{mustWarnTargetAliasLocation} == 1) {
+    print "Warning: \"$self->{targetAliasName}\" not found.\n";
+    print "         Use the keyword \"no_target_alias_warning\" to disable this warning.\n";
+   }
+  $self->{mustWarnTargetAliasLocation} = 0;
+}
+
+sub UseDistributionPolicyFilesFirst {
+  my $self = shift;
+  return !!$self->{use_distribution_policy_files_first};
+}
+
+sub CsvSeparator {
+  my $self = shift;
+  
+  if (defined $self->{csv_separator}) {
+    return $self->{csv_separator};
+  }
+  
+  return ',';
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+IniData.pm - Provides an interface to the data contained in reltools.ini.
+
+=head1 INTERFACE
+
+=head2 New
+
+Expects to find a file named F<reltools.ini> in the release tools directory, dies if it can't. Parses this file according to the following keywords / value pairs:
+
+ require_internal_versions
+ ignore_source_filter_errors
+ no_ini_location_warning
+ disallow_unclassified_source
+ categorise_binaries
+ categorise_exports
+ html_notes
+ archive_path                <archive_name> <archive_path> [<remote_archive_path>]
+ diff_tool                   <tool_name>
+ export_data_file            <file_name>
+ archive_path_file           <file_name>
+ source_map                  <archive_source_directory> <local_source_directory>
+ remote_site_type            <server_type>
+ remote_host                 <host_name>
+ remote_username             <user_name>
+ remote_password             <pass_word>
+ remote_logs_dir             <path>
+ pasv_transfer_mode
+ ftp_server_supports_resume
+ ftp_timeout                 <time_in_seconds>
+ ftp_reconnect_attempts      <positive_integer>
+ proxy                       <host_name>
+ proxy_username              <user_name>
+ proxy_password              <pass_word>
+ pgp_tool                    <tool_name>
+ pgp_encryption_key          <keyid>
+ pgp_config_path             <dir_name>
+ ignore_binary               <wild_file_name>
+ required_binaries           default wins_udeb
+ required_binaries           default thumb_urel
+ table_format                <table_format module>
+ csv_separator               <csv_separator_character>
+ sbs_version                 <symbian_build_system>
+
+It assumes # indicates the start of a comment, unless it is preceded by \.
+
+=head2 DiffTool
+
+Returns the name of the differencing tool specified with the C<diff_tool> keyword.
+
+=head2 RequireInternalVersions
+
+Returns true or false depending on whether the C<require_internal_versions> keyword has been specified.
+
+=head2 IgnoreSourceFilterErrors
+
+Returns true or false depending on whether the C<ignore_source_filter_errors> keyword has been specified.
+
+=head2 RemoteSiteType
+
+Returns the type of server hosting the projects remote release archive. Currently this will return either C<'FTP'>, C<'FTP::Proxy'>, C<'NetDrive'>, C<'NetDrive::MultiVolumeExport'> or C<'NetDrive::MultiVolumeImport'>. The default return value is C<'FTP'> if not set.
+
+=head2 RemoteHost
+
+Returns the host address of the project's remote site. If the remote site is an ftp server this will be an ftp address; if it is a network drive then the return value will be a UNC path.
+
+=head2 RemoteUsername
+
+Returns the username for the project's remote site.
+
+=head2 RemotePassword
+
+Returns the password for the project's remote site.
+
+=head2 RemoteLogsDir
+
+Returns the directory on the project's remote site where release notification logs are to be written.
+
+=head2 PasvTransferMode
+
+Returns true or false depending on whether the C<pasv_transfer_mode> keyword has been specified.
+
+=head2 FtpServerSupportsResume
+
+Returns true or false depending on whether the C<ftp_server_supports_resume> keyword has been specified.
+
+=head2 FtpTimeout
+
+Returns the timeout in seconds allowed before dropping the connection to the FTP server
+
+=head2 FtpReconnectAttempts
+
+Returns the number of attempts to reconnect to the FTP site if the connection is dropped
+
+=head2 Proxy
+
+Returns the FTP address of a proxy server used to connect to the project's FTP site.
+
+=head2 ProxyUsername
+
+Returns the username for a proxy server used to connect to the project's FTP site.
+
+=head2 ProxyPassword
+
+Returns the password for a proxy server used to connect to the project's FTP site.
+
+=head2 RemoteSite
+
+Tries to create a RemoteSite object appropriate to the data in the iniData, and return it. Caches the RemoteSite object so that it is only created once.
+
+=head2 MaxExportVolumeSize
+
+Returns the value specified by the keyword C<max_export_volume_size>. If this has not been specified, returns 639 * 1024 * 1024.
+
+=head2 PgpTool
+
+Returns the command line PGP client used to encrypt and decrypt releases.
+Currently this will return either C<'PGP'> for NAI Inc. PGP or C<'GPG'> for GNU Privacy Guard. The default return value is C<'PGP'> if not set.
+
+=head2 PgpEncryptionKeys
+
+Returns a reference to an array of PGP key ids (an 8 digit hexadecimal number) used to encrypt all release files before exporting to the remote site. Typically these values will correspond to the local sites project PGP keys so that the user may decrypt their own releases.
+
+=head2 PgpConfigPath
+
+Returns the directory where the users PGP configuration and keyring files are stored.
+
+=head2 ArchivePathFile
+
+Returns the name of the archive path file.
+
+=head2 ExportDataFile
+
+Returns the name of the export data file.
+
+=head2 LocalArchivePath
+
+Expects to be passed a component name. Returns the path to the component's local archive (generally on a LAN share).
+
+=head2 RemoteArchivePath
+
+Expects to be passed a component name. Returns the path to the component's remote archive (may be either on a Network share or an FTP site).
+
+=head2 ListArchiveComponents
+
+Returns a list of component names specified in the archive path file. One of these may be 'default' (if this has been specified). The directories pointed to by this may contain multiple components.
+
+=head2 BinariesToIgnore
+
+Returns a reference to a list of binaries to be ignored when scanning the F<\epoc32> tree. These may contain the C<*> wild character.
+
+=head2 DisallowUnclassifiedSource
+
+Returns false unless the C<disallow_unclassified_source> keyword has been specified.
+
+=head2 Win32ExtensionsDisabled
+
+Returns false unless the C<disable_win32_extensions> keyword has been specified. (Spelling C<disable_win32_extentions> also OK!)
+
+=head2 CategoriseBinaries
+
+Returns false unless the C<categorise_binaries> keyword has been specified.
+
+=head2 CategoriseExports
+
+Returns false unless the C<categorise_exports> keyword has been specified.
+
+=head2 TableFormatter
+
+Returns a TableFormatter object, which can be used to print a table.
+
+=head2 RequiredBinaries
+
+Expects to be passed a component name. Returns the required binaries for that component if any were specified using the C<required_binaries> keyword. If none were, then those specified using C<required_binaries default> are returned. If there are none of those either, then C<undef> is returned - this means that all binaries should be used.
+
+=head2 PathData
+
+Returns a PathData object appropriate to the path configuration data in the ini file. This may be a PathData::ProjectBased or a PathData::ComponentBased object.
+
+=head2 FromMapping
+
+Returns an array of <archive_source_directory> mappings. If there are no mappings defined an undefined value is returned.
+
+=head2 ToMapping
+
+Returns an array of <local_source_directory> mappings. If there are no mappings defined an undefined value is returned.
+
+=head2 HasMappings
+
+Returns false if no mappings are defined. Otherwise returns true.
+
+=head2 PerformMapOnFileName
+
+Reads a filename and takes all mappings defined into consideration with <archive_source_directory> being mapped to <local_source_directory>. Returns the new filename, with the mappings processed.
+
+=head2 PerformReverseMapOnFileName
+
+Reads a filename and takes all mappings defined into consideration with <local_source_directory> being mapped to <archive_source_directory>. Returns the new filename, with the mappings processed.
+
+=head2 CheckMappingPath
+
+Expects a mapping path which is checked. Any problems with the path are reported and the program exits. Otherwise returns the checked mapping path.
+
+=head2 ExtractMapping
+
+Is used to extract and store the local and archive mappings directories as defined. If an usage error is encountered, an error message is displayed and the program exits.
+
+=head2 CheckFileNameForMappingClash
+
+Is used to check if any of the mappings defined clash with the filename passed. If there is a clash an error message is shown and the program exits.
+
+=head2 HasTargetPlatforms
+
+Returns true if there is are any target platforms for a given alias. False otherwise.
+
+=head2 TargetPlatforms
+
+Returns a reference to a list containing either the platforms for a given alias or the alias itself (i.e. not an alias but a platform name).
+
+=head2 CsvSeparator
+
+Returns the separator to be used for CSV files, which by default is a comma ','.  Depending on the locale, the separator may be different.  The user can specify the separator required by using the C<csv_separator> keyword.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/InstCol2	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,383 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use File::Find;
+use File::Copy;
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use Utils;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $dummyRun = 0;
+my $interactive = 0;
+my $force = 0;
+my $wins = 1;
+my $wincw = 1;
+my $udeb = 1;
+my $urel = 1;
+my $comp;
+my %affectedExtentions;
+
+
+#
+# Constants.
+#
+
+my %searchPath = (
+		   wins => {
+			    udeb => '\\epoc32\\release\\wins\\udeb\\z',
+			    urel => '\\epoc32\\release\\wins\\urel\\z'
+			    },
+		   wincw => {
+			    udeb => '\\epoc32\\release\\wincw\\udeb\\z',
+			    urel => '\\epoc32\\release\\wincw\\urel\\z'
+			    }
+		 );
+my $KBinCompareChunkSize = 16 * 1024;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+my $files = FindFiles();
+CopyFiles($files);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ('bundling');
+  my $help;
+  my $extention;
+  my $winsOnly = 0;
+  my $wincwOnly = 0;
+  my $udebOnly = 0;
+  my $urelOnly = 0;
+  GetOptions('h' => \$help, 'f' => \$force, 'n' => \$dummyRun, 'i' => \$interactive, 'w' => \$winsOnly, 'c' => \$wincwOnly, 'd' => \$udebOnly, 'r' => \$urelOnly, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $extention = lc(shift @ARGV);
+  $comp = shift @ARGV;
+
+  unless ($extention and ($extention eq 'cl' or $extention eq 'bw')) {
+    print "Error: Invalid colour discription\n";
+    Usage(1);
+  }
+  unless (scalar (@ARGV) == 0) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+  if ($winsOnly and $wincwOnly) {
+    print "Error: -w and -c options are mutually exclusive\n";
+    Usage(1);
+  }
+  if ($udebOnly and $urelOnly) {
+    print "Error: -d and -r options are mutually exclusive\n";
+    Usage(1);
+  }
+
+  if ($winsOnly) {
+    $wincw = 0;
+  }
+  if ($wincwOnly) {
+    $wins = 0;
+  }
+  if ($udebOnly) {
+    $urel = 0;
+  }
+  if ($urelOnly) {
+    $udeb = 0;
+  }
+
+  %affectedExtentions = (
+			  ".a$extention" => '.aif',
+			  ".i$extention" => '.ini',
+			  ".m$extention" => '.mbm'
+			 );
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: instcol2 [options] cl | bw [<component>]
+
+options:
+
+-h  help
+-f  force a copy of everything (i.e. instcol behaviour)
+-n  dummy run (list what would be done, but doesn't do anything)
+-i  interactive mode (ask before copying each file)
+-w  WINS emulator only
+-c  WINCW emulator only
+-d  UDEB builds only
+-r  UREL builds only
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub FindFiles {
+  my @files;
+  if ($comp) {
+    FindCompFiles($comp, \@files);
+  }
+  else {
+    if ($wins) {
+      if ($udeb) {
+	DoFindFiles($searchPath{wins}->{udeb}, \@files);
+      }
+      if ($urel) {
+	DoFindFiles($searchPath{wins}->{urel}, \@files);
+      }
+    }
+    if ($wincw) {
+      if ($udeb) {
+	DoFindFiles($searchPath{wincw}->{udeb}, \@files);
+      }
+      if ($urel) {
+	DoFindFiles($searchPath{wincw}->{urel}, \@files);
+      }
+    }
+  }
+  return \@files;
+}
+
+sub FindCompFiles {
+  my $comp = shift;
+  my $files = shift;
+  my $iniData = IniData->New();
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  unless ($envDb->Version($comp)) {
+    print "Error: \"$comp\" is not currently installed\n";
+    Usage(1);
+  }
+  my $info = $envDb->ListBins($comp);
+  shift @$info; # Get rid of title.
+  foreach my $line (@$info) {
+    unless ($line->[0] =~ /^\\epoc32\\data/i) {
+      my $extention = lc (Extention($line->[0]));
+      if ($extention and ($line->[1] ne EnvDb::STATUS_STRING_MISSING) and exists $affectedExtentions{$extention}) {
+	push (@$files, lc($line->[0]));
+      }
+    }
+  }
+}
+
+sub DoFindFiles {
+  my $path = shift;
+  my $files = shift;
+  my $processFileSub = sub {
+    if (-f $File::Find::name) {
+      my $thisFile = lc($File::Find::name);
+      my $extention = Extention($thisFile);
+      if ($extention) {
+	if (exists $affectedExtentions{$extention}) {
+	  Utils::TidyFileName(\$thisFile);
+	  push (@$files, $thisFile);
+	}
+      }
+    }
+  };
+  if (-e $path) {
+    find($processFileSub, $path);
+  }
+}
+
+sub CopyFiles {
+  my $files = shift;
+  foreach my $thisFile (@$files) {
+    (my $path, my $name, my $ext) = Utils::SplitFileName($thisFile);
+    my $newExt = $affectedExtentions{$ext};
+    my $newName = Utils::ConcatenateDirNames($path, "$name$newExt");
+    CopyFile($thisFile, $newName);
+  }
+}
+
+sub CopyFile {
+  my $from = shift;
+  my $to = shift;
+
+  unless ($force) {
+    if (-e $to) {
+      (my $fromMtime, my $fromSize) = Utils::FileModifiedTimeAndSize($from);
+      (my $toMtime, my $toSize) = Utils::FileModifiedTimeAndSize($to);
+      if ($fromMtime == $toMtime) {
+	print "Last modified times of \"$from\" and \"$to\" are identical\n" if ($verbose > 2);
+	return;
+      }
+      if ($fromSize == $toSize) {
+	if (BinaryCompare($from, $to, $fromSize)) {
+	  print "Binary content of \"$from\" and \"$to\" are identical\n" if ($verbose > 2);
+	  return;
+	}
+	else {
+	  print "Binary content of \"$from\" and \"$to\" are different\n" if ($verbose > 1);
+	}
+      }
+      else {
+	print "Sizes of \"$from\" and \"$to\" are different\n" if ($verbose > 1);
+      }
+    }
+    else {
+      print "\"$to\" does not exist\n" if ($verbose > 1);
+    }
+  }
+
+  if ($interactive) {
+    print "Copy \"$from\" to \"$to\"? [y] ";
+    my $response = <STDIN>;
+    chomp $response;
+    unless ($response =~ /^y$/i or not $response) {
+      return;
+    }
+  }
+
+  if ($verbose) {
+    print "Copying \"$from\" to \"$to\"\n";
+  }
+  unless ($dummyRun) {
+    copy ($from, $to) or die "Error: Couldn't copy \"$from\" to \"$to\": $!\n";
+  }
+}
+
+sub BinaryCompare {
+  my $file1 = shift;
+  my $file2 = shift;
+  my $size = shift;
+  my $identical = 1;
+  open (FILE1, $file1) or die "Error: Couldn't open \"$file1\": $!\n";
+  open (FILE2, $file2) or die "Error: Couldn't open \"$file2\": $!\n";
+  binmode (FILE1);
+  binmode (FILE2);
+  my $bytesCompared = 0;
+  while ($bytesCompared < $size) {
+    my $buf1;
+    my $buf2;
+    my $bytesRead1 = read (FILE1, $buf1, $KBinCompareChunkSize);
+    my $bytesRead2 = read (FILE2, $buf2, $KBinCompareChunkSize);
+    unless ($bytesRead1 eq $bytesRead2) {
+      die "Error: Problem binary comparing \"$file1\" with \"$file2\": $!\n";
+    }
+    $bytesCompared += $bytesRead1;
+    if ($buf1 ne $buf2) {
+      $identical = 0;
+      last;
+    }
+  }
+  close (FILE1);
+  close (FILE2);
+  return $identical;
+}
+
+sub Extention {
+  my $fileName = shift;
+  (my $ext) = $fileName =~ /(\.[^\.]*)$/;
+  return $ext;
+}
+
+__END__
+
+=head1 NAME
+
+InstCol2 - A more controlled instcol.
+
+=head1 SYNOPSIS
+
+  instcol2 [options] cl | bw [<component>]
+
+options:
+
+  -h  help
+  -f  force a copy of everything (i.e. instcol behaviour)
+  -n  dummy run (list what would be done, but doesn't do anything)
+  -i  interactive mode (ask before copying each file)
+  -w  WINS emulator only
+  -c  WINCW emulator only
+  -d  UDEB builds only
+  -r  UREL builds only
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Symbian tools C<instcol> may be used to configure the emulator to be either colour or monochrome. Files with the extentions F<.aif>, F<.ini>, F<.mbm> are often provided in both colour and monochrome variants. The last two characters of the extention are replaced with F<cl> for colour, or F<bw> for monochrome. To install a particular variant, C<instcol> simply copies files with the required colour variant extention to files with the emulator required extention. For example, F<eikon.mcl> would be copied to a file named F<eikon.mbm> if the emulator were to be configured for colour.
+
+This emulator configuration technique has the unfortunate side effect of making development environments dirty from the point of view of the release tools. It is hoped that this problem will eventually disappear, if support for multiple colour variants of the emulator is dropped. In the meantime, C<InstCol2> was written to provide a higher degree of control over changes made to development environments than that offered by C<instcol>.
+
+C<InstCol2> only copies files if it really has to. A copy will only occur if:
+
+=over 4
+
+=item *
+
+The emulator required extention (F<.aif>, F<.ini> or F<.mbm>) copy of a particular file does not exist.
+
+=item *
+
+The emulator required extention copy for a particular file has a last modified time of less than the required colour variant of the file.
+
+=item *
+
+The emulator required exetention copy for a particular file contains different binary data to the required colour varaint of the file.
+
+=back
+
+=head1 EXAMPLES
+
+ instcol2 -wd cl
+
+Installs the colour variants for the WINS UDEB emulator.
+
+ instcol2 -cr bw alaunch
+
+Installs the monochrome variants for the WINCW UREL emulator for the component C<alaunch>.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/InstCol2.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/InstallSnapShot	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,269 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use CleanEnv;
+use GetEnv;
+
+
+#
+# Constants.
+#
+
+my $KMissingFileName = "__missing.txt";
+my $KCompsFileName = "__comps.txt";
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $reallyClean = 0;
+my $force = 0;
+my $snapShotFileName;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'InstallSnapShot');
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+InstallSnapShot();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ('bundling');
+  my $help;
+  GetOptions('h' => \$help, 'r' => \$reallyClean, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $snapShotFileName = shift @ARGV;
+  defined $snapShotFileName or die Usage(1);
+  unless ($snapShotFileName =~ /\.zip$/i) {
+    $snapShotFileName .= '.zip';
+  }
+
+  unless ($snapShotFileName and scalar(@ARGV) == 0) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: installsnapshot [options] <snap_shot_file_name>
+
+options:
+
+  -h  help
+  -r  really clean
+  -f  force (don't prompt)
+  -v  verbose output (-vv very verbose)\n");
+}
+
+sub InstallSnapShot {
+  my $newEnv = ReadSnapShotEnv();
+  CheckEnvAvailable($newEnv);
+  unless (CleanEnv::CleanEnv($iniData, $reallyClean, $force, $verbose)) {
+    die "\nAborting because environment was not cleaned...\n";
+  }
+  print "Installing snapshot environment...\n";
+  GetEnv::GetEnv($iniData, $newEnv, 0, undef, 0, 0, $verbose, undef, 0);
+  print "Unpacking \"$snapShotFileName\"...\n";
+  Utils::Unzip($snapShotFileName, Utils::EpocRoot(), $verbose, 1);
+  my $problems = 0;
+  unlink (Utils::PrependEpocRoot($KMissingFileName)) or (++$problems and print "Warning: Couldn't delete \"$KMissingFileName\": $!\n");
+  unlink (Utils::PrependEpocRoot($KCompsFileName)) or (++$problems and print "Warning: Couldn't delete \"$KMissingFileName\": $!\n");
+  my $missingFiles = ReadSnapShotMissingFiles();
+  foreach my $thisMissingFile (@$missingFiles) {
+    print "Removing \"$thisMissingFile\"...\n";
+    unlink $thisMissingFile or (++$problems and print "Warning: Couldn't delete \"$thisMissingFile\": $!\n");
+  }
+  if ($problems) {
+    print "There were problems installing this snapshot\n";
+  }
+  else {
+    print "Snapshot \"$snapShotFileName\" successfully installed\n";
+  }
+}
+
+sub CheckEnvAvailable {
+  my $env = shift;
+  print "Checking that all the component releases referred to by snap shot \"$snapShotFileName\" are available...\n" if ($verbose);
+  my $pathData = $iniData->PathData();
+  my $errors = 0;
+  foreach my $thisComp (sort keys %$env) {
+    unless ($pathData->ReleaseExists($thisComp, $env->{$thisComp})) {
+      print "Error: $thisComp $env->{$thisComp} is referred to by snap shot \"$snapShotFileName\" but does not exist\n";
+      $errors = 1;
+    }
+  }
+  if ($errors) {
+    die "Aborting (environment not altered)...\n";
+  }
+}
+
+sub ReadSnapShotEnv {
+  print "Reading snap shot environment details from \"$KCompsFileName\" within \"$snapShotFileName\"...\n" if ($verbose);
+  Utils::InitialiseTempDir($iniData);
+  my %env;
+  eval {
+    Utils::UnzipSingleFile($snapShotFileName, $KCompsFileName, Utils::TempDir(), $verbose);
+    my $file = Utils::ConcatenateDirNames(Utils::TempDir(), $KCompsFileName);
+    open (COMPS, $file) or die "Couldn't open \"$file\": $!\n";
+    while (my $line = <COMPS>) {
+      (my $comp, my $ver) = $line =~ /^(\S+)\s+(\S+)$/;
+      unless ($comp and $ver) {
+	die "Invalid line in \"$file\"\n";
+      }
+      $env{$comp} = $ver;
+    }
+    close (COMPS);
+  };
+  Utils::RemoveTempDir();
+  if ($@) {
+    die "Error: Problem reading environment from snap shot \"$snapShotFileName\": $@";
+  }
+  return \%env;
+}
+
+sub ReadSnapShotMissingFiles {
+  print "Reading list of files missing from snap shot environment from \"$KMissingFileName\" within \"$snapShotFileName\"...\n" if ($verbose);
+  Utils::InitialiseTempDir($iniData);
+  my @missingFiles;
+  eval {
+    Utils::UnzipSingleFile($snapShotFileName, $KMissingFileName, Utils::TempDir(), $verbose);
+    my $file = Utils::ConcatenateDirNames(Utils::TempDir(), $KMissingFileName);
+    open (MISSING, $file) or die "Couldn't open \"$file\": $!\n";
+    while (my $line = <MISSING>) {
+      chomp $line;
+      $line = Utils::PrependEpocRoot($line);
+      push (@missingFiles, $line);
+    }
+    close (MISSING);
+  };
+  Utils::RemoveTempDir();
+  if ($@) {
+    die "Error: Problem reading missing files from snap shot \"$snapShotFileName\": $@";
+  }
+  return \@missingFiles;
+}
+
+__END__
+
+=head1 NAME
+
+InstallSnapShot - Installs a snap shot created with MakeSnapShot.
+
+=head1 SYNOPSIS
+
+  installsnapshot [options] <snap_shot_file_name>
+
+options:
+
+  -h  help
+  -r  really clean
+  -f  force (don't prompt)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+The release tools exist to make it relatively straight forward to share binary files in a controlled way. In order to acheive a suitable level of control, a fair amount of rigor is imposed on users when they are making releases. There are times when this is inappropriate. For example, if a user wants to temporarily capture the current state of their environment. The commands C<MakeSnapShot> and C<InstallSnapShot> exist to make it easy to accurately capture the current state of an environment, and subsequently revert to it, without the overhead of doing a full environment release. Snap shots should only be used in preference to full environment releases when there is a B<temporary> need to capture an environment, because:
+
+=over 4
+
+=item 1
+
+No mechansims are provided for exporting or importing snap shots.
+
+=item 2
+
+No release notes are provided with snap shots.
+
+=item 3
+
+The contents of snap shots are inherently dirty - they consist of all the files that could not be accounted for with proper releases. Reliance on snap shots as a means of distributing software would therefore eventually become a self defeating activity since the snap shot files would get larger and larger over time.
+
+=back
+
+C<InstallSnapShot> uses a snap shot zip file generated by C<MakeSnapShot> to set the current environment state to that which the specified snap shot was made from. The following steps are performed:
+
+=over 4
+
+=item 1
+
+The environment is cleaned. If the C<-r> option is specified, files that are normally ignored (e.g. the contents of F<\epoc32\build>) are also removed. If the C<-f> option is specified, the cleaning process is carried out without warning the user before deleting files and reinstalling components.
+
+=item 2
+
+Component releases are installed, removed or upgraded in such a way as to set the current environment to that which was present when the snap shot was made.
+
+=item 3
+
+The contents of the snap shot zip file is installed, overwriting exisitng files, thereby restoring the snap shot, but at the same time making the environment dirty.
+
+=item 4
+
+Any files that were missing from the snap shot environment are removed from the current environment.
+
+=back
+
+C<MakeSnapShot> generates a zip file that contains all the dirty files currently present in the environment. It makes no attempt to understand which component own which files. It also creates some metadata that list the component versions currently installed. This can subsequently be used by C<InstallSnapShot> to revert to the snap shot state.
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/InstallSnapShot.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Installation	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,380 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 User Installation
+
+The configuration management team for the project you are working on will provide you with:
+
+=over 4
+
+=item 1
+
+A release tools distribution F<zip> file.
+
+=item 2
+
+A project specific configuration file (named F<reltools.ini>).
+
+=back
+
+To install the tools, do the following:
+
+=over 4
+
+=item 1
+
+Unpack a release tools distribution F<zip> file into a directory that is present in your path environment variable (or to a new directory and add this to your path).
+
+=item 2
+
+Set up a blank development area. Usually, this would be a substituted drive, but the EPOCROOT and SRCROOT environment variables are supported if you wish to use another mechanism. At this time, the @sdk syntax is not supported - you must explicitly set your EPOCROOT variable. The SRCROOT is assumed to be \ if it is not specified.
+
+=item 3
+
+Copy the F<reltools.ini> file into F<\epoc32\relinfo> in the drive you plan to do development for this project in. This drive should (prior to this) be completely empty. Note, if you are working on more than one project, each development drive must have its own configuration file.
+
+=item 4
+
+If you plan to use the C<DiffRel> command, you will need to add  a line to F<reltools.ini> that specifies the name of the differencing tool to use, e.g.:
+
+  diff_tool  windiff
+
+Note, the tool specifed must be capable of differencing the contents of a pair of directories given their names as command line arguments.
+
+=back
+
+=head1 Perl Versions
+
+The tools should work with Perl 5.005 or higher.
+
+Some tools, notably C<CheckBc>, require Perl version 5.6.1 or higher. This is avaialble from www.activestate.com. Any tools requiring this version of Perl will simply refuse to run: you need not worry about incorrect operation.
+
+At this time, Perl 5.8.0 has bugs and is not recommended.
+
+=head1 Full Configuration
+
+This section describes how to perform a full configuration of the release tools for a particular project. This task is generally undertaken by the project's configuration management team at the start of the project. However as the project evolves, its release structure is likely to evolve also, and so this section also provides the information necessary to maintain existing configuration files.
+
+=head2 reltools.ini
+
+The file F<reltools.ini> must be distributed in the same directory as the rest of the tools. In may contain the following configuration keyword / value pairs (note, the keywords are case sensitive).
+
+Text after # is assumed to be a comment, unless the comment is preceded by \ in which case the # is literal.
+
+=over 4
+
+=item * archive_path_file <file_name>
+
+=item * archive_path <project_name> <local_path> <remote_path>
+
+These keywords are used to inform the tools where to keep releases on the local and remote archives. See the section I<Archive Path> for full details. The first syntax (C<archive_path_file>) is the older style, and specifies where to find a file listing the exact location of each component. This may be a UNC style path to a file on a network share. The newer style lists several areas that the release tools should search to find a particular release.
+
+You must either have a single C<archive_path_file> line, or at least one C<archive_path> line. You cannot use both.
+
+=item * source_map <archive_source_directory> <local_source_directory>
+
+Defines source mappings which are to be applied to a release when using the release tools. A source mapping enables source directories to be extracted, from an archive, to specified locations on the working drive. Enables working on a release which has mapped source. Enables the user to make releases from a mapped location on the working drive to be stored with a specified directory structure in the archive.
+
+=item * export_data_file <file_name>
+
+Specifies the name of the project's export data file (see the section I<Export Data File>) path to a file on a network share. Use of this keyword is mandatory.
+
+=item * require_internal_versions
+
+Normally C<MakeRel> and C<MakeEnv> allow internal versions of releases to be optionally specified. If this keyword is present, they will insist that an internal version is specified.
+
+=item * ignore_source_filter_errors
+
+C<MakeRel> and C<MakeEnv> filter a releases source into C<zip> files corresponding to different categories. The tools can then be configured to restrict access to certain categories of source for each licensee/third party involved in the project. Currently the method for filtering source is to use C<iprtool>. By default, errors occuring during filtering will be stored in the releases C<reldata> file (and shown in the release notes). If this keyword is present, source filter errors will not be stored or shown.
+
+=item * disallow_unclassified_source
+
+By default, unclassified source (i.e. source directories that don't contain a F<distribution.policy> file detailing the source category) is classified as category 'X'. If this keyword is present, then unclassified source will generate an error when an attempt to release it is made (using either C<MakeRel> and C<MakeEnv>).
+
+=item * no_ini_location_warning
+
+By default the tools expect to find the F<reltools.ini> file in F<\epoc32\relinfo>. This is so a single installation of the tools can be used with multiple projects. However, if the file is not found there, it is looked for in the directory the tools are running from. If found, it will be used, but by default a warning is displayed to alert the user that they may be not using the configuration they had intended to use. To disable this warning, specify this keyword in the F<ini> file.
+
+=item * disable_win32_extensions
+
+By default the tools make use of various Win32 Perl modules. These have been found to be faulty on certain Perl releases and so this keyword can be used to disable functionality that depends on them. For the most part, disabling the functionality that uses Win32 will not result in reduced overall functionality, but certain operations may take longer to process. However, when they are disabled the tools will not be able to protect themselves against the user running commands concurrently in an unsafe way. It is therefore advisable to leave Win32 extensions enabled unless there is a good reason not to do so.
+
+=item * categorise_binaries
+
+By default component releases contain a single F<zip> file that holds all the released binaries. If this keyword is specified, the tools will categorise the binaries by build variant (e.g. C<wins udeb>, C<test thumb urel>, etc.). Having done this, the C<required_binaries> keyword can be used to choose a sub-set of the available binaries for a particular project. Note, this keyword can also be spelt C<categorize_binaries>. Note also, this keyword has only existed since release 2.50 of the tools. Any releases generated using categorised binaries must be installed using a version of the tools >= 2.50.
+
+=item * categorise_exports
+
+By default component exports (header files etc.) are included in the main binaries F<zip> file of each component release. This means that they are available to all parties that have access to the corresponding releases. If this keyword is specified, the tools will categorise exports according to the same rules as source code. This allows access to exports to be restricted in the same way as for source code (see the section F<Export Data File> below). Note, this keyword can also be spelt C<categorize_exports>. Note also, this keyword has only existed since release 2.59 of the tools. Any releases generated using categorised exports must be installed using a version of the tools >= 2.59.
+
+=item * required_binaries <component> <build_description>
+
+By default all available categories of binaries will be installed (when using C<GetRel> and C<GetEnv>) and exported (when using C<ExportRel> and C<ExportEnv>). This keyword can be used to choose a sub-set of the available binary categories (assuming that C<categorise_binaries> was used when the corresponding releases were made, if it wasn't then it will have no effect and you'll get everything). The C<component> argument may be either a valid component name or C<default> which applies to all components. This allows the general policy to be defined using C<default> and exceptions to be defined using specific component names. The C<build_description> argument must be a string made up from valid build commands, separated by underscore ('C<_>') characters. For example, to specify C<thumb> (both C<udeb> and C<urel>) and C<wins udeb> for all components, do:
+
+  required_binaries  default   thumb
+  required_binaries  default   wins_udeb
+
+To override the defaults for the component C<wserve> to C<armi urel> also, add:
+
+  required_binaries  wserv     thumb
+  required_binaries  wserv     wins_udeb
+  required_binaries  wserv     armi_urel
+
+To override the defaults for the component C<e32test> to just C<arm4> test code (both C<udeb> and C<urel>), add:
+
+  required_binaries  e32tools  test_arm4
+
+=item * html_notes
+
+Specifies the behaviour of the tools when displaying the release notes of components made with versions of the tools prior to v2.83.1014, whether to treat text as HTML (thereby allowing tags) or to render notes as plain text (in v2.nn.nn support for the <html> tags to specify whether text is HTML or not was added).
+
+=item * remote_site_type <server_type>
+
+Specifies the type of server hosting the projects remote archive used to share releases between different sites. Must be C<FTP> for an FTP server, C<proxy> for an FTP proxy server, C<NetDrive> for a network drive, C<MultiVolumeExport> to export multiple fixed size volumes, C<MultiVolumeImport> to import multiple volumes.
+
+=item * remote_host <host_name>
+
+Specifies host name of the remote site where the remote archive is stored. This will be a DNS or IP address if the remote site is an FTP site or a UNC path (ie \\server\share) if the remote site is a network drive.
+
+=item * remote_username <username>
+
+Specifies the username required to access the remote site. Not required if the remote site is a network drive.
+Also, not mandatory - if it is not specified in C<reltools.ini> then it will be prompted for when it is needed.
+
+=item * remote_password <password>
+
+Specifies the password required to access the remote site. Not required if the remote site is a network drive.
+Also, not mandatory - if it is not specified in C<reltools.ini> then it will be prompted for when it is needed.
+
+=item * remote_logs_dir <directory>
+
+An optional keyword which specifies a directory on the remote host in which to write a log of releases that have been successfully exported. The log is an empty file with a name composed of the component name and version.
+
+=item * pasv_transfer_mode
+
+If this keyword is specified and the remote site is an FTP server (or proxy) then the tools will connect to the server in passive mode. Passive mode is required to access some FTP sites (behind firewalls for example). If the export/import tools freeze after connecting then try using this keyword.
+
+=item * ftp_server_supports_resume
+
+If this keyword is specified and the remote site is an FTP server (or proxy) then the tools will attempt to reconnect and resume an export or import if the FTP connection is dropped during a file transfer. Some FTP servers may not support this feature so the default behaviour is to fail the export/import if the connection is dropped.
+
+=item * ftp_timeout
+
+Specifies the timeout (in seconds) for a connection to an FTP server. This should be set to higher values for poor connections. If not set a default value is chosen.
+
+=item * ftp_reconnect_attempts
+
+Specifies the number of attempts made to reconnect to an FTP server after the connection is dropped. This should be set to higher values for poor connections. If not set a default value is chosen.
+
+=item * proxy <host_name>
+
+Specifies the IP address or DNS name of an FTP proxy server used to access the FTP site containing the remote archive.
+
+=item * proxy_username <username>
+
+Specifies the username required to access the proxy server.
+Not mandatory - if it is not specified in C<reltools.ini> then it will be prompted for when it is needed.
+
+=item * proxy_password <password>
+
+Specifies the password required to access the proxy server.
+Not mandatory - if it is not specified in C<reltools.ini> then it will be prompted for when it is needed.
+
+=item * max_export_volume_size <size_in_bytes>
+
+This keyword relates to remote sites of type C<MultiVolumeExport>. It can be used to specify the maximum size an export volume may reach before then next one is started. By default a value of 670040064 (639 MB) is used, appropriate for volumes that will be transferred to CD.
+
+=item * pgp_tool <tool_name>
+
+The name of the command line PGP tool used to encrypt releases for export and decrypt imported releases. This must be set to either C<PGP> for Network Associates command line PGP (version 6 and 7) or C<GPG> for GNU Privacy Guard PGP tool (version 1.06).
+
+=item * pgp_encryption_key <keyid>
+
+Specifies the ID (an 8 digit hexadecimal number preceeded by C<0x> e.g C<0x8AF34E21>) of a PGP key which will be used to encrypt all release files before exporting to the remote site. This keyword may be used many times with each value being added to a list of key ids. Typically the value of this keyword will be set to the local teams project key id so that they may decrypt their own exported releases.
+
+=item * pgp_config_path <dir_name>
+
+Specifies the directory where the users PGP configuration and keyring files are stored. If not set the default value for the PGP tool will be used.
+
+=item * ignore_binary <wild_file_name>
+
+Specifies files in the F<\epoc32> tree that should be disregarded from the point of view of unknown origin status when an environment scan is performed (scans are done by C<EnvInfo>, C<MakeEnv> and C<CleanEnv>). As standard, the following are ignored (this keyword can be used to add to this list):
+
+ \epoc32\relinfo\*
+ \epoc32\build\*
+ \epoc32\wins\c\*
+ \epoc32\release\*.ilk
+ \epoc32\release\*.bsc
+ \epoc32\data\emulator\*.sys.ini
+
+Note, the only wild character supported is C<*>, and this is 'greedy'. For example, F<\epoc32\build\*> ignores everything in F<\epoc32\build> and all it's sub-directories. F<\epoc32\release\*.ilk> ignores any file ending in F<.ilk> in F<\epoc32\release> and all it's sub-directories.
+
+=item * diff_tool
+
+The tool that C<diffrel> should use to compare two releases.
+
+=item * table_format
+
+The format of the tables produced by the Release Tools. If omitted, text format is used. Tables are produced by many commands, such as C<envinfo>, C<bininfo>, C<latestver> and C<sourceinfo>. These can be difficult to view if the tables are too wide to fit in your terminal. Using this keyword selects an alternative table format. Use one of these options: text, CSV, HTML, Excel or Auto. "Auto" takes an extra argument, for example:
+
+  table_format auto excel
+
+It prompts the tools to show small tables as text, but to use Excel if they are too wide to fit, or have more than a certain number of rows. For normal usage, we recommend "auto excel" or "auto html" because they both auto-fit the column widths and produce easily legible tables.
+
+=back
+
+Here's an example F<reltools.ini> file:
+
+ require_internal_versions
+ disallow_unclassified_source
+ categorise_binaries
+ categorise_exports
+ diff_tool 			windiff
+ table_format                   auto excel
+ archive_path                   pixiework  \\pixieshare\config_man\archive\pixiestuff  /share/archive/pixiestuff
+ archive_path                   ourwork    \\pixieshare\config_man\archive\ourstuff  /share/archive/ourstuff
+ archive_path                   hurricane  \\pixieshare\config_man\archive\hurricane /share/archive/hurricane
+ export_data_file       	 \\pixieshare\config_man\reltools\export_data.csv
+ pgp_tool                       PGP
+ pgp_encryption_key             0x12345678
+ pgp_config_path                \\pixieshare\config_man\reltools\
+ remote_site_type               FTP
+ remote_host		 	ftp.pixie.com
+ remote_username		myusername
+ remote_password		mypassword
+ remote_logs_dir		/release_logs
+ proxy                          myproxyhost
+ proxy_username                 myproxyusername
+ proxy_password                 myproxypassword
+ pasv_transfer_mode
+ ftp_server_supports_resume
+ ftp_timeout                    60
+ ftp_reconnect_attempts         5
+ required_binaries              default wins_udeb
+ required_binaries              default thumb_urel
+
+=head2 Archive Path
+
+The release tools must know where to find (and put) a release, both on the local and remote archives. This information is used primarily whenever a release is made, exported or installed. There are two alternative mechanisms for supplying this information to the release tools. You should choose one or the other.
+
+=over 4
+
+=item Old-style Archive Path File
+
+Some licensees want a single file that lists the exact location of each component. The problem with this arrangement is that the file must be altered if a component moves from one place in the archive to another - which typically happens whenever a Symbian component is branched for the first time, or if responsibility for a component moves from one organisation to another.
+
+If you use a single archive path file, its location should be specified with the C<archive_path_file> keyword in the F<reltools.ini> file. It is recommended that a single copy of this file be placed on a network share, and referred to by the F<reltools.ini> file in the project's release tools distribution F<zip>. This will allow the file to be maintained without having to roll out a new distribution of the release tools. It is also advisable to restrict write access to the file to ensure it doesn't get changed in error.
+
+The archive path file exists to allow sites flexibility in the way their releases are archived. It also allows the maintainer of a remote host to allocate each site that will be delivering software their own directory with appropriate permissions.
+
+The file must contain lines in the following format:
+
+ <component_name> <local_archive_path> <remote_archive_path>
+
+It is also possible to specify a default path, to be used if the paths for a component have not been specified with the above syntax:
+
+ default <local_archive_path> <remote_archive_path>
+
+Here's an example archive path file:
+
+ # Miscellaneous components.
+ default \\pixieshare\release_archive\misc	/mycompany/pixie/misc
+
+ # Components delivered by our company.
+ comp1	\\pixieshare\release_archive\mycompany	/mycompany/pixie
+ comp2	\\pixieshare\release_archive\mycompany	/mycompany/pixie
+
+ # Components delivered by other companies.
+ comp3	\\pixieshare\release_archive\company_x	/company_x/pixie
+ comp4	\\pixieshare\release_archive\company_y	/company_y/pixie
+
+=item New-style Archive Paths
+
+The new mechanism fulfils the same purpose, but with additional flexibility. The release tools will search several areas for a particular release of a component. This allows components to be branched, or experimentally modified by several organisations, without the need to constantly adjust an F<archive_path.txt> file.
+
+With this mechanism, there is no F<archive_path.txt> file. Instead, statements in the F<reltools.ini> provide all the necessary information. These should appear as:
+
+ archive_path <project_name> <local_path> <remote_path>
+
+You would normally have several such lines, listing different areas to search. Each one should belong to one organisation, though an individual may even have their own repository. The project name is just a label, and is reported by various commands such as C<envinfo -f> depending on where the release is stored.
+
+ archive_path pixiework \\pixieshare\config_man\archive\pixiestuff /share/archive/pixiestuff
+ archive_path ourwork   \\pixieshare\config_man\archive\ourstuff   /share/archive/ourstuff
+ archive_path hurricane \\pixieshare\config_man\archive\hurricane  /share/archive/hurricane
+
+The directories are searched in the order they are listed; so if a gnome 002 exists in several places, the first one will be used. All releases are made into the first listed directory by default, though you can choose to place them into another project with the C<-w> switch to C<makerel> and C<makeenv>. When exporting, the release tools will put a release in the remote directory that corresponds to the relevant local directory. The same applies when importing.
+
+Ideally, all the local and remote paths will be different. However, if you're constained by an existing archive structure, you might want different projects to have different local archive paths, and the same remote archive path (or vice versa). In this case, when importing (for example) the release tools may have several possible local directories that they can put a release in. They always choose the one listed first in the F<reltools.ini>.
+
+=back
+
+=head2 Export Data File
+
+In order to use the commands C<ExportEnv> and C<ImportEnv> an export data file must be written and indicated in F<reltools.ini> with the C<export_data_file> keyword. A project's export data file contains a table detailing the source categories each site can have access to for each component. The raw data format of the file must be CSV (comma separated variables), but it is recommended that a spreadsheet such as Excel is used to prepare this to make sure data is in the correct columns. It is also recommended that a single copy of this file be placed on a network share, and referred to by the F<reltools.ini> file in the project's release tools distribution F<zip>. This will allow the file to be maintained without having to roll out a new distribution of the release tools. It is also advisable to restrict write access to the file to ensure it doesn't get changed in error.
+
+Here's an example layout:
+
+             | pgpkeyid_1 (recipient) | pgpkeyid_2 (recipient) | pgpkeyid_3 (recipient) |
+ ------------+------------------------+------------------------+------------------------+--
+ component_1 |          DE            |            E           |          CDE           |
+ ------------+------------------------+------------------------+------------------------+--
+ component_2 |          CDE           |                        |           DE           |
+ ------------+------------------------+------------------------+------------------------+--
+ component_3 |           DE           |            E           |        exclude         |
+ ------------+------------------------+------------------------+------------------------+--
+ component_4 |  exclude_bin DEFG      |       DEFG             |       DEFG             |
+
+
+
+The column headers must contain the recipients PGP key ID - an eight digit hexadecimal number preceeded by C<0x> (e.g C<0xD9A2CE15>). This public PGP key will be used to encrypt all files sent to the recipient. The name of the recipient may also be included in the column header although this is not mandatory.
+
+A cell contains a list of source categories available to the recipient of the component.
+ Each category must be a single letter or digit. Empty cells imply that the recipient
+ does not have access to any source for the corresponding component but can still receive
+binaries.
+
+To prevent a recipient from receiving both source and binaries for the corresponding component, use the keyword C<exclude>. This can be useful when certain recipients may receive releases of some but not all components.
+
+To prevent a recipient from receiving binaries for the corresponding component, use the keyword C<exclude_bin>. Unlike C<exclude>, this does not break any environment.
+
+Components which are not listed in the table but exist on the local site will not be exported to any recipients. However, a warning will be issued to alert the exporter of this situation.
+
+If a licensee or third party does not use C<DISTRIBUTION.POLICY> files to categorize source then all source will have the category X. In this case, putting X in a cell implies that all source for that component will be sent to the recipient, otherwise none will be sent.
+
+Lines starting with a C<#> are treated as comments and ignored.
+
+[NOTE: It is recommended that this file is created and maintained using a spreadsheet
+application (saving as a CSV file) rather than editing it directly.]
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/LatestVer	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,293 @@
+#!perl -w
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'LatestVer');
+my $envDb; # this is only created when needed, by the EnvDb() function
+my $listAll;
+my $userComp;
+my $everyComponent;
+my $versionFilter;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrintLatestVersions();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'a:i' => \$listAll, 'v+' => \$verbose, 'f=s' => \$versionFilter);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $userComp = shift @ARGV || undef;
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: latestver [options] [component] 
+
+options:
+
+-h   help
+-a   lists all versions in descending date order
+-a 6 list the most recent six versions
+-v   verbose output (-vv very verbose, -vvv very very verbose)
+-f <version wildcard> only show versions whose version numbers match that text\n");
+}
+
+sub PrintLatestVersions {
+  # Convert the version number filter from glob-style to perl-style RE
+  if (defined $versionFilter) {
+		require Text::Glob;
+		# Surprisingly complicated to convert a glob-style to a perl-style RE
+		# Hence we use a module. Not entirely convinced that Text::Glob
+		# does a particularly good job (e.g. the pattern t_make*[0] doesn't work)
+		# but it's better than my attempts, and should suffice for most cases.
+		$versionFilter = Text::Glob::glob_to_regex($versionFilter);
+	}
+
+  # First work out what components we need to process
+  my @compsToProcess;
+  if ($userComp) {
+    @compsToProcess = ($userComp);
+  } else {
+    # Call listcomponents with remote flag set as 0 and continue flag set as 1
+    @compsToProcess = sort @{$iniData->PathData->ListComponents(0,1)};
+  }
+
+  # Second work out what versions we need to process
+  my @compVersions; # contains lots of [ comp_name, reldata ]
+  foreach my $compName (@compsToProcess) {
+    foreach (@{GetRelevantRelDataObjects($compName, $versionFilter)}) {
+      push @compVersions, [ $compName, $_ ];
+    }
+  }
+
+  die "No versions were found.\n" unless (@compVersions);
+
+  # Third work out how verbose to make the output, and do it!
+  if ($verbose) {
+    my @tableData;
+    InsertTableHeadings(\@tableData);
+    AddTableEntry($$_[0], \@tableData, $$_[1]) foreach (@compVersions);
+    print "\n";
+    $iniData->TableFormatter->PrintTable(\@tableData, 1);
+  } else {
+    PrintMinimalVerbosity($$_[0], $$_[1]) foreach (@compVersions);
+  }
+}
+
+sub PrintMinimalVerbosity {
+  my $comp = shift;
+  my $reldata = shift;
+
+  my $ver = $reldata->Version();
+  if ($userComp) {
+    print "$ver\n";
+  } else {
+    print "$comp: $ver\n";
+  }
+}
+
+sub GetRelevantRelDataObjects {
+  my $comp = shift;
+  my $ver = shift;
+
+  my $shownum = $listAll;
+  $shownum = 1 unless defined $listAll;
+
+  my $relDataObjects = RelData->OpenSet($iniData, $comp, $verbose, $ver);
+  $relDataObjects ||= [];
+  splice(@$relDataObjects, $shownum) unless (scalar @$relDataObjects == 0) || ($shownum==0) || ($shownum > @$relDataObjects); # if showNum==0, we got just -a so show all
+  
+  return $relDataObjects;
+}
+
+sub InsertTableHeadings {
+  my $tableData = shift;
+
+  my @headings;
+  @headings = ('Version', 'Internal version', 'Project', 'Releaser', 'Date');
+  if ($verbose > 1) {
+    @headings = ('', @headings);
+  }
+  if ($verbose > 2) {
+    @headings = (@headings, 'Local path', 'Remote path');
+  }
+  if (!$userComp) {
+    @headings = ('Component', @headings);
+  }
+  push @$tableData, \@headings;
+}
+
+sub AddTableEntry {
+  my $comp = shift;
+  my $tableData = shift;
+  my $relData = shift;
+
+  my @fields;
+
+  my $ver = $relData->Version();
+  my $releaser = $relData->NotesSource()->{releaser};
+  chomp $releaser;
+  my $project = $iniData->PathData->ComponentProject($comp, $ver);
+  @fields = ($ver, $relData->InternalVersion(), $project, $releaser, $relData->NotesSource()->{date});
+
+  # We're being very verbose, so add a 'status' field
+  if ($verbose > 1) {
+    my $status = "";
+    # "Installed" flag
+    #
+    my $installedversion = EnvDb()->Version($comp);
+    $status .= "I" if ($installedversion && $installedversion eq $ver);
+
+    # "Exported" flag
+    my $remotePath||="";
+    eval {
+      my $remoteSite = $iniData->RemoteSite(0); # 0 = not verbose
+      if ($remoteSite) {
+        $remotePath = $iniData->PathData->RemoteArchivePathForExistingComponent
+          ($comp, $ver, $remoteSite);
+        $status .= "E" if ($remotePath && $remoteSite->FileExists("$remotePath/$comp$ver.zip") );
+      }
+    };
+
+    unshift @fields, $status;
+
+    if ($verbose > 2) {
+      # We're being extravagently verbose, so add two 'location' fields which will 
+      # wrap off the end of the line - sigh.
+      my $localPath = '"'. $iniData->PathData->LocalArchivePathForExistingComponent
+        ($comp, $ver) .'"';
+      $remotePath = '"'.$remotePath.'"' if ($remotePath);
+      $remotePath ||= '';
+      $localPath ||= '';
+      @fields = (@fields, $localPath, $remotePath);
+    }
+  }
+
+  # If we're listing several components, stick a field on the front
+  # saying which component we're talking about in this case
+  if (!$userComp) {
+    unshift @fields, $comp;
+  }
+  push @$tableData, \@fields;
+}
+
+sub EnvDb {
+  $envDb ||= EnvDb->Open($iniData, $verbose);
+}
+
+__END__
+
+=head1 NAME
+
+LatestVer - Prints the latest version of a particular component.
+
+=head1 SYNOPSIS
+
+  latestver [options] [component]
+
+options:
+
+  -h   help
+  -a   lists all versions in descending date order
+  -a <n>  lists the most recent 'n' versions in descending date order
+  -v   verbose output (-vv very verbose, -vvv very very verbose)
+  -f <wildcard> filter the versions displayed
+
+=head1 DESCRIPTION
+
+Prints the latest version of a particular component, or all known components if the component name is omitted. Optionally prints all versions in descending date order.
+
+If verbose output is requested, the internal version number, storage area ("project"), releaser's name and release time is also displayed.
+
+If very verbose output is requested, and the remote site is set in the reltools.ini file, a "flags" column will be shown with two possible letters:
+
+=over 4
+
+=item I
+
+This version is installed on your machine.
+
+=item E
+
+This version is exported.
+
+=back
+
+Using the -vv option may significantly increase the time this tool takes to run.
+
+If very very verbose is requested the local path is also output to screen.
+
+If you specify a -f version string then only versions whose version numbers contain that wildcard will be shown. The wildcard should be a glob-style regular expression (for example "*chinese*"). It is case-insensitive.
+
+If very very verbose output is requested, two more fields will show the location of the release on the local and remote archives.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/LatestVer.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,510 @@
+# Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+#
+# Copyright (c) 1998 Raphael Manfredi.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+#
+# MLDBM.pm
+#
+# store multi-level hash structure in single level tied hash (read DBM)
+#
+# Documentation at the __END__
+#
+# Gurusamy Sarathy <gsar@umich.edu>
+# Raphael Manfredi <Raphael_Manfredi@grenoble.hp.com>
+#
+
+require 5.004;
+use strict;
+
+####################################################################
+package MLDBM::Serializer;	## deferred
+
+use Carp;
+
+#
+# The serialization interface comprises of just three methods:
+# new(), serialize() and deserialize().  Only the last two are
+# _required_ to be implemented by any MLDBM serialization wrapper.
+#
+
+sub new { bless {}, shift };
+
+sub serialize { confess "deferred" };
+
+sub deserialize { confess "deferred" };
+
+
+#
+# Attributes:
+#
+#    dumpmeth:
+#	the preferred dumping method.
+#
+#    removetaint:
+#	untainting flag; when true, data will be untainted after
+#	extraction from the database.
+#
+#    key:
+#	the magic string used to recognize non-natively stored data.
+#
+# Attribute access methods:
+#
+#	These defaults allow readonly access. Sub-class may override
+#	them to allow write access if any of these attributes
+#	makes sense for it.
+#
+
+sub DumpMeth	{
+    my $s = shift;
+    confess "can't set dumpmeth with " . ref($s) if @_;
+    $s->_attrib('dumpmeth');
+}
+
+sub RemoveTaint	{
+    my $s = shift;
+    confess "can't set untaint with " . ref($s) if @_;
+    $s->_attrib('removetaint');
+}
+
+sub Key	{
+    my $s = shift;
+    confess "can't set key with " . ref($s) if @_;
+    $s->_attrib('key');
+}
+
+sub _attrib {
+    my ($s, $a, $v) = @_;
+    if (ref $s and @_ > 2) {
+	$s->{$a} = $v;
+	return $s;
+    }
+    $s->{$a};
+}
+
+####################################################################
+package MLDBM;
+
+$MLDBM::VERSION = $MLDBM::VERSION = '2.00';
+
+require Tie::Hash;
+@MLDBM::ISA = 'Tie::Hash';
+
+use Carp;
+
+#
+# the DB package to use (we default to SDBM since it comes with perl)
+# you might want to change this default to something more efficient
+# like DB_File (you can always override it in the use list)
+#
+$MLDBM::UseDB		= "SDBM_File"		unless $MLDBM::UseDB;
+$MLDBM::Serializer	= 'Data::Dumper'	unless $MLDBM::Serializer;
+$MLDBM::Key		= '$MlDbM'		unless $MLDBM::Key;
+$MLDBM::DumpMeth	= ""			unless $MLDBM::DumpMeth;
+$MLDBM::RemoveTaint	= 0			unless $MLDBM::RemoveTaint;
+
+#
+# A private way to load packages at runtime.
+my $loadpack = sub {
+    my $pack = shift;
+    $pack =~ s|::|/|g;
+    $pack .= ".pm";
+    eval { require $pack };
+    if ($@) {
+	carp "MLDBM error: " . 
+	  "Please make sure $pack is a properly installed package.\n" .
+	    "\tPerl says: \"$@\"";
+	return undef;
+    }
+    1;
+};
+
+
+#
+# TIEHASH interface methods
+#
+sub TIEHASH {
+    my $c = shift;
+    my $s = bless {}, $c;
+
+    #
+    # Create the right serializer object.
+    my $szr = $MLDBM::Serializer;
+    unless (ref $szr) {
+	$szr = "MLDBM::Serializer::$szr"	# allow convenient short names
+	  unless $szr =~ /^MLDBM::Serializer::/;
+	&$loadpack($szr) or return undef;
+	$szr = $szr->new($MLDBM::DumpMeth,
+			 $MLDBM::RemoveTaint,
+			 $MLDBM::Key);
+    }
+    $s->Serializer($szr);
+
+    #
+    # Create the right TIEHASH  object.
+    my $db = $MLDBM::UseDB;
+    unless (ref $db) {
+	&$loadpack($db) or return undef;
+	$db = $db->TIEHASH(@_)
+	  or carp "MLDBM error: Second level tie failed, \"$!\""
+	    and return undef;
+    }
+    $s->UseDB($db);
+
+    return $s;
+}
+
+sub FETCH {
+    my ($s, $k) = @_;
+    my $ret = $s->{DB}->FETCH($k);
+    $s->{SR}->deserialize($ret);
+}
+
+sub STORE {
+    my ($s, $k, $v) = @_;
+    $v = $s->{SR}->serialize($v);
+    $s->{DB}->STORE($k, $v);
+}
+
+sub DELETE	{ my $s = shift; $s->{DB}->DELETE(@_); }
+sub FIRSTKEY	{ my $s = shift; $s->{DB}->FIRSTKEY(@_); }
+sub NEXTKEY	{ my $s = shift; $s->{DB}->NEXTKEY(@_); }
+sub EXISTS	{ my $s = shift; $s->{DB}->EXISTS(@_); }
+sub CLEAR	{ my $s = shift; $s->{DB}->CLEAR(@_); }
+
+sub new		{ &TIEHASH }
+
+#
+# delegate messages to the underlying DBM
+#
+sub AUTOLOAD {
+    return if $MLDBM::AUTOLOAD =~ /::DESTROY$/;
+    my $s = shift;
+    if (ref $s) {			# twas a method call
+	my $dbname = ref($s->{DB});
+	# permit inheritance
+	$MLDBM::AUTOLOAD =~ s/^.*::([^:]+)$/$dbname\:\:$1/;
+	$s->{DB}->$MLDBM::AUTOLOAD(@_);
+    }
+}
+
+#
+# delegate messages to the underlying Serializer
+#
+sub DumpMeth	{ my $s = shift; $s->{SR}->DumpMeth(@_); }
+sub RemoveTaint	{ my $s = shift; $s->{SR}->RemoveTaint(@_); }
+sub Key		{ my $s = shift; $s->{SR}->Key(@_); }
+
+#
+# get/set the DB object
+#
+sub UseDB 	{ my $s = shift; @_ ? ($s->{DB} = shift) : $s->{DB}; }
+
+#
+# get/set the Serializer object
+#
+sub Serializer	{ my $s = shift; @_ ? ($s->{SR} = shift) : $s->{SR}; }
+
+#
+# stuff to do at 'use' time
+#
+sub import {
+    my ($pack, $dbpack, $szr, $dumpmeth, $removetaint, $key) = @_;
+    $MLDBM::UseDB = $dbpack if defined $dbpack and $dbpack;
+    $MLDBM::Serializer = $szr if defined $szr and $szr;
+    # undocumented, may change!
+    $MLDBM::DumpMeth = $dumpmeth if defined $dumpmeth;
+    $MLDBM::RemoveTaint = $removetaint if defined $removetaint;
+    $MLDBM::Key = $key if defined $key and $key;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+MLDBM - store multi-level hash structure in single level tied hash
+
+=head1 SYNOPSIS
+
+    use MLDBM;				# this gets the default, SDBM
+    #use MLDBM qw(DB_File FreezeThaw);	# use FreezeThaw for serializing
+    #use MLDBM qw(DB_File Storable);	# use Storable for serializing
+    
+    $dbm = tie %o, 'MLDBM' [..other DBM args..] or die $!;
+
+=head1 DESCRIPTION
+
+This module can serve as a transparent interface to any TIEHASH package
+that is required to store arbitrary perl data, including nested references.
+Thus, this module can be used for storing references and other arbitrary data
+within DBM databases.
+
+It works by serializing the references in the hash into a single string. In the
+underlying TIEHASH package (usually a DBM database), it is this string that
+gets stored.  When the value is fetched again, the string is deserialized to
+reconstruct the data structure into memory.
+
+For historical and practical reasons, it requires the B<Data::Dumper> package,
+available at any CPAN site. B<Data::Dumper> gives you really nice-looking dumps of
+your data structures, in case you wish to look at them on the screen, and
+it was the only serializing engine before version 2.00.  However, as of version
+2.00, you can use any of B<Data::Dumper>, B<FreezeThaw> or B<Storable> to
+perform the underlying serialization, as hinted at by the L<SYNOPSIS> overview
+above.  Using B<Storable> is usually much faster than the other methods.
+
+See the L<BUGS> section for important limitations.
+
+=head2 Changing the Defaults
+
+B<MLDBM> relies on an underlying TIEHASH implementation (usually a
+DBM package), and an underlying serialization package.  The respective
+defaults are B<SDBM_File> and D<Data::Dumper>.  Both of these defaults
+can be changed.  Changing the B<SDBM_File> default is strongly recommended.
+See L<WARNINGS> below.
+
+Three serialization wrappers are currently supported: B<Data::Dumper>,
+B<Storable>, and B<FreezeThaw>.  Additional serializers can be
+supported by writing a wrapper that implements the interface required by
+B<MLDBM::Serializer>.  See the supported wrappers and the B<MLDBM::Serializer>
+source for details.
+
+In the following, I<$OBJ> stands for the tied object, as in:
+
+	$obj = tie %o, ....
+	$obj = tied %o;
+
+=over 4
+
+=item $MLDBM::UseDB	I<or>	I<$OBJ>->UseDB(I<[TIEDOBJECT]>)
+
+The global C<$MLDBM::UseDB> can be set to default to something other than
+C<SDBM_File>, in case you have a more efficient DBM, or if you want to use
+this with some other TIEHASH implementation.  Alternatively, you can specify
+the name of the package at C<use> time, as the first "parameter".
+Nested module names can be specified as "Foo::Bar".
+
+The corresponding method call returns the underlying TIEHASH object when
+called without arguments.  It can be called with any object that
+implements Perl's TIEHASH interface, to set that value.
+
+=item $MLDBM::Serializer	I<or>	I<$OBJ>->Serializer(I<[SZROBJECT]>)
+
+The global C<$MLDBM::Serializer> can be set to the name of the serializing
+package to be used. Currently can be set to one of C<Data::Dumper>,
+C<Storable>, or C<FreezeThaw>. Defaults to C<Data::Dumper>.  Alternatively,
+you can specify the name of the serializer package at C<use> time, as the
+second "parameter".
+
+The corresponding method call returns the underlying MLDBM serializer object
+when called without arguments.  It can be called with an object that
+implements the MLDBM serializer interface, to set that value.
+
+=back
+
+=head2 Controlling Serializer Properties
+
+These methods are meant to supply an interface to the properties of the
+underlying serializer used.  Do B<not> call or set them without
+understanding the consequences in full.  The defaults are usually sensible.
+
+Not all of these necessarily apply to all the supplied serializers, so we
+specify when to apply them.  Failure to respect this will usually lead to
+an exception.
+
+=over 4
+
+=item $MLDBM::DumpMeth	I<or>  I<$OBJ>->DumpMeth(I<[METHNAME]>)
+
+If the serializer provides alternative serialization methods, this
+can be used to set them.
+
+With B<Data::Dumper> (which offers a pure Perl and an XS verion
+of its serializing routine), this is set to C<Dumpxs> by default if that
+is supported in your installation.  Otherwise, defaults to the slower
+C<Dump> method.
+
+With B<Storable>, a value of C<portable> requests that serialization be
+architecture neutral, i.e. the deserialization can later occur on another
+platform. Of course, this only makes sense if your database files are
+themselves architecture neutral.  By default, native format is used for
+greater serializing speed in B<Storable>.  Both B<Data::Dumper> and
+B<FreezeThaw> are always architecture neutral.
+
+B<FreezeThaw> does not honor this attribute.
+
+=item $MLDBM::Key  I<or>  I<$OBJ>->Key(I<[KEYSTRING]>)
+
+If the serializer only deals with part of the data (perhaps because
+the TIEHASH object can natively store some types of data), it may need
+a unique key string to recognize the data it handles.  This can be used
+to set that string.  Best left alone.
+
+Defaults to the magic string used to recognize MLDBM data. It is a six
+character wide, unique string. This is best left alone, unless you know
+what you are doing. 
+
+B<Storable> and B<FreezeThaw> do not honor this attribute.
+
+=item $MLDBM::RemoveTaint  I<or>  I<$OBJ>->RemoveTaint(I<[BOOL]>)
+
+If the serializer can optionally untaint any retrieved data subject to
+taint checks in Perl, this can be used to request that feature.  Data
+that comes from external sources (like disk-files) must always be
+viewed with caution, so use this only when you are sure that that is
+not an issue.
+
+B<Data::Dumper> uses C<eval()> to deserialize and is therefore subject to
+taint checks.  Can be set to a true value to make the B<Data::Dumper>
+serializer untaint the data retrieved. It is not enabled by default.
+Use with care.
+
+B<Storable> and B<FreezeThaw> do not honor this attribute.
+
+=back
+
+=head1 EXAMPLES
+
+Here is a simple example.  Note that does not depend upon the underlying
+serializing package--most real life examples should not, usually.
+
+    use MLDBM;				# this gets SDBM and Data::Dumper
+    #use MLDBM qw(SDBM_File Storable);	# SDBM and Storable
+    use Fcntl;				# to get 'em constants
+     
+    $dbm = tie %o, 'MLDBM', 'testmldbm', O_CREAT|O_RDWR, 0640 or die $!;
+    
+    $c = [\ 'c'];
+    $b = {};
+    $a = [1, $b, $c];
+    $b->{a} = $a;
+    $b->{b} = $a->[1];
+    $b->{c} = $a->[2];
+    @o{qw(a b c)} = ($a, $b, $c);
+    
+    #
+    # to see what was stored
+    #
+    use Data::Dumper;
+    print Data::Dumper->Dump([@o{qw(a b c)}], [qw(a b c)]);
+    
+    #
+    # to modify data in a substructure
+    #
+    $tmp = $o{a};
+    $tmp->[0] = 'foo';
+    $o{a} = $tmp;
+    
+    #
+    # can access the underlying DBM methods transparently
+    #
+    #print $dbm->fd, "\n";		# DB_File method
+
+Here is another small example using Storable, in a portable format:
+
+    use MLDBM qw(DB_File Storable);	# DB_File and Storable
+    
+    tie %o, 'MLDBM', 'testmldbm', O_CREAT|O_RDWR, 0640 or die $!;
+    
+    (tied %o)->DumpMeth('portable');	# Ask for portable binary
+    $o{'ENV'} = \%ENV;			# Stores the whole environment
+    
+
+=head1 BUGS
+
+=over 4
+
+=item 1.
+
+Adding or altering substructures to a hash value is not entirely transparent
+in current perl.  If you want to store a reference or modify an existing
+reference value in the DBM, it must first be retrieved and stored in a
+temporary variable for further modifications.  In particular, something like
+this will NOT work properly:
+
+	$mldb{key}{subkey}[3] = 'stuff';	# won't work
+
+Instead, that must be written as:
+
+	$tmp = $mldb{key};			# retrieve value
+	$tmp->{subkey}[3] = 'stuff';
+	$mldb{key} = $tmp;			# store value
+
+This limitation exists because the perl TIEHASH interface currently has no
+support for multidimensional ties.
+
+=item 2.
+
+The B<Data::Dumper> serializer uses eval().  A lot.  Try the B<Storable>
+serializer, which is generally the most efficient.
+
+=back
+
+=head1 WARNINGS
+
+=over 4
+
+=item 1.
+
+Many DBM implementations have arbitrary limits on the size of records
+that can be stored.  For example, SDBM and many ODBM or NDBM
+implementations have a default limit of 1024 bytes for the size of a
+record.  MLDBM can easily exceed these limits when storing large data
+structures, leading to mysterious failures.  Although SDBM_File is
+used by MLDBM by default, it is not a good choice if you're storing
+large data structures.  Berkeley DB and GDBM both do not have these
+limits, so I recommend using either of those instead.
+
+=item 2.
+
+MLDBM does well with data structures that are not too deep and not
+too wide.  You also need to be careful about how many C<FETCH>es your
+code actually ends up doing.  Meaning, you should get the most mileage
+out of a C<FETCH> by holding on to the highest level value for as long
+as you need it.  Remember that every toplevel access of the tied hash,
+for example C<$mldb{foo}>, translates to a MLDBM C<FETCH()> call.
+
+Too often, people end up writing something like this:
+
+        tie %h, 'MLDBM', ...;
+        for my $k (keys %{$h{something}}) {
+            print $h{something}{$k}[0]{foo}{bar};  # FETCH _every_ time!
+        }
+
+when it should be written this for efficiency:
+
+        tie %h, 'MLDBM', ...;
+        my $root = $h{something};                  # FETCH _once_
+        for my $k (keys %$root) {
+            print $k->[0]{foo}{bar};
+        }
+
+
+=back
+
+=head1 AUTHORS
+
+Gurusamy Sarathy <F<gsar@umich.edu>>.
+
+Support for multiple serializing packages by
+Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>>.
+
+Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+
+Copyright (c) 1998 Raphael Manfredi.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=head1 VERSION
+
+Version 2.00	10 May 1998
+
+=head1 SEE ALSO
+
+perl(1), perltie(1), perlfunc(1), Data::Dumper(3), FreezeThaw(3), Storable(3).
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM/Serializer/Data/Dumper.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,88 @@
+# Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+#
+# Copyright (c) 1998 Raphael Manfredi.
+# 
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package MLDBM::Serializer::Data::Dumper;
+BEGIN { @MLDBM::Serializer::Data::Dumper::ISA = qw(MLDBM::Serializer) }
+
+use Data::Dumper '2.08';		# Backward compatibility
+use Carp;
+
+#
+# Create a Data::Dumper serializer object.
+#
+sub new {
+    my $self = shift->SUPER::new();
+    my $meth = shift || "";
+    $meth = (defined(&Data::Dumper::Dumpxs) ? 'Dumpxs' : 'Dump')
+      unless $meth =~ /^Dump(xs)?$/;
+    $self->DumpMeth($meth);
+    $self->RemoveTaint(shift);
+    $self->Key(shift);
+    $self;
+}
+
+#
+# Serialize $val if it is a reference, or if it does begin with our magic
+# key string, since then at retrieval time we expect a Data::Dumper string.
+# Otherwise, return the scalar value.
+#
+sub serialize {
+    my $self = shift;
+    my ($val) = @_;
+    return undef unless defined $val;
+    return $val unless ref($val) or $val =~ m|^\Q$self->{'key'}|o;
+    my $dumpmeth = $self->{'dumpmeth'};
+    local $Data::Dumper::Indent = 0;
+    local $Data::Dumper::Purity = 1;
+    local $Data::Dumper::Terse = 1;
+    return $self->{'key'} . Data::Dumper->$dumpmeth([$val], ['M']);
+}
+
+#
+# If the value is undefined or does not begin with our magic key string,
+# return it as-is. Otherwise, we need to recover the underlying data structure.
+#
+sub deserialize {
+    my $self = shift;
+    my ($val) = @_;
+    return undef unless defined $val;
+    return $val unless $val =~ s|^\Q$self->{'key'}||o;
+    my $M = "";
+    ($val) = $val =~ /^(.*)$/s if $self->{'removetaint'};
+    # Disambiguate hashref (perl may treat it as a block)
+    my $N = eval($val =~ /^\{/ ? '+'.$val : $val);
+    return $M ? $M : $N unless $@;
+    carp "MLDBM error: $@\twhile evaluating:\n $val";
+}
+
+sub DumpMeth	{ my $s = shift; $s->_attrib('dumpmeth', @_); }
+sub RemoveTaint	{ my $s = shift; $s->_attrib('removetaint', @_); }
+sub Key		{ my $s = shift; $s->_attrib('key', @_); }
+
+# avoid used only once warnings
+{
+    local $Data::Dumper::Terse;
+}
+
+1;
+__END__
+
+=head1 AUTHORS
+
+Gurusamy Sarathy <F<gsar@umich.edu>>.
+
+Support for multiple serializing packages by
+Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>>.
+
+Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+
+Copyright (c) 1998 Raphael Manfredi.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM/Serializer/FreezeThaw.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+# Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+#
+# Copyright (c) 1998 Raphael Manfredi.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package MLDBM::Serializer::FreezeThaw;
+BEGIN { @MLDBM::Serializer::FreezeThaw::ISA = qw(MLDBM::Serializer) }
+
+use FreezeThaw;
+
+sub serialize {
+    return FreezeThaw::freeze($_[1]);
+}
+
+sub deserialize {
+    my ($obj) = FreezeThaw::thaw($_[1]);
+    return $obj;
+}
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+Gurusamy Sarathy <F<gsar@umich.edu>>.
+
+Support for multiple serializing packages by
+Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>>.
+
+Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+
+Copyright (c) 1998 Raphael Manfredi.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM/Serializer/Storable.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,64 @@
+# Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+#
+# Copyright (c) 1998 Raphael Manfredi.
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package MLDBM::Serializer::Storable;
+BEGIN { @MLDBM::Serializer::Storable::ISA = qw(MLDBM::Serializer) }
+
+use Storable;
+
+sub new {
+    my $self = shift->SUPER::new();
+    $self->DumpMeth(shift);
+    # Storable doesn't honor other attributes
+    $self;
+}
+
+#
+# Serialize a reference to supplied value
+#
+sub serialize {
+    my $self = shift;
+    my $dumpmeth = $self->{'_dumpsub_'};
+    &$dumpmeth(\$_[0]);
+}
+
+#
+# Deserialize and de-reference
+#
+sub deserialize {
+    my $obj = Storable::thaw($_[1]);		# Does not care whether portable
+    defined($obj) ? $$obj : undef;
+}
+
+#
+# Change dump method when portability is requested
+#
+sub DumpMeth {
+    my $self = shift;
+    $self->{'_dumpsub_'} = 
+      ($_[0] && $_[0] eq 'portable' ? \&Storable::nfreeze : \&Storable::freeze);
+    $self->_attrib('dumpmeth', @_);
+}
+
+1;
+__END__
+
+=head1 AUTHORS
+
+Gurusamy Sarathy <F<gsar@umich.edu>>.
+
+Support for multiple serializing packages by
+Raphael Manfredi <F<Raphael_Manfredi@grenoble.hp.com>>.
+
+Copyright (c) 1995-98 Gurusamy Sarathy.  All rights reserved.
+
+Copyright (c) 1998 Raphael Manfredi.
+
+This program is free software; you can redistribute it and/or
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM/Sync.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,596 @@
+# Copyright (c) 2001-2002 Joshua Chamas, Chamas Enterprises Inc.  All rights reserved.
+# Sponsored by development on NodeWorks http://www.nodeworks.com and Apache::ASP
+# http://www.apache-asp.org
+#
+# This program is free software; you can redistribute it
+# and/or modify it under the same terms as Perl itself.
+
+
+package MLDBM::Sync;
+$VERSION = '0.30';
+
+use MLDBM;
+use MLDBM::Sync::SDBM_File;
+use Data::Dumper;
+use Fcntl qw(:flock);
+use Digest::MD5 qw(md5_hex);
+use strict;
+use Carp qw(confess);
+no strict qw(refs);
+use vars qw($AUTOLOAD @EXT $CACHE_ERR $LOCK_SH $LOCK_EX $LOCK_UN);
+
+eval "use Tie::Cache;";
+if (($@)) {
+    $CACHE_ERR = $@;
+}
+
+$LOCK_SH = LOCK_SH;
+$LOCK_UN = LOCK_UN;
+$LOCK_EX = LOCK_EX;
+
+@EXT = ('.pag', '.dir', '');
+
+sub TIEHASH {
+    my($class, $file, @args) = @_;
+
+    $file =~ /^(.*)$/s;
+    $file = $1;
+    my $fh = $file.".lock";
+
+    my $self = bless {
+		      'file' => $file,
+		      'args' => [ $file, @args ],
+		      'lock_fh' => $fh,
+		      'lock_file' => $fh,
+		      'lock_num' => 0,
+		      'md5_keys' => 0,
+		      'pid' => $$,
+		      'keys' => [],
+		      'db_type' => $MLDBM::UseDB,
+		      'serializer' => $MLDBM::Serializer,
+		      'remove_taint' => $MLDBM::RemoveTaint,
+		     };
+
+    $self;
+}
+
+sub DESTROY { 
+    my $self = shift;
+    if($self->{lock_num}) {
+	$self->{lock_num} = 1;
+	$self->UnLock;
+    }
+}
+
+sub AUTOLOAD {
+    my($self, $key, $value) = @_;
+    $AUTOLOAD =~ /::([^:]+)$/;
+    my $func = $1;
+    grep($func eq $_, ('FETCH', 'STORE', 'EXISTS', 'DELETE'))
+      || die("$func not handled by object $self");
+
+    ## CHECKSUM KEYS
+    if(defined $key && $self->{md5_keys}) {
+	$key = $self->SyncChecksum($key);
+    }
+
+    # CACHE, short circuit if found in cache on FETCH/EXISTS
+    # after checksum, since that's what we store
+    my $cache = (defined $key) ? $self->{cache} : undef;
+    if($cache && ($func eq 'FETCH' or $func eq 'EXISTS')) {
+	my $rv = $cache->$func($key);
+	defined($rv) && return($rv);
+    }
+
+    my $rv;
+    if ($func eq 'FETCH' or $func eq 'EXISTS') {
+	$self->read_lock;
+    } else {
+	$self->lock;
+    }
+
+    {
+	local $MLDBM::RemoveTaint = $self->{remove_taint};
+	if (defined $value) {
+	    $rv = $self->{dbm}->$func($key, $value);
+	} else {
+	    $rv = $self->{dbm}->$func($key);
+	}
+    }
+
+    $self->unlock;
+
+    # do after lock critical section, no point taking 
+    # any extra time there
+    $cache && $cache->$func($key, $value);
+
+    $rv;
+}
+
+sub CLEAR { 
+    my $self = shift;
+    
+    $self->lock;
+    $self->{dbm}->CLEAR;
+    $self->{dbm} = undef;
+    # delete the files to free disk space
+    my $unlinked = 0;
+    for (@EXT) {
+	my $file = $self->{file}.$_;	
+	next if(! -e $file);
+	if(-d $file) {
+	    rmdir($file) || warn("can't unlink dir $file: $!");
+	} else {
+	    unlink($file) || die("can't unlink file $file: $!");
+	}
+
+	$unlinked++;
+    }
+    if($self->{lock_num} > 1) {
+	$self->SyncTie; # recreate, not done with it yet
+    }
+
+    $self->unlock;
+    if($self->{lock_num} == 0) {
+	# only unlink if we are clear of all the locks
+	unlink($self->{lock_file});
+    }
+    
+    $self->{cache} && $self->{cache}->CLEAR;
+
+    1;
+};
+
+# don't bother with cache for first/next key since it'll kill
+# the cache anyway likely
+sub FIRSTKEY {
+    my $self = shift;
+
+    if($self->{md5_keys}) {
+	confess("can't get keys() or each() on MLDBM::Sync database ".
+		"with SyncKeysChecksum(1) set");
+    }
+    
+    $self->read_lock;
+    my $key = $self->{dbm}->FIRSTKEY();
+    my @keys;
+    while(1) {
+	last if ! defined($key);
+	push(@keys, $key);
+	$key = $self->{dbm}->NEXTKEY($key);
+    }
+    $self->unlock;
+    $self->{'keys'} = \@keys;
+
+    $self->NEXTKEY;
+}
+
+sub NEXTKEY {
+    my $self = shift;
+
+    if($self->{md5_keys}) {
+	confess("can't get keys() or each() on MLDBM::Sync database ".
+		"with SyncKeysChecksum(1) set");
+    }
+    
+    my $rv = shift(@{$self->{'keys'}});
+}
+
+sub SyncChecksum {
+    my($self, $key) = @_;
+    if(ref $key) {
+	join('g', md5_hex($$key), sprintf("%07d",length($$key)));
+    } else {
+	join('g', md5_hex($key), sprintf("%07d", length($key)));
+    }
+}
+
+sub SyncCacheSize {
+    my($self, $size) = @_;
+    $CACHE_ERR && die("need Tie::Cache installed to use this feature: $@");
+
+    if ($size =~ /^(\d+)(M|K)$/) {
+	my($num, $type) = ($1, $2);
+	if (($type eq 'M')) {
+	    $size = $num * 1024 * 1024;
+	} elsif (($type eq 'K')) {
+	    $size = $num * 1024;
+	} else {
+	    die "$type symbol not understood for $size";
+	}
+    } else {
+	($size =~ /^\d+$/) or die("$size must be bytes size for cache");
+    }
+    
+    if ($self->{cache}) {
+	$self->{cache}->CLEAR(); # purge old cache, to free up RAM maybe for mem leaks
+    }
+    
+    my %cache;
+    my $cache = tie %cache, 'Tie::Cache', { MaxBytes => $size };
+    $self->{cache} = $cache; # use non tied interface, faster
+}
+
+sub SyncTie {
+    my $self = shift;
+    my %temp_hash;
+    my $args = $self->{args};
+    local $MLDBM::UseDB = $self->{db_type};
+    local $MLDBM::Serializer = $self->{serializer};
+    local $MLDBM::RemoveTaint = $self->{remove_taint};
+    $self->{dbm} = tie(%temp_hash, 'MLDBM', @$args) || die("can't tie to MLDBM with args: ".join(',', @$args)."; error: $!");
+
+    $self->{dbm};
+}
+
+#### DOCUMENTED API ################################################################
+
+sub SyncKeysChecksum {
+    my($self, $setting) = @_;
+    if(defined $setting) {
+	$self->{md5_keys} = $setting;
+    } else {
+	$self->{md5_keys};
+    }
+}
+
+*read_lock = *ReadLock;
+sub ReadLock { shift->Lock(1); }
+
+*lock = *SyncLock = *Lock;
+sub Lock {
+    my($self, $read_lock) = @_;
+
+    if($self->{lock_num}++ == 0) {
+	my $file = $self->{lock_file};
+	open($self->{lock_fh}, "+>$file") || die("can't open file $file: $!");
+	flock($self->{lock_fh}, ($read_lock ? $LOCK_SH : $LOCK_EX))
+	  || die("can't ". ($read_lock ? "read" : "write") ." lock $file: $!");
+	$self->{read_lock} = $read_lock;
+	$self->SyncTie;
+    } else {
+	if ($self->{read_lock} and ! $read_lock) {
+	    $self->{lock_num}--; # roll back lock count
+	    # confess here to help developer track this down
+	    confess("Can't upgrade lock type from LOCK_SH to LOCK_EX! ".
+		    "This could happen if you tried to write to the MLDBM ".
+		    "in a critical section locked by ReadLock(). ".
+		    "Also the read expression my \$v = \$db{'key1'}{'key2'} will trigger a write ".
+		    "if \$db{'key1'} does not already exist, so this will error in a ReadLock() section"
+		    );
+	}
+	1;
+    }
+}
+
+*unlock = *SyncUnLock = *UnLock;
+sub UnLock {
+    my $self = shift;
+
+    if($self->{lock_num} && $self->{lock_num}-- == 1) {
+	$self->{lock_num} = 0;
+	undef $self->{dbm};
+	flock($self->{'lock_fh'}, $LOCK_UN) || die("can't unlock $self->{'lock_file'}: $!");
+	close($self->{'lock_fh'}) || die("can't close $self->{'lock_file'}");
+	$self->{read_lock} = undef;
+	1;
+    } else {
+	1;
+    }
+}
+
+sub SyncSize {
+    my $self = shift;
+    my $size = 0;
+    for (@EXT) {
+	my $file = $self->{file}.$_;	
+	next unless -e $file;
+	$size += (stat($file))[7];
+
+	if(-d $file) {
+	    $size += (stat($file))[7];
+	    opendir(DIR, $file) || next;
+	    my @files = readdir(DIR);
+	    for my $dir_file (@files) {
+		next if $dir_file =~ /^\.\.?$/;
+		$size += (stat("$file/$dir_file"))[7];
+	    }
+	    closedir(DIR);
+	}
+    }
+
+    $size;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+  MLDBM::Sync - safe concurrent access to MLDBM databases
+
+=head1 SYNOPSIS
+
+  use MLDBM::Sync;                       # this gets the default, SDBM_File
+  use MLDBM qw(DB_File Storable);        # use Storable for serializing
+  use MLDBM qw(MLDBM::Sync::SDBM_File);  # use extended SDBM_File, handles values > 1024 bytes
+  use Fcntl qw(:DEFAULT);                # import symbols O_CREAT & O_RDWR for use with DBMs
+
+  # NORMAL PROTECTED read/write with implicit locks per i/o request
+  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync' [..other DBM args..] or die $!;
+  $cache{"AAAA"} = "BBBB";
+  my $value = $cache{"AAAA"};
+
+  # SERIALIZED PROTECTED read/write with explicit lock for both i/o requests
+  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
+  $sync_dbm_obj->Lock;
+  $cache{"AAAA"} = "BBBB";
+  my $value = $cache{"AAAA"};
+  $sync_dbm_obj->UnLock;
+
+  # SERIALIZED PROTECTED READ access with explicit read lock for both reads
+  $sync_dbm_obj->ReadLock;
+  my @keys = keys %cache;
+  my $value = $cache{'AAAA'};
+  $sync_dbm_obj->UnLock;
+
+  # MEMORY CACHE LAYER with Tie::Cache
+  $sync_dbm_obj->SyncCacheSize('100K');
+
+  # KEY CHECKSUMS, for lookups on MD5 checksums on large keys
+  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
+  $sync_dbm_obj->SyncKeysChecksum(1);
+  my $large_key = "KEY" x 10000;
+  $sync{$large_key} = "LARGE";
+  my $value = $sync{$large_key};
+
+=head1 DESCRIPTION
+
+This module wraps around the MLDBM interface, by handling concurrent
+access to MLDBM databases with file locking, and flushes i/o explicity
+per lock/unlock.  The new [Read]Lock()/UnLock() API can be used to serialize
+requests logically and improve performance for bundled reads & writes.
+
+  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
+
+  # Write locked critical section
+  $sync_dbm_obj->Lock;
+    ... all accesses to DBM LOCK_EX protected, and go to same tied file handles
+    $cache{'KEY'} = 'VALUE';
+  $sync_dbm_obj->UnLock;
+
+  # Read locked critical section
+  $sync_dbm_obj->ReadLock;
+    ... all read accesses to DBM LOCK_SH protected, and go to same tied files
+    ... WARNING, cannot write to DBM in ReadLock() section, will die()
+    ... WARNING, my $v = $cache{'KEY'}{'SUBKEY'} will trigger a write so not safe
+    ...   to use in ReadLock() section
+    my $value = $cache{'KEY'};
+  $sync_dbm_obj->UnLock;
+
+  # Normal access OK too, without explicity locking
+  $cache{'KEY'} = 'VALUE';
+  my $value = $cache{'KEY'};
+
+MLDBM continues to serve as the underlying OO layer that
+serializes complex data structures to be stored in the databases.
+See the MLDBM L<BUGS> section for important limitations.
+
+MLDBM::Sync also provides built in RAM caching with Tie::Cache
+md5 key checksum functionality.
+
+=head1 INSTALL
+
+Like any other CPAN module, either use CPAN.pm, or perl -MCPAN C<-e> shell,
+or get the file MLDBM-Sync-x.xx.tar.gz, unzip, untar and:
+
+  perl Makefile.PL
+  make
+  make test
+  make install
+
+=head1 LOCKING
+
+The MLDBM::Sync wrapper protects MLDBM databases by locking
+and unlocking around read and write requests to the databases.
+Also necessary is for each new lock to tie() to the database
+internally, untie()ing when unlocking.  This flushes any
+i/o for the dbm to the operating system, and allows for
+concurrent read/write access to the databases.
+
+Without any extra effort from the developer, an existing 
+MLDBM database will benefit from MLDBM::sync.
+
+  my $dbm_obj = tie %dbm, ...;
+  $dbm{"key"} = "value";
+
+As a write or STORE operation, the above will automatically
+cause the following:
+
+  $dbm_obj->Lock; # also ties
+  $dbm{"key"} = "value";
+  $dbm_obj->UnLock; # also unties
+
+Just so, a read or FETCH operation like:
+
+  my $value = $dbm{"key"};
+
+will really trigger:
+
+  $dbm_obj->ReadLock; # also ties
+  my $value = $dbm{"key"};
+  $dbm_obj->Lock; # also unties
+
+However, these lock operations are expensive because of the 
+underlying tie()/untie() that occurs for i/o flushing, so 
+when bundling reads & writes, a developer may explicitly
+use this API for greater performance:
+
+  # tie once to database, write 100 times
+  $dbm_obj->Lock;
+  for (1..100) {
+    $dbm{$_} = $_ * 100;
+    ...
+  }
+  $dbm_obj->UnLock;
+
+  # only tie once to database, and read 100 times
+  $dbm_obj->ReadLock;
+  for(1..100) {
+    my $value = $dbm{$_};  
+    ...
+  }
+  $dbm_obj->UnLock;
+
+=head1 CACHING
+
+I built MLDBM::Sync to serve as a fast and robust caching layer
+for use in multi-process environments like mod_perl.  In order
+to provide an additional speed boost when caching static data,
+I have added an RAM caching layer with Tie::Cache, which 
+regulates the size of the memory used with its MaxBytes setting.
+
+To activate this caching, just:
+
+  my $dbm = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
+  $dbm->SyncCacheSize(100000);  # 100000 bytes max memory used
+  $dbm->SyncCacheSize('100K');  # 100 Kbytes max memory used
+  $dbm->SyncCacheSize('1M');    # 1 Megabyte max memory used
+
+The ./bench/bench_sync.pl, run like "bench_sync.pl C<-c>" will run 
+the tests with caching turned on creating a benchmark with 50%
+cache hits.
+
+One run without caching was:
+
+ === INSERT OF 50 BYTE RECORDS ===
+  Time for 100 writes + 100 reads for  SDBM_File                  0.16 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  MLDBM::Sync::SDBM_File     0.17 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  GDBM_File                  3.37 seconds     17980 bytes
+  Time for 100 writes + 100 reads for  DB_File                    4.45 seconds     20480 bytes
+
+And with caching, with 50% cache hits:
+
+ === INSERT OF 50 BYTE RECORDS ===
+  Time for 100 writes + 100 reads for  SDBM_File                  0.11 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  MLDBM::Sync::SDBM_File     0.11 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  GDBM_File                  2.49 seconds     17980 bytes
+  Time for 100 writes + 100 reads for  DB_File                    2.55 seconds     20480 bytes
+
+Even for SDBM_File, this speedup is near 33%.
+
+=head1 KEYS CHECKSUM
+
+A common operation on database lookups is checksumming
+the key, prior to the lookup, because the key could be
+very large, and all one really wants is the data it maps
+too.  To enable this functionality automatically with 
+MLDBM::Sync, just:
+
+  my $sync_dbm_obj = tie %cache, 'MLDBM::Sync', '/tmp/syncdbm', O_CREAT|O_RDWR, 0640;
+  $sync_dbm_obj->SyncKeysChecksum(1);
+
+ !! WARNING: keys() & each() do not work on these databases
+ !! as of v.03, so the developer will not be fooled into thinking
+ !! the stored key values are meaningful to the calling application 
+ !! and will die() if called.
+ !!
+ !! This behavior could be relaxed in the future.
+ 
+An example of this might be to cache a XSLT conversion,
+which are typically very expensive.  You have the 
+XML data and the XSLT data, so all you do is:
+
+  # $xml_data, $xsl_data are strings
+  my $xslt_output;
+  unless ($xslt_output = $cache{$xml_data.'&&&&'.$xsl_data}) {
+    ... do XSLT conversion here for $xslt_output ...
+    $cache{$xml_data.'&&&&'.xsl_data} = $xslt_output;
+  }
+
+What you save by doing this is having to create HUGE keys
+to lookup on, which no DBM is likely to do efficiently.
+This is the same method that File::Cache uses internally to 
+hash its file lookups in its directories.
+
+=head1 New MLDBM::Sync::SDBM_File
+
+SDBM_File, the default used for MLDBM and therefore MLDBM::Sync 
+has a limit of 1024 bytes for the size of a record.
+
+SDBM_File is also an order of magnitude faster for small records
+to use with MLDBM::Sync, than DB_File or GDBM_File, because the
+tie()/untie() to the dbm is much faster.  Therefore,
+bundled with MLDBM::Sync release is a MLDBM::Sync::SDBM_File
+layer which works around this 1024 byte limit.  To use, just:
+
+  use MLDBM qw(MLDBM::Sync::SDBM_File);
+
+It works by breaking up up the STORE() values into small 128 
+byte segments, and spreading those segments across many records,
+creating a virtual record layer.  It also uses Compress::Zlib
+to compress STORED data, reducing the number of these 128 byte 
+records. In benchmarks, 128 byte record segments seemed to be a
+sweet spot for space/time efficiency, as SDBM_File created
+very bloated *.pag files for 128+ byte records.
+
+=head1 BENCHMARKS
+
+In the distribution ./bench directory is a bench_sync.pl script
+that can benchmark using the various DBMs with MLDBM::Sync.
+
+The MLDBM::Sync::SDBM_File DBM is special because is uses 
+SDBM_File for fast small inserts, but slows down linearly
+with the size of the data being inserted and read.
+
+The results for a dual PIII-450 linux 2.4.7, with a ext3 file system 
+blocksize 4096 mounted async on a RAID-1 2xIDE 7200 RPM disk were as follows:
+
+ === INSERT OF 50 BYTE RECORDS ===
+  Time for 100 writes + 100 reads for  SDBM_File                  0.16 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  MLDBM::Sync::SDBM_File     0.19 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  GDBM_File                  1.09 seconds     18066 bytes
+  Time for 100 writes + 100 reads for  DB_File                    0.67 seconds     12288 bytes
+  Time for 100 writes + 100 reads for  Tie::TextDir .04           0.31 seconds     13192 bytes
+
+ === INSERT OF 500 BYTE RECORDS ===
+ (skipping test for SDBM_File 100 byte limit)
+  Time for 100 writes + 100 reads for  MLDBM::Sync::SDBM_File     0.52 seconds    110592 bytes
+  Time for 100 writes + 100 reads for  GDBM_File                  1.20 seconds     63472 bytes
+  Time for 100 writes + 100 reads for  DB_File                    0.66 seconds     86016 bytes
+  Time for 100 writes + 100 reads for  Tie::TextDir .04           0.32 seconds     58192 bytes
+
+ === INSERT OF 5000 BYTE RECORDS ===
+ (skipping test for SDBM_File 100 byte limit)
+  Time for 100 writes + 100 reads for  MLDBM::Sync::SDBM_File     1.41 seconds   1163264 bytes
+  Time for 100 writes + 100 reads for  GDBM_File                  1.38 seconds    832400 bytes
+  Time for 100 writes + 100 reads for  DB_File                    1.21 seconds    831488 bytes
+  Time for 100 writes + 100 reads for  Tie::TextDir .04           0.58 seconds    508192 bytes
+
+ === INSERT OF 20000 BYTE RECORDS ===
+ (skipping test for SDBM_File 100 byte limit)
+ (skipping test for MLDBM::Sync db size > 1M)
+  Time for 100 writes + 100 reads for  GDBM_File                  2.23 seconds   2063912 bytes
+  Time for 100 writes + 100 reads for  DB_File                    1.89 seconds   2060288 bytes
+  Time for 100 writes + 100 reads for  Tie::TextDir .04           1.26 seconds   2008192 bytes
+
+ === INSERT OF 50000 BYTE RECORDS ===
+ (skipping test for SDBM_File 100 byte limit)
+ (skipping test for MLDBM::Sync db size > 1M)
+  Time for 100 writes + 100 reads for  GDBM_File                  3.66 seconds   5337944 bytes
+  Time for 100 writes + 100 reads for  DB_File                    3.64 seconds   5337088 bytes
+  Time for 100 writes + 100 reads for  Tie::TextDir .04           2.80 seconds   5008192 bytes
+
+=head1 AUTHORS
+
+Copyright (c) 2001-2002 Joshua Chamas, Chamas Enterprises Inc.  All rights reserved.
+Sponsored by development on NodeWorks http://www.nodeworks.com and Apache::ASP
+http://www.apache-asp.org
+
+This program is free software; you can redistribute it
+and/or modify it under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+ MLDBM(3), SDBM_File(3), DB_File(3), GDBM_File(3)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MLDBM/Sync/SDBM_File.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,163 @@
+# Copyright (c) 2001-2002 Joshua Chamas, Chamas Enterprises Inc.  All rights reserved.
+# Sponsored by development on NodeWorks http://www.nodeworks.com and Apache::ASP
+# http://www.apache-asp.org
+#
+# This program is free software; you can redistribute it
+# and/or modify it under the same terms as Perl itself.
+
+package MLDBM::Sync::SDBM_File;
+$VERSION = .17;
+
+use SDBM_File;
+use strict;
+use vars qw(@ISA  $MaxSegments $MaxSegmentLength %KEYS $Zlib $VERSION);
+
+@ISA = qw(SDBM_File);
+$MaxSegments   = 8192; # to a 1M limit
+# leave room for key index pad
+$MaxSegmentLength = 128;
+eval "use Compress::Zlib";
+$Zlib = $@ ? 0 : 1;
+
+sub FETCH {
+    my($self, $key) = @_;
+    my $segment_length = $MaxSegmentLength;
+
+    my $total_rv;
+    for(my $index = 0; $index < $MaxSegments; $index++) {
+	my $rv = $self->SUPER::FETCH(_index_key($key, $index));
+	if(defined $rv) {
+	    $total_rv ||= '';
+	    $total_rv .= $rv;
+	    last if length($rv) < $segment_length;
+	} else {
+	    last;
+	}
+    }
+
+    if(defined $total_rv) {
+	$total_rv =~ s/^(..)//s;
+	my $type = $1;
+	if($type eq 'G}') {
+	    $total_rv = uncompress($total_rv);
+	} elsif ($type eq 'N}') {
+	    # nothing
+	} else {
+	    # old SDBM_File ?
+	    $total_rv = $type . $total_rv;
+	}
+    }
+
+    $total_rv;
+}
+
+sub STORE {
+    my($self, $key, $value) = @_;
+    my $segment_length = $MaxSegmentLength;
+
+    # DELETE KEYS FIRST
+    for(my $index = 0; $index < $MaxSegments; $index++) {
+	my $index_key = _index_key($key, $index);
+	my $rv = $self->SUPER::FETCH($index_key);
+	if(defined $rv) {
+	    $self->SUPER::DELETE($index_key);
+	} else {
+	    last;
+	}
+	last if length($rv) < $segment_length;
+    }
+
+    # G - Gzip compression
+    # N - No compression
+    #
+    my $old_value = $value;
+    $value = ($Zlib && (length($value) >= $segment_length/2)) ? "G}".compress($value) : "N}".$value;
+
+    my($total_rv, $last_index);
+    for(my $index = 0; $index < $MaxSegments; $index++) {
+	if($index == $MaxSegments) {
+	    die("can't store more than $MaxSegments segments of $MaxSegmentLength bytes per key in ".__PACKAGE__);
+	}
+	$value =~ s/^(.{0,$segment_length})//so;
+	my $segment = $1;
+	
+	last if length($segment) == 0;
+#	print "STORING "._index_key($key, $index)." $segment\n";
+	my $rv = $self->SUPER::STORE(_index_key($key, $index), $segment);
+	$total_rv .= $segment;
+	$last_index = $index;
+    }
+
+#    use Time::HiRes;
+#    print "[".&Time::HiRes::time()."] STORED ".($last_index+1)." segments for length ".
+#      length($total_rv)." bytes for value ".length($old_value)."\n";
+
+    $old_value;
+}
+
+sub DELETE {
+    my($self, $key) = @_;
+    my $segment_length = $MaxSegmentLength;
+
+    my $total_rv;
+    for(my $index = 0; $index < $MaxSegments; $index++) {
+	my $index_key = _index_key($key, $index);
+	my $rv = $self->SUPER::FETCH($index_key) || '';
+	$self->SUPER::DELETE($index_key);
+	$total_rv ||= '';
+	$total_rv .= $rv;
+	last if length($rv) < $segment_length;
+    }
+
+    $total_rv =~ s/^(..)//s;
+    my $type = $1;
+    if($type eq 'G}') {
+	$total_rv = uncompress($total_rv);
+    } elsif ($type eq 'N}') {
+	# normal
+    } else {
+	# old SDBM_File
+	$total_rv = $type.$total_rv;
+    }
+
+    $total_rv;
+}
+
+sub FIRSTKEY {
+    my $self = shift;
+
+    my $key = $self->SUPER::FIRSTKEY();
+    my @keys = ();
+    if (defined $key) {
+	do {
+	    if($key !~ /\*\*\d+$/s) {
+		if(my $new_key = _decode_key($key)) {
+		    push(@keys, $new_key);
+		}
+	    }
+	} while($key = $self->SUPER::NEXTKEY($key));
+    }
+    $KEYS{$self} = \@keys;
+
+    $self->NEXTKEY;
+}
+
+sub NEXTKEY {
+    my $self = shift;
+    shift(@{$KEYS{$self}});
+}
+
+sub _index_key {
+    my($key, $index) = @_;
+    $key =~ s/([\%\*])/uc sprintf("%%%02x",ord($1))/esg;
+    $index ? $key.'**'.$index : $key;
+}
+
+sub _decode_key {
+    my $key = shift;
+    $key =~ s/%([0-9a-fA-F]{2})/pack("c",hex($1))/ge;
+    $key;
+}
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,189 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Path;
+use IniData;
+use EnvDb;
+use MrpData;
+use NotesCompiler;
+use MakeRel;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $notesSrc;
+my $mrpData;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'MakeEnv');
+my $envDb;
+my $project;
+my $useCachedManifest;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+if (!CheckArchive()) {
+  exit 1;
+}
+CheckEnvironment();
+MakeRel::MakeReleases($iniData, $envDb, $mrpData, $notesSrc, 'MakeEnv', $verbose, $project, $useCachedManifest);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "n=s" => \$notesSrc, "w=s" => \$project, "useCachedManifest" =>\$useCachedManifest);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: makeenv [options]
+
+options:
+
+-h                    help
+-n <notes_src_file>   compile all release notes using a single source file
+-v                    verbose output (-vv very verbose)
+-w <project>          make the release in given \"project\"\n");
+}
+
+sub CheckArchive {
+  my $self = shift;
+
+  my $env = $envDb->VersionInfo();
+  my @components = map([$_, $env->{$_}], keys(%$env));
+  my @pendingComps = grep($envDb->Status($_->[0]) == EnvDb::STATUS_PENDING_RELEASE, @components);
+
+  my $good = 1;
+  foreach my $comp (@pendingComps) {
+    my $relDir = $iniData->PathData->LocalArchivePathForExistingOrNewComponent($comp->[0],$comp->[1],$project);
+    if (-e $relDir) {
+      print STDERR "Error: $relDir already exists\n";
+      $good = 0;
+    }
+  }
+
+  return $good;
+}
+
+sub CheckEnvironment {
+  my $self = shift;
+
+  (my $status, $mrpData, my $dirtyComps, my $unaccountedFiles, my $duplicates) = $envDb->CheckEnv(1);
+  if (scalar (@$dirtyComps) > 0) {
+    foreach my $comp (@$dirtyComps) {
+      print "Error: $comp->{comp} $comp->{ver} is dirty\n"; 
+    }
+  }
+  if (scalar (@$unaccountedFiles) > 0) {
+    foreach my $line (@$unaccountedFiles) {
+      print "Error: $line has unknown origin\n"; 
+    }
+  }
+  if (scalar (@$duplicates) > 0) {
+    foreach my $args (@$duplicates) {
+      print "Error: $args->[1] attempting to release $args->[0] which has already been released by $args->[2]\n"; 
+    }
+  }
+  if ($status == EnvDb::STATUS_CLEAN) {
+    die "No components are pending release\n";
+  }
+  elsif ($status == EnvDb::STATUS_DIRTY) {
+    die "Error: Release environment is dirty\n";
+  }
+}
+
+
+__END__
+
+=head1 NAME
+
+MakeEnv - Make a release of an entire environment.
+
+=head1 SYNOPSIS
+
+  makeenv [options]
+
+options:
+
+  -h                    help
+  -n <notes_src_file>   compile all release notes using a single source file
+  -v                    verbose output (-vv  very verbose)
+  -w <project>          make the release in given "project"
+  --useCachedManifest   for internal use only *
+
+=head1 DESCRIPTION
+
+C<MakeEnv> is a tool that can generate one or more releases in such a way that the entire environment from which they were released can reliably be reproduced when doing a corresponding C<GetEnv> (not this is B<not> a guarantee that C<MakeRel> can make). The reliability of environment reproduction is achieved by scanning the F<\epoc32> tree before making a release to ensure that each file present has a known origin. This may be either within an existing release, or within releases that are about to be made. Releases that are about to be made must have their environment database status set to C<pending release> using either C<PrepRel> or C<PrepEnv>. C<MakeEnv> will not proceed until the overall status of the release environment is C<pending release>. The current overall status of an environment can be found using C<EnvInfo> with the C<-f> switch.
+
+Once the release environment is C<pending release>, C<MakeEnv> can be executed. If no arguments are provided, it will make releases of each component with C<pending release> status using the version information and F<mrp> file name store in the environment database. It is possible to override the release notes source file to be used for all releases via the C<-n> switch. This may be useful, for example, if the source in the components being released hasn't changed, but an underlying break in binary compatibility is being absorbed, as they can all be assigned the same release note.
+
+The C<-w> switch specifies the location to make the releases. If you use this argument, you should specify the name of an archive as specified in your F<reltools.ini> file. If you don't use this argument, the releases will go into the first archive listed in your F<reltools.ini>.
+
+See the document I<Making Releases> for more complete coverage of the process of making releases in general. See also the documentation on C<ValidateEnv> which can identify components that have not changed since the last time they were released, and so do not need to be released again.
+
+* When using the C<--useCachedManifest> switch C<MakeEnv> will check too see if a cached manifest file already exists for each component.  Cached manifest files are created by  C<ValidateRel>.  If a cached manifest file is found it will used for the component release.  If no manifest file is found, or the C<--useChachedManifest> switch has not been specified then a new manifest file will be generated from the component's MRP file.  This functionality is useful for automated build systems, as it avoids the process of duplicating manifest files.  Note that evalid checksums are not recalculated for cached manifest files.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,251 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use MrpData;
+use MakeRel;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $fixLibs = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'MakeRel');
+my $envDb;
+my $makeRel;
+my $notesSrc;
+my $project;
+my $reallyrun;
+my @mrpData;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrintHeinousWarning();
+MakeRel::MakeReleases($iniData, $envDb, \@mrpData, $notesSrc, 'MakeRel', $verbose, $project);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  my $stdin;
+  GetOptions("h" => \$help, "v+" => \$verbose, "n=s" => \$notesSrc, "p" => \$stdin, "l" => \$fixLibs, "w=s" => \$project, "f" => \$reallyrun);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  # Create the MrpData objects. These will not write any files to disk, and so if any of
+  # them die, there is no need to perform any file system cleanup.
+  if ($#ARGV == -1 and $stdin) {
+    # Read input from STDIN.
+    MakeMrpData(\@mrpData, *STDIN);
+  }
+  elsif ($#ARGV == 0) {
+    # Read input from a file.
+    if (-f $ARGV[0]) {
+      open (IN, $ARGV[0]) or die "Error: Couldn't open $ARGV[0] for reading: $!\n";
+      MakeMrpData(\@mrpData, *IN);
+      close (IN);
+    }
+    else {
+      print "Error: $ARGV[0] is not a file\n";
+      Usage(1);
+    }
+  }
+  elsif ($#ARGV == 1) {
+    # Read input from a single set of command line arguments.
+    if ($iniData->RequireInternalVersions()) {
+      die "Error: Internal version number not specified\n";
+    }
+    else {
+      push (@mrpData, MrpData->New(shift @ARGV, shift @ARGV, '', $iniData, $verbose, $fixLibs));
+    }
+  }
+  elsif ($#ARGV == 2) {
+    # Read input from a single set of command line arguments.
+    push (@mrpData, MrpData->New(shift @ARGV, shift @ARGV, shift @ARGV, $iniData, $verbose, $fixLibs));
+  }
+  else {
+    print "Error: invalid number of arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: makerel [options] [[<mrp_file> <version> [<internal_version>]] | [mrp_list_file]]
+
+options:
+
+-h                    help
+-v                    verbose output (-vv very verbose)
+-n <notes_src_file>   compile all release notes using a single source file
+-p                    read a piped mrp list from STDIN
+-l                    copy missing ARMI lib files from THUMB is possible
+-f                    force (no prompting)
+-w <project name>     make the release in this \"project\"
+
+Unsupported tool.\n");
+}
+
+sub PrintHeinousWarning {
+  Utils::QueryUnsupportedTool(<<GUILTY, $reallyrun);
+############################ WARNING ################################
+# Do not use MakeRel  under normal circumstances.   If you  wish to #
+# make a component release,   use the PrepRel and MakeEnv commands. #
+# ( PrepRel to specify the version numbers,  etc.,  then MakeEnv to #
+# actually make the release(s). )                                   #
+#####################################################################
+
+The problem with MakeRel is that it doesn't ensure your environment
+is clean before making the releases. Hence, component releases made
+using MakeRel are not subject to the normal guarantees, that ensure
+users of your release can precisely reproduce what you have on your
+development drive.
+
+Usually, releases made using MakeRel are unacceptable to licensee
+integration teams. Use with caution.
+
+GUILTY
+}
+
+sub MakeMrpData {
+  my $mrpData = shift;
+  local *IN = shift;
+  print "Gathering release info...\n";
+  my @failedReleases;
+  my @lines;
+  while (my $line = <IN>) {
+    # Remove line feed, white space and comments.
+    chomp $line;
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+    push @lines, $line;
+  }
+
+  # Reading in a separate loop due to Perl 5.8.0 defect # 21217, due to be fixed in 5.8.1.
+
+  my $lineNum = -1;
+  foreach my $line (@lines) {
+    $lineNum++;
+    eval {
+      (my $mrpName, my $extVer, my $intVer) = split (/\s+/, $line, 4);
+      unless (defined $mrpName and defined $extVer) {
+        die "Error: Invalid arguments at line $lineNum\n";
+      }
+      if (not defined $intVer) {
+        if ($iniData->RequireInternalVersions()) {
+          die "Error: Internal version number not specified\n";
+        }
+        else {
+          $intVer = '';
+        }
+      }
+      my $thisMrpData = MrpData->New($mrpName, $extVer, $intVer, $iniData, $verbose, $fixLibs);
+      push (@$mrpData, $thisMrpData);
+    };
+    if ($@) {
+      print $@;
+      push (@failedReleases, "$line - $@");
+    }
+  }
+
+  if ($#failedReleases >= 0) {
+    print "\nThere was an error making the following release(s):\n\n";
+    foreach my $rel (@failedReleases) {
+      print "$rel";
+    }
+    die "\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+MakeRel - Make a single, or set of component releases.
+
+=head1 SYNOPSIS
+
+  makerel [options] [[<mrp_file> <version> [<internal_version>]] | [mrp_list_file]]
+
+options:
+
+  -h                    help
+  -v                    verbose output (-vv  very verbose)
+  -n <notes_src_file>   compile all release notes using a single source file
+  -p                    read a piped mrp list from STDIN
+  -l                    copy missing ARMI lib files from THUMB is possible
+  -f                    force (no prompting)
+  -w <project>          make the releases in this "project"
+
+=head1 DESCRIPTION
+
+C<MakeRel> is a tool that can generate one or more component releases. Where ever possible the tool C<MakeEnv> should be used instead of C<MakeRel> because this guarantees the ability to reproduce the entire environment from which a release was made, rather than just packaging up a particular set of source and binaries.
+
+See the document I<Making Releases> for more complete coverage of the process of making releases in general.
+
+=head1 STATUS
+
+Unsupported/experimental. If you find a problem, please send us a patch.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeRel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,342 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package MakeRel;
+
+use strict;
+use File::Path;
+use File::Spec;
+use File::Basename;
+use IniData;
+use EnvDb;
+use MrpData;
+use RelData;
+use CatData;
+use Utils;
+use Symbian::CBR::Component::Manifest;
+use Cwd;
+
+#
+# Public.
+#
+
+sub MakeReleases {
+  my $self;
+  $self->{iniData} = shift;
+  $self->{envDb} = shift;
+  $self->{mrpData} = shift;
+  $self->{notesSrc} = shift;
+  $self->{toolName} = shift;
+  $self->{verbose} = shift;
+  $self->{project} = shift;
+  $self->{useCachedManifest} = shift;
+
+  bless $self, "MakeRel";
+
+  if (scalar(@{$self->{mrpData}}) == 0) { # Abort if there's nothing to do.
+    return;
+  }
+  if (!$self->CheckArchive()) { # Abort if any of the releases already exist
+    return;
+  }
+
+  my $versionInfo = $self->VersionInfo();
+  eval {
+    $self->GenerateReleaseFiles($versionInfo);
+  };
+  if ($@) {
+    print $@;
+
+    if($self->{toolName} =~ /MakeEnv/i){
+      print "\nError: Unable to create environment successfully, archive might be corrupted.\n";
+    }
+    else{
+      print "\nError: Unable to create component release successfully, archive might be corrupted.\n";
+    }
+
+    $self->Cleanup();
+    return;
+  }
+
+  # Now that we know all releases have been successfully made, update the environment database.
+  foreach my $thisMrpData (@{$self->{mrpData}}) {
+    my $comp = $thisMrpData->Component();
+    my $ver = $thisMrpData->ExternalVersion();
+    $self->{envDb}->SetVersion($comp, $ver);
+    $self->{envDb}->GenerateSignature($comp, $ver);
+    $self->{envDb}->SetMrpName($comp, $thisMrpData->MrpName());
+    $self->{envDb}->SetStatus($comp, EnvDb::STATUS_CLEAN);
+  }
+}
+
+
+#
+# Private.
+#
+
+sub VersionInfo {
+  my $self = shift;
+
+  # Get a copy of the current version information from the environment database and update it with the new versions.
+  my $versionInfo = $self->{envDb}->VersionInfo();
+  foreach my $thisMrpData (@{$self->{mrpData}}) {
+    $versionInfo->{lc($thisMrpData->Component())} = $thisMrpData->ExternalVersion();
+  }
+
+  return $versionInfo;
+}
+
+sub CheckArchive {
+  my $self = shift;
+  my $good = 1;
+  foreach my $thisMrpData (@{$self->{mrpData}}) {
+    if (!$self->CheckDirs($thisMrpData)) {
+      $good = 0; # Continue and check the rest
+    }
+  }
+  return $good;
+}
+
+sub GenerateReleaseFiles {
+  my $self = shift;
+  my $versionInfo = shift;
+  my $numMrps = scalar(@{$self->{mrpData}});
+  foreach my $thisMrpData (@{$self->{mrpData}}) {
+    $self->MakeDirs($thisMrpData);
+    $self->ZipSource($thisMrpData);
+    $self->ZipBinaries($thisMrpData);
+    $self->ZipExports($thisMrpData);
+    $self->WriteRelData($thisMrpData, $versionInfo);
+    $self->WriteManifest($thisMrpData);
+
+    # This line must come after the others, because with a project-based archive path configuration it relies on
+    # LocalArchivePathForNewOrExistingComponent finding the directories created above.
+    my $comp = $thisMrpData->Component();
+    my $extVer = $thisMrpData->ExternalVersion();
+    my $intVer = $thisMrpData->InternalVersion();
+    unless (defined $intVer) {
+      $intVer = '';
+    }
+    my $relDir = $self->LocalArchivePath($thisMrpData);
+    Utils::SetFileReadOnly($relDir);
+    print "Made $comp $extVer $intVer\n";
+  }
+}
+
+sub ComponentDir {
+  require Carp;
+  confess("Obsolete method called");
+}
+
+sub ReleaseDir {
+  require Carp;
+  confess("Obsolete method called");
+}
+
+sub CheckDirs {
+  my $self = shift;
+  my $mrpData = shift;
+  my $relDir = $self->LocalArchivePath($mrpData);
+  if (-e $relDir) {
+    print STDERR "Error: $relDir already exists\n";
+    return 0;
+  }
+  return 1;
+}
+
+sub MakeDirs {
+  my $self = shift;
+  my $mrpData = shift;
+  my $relDir = $self->LocalArchivePath($mrpData);
+  unless (-e $relDir) {
+    Utils::MakeDir($relDir);
+  }
+}
+
+sub ZipSource {
+  my $self = shift;
+  my $mrpData = shift;
+  my @categories = @{$mrpData->SourceCategories()};
+  my $zipName;
+
+  foreach my $category (@categories) {
+    my @sourceFiles = @{$mrpData->Source($category)};
+    if (@sourceFiles) {
+      $zipName = $self->LocalArchivePath($mrpData) . "\\source".uc($category).".zip";
+
+      Utils::ZipSourceList($zipName, \@sourceFiles, $self->{verbose}, Utils::SourceRoot(), $self->{iniData});
+
+      Utils::SetFileReadOnly($zipName);
+    }
+  }
+  if ($self->{verbose} > 1 and not defined $zipName) {
+    print "No source for " . $mrpData->Component() . "\n";
+  }
+}
+
+sub ZipBinaries {
+  my $self = shift;
+  my $mrpData = shift;
+  foreach my $thisBinCat (@{$mrpData->BinaryCategories()}) {
+    my $bins = $mrpData->Binaries($thisBinCat);
+    if ($bins and scalar(@$bins) > 0) {
+      my $zipName;
+      if ($thisBinCat eq 'unclassified') {
+        $zipName = $self->LocalArchivePath($mrpData) . "\\binaries.zip";
+      }
+      else {
+        $zipName = $self->LocalArchivePath($mrpData) . "\\binaries_$thisBinCat.zip";
+      }
+      Utils::ZipList($zipName, $bins, $self->{verbose}, 0, Utils::EpocRoot());
+      Utils::SetFileReadOnly($zipName);
+    }
+  }
+}
+
+sub ZipExports {
+  my $self = shift;
+  my $mrpData = shift;
+
+  foreach my $thisExportCat (@{$mrpData->ExportCategories()}) {
+    my $exports = $mrpData->Exports($thisExportCat);
+    if ($exports and scalar(@$exports) > 0) {
+      my $zipName = $self->LocalArchivePath($mrpData) . "\\exports".uc($thisExportCat).".zip";
+      Utils::ZipList($zipName, $exports, $self->{verbose}, 0, Utils::EpocRoot());
+      Utils::SetFileReadOnly($zipName);
+      # Need to create an exports<CAT>.txt file which details necessary info...
+      my $txtName = $self->LocalArchivePath($mrpData) . "\\exports".uc($thisExportCat).".txt";
+      CatData->New($self->{iniData}, $txtName, $mrpData, uc($thisExportCat));
+    }
+  }
+}
+
+sub WriteRelData {
+  my $self = shift;
+  my $mrpData = shift;
+  my $versionInfo = shift;
+
+  my $notesSource = $self->{notesSrc};
+  if (defined $notesSource) {
+    Utils::CheckExists($notesSource);
+    Utils::CheckIsFile($notesSource);
+  }
+  else {
+    $notesSource = Utils::PrependSourceRoot($mrpData->NotesSource());
+  }
+  my $relData = RelData->New($self->{iniData}, $mrpData, $notesSource, $versionInfo, $self->{toolName}, $self->{verbose}, undef, $self->{project}); # undef = dontPersist
+}
+
+sub WriteManifest {
+  my $self = shift;
+  my $mrpData = shift;
+  my $componentName = $mrpData->Component();
+  my $manifest = undef;
+  
+  
+  if ($self->{useCachedManifest}) {
+    #Check if manifest file is available in temp location
+    my $manifestTempFile = File::Spec->catfile( File::Spec->tmpdir(), "manifest_".$componentName.".xml" );
+    
+    if (-e $manifestTempFile ) {
+      #Construct manifest object from the manifest file
+      $manifest = Symbian::CBR::Component::Manifest->new( $manifestTempFile );
+      
+      #Delete the temp manifest file
+      my $unlinkCount = 100;
+      while(-e $manifestTempFile and $unlinkCount > 0){
+        unlink($manifestTempFile) or print "Warning: unlink $manifestTempFile failed[$unlinkCount].\n";
+        $unlinkCount--;
+      }
+      if ( $unlinkCount == 0 ) {
+        die "Error: unlink $manifestTempFile failed.\n";
+      }
+    }
+  }
+  
+  if (!defined $manifest) {
+    my $mrpName = Utils::RelativeToAbsolutePath( $mrpData->MrpName(), $mrpData->{iniData}, SOURCE_RELATIVE );
+    
+    #Construct manifest object from MRP file
+    $manifest = Symbian::CBR::Component::Manifest->new( $mrpName );
+  }
+  
+  #Save the manifest file to the archive release location for the component
+  $manifest->Save ( $self->LocalArchivePath($mrpData) );
+}
+
+sub Cleanup {
+  my $self = shift;
+  if ($self->{verbose}) { print "Cleaning up...\n"; }
+  foreach my $thisMrpData (@{$self->{mrpData}}) {
+    my $relDir = $self->LocalArchivePath($thisMrpData);
+    if (-e $relDir) {
+      if ($self->{verbose}) { print "Deleting $relDir...\n"; }
+      my $origDir = cwd();
+      
+      chdir(dirname($relDir)); #If you try to rmtree a UNC path the cwd must also be a UNC path
+      rmtree ($relDir);
+      chdir($origDir);
+    }
+  }
+}
+
+sub LocalArchivePath {
+  my $self = shift;
+  my $mrpData = shift;
+  my $name = $mrpData->Component();
+  my $ver = $mrpData->ExternalVersion();
+
+  if (not exists $self->{pathCache}->{$name}->{$ver}) {
+    $self->{pathCache}->{$name}->{$ver} = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($name, $ver, $self->{project});
+  }
+
+  return $self->{pathCache}->{$name}->{$ver};
+}
+
+1;
+
+=head1 NAME
+
+MakeRel.pm - Provides an interface for making releases.
+
+=head1 INTERFACE
+
+=head2 MakeReleases
+
+Expects to be passed an C<IniData> reference, an C<EnvDb> reference, a reference to a list of C<MrpData> objects, the name of a notes source file, the name of the tool using C<MakeRel> and a verbosity level. Firstly, the binary files referred to by the C<MrpData> objects are cross checked to ensure that more than one component isn't attempting to release the same file. Dies if this is the case. Secondly, generates release directories and files for each C<MrpData> object. Thirdly, updates local signature files and the environment database.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeSnapShot	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,215 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use Utils;
+
+#
+# Constants.
+#
+
+my $KMissingFileName = Utils::PrependEpocRoot("\\__missing.txt");
+my $KCompsFileName = Utils::PrependEpocRoot("\\__comps.txt");
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $noIgnores = 0;
+my $fileName;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'MakeSnapShot');
+my $force;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+MakeSnapShot();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ('bundling');
+  my $help;
+  GetOptions('h' => \$help, 'i' => \$noIgnores, 'v+' => \$verbose, 'f' => \$force);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $fileName = shift @ARGV;
+
+  unless ($fileName and scalar(@ARGV) == 0) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  unless ($fileName =~ /\.zip$/i) {
+    $fileName .= '.zip';
+  }
+  Utils::AbsoluteFileName(\$fileName);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: makesnapshot [options] <snap_shot_file_name>
+
+options:
+
+  -h  help
+  -i  include files that are normally ignored (e.g. \\epoc32\\build\\...)
+  -f  (deprecated)
+  -v  verbose output (-vv very verbose)\n");
+}
+
+sub MakeSnapShot {
+  if (-e $fileName) {
+    die "Error: \"$fileName\" already exists\n";
+  }
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  my $compsPendingRelease = $envDb->ComponentsPendingRelease();
+  if (scalar (keys %$compsPendingRelease) > 0) {
+    die "Error: Can't make a snap shot of an environment contains components that are pending release\n";
+  }
+  (my $overallStatus, undef, my $dirtyComps, my $unaccountedFiles, my $duplicates) = $envDb->CheckEnv(1, $noIgnores);
+  if ($overallStatus == EnvDb::STATUS_CLEAN) {
+    print "Environment clean, aborting snap shot creation\n";
+    return;
+  }
+  if (scalar (@$duplicates) > 0) {
+    die "Error: Unexpected duplicates\n";
+  }
+  my @dirtyFiles;
+  foreach my $thisUnaccountedFile (@$unaccountedFiles) {
+    push (@dirtyFiles, Utils::RemoveEpocRoot($thisUnaccountedFile));
+  }
+  my @missingFiles;
+  foreach my $thisComp (@$dirtyComps) {
+    my $binaryList = $envDb->ListBins($thisComp->{comp});
+    shift @$binaryList; # Throw away list header;
+    foreach my $thisFile (@$binaryList) {
+      if ($thisFile->[1] eq EnvDb::STATUS_STRING_FAILED) {
+	push (@dirtyFiles, Utils::RemoveEpocRoot($thisFile->[0]));
+      }
+      elsif ($thisFile->[1] eq EnvDb::STATUS_STRING_MISSING) {
+	push (@missingFiles, Utils::RemoveEpocRoot($thisFile->[0]));
+      }
+    }
+  }
+
+  open (MISSING, ">$KMissingFileName") or die "Error: Couldn't open \"$KMissingFileName\" for writing\n";
+  foreach my $thisFile (@missingFiles) {
+    print MISSING "$thisFile\n";
+  }
+  close (MISSING);
+  push (@dirtyFiles, Utils::RemoveEpocRoot($KMissingFileName));
+
+  my $versionInfo = $envDb->VersionInfo();
+  open (COMPS, ">$KCompsFileName") or die "Error: Couldn't open \"$KCompsFileName\" for writing\n";
+  foreach my $thisComp (sort keys %$versionInfo) {
+    print COMPS "$thisComp $versionInfo->{$thisComp}\n";
+  }
+  close (COMPS);
+  push (@dirtyFiles, Utils::RemoveEpocRoot($KCompsFileName));
+
+  Utils::ZipList($fileName, \@dirtyFiles, $verbose, 0, Utils::EpocRoot());
+  Utils::SetFileReadOnly($fileName);
+
+  unlink ($KMissingFileName) or die "Error: Couldn't delete \"$KMissingFileName\": $!\n";
+  unlink ($KCompsFileName) or die "Error: Couldn't delete \"$KMissingFileName\": $!\n";
+  
+  print "Snapshot \"$fileName\" successfully made\n";
+}
+
+__END__
+
+=head1 NAME
+
+MakeSnapShot - Captures all dirty files in an environment into a user specified zip file that can be used to reproduce the environment.
+
+=head1 SYNOPSIS
+
+  makesnapshot [options] <snap_shot_file_name>
+
+options:
+
+  -h  help
+  -i  include files that are normally ignored (e.g. \epoc32\build\...)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+The release tools exist to make it relatively straight forward to share binary files in a controlled way. In order to acheive a suitable level of control, a fair amount of rigor is imposed on users when they are making releases. There are times when this is inappropriate. For example, if a user wants to temporarily capture the current state of their environment. The commands C<MakeSnapShot> and C<InstallSnapShot> exist to make it easy to accurately capture the current state of an environment, and subsequently revert to it, without the overhead of doing a full environment release. Snap shots should only be used in preference to full environment releases when there is a B<temporary> need to capture an environment, because:
+
+=over 4
+
+=item 1
+
+No mechansims are provided for exporting or importing snap shots.
+
+=item 2
+
+No release notes are provided with snap shots.
+
+=item 3
+
+The contents of snap shots are inherently dirty - they consist of all the files that could not be accounted for with proper releases. Reliance on snap shots as a means of distributing software would therefore eventually become a self defeating activity since the snap shot files would get larger and larger over time.
+
+=back
+
+C<MakeSnapShot> generates a zip file that contains all the dirty files currently present in the environment. It makes no attempt to understand which component own which files. It also stores some metadata in the zip file; a list of the component versions currently installed, and a list of files that are currently missing from the environment. This can subsequently be used by C<InstallSnapShot> to revert to the snap shot state.
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakeSnapShot.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MakingReleases	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,221 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Overview
+
+This document discusses the various techniques that can be used to make component releases. It describes the files that specify what comprises a component release (F<mrp> files), and then how these can be used to produce release packets. 
+
+=head1 Location
+
+Before you start, you should know where you want to store your release. The release tools support two structures of local archive - "component-based" and "project-based". If you're using the old-style, component-based structure, then skip this section since you have no choice where your release will be stored. (You can find out by seeing if you have an C<archive_path_file> line in your F<reltools.ini>.)
+
+If you are using the new-style, project-based, archive structure, then there may be several places you could store your release in the archive. These are called "projects", and may be something like "GT" or "LPD", or perhaps a licensee name. Any development you do should be stored in your own project, even if you've modified somebody else's component.
+
+For both C<makerel> and C<makeenv> commands, described later, you can optionally specify a project location with the C<-w> switch. If you don't, the release will be made to your default project which is the first one listed in your F<reltools.ini> file.
+
+=head1 Mrp Files
+
+Each component to be released must have a corresponding F<mrp> file. Normally this would be archived in the source code of the component. F<mrp> files can be automatically generated using the tool C<GenMrp>, but normally a certain amount of hand tuning will be required (to select the exact binary targets required, for example). The F<mrp> parser understands the following statements:
+
+=over 4
+
+=item * component <component_name>
+
+The name that will be used to refer to this component when using the release tools. Can be used only once per F<mrp>.
+
+=item * source (<source_file> | <source_directory>)
+
+Used to describe which source files should be put into a release. May be used more than once in a single F<.mrp> file (or not at all). If a directory is specified, all files in that directory and it's sub-directories will be included in the release.
+
+The specified paths may be absolute or relative. If they're relative, then they're relative to the location of the MRP. If they're absolute (start with a backslash) then they are assumed to be relative to the SRCROOT environment variable. If there's no SRCROOT environment variable, then a source root of \ is assumed.
+
+=item * [-]binary (<abld_path> <platform> [<variant> [<program>]]) | <binary_file> | <binary_directory>
+
+Used to describe which binary files should be put into a release. May be used more than once in a single F<.mrp> file (or not at all). The first argument structure (<abld_path> <platform> [<variant> <program>]) directs the Release Tools to enquire from the EPOC build tools which binaries should be included in the release. The <abld_path> argument should provide the full path to the directory where the component's <abld.bat> file lives. This will be the same directory as the component's <bld.inf> file. <platform> and <build_cmnd_1> ... <build_cmnd_n> must be valid for the corresponding <bld.inf> file (common choices would be C<wins udeb> and C<thumb urel>). You can also use the keyword all, which will read all the platforms supported by the <bld.inf> and include all of them (for both udeb and urel). Note, you can also specify the name of an individual F<mmp> file (or program), for example C<thumb urel mymmp>. 
+
+The second and third argument structures allow individual binary files and directories of binary files to be specified (as with the C<source> keyword, directories are recursively scanned). These forms of C<binary> statement should only be used if the first cannot be. However, with the EPOC build tool's support for custom make files, it is highly unlikely that this would ever be the case. If using a custom make file, be sure to provide a C<RELEASABLES> target, because this is how the release tools get the information they need.
+
+The C<binary> keyword can be preceded with a minus sign (C<->). This instructs the release tools to exclude the associated binaries from the release. You may therefore first use a C<binary> statement to specify more than you actually want to release, and and then a C<-binary> statement to refine the list. For example:
+
+ binary   \mycomp wins udeb
+ -binary  \mycomp wins udeb mymmp_to_exclude
+ -binary  \myfile_to_exclude
+
+Paths referring to <bld.inf> files are relative to SRCROOT, using the same rules as described in L<source>. Paths referring to binary files must be absolute, and are assumed to be within EPOCROOT.
+
+=item * [-]testbinary <abld_path> <platform> [<variant> [<program>]]
+
+Used to describe which test binary files should be put into a release. Identical to the first argument structure of the C<binary> keyword, except for use with test code. Also supports a preceeding minus sign (C<->) to allow the exclusion of certain programs.
+
+=item * exports <abld_path>
+
+Used to describe which exports (header files etc.) should be included. Note, by default exports are treated as though they are binary files unless the C<categorise_exports> keyword is specified in the F<reltools.ini>. This means that they are made available to all sites that are able to receive the binaries. If exports are categorised, they are given the same IPR category as the corresponding source file. See the F<Installation> section for details.
+
+This keyword can be used more than once. If the component's F<bld.inf> file lists more exports than are required, specific files may be removed from the export list using the C<-export_file> keyword. See below. Note, prior to release 2.59 of the tools, it was recommended that the keyword C<-binary> be used for this purpose. This is semantically identical when the C<categorise_exports> F<reltools.ini> keyword is B<not> used, however it has no effect when it is.
+
+=item * [-]export_file <source_export_file> <destination_export_file>
+
+Used to manually specify exported files. Note, both source and destination export file names must be specified. The source export file name is needed to assign the export's IPR category to that of the corresponding source file. The source file must therefore be present within the source tree specified using C<source> keywords. If this is not the case, an error will be thrown when the F<mrp> file is parsed.
+
+Note that the source and destination locations' arguments' relativity is the same as for the <source> keyword and the <binary file> keyword respectively. This is as you would expect.
+
+=item * notes_source <release_notes_source_path>
+
+Information regarding the content of a release should be provided in the form of a release notes source file. This will be stored with the release in a format that can be compiled in to HTML using the tool C<ViewNotes>. The C<notes_source> keywork is used to specify where this source file can be found. The location is assumed to be within the source code, and follows the same rules for relative and absolute paths as described above in L<source>. The following keywords are supported (the text beneath each keyword will be compiled into the release notes):
+
+=over 8
+
+=item * notesrc_releaser
+
+The name of the person making the release.
+
+=item * notesrc_release_reason
+
+A description of why the release was made (e.g. "Defect fix to alpha candidate").
+
+=item * notesrc_general_comments
+
+A summary of the release conent, including any information that it is particularly important others should read (e.g. "Interface X has been depricated in this release, please use Y instead. The reason for this was...").
+
+=item * notesrc_known_deviations
+
+A list of areas where this component is known to not conform to spec. (e.g. "Feature X is currently not working because defect Y needs to be fixed in component Z").
+
+=item * notesrc_bugs_fixed
+
+A list of defects fixed in this release (ideally including the defect reference code and description).
+
+=item * notesrc_bugs_remaining
+
+A list of known defects outstanding in this release (again, ideally including the defect reference code and description).
+
+=item * notesrc_other_changes
+
+A list of other changes made to the component (e.g. new features).
+
+=back
+
+=back
+
+Here's an example F<.mrp> file:
+
+  component      mycomp
+  source	 \mycomp
+  binary	 \mycomp\group wins udeb
+  binary	 \mycomp\group thumb urel
+  exports        \mycomp\group
+  notes_source	 \mycomp\group\release.src
+
+=head1 Making a Single Component Release
+
+The command C<MakeRel> can be used to create a single component release. It is assumed that the binaries to be released have already been built and tested. The following command...
+
+  makerel mycomp 001
+
+...instructs C<MakeRel> to read the F<mrp> file F<mycomp.mrp> (note, specifying the F<mrp> extension is optional) and generate a release packet with the version 001. If C<mycomp> version C<001> already exists, an error will be generated. Also, if any of the binaries referred to by the F<mrp> file do not exist, an error will be generated. The release will be put into the component's archive (specified in the project's archive path file, see the document I<Installation Guide> for details). Once a release has been made, the command C<GetRel> can be used to retrieve it.
+
+=head1 Making Multiple Component Releases
+
+C<MakeRel> can also be used to create more than one component release in one pass. The various F<mrp> file names and versions must be specified in a text file with lines in the following format:
+
+ <mrp_name> <version> [<internal_version>]
+
+C<MakeRel> can then be envoked as follows:
+
+ makerel mycomps.txt
+
+This technique can be useful when preparing the first set of releases for a project. However, where ever possible the command C<MakeEnv> should be used rather than C<MakeRel> because this performs a rigorous check of the environment to ensure it can be reliably reproduced in it's entirety.
+
+=head1 Making an Environment Release
+
+Releasing an environment involves releasing one or more components in a way that ensures the entire F<\epoc32> in which they currently reside can be reproduced. The command C<MakeEnv> is used to do this, which makes heavy use of the drive's environment database (this is a binary file stored on the current drive in F<\epoc32\relinfo>). Whenever a component is installed, upgraded or removed from an environment, the drive's environment database is updated. At any point in time, the environment database should contain an up to date list of versions of each component installed. The command C<EnvInfo> displays this information on the screen in a table. Using C<EnvInfo>'s C<-ff> switch, a fuller table can be displayed, for example:
+
+ Component   Version   Internal version                       Status   Mrp
+
+ mycomp1     026       //myproject/latest/mycomp1/...@10106   dirty    \mycomp1\mycomp1.mrp
+ mycomp2     057       //myproject/latest/mycomp1/...@10157   clean    \mycomp2\mycomp2.mrp
+
+ Overall status: dirty
+
+The status column shows the current status of each component currently installed. A status of C<clean> means that the component's binaries can be reproduced (this is determined by comparing the current time stamps of the files against as set that was stored when the component was installed (the component's I<signature>)). A status of C<dirty> means that the binaries cannot be reproduced. If any components have a status of C<dirty>, then the overall status of the environment will be C<dirty>. It is not possible to use C<MakeEnv> to release components whilst the environment is in a dirty state. In order to release the environment, all dirty components must have their status changed to C<pending release>. This may be done for a single component using the command C<PrepRel>:
+
+ preprel mycomp1 version [internal_version]
+
+Note, an internal version can be optionally specified. This will appear in the component's release notes, and may be of use for referrencing a configuration within a source control repository, for example. The command C<PrepEnv> can be used to prepare more than one component for release in one step.
+
+Even if all the components installed have a status of either C<clean> or C<pending release>, the overall status will be C<dirty> if there are files in the F<\epoc32> tree that are of unknown origin to the release tools, i.e. files that have not already been released by the C<clean> components, and will not be released by the C<pending release> components. In this situation one or more F<mrp> files will need to be changed to capture these files, or they will need to be removed from the environment before it can be released. Once C<EnvInfo> reports that the environment has an overall status of C<pending release>, the command C<MakeEnv> can be used to generate the releases. This command need not take any parameters, but using the C<-v> switch instructs it to be verbose about its activities.
+
+Once C<MakeEnv> has been run, other people in the same site may access the environment using C<GetEnv>. To provide remote sites access, the releases must first be encrypted and put on the project's FTP site. This is done using the command C<ExportEnv>. Other sites can then use the command C<ImportEnv> to bring the new releases into their local archive (see the document I<Installation Guide> for details of how to configure the release tools to do exporting and importing).
+
+=head1 Releasing the Output of a Build
+
+An individual site may have a build team whose role is to build and distribute the software being developed at that site. However, each time a build is performed, certain components may not have changed since the last time they were built. The command C<ValidateEnv> can be used to determine which components have changed and therefore need to be released. This is likely to significantly reduce the amount of data that must be transferred between sites (and ultimately down onto developer's workstations) compared to simply releasing everything each time. The following procedure is most commonly used:
+
+=over 4
+
+=item 1
+
+Install a reference environment using C<GetEnv> (this will be the environment against which C<ValidateEnv> will do its comparisons).
+
+=item 2
+
+Install the source to be built (normally from a source control system).
+
+=item 3
+
+Perform a clean build of the source, over writing the previously released binaries.
+
+=item 4
+
+Test the resultant binaries, repeating step 3 until all problems have been resolved.
+
+=item 5
+
+Run C<ValidateEnv> with no arguments. This will cause the binaries of each component currently installed to be unpacked into a temporary directory and compared with those in the current environment. The comparison is done by a tool that is able to ignore irrelevant differences between executables (such as data in headers). Any components that pass this comparison will have their signatures regenerated and their status set to C<clean>. Any component that fail this comparison will remain with a C<dirty> status. A list of components that failed will also be displayed at the end.
+
+=item 6
+
+Use C<PrepEnv> or C<PrepRel> to set the status of all C<dirty> components to C<pending release>, assigning a new version to each.
+
+=item 7
+
+Use C<MakeEnv> to release the environment.
+
+=back
+
+=head1 Trivia
+
+The file extension F<mrp> originates from the first version of the LPD release tools. It stood for B<M>C<ake>B<R>C<el> B<P>C<roject>, in keeping with the C<MakMake> file extension F<mmp>. Back then, the command C<MakeEnv> did not exist - C<MakeRel> was the only mechanism for making releases. The extension is retained now purely for historic reasons.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ManagingEnvironments	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,70 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Overview
+
+This document is intended to provide an overview of how to update and distribute environments.
+
+=head1 Receiving Releases
+
+
+
+
+ in one of three ways:
+
+=over 4
+
+=item *
+
+Via the local archive.
+
+=item *
+
+Via a remote archive.
+
+=item *
+
+Via a central FTP site.
+
+=item *
+
+
+
+=head1 Versioning
+
+=head1 Integration Clusters
+
+=head1 Branched Development
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MergeEnvironments	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,219 @@
+#!perl -w
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# MergeTwoEnvironments
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use RelData;
+use IniData;
+use MrpData;
+use EnvDb;
+use Getopt::Long;
+use Data::Dumper;
+use Utils;
+
+# Process command-line options
+Getopt::Long::Configure ("bundling");
+my ($help, $verbose, $project, $releasenotes, $dummyrun, $internalver, $force);
+GetOptions("h" => \$help, "v+" => \$verbose, "w=s" => \$project, "r=s" => \$releasenotes, "d" => \$dummyrun, "i=s" => \$internalver, 'f' => \$force);
+$verbose ||= 0;
+$internalver ||= "-";
+
+
+# Get the name and version of the new environment
+my ($newcomp, $newver, @argsleft) = @ARGV;
+print "Using \"$newcomp\" \"$newver\"\n" if ($verbose);
+
+# Eat up the environments to merge
+my @envstomerge;
+while (scalar @argsleft) {
+  my ($oldcomp, $oldver, $prefix);
+  ($oldcomp, $oldver, $prefix, @argsleft) = @argsleft;
+  print "Adding \"$oldcomp\" \"$oldver\" prefix \"$prefix\"\n" if ($verbose);
+  push @envstomerge, {
+    comp => $oldcomp,
+    ver => $oldver,
+    prefix => $prefix
+  };
+  die "You must provide a component, version and environment for each environment you want to merge" unless $oldcomp && $oldver && defined $prefix;
+    # In fact, a blank (but defined) prefix might be worth having so we'll let them get away with that
+}
+
+print <<ENDHELP and exit if $help;
+Merges several environments into a new release.
+Usage:
+MergeEnvironments <options> newcomp newver {oldcomp oldver prefix} ...
+
+The {oldcomp oldver prefix} section must be repeated at least twice
+
+Options:
+
+-r <release.src> the release.src file to use (mandatory)
+-h               show this help
+-w <project>     make the reldata in this project
+-v               verbose
+-f               (deprecated)
+-d               dummy run (just report the environment to be produced)
+-i <ver>         internal version number of the release we're creating
+ENDHELP
+
+die "You must specify a release notes file" unless $releasenotes;
+die "Release notes file \"$releasenotes\" doesn't exist" unless -e $releasenotes;
+
+##############################################################################
+
+# Create objects that the Release Tools need
+my $iniData = New IniData;
+my $envDb = Open EnvDb($iniData);
+
+# The final environment we're going to use
+my %newenv;
+
+foreach my $mergeenv (@envstomerge) {
+  my $env = ReadEnvironmentFromRelData($mergeenv->{comp}, $mergeenv->{ver});
+  my %copy = %$env;
+
+  # Delete things according to the prefix
+  foreach (keys %copy) {
+    my $prefix = $mergeenv->{prefix};
+    delete $copy{$_} if ($copy{$_} !~ m/^$prefix/i);
+  }
+
+  %newenv = (%copy, %newenv);
+}
+
+# Finally make sure our new component itself is in the environment
+$newenv{$newcomp} = $newver;
+
+if ($verbose || $dummyrun) {
+  print "Have combined the two environments. Results are:\n";
+  print Dumper(\%newenv);
+}
+
+CreateNewRelease($newcomp, $newver, \%newenv, $project) unless $dummyrun;
+
+exit;
+
+##############################################################################
+sub ReadEnvironmentFromRelData {
+  my $comp = shift;
+  my $ver = shift;
+  print "Reading environment from \"$comp\", \"$ver\"...\n" if ($verbose);
+  my $rd = Open RelData($iniData, $comp, $ver, 2) or die "Couldn't open reldata for \"$comp\" \"$ver\"";
+  return $rd->Environment;
+}
+
+sub CreateNewRelease {
+  my $comp = shift;
+  my $ver = shift;
+  my $env = shift;
+  my $project = shift;
+
+  my $fakeMrpName = Utils::PrependEpocRoot("\\__reltools_tmp_mrp");
+  WriteFakeMrp($fakeMrpName, $comp, $releasenotes);
+
+  my $mrpData = New MrpData($fakeMrpName,
+                          $ver, 
+                          $internalver, 
+                          $iniData, 
+                          $verbose,  # verbosity
+                          0); # fixLibs
+
+  unlink($fakeMrpName);
+
+  my $dir = $iniData->PathData->LocalArchivePathForNewComponent($comp, $ver, $project);
+  print "Making directory \"$dir\"\n" if ($verbose);
+  Utils::MakeDir($dir);
+  print "Writing out reldata\n";
+  my $relData = New RelData($iniData,
+                   $mrpData, 
+                   $releasenotes,
+                   $env, 
+                   "MergeTwoEnvironments", 
+                   $verbose, # verbosity
+                   undef, # dontPersist
+                   $project);
+  print "$comp $ver created.\n";
+}
+
+sub WriteFakeMrp {
+  my $name = shift;
+  my $comp = shift;
+  my $relnotes = shift;
+  open(FILE, ">$name") or die "Couldn't write to \"$name\" because $!";
+  print FILE "component $comp\nnotes_source $relnotes\n";
+  close FILE;
+}
+
+__END__
+
+=head1 NAME
+
+MergeEnvironments - Merge the environments of several existing releases into a new release
+
+=head1 SYNOPSIS
+
+MergeEnvironments <options> newcomp newver {oldcomp oldver prefix} ...
+
+The {oldcomp oldver prefix} section must be repeated at least twice.
+
+Options:
+
+  -r <release.src> the release.src file to use (mandatory)
+  -h               help
+  -w <project>     make the new release in this project (only applicable for new-style archive-path arrangements)
+  -v               verbose (-vv = very verbose)
+  -f		   (deprecated)
+  -d               dummy run (just report the environment to be produced)
+  -i <ver>         internal version number of the release we're creating
+
+=head1 DESCRIPTION
+
+This tool will merge several environments to produce a new one. It reads the environment from two existing components, and produces another one. This new component just contains an environment; it has no binaries nor source.
+
+It is expected that you will then use C<validateenv> to validate against that environment.
+
+=head1 KNOWN BUGS
+
+Not really a defect, but it's limiting that you can only merge the environments based on the prefix of the version number. It would be nice to have more flexible criteria.
+
+The command line syntax is not intuitive. This may be fixed one day.
+
+But much more likely, the whole issue will go away with Release Tools 3, when validation will be substantially changed.
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MergeEnvironments.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ModNotes	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,137 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use RelData;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'ModNotes');
+my $comp;
+my $notesSrc;
+my $ver;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+ModNotes();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $notesSrc = shift @ARGV;
+  $ver = shift @ARGV;
+
+  unless (defined $comp and defined $notesSrc and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  unless (defined $ver) {
+    my $envDb = EnvDb->Open($iniData, $verbose);
+    $ver = $envDb->Version($comp);
+    unless (defined $ver) {
+      die "Error: Version not specified and $comp not currently installed\n";
+    }
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: modnotes [options] <component> <notes_source_file> [<version>]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub ModNotes {
+  my $relData = RelData->Open($iniData, $comp, $ver, $verbose);
+  $relData->UpdateNotes($notesSrc);
+  print "Release notes for $comp $ver updated\n";
+}
+
+
+__END__
+
+=head1 NAME
+
+ModNotes - Modifies the release notes of a release that has already been made.
+
+=head1 SYNOPSIS
+
+  modnotes [options] <component> <notes_source_file> [<version>]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Occasionally release are made using the wrong release notes source. Also, sometimes mistakes in the source are spotted after the release has been made. C<ModNotes> may be used to rectify these problems after a release has been made. Unless a version is explicitly specified, the release notes of the currently installed version will be modified.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ModNotes.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MrpComplexity	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,218 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use Utils;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $force;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+Utils::QueryUnsupportedTool(undef, $force);
+my $ratings = ScanMrps();
+PrintReport($ratings);
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ('bundling');
+  my $help;
+  GetOptions('h' => \$help, 'v+' => \$verbose, 'f' => \$force);
+
+  if ($help) {
+    Usage(0);
+  }
+}
+
+sub ScanMrps {
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  my @comps = keys %{$envDb->{db}}; # This should go through an EnvDb interface - needs adding.
+  my %ratings;
+  foreach my $thisComp (@comps) {
+    my $dbEntry = $envDb->{db}->{$thisComp};
+    if (-e $dbEntry->{mrpName}) {
+      $ratings{$thisComp} = RateMrpFile($dbEntry->{mrpName});
+    }
+    elsif ($verbose) {
+      print "Warning: $thisComp\'s mrp file (\"$dbEntry->{mrpName}\") does not exit\n";
+    }
+  }
+  return \%ratings;
+}
+
+sub PrintReport {
+  my $ratings = shift;
+  my $tableData = [["Component", "Complexity Rating"]];
+
+  foreach my $thisComp (sort { $ratings->{$b} <=> $ratings->{$a} } keys %$ratings) {
+    if ($ratings->{$thisComp} > 0) {
+      push (@$tableData, [$thisComp, $ratings->{$thisComp}]);
+    }
+  }
+
+  print "\n";
+  Utils::PrintTable($tableData, 1);
+}
+
+sub RateMrpFile {
+  my $file = shift;
+  my $rating = 0;
+  print "Rating \"$file\"...\n" if ($verbose);
+  open (MRP, $file) or die "Error: Couldn't open \"$file\": $!\n";
+  while (my $line = <MRP>) {
+    chomp $line;
+    $line =~ s/^\s*$//;
+    $line =~ s/\s*#.*//;
+    unless ($line) {
+      # Nothing left.
+      next;
+    }
+
+    my $keyWord;
+    my $operand;
+    if ($line =~ /(\S+)\s+(.*)/) {
+      $keyWord = $1;
+      $operand = $2;
+    }
+    else {
+      die "Error: Invalid mrp file \"$file\"";
+    }
+
+    if ($keyWord eq 'binary') {
+      if (-f $operand) {
+	print "binary <file> statement found in \"$file\"\n" if ($verbose);
+	++$rating;
+      }
+    }
+    elsif ($keyWord eq '-binary') {
+      print "-binary statement found in \"$file\"\n" if ($verbose);
+      ++$rating;
+    }
+    elsif ($keyWord eq 'source') {
+      if (-f $operand) {
+	print "source <file> statement found in \"$file\"\n" if ($verbose);
+	++$rating;
+      }
+    }
+    elsif ($keyWord eq 'export_file') {
+      print "export_file statement found in \"$file\"\n" if ($verbose);
+      ++$rating;
+    }
+    elsif ($keyWord eq '-export_file') {
+      print "-export_file statement found in \"$file\"\n" if ($verbose);
+      ++$rating;
+    }
+    elsif ($keyWord eq 'testbinary') {
+      print "testbinary statement found in \"$file\"\n" if ($verbose);
+      ++$rating;
+    }
+  }
+  close (MRP);
+  return $rating;
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: mrpcomplexity [options] <file_name>
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-f  force, skip warnings about unsupported-ness\n");
+}
+
+
+__END__
+
+=head1 NAME
+
+MrpComplexity - Reports information on undesirable mrp constructs.
+
+=head1 SYNOPSIS
+
+  MrpComplexity [options]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -f  force, skip warnings about unsupported-ness
+
+=head1 DESCRIPTION
+
+Under normal circumstances F<mrp> files should contain very little information regarding where to find binary files. This information is best placed within the build configuration files (F<bld.inf>s and F<.mmp>s), as doing so allows F<mrp> files to be relatively self-maintaining.
+
+However, F<mrp> files support a rich syntax. This was designed to make it possible to release a component even if is it not possible to change the build configuration files (perhaps due to ownership restraints). Under these conditions, F<mrp> files can often become complex and as a result time consuming to maintain.
+
+This command provides a report that can be used to identify overly complex F<mrp> files, so that the root cause of this complexity can be found and eliminated. For each component in the environment, if its F<mrp> file is available, it is parsed and rated. The rating each is assigned is determined from the number of the following constructs that are found:
+
+ binary <file_name>
+ -binary
+ source <file_name>
+ export_file
+ -export_file
+ testbinary
+
+The report is presented showing the components with the highest complexity rating first. Those with a rating of zero are not shown.
+
+=head1 STATUS
+
+Unsupported/experimental. If you find a problem, please send us a patch.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MrpComplexity.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/MrpData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2418 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+
+
+package MrpData;
+
+use strict;
+use base qw(Symbian::CBR::MRPInterface);
+use File::Find;
+use File::Copy;
+use File::Basename;
+use File::Spec;
+use Utils;
+use Cwd;
+use Symbian::CBR::MRP::Reader;
+use IniData;
+
+use Carp;
+
+use constant MAX_PATH_LENGTH => 245; #If a file name has a path > MAX_PATH_LENGTH an error will be produced.
+
+
+
+use File::Path;
+use XML::Simple;
+use POSIX qw(strftime);
+use Data::Dumper;
+
+
+our $cache = {}; # Persistent (private) cache
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{mrpName} = shift;
+  $self->{ver} = shift;
+  $self->{intVer} = shift;
+  $self->{iniData} = shift || IniData->New();
+  $self->{verbose} = shift || 0;
+  $self->{fixMissingLibs} = shift;
+  $self->ExpandMrpName();
+  
+  # This will be used by the IPR stuff, so that it can popultate the MrpData object without circular stuff
+  my $doNotRead = shift;
+  
+  #remove the / from mrpname
+  $self->{mrpName} =~ s/^[\\\/]//;
+  
+  # Lowercase the MRP name so that the case is consistent when checking the cache
+  my $lcMrpName = lc ($self->{mrpName});
+  
+  if ($cache->{$lcMrpName}) {
+    $cache->{$lcMrpName}->{ver} = $self->{ver} if ($self->{ver});
+    $cache->{$lcMrpName}->{intVer} = $self->{intVer} if ($self->{intVer});             
+    return $cache->{$lcMrpName};
+  }
+
+  $cache->{$lcMrpName} = $self;
+  
+  if (!$doNotRead) {
+    $self->ReadMrp();
+  }
+  
+  return $self;
+}
+
+sub Populated {
+  my $self = shift;
+  
+  return $self->{populated};
+}
+
+
+sub ExpandMrpName {
+  my $self = shift;
+
+  unless ($self->{mrpName} =~ /.mrp$/i) {
+    $self->{mrpName} .= '.mrp';
+  }
+}
+
+sub Component {
+  my $self = shift;
+  unless (exists $self->{comp}) {
+    die "Error: Component name not found in mrp\n";
+  }
+  return $self->{comp};
+}
+
+sub MrpName {
+  my $self = shift;
+  return $self->{mrpName};
+}
+
+sub ExternalVersion {
+  my $self = shift;
+  return $self->{ver};
+}
+
+sub InternalVersion {
+  my $self = shift;
+  return $self->{intVer};
+}
+
+sub NotesSource {
+  my $self = shift;
+  unless (exists $self->{notes_src}) {
+    die "Error: Notes source not found in mrp for $self->{comp}\n";
+  }
+  return $self->{notes_src};
+}
+
+sub ClassifySource {
+  my $self = shift;
+  return if defined $self->{src};
+
+  foreach my $item (keys %{$self->{srcitems}}) {
+    if (-d Utils::PrependSourceRoot($item)) {
+      $self->HandleSourceDir($item);
+    }
+    elsif (-f Utils::PrependSourceRoot($item)) {
+      $self->HandleSourceFile($item);
+    }
+    else {
+      die "Error: \"$item\" is not a file or directory in $self->{mrpName}\n";
+    }
+  }
+}
+
+sub SourceCategories {
+  my $self = shift;
+  $self->ClassifySource();
+  if (defined $self->{src}) {
+    my @categories = keys %{$self->{src}};
+    return \@categories;
+  }
+  return [];
+}
+
+sub Source {
+  my $self = shift;
+  my $category = uc(shift);
+  $self->ClassifySource();
+  unless (defined $category) {
+    $category = 'unfiltered';
+  }
+  if (defined $self->{src}->{$category}) {
+    return $self->{src}->{$category};
+  }
+  return [];
+}
+
+sub SourceFilterErrors {
+  my $self = shift;
+  $self->ClassifySource();
+  if (defined $self->{sourceFilterErrors}) {
+    return $self->{sourceFilterErrors};
+  }
+  return [];
+}
+
+sub BinaryCategories {
+  my $self = shift;
+
+  $self->ProcessBinaries();
+
+  if ($self->{bins}) {
+    my @categories = sort keys %{$self->{bins}};
+    return \@categories;
+  }
+  return [];
+}
+
+sub Binaries {
+  my $self = shift;
+  my $category = shift;
+
+  $self->ProcessBinaries();
+
+  my @binList = ();
+  if ($category) {
+    die unless (exists $self->{bins}->{$category});
+    foreach my $thisBin (sort keys %{$self->{bins}->{$category}}) {
+      push (@binList, $self->{bins}->{$category}->{$thisBin});
+    }
+  }
+  else {
+    foreach my $thisCategory (@{$self->BinaryCategories()}) {
+      push (@binList, @{$self->Binaries($thisCategory)});
+    }
+  }
+  return \@binList;
+}
+
+sub ExportCategories {
+  my $self = shift;
+  if ($self->{iniData}->CategoriseExports()) {
+    $self->ProcessExports();
+    if ($self->{exports}) {
+      my @categories = sort keys %{$self->{exports}};
+      return \@categories;
+    }
+  }
+  return [];
+}
+
+sub Exports {
+  my $self = shift;
+  my $category = uc(shift);
+
+  $self->ProcessExports();
+
+  my @exportList = ();
+  if ($self->{iniData}->CategoriseExports()) {
+    if ($category) {
+      die unless (exists $self->{exports}->{$category});
+      push (@exportList, @{$self->{exports}->{$category}});
+    }
+    else {
+        foreach my $thisCategory (@{$self->ExportCategories()}) {
+          push (@exportList, @{$self->Exports($thisCategory)});
+        }
+    }
+  }
+  elsif ($category) {
+    die; # There are never any export categories if export categorisation is not enabled. Caller didn't call ExportCategories prior to this.
+  }
+  return \@exportList;
+}
+
+
+sub ClassifyAutomaticExports {
+  # Classify exports that were specified using the 'exports' keyword.
+  #
+  # This is a bit ugly. The problem's root is that it's not possible to ask the build tools where exports originated
+  # from. This information is needed to be able to categorise exports. To get it, the release tools therefore have
+  # to go 'under the hood' of the build tools. Yuk!
+  #
+  # Implementation choices were a) Parse bld.inf files, and b) Parse the generated export makefiles. Option (b) was
+  # chosen because bld.infs are notoriously difficult to robustly parse.
+
+  my $self = shift;
+  if (exists $self->{exports}->{automatic}) { # Only perform the classification if we haven't already done it.
+    foreach my $thisAbldPath (@{$self->{exports}->{abldPaths}}) {
+      $thisAbldPath = Utils::PrependSourceRoot($thisAbldPath);
+      # Scan the makefile looking for the exports we're expecting (from invoking 'abld -w exports' in HandleExports).
+
+      my $exportMakeFile;
+      my $testExportMakeFile;
+      $self->ExportMakeFile($thisAbldPath, \$exportMakeFile, \$testExportMakeFile);
+
+      if ($exportMakeFile){
+        $self->ProcessExportMakeFile($exportMakeFile, $thisAbldPath);
+
+      }
+      if ($testExportMakeFile){
+        $self->ProcessExportMakeFile($testExportMakeFile, $thisAbldPath);
+      }
+    }
+
+  }
+
+  if (scalar(keys %{$self->{exports}->{automatic}}) > 0) {
+    foreach my $unprocessed_export (keys %{$self->{exports}->{automatic}})
+	{
+		print "UNPROCESSED EXPORT: $unprocessed_export\n";
+	}
+
+    die "Error: Problem extracting export IPR categories for \"$self->{mrpName}\"\n";
+  }
+
+  delete $self->{exports}->{automatic};
+  delete $self->{exports}->{abldPaths};
+}
+
+sub ProcessExportMakeFile {
+	my $self = shift;
+	my $exportMakeFile = shift;
+        my $abldPath = shift;
+        my $errors = 0;
+        open (MAKEFILE, $exportMakeFile) or die "Error: Couldn't open \"$exportMakeFile\": $!\n";
+        while (my $line = <MAKEFILE>) {
+          $line =~ s/\\ / /g; # Get rid of escaped spaces.
+          if ($line =~ /^(.*)\s+:\s+(.*)/) {
+            # Found a possibility - need to see if it's one of the exports we're looking for.
+            my $destination = $1;
+            my $source = $2;
+            if (Utils::WithinEpocRoot($destination)) {
+              $destination = Utils::RemoveEpocRoot($destination);
+            }
+            if (exists $self->{exports}->{automatic}->{lc($destination)}) {
+              $source = Utils::RemoveSourceRoot($source);
+              # Add to exports to be processed - source and destination
+              push @{$self->{exportsToBeProcessed}}, {source => $source,
+                                                      destination => $destination,
+                                                      abldPath => $abldPath};
+              
+              delete $self->{exports}->{automatic}->{lc($destination)};
+            }
+          }
+          elsif ($line =~ /unzip\s+-u\s+-o\s+(.*)\s+-d\s+\"(.*)\"/) {
+            # Looks like a zip file being exported - check contents.
+            my $zipFileName = $1;
+            my $destinationDir = $2;
+            my $zipContents = Utils::ListZip($zipFileName);
+            $zipFileName = Utils::RemoveSourceRoot($zipFileName);
+            foreach my $thisExport (@$zipContents) {
+              $thisExport = Utils::ConcatenateDirNames($destinationDir, $thisExport);
+              if (Utils::WithinEpocRoot($thisExport)) {
+                $thisExport = Utils::RemoveEpocRoot($thisExport);
+              }
+              if (exists $self->{exports}->{automatic}->{lc($thisExport)}) {
+                # Add to exports to be processed - source and destination
+                push @{$self->{exportsToBeProcessed}}, {source => $zipFileName,
+                                                        destination => $thisExport,
+                                                        abldPath => $abldPath};
+                
+                delete $self->{exports}->{automatic}->{lc($thisExport)};
+              }
+            }
+          }
+        }
+        close (MAKEFILE);
+}
+
+sub ExportMakeFile {
+  # Invoke 'bldmake bldfiles -v' to find the full path to the EXPORT.MAKE file.
+  my $self = shift;
+  my $abldPath = shift;
+  my $exportMakeFileRef = shift;
+  my $testExportMakeFileRef = shift;
+  my $cwd = cwd();
+  my $last = 0;
+  chdir $abldPath or die "Error: Couldn't change working directory to \"$abldPath\": $!\n";
+  open (BLDMAKE, 'bldmake bldfiles -v |') or die "Error: Couldn't run \"bldmake bldfiles -v |\" in \"abldPath\": $!\n";
+  my $exportMakeFile;
+  my $testExportMakeFile;
+  while (my $line = <BLDMAKE>) {
+    if ($line =~ /Creating \"(.*EXPORT.MAKE)\"/) {
+      $exportMakeFile = $1;
+      if ($last == 1){ # found both EXPORT.MAKE and EXPORTTEST.MAKE
+        last;
+      }
+      $last = 1;
+    }
+    elsif ($line =~ /Creating \"(.*EXPORTTEST.MAKE)\"/) {
+      $testExportMakeFile = $1;
+      if ($last == 1){ # found both EXPORT.MAKE and EXPORTTEST.MAKE
+        last;
+      }
+      $last = 1;
+    }
+  }
+  close (BLDMAKE);
+  chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+  unless ($exportMakeFile || $testExportMakeFile) {
+    die "Error: Unable to find \"EXPORT.MAKE\" or \"EXPORTTEST.MAKE\" for \"$abldPath\"\n";
+  }
+  $$exportMakeFileRef = $exportMakeFile;
+  $$testExportMakeFileRef = $testExportMakeFile;
+}
+
+sub ClassifyManualExports {
+  my $self = shift;
+  if (exists $self->{exports}->{manual}) { # Only perform the classification if we haven't already done it.
+    foreach my $thisSource (keys %{$self->{exports}->{manual}}) {
+      push @{$self->{exportsToBeProcessed}}, {source => $thisSource,
+                                              destination => $self->{exports}->{manual}->{$thisSource}};
+    }
+    delete $self->{exports}->{manual};
+  }
+}
+
+sub ExportInfoForCat {
+  my $self = shift;
+  my $category = uc(shift);
+
+  $self->ProcessExports();
+
+  return $self->{exportinfo}->{$category};
+}
+
+sub ExportSourceFileInfoForCat {
+  my $self = shift;
+  my $category = uc(shift);
+  my $exportfile = shift;
+
+  # In AddExport $category is called $class and $exportfile is $destination
+  return $self->{exportinfo}->{$category}->{$exportfile};
+}
+
+sub AddExport {
+  my $self = shift;
+  my $source = shift;
+  my $destination = shift;
+  my $successfullyAdded = 0;
+
+  my ($class) = Utils::ClassifyPath($self->{iniData}, $source, $self->{verbose}, 0, $self->Component());
+  $class = uc($class);
+
+  if ($class) {
+    $successfullyAdded = 1;
+    push (@{$self->{exports}->{$class}}, $destination);
+  }
+  else {
+    print "Error: Can't find IPR category for export \"$destination\" in \"$self->{mrpName}\"
+       It should correspond to source file \"$source\"\n";
+  }
+
+  # Need to record the src paths.
+  $self->{exportinfo}->{$class}->{$destination} = $source;
+
+  return $successfullyAdded;
+}
+
+sub BinariesAndExports {
+  my $self = shift;
+  # Exports need to be processed first.  If exports are not to be categorised then
+  # they are treated as binary files.
+  my $list = $self->Exports();
+  push (@$list, @{$self->Binaries()});
+  return $list;
+}
+
+sub SourceItems {
+  my $self = shift;
+  return $self->{srcitems};
+}
+
+sub ReadMrp {
+  my $self = shift;
+  my $mrpName = $self->{mrpName};
+  my $cwd = cwd();
+  # If there are mappings and the source root is \\, perform mappings on filename. Otherwise prepend source root.
+  if($self->{iniData}->HasMappings() && Utils::SourceRoot() eq "\\") {
+    $mrpName = $self->{iniData}->PerformMapOnFileName($mrpName);
+  }
+  else{
+    $mrpName = Utils::PrependSourceRoot($mrpName);
+  }
+  
+  my $mrpDir = dirname($mrpName);
+  
+  chdir($mrpDir) or die "Error: Couldn't change working directory to \"$mrpDir\": $!\n";
+ 
+  my $reader = Symbian::CBR::MRP::Reader->instance();
+  $reader->SetVerbose() if ($self->{verbose});
+
+  $reader->ReadFile($mrpName, 'MRPDATA');
+  
+  chdir($cwd) or die "Error: Couldn't change working directory back to \"$cwd\": $!\n";
+  if ($@) {
+    die $@;
+  }
+}
+
+
+sub HandleSourceFile {
+  my $self = shift;
+  my $srcFile = shift;
+
+  my $logErrors = !$self->{iniData}->IgnoreSourceFilterErrors();
+  my ($cat, $errors) = Utils::ClassifyPath($self->{iniData}, $srcFile, $self->{verbose}, $logErrors, $self->Component());
+
+  if ($self->{verbose}) {
+    print "Handling source file $srcFile...\n";
+  }
+  
+  push @{$self->{sourceFilterErrors}}, @$errors if @$errors;
+  push @{$self->{src}->{uc($cat)}}, $srcFile;
+}
+
+sub HandleSourceDir {
+  my $self = shift;
+  my $srcDir = Utils::PrependSourceRoot(shift);
+
+  if ($self->{verbose}) {
+    print "Filtering source directory $srcDir into categories...\n";
+  }
+ 
+  # Create function to handle files in a directory ($File::Find::dir)
+  # Takes: List of items (files and dirs) in the directory 
+  my $dirhandler = sub {
+    my @entries = @_;
+    my $hasdistpol = scalar(grep(lc($_) eq "distribution.policy", @entries));
+    
+    @entries = grep(lc($_) ne "distribution.policy", @entries); # remove distribution.policy entries
+    
+    foreach my $entry (@entries) {
+      if (Utils::CheckForUnicodeCharacters($entry)) {
+          die "Error: \"$File::Find::dir\\$entry\" contains unicode characters, which are incompatible with the CBR Tools. This file can not be included in this release.\n"; 
+      }    
+    }
+    
+    my @files = grep(-f File::Spec->catfile($File::Find::dir,$_), @entries);
+    
+    # Remove the abld entries from the source
+    $self->RemoveAbldFromSource($File::Find::dir, \@files);
+    
+    if (scalar(@files) > 0) {    
+      
+      # Tag all the entries in this directory with that category
+      foreach my $entry (@files) {
+        next if $entry =~ /^\.\.?$/; # Skip . and ..
+        my $entry = File::Spec->catfile($File::Find::dir, $entry);
+        Utils::TidyFileName(\$entry);
+        
+        $entry = Utils::RemoveSourceRoot($entry); # remove source root path or it will be added twice!
+        my ($category, $errors) = Utils::ClassifyPath($self->{iniData}, $entry, $self->{verbose}, $self->{iniData}->IgnoreSourceFilterErrors(), $self->Component());
+        push @{$self->{sourceFilterErrors}}, @$errors; # There will be no errors in @$errors if IgnoreSourceFilterErrors was set
+        
+        # (Optionally) guard against unclassified source
+        if (lc($category) eq "x" and $self->{iniData}->DisallowUnclassifiedSource()) {
+          die "Error: \"$File::Find::dir\" contains unclassified source code\n";
+        }
+        
+        push @{$self->{src}->{uc($category)}}, $entry;
+      } 
+    } else {
+      # There are no files to categorise here
+      if (($hasdistpol) and (!($self->{iniData}->IgnoreSourceFilterErrors()))) {
+        push @{$self->{sourceFilterErrors}}, "Note: unnecessary policy file in $File::Find::dir\n";
+      }
+    }
+    
+    # Return full list of entries to continue scan
+    return @entries;
+  };
+
+  # Traverse the directory tree in $srcDir calling &$dirhandler on all directories
+  find({"wanted"=>sub{}, "preprocess"=>$dirhandler, "no_chdir" => 1}, $srcDir);
+}
+
+sub RemoveAbldFromSource {
+  my $self = shift;
+  my $dir = shift;
+  my $files = shift;
+  
+  $dir = File::Spec->canonpath($dir);
+
+  foreach my $entry (@{$self->{binaryStatements}}, @{$self->{exportsStatements}}) {
+    if ($entry->{abldPath} eq $dir) {
+      @$files = grep $_ !~ /abld.bat/i, @$files;
+      return;
+    }
+  }  
+}
+
+sub HandleBinDirOrFile {
+  my $self = shift;
+  my $remove = shift;
+  my $category = shift;
+  my $file = shift;
+  my $successRef = shift;
+
+  if (-d $file) {
+    $self->HandleBinDir($remove, $category, $file, $successRef);
+  }
+  elsif ($file) {
+    $self->HandleBinFile($remove, $category, $file, $successRef);
+  }
+}
+
+sub HandleBinFile {
+  my $self = shift;
+  my $remove = shift;
+  my $category = shift;
+  my $file = Utils::RemoveEpocRoot(shift);
+  my $successRef = shift;
+
+  my $lcFile = lc($file); # Note, duplicate check is performed on lower case file name. Original case is preserved within the hash.
+  Utils::TidyFileName(\$file);
+
+  die "No category was provided" unless $category;
+
+  if ($remove) {
+    foreach my $thisClassification (keys %{$self->{bins}}) {
+      if (exists $self->{bins}->{$thisClassification}->{$lcFile}) {
+        if ($self->{verbose} > 1) { print "Excluding binary file \"$file\" from $thisClassification...\n"; }
+        delete $self->{bins}->{$thisClassification}->{$lcFile};
+        $$successRef = 1;
+      }
+    }
+  }
+  else {
+    unless ($self->IsDuplicateBin($file)) {
+      if ($self->{verbose} > 1) { print "Adding binary file \"$file\" to category $category...\n"; }
+      $self->{bins}->{$category}->{$lcFile} = $file;
+      $$successRef = 1;
+    }
+  }
+
+  }
+
+
+sub HandleBinDir {
+  my $self = shift;
+  my $remove = shift;
+  my $category = shift;
+  my $binDir = shift;
+  my $successRef = shift;
+
+  find($self->ProcessBinFile($remove, $category, $successRef), $binDir);
+}
+
+sub ProcessBinFile {
+  my $self = shift;
+  my $remove = shift;
+  my $category = shift;
+  my $successRef = shift;
+  return sub {
+    my $file = $File::Find::name;
+    
+    if (Utils::CheckForUnicodeCharacters($file)) {
+      die "Error: \"$file\" contains unicode characters, which are incompatible with the CBR Tools. This file can not be included in this release.\n"; 
+    }    
+    
+    if (-f $file) {
+      Utils::TidyFileName(\$file);
+      $self->HandleBinFile($remove, $category, $file, $successRef);
+    }
+  }
+}
+
+sub IsDuplicateBin {
+  my $self = shift;
+  my $fileName = shift;
+  my $fileNameLc = lc ($fileName);
+
+  my $duplicate = 0;
+  foreach my $thisCategory (keys %{$self->{bins}}) {
+    if (exists $self->{bins}->{$thisCategory}->{$fileNameLc}) {
+      # This file has already been handled once, so it must be a duplicate.
+      # Therefore move it to the 'unclassified' category to ensure it doesn't get released twice.
+      if ($thisCategory ne 'unclassified') {
+	if ($self->{verbose} > 1) {
+	  print "Moving binary file \"$fileName\" to from category $thisCategory to 'unclassified'...\n";
+	}
+	$self->{bins}->{unclassified}->{$fileNameLc} = $fileName;
+	delete $self->{bins}->{$thisCategory}->{$fileNameLc};
+      }
+      $duplicate = 1;
+      last;
+    }
+  }
+
+  return $duplicate;
+}
+
+sub HandleBinSet {
+  my $self = shift;
+  my $remove = shift;
+  my $test = shift;
+  if ($test) {
+    $test = 'test';
+  }
+  else {
+    $test = '';
+  }
+  my $successRef = shift;
+  my $abldPath = shift;
+  $abldPath = SourceRootPath($abldPath);
+  my $plat = shift;
+  my $var = '';
+  if ($_[0] and $_[0] =~ /(u?(?:deb|rel))/i) {
+    $var = shift;
+  }
+  my $mmp = shift;
+  unless ($mmp) {
+    $mmp = '';
+  }
+  
+  $self->ProcessCache($abldPath, $test) if (!exists($self->{abldcache}->{loaded}->{$abldPath}));
+
+  my $plats = $self->ResolveAlias($abldPath, $plat);
+  my $vars;
+  foreach $plat (@$plats) {
+    if ($var) {
+      $vars = [$var];
+    } elsif ($plat =~ /^tools2?$/i) {
+      # Hard-coded and nasty
+      $vars = [ 'deb', 'rel' ];
+    } else {
+      $vars = [ 'udeb', 'urel' ];
+    }
+    foreach $var (@$vars) {
+      push @{$self->{binsets}}, {
+        path => Utils::RemoveSourceRoot($abldPath),
+        plat => $plat,
+        var => $var,
+        mmp => $mmp,
+        test => $test
+      } unless ($remove);
+
+      $self->ReadBinaries($abldPath, $test, $plat, $var, $mmp, $remove, $successRef);
+    }
+  }
+}
+
+
+sub ProcessCache {
+  my $self = shift;
+  my $abldPath = shift;
+  my $test = shift;
+  
+  $self->CheckBuildSystem($abldPath) if(!$self->{buildSystem});
+
+  if($self->{buildSystem} == 2){
+    print "current build system is Raptor...\n" if ($self->{verbose});
+    $self->ProcessRaptorCache($abldPath, $test);
+  }
+  else{
+    print "current build system is Abld...\n" if ($self->{verbose});
+    $self->ProcessAbldCache($abldPath);
+  }
+}
+
+#check which build system would be using
+sub CheckBuildSystem {
+  my $self = shift;
+  my $abldPath = shift;
+  my $buildSystem = $self->{iniData}->BuildSystemVersion($self->{verbose});
+
+  if($buildSystem eq "1") {
+    if ($self->AbldAvailable($abldPath)){
+      $self->{buildSystem} = 1;
+    }
+    else{
+      die "Abld build system isn't available.\n";
+    }
+  }
+  else{
+    if($buildSystem ne "2") {
+	    print "Warning: the value of build system is neither 1 nor 2 so we try to use Raptor.\n" if ($self->{verbose});
+    }
+    
+    if ($self->RaptorAvailable()){
+      $self->{buildSystem} = 2;
+    }
+    elsif($buildSystem ne "2") {
+      print "Warning: Raptor is not available and we try to use Abld.\n" if ($self->{verbose});
+	  	
+      if ($self->AbldAvailable($abldPath)){
+        $self->{buildSystem} = 1;
+      }
+      else{
+        die "Neither Abld nor Raptor is available.\n";
+      }
+    }
+    else{
+      die "Raptor build system is not available.\n";
+    }
+  }
+}
+
+sub ProcessAbldCache {
+  my $self = shift;
+  my $abldPath = shift;
+  if (exists $ENV{ABLDCACHE}) {
+    $self->{abldcache}->{loaded}->{$abldPath}= 1;
+    my $cachefile=File::Spec->catdir($ENV{ABLDCACHE},$abldPath,"cache");
+    if (-f $cachefile) {
+      print "Reading ABLD Cache from $cachefile\n" if ($self->{verbose});
+	
+      open(CACHE, $cachefile) or die "Couldn't open abld cache data file '$cachefile'\n";
+      my @cache = <CACHE>;
+      close(CACHE);
+      eval (join("",@cache)) or die "Error: Couldn't parse abld cache data in '$cachefile': $@\n";
+    }
+  }
+}
+
+sub ProcessRaptorCache {
+  my $self = shift;
+  my $abldPath = shift;
+  my $test = shift;
+
+  my $cwd = cwd();
+  my $driver = $cwd;
+  $driver =~ /^(.:)(.*)/;
+  $driver = $1."\\raptorcache";
+  my $logfile = File::Spec->catdir($driver.$abldPath,"info.xml");
+  if(! -f $logfile){
+    my $makefile = File::Spec->catdir($driver.$abldPath,"Makefile");
+    print "execute SBS to create Raptor XML log file: $logfile\n" if($self->{verbose});
+    chdir $abldPath or die "Error: Couldn't change working directory to \"$abldPath\": $!\n";
+    my $cmd = $self->RaptorLogCmd($abldPath, $logfile, $makefile, $test);
+    open (SBS, $cmd) or die "Error: Couldn't run \"$cmd\" in \"$abldPath\": $!\n";
+    my $foundLog;
+    my $errmsg;
+    while (my $line = <SBS>) {
+      $errmsg = $1 if ($line =~ /sbs : errors: (\d+)/ and $1 > 0);
+      $foundLog = 1 if ($line =~ /sbs: build log in (\w+)/);
+    }
+    close (SBS);
+			  
+    if($errmsg){
+      my $trycount = 50;
+      my $errtag = 0;
+      while($trycount > 0){
+        print "try to run sbs again: $trycount\n";
+        open (SBS, $cmd) or die "Error: Couldn't run \"$cmd\" in \"$abldPath\": $!\n";
+        $errtag = 0;
+        while (my $line = <SBS>) {
+          if ($line =~ /sbs : errors: (\d+)/ and $1 > 0){
+            $errtag = 1;
+            $trycount = $trycount - 1;
+          }
+          $foundLog = 1 if ($line =~ /sbs: build log in (\w+)/);
+        }
+        $trycount =0 if($errtag < 1);
+        close (SBS);
+      }
+      if($errtag == 1 and $trycount == 0) {
+      	die "SBS Error: Couldn't run \"$cmd\" in \"$abldPath\"\n";
+      }
+    }
+    chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+    unless ($foundLog) {
+      die "Error: Unable to execute \"SBS\" in \"$abldPath\"\n";
+    }
+  }
+
+  $self->ParseRaptorXmlLog($logfile);
+  $self->PrintCache() if($self->{verbose});
+  $self->{abldcache}->{loaded}->{$abldPath}= 1;
+  print "cache is generated successfully\n" if($self->{verbose});
+}
+
+sub RaptorLogCmd {
+  my $self = shift;
+  my $abldPath = shift;
+  my $logfile = shift;
+  my $makefile = shift;
+  my $test = shift;
+  if ($test) {
+    $test = 'test';
+  }
+  else {
+    $test = '';
+  }
+
+  my $plat = "all";
+  my $iniAll = $self->{iniData}->TargetPlatforms($plat);
+  my $cmd = "SBS -b bld.inf -m $makefile -f $logfile -c default";
+  $cmd = $cmd." -c default.test" if ($test ne '');
+  foreach my $e (@$iniAll) {
+    $cmd = $cmd." -c tools_rel -c tools_deb" if ($e eq "TOOLS");
+    $cmd = $cmd." -c tools2_rel -c tools2_deb" if ($e eq "TOOLS2");
+    $cmd = $cmd." -c armv5.smp" if ($e eq "ARMV5SMP");
+  }
+  $cmd = $cmd." WHAT |";
+  print "Raptor command: $cmd\n";
+  return $cmd;
+}
+
+#check whether Abld build system is available
+sub AbldAvailable {
+  my $self = shift;
+  my $abldPath = shift;
+  my $path = File::Spec->catdir($abldPath,"");
+  my $foundPlats = 0;
+
+  my $cwd = cwd();
+  chdir $abldPath or die "Error: Couldn't change working directory to \"$abldPath\": $!\n";
+  open (BLDMAKE, "bldmake bldfiles |") or die "Error: Couldn't run \"bldmake bldfiles\" in \"$abldPath\": $!\n";
+  while (my $line = <BLDMAKE>) {
+    chomp $line;
+  }
+  close(BLDMAKE);
+	
+  open (ABLD, "abld help |") or die "Error: Couldn't run \"abld help\" in \"$abldPath\": $!\n";
+  while (my $line = <ABLD>) {
+    chomp $line;
+    $foundPlats = 1 if ($line =~ /project platforms:/);
+  }
+  close (ABLD);
+  chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+  
+  return $foundPlats;
+}
+
+#check whether Raptor build system is available
+sub RaptorAvailable {
+  my $self = shift;
+  my $maxver = 0;
+  my $midver = 0;
+  my $minver = 0;
+  
+  return 0 if(!-f "\\epoc32\\data\\buildinfo.txt" and !-f "\\epoc32\\data\\kif.xml");
+
+  open (SBS, "sbs -version |") or die "Error: Couldn't run \"sbs -version\": $!\n";
+  while (my $line = <SBS>) {
+    chomp $line;
+    if ($line =~ /^sbs version (\d+)\.(\d+)\.(\d+)/){
+      $maxver = $1;
+      $midver = $2;
+      $minver = $3;
+    }
+  }
+  close (SBS);
+  if ($maxver == 0 and $midver == 0 and $minver == 0) {
+    return 0;
+  }
+  elsif ($maxver < 2 or ($maxver == 2 and $midver < 7)) {
+    die "Error: Raptor build system version must be 2.7.0 or higher.\n";
+  }
+  return 1;
+}
+
+sub ParseRaptorXmlLog {
+  my $self = shift;
+  my $xmlfile = shift;
+
+  my $xmldata;
+  my $trycount = 20;
+
+  while ($trycount > 0) {
+    eval {
+      $xmldata = XMLin($xmlfile);
+    };
+    if ($@) {
+      $trycount = $trycount - 1;
+      print "Try to open raptor log file [$trycount]: $xmlfile\n";
+    }
+    else{
+      $trycount = 0;
+    }
+  }
+
+  my $whatLogElements = $self->WrapVarToArray($xmldata->{whatlog});
+  foreach  my $whatLogElement (@$whatLogElements) {
+    $self->ProcessWhatLogElement($whatLogElement);
+  }
+  
+  foreach my $param (keys %{$self->{abldcache}->{exports}}) {
+    foreach my $destination (keys %{$self->{abldcache}->{exports}->{$param}}) {
+      push @{$self->{abldcache}->{$param}}, [$destination, $self->{abldcache}->{exports}->{$param}->{$destination}];
+    }
+  }
+  delete $self->{abldcache}->{exports};
+  
+  foreach my $param (keys %{$self->{abldcache}->{builds}}) {
+    foreach my $buildItem (keys %{$self->{abldcache}->{builds}->{$param}}) {
+      push @{$self->{abldcache}->{$param}}, $buildItem;
+    }
+  }
+  delete $self->{abldcache}->{builds};
+  
+  foreach my $platform (keys %{$self->{abldcache}->{platforms}}) {
+    push @{$self->{abldcache}->{plats}}, uc($platform);
+  }
+  delete $self->{abldcache}->{platforms};
+}
+
+sub ProcessWhatLogElement {
+  my $self = shift;
+  my $aWhatLogElement = shift;
+  
+  my $bldinf = $aWhatLogElement->{bldinf};
+  my $bldinfDir = $bldinf;
+  $bldinfDir =~ s/\//\\/g;
+  $bldinfDir =~ /^.:(.+)\\(.*)/;
+  $bldinfDir = $1;
+  
+  my $mmp = $aWhatLogElement->{mmp};
+  my $config = $aWhatLogElement->{config};
+  
+  my $platform = "";
+  my $variant = "";
+  my $test;
+  
+  if ($config =~ /^(\w+)_(\w+)\.test/){
+    $platform = $1;
+    $variant = $2;
+    $test = "test";
+  }
+  elsif ($config =~ /^(\w+)_(\w+)*/){
+    $platform = $1;
+    $variant = $2;
+  }
+
+  if($aWhatLogElement->{export}){
+    my $exports = $self->WrapVarToArray($aWhatLogElement->{export});
+    foreach  my $export (@$exports) {
+      $self->StoreExportItem ($bldinfDir, $export->{source}, $export->{destination}, $test);
+    }
+  }
+  if($aWhatLogElement->{archive}){
+    my $archives = $self->WrapVarToArray($aWhatLogElement->{archive});
+    foreach my $archive (@$archives){
+      foreach  my $member (@{$archive->{member}}) {
+        $self->StoreExportItem ($bldinfDir, $archive->{zipfile}, $member, $test);
+      }
+    }
+  }
+  if($aWhatLogElement->{build}){
+    my $buildItems = $self->WrapVarToArray($aWhatLogElement->{build});
+    foreach  my $buildItem (@$buildItems) {
+      $self->StoreBuildItem ($bldinfDir, $buildItem, $platform, $variant, $test);
+    }
+  }
+  if($aWhatLogElement->{resource}){
+    my $resources = $self->WrapVarToArray($aWhatLogElement->{resource});
+    foreach  my $buildItem (@$resources) {
+      if($buildItem =~ /[\\|\/]epoc32[\\|\/]release[\\|\/]winscw[\\|\/](urel|udeb)[\\|\/]/g){
+        $variant = $1;
+      }
+      else{
+        $variant = "ALL"; 
+      }
+      $self->StoreBuildItem ($bldinfDir, $buildItem, $platform, $variant, $test);
+    }
+  }
+  if($aWhatLogElement->{bitmap}){
+    my $bitmaps = $self->WrapVarToArray($aWhatLogElement->{bitmap});
+    foreach  my $buildItem (@$bitmaps) {
+      $self->StoreBuildItem ($bldinfDir, $buildItem, $platform, "ALL", $test);
+    }
+  }
+  if($aWhatLogElement->{stringtable}){
+    my $stringTables = $self->WrapVarToArray($aWhatLogElement->{stringtable});
+    foreach  my $buildItem (@$stringTables) {
+      $self->StoreBuildItem ($bldinfDir, $buildItem, $platform, $variant, $test);
+    }
+  }
+  
+  $self->{abldcache}->{platforms}->{$platform} = 1 if($platform ne "ALL");
+
+  my $param = "$bldinfDir ";
+  $param = $param."test " if ($test);
+  $param = $param."export -what";
+  if(!$self->{abldcache}->{$param}){
+    pop @{$self->{abldcache}->{$param}};
+  }
+}
+
+sub StoreExportItem {
+  my $self = shift;
+  my $bldinfDir = shift;
+  my $aSource = shift;
+  my $aDestination =shift;
+  my $test = shift;
+  $aSource = $self->ReleasableItem($aSource);
+  $aDestination = $self->ReleasableItem($aDestination);
+  my $param = "$bldinfDir ";
+  $param = $param."test " if ($test);
+  $param = $param."export -what";
+  $self->{abldcache}->{exports}->{$param}->{$aDestination} = $aSource;
+}
+
+sub StoreBuildItem {
+  my $self = shift;
+  my $bldinfDir = shift;
+  my $aBuildItem = shift;
+  my $aPlatform = shift;
+  my $aVariant = shift;
+  my $test = shift;
+	
+  if($aPlatform ne "ALL" and $aVariant eq "ALL"){
+    $self->StoreBuildItem($bldinfDir, $aBuildItem, $aPlatform, "urel", $test);
+    $self->StoreBuildItem($bldinfDir, $aBuildItem, $aPlatform, "udeb", $test);
+  }
+  else{
+    $aBuildItem = $self->ReleasableItem($aBuildItem);
+    my $param = "$bldinfDir ";
+    $param = $param."test " if ($test);
+    $param = $param."target $aPlatform $aVariant -what";
+    $self->{abldcache}->{builds}->{$param}->{$aBuildItem} = 1;
+    $self->{abldcache}->{platforms}->{$aPlatform} = 1 if($aPlatform ne "ALL");
+  }
+}
+
+sub ReleasableItem {
+  my $self = shift;
+  my $aBuildItem = shift;
+  $aBuildItem =~ s/\/\//\\/g;
+  $aBuildItem =~ s/\//\\/g;
+  $aBuildItem =~ s/\"//g;
+  $aBuildItem =~ /^.:(.+)/;
+  return $1;
+}
+
+
+sub WrapVarToArray {
+  my $self = shift;
+  my $var = shift;
+  my @result;
+  
+  if($var){
+    if($var =~/^ARRAY*/){
+      return $var;	
+    }
+    else{
+      push (@result, $var);
+    }
+  }
+  return \@result;
+}
+
+sub PrintCache {
+  my $self = shift;
+  print "print cache content\n" if($self->{verbose});
+  foreach my $item (keys %{$self->{abldcache}}) {
+    if($item ne "loaded"){
+      print "\$self->{abldcache}->{\'$item\'} =\n";
+      print " [\n";
+      my $first = 1;
+      
+      foreach my $cachedata (@{$self->{abldcache}->{$item}}) {
+      	print ",\n" if($first > 1);
+      	$first = $first+1;
+        if($cachedata=~/^ARRAY*/){
+    	    print " [\'@$cachedata[0]\', \'@$cachedata[1]\']";
+        }
+        else{
+    	    print " \'$cachedata\'";
+        } 
+      }
+      print "\n ];\n\n";
+    }
+  }
+}
+
+# Support for target alias file
+# If the MRP specifies 'ALL' then the intersection of the
+# definition of 'ALL' and the output of abld help is used
+# as the platform list
+sub ResolveAlias {
+  my $self = shift;
+  my $abldPath = shift;
+  my $plat = shift;
+  my @plats = ();
+
+  if (lc $plat eq 'all' || $self->{iniData}->HasTargetPlatforms($plat)) {
+    if ($self->{iniData}->HasTargetPlatforms($plat)) {
+      if (lc $plat eq 'all') {
+        # ALL and HasTargetPlatforms()
+        # Do the set intersection with the output of abld help
+        my $iniAll = $self->{iniData}->TargetPlatforms($plat);
+        my $abldHelp = $self->GetPlatforms($abldPath);
+        my %count;
+        foreach my $e (@$iniAll) {
+          $count{$e} = 1;
+        }
+        foreach my $e (@$abldHelp) {
+          if (exists $count{$e} and $count{$e} == 1) {
+            push @plats, $e;
+          }
+        }
+        $self->RemoveIDEPlatforms(\@plats);
+        if ($self->{verbose} > 1) {
+          print "Intersection of \"ALL\" alias and abld help is \"@plats\"\n";
+        }
+      } else {
+        # NOT ALL and HasTargetPlatforms()
+        # Use the list of platforms from the iniData and this alias
+        @plats = @{$self->{iniData}->TargetPlatforms($plat)};
+        if ($self->{verbose} > 1) {
+          print "Resolution of \"$plat\" alias is \"@plats\"\n";
+        }
+      }
+    } else {
+      # ALL and NOT HasTargetPlatforms() so just use
+      # the results of abld help
+      @plats = @{$self->GetPlatforms($abldPath)};
+      $self->RemoveIDEPlatforms(\@plats);
+      if ($self->{verbose} > 1) {
+        print "Resolution of \"ALL\" alias from abld help is \"@plats\"\n";
+      }
+    }
+  } else {
+    # NOT ALL and NOT HasTargetPlatforms() so use this as the platform
+    @plats = $plat;
+    if ($self->{verbose} > 1) {
+      print "Platform specified is \"@plats\"\n";
+    }
+  }
+  return \@plats;
+}
+
+sub RemoveIDEPlatforms {
+  my $self = shift;
+  my $plats = shift;
+
+  # Ugly hard-coded yukkiness
+  @$plats = grep { !m/^cw_ide$/i && !m/^vc\d/i } @$plats;
+}
+
+sub GetPlatforms {
+  my $self = shift;
+  my $bldInfDir = shift;
+
+  if (exists $self->{abldcache}->{"plats"}) {
+    return $self->{abldcache}->{"plats"};
+  }
+  $self->CallBldMakeIfNecessary($bldInfDir);
+
+ TRYAGAIN:
+  my $foundPlats = 0;
+  my @plats;
+  my @errorLines;
+
+  my @abldOutput = `($bldInfDir\\abld help | perl -pe "s/^/stdout: /") 2>&1`; # Adds 'stdout: ' to the beginning of each STDOUT line, nothing is added to output on STDERR.
+
+  foreach my $line (@abldOutput) {
+    chomp $line;
+      
+    if ($line =~ s/^stdout: //) { # Output from STDOUT
+      if ($foundPlats) {
+        if ($self->{verbose}) { print "Found platforms: $line\n"; }
+        $line =~ s/^\s*//; # Strip off leading whitespace.
+        # Force platforms to upper case to match IniData::TargetPlatforms()
+        $line = uc $line;
+        @plats = split /\s+/, $line;
+        last;
+      }
+      if ($line =~ /project platforms:/) {
+        $foundPlats = 1;
+      }
+    }
+ 
+    else { # Output from STDERR
+      if ($line =~ m/project bldmake directory.*does not exist/i) {
+        $self->CallBldMake($bldInfDir);
+        goto TRYAGAIN;
+      }  
+      elsif ($line =~ /Can't find ABLD.PL on PATH/i) {
+        push @errorLines, "Error: Couldn't run $bldInfDir\\abld: $line\n";      
+      }
+      else {
+        push @errorLines, "$line\n";
+      }
+    }
+  }
+
+  if (scalar @errorLines > 0) {
+    die @errorLines;
+  }
+
+  die "Error: didn't find any platforms\n" unless $foundPlats;
+
+  $self->{abldcache}->{"plats"} = \@plats;
+
+  return \@plats;
+}
+
+sub ReadBinaries {
+  my $self = shift;
+  my $abldPath = shift;
+  my $test = lc(shift);
+  my $plat = lc(shift);
+  my $var = lc(shift);
+  my $mmp = shift;
+  my $remove = shift;
+  my $successRef = shift;
+  my $command = "target";
+  my $opts = "-what";
+  $command = "$test $command" if $test;
+  $opts = "$mmp $opts" if $mmp;
+  if ($self->{verbose}) { print "Extracting target info from \"$abldPath\\abld.bat\" using \"$command $plat $var\"...\n";  }
+
+  my $bins = $self->GatherAbldOutput($abldPath, $plat, $command, $var, $test, $opts);
+  my $category = 'unclassified';
+  if ($self->{iniData}->CategoriseBinaries() and not $plat =~ /^tools2?$/i) {
+    $category = $plat . '_' . $var;
+    if ($test) {
+      $category = $test . '_' . $category;
+    }
+  }
+
+  $self->AddBins($remove, $category, $bins, $successRef);
+}
+
+sub HandleExports {
+  my $self = shift;
+  my $abldPath = shift;
+  my $test = shift;
+
+  $test = $test?"test ":"";
+
+  if ($self->{verbose}) {
+    print "Extracting ${test}export info from $abldPath\\abld.bat...\n";
+  }
+
+  my $exports = $self->GatherAbldOutput($abldPath, "", "${test}export", "", $test, "-what");
+  if ($self->{iniData}->CategoriseExports()) {
+    foreach my $thisExport (@$exports) {
+      if ($self->{verbose} > 1) { print "Found export \"$thisExport\"...\n"; }
+      if (Utils::WithinEpocRoot($thisExport)) {
+	$thisExport = Utils::RemoveEpocRoot($thisExport);
+      }
+      else {
+	print "Warning: Exported file \"$thisExport\" is not within EPOCROOT\n";
+      }
+
+      # Note, the hash key is case lowered to ensure duplicates are rejected.
+      # The original case is preserved in the hash values.
+      my $thisExportLc = lc($thisExport);
+      Utils::TidyFileName(\$thisExportLc);
+
+      # Note, the exports are not yet classified because this is done using the source code classifications.
+      # At this point we don't know if we've handled all the 'source' mrp keywords yet. Classification will
+      # occur when the exports are asked for.
+      $self->{exports}->{automatic}->{$thisExportLc} = $thisExport;
+    }
+    Utils::AbsolutePath(\$abldPath);
+    push (@{$self->{exports}->{abldPaths}}, Utils::RemoveSourceRoot($abldPath));
+  }
+  else {
+    # Handle exports treating them as binary files. Note, for a short while this code was changed to handle
+    # exported directories (not just files). This functionality has been removed because bldmake doesn't
+    # appear to cope with exported directories (it concatenates all the files in the specified directory into
+    # a single file due to weird use of the 'copy' command).
+    foreach my $thisExport (@$exports) {
+      $self->HandleBinFile(0, 'unclassified', $thisExport); # 0 = don't remove.
+    }
+  }
+}
+
+sub HandleExportFile {
+  my $self = shift;
+  my $source = shift;
+  my $destination = shift;
+  my $remove = shift;
+
+  if ($self->{iniData}->CategoriseExports()) {
+    if ($remove) {
+      my $destinationLc = lc(Utils::RemoveEpocRoot($destination));
+      Utils::TidyFileName(\$destinationLc);
+      if (exists $self->{exports}->{automatic}->{$destinationLc}) {
+	print "Excluding export \"$destination\"...\n" if ($self->{verbose});
+	delete $self->{exports}->{automatic}->{$destinationLc};
+      } else {
+        my $comp = $self->{comp} || "component name unknown";
+        print "Warning: ($comp) -export_file: could not remove $destination, as it hadn't been added. Perhaps the lines in your MRP are in the wrong order, or you meant -binary?\n";
+      }
+    }
+    else {
+      Utils::CheckExists($source);
+      Utils::CheckIsFile($source);
+      Utils::CheckExists($destination);
+      Utils::CheckIsFile($destination);
+      $self->{exports}->{manual}->{Utils::RemoveSourceRoot($source)} = Utils::RemoveEpocRoot($destination);
+    }
+  }
+  else {
+    $self->HandleBinFile($remove, 'unclassified', $destination);
+  }
+}
+
+sub AddBins {
+  my $self = shift;
+  my $remove = shift;
+  my $category = shift;
+  my $bins = shift;
+  my $successRef = shift;
+
+  foreach my $file (@$bins) {
+    $self->HandleBinDirOrFile($remove, $category, $file, $successRef);
+  }
+}
+
+sub EnsureDoesNotExist {
+  my $self = shift;
+
+  my $relDir = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($self->{comp}, $self->{ver});
+  if (-e $relDir) {
+    die "Error: $self->{comp} $self->{ver} already exists\n";
+  }
+}
+
+sub Validate {
+  my $self = shift;
+  my $warnNotError = shift; # produce warnings instead of errors for some messages
+
+  return if $self->{validated};
+  $self->{validated} = 1;
+
+  $self->EnsureDoesNotExist;
+
+  unless (defined $self->{comp}) {
+    die "Error: No 'component' keyword specified in $self->{mrpName}\n";
+  }
+
+  $self->NotesSource(); # will die if we can't find a notes_source tag
+
+  my @errors;
+  my @warnings;
+  
+  foreach my $bin (@{$self->Binaries()}) {    
+    my $file = Utils::PrependEpocRoot(lc($bin));
+    
+    if (my $result = $self->CheckPathLength($file)) {
+      if ($warnNotError) {
+        push (@warnings, "Warning: $result\n");
+      } else { 
+        push (@errors, "Error: $result\n");
+      }
+    }
+    
+    if ($self->{fixMissingLibs}) {
+      unless (-e $file) {
+        if ($file =~ /$ENV{EPOCROOT}epoc32\\release\\armi\\(\S+)\\(\S+\.lib)/) {
+          my $fileToCopy = "$ENV{EPOCROOT}epoc32\\release\\thumb\\$1\\$2";
+          print "Copying $fileToCopy to $file...\n";
+          copy ($fileToCopy, $file) or push (@errors, "Error: Problem copying \"$fileToCopy\" to \"$file\": $!\n");
+        }
+        else {
+          push (@errors, "Error: \"$file\" does not exist\n");
+        }
+      }
+    }
+    else {
+      unless (-e $file) {
+        push (@errors, "Error: \"$file\" does not exist\n");
+      }
+    }
+  }
+
+  foreach my $thisCategory (@{$self->ExportCategories()}) {
+    foreach my $thisExport (@{$self->Exports($thisCategory)}) {
+      $thisExport = Utils::PrependEpocRoot($thisExport); 
+      
+      if (my $result = $self->CheckPathLength($thisExport)) {
+        if ($warnNotError) {
+          push (@warnings, "Warning:  $result\n");
+        } else { 
+          push (@errors, "Error:  $result\n");
+        }
+      }
+
+      unless (-e $thisExport) {
+        push (@errors, "Error: \"$thisExport\" does not exist\n");
+      }
+    }
+  }
+ 
+  foreach my $thisSourceCategory (@{$self->SourceCategories()}) {
+    foreach my $thisSourceFile (@{$self->Source($thisSourceCategory)}) {
+      if (my $result = $self->CheckPathLength($thisSourceFile)) {
+        if ($warnNotError) {
+          push (@warnings, "Warning:  $result\n");
+        } else { 
+          push (@errors, "Error:  $result\n");
+        }
+      }
+    }
+  }
+  
+  if (@warnings) {
+    print @warnings;
+  }
+  
+  if (@errors and $#errors != -1) {
+    if ($#errors == 0) {
+      die $errors[0];
+    }
+    else {
+      print @errors;
+      my $firstError = $errors[0];
+      chomp $firstError;
+      die "Multiple errors (first - $firstError)\n";
+    }
+  }
+}
+
+sub CallBldMakeIfNecessary {
+  my $self = shift;
+  my $abldPath = shift;
+  if (-e "$abldPath\\abld.bat") {
+    # Check to see if bld.inf has been modifed since bldmake was last run.
+    my $abldMTime = Utils::FileModifiedTime("$abldPath\\abld.bat");
+    my $bldInfMTime = Utils::FileModifiedTime("$abldPath\\bld.inf");
+    if ($bldInfMTime > $abldMTime) {
+      $self->CallBldMake($abldPath);
+    }
+  }
+  else {
+    $self->CallBldMake($abldPath);
+  }
+}
+
+sub GatherAbldOutput {
+  my $self = shift;
+  my $abldPath = shift;
+  my $plat = shift;
+  my $abldCmnd = shift;
+  my $var = shift;
+  my $test = shift;
+  my $opts = shift;
+  my @output;
+
+  my $abldParms = $abldCmnd;
+  $abldParms .= " $plat" if $plat;
+  $abldParms .= " $var" if $var;
+  $abldParms .= " $opts" if $opts;
+
+  $abldPath=~s/\//\\/s; # Normalise all slashes to backslashes
+
+  $self->ProcessCache($abldPath, $test) if (!exists($self->{abldcache}->{loaded}->{$abldPath}));
+  
+  if ($self->{abldcache}->{$abldPath." ".$abldParms}) {
+    # Why do we bother with a cache?
+    # Because you might see this in an MRP:
+    #   binary \blah all
+    #   -binary \blah mfrumpy
+    # The "all" will be expanded to multiple calls to GatherAbldOutput, if we've got CategoriseBinaries on
+    
+    # The codes below are added to make MakeCBR follow cachefiles created by Raptor
+    if($abldCmnd eq "export" and $opts eq "-what"){
+        my $exports = $self->{abldcache}->{$abldPath." ".$abldParms};
+        if(@$exports[0]){
+          my $firstExportFile = @$exports[0];
+          if($firstExportFile=~/^ARRAY*/){
+            foreach my $thisExport (@$exports) {
+                push (@output, @$thisExport[0]);
+                push @{$self->{exportsToBeProcessed}}, {source => @$thisExport[1],
+                                                        destination => @$thisExport[0],
+                                                        abldPath => Utils::PrependSourceRoot($abldPath)};
+            }
+            $self->{raptorcache} = 1;
+            return \@output;
+          }
+        }
+    }
+    
+    return $self->{abldcache}->{$abldPath." ".$abldParms};
+  }
+
+  # Remove repeat guards - these stop CallBldMake and CallMakMake from being called
+  #                        forever if a fatal error occurs with a build script.
+  delete $self->{bldMakeCalled};
+  delete $self->{"makMakeCalled_$plat"};
+
+  $self->CallBldMakeIfNecessary($abldPath);
+
+ TRYAGAIN:
+
+  my @errorLines; # Used to store the error
+
+  my $cmd = "$abldPath\\abld $abldParms";
+  print "Executing command: $cmd\n" if $self->{verbose} > 1;
+
+  my @abldOutput = `($cmd | perl -pe "s/^/stdout: /") 2>&1`;
+
+  foreach my $line (@abldOutput) {
+    chomp $line;
+
+    if ($line =~ s/^stdout: //) { # Output from STDOUT 
+      if ($self->{verbose} > 1) { print "ABLD: $line\n"; }    
+      
+      if ($line =~ /(^(make|make\[\d+\]): .*)/) {
+        print "Warning: $1\n";
+      }
+      elsif ($line =~ /given more than once in the same rule/) {
+        print "$line\n";      
+      }
+      elsif ($line =~ m/\.\./) {
+        my $oldpath = cwd();
+        eval {
+          chdir($abldPath);
+          Utils::AbsoluteFileName(\$line);
+        };
+        chdir($oldpath);
+        if ($@) {
+          print "Warning: could not convert path \"$line\" to an absolute path because: $@\n";
+          # Do nothing. We just can't convert it to an absolute path. We'll push it onto the
+          # output anyway because in some circumstances it will work out OK.
+        }
+        push (@output, $line);
+      } else {
+        # Lines without .. we don't bother making absolute, because it involves 4 chdir operations
+        # so is a bit heavyweight.
+        push (@output, $line);
+      }
+    }
+
+    else { # Output from STDERR
+      if ($self->{verbose} > 1) { print "ABLD: $line\n"; }    
+  
+      # Catch errors that look like the makefile isn't present.
+      # Note, different versions of the build tools produce different things, so the regular expression below is a bit evil.
+      if ($line =~ /^(U1052|make\[1\]: (?i:\Q$ENV{EPOCROOT}\EEPOC32\\BUILD\\.*): No such file or directory|make: \*\*\* \[.*\] Error 2)$/) {
+  
+        # Makefile not present, so generate it.
+  
+        $self->CallMakMake($abldPath, $plat, $test);
+  
+        goto TRYAGAIN;
+      }        
+      elsif ($line =~ /^ABLD ERROR: Project Bldmake directory .* does not exist$/
+          or $line =~ /^ABLD ERROR: .* not yet created$/
+          or $line =~ /abld\.bat does not exist/) {
+  
+        #BldMake needs to be run.
+        $self->CallBldMake($abldPath);
+        goto TRYAGAIN;
+      }
+      elsif ($line =~ /^This project does not support platform/) {
+        push @errorLines, "Error: Platform \"$plat\" not supported\n";
+      }
+      elsif ($line =~ /^MISSING:/) {
+        print "$line\n";
+      }
+      elsif ($line =~ /Can't find ABLD.PL on PATH/i) {
+        push @errorLines, "Error: Couldn't run abld $abldParms: $line\n";      
+      }
+      else {
+        push @errorLines, "$line\n";
+      }
+    }
+  }
+  
+  if (scalar @errorLines > 0) {
+    die @errorLines;
+  }
+  
+  $self->{abldcache}->{$abldPath." ".$abldParms} = \@output;
+
+  return \@output;
+}
+
+sub CallBldMake {
+  my $self = shift;
+  my $abldPath = shift;
+
+  if (exists $self->{bldMakeCalled}) {
+    die "Error: Problem calling bldmake in \"$abldPath\"\n";
+  }
+  else {
+    $self->{bldMakeCalled} = 1;
+  }
+
+  if ($self->{verbose}) {
+    print "Calling bldmake in $abldPath...\n";
+  }
+  my $cwd = cwd();
+  chdir $abldPath or die "Error: Couldn't change working directory to $abldPath: $!\n";
+  system "bldmake bldfiles";
+  chdir $cwd;
+  die "Error: \"bldmake bldfiles\" failed in \"$abldPath\" (exit status $?)\n" if ($?);
+}
+
+sub CallMakMake {
+  my $self = shift;
+  my $abldPath = shift;
+  my $plat = shift;
+  my $test = shift;
+
+  my $repeatGuard = "makMakeCalled_$plat";
+  if ($test) {
+    $test = 'test';
+    $repeatGuard .= '_test';
+  }
+  else {
+    $test = '';
+  }
+
+  if (exists $self->{$repeatGuard}) {
+    if ($test) {
+      die "Error: Problem generating makefile for $test $plat in \"$abldPath\"\n";
+    }
+    else {
+      die "Error: Problem generating makefile for $plat in \"$abldPath\"\n";
+    }
+  }
+  else {
+    $self->{$repeatGuard} = 1;
+  }
+
+  if ($self->{verbose}) {
+    if ($test) {
+      print "Generating makefile for $test $plat...\n";
+    }
+    else {
+      print "Generating makefile for $plat...\n";
+    }
+  }
+  system "$abldPath\\abld $test makefile $plat > NUL";
+}
+
+sub BinSets {
+  my $self = shift;
+  
+  $self->ProcessBinaries();
+  
+  return $self->{binsets};
+}
+
+sub SourceRootPath {
+  my $fileName = shift;
+  if (Utils::IsAbsolute($fileName)) {
+    $fileName = Utils::PrependSourceRoot($fileName);
+  }
+  else {
+    Utils::AbsoluteFileName(\$fileName);
+  }
+  Utils::CheckWithinSourceRoot($fileName);
+  $fileName =~ s/\\.$//;
+  return $fileName;
+}
+
+sub WarnRedundantMRPLine {
+  my $self = shift;
+  my $remove = shift;
+  my $line = shift;
+  my $comp = $self->{comp} || "component name unknown";
+  my $sign = "";
+  my $action = "add";
+
+  if($remove) {
+    $action = "remove";
+  }
+  print "Remark: ($comp) The MRP line \"$line\" does not $action any files. Therefore is this line necessary?\n";
+}
+
+sub CheckPathLength {
+  my $self = shift;
+  my $path = shift;
+  
+  if (length ($path) > MAX_PATH_LENGTH) {
+     return "The component \"$self->{comp}\" is pending release and contains a path which is " . length($path) . " characters long and will prevent the component from being released: \"$path\"."
+  }
+
+  return 0;
+}
+
+sub SetIPR {
+    my $self = shift;
+    my $category = shift;
+    my $path = shift || 'default';
+    my $exportRestricted = (shift) ? 1 : 0;
+    
+    if (!$category || shift) {
+      # caller(0))[3] gives the package and the method called, e.g. MrpData::SetIPR
+      croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    $path = File::Spec->canonpath($path); # Normalise the path
+    
+    # remove trailing slashes
+    $path =~ s/[\\\/]$//;
+    
+    if ($path ne 'default') {
+      $path = SourceRootPath($path);
+    }
+
+    if($self->{iniData}->HasMappings()){
+      $path = $self->{iniData}->PerformMapOnFileName($path);
+    }
+    
+    $path = Utils::RemoveSourceRoot($path) if ($path ne 'default');
+    
+    if (exists $self->{unresolvedIPR}->{$path}) {
+      return 0;
+    }
+    
+    $self->{unresolvedIPR}->{$path} = {
+                    category => uc($category),
+                    exportRestricted => $exportRestricted};
+    
+    return 1;
+}
+
+sub SetComponent {
+    my $self = shift;
+    my $operand = shift;
+
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+
+    if (exists $self->{comp}) {
+        return 0;
+    }
+    
+    $self->{comp} = $operand;
+    
+    return 1;
+}
+
+sub SetNotesSource {
+    my $self = shift;
+    my $operand = shift;
+   
+    if (!$operand || shift) {
+      croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    if (exists $self->{notes_src}) {
+        return 0;
+    }
+
+    $operand = File::Spec->canonpath($operand); # Normalise the path
+    
+    $operand = SourceRootPath($operand);
+    
+    if($self->{iniData}->HasMappings()){
+        $operand = $self->{iniData}->PerformMapOnFileName($operand);
+    }
+    
+    Utils::CheckExists($operand);
+    Utils::CheckIsFile($operand);
+    $self->{notes_src} = Utils::RemoveSourceRoot($operand);
+    
+    return 1;
+}
+
+sub SetSource {
+    my $self = shift;
+    my $operand = shift;
+    
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+
+    if ($operand =~ /distribution\.policy$/i) {
+      print "\nREMARK: Distribution Policy file included as source in \"$self->{mrpName}\"\n";
+      return 1;
+    }
+
+    $operand = File::Spec->canonpath($operand); # Normalise the path
+        
+    #remove trailing slashes
+    $operand =~ s/[\\\/]$//;
+    
+    $operand = SourceRootPath($operand);
+
+    if($self->{iniData}->HasMappings()){
+      $operand = $self->{iniData}->PerformMapOnFileName($operand);
+    }
+    
+    Utils::CheckExists($operand);
+    $self->{srcitems}->{Utils::RemoveSourceRoot($operand)} = 1;
+    # No longer classify the source. We do this on-demand later.
+    
+    return 1;
+}
+
+sub SetBinary {
+    my $self = shift;
+    my @words =  @{shift()};
+    my $test = (shift) ? 1 : 0;
+    my $remove = (shift) ? 1 : 0;
+
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+
+    my $path = shift @words;
+
+    $path = File::Spec->canonpath($path); # Normalise the path
+    
+    # tranfer to absolute path
+    $path = SourceRootPath($path);
+
+    if (scalar @words) {
+        if($self->{iniData}->HasMappings()){
+            $path = $self->{iniData}->PerformMapOnFileName($path);
+        }
+    }
+
+    push @{$self->{binaryStatements}}, {
+                        abldPath => $path,
+                        test     => $test,
+                        remove   => $remove,
+                        words    => [@words]};
+}
+
+sub SetExports {
+    my $self = shift;
+    my $abldPath = shift;
+    my $test = (shift) ? 1 : 0;
+    my $dependantComponent = shift;
+
+    if (!$abldPath || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    if ($dependantComponent) {
+    	push (@{$self->{_dependantComponents}->{$dependantComponent}}, $abldPath);
+    }
+
+    $abldPath = File::Spec->canonpath($abldPath); # Normalise the path
+        
+    $abldPath = SourceRootPath($abldPath);
+
+    if($self->{iniData}->HasMappings()){
+      $abldPath = $self->{iniData}->PerformMapOnFileName($abldPath);
+    }
+
+    Utils::CheckExists($abldPath);
+    
+    push @{$self->{exportsStatements}}, { abldPath => $abldPath,
+                                           test => $test};
+}
+
+sub SetExportFile {
+    my $self = shift;
+    my $source = shift;
+    my $destination = shift;
+    my $remove = (shift) ? 1 : 0;
+    my $dependantComponent = shift;
+ 
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+        
+    unless ($source and $destination) {
+	croak "Error: Incorrect syntax to 'export_file' keyword in \"$self->{mrpName}\"\n";
+    }
+
+    if ($dependantComponent) {
+    	push (@{$self->{_dependantComponents}->{$dependantComponent}}, $source);
+    }
+    
+    $source = File::Spec->canonpath($source); # Normalise the path
+    $destination = File::Spec->canonpath($destination);
+        
+    $source = SourceRootPath($source);
+
+    if($self->{iniData}->HasMappings()){
+      $source = $self->{iniData}->PerformMapOnFileName($source);
+      $destination = $self->{iniData}->PerformMapOnFileName($destination);
+    }
+
+    $destination = Utils::PrependEpocRoot($destination);
+    
+    push @{$self->{unprocessedExportFiles}}, { source => $source,
+                                           destination => $destination,
+                                           remove => $remove};
+}
+
+sub GetIPRInformation {
+    my $self = shift;
+    
+    if (exists $self->{IPR}) {
+        return $self->{IPR};
+    }
+    else {
+        return {};
+    }
+}
+
+sub GetExportComponentDependencies {
+    my $self = shift;	
+
+    if (defined $self->{_dependantComponents}) {
+            return (keys %{$self->{_dependantComponents}}); # Return an array of the dependencies
+    }
+    
+    return undef;
+}
+
+sub ValidateParsing {
+    my $self = shift;
+    
+    # This flag stops the reader from trying to populate the object more than once
+    $self->{populated} = 1;
+    
+    if (exists $self->{srcitems} && !exists $self->{unresolvedIPR}) {
+        # If no IPR information exists in the MRP file then we set the IPR category
+        # for each source item to undef.  This is so that incorrect IPR information is
+        # not returned.  A flag is also set to indicate that IPR information exists.  The
+        # flag will be used to ensure other parts other parts of validation should will
+        # not be performed (e.g. validating exports).
+        
+        $self->{noIprInformation} = 1;
+        
+        foreach my $sourceItem (keys %{$self->{srcitems}}) {
+            $self->{IPR}->{$sourceItem} = {
+                                           category => undef,
+                                           exportRestricted => undef,
+                                           };
+        }
+    }
+    else {
+        # Reconcile the IPR information here so that any warnings are produced sooner...
+        # IPR information can only be included if it matches a source line in the MRP file
+        # All other IPR lines will be ignored.  The reconciliation is done here as IPR
+        # lines may appear before source lines in the MRP file.
+
+        if (!defined $self->{srcitems} && exists $self->{unresolvedIPR}->{default}) {
+            carp "Warning: The default IPR entry does not apply to any source statements in \"$self->{mrpName}\"\n";
+        }
+       
+        # Match IPR against source statement by using the length...
+        foreach my $sourceItem (keys %{$self->{srcitems}}) {
+            # The sort below sorts by longest line first, not shortest line first. Note $b <=> $a, not $a <=> $b...
+            # This allows us to match the most relevant line first, based on longest length/best match 
+            foreach my $iprItem (sort {length($b) <=> length($a)} keys %{$self->{unresolvedIPR}}) {
+                next if ($iprItem eq 'default');
+                # If the source item contains the IPR path then it is a match 
+                if ($sourceItem =~ m/^\Q$iprItem\E([\\\/]|$)/i) {
+                    $self->{IPR}->{$sourceItem} = $self->{unresolvedIPR}->{$iprItem};
+                    
+                    last;   
+                }
+            }
+                 
+            # If it didn't match an IPR then we assign the default
+            if (!exists $self->{IPR}->{$sourceItem}) {
+                $self->{IPR}->{$sourceItem} = $self->{unresolvedIPR}->{default};
+            }
+        }
+
+        delete $self->{unresolvedIPR}->{default};
+	    
+        # Find IPR entries which do live under a source folder...
+        foreach my $iprItem (keys %{$self->{unresolvedIPR}}) {
+            next if (exists $self->{IPR}->{$iprItem});
+	    
+            foreach my $sourceItem (keys %{$self->{srcitems}}) {
+                if ($iprItem =~ /^\Q$sourceItem\E/i) {
+                    $self->{IPR}->{$iprItem} = $self->{unresolvedIPR}->{$iprItem};
+                    last;
+                }
+            }
+	    
+            if (!grep /\Q$iprItem\E/i, (keys %{$self->{IPR}})) {
+                # Otherwise this IPR statement does not apply to this MRP file...
+                carp "Warning: The IPR entry for \"$iprItem\" does not apply to any source statements in \"$self->{mrpName}\"\n";
+            }
+        }    
+    }
+  
+    delete $self->{unresolvedIPR};
+}
+
+
+sub ProcessExports {
+  my $self = shift;
+  my $confirmExportIprInformation = shift;
+  
+  return if ($self->{exportsProcessed});
+  
+  $self->{exportsProcessed} = 1;
+  
+  foreach my $export (@{$self->{exportsStatements}}) {
+    $self->HandleExports($export->{abldPath}, $export->{test});
+  }
+  
+  foreach my $exportFile (@{$self->{unprocessedExportFiles}}) {    
+    if($self->{raptorcache}){
+      my $isHandle = 0;
+      foreach my $export (@{$self->{exportsToBeProcessed}}) {
+        if($export->{source} eq $exportFile->{source}){
+          if (exists $self->{exports}->{automatic}->{lc(Utils::RemoveEpocRoot($export->{destination}))}) {
+            $self->HandleExportFile($export->{source}, $export->{destination}, $exportFile->{remove});
+            $isHandle = 1;
+          }
+        }
+      }
+      if($isHandle == 0){
+        foreach my $export (@{$self->{exportsToBeProcessed}}) {
+          if(lc($export->{destination}) eq lc($exportFile->{destination})){
+            foreach my $tempExport (@{$self->{exportsToBeProcessed}}) {
+              if($export->{source} eq $tempExport->{source}){
+                if (exists $self->{exports}->{automatic}->{lc(Utils::RemoveEpocRoot($tempExport->{destination}))}) {
+                  $self->HandleExportFile($tempExport->{source}, $tempExport->{destination}, $exportFile->{remove});
+                }
+              }
+            }
+          }
+        }
+      }
+    }
+    else{
+      $self->HandleExportFile($exportFile->{source}, $exportFile->{destination}, $exportFile->{remove});
+    } 
+  }
+  
+  delete $self->{unprocessedExportFiles};
+  
+  # If exports are to be classified, or the caller wants to confirm the IPR information for exports is correct...
+  if ($self->{iniData}->CategoriseExports() || $confirmExportIprInformation) {
+      $self->ClassifyManualExports();
+      
+      # The codes below are changed to make MakeCBR follow cachefiles created by Raptor
+      if(!$self->{raptorcache}){
+        $self->ClassifyAutomaticExports();
+      }
+      else{
+        my @tempExports;
+        foreach my $export (@{$self->{exportsToBeProcessed}}) {
+          if (exists $self->{exports}->{automatic}->{lc(Utils::RemoveEpocRoot($export->{destination}))}) {
+            push @tempExports, $export;
+          }
+        }
+        @{$self->{exportsToBeProcessed}} = @tempExports;
+		
+        delete $self->{exports}->{automatic};
+        delete $self->{exports}->{abldPaths};
+      }
+      delete $self->{raptorcache};
+      
+      # If no IPR information exists in the MRP file then we do not validate the exports as we don't care about if
+      # we need dependant components
+      if (!$self->{noIprInformation}) {
+        # Check to see if the exports are owned by the component, or dependant components have been specified...
+        foreach my $export (@{$self->{exportsToBeProcessed}}) {
+          # check if the exports are included as source in this component
+          if (!grep keys %{$self->{srcitems}}, $export->{source}) {
+            # If not then check if another dependant component for the export has been specified
+            
+            # A dependant component is specified for either the export source or the exports abld path
+            my $whatToTest = 'source';
+            $whatToTest = 'abldPath' if (exists $export->{abldPath});
+       
+            my $dependencyExists = 0;
+  
+            foreach my $dependantComponent (keys %{$self->{_dependantComponents}}) {
+              if (grep /\Q$export->{$whatToTest}\E/i, (@{$self->{_dependantComponents}->{$dependantComponent}})) {
+                $dependencyExists = 1;
+              }            
+            }
+            
+            if (!$dependencyExists) {
+              # If no dependency exists...
+              warn "Warning: ".$self->Component()." contains an export '". $export->{source} ."' which is not included as source for this component, and does not contain dependencies on another component\n";
+            }
+          }
+        }
+      }
+      
+      # If we only processed exports to that we can confirm the IPR information, but
+      # we don't actually want to categorise exports then we delete them
+      if (!$self->{iniData}->CategoriseExports() && $confirmExportIprInformation) {
+        delete $self->{exportsToBeProcessed};
+      }
+  }
+
+  my $errors;
+  
+  foreach my $export (@{$self->{exportsToBeProcessed}}) {
+    if (!$self->AddExport($export->{source}, $self->RemoveRoot($export->{destination}))) {
+      $errors = 1;
+    }        
+  }
+  if ($errors) {
+    die "Aborting due to above error(s)\n";
+  }  
+
+  delete $self->{exportsToBeProcessed};
+
+  if ($self->{binariesProcessed}) {
+    # if binaries and exports have been processed then we delete the abldcach as
+    # it is no longer required and takes up a lot of memory
+    delete $self->{abldcache};
+  }
+}
+
+sub RemoveRoot {
+  my $self = shift;
+  my $path = shift;
+  return $1 if($path =~ /^\\(.+)/);
+  return $path;
+}
+
+sub ProcessBinaries {
+  my $self = shift;
+  
+  return if ($self->{binariesProcessed});
+  
+  $self->{binariesProcessed} = 1;  
+  
+  foreach my $binary (@{$self->{binaryStatements}}) {
+  
+    my $success = 0;
+
+    if (!scalar(@{$binary->{words}})) {
+        $binary->{abldPath} = Utils::PrependEpocRoot($binary->{abldPath});
+        # Pass a reference of $success to HandleBinDirOrFile which can only be changed in HandleBinFile if the operation is successful.
+        $self->HandleBinDirOrFile($binary->{remove}, "unclassified", $binary->{abldPath}, \$success);
+        if ($success == 0 )
+        {
+            my $line;
+            $line = 'test' if ($binary->{test});
+            $line .=  'binary ' . join ' ', @{$binary->{words}};
+            $self->WarnRedundantMRPLine($binary->{remove}, $line);
+        }
+    }
+    else {
+        # Pass a reference of $success to HandleBinSet which can only be changed in HandleBinFile if the operation is successful.
+        $self->HandleBinSet($binary->{remove}, $binary->{test}, \$success, $binary->{abldPath}, @{$binary->{words}});
+        if ($success == 0 )
+        {
+            my $line;
+            $line = 'test' if ($binary->{test});
+            $line .=  'binary ' . join ' ', @{$binary->{words}};
+            $self->WarnRedundantMRPLine($binary->{remove}, $line);
+        }
+    }
+  }
+  
+  if ($self->{exportsProcessed}) {
+    # if binaries and exports have been processed then we delete the abldcache as
+    # it is no longer required and takes up a lot of memory
+    delete $self->{abldcache};
+  }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+MrpData.pm - Provides an interface to the contents of a component's MakeRel project (mrp) file.
+
+=head1 DESCRIPTION
+
+Once a C<MrpData> object has been created using the C<New> method, the remaining methods can be used to access the F<.mrp> data.
+
+=head1 INTERFACE
+
+=head2 New
+
+Expects to be passed the name of the mrp file. This doesn't necessarily have to have a F<.mrp> extension. The parser supports the following keyword / value pairs:
+
+  component    <component_name>
+  source       <source_file|source_directory>
+  binary       [<abld_path> <platform> [<variant> <program>]] | [<binary_file>] | [<binary_directory>]
+  -binary      [<abld_path> <platform> [<variant> <program>]] | [<binary_file>] | [<binary_directory>]
+  testbinary   <abld_path> <platform> [<variant> <program>]
+  -testbinary  <abld_path> <platform> [<variant> <program>]
+  exports      <abld_path>
+  notes_source <release_notes_source_path>
+  ipr          [<export-restricted>] type [<directory>]
+
+=head2 Component
+
+Returns a string containing the name of the component.
+
+=head2 MrpName
+
+Returns a string containing the full path name of the component's F<mrp> file.
+
+=head2 ExternalVersion
+
+Returns a string containing the external version of the component to be released.
+
+=head2 InternalVersion
+
+Returns a string containing the internal version of the component to be released.
+
+=head2 SourceCategories
+
+Returns a reference to a list of source IPR categories present in the component. Each of these may be used as an input to C<Source>. These categories are defined in 'distribution.policy' files.
+
+=head2 Source
+
+Expects to be passed a scalar containing the required source category. Returns a reference to a list of source files corresponding to the specified category for this component.
+
+=head2 SourceItems
+
+Expects no arguments. Returns a list of the operands of all the "source" statements found in the MRP file. This is then stored in the RelData file and is later used by validation to work out which director(y|ies) to check for added files.
+
+=head2 BinaryCategories
+
+Returns a reference to a list of binary categories present in the component. Each of these may be used as an input to C<Binaries>. The binary categories are determined by the structure of the F<mrp> file. For example, the statement C<binary \mycomp thumb urel> will result in the associated binaries being classified and C<thumb_urel>. The statement C<testbinary \mycomp arm4> will generate two categories - C<test_arm4_udeb> and C<test_arm4_urel>. Any binary files or directories that are explictly referenced (e.g. C<binary \epoc32\myfile.txt> or C<binary \epoc32\mydir>) are categorised as C<unclassified>. Also, any binary files that are found to be common between any two categories and re-categorised as C<unclassified>. This is to ensure that each binary F<zip> file contains a unique set of files.
+
+If the C<categorise_binaries> keyword has not been specified in the user's F<reltools.ini> file, this interface will always return a reference to a list with a single entry in it - C<unclassified>.
+
+=head2 Binaries
+
+Returns a reference to a list of binary files for this component. May optionally be passed a scalar containing the required binary category, in which case it returns a list of just the binaries in the specified category. Dies if the requested category is not present.
+
+=head2 ExportCategories
+
+Returns a reference to a list of export categories present in the component. If the C<categorise_exports> keyword has not been specified in the user's F<reltools.ini> file, this list will contain a single entry - C<unclassified>. Otherwise, each exported file will be categorised according to the rules used for categorising source code. The returned list will in this case contain the set of exported source categories present in the component. Elements in this list may be used as inputs to the method below (C<Exports>).
+
+=head2 Exports
+
+Returns a reference to a list of exported file for this component. May optionally be passed a scalar containing the required export category, in which case it returns a list of just the exports in the specified category. Dies if the requested category is not present.
+
+=head2 ExportInfoForCat
+
+Expects a category to be passed. Returns the exportinfo for the category.
+
+=head2 BinariesAndExports
+
+Returns a reference to a list of all the binaries and exports of this component. Note, unlike the methods C<Binaries> and C<Exports>, this method does not allow a category to be specified. This is because binaries are categorised according to build type and exports are categorised according to source intellectual property rights rules. They two types of categorisation are incompatible.
+
+=head2 NotesSource
+
+Returns a string containing the path and name of the release notes source file for this component.
+
+=head2 BinSets
+
+Returns a reference to an array of hashes, representing each "binary <path> <platform> <variant>" line. The hashes have these fields: path, plat, var, mmp (often ''), and test (a Boolean). This method is used by C<MakeRel> and C<MakeEnv> to build the component before release.
+
+=head2 EnsureDoesNotExist
+
+Checks that the version given does not already exist in an archive.
+
+=head2 Validate
+
+Checks that all the files shown in the MRP do actually exist.
+
+=head2 ClassifyAutomaticExports
+
+Classify exports that were specified using the 'exports' or 'testexports' keyword in the mrp file.
+
+=head2 ProcessExportMakeFile
+
+Expect EXPORT.MAKE/EXPORTTEST.MAKE file, classify exports that were specified using the 'exports'/'testexports' keyword in the mrp file.
+
+=head2 WarnRedundantMRPLine
+
+Output warnings about redundant MRP lines (full redundancy).
+
+=head2 GetIPRInformation()
+
+Returns a hash containing the IPR information for the component.
+
+The format is the returned data is a hash:
+
+    Path = (
+                    category = char,
+                    exportRestricted = boolean
+            )
+
+=head2 SetBinary(@arguments, test, remove)
+
+Sets the binary information.  @arguments is an array containing the arguments
+from the MRP line, in the order in which they appeared.  
+
+=head2 SetComponent(componentName)
+
+Sets the name of the component to componentName.
+
+=head2 SetExportFile(source, destination, remove, dependantComponent)
+
+Sets the export file information.  The source and destination arguments are both
+required, if they are not specified a fatal error will be produced.  The source
+file will also be checked to see if it exists and that it has not already been
+specified as an export file.
+
+If the export file is not included as source for the current MRP component then
+the dependant component will also need to be specified.
+
+=head2 SetExports(path, test, dependantComponent)
+
+Sets the location of the bld.inf from where the export information can be derived.
+The location will be checked to see if it exists and that it has not already been
+specified.
+
+If the exports are not included as source for the current MRP component then
+the dependant component will also need to be specified.
+
+=head2 SetIPR(category, path, exportRestricted)
+
+Sets the IPR information for the component.  If no path is specified then the
+IPR category is set to be the default category for the component.  The
+exportRestricted argument is boolean.
+
+If the same path is specified more than once a fatal error will be produced.
+
+=head2 SetNotesSource(noteSourcePath)
+
+Sets the notes source to the notesSourcePath specified.  If the notes source has
+already been set, or the path does not exist, a fatal error will be produced.
+
+=head2 SetSource(sourcePath)
+
+Adds the sourcePath to the list of included source entries for the component.
+If the source path does not exist or the path has already been added then a
+fatal error will be produced.
+
+=head2 ValidateParsing()
+
+This method needs to be called once the parser has finished setting all the
+information.  Currently this method reconciles IPR statements against the
+components source, and also checks that required dependant components have
+been set.
+
+If this method is not run then IPR information will be unavailable.
+
+=head2 GetExportComponentDependencies()
+
+Returns an array containing the any components which the current component has
+dependencies on.
+
+=head2 Populated()
+
+The MRP file is parsed by a reader, which then populates this MRP object.  The
+Populated method returns a boolean value indicating if the object has been
+populated.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/Cmd.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,763 @@
+# Net::Cmd.pm $Id: //depot/libnet/Net/Cmd.pm#33 $
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Cmd;
+
+require 5.001;
+require Exporter;
+
+use strict;
+use vars qw(@ISA @EXPORT $VERSION);
+use Carp;
+use Symbol 'gensym';
+
+BEGIN {
+  if ($^O eq 'os390') {
+    require Convert::EBCDIC;
+  }
+}
+
+$VERSION = "2.24";
+@ISA     = qw(Exporter);
+@EXPORT  = qw(CMD_INFO CMD_OK CMD_MORE CMD_REJECT CMD_ERROR CMD_PENDING);
+
+sub CMD_INFO	{ 1 }
+sub CMD_OK	{ 2 }
+sub CMD_MORE	{ 3 }
+sub CMD_REJECT	{ 4 }
+sub CMD_ERROR	{ 5 }
+sub CMD_PENDING { 0 }
+
+my %debug = ();
+
+my $tr = $^O eq 'os390' ? Convert::EBCDIC->new() : undef;
+
+sub toebcdic
+{
+ my $cmd = shift;
+
+ unless (exists ${*$cmd}{'net_cmd_asciipeer'})
+  {
+   my $string = $_[0];
+   my $ebcdicstr = $tr->toebcdic($string);
+   ${*$cmd}{'net_cmd_asciipeer'} = $string !~ /^\d+/ && $ebcdicstr =~ /^\d+/;
+  }
+
+  ${*$cmd}{'net_cmd_asciipeer'}
+    ? $tr->toebcdic($_[0])
+    : $_[0];
+}
+
+sub toascii
+{
+  my $cmd = shift;
+  ${*$cmd}{'net_cmd_asciipeer'}
+    ? $tr->toascii($_[0])
+    : $_[0];
+}
+
+sub _print_isa
+{
+ no strict qw(refs);
+
+ my $pkg = shift;
+ my $cmd = $pkg;
+
+ $debug{$pkg} ||= 0;
+
+ my %done = ();
+ my @do   = ($pkg);
+ my %spc = ( $pkg , "");
+
+ while ($pkg = shift @do)
+  {
+   next if defined $done{$pkg};
+
+   $done{$pkg} = 1;
+
+   my $v = defined ${"${pkg}::VERSION"}
+                ? "(" . ${"${pkg}::VERSION"} . ")"
+                : "";
+
+   my $spc = $spc{$pkg};
+   $cmd->debug_print(1,"${spc}${pkg}${v}\n");
+
+   if(@{"${pkg}::ISA"})
+    {
+     @spc{@{"${pkg}::ISA"}} = ("  " . $spc{$pkg}) x @{"${pkg}::ISA"};
+     unshift(@do, @{"${pkg}::ISA"});
+    }
+  }
+}
+
+sub debug
+{
+ @_ == 1 or @_ == 2 or croak 'usage: $obj->debug([LEVEL])';
+
+ my($cmd,$level) = @_;
+ my $pkg = ref($cmd) || $cmd;
+ my $oldval = 0;
+
+ if(ref($cmd))
+  {
+   $oldval = ${*$cmd}{'net_cmd_debug'} || 0;
+  }
+ else
+  {
+   $oldval = $debug{$pkg} || 0;
+  }
+
+ return $oldval
+    unless @_ == 2;
+
+ $level = $debug{$pkg} || 0
+    unless defined $level;
+
+ _print_isa($pkg)
+    if($level && !exists $debug{$pkg});
+
+ if(ref($cmd))
+  {
+   ${*$cmd}{'net_cmd_debug'} = $level;
+  }
+ else
+  {
+   $debug{$pkg} = $level;
+  }
+
+ $oldval;
+}
+
+sub message
+{
+ @_ == 1 or croak 'usage: $obj->message()';
+
+ my $cmd = shift;
+
+ wantarray ? @{${*$cmd}{'net_cmd_resp'}}
+    	   : join("", @{${*$cmd}{'net_cmd_resp'}});
+}
+
+sub debug_text { $_[2] }
+
+sub debug_print
+{
+ my($cmd,$out,$text) = @_;
+ print STDERR $cmd,($out ? '>>> ' : '<<< '), $cmd->debug_text($out,$text);
+}
+
+sub code
+{
+ @_ == 1 or croak 'usage: $obj->code()';
+
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_code'} = "000"
+	unless exists ${*$cmd}{'net_cmd_code'};
+
+ ${*$cmd}{'net_cmd_code'};
+}
+
+sub status
+{
+ @_ == 1 or croak 'usage: $obj->status()';
+
+ my $cmd = shift;
+
+ substr(${*$cmd}{'net_cmd_code'},0,1);
+}
+
+sub set_status
+{
+ @_ == 3 or croak 'usage: $obj->set_status(CODE, MESSAGE)';
+
+ my $cmd = shift;
+ my($code,$resp) = @_;
+
+ $resp = [ $resp ]
+	unless ref($resp);
+
+ (${*$cmd}{'net_cmd_code'},${*$cmd}{'net_cmd_resp'}) = ($code, $resp);
+
+ 1;
+}
+
+sub command
+{
+ my $cmd = shift;
+
+ unless (defined fileno($cmd))
+  {
+    $cmd->set_status("599", "Connection closed");
+    return $cmd;
+  }
+
+
+ $cmd->dataend()
+    if(exists ${*$cmd}{'net_cmd_need_crlf'});
+
+ if (scalar(@_))
+  {
+   local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+   my $str =  join(" ", map { /\n/ ? do { my $n = $_; $n =~ tr/\n/ /; $n } : $_; } @_);
+   $str = $cmd->toascii($str) if $tr;
+   $str .= "\015\012";
+
+   my $len = length $str;
+   my $swlen;
+
+   $cmd->close
+	unless (defined($swlen = syswrite($cmd,$str,$len)) && $swlen == $len);
+
+   $cmd->debug_print(1,$str)
+	if($cmd->debug);
+
+   ${*$cmd}{'net_cmd_resp'} = [];      # the response
+   ${*$cmd}{'net_cmd_code'} = "000";	# Made this one up :-)
+  }
+
+ $cmd;
+}
+
+sub ok
+{
+ @_ == 1 or croak 'usage: $obj->ok()';
+
+ my $code = $_[0]->code;
+ 0 < $code && $code < 400;
+}
+
+sub unsupported
+{
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_resp'} = [ 'Unsupported command' ];
+ ${*$cmd}{'net_cmd_code'} = 580;
+ 0;
+}
+
+sub getline
+{
+ my $cmd = shift;
+
+ ${*$cmd}{'net_cmd_lines'} ||= [];
+
+ return shift @{${*$cmd}{'net_cmd_lines'}}
+    if scalar(@{${*$cmd}{'net_cmd_lines'}});
+
+ my $partial = defined(${*$cmd}{'net_cmd_partial'})
+		? ${*$cmd}{'net_cmd_partial'} : "";
+ my $fd = fileno($cmd);
+
+ return undef
+	unless defined $fd;
+
+ my $rin = "";
+ vec($rin,$fd,1) = 1;
+
+ my $buf;
+
+ until(scalar(@{${*$cmd}{'net_cmd_lines'}}))
+  {
+   my $timeout = $cmd->timeout || undef;
+   my $rout;
+   if (select($rout=$rin, undef, undef, $timeout))
+    {
+     unless (sysread($cmd, $buf="", 1024))
+      {
+       carp(ref($cmd) . ": Unexpected EOF on command channel")
+		if $cmd->debug;
+       $cmd->close;
+       return undef;
+      } 
+
+     substr($buf,0,0) = $partial;	## prepend from last sysread
+
+     my @buf = split(/\015?\012/, $buf, -1);	## break into lines
+
+     $partial = pop @buf;
+
+     push(@{${*$cmd}{'net_cmd_lines'}}, map { "$_\n" } @buf);
+
+    }
+   else
+    {
+     carp("$cmd: Timeout") if($cmd->debug);
+     return undef;
+    }
+  }
+
+ ${*$cmd}{'net_cmd_partial'} = $partial;
+
+ if ($tr) 
+  {
+   foreach my $ln (@{${*$cmd}{'net_cmd_lines'}}) 
+    {
+     $ln = $cmd->toebcdic($ln);
+    }
+  }
+
+ shift @{${*$cmd}{'net_cmd_lines'}};
+}
+
+sub ungetline
+{
+ my($cmd,$str) = @_;
+
+ ${*$cmd}{'net_cmd_lines'} ||= [];
+ unshift(@{${*$cmd}{'net_cmd_lines'}}, $str);
+}
+
+sub parse_response
+{
+ return ()
+    unless $_[1] =~ s/^(\d\d\d)(.?)//o;
+ ($1, $2 eq "-");
+}
+
+sub response
+{
+ my $cmd = shift;
+ my($code,$more) = (undef) x 2;
+
+ ${*$cmd}{'net_cmd_resp'} ||= [];
+
+ while(1)
+  {
+   my $str = $cmd->getline();
+
+   return CMD_ERROR
+	unless defined($str);
+
+   $cmd->debug_print(0,$str)
+     if ($cmd->debug);
+
+   ($code,$more) = $cmd->parse_response($str);
+   unless(defined $code)
+    {
+     $cmd->ungetline($str);
+     last;
+    }
+
+   ${*$cmd}{'net_cmd_code'} = $code;
+
+   push(@{${*$cmd}{'net_cmd_resp'}},$str);
+
+   last unless($more);
+  } 
+
+ substr($code,0,1);
+}
+
+sub read_until_dot
+{
+ my $cmd = shift;
+ my $fh  = shift;
+ my $arr = [];
+
+ while(1)
+  {
+   my $str = $cmd->getline() or return undef;
+
+   $cmd->debug_print(0,$str)
+     if ($cmd->debug & 4);
+
+   last if($str =~ /^\.\r?\n/o);
+
+   $str =~ s/^\.\././o;
+
+   if (defined $fh)
+    {
+     print $fh $str;
+    }
+   else
+    {
+     push(@$arr,$str);
+    }
+  }
+
+ $arr;
+}
+
+sub datasend
+{
+ my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("" ,@$arr);
+
+ return 0 unless defined(fileno($cmd));
+
+ unless (length $line) {
+   # Even though we are not sending anything, the fact we were
+   # called means that dataend needs to be called before the next
+   # command, which happens of net_cmd_need_crlf exists
+   ${*$cmd}{'net_cmd_need_crlf'} ||= 0;
+   return 1;
+ }
+
+ if($cmd->debug) {
+   foreach my $b (split(/\n/,$line)) {
+     $cmd->debug_print(1, "$b\n");
+   }
+  }
+
+ $line =~ s/\r?\n/\r\n/sg;
+ $line =~ tr/\r\n/\015\012/ unless "\r" eq "\015";
+
+ $line =~ s/(\012\.)/$1./sog;
+ $line =~ s/^\./../ unless ${*$cmd}{'net_cmd_need_crlf'};
+
+ ${*$cmd}{'net_cmd_need_crlf'} = substr($line,-1,1) ne "\012";
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win,fileno($cmd),1) = 1;
+ my $timeout = $cmd->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+ while($len)
+  {
+   my $wout;
+   if (select(undef,$wout=$win, undef, $timeout) > 0)
+    {
+     my $w = syswrite($cmd, $line, $len, $offset);
+     unless (defined($w))
+      {
+       carp("$cmd: $!") if $cmd->debug;
+       return undef;
+      }
+     $len -= $w;
+     $offset += $w;
+    }
+   else
+    {
+     carp("$cmd: Timeout") if($cmd->debug);
+     return undef;
+    }
+  }
+
+ 1;
+}
+
+sub rawdatasend
+{
+ my $cmd = shift;
+ my $arr = @_ == 1 && ref($_[0]) ? $_[0] : \@_;
+ my $line = join("" ,@$arr);
+
+ return 0 unless defined(fileno($cmd));
+
+ return 1
+    unless length($line);
+
+ if($cmd->debug)
+  {
+   my $b = "$cmd>>> ";
+   print STDERR $b,join("\n$b",split(/\n/,$line)),"\n";
+  }
+
+ my $len = length($line);
+ my $offset = 0;
+ my $win = "";
+ vec($win,fileno($cmd),1) = 1;
+ my $timeout = $cmd->timeout || undef;
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+ while($len)
+  {
+   my $wout;
+   if (select(undef,$wout=$win, undef, $timeout) > 0)
+    {
+     my $w = syswrite($cmd, $line, $len, $offset);
+     unless (defined($w))
+      {
+       carp("$cmd: $!") if $cmd->debug;
+       return undef;
+      }
+     $len -= $w;
+     $offset += $w;
+    }
+   else
+    {
+     carp("$cmd: Timeout") if($cmd->debug);
+     return undef;
+    }
+  }
+
+ 1;
+}
+
+sub dataend
+{
+ my $cmd = shift;
+
+ return 0 unless defined(fileno($cmd));
+
+ return 1
+    unless(exists ${*$cmd}{'net_cmd_need_crlf'});
+
+ local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+ syswrite($cmd,"\015\012",2)
+    if ${*$cmd}{'net_cmd_need_crlf'};
+
+ $cmd->debug_print(1, ".\n")
+    if($cmd->debug);
+
+ syswrite($cmd,".\015\012",3);
+
+ delete ${*$cmd}{'net_cmd_need_crlf'};
+
+ $cmd->response() == CMD_OK;
+}
+
+# read and write to tied filehandle
+sub tied_fh {
+  my $cmd = shift;
+  ${*$cmd}{'net_cmd_readbuf'} = '';
+  my $fh = gensym();
+  tie *$fh,ref($cmd),$cmd;
+  return $fh;
+}
+
+# tie to myself
+sub TIEHANDLE {
+  my $class = shift;
+  my $cmd = shift;
+  return $cmd;
+}
+
+# Tied filehandle read.  Reads requested data length, returning
+# end-of-file when the dot is encountered.
+sub READ {
+  my $cmd = shift;
+  my ($len,$offset) = @_[1,2];
+  return unless exists ${*$cmd}{'net_cmd_readbuf'};
+  my $done = 0;
+  while (!$done and length(${*$cmd}{'net_cmd_readbuf'}) < $len) {
+     ${*$cmd}{'net_cmd_readbuf'} .= $cmd->getline() or return;
+     $done++ if ${*$cmd}{'net_cmd_readbuf'} =~ s/^\.\r?\n\Z//m;
+  }
+
+  $_[0] = '';
+  substr($_[0],$offset+0) = substr(${*$cmd}{'net_cmd_readbuf'},0,$len);
+  substr(${*$cmd}{'net_cmd_readbuf'},0,$len) = '';
+  delete ${*$cmd}{'net_cmd_readbuf'} if $done;
+
+  return length $_[0];
+}
+
+sub READLINE {
+  my $cmd = shift;
+  # in this context, we use the presence of readbuf to
+  # indicate that we have not yet reached the eof
+  return unless exists ${*$cmd}{'net_cmd_readbuf'};
+  my $line = $cmd->getline;
+  return if $line =~ /^\.\r?\n/;
+  $line;
+}
+
+sub PRINT {
+  my $cmd = shift;
+  my ($buf,$len,$offset) = @_;
+  $len    ||= length ($buf);
+  $offset += 0;
+  return unless $cmd->datasend(substr($buf,$offset,$len));
+  ${*$cmd}{'net_cmd_sending'}++;  # flag that we should call dataend()
+  return $len;
+}
+
+sub CLOSE {
+  my $cmd = shift;
+  my $r = exists(${*$cmd}{'net_cmd_sending'}) ? $cmd->dataend : 1; 
+  delete ${*$cmd}{'net_cmd_readbuf'};
+  delete ${*$cmd}{'net_cmd_sending'};
+  $r;
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Net::Cmd - Network Command class (as used by FTP, SMTP etc)
+
+=head1 SYNOPSIS
+
+    use Net::Cmd;
+
+    @ISA = qw(Net::Cmd);
+
+=head1 DESCRIPTION
+
+C<Net::Cmd> is a collection of methods that can be inherited by a sub class
+of C<IO::Handle>. These methods implement the functionality required for a
+command based protocol, for example FTP and SMTP.
+
+=head1 USER METHODS
+
+These methods provide a user interface to the C<Net::Cmd> object.
+
+=over 4
+
+=item debug ( VALUE )
+
+Set the level of debug information for this object. If C<VALUE> is not given
+then the current state is returned. Otherwise the state is changed to 
+C<VALUE> and the previous state returned. 
+
+Different packages
+may implement different levels of debug but a non-zero value results in 
+copies of all commands and responses also being sent to STDERR.
+
+If C<VALUE> is C<undef> then the debug level will be set to the default
+debug level for the class.
+
+This method can also be called as a I<static> method to set/get the default
+debug level for a given class.
+
+=item message ()
+
+Returns the text message returned from the last command
+
+=item code ()
+
+Returns the 3-digit code from the last command. If a command is pending
+then the value 0 is returned
+
+=item ok ()
+
+Returns non-zero if the last code value was greater than zero and
+less than 400. This holds true for most command servers. Servers
+where this does not hold may override this method.
+
+=item status ()
+
+Returns the most significant digit of the current status code. If a command
+is pending then C<CMD_PENDING> is returned.
+
+=item datasend ( DATA )
+
+Send data to the remote server, converting LF to CRLF. Any line starting
+with a '.' will be prefixed with another '.'.
+C<DATA> may be an array or a reference to an array.
+
+=item dataend ()
+
+End the sending of data to the remote server. This is done by ensuring that
+the data already sent ends with CRLF then sending '.CRLF' to end the
+transmission. Once this data has been sent C<dataend> calls C<response> and
+returns true if C<response> returns CMD_OK.
+
+=back
+
+=head1 CLASS METHODS
+
+These methods are not intended to be called by the user, but used or 
+over-ridden by a sub-class of C<Net::Cmd>
+
+=over 4
+
+=item debug_print ( DIR, TEXT )
+
+Print debugging information. C<DIR> denotes the direction I<true> being
+data being sent to the server. Calls C<debug_text> before printing to
+STDERR.
+
+=item debug_text ( TEXT )
+
+This method is called to print debugging information. TEXT is
+the text being sent. The method should return the text to be printed
+
+This is primarily meant for the use of modules such as FTP where passwords
+are sent, but we do not want to display them in the debugging information.
+
+=item command ( CMD [, ARGS, ... ])
+
+Send a command to the command server. All arguments a first joined with
+a space character and CRLF is appended, this string is then sent to the
+command server.
+
+Returns undef upon failure
+
+=item unsupported ()
+
+Sets the status code to 580 and the response text to 'Unsupported command'.
+Returns zero.
+
+=item response ()
+
+Obtain a response from the server. Upon success the most significant digit
+of the status code is returned. Upon failure, timeout etc., I<undef> is
+returned.
+
+=item parse_response ( TEXT )
+
+This method is called by C<response> as a method with one argument. It should
+return an array of 2 values, the 3-digit status code and a flag which is true
+when this is part of a multi-line response and this line is not the list.
+
+=item getline ()
+
+Retrieve one line, delimited by CRLF, from the remote server. Returns I<undef>
+upon failure.
+
+B<NOTE>: If you do use this method for any reason, please remember to add
+some C<debug_print> calls into your method.
+
+=item ungetline ( TEXT )
+
+Unget a line of text from the server.
+
+=item rawdatasend ( DATA )
+
+Send data to the remote server without performing any conversions. C<DATA>
+is a scalar.
+
+=item read_until_dot ()
+
+Read data from the remote server until a line consisting of a single '.'.
+Any lines starting with '..' will have one of the '.'s removed.
+
+Returns a reference to a list containing the lines, or I<undef> upon failure.
+
+=item tied_fh ()
+
+Returns a filehandle tied to the Net::Cmd object.  After issuing a
+command, you may read from this filehandle using read() or <>.  The
+filehandle will return EOF when the final dot is encountered.
+Similarly, you may write to the filehandle in order to send data to
+the server after issuing a commmand that expects data to be written.
+
+See the Net::POP3 and Net::SMTP modules for examples of this.
+
+=back
+
+=head1 EXPORTS
+
+C<Net::Cmd> exports six subroutines, five of these, C<CMD_INFO>, C<CMD_OK>,
+C<CMD_MORE>, C<CMD_REJECT> and C<CMD_ERROR>, correspond to possible results
+of C<response> and C<status>. The sixth is C<CMD_PENDING>.
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Cmd.pm#33 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/Config.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,320 @@
+# Net::Config.pm
+#
+# Copyright (c) 2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Config;
+
+require Exporter;
+use vars qw(@ISA @EXPORT %NetConfig $VERSION $CONFIGURE $LIBNET_CFG);
+use Socket qw(inet_aton inet_ntoa);
+use strict;
+
+@EXPORT  = qw(%NetConfig);
+@ISA     = qw(Net::LocalCfg Exporter);
+$VERSION = "1.10"; # $Id: //depot/libnet/Net/Config.pm#17 $
+
+eval { local $SIG{__DIE__}; require Net::LocalCfg };
+
+%NetConfig = (
+    nntp_hosts => [],
+    snpp_hosts => [],
+    pop3_hosts => [],
+    smtp_hosts => [],
+    ph_hosts => [],
+    daytime_hosts => [],
+    time_hosts => [],
+    inet_domain => undef,
+    ftp_firewall => undef,
+    ftp_ext_passive => 0,
+    ftp_int_passive => 0,
+    test_hosts => 1,
+    test_exist => 1,
+);
+
+#
+# Try to get as much configuration info as possible from InternetConfig
+#
+$^O eq 'MacOS' and eval <<TRY_INTERNET_CONFIG;
+use Mac::InternetConfig;
+
+{
+my %nc = (
+    nntp_hosts      => [ \$InternetConfig{ kICNNTPHost() } ],
+    pop3_hosts      => [ \$InternetConfig{ kICMailAccount() } =~ /\@(.*)/ ],
+    smtp_hosts      => [ \$InternetConfig{ kICSMTPHost() } ],
+    ftp_testhost    => \$InternetConfig{ kICFTPHost() } ? \$InternetConfig{ kICFTPHost()} : undef,
+    ph_hosts        => [ \$InternetConfig{ kICPhHost() }   ],
+    ftp_ext_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
+    ftp_int_passive => \$InternetConfig{"646F676F\xA5UsePassiveMode"} || 0,
+    socks_hosts     => 
+    	\$InternetConfig{ kICUseSocks() }    ? [ \$InternetConfig{ kICSocksHost() }    ] : [],
+    ftp_firewall    => 
+    	\$InternetConfig{ kICUseFTPProxy() } ? [ \$InternetConfig{ kICFTPProxyHost() } ] : [],
+);
+\@NetConfig{keys %nc} = values %nc;
+}
+TRY_INTERNET_CONFIG
+
+my $file = __FILE__;
+my $ref;
+$file =~ s/Config.pm/libnet.cfg/;
+if ( -f $file ) {
+    $ref = eval { local $SIG{__DIE__}; do $file };
+    if (ref($ref) eq 'HASH') {
+	%NetConfig = (%NetConfig, %{ $ref });
+	$LIBNET_CFG = $file;
+    }
+}
+if ($< == $> and !$CONFIGURE)  {
+    my $home = eval { local $SIG{__DIE__}; (getpwuid($>))[7] } || $ENV{HOME};
+    $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH}||'') if defined $ENV{HOMEDRIVE};
+    if (defined $home) {
+	$file = $home . "/.libnetrc";
+	$ref = eval { local $SIG{__DIE__}; do $file } if -f $file;
+	%NetConfig = (%NetConfig, %{ $ref })
+	    if ref($ref) eq 'HASH';	
+    }
+}
+my ($k,$v);
+while(($k,$v) = each %NetConfig) {
+	$NetConfig{$k} = [ $v ]
+		if($k =~ /_hosts$/ and $k ne "test_hosts" and defined($v) and !ref($v));
+}
+
+# Take a hostname and determine if it is inside the firewall
+
+sub requires_firewall {
+    shift; # ignore package
+    my $host = shift;
+
+    return 0 unless defined $NetConfig{'ftp_firewall'};
+
+    $host = inet_aton($host) or return -1;
+    $host = inet_ntoa($host);
+
+    if(exists $NetConfig{'local_netmask'}) {
+	my $quad = unpack("N",pack("C*",split(/\./,$host)));
+	my $list = $NetConfig{'local_netmask'};
+	$list = [$list] unless ref($list);
+	foreach (@$list) {
+	    my($net,$bits) = (m#^(\d+\.\d+\.\d+\.\d+)/(\d+)$#) or next;
+	    my $mask = ~0 << (32 - $bits);
+	    my $addr = unpack("N",pack("C*",split(/\./,$net)));
+
+	    return 0 if (($addr & $mask) == ($quad & $mask));
+	}
+	return 1;
+    }
+
+    return 0;
+}
+
+use vars qw(*is_external);
+*is_external = \&requires_firewall;
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Config - Local configuration data for libnet
+
+=head1 SYNOPSYS
+
+    use Net::Config qw(%NetConfig);
+
+=head1 DESCRIPTION
+
+C<Net::Config> holds configuration data for the modules in the libnet
+distribuion. During installation you will be asked for these values.
+
+The configuration data is held globally in a file in the perl installation
+tree, but a user may override any of these values by providing their own. This
+can be done by having a C<.libnetrc> file in their home directory. This file
+should return a reference to a HASH containing the keys described below.
+For example
+
+    # .libnetrc
+    {
+        nntp_hosts => [ "my_prefered_host" ],
+	ph_hosts   => [ "my_ph_server" ],
+    }
+    __END__
+
+=head1 METHODS
+
+C<Net::Config> defines the following methods. They are methods as they are
+invoked as class methods. This is because C<Net::Config> inherits from
+C<Net::LocalCfg> so you can override these methods if you want.
+
+=over 4
+
+=item requires_firewall HOST
+
+Attempts to determine if a given host is outside your firewall. Possible
+return values are.
+
+  -1  Cannot lookup hostname
+   0  Host is inside firewall (or there is no ftp_firewall entry)
+   1  Host is outside the firewall
+
+This is done by using hostname lookup and the C<local_netmask> entry in
+the configuration data.
+
+=back
+
+=head1 NetConfig VALUES
+
+=over 4
+
+=item nntp_hosts
+
+=item snpp_hosts
+
+=item pop3_hosts
+
+=item smtp_hosts
+
+=item ph_hosts
+
+=item daytime_hosts
+
+=item time_hosts
+
+Each is a reference to an array of hostnames (in order of preference),
+which should be used for the given protocol
+
+=item inet_domain
+
+Your internet domain name
+
+=item ftp_firewall
+
+If you have an FTP proxy firewall (B<NOT> an HTTP or SOCKS firewall)
+then this value should be set to the firewall hostname. If your firewall
+does not listen to port 21, then this value should be set to
+C<"hostname:port"> (eg C<"hostname:99">)
+
+=item ftp_firewall_type
+
+There are many different ftp firewall products available. But unfortunately
+there is no standard for how to traverse a firewall.  The list below shows the
+sequence of commands that Net::FTP will use
+
+  user        Username for remote host
+  pass        Password for remote host
+  fwuser      Username for firewall
+  fwpass      Password for firewall
+  remote.host The hostname of the remote ftp server
+
+=over 4
+
+=item 0
+
+There is no firewall
+
+=item 1
+
+     USER user@remote.host
+     PASS pass
+
+=item 2
+
+     USER fwuser
+     PASS fwpass
+     USER user@remote.host
+     PASS pass
+
+=item 3
+
+     USER fwuser
+     PASS fwpass
+     SITE remote.site
+     USER user
+     PASS pass
+
+=item 4
+
+     USER fwuser
+     PASS fwpass
+     OPEN remote.site
+     USER user
+     PASS pass
+
+=item 5
+
+     USER user@fwuser@remote.site
+     PASS pass@fwpass
+
+=item 6
+
+     USER fwuser@remote.site
+     PASS fwpass
+     USER user
+     PASS pass
+
+=item 7
+
+     USER user@remote.host
+     PASS pass
+     AUTH fwuser
+     RESP fwpass
+
+=back
+
+=item ftp_ext_passive
+
+=item ftp_int_pasive
+
+FTP servers normally work on a non-passive mode. That is when you want to
+transfer data you have to tell the server the address and port to
+connect to.
+
+With some firewalls this does not work as the server cannot
+connect to your machine (because you are behind a firewall) and the firewall
+does not re-write the command. In this case you should set C<ftp_ext_passive>
+to a I<true> value.
+
+Some servers are configured to only work in passive mode. If you have
+one of these you can force C<Net::FTP> to always transfer in passive
+mode; when not going via a firewall, by setting C<ftp_int_passive> to
+a I<true> value.
+
+=item local_netmask
+
+A reference to a list of netmask strings in the form C<"134.99.4.0/24">.
+These are used by the C<requires_firewall> function to determine if a given
+host is inside or outside your firewall.
+
+=back
+
+The following entries are used during installation & testing on the
+libnet package
+
+=over 4
+
+=item test_hosts
+
+If true then C<make test> may attempt to connect to hosts given in the
+configuration.
+
+=item test_exists
+
+If true then C<Configure> will check each hostname given that it exists
+
+=back
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Config.pm#17 $>
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Graham Barr <gbarr@pobox.com>. All rights reserved.
+This program is free software; you can redistribute it and/or 
+modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/Domain.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,342 @@
+# Net::Domain.pm
+#
+# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Domain;
+
+require Exporter;
+
+use Carp;
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK);
+use Net::Config;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(hostname hostdomain hostfqdn domainname);
+
+$VERSION = "2.19"; # $Id: //depot/libnet/Net/Domain.pm#21 $
+
+my($host,$domain,$fqdn) = (undef,undef,undef);
+
+# Try every conceivable way to get hostname.
+
+sub _hostname {
+
+    # we already know it
+    return $host
+    	if(defined $host);
+
+    if ($^O eq 'MSWin32') {
+        require Socket;
+        my ($name,$alias,$type,$len,@addr) =  gethostbyname($ENV{'COMPUTERNAME'}||'localhost');
+        while (@addr)
+         {
+          my $a = shift(@addr);
+          $host = gethostbyaddr($a,Socket::AF_INET());
+          last if defined $host;
+         }
+        if (defined($host) && index($host,'.') > 0) {
+           $fqdn = $host;
+           ($host,$domain) = $fqdn =~ /^([^\.]+)\.(.*)$/;
+         }
+        return $host;
+    }
+    elsif ($^O eq 'MacOS') {
+	chomp ($host = `hostname`);
+    }
+    elsif ($^O eq 'VMS') {   ## multiple varieties of net s/w makes this hard
+        $host = $ENV{'UCX$INET_HOST'} if defined($ENV{'UCX$INET_HOST'});
+        $host = $ENV{'MULTINET_HOST_NAME'} if defined($ENV{'MULTINET_HOST_NAME'});
+        if (index($host,'.') > 0) {
+           $fqdn = $host;
+           ($host,$domain) = $fqdn =~ /^([^\.]+)\.(.*)$/;
+        }
+        return $host;
+    }
+    else {
+	local $SIG{'__DIE__'};
+
+	# syscall is preferred since it avoids tainting problems
+	eval {
+    	    my $tmp = "\0" x 256; ## preload scalar
+    	    eval {
+    		package main;
+     		require "syscall.ph";
+		defined(&main::SYS_gethostname);
+    	    }
+    	    || eval {
+    		package main;
+     		require "sys/syscall.ph";
+		defined(&main::SYS_gethostname);
+    	    }
+            and $host = (syscall(&main::SYS_gethostname, $tmp, 256) == 0)
+		    ? $tmp
+		    : undef;
+	}
+
+	# POSIX
+	|| eval {
+	    require POSIX;
+	    $host = (POSIX::uname())[1];
+	}
+
+	# trusty old hostname command
+	|| eval {
+    	    chop($host = `(hostname) 2>/dev/null`); # BSD'ish
+	}
+
+	# sysV/POSIX uname command (may truncate)
+	|| eval {
+    	    chop($host = `uname -n 2>/dev/null`); ## SYSV'ish && POSIX'ish
+	}
+
+	# Apollo pre-SR10
+	|| eval {
+    	    $host = (split(/[:\. ]/,`/com/host`,6))[0];
+	}
+
+	|| eval {
+    	    $host = "";
+	};
+    }
+
+    # remove garbage
+    $host =~ s/[\0\r\n]+//go;
+    $host =~ s/(\A\.+|\.+\Z)//go;
+    $host =~ s/\.\.+/\./go;
+
+    $host;
+}
+
+sub _hostdomain {
+
+    # we already know it
+    return $domain
+    	if(defined $domain);
+
+    local $SIG{'__DIE__'};
+
+    return $domain = $NetConfig{'inet_domain'}
+	if defined $NetConfig{'inet_domain'};
+
+    # try looking in /etc/resolv.conf
+    # putting this here and assuming that it is correct, eliminates
+    # calls to gethostbyname, and therefore DNS lookups. This helps
+    # those on dialup systems.
+
+    local *RES;
+    local($_);
+
+    if(open(RES,"/etc/resolv.conf")) {
+    	while(<RES>) {
+    	    $domain = $1
+    	    	if(/\A\s*(?:domain|search)\s+(\S+)/);
+    	}
+    	close(RES);
+
+    	return $domain
+    	    if(defined $domain);
+    }
+
+    # just try hostname and system calls
+
+    my $host = _hostname();
+    my(@hosts);
+
+    @hosts = ($host,"localhost");
+
+    unless (defined($host) && $host =~ /\./) {
+	my $dom = undef;
+        eval {
+    	    my $tmp = "\0" x 256; ## preload scalar
+    	    eval {
+    	        package main;
+     	        require "syscall.ph";
+    	    }
+    	    || eval {
+    	        package main;
+     	        require "sys/syscall.ph";
+    	    }
+            and $dom = (syscall(&main::SYS_getdomainname, $tmp, 256) == 0)
+		    ? $tmp
+		    : undef;
+        };
+
+	if ( $^O eq 'VMS' ) {
+	    $dom ||= $ENV{'TCPIP$INET_DOMAIN'}
+		 || $ENV{'UCX$INET_DOMAIN'};
+	}
+
+	chop($dom = `domainname 2>/dev/null`)
+		unless(defined $dom || $^O =~ /^(?:cygwin|MSWin32)/);
+
+	if(defined $dom) {
+	    my @h = ();
+	    $dom =~ s/^\.+//;
+	    while(length($dom)) {
+		push(@h, "$host.$dom");
+		$dom =~ s/^[^.]+.+// or last;
+	    }
+	    unshift(@hosts,@h);
+    	}
+    }
+
+    # Attempt to locate FQDN
+
+    foreach (grep {defined $_} @hosts) {
+    	my @info = gethostbyname($_);
+
+    	next unless @info;
+
+    	# look at real name & aliases
+    	my $site;
+    	foreach $site ($info[0], split(/ /,$info[1])) {
+    	    if(rindex($site,".") > 0) {
+
+    	    	# Extract domain from FQDN
+
+     	    	($domain = $site) =~ s/\A[^\.]+\.//;
+     	        return $domain;
+    	    }
+    	}
+    }
+
+    # Look for environment variable
+
+    $domain ||= $ENV{LOCALDOMAIN} || $ENV{DOMAIN};
+
+    if(defined $domain) {
+    	$domain =~ s/[\r\n\0]+//g;
+    	$domain =~ s/(\A\.+|\.+\Z)//g;
+    	$domain =~ s/\.\.+/\./g;
+    }
+
+    $domain;
+}
+
+sub domainname {
+
+    return $fqdn
+    	if(defined $fqdn);
+
+    _hostname();
+    _hostdomain();
+
+    # Assumption: If the host name does not contain a period
+    # and the domain name does, then assume that they are correct
+    # this helps to eliminate calls to gethostbyname, and therefore
+    # eleminate DNS lookups
+
+    return $fqdn = $host . "." . $domain
+	if(defined $host and defined $domain
+		and $host !~ /\./ and $domain =~ /\./);
+
+    # For hosts that have no name, just an IP address
+    return $fqdn = $host if defined $host and $host =~ /^\d+(\.\d+){3}$/;
+
+    my @host   = defined $host   ? split(/\./, $host)   : ('localhost');
+    my @domain = defined $domain ? split(/\./, $domain) : ();
+    my @fqdn   = ();
+
+    # Determine from @host & @domain the FQDN
+
+    my @d = @domain;
+
+LOOP:
+    while(1) {
+    	my @h = @host;
+    	while(@h) {
+    	    my $tmp = join(".",@h,@d);
+    	    if((gethostbyname($tmp))[0]) {
+     	        @fqdn = (@h,@d);
+     	        $fqdn = $tmp;
+     	      last LOOP;
+    	    }
+    	    pop @h;
+    	}
+    	last unless shift @d;
+    }
+
+    if(@fqdn) {
+    	$host = shift @fqdn;
+    	until((gethostbyname($host))[0]) {
+    	    $host .= "." . shift @fqdn;
+    	}
+    	$domain = join(".", @fqdn);
+    }
+    else {
+    	undef $host;
+    	undef $domain;
+    	undef $fqdn;
+    }
+
+    $fqdn;
+}
+
+sub hostfqdn { domainname() }
+
+sub hostname {
+    domainname()
+    	unless(defined $host);
+    return $host;
+}
+
+sub hostdomain {
+    domainname()
+    	unless(defined $domain);
+    return $domain;
+}
+
+1; # Keep require happy
+
+__END__
+
+=head1 NAME
+
+Net::Domain - Attempt to evaluate the current host's internet name and domain
+
+=head1 SYNOPSIS
+
+    use Net::Domain qw(hostname hostfqdn hostdomain);
+
+=head1 DESCRIPTION
+
+Using various methods B<attempt> to find the Fully Qualified Domain Name (FQDN)
+of the current host. From this determine the host-name and the host-domain.
+
+Each of the functions will return I<undef> if the FQDN cannot be determined.
+
+=over 4
+
+=item hostfqdn ()
+
+Identify and return the FQDN of the current host.
+
+=item hostname ()
+
+Returns the smallest part of the FQDN which can be used to identify the host.
+
+=item hostdomain ()
+
+Returns the remainder of the FQDN after the I<hostname> has been removed.
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>.
+Adapted from Sys::Hostname by David Sundstrom <sunds@asictest.sc.ti.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Domain.pm#21 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/DummyInetd.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,148 @@
+# Net::DummyInetd.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::DummyInetd;
+
+require 5.002;
+
+use IO::Handle;
+use IO::Socket;
+use strict;
+use vars qw($VERSION);
+use Carp;
+
+$VERSION = do { my @r=(q$Revision: 1.6 $=~/\d+/g); sprintf "%d."."%02d"x$#r,@r};
+
+
+sub _process
+{
+ my $listen = shift;
+ my @cmd = @_;
+ my $vec = '';
+ my $r;
+
+ vec($vec,fileno($listen),1) = 1;
+
+ while(select($r=$vec,undef,undef,undef))
+  {
+   my $sock = $listen->accept;
+   my $pid;
+
+   if($pid = fork())
+    {
+     sleep 1;
+     close($sock);
+    }
+   elsif(defined $pid)
+    {
+     my $x =  IO::Handle->new_from_fd($sock,"r");
+     open(STDIN,"<&=".fileno($x)) || die "$! $@";
+     close($x);
+
+     my $y = IO::Handle->new_from_fd($sock,"w");
+     open(STDOUT,">&=".fileno($y)) || die "$! $@";
+     close($y);
+
+     close($sock);
+     exec(@cmd) || carp "$! $@";
+    }
+   else
+    {
+     close($sock);
+     carp $!;
+    }
+  }
+ exit -1; 
+}
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+
+ my $listen = IO::Socket::INET->new(Listen => 5, Proto => 'tcp');
+ my $pid;
+
+ return bless [ $listen->sockport, $pid ]
+	if($pid = fork());
+
+ _process($listen,@_);
+}
+
+sub port
+{
+ my $self = shift;
+ $self->[0];
+}
+
+sub DESTROY
+{
+ my $self = shift;
+ kill 9, $self->[1];
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::DummyInetd - A dummy Inetd server
+
+=head1 SYNOPSIS
+
+    use Net::DummyInetd;
+    use Net::SMTP;
+    
+    $inetd = new Net::DummyInetd qw(/usr/lib/sendmail -ba -bs);
+    
+    $smtp  = Net::SMTP->new('localhost', Port => $inetd->port);
+
+=head1 DESCRIPTION
+
+C<Net::DummyInetd> is just what it's name says, it is a dummy inetd server.
+Creation of a C<Net::DummyInetd> will cause a child process to be spawned off
+which will listen to a socket. When a connection arrives on this socket
+the specified command is fork'd and exec'd with STDIN and STDOUT file
+descriptors duplicated to the new socket.
+
+This package was added as an example of how to use C<Net::SMTP> to connect
+to a C<sendmail> process, which is not the default, via SIDIN and STDOUT.
+A C<Net::Inetd> package will be available in the next release of C<libnet>
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( CMD )
+
+Creates a new object and spawns a child process which listens to a socket.
+C<CMD> is a list, which will be passed to C<exec> when a new process needs
+to be created.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item port
+
+Returns the port number on which the I<DummyInetd> object is listening
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1770 @@
+# Net::FTP.pm
+#
+# Copyright (c) 1995-8 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+#
+# Documentation (at end) improved 1996 by Nathan Torkington <gnat@frii.com>.
+
+package Net::FTP;
+
+require 5.001;
+
+use strict;
+use vars qw(@ISA $VERSION);
+use Carp;
+
+use Socket 1.3;
+use IO::Socket;
+use Time::Local;
+use Net::Cmd;
+use Net::Config;
+use Fcntl qw(O_WRONLY O_RDONLY O_APPEND O_CREAT O_TRUNC);
+
+$VERSION = "2.72"; # $Id: //depot/libnet/Net/FTP.pm#80 $
+@ISA     = qw(Exporter Net::Cmd IO::Socket::INET);
+
+# Someday I will "use constant", when I am not bothered to much about
+# compatability with older releases of perl
+
+use vars qw($TELNET_IAC $TELNET_IP $TELNET_DM);
+($TELNET_IAC,$TELNET_IP,$TELNET_DM) = (255,244,242);
+
+# Name is too long for AutoLoad, it clashes with pasv_xfer
+sub pasv_xfer_unique {
+    my($sftp,$sfile,$dftp,$dfile) = @_;
+    $sftp->pasv_xfer($sfile,$dftp,$dfile,1);
+}
+
+BEGIN {
+  # make a constant so code is fast'ish
+  my $is_os390 = $^O eq 'os390';
+  *trEBCDIC = sub () { $is_os390 }
+}
+
+1;
+# Having problems with AutoLoader
+#__END__
+
+sub new
+{
+ my $pkg  = shift;
+ my $peer = shift;
+ my %arg  = @_; 
+
+ my $host = $peer;
+ my $fire = undef;
+ my $fire_type = undef;
+
+ if(exists($arg{Firewall}) || Net::Config->requires_firewall($peer))
+  {
+   $fire = $arg{Firewall}
+	|| $ENV{FTP_FIREWALL}
+	|| $NetConfig{ftp_firewall}
+	|| undef;
+
+   if(defined $fire)
+    {
+     $peer = $fire;
+     delete $arg{Port};
+	 $fire_type = $arg{FirewallType}
+	 || $ENV{FTP_FIREWALL_TYPE}
+	 || $NetConfig{firewall_type}
+	 || undef;
+    }
+  }
+
+ my $ftp = $pkg->SUPER::new(PeerAddr => $peer, 
+			    PeerPort => $arg{Port} || 'ftp(21)',
+			    LocalAddr => $arg{'LocalAddr'},
+			    Proto    => 'tcp',
+			    Timeout  => defined $arg{Timeout}
+						? $arg{Timeout}
+						: 120
+			   ) or return undef;
+
+ ${*$ftp}{'net_ftp_host'}     = $host;		# Remote hostname
+ ${*$ftp}{'net_ftp_type'}     = 'A';		# ASCII/binary/etc mode
+ ${*$ftp}{'net_ftp_blksize'}  = abs($arg{'BlockSize'} || 10240);
+
+ ${*$ftp}{'net_ftp_localaddr'} = $arg{'LocalAddr'};
+
+ ${*$ftp}{'net_ftp_firewall'} = $fire
+	if(defined $fire);
+ ${*$ftp}{'net_ftp_firewall_type'} = $fire_type
+	if(defined $fire_type);
+
+ ${*$ftp}{'net_ftp_passive'} = int
+	exists $arg{Passive}
+	    ? $arg{Passive}
+	    : exists $ENV{FTP_PASSIVE}
+		? $ENV{FTP_PASSIVE}
+		: defined $fire
+		    ? $NetConfig{ftp_ext_passive}
+		    : $NetConfig{ftp_int_passive};	# Whew! :-)
+
+ $ftp->hash(exists $arg{Hash} ? $arg{Hash} : 0, 1024);
+
+ $ftp->autoflush(1);
+
+ $ftp->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($ftp->response() == CMD_OK)
+  {
+   $ftp->close();
+   $@ = $ftp->message;
+   undef $ftp;
+  }
+
+ $ftp;
+}
+
+##
+## User interface methods
+##
+
+sub hash {
+    my $ftp = shift;		# self
+
+    my($h,$b) = @_;
+    unless($h) {
+      delete ${*$ftp}{'net_ftp_hash'};
+      return [\*STDERR,0];
+    }
+    ($h,$b) = (ref($h)? $h : \*STDERR, $b || 1024);
+    select((select($h), $|=1)[0]);
+    $b = 512 if $b < 512;
+    ${*$ftp}{'net_ftp_hash'} = [$h, $b];
+}        
+
+sub quit
+{
+ my $ftp = shift;
+
+ $ftp->_QUIT;
+ $ftp->close;
+}
+
+sub DESTROY {}
+
+sub ascii  { shift->type('A',@_); }
+sub binary { shift->type('I',@_); }
+
+sub ebcdic
+{
+ carp "TYPE E is unsupported, shall default to I";
+ shift->type('E',@_);
+}
+
+sub byte
+{
+ carp "TYPE L is unsupported, shall default to I";
+ shift->type('L',@_);
+}
+
+# Allow the user to send a command directly, BE CAREFUL !!
+
+sub quot
+{ 
+ my $ftp = shift;
+ my $cmd = shift;
+
+ $ftp->command( uc $cmd, @_);
+ $ftp->response();
+}
+
+sub site
+{
+ my $ftp = shift;
+
+ $ftp->command("SITE", @_);
+ $ftp->response();
+}
+
+sub mdtm
+{
+ my $ftp  = shift;
+ my $file = shift;
+
+ # Server Y2K defect workaround
+ #
+ # sigh; some idiotic FTP servers use ("19%d",tm.tm_year) instead of 
+ # ("%d",tm.tm_year+1900).  This results in an extra digit in the
+ # string returned. To account for this we allow an optional extra
+ # digit in the year. Then if the first two digits are 19 we use the
+ # remainder, otherwise we subtract 1900 from the whole year.
+
+ $ftp->_MDTM($file) && $ftp->message =~ /((\d\d)(\d\d\d?))(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/
+    ? timegm($8,$7,$6,$5,$4-1,$2 eq '19' ? $3 : ($1-1900))
+    : undef;
+}
+
+sub size {
+  my $ftp  = shift;
+  my $file = shift;
+  my $io;
+  if($ftp->supported("SIZE")) {
+    return $ftp->_SIZE($file)
+	? ($ftp->message =~ /(\d+)\s*$/)[0]
+	: undef;
+ }
+ elsif($ftp->supported("STAT")) {
+   my @msg;
+   return undef
+       unless $ftp->_STAT($file) && (@msg = $ftp->message) == 3;
+   my $line;
+   foreach $line (@msg) {
+     return (split(/\s+/,$line))[4]
+	 if $line =~ /^[-rwxSsTt]{10}/
+   }
+ }
+ else {
+   my @files = $ftp->dir($file);
+   if(@files) {
+     return (split(/\s+/,$1))[4]
+	 if $files[0] =~ /^([-rwxSsTt]{10}.*)$/;
+   }
+ }
+ undef;
+}
+
+sub login {
+  my($ftp,$user,$pass,$acct) = @_;
+  my($ok,$ruser,$fwtype);
+
+  unless (defined $user) {
+    require Net::Netrc;
+
+    my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'});
+
+    ($user,$pass,$acct) = $rc->lpa()
+	 if ($rc);
+   }
+
+  $user ||= "anonymous";
+  $ruser = $user;
+
+  $fwtype = ${*$ftp}{'net_ftp_firewall_type'}
+  || $NetConfig{'ftp_firewall_type'}
+  || 0;
+
+  if ($fwtype && defined ${*$ftp}{'net_ftp_firewall'}) {
+    if ($fwtype == 1 || $fwtype == 7) {
+      $user .= '@' . ${*$ftp}{'net_ftp_host'};
+    }
+    else {
+      require Net::Netrc;
+
+      my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
+
+      my($fwuser,$fwpass,$fwacct) = $rc ? $rc->lpa() : ();
+
+      if ($fwtype == 5) {
+	$user = join('@',$user,$fwuser,${*$ftp}{'net_ftp_host'});
+	$pass = $pass . '@' . $fwpass;
+      }
+      else {
+	if ($fwtype == 2) {
+	  $user .= '@' . ${*$ftp}{'net_ftp_host'};
+	}
+	elsif ($fwtype == 6) {
+	  $fwuser .= '@' . ${*$ftp}{'net_ftp_host'};
+	}
+
+	$ok = $ftp->_USER($fwuser);
+
+	return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+
+	$ok = $ftp->_PASS($fwpass || "");
+
+	return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+
+	$ok = $ftp->_ACCT($fwacct)
+	  if defined($fwacct);
+
+	if ($fwtype == 3) {
+          $ok = $ftp->command("SITE",${*$ftp}{'net_ftp_host'})->response;
+	}
+	elsif ($fwtype == 4) {
+          $ok = $ftp->command("OPEN",${*$ftp}{'net_ftp_host'})->response;
+	}
+
+	return 0 unless $ok == CMD_OK || $ok == CMD_MORE;
+      }
+    }
+  }
+
+  $ok = $ftp->_USER($user);
+
+  # Some dumb firewalls don't prefix the connection messages
+  $ok = $ftp->response()
+	 if ($ok == CMD_OK && $ftp->code == 220 && $user =~ /\@/);
+
+  if ($ok == CMD_MORE) {
+    unless(defined $pass) {
+      require Net::Netrc;
+
+      my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_host'}, $ruser);
+
+      ($ruser,$pass,$acct) = $rc->lpa()
+	 if ($rc);
+
+      $pass = '-anonymous@'
+         if (!defined $pass && (!defined($ruser) || $ruser =~ /^anonymous/o));
+    }
+
+    $ok = $ftp->_PASS($pass || "");
+  }
+
+  $ok = $ftp->_ACCT($acct)
+	 if (defined($acct) && ($ok == CMD_MORE || $ok == CMD_OK));
+
+  if ($fwtype == 7 && $ok == CMD_OK && defined ${*$ftp}{'net_ftp_firewall'}) {
+    my($f,$auth,$resp) = _auth_id($ftp);
+    $ftp->authorize($auth,$resp) if defined($resp);
+  }
+
+  $ok == CMD_OK;
+}
+
+sub account
+{
+ @_ == 2 or croak 'usage: $ftp->account( ACCT )';
+ my $ftp = shift;
+ my $acct = shift;
+ $ftp->_ACCT($acct) == CMD_OK;
+}
+
+sub _auth_id {
+ my($ftp,$auth,$resp) = @_;
+
+ unless(defined $resp)
+  {
+   require Net::Netrc;
+
+   $auth ||= eval { (getpwuid($>))[0] } || $ENV{NAME};
+
+   my $rc = Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'}, $auth)
+        || Net::Netrc->lookup(${*$ftp}{'net_ftp_firewall'});
+
+   ($auth,$resp) = $rc->lpa()
+     if ($rc);
+  }
+  ($ftp,$auth,$resp);
+}
+
+sub authorize
+{
+ @_ >= 1 || @_ <= 3 or croak 'usage: $ftp->authorize( [AUTH [, RESP]])';
+
+ my($ftp,$auth,$resp) = &_auth_id;
+
+ my $ok = $ftp->_AUTH($auth || "");
+
+ $ok = $ftp->_RESP($resp || "")
+	if ($ok == CMD_MORE);
+
+ $ok == CMD_OK;
+}
+
+sub rename
+{
+ @_ == 3 or croak 'usage: $ftp->rename(FROM, TO)';
+
+ my($ftp,$from,$to) = @_;
+
+ $ftp->_RNFR($from)
+    && $ftp->_RNTO($to);
+}
+
+sub type
+{
+ my $ftp = shift;
+ my $type = shift;
+ my $oldval = ${*$ftp}{'net_ftp_type'};
+
+ return $oldval
+	unless (defined $type);
+
+ return undef
+	unless ($ftp->_TYPE($type,@_));
+
+ ${*$ftp}{'net_ftp_type'} = join(" ",$type,@_);
+
+ $oldval;
+}
+
+sub alloc
+{
+ my $ftp = shift;
+ my $size = shift;
+ my $oldval = ${*$ftp}{'net_ftp_allo'};
+
+ return $oldval
+	unless (defined $size);
+
+ return undef
+	unless ($ftp->_ALLO($size,@_));
+
+ ${*$ftp}{'net_ftp_allo'} = join(" ",$size,@_);
+
+ $oldval;
+}
+
+sub abort
+{
+ my $ftp = shift;
+
+ send($ftp,pack("CCC", $TELNET_IAC, $TELNET_IP, $TELNET_IAC),MSG_OOB);
+
+ $ftp->command(pack("C",$TELNET_DM) . "ABOR");
+
+ ${*$ftp}{'net_ftp_dataconn'}->close()
+    if defined ${*$ftp}{'net_ftp_dataconn'};
+
+ $ftp->response();
+
+ $ftp->status == CMD_OK;
+}
+
+sub get
+{
+ my($ftp,$remote,$local,$where) = @_;
+
+ my($loc,$len,$buf,$resp,$data);
+ local *FD;
+
+ my $localfd = ref($local) || ref(\$local) eq "GLOB";
+
+ ($local = $remote) =~ s#^.*/##
+	unless(defined $local);
+
+ croak("Bad remote filename '$remote'\n")
+	if $remote =~ /[\r\n]/s;
+
+ ${*$ftp}{'net_ftp_rest'} = $where
+	if ($where);
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ $data = $ftp->retr($remote) or
+	return undef;
+
+ if($localfd)
+  {
+   $loc = $local;
+  }
+ else
+  {
+   $loc = \*FD;
+
+   unless(sysopen($loc, $local, O_CREAT | O_WRONLY | ($where ? O_APPEND : O_TRUNC)))
+    {
+     carp "Cannot open Local file $local: $!\n";
+     $data->abort;
+     return undef;
+    }
+  }
+
+ if($ftp->type eq 'I' && !binmode($loc))
+  {
+   carp "Cannot binmode Local file $local: $!\n";
+   $data->abort;
+   close($loc) unless $localfd;
+   return undef;
+  }
+
+ $buf = '';
+ my($count,$hashh,$hashb,$ref) = (0);
+
+ ($hashh,$hashb) = @$ref
+   if($ref = ${*$ftp}{'net_ftp_hash'});
+
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+ local $\; # Just in case
+
+ while(1)
+  {
+   last unless $len = $data->read($buf,$blksize);
+
+   if (trEBCDIC && $ftp->type ne 'I')
+    {
+     $buf = $ftp->toebcdic($buf);
+     $len = length($buf);
+    }
+
+   if($hashh) {
+    $count += $len;
+    print $hashh "#" x (int($count / $hashb));
+    $count %= $hashb;
+   }
+   unless(print $loc $buf)
+    {
+     carp "Cannot write to Local file $local: $!\n";
+     $data->abort;
+     close($loc)
+        unless $localfd;
+     return undef;
+    }
+  }
+
+ print $hashh "\n" if $hashh;
+
+ unless ($localfd)
+  {
+   unless (close($loc))
+    {
+     carp "Cannot close file $local (perhaps disk space) $!\n";
+     return undef;
+    }
+  }
+
+ unless ($data->close()) # implied $ftp->response
+  {
+   carp "Unable to close datastream";
+   return undef;
+  }
+
+ return $local;
+}
+
+sub cwd
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $ftp->cwd( [ DIR ] )';
+
+ my($ftp,$dir) = @_;
+
+ $dir = "/" unless defined($dir) && $dir =~ /\S/;
+
+ $dir eq ".."
+    ? $ftp->_CDUP()
+    : $ftp->_CWD($dir);
+}
+
+sub cdup
+{
+ @_ == 1 or croak 'usage: $ftp->cdup()';
+ $_[0]->_CDUP;
+}
+
+sub pwd
+{
+ @_ == 1 || croak 'usage: $ftp->pwd()';
+ my $ftp = shift;
+
+ $ftp->_PWD();
+ $ftp->_extract_path;
+}
+
+# rmdir( $ftp, $dir, [ $recurse ] )
+#
+# Removes $dir on remote host via FTP.
+# $ftp is handle for remote host
+#
+# If $recurse is TRUE, the directory and deleted recursively.
+# This means all of its contents and subdirectories.
+#
+# Initial version contributed by Dinkum Software
+#
+sub rmdir
+{
+    @_ == 2 || @_ == 3 or croak('usage: $ftp->rmdir( DIR [, RECURSE ] )');
+
+    # Pick off the args
+    my ($ftp, $dir, $recurse) = @_ ;
+    my $ok;
+
+    return $ok
+	if $ok = $ftp->_RMD( $dir ) or !$recurse;
+
+    # Try to delete the contents
+    # Get a list of all the files in the directory
+    my $filelist = $ftp->ls($dir);
+
+    return undef
+	unless $filelist && @$filelist; # failed, it is probably not a directory
+
+    # Go thru and delete each file or the directory
+    my $file;
+    foreach $file (map { m,/, ? $_ : "$dir/$_" } @$filelist)
+    {
+	next  # successfully deleted the file
+	    if $ftp->delete($file);
+
+	# Failed to delete it, assume its a directory
+	# Recurse and ignore errors, the final rmdir() will
+	# fail on any errors here
+	return $ok
+	    unless $ok = $ftp->rmdir($file, 1) ;
+    }
+
+    # Directory should be empty
+    # Try to remove the directory again
+    # Pass results directly to caller
+    # If any of the prior deletes failed, this
+    # rmdir() will fail because directory is not empty
+    return $ftp->_RMD($dir) ;
+}
+
+sub restart
+{
+  @_ == 2 || croak 'usage: $ftp->restart( BYTE_OFFSET )';
+
+  my($ftp,$where) = @_;
+
+  ${*$ftp}{'net_ftp_rest'} = $where;
+
+  return undef;
+}
+
+
+sub mkdir
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $ftp->mkdir( DIR [, RECURSE ] )';
+
+ my($ftp,$dir,$recurse) = @_;
+
+ $ftp->_MKD($dir) || $recurse or
+    return undef;
+
+ my $path = $dir;
+
+ unless($ftp->ok)
+  {
+   my @path = split(m#(?=/+)#, $dir);
+
+   $path = "";
+
+   while(@path)
+    {
+     $path .= shift @path;
+
+     $ftp->_MKD($path);
+
+     $path = $ftp->_extract_path($path);
+    }
+
+   # If the creation of the last element was not successful, see if we
+   # can cd to it, if so then return path
+
+   unless($ftp->ok)
+    {
+     my($status,$message) = ($ftp->status,$ftp->message);
+     my $pwd = $ftp->pwd;
+
+     if($pwd && $ftp->cwd($dir))
+      {
+       $path = $dir;
+       $ftp->cwd($pwd);
+      }
+     else
+      {
+       undef $path;
+      }
+     $ftp->set_status($status,$message);
+    }
+  }
+
+ $path;
+}
+
+sub delete
+{
+ @_ == 2 || croak 'usage: $ftp->delete( FILENAME )';
+
+ $_[0]->_DELE($_[1]);
+}
+
+sub put        { shift->_store_cmd("stor",@_) }
+sub put_unique { shift->_store_cmd("stou",@_) }
+sub append     { shift->_store_cmd("appe",@_) }
+
+sub nlst { shift->_data_cmd("NLST",@_) }
+sub list { shift->_data_cmd("LIST",@_) }
+sub retr { shift->_data_cmd("RETR",@_) }
+sub stor { shift->_data_cmd("STOR",@_) }
+sub stou { shift->_data_cmd("STOU",@_) }
+sub appe { shift->_data_cmd("APPE",@_) }
+
+sub _store_cmd 
+{
+ my($ftp,$cmd,$local,$remote) = @_;
+ my($loc,$sock,$len,$buf);
+ local *FD;
+
+ my $localfd = ref($local) || ref(\$local) eq "GLOB";
+
+ unless(defined $remote)
+  {
+   croak 'Must specify remote filename with stream input'
+	if $localfd;
+
+   require File::Basename;
+   $remote = File::Basename::basename($local);
+  }
+ if( defined ${*$ftp}{'net_ftp_allo'} ) 
+  {
+   delete ${*$ftp}{'net_ftp_allo'};
+  } else 
+  {
+   # if the user hasn't already invoked the alloc method since the last 
+   # _store_cmd call, figure out if the local file is a regular file(not
+   # a pipe, or device) and if so get the file size from stat, and send
+   # an ALLO command before sending the STOR, STOU, or APPE command.
+   my $size = -f $local && -s _; # no ALLO if sending data from a pipe
+   $ftp->_ALLO($size) if $size;
+  }
+ croak("Bad remote filename '$remote'\n")
+	if $remote =~ /[\r\n]/s;
+
+ if($localfd)
+  {
+   $loc = $local;
+  }
+ else
+  {
+   $loc = \*FD;
+
+   unless(sysopen($loc, $local, O_RDONLY))
+    {
+     carp "Cannot open Local file $local: $!\n";
+     return undef;
+    }
+  }
+
+ if($ftp->type eq 'I' && !binmode($loc))
+  {
+   carp "Cannot binmode Local file $local: $!\n";
+   return undef;
+  }
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ $sock = $ftp->_data_cmd($cmd, $remote) or 
+	return undef;
+
+ $remote = ($ftp->message =~ /FILE:\s*(.*)/)[0]
+   if 'STOU' eq uc $cmd;
+
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+
+ my($count,$hashh,$hashb,$ref) = (0);
+
+ ($hashh,$hashb) = @$ref
+   if($ref = ${*$ftp}{'net_ftp_hash'});
+
+ while(1)
+  {
+   last unless $len = read($loc,$buf="",$blksize);
+
+   if (trEBCDIC && $ftp->type ne 'I')
+    {
+     $buf = $ftp->toascii($buf); 
+     $len = length($buf);
+    }
+
+   if($hashh) {
+    $count += $len;
+    print $hashh "#" x (int($count / $hashb));
+    $count %= $hashb;
+   }
+
+   my $wlen;
+   unless(defined($wlen = $sock->write($buf,$len)) && $wlen == $len)
+    {
+     $sock->abort;
+     close($loc)
+	unless $localfd;
+     print $hashh "\n" if $hashh;
+     return undef;
+    }
+  }
+
+ print $hashh "\n" if $hashh;
+
+ close($loc)
+	unless $localfd;
+
+ $sock->close() or
+	return undef;
+
+ if ('STOU' eq uc $cmd and $ftp->message =~ m/unique\s+file\s*name\s*:\s*(.*)\)|"(.*)"/)
+  {
+   require File::Basename;
+   $remote = File::Basename::basename($+) 
+  }
+
+ return $remote;
+}
+
+sub port
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $ftp->port([PORT])';
+
+ my($ftp,$port) = @_;
+ my $ok;
+
+ delete ${*$ftp}{'net_ftp_intern_port'};
+
+ unless(defined $port)
+  {
+   # create a Listen socket at same address as the command socket
+
+   ${*$ftp}{'net_ftp_listen'} ||= IO::Socket::INET->new(Listen    => 5,
+				    	    	        Proto     => 'tcp',
+							Timeout   => $ftp->timeout,
+							LocalAddr => $ftp->sockhost,
+				    	    	       );
+
+   my $listen = ${*$ftp}{'net_ftp_listen'};
+
+   my($myport, @myaddr) = ($listen->sockport, split(/\./,$listen->sockhost));
+
+   $port = join(',', @myaddr, $myport >> 8, $myport & 0xff);
+
+   ${*$ftp}{'net_ftp_intern_port'} = 1;
+  }
+
+ $ok = $ftp->_PORT($port);
+
+ ${*$ftp}{'net_ftp_port'} = $port;
+
+ $ok;
+}
+
+sub ls  { shift->_list_cmd("NLST",@_); }
+sub dir { shift->_list_cmd("LIST",@_); }
+
+sub pasv
+{
+ @_ == 1 or croak 'usage: $ftp->pasv()';
+
+ my $ftp = shift;
+
+ delete ${*$ftp}{'net_ftp_intern_port'};
+
+ $ftp->_PASV && $ftp->message =~ /(\d+(,\d+)+)/
+    ? ${*$ftp}{'net_ftp_pasv'} = $1
+    : undef;    
+}
+
+sub unique_name
+{
+ my $ftp = shift;
+ ${*$ftp}{'net_ftp_unique'} || undef;
+}
+
+sub supported {
+    @_ == 2 or croak 'usage: $ftp->supported( CMD )';
+    my $ftp = shift;
+    my $cmd = uc shift;
+    my $hash = ${*$ftp}{'net_ftp_supported'} ||= {};
+
+    return $hash->{$cmd}
+        if exists $hash->{$cmd};
+
+    return $hash->{$cmd} = 0
+	unless $ftp->_HELP($cmd);
+
+    my $text = $ftp->message;
+    if($text =~ /following\s+commands/i) {
+	$text =~ s/^.*\n//;
+        while($text =~ /(\*?)(\w+)(\*?)/sg) {
+            $hash->{"\U$2"} = !length("$1$3");
+        }
+    }
+    else {
+	$hash->{$cmd} = $text !~ /unimplemented/i;
+    }
+
+    $hash->{$cmd} ||= 0;
+}
+
+##
+## Deprecated methods
+##
+
+sub lsl
+{
+ carp "Use of Net::FTP::lsl deprecated, use 'dir'"
+    if $^W;
+ goto &dir;
+}
+
+sub authorise
+{
+ carp "Use of Net::FTP::authorise deprecated, use 'authorize'"
+    if $^W;
+ goto &authorize;
+}
+
+
+##
+## Private methods
+##
+
+sub _extract_path
+{
+ my($ftp, $path) = @_;
+
+ # This tries to work both with and without the quote doubling
+ # convention (RFC 959 requires it, but the first 3 servers I checked
+ # didn't implement it).  It will fail on a server which uses a quote in
+ # the message which isn't a part of or surrounding the path.
+ $ftp->ok &&
+    $ftp->message =~ /(?:^|\s)\"(.*)\"(?:$|\s)/ &&
+    ($path = $1) =~ s/\"\"/\"/g;
+
+ $path;
+}
+
+##
+## Communication methods
+##
+
+sub _dataconn
+{
+ my $ftp = shift;
+ my $data = undef;
+ my $pkg = "Net::FTP::" . $ftp->type;
+
+ eval "require " . $pkg;
+
+ $pkg =~ s/ /_/g;
+
+ delete ${*$ftp}{'net_ftp_dataconn'};
+
+ if(defined ${*$ftp}{'net_ftp_pasv'})
+  {
+   my @port = split(/,/,${*$ftp}{'net_ftp_pasv'});
+
+   $data = $pkg->new(PeerAddr => join(".",@port[0..3]),
+    	    	     PeerPort => $port[4] * 256 + $port[5],
+		     LocalAddr => ${*$ftp}{'net_ftp_localaddr'},
+    	    	     Proto    => 'tcp'
+    	    	    );
+  }
+ elsif(defined ${*$ftp}{'net_ftp_listen'})
+  {
+   $data = ${*$ftp}{'net_ftp_listen'}->accept($pkg);
+   close(delete ${*$ftp}{'net_ftp_listen'});
+  }
+
+ if($data)
+  {
+   ${*$data} = "";
+   $data->timeout($ftp->timeout);
+   ${*$ftp}{'net_ftp_dataconn'} = $data;
+   ${*$data}{'net_ftp_cmd'} = $ftp;
+   ${*$data}{'net_ftp_blksize'} = ${*$ftp}{'net_ftp_blksize'};
+  }
+
+ $data;
+}
+
+sub _list_cmd
+{
+ my $ftp = shift;
+ my $cmd = uc shift;
+
+ delete ${*$ftp}{'net_ftp_port'};
+ delete ${*$ftp}{'net_ftp_pasv'};
+
+ my $data = $ftp->_data_cmd($cmd,@_);
+
+ return
+	unless(defined $data);
+
+ require Net::FTP::A;
+ bless $data, "Net::FTP::A"; # Force ASCII mode
+
+ my $databuf = '';
+ my $buf = '';
+ my $blksize = ${*$ftp}{'net_ftp_blksize'};
+
+ while($data->read($databuf,$blksize)) {
+   $buf .= $databuf;
+ }
+
+ my $list = [ split(/\n/,$buf) ];
+
+ $data->close();
+
+ if (trEBCDIC)
+  {
+   for (@$list) { $_ = $ftp->toebcdic($_) }
+  }
+
+ wantarray ? @{$list}
+           : $list;
+}
+
+sub _data_cmd
+{
+ my $ftp = shift;
+ my $cmd = uc shift;
+ my $ok = 1;
+ my $where = delete ${*$ftp}{'net_ftp_rest'} || 0;
+ my $arg;
+
+ for $arg (@_) {
+   croak("Bad argument '$arg'\n")
+	if $arg =~ /[\r\n]/s;
+ }
+
+ if(${*$ftp}{'net_ftp_passive'} &&
+     !defined ${*$ftp}{'net_ftp_pasv'} &&
+     !defined ${*$ftp}{'net_ftp_port'})
+  {
+   my $data = undef;
+
+   $ok = defined $ftp->pasv;
+   $ok = $ftp->_REST($where)
+	if $ok && $where;
+
+   if($ok)
+    {
+     $ftp->command($cmd,@_);
+     $data = $ftp->_dataconn();
+     $ok = CMD_INFO == $ftp->response();
+     if($ok) 
+      {
+       $data->reading
+         if $data && $cmd =~ /RETR|LIST|NLST/;
+       return $data
+      }
+     $data->_close
+	if $data;
+    }
+   return undef;
+  }
+
+ $ok = $ftp->port
+    unless (defined ${*$ftp}{'net_ftp_port'} ||
+            defined ${*$ftp}{'net_ftp_pasv'});
+
+ $ok = $ftp->_REST($where)
+    if $ok && $where;
+
+ return undef
+    unless $ok;
+
+ $ftp->command($cmd,@_);
+
+ return 1
+    if(defined ${*$ftp}{'net_ftp_pasv'});
+
+ $ok = CMD_INFO == $ftp->response();
+
+ return $ok 
+    unless exists ${*$ftp}{'net_ftp_intern_port'};
+
+ if($ok) {
+   my $data = $ftp->_dataconn();
+
+   $data->reading
+         if $data && $cmd =~ /RETR|LIST|NLST/;
+
+   return $data;
+ }
+
+
+ close(delete ${*$ftp}{'net_ftp_listen'});
+
+ return undef;
+}
+
+##
+## Over-ride methods (Net::Cmd)
+##
+
+sub debug_text { $_[2] =~ /^(pass|resp|acct)/i ? "$1 ....\n" : $_[2]; }
+
+sub command
+{
+ my $ftp = shift;
+
+ delete ${*$ftp}{'net_ftp_port'};
+ $ftp->SUPER::command(@_);
+}
+
+sub response
+{
+ my $ftp = shift;
+ my $code = $ftp->SUPER::response();
+
+ delete ${*$ftp}{'net_ftp_pasv'}
+    if ($code != CMD_MORE && $code != CMD_INFO);
+
+ $code;
+}
+
+sub parse_response
+{
+ return ($1, $2 eq "-")
+    if $_[1] =~ s/^(\d\d\d)(.?)//o;
+
+ my $ftp = shift;
+
+ return ()
+	unless ${*$ftp}{'net_cmd_code'} + 0;
+
+ (${*$ftp}{'net_cmd_code'},1);
+}
+
+##
+## Allow 2 servers to talk directly
+##
+
+sub pasv_xfer {
+    my($sftp,$sfile,$dftp,$dfile,$unique) = @_;
+
+    ($dfile = $sfile) =~ s#.*/##
+	unless(defined $dfile);
+
+    my $port = $sftp->pasv or
+	return undef;
+
+    $dftp->port($port) or
+	return undef;
+
+    return undef
+	unless($unique ? $dftp->stou($dfile) : $dftp->stor($dfile));
+
+    unless($sftp->retr($sfile) && $sftp->response == CMD_INFO) {
+	$sftp->retr($sfile);
+	$dftp->abort;
+	$dftp->response();
+	return undef;
+    }
+
+    $dftp->pasv_wait($sftp);
+}
+
+sub pasv_wait
+{
+ @_ == 2 or croak 'usage: $ftp->pasv_wait(NON_PASV_FTP)';
+
+ my($ftp, $non_pasv) = @_;
+ my($file,$rin,$rout);
+
+ vec($rin='',fileno($ftp),1) = 1;
+ select($rout=$rin, undef, undef, undef);
+
+ $ftp->response();
+ $non_pasv->response();
+
+ return undef
+	unless $ftp->ok() && $non_pasv->ok();
+
+ return $1
+	if $ftp->message =~ /unique file name:\s*(\S*)\s*\)/;
+
+ return $1
+	if $non_pasv->message =~ /unique file name:\s*(\S*)\s*\)/;
+
+ return 1;
+}
+
+sub cmd { shift->command(@_)->response() }
+
+########################################
+#
+# RFC959 commands
+#
+
+sub _ABOR { shift->command("ABOR")->response()	 == CMD_OK }
+sub _ALLO { shift->command("ALLO",@_)->response() == CMD_OK}
+sub _CDUP { shift->command("CDUP")->response()	 == CMD_OK }
+sub _NOOP { shift->command("NOOP")->response()	 == CMD_OK }
+sub _PASV { shift->command("PASV")->response()	 == CMD_OK }
+sub _QUIT { shift->command("QUIT")->response()	 == CMD_OK }
+sub _DELE { shift->command("DELE",@_)->response() == CMD_OK }
+sub _CWD  { shift->command("CWD", @_)->response() == CMD_OK }
+sub _PORT { shift->command("PORT",@_)->response() == CMD_OK }
+sub _RMD  { shift->command("RMD", @_)->response() == CMD_OK }
+sub _MKD  { shift->command("MKD", @_)->response() == CMD_OK }
+sub _PWD  { shift->command("PWD", @_)->response() == CMD_OK }
+sub _TYPE { shift->command("TYPE",@_)->response() == CMD_OK }
+sub _RNTO { shift->command("RNTO",@_)->response() == CMD_OK }
+sub _RESP { shift->command("RESP",@_)->response() == CMD_OK }
+sub _MDTM { shift->command("MDTM",@_)->response() == CMD_OK }
+sub _SIZE { shift->command("SIZE",@_)->response() == CMD_OK }
+sub _HELP { shift->command("HELP",@_)->response() == CMD_OK }
+sub _STAT { shift->command("STAT",@_)->response() == CMD_OK }
+sub _APPE { shift->command("APPE",@_)->response() == CMD_INFO }
+sub _LIST { shift->command("LIST",@_)->response() == CMD_INFO }
+sub _NLST { shift->command("NLST",@_)->response() == CMD_INFO }
+sub _RETR { shift->command("RETR",@_)->response() == CMD_INFO }
+sub _STOR { shift->command("STOR",@_)->response() == CMD_INFO }
+sub _STOU { shift->command("STOU",@_)->response() == CMD_INFO }
+sub _RNFR { shift->command("RNFR",@_)->response() == CMD_MORE }
+sub _REST { shift->command("REST",@_)->response() == CMD_MORE }
+sub _USER { shift->command("user",@_)->response() } # A certain brain dead firewall :-)
+sub _PASS { shift->command("PASS",@_)->response() }
+sub _ACCT { shift->command("ACCT",@_)->response() }
+sub _AUTH { shift->command("AUTH",@_)->response() }
+
+sub _SMNT { shift->unsupported(@_) }
+sub _MODE { shift->unsupported(@_) }
+sub _SYST { shift->unsupported(@_) }
+sub _STRU { shift->unsupported(@_) }
+sub _REIN { shift->unsupported(@_) }
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::FTP - FTP Client class
+
+=head1 SYNOPSIS
+
+    use Net::FTP;
+
+    $ftp = Net::FTP->new("some.host.name", Debug => 0)
+      or die "Cannot connect to some.host.name: $@";
+
+    $ftp->login("anonymous",'-anonymous@')
+      or die "Cannot login ", $ftp->message;
+
+    $ftp->cwd("/pub")
+      or die "Cannot change working directory ", $ftp->message;
+
+    $ftp->get("that.file")
+      or die "get failed ", $ftp->message;
+
+    $ftp->quit;
+
+=head1 DESCRIPTION
+
+C<Net::FTP> is a class implementing a simple FTP client in Perl as
+described in RFC959.  It provides wrappers for a subset of the RFC959
+commands.
+
+=head1 OVERVIEW
+
+FTP stands for File Transfer Protocol.  It is a way of transferring
+files between networked machines.  The protocol defines a client
+(whose commands are provided by this module) and a server (not
+implemented in this module).  Communication is always initiated by the
+client, and the server responds with a message and a status code (and
+sometimes with data).
+
+The FTP protocol allows files to be sent to or fetched from the
+server.  Each transfer involves a B<local file> (on the client) and a
+B<remote file> (on the server).  In this module, the same file name
+will be used for both local and remote if only one is specified.  This
+means that transferring remote file C</path/to/file> will try to put
+that file in C</path/to/file> locally, unless you specify a local file
+name.
+
+The protocol also defines several standard B<translations> which the
+file can undergo during transfer.  These are ASCII, EBCDIC, binary,
+and byte.  ASCII is the default type, and indicates that the sender of
+files will translate the ends of lines to a standard representation
+which the receiver will then translate back into their local
+representation.  EBCDIC indicates the file being transferred is in
+EBCDIC format.  Binary (also known as image) format sends the data as
+a contiguous bit stream.  Byte format transfers the data as bytes, the
+values of which remain the same regardless of differences in byte size
+between the two machines (in theory - in practice you should only use
+this if you really know what you're doing).
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new (HOST [,OPTIONS])
+
+This is the constructor for a new Net::FTP object. C<HOST> is the
+name of the remote host to which an FTP connection is required.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Firewall> - The name of a machine which acts as an FTP firewall. This can be
+overridden by an environment variable C<FTP_FIREWALL>. If specified, and the
+given host cannot be directly connected to, then the
+connection is made to the firewall machine and the string C<@hostname> is
+appended to the login identifier. This kind of setup is also refered to
+as an ftp proxy.
+
+B<FirewallType> - The type of firewall running on the machine indicated by
+B<Firewall>. This can be overridden by an environment variable
+C<FTP_FIREWALL_TYPE>. For a list of permissible types, see the description of
+ftp_firewall_type in L<Net::Config>.
+
+B<BlockSize> - This is the block size that Net::FTP will use when doing
+transfers. (defaults to 10240)
+
+B<Port> - The port number to connect to on the remote machine for the
+FTP connection
+
+B<Timeout> - Set a timeout value (defaults to 120)
+
+B<Debug> - debug level (see the debug method in L<Net::Cmd>)
+
+B<Passive> - If set to a non-zero value then all data transfers will be done
+using passive mode. This is not usually required except for some I<dumb>
+servers, and some firewall configurations. This can also be set by the
+environment variable C<FTP_PASSIVE>.
+
+B<Hash> - If given a reference to a file handle (e.g., C<\*STDERR>),
+print hash marks (#) on that filehandle every 1024 bytes.  This
+simply invokes the C<hash()> method for you, so that hash marks
+are displayed for all transfers.  You can, of course, call C<hash()>
+explicitly whenever you'd like.
+
+B<LocalAddr> - Local address to use for all socket connections, this
+argument will be passed to L<IO::Socket::INET>
+
+If the constructor fails undef will be returned and an error message will
+be in $@
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item login ([LOGIN [,PASSWORD [, ACCOUNT] ] ])
+
+Log into the remote FTP server with the given login information. If
+no arguments are given then the C<Net::FTP> uses the C<Net::Netrc>
+package to lookup the login information for the connected host.
+If no information is found then a login of I<anonymous> is used.
+If no password is given and the login is I<anonymous> then I<anonymous@>
+will be used for password.
+
+If the connection is via a firewall then the C<authorize> method will
+be called with no arguments.
+
+=item authorize ( [AUTH [, RESP]])
+
+This is a protocol used by some firewall ftp proxies. It is used
+to authorise the user to send data out.  If both arguments are not specified
+then C<authorize> uses C<Net::Netrc> to do a lookup.
+
+=item site (ARGS)
+
+Send a SITE command to the remote server and wait for a response.
+
+Returns most significant digit of the response code.
+
+=item ascii
+
+Transfer file in ASCII. CRLF translation will be done if required
+
+=item binary
+
+Transfer file in binary mode. No transformation will be done.
+
+B<Hint>: If both server and client machines use the same line ending for
+text files, then it will be faster to transfer all files in binary mode.
+
+=item rename ( OLDNAME, NEWNAME )
+
+Rename a file on the remote FTP server from C<OLDNAME> to C<NEWNAME>. This
+is done by sending the RNFR and RNTO commands.
+
+=item delete ( FILENAME )
+
+Send a request to the server to delete C<FILENAME>.
+
+=item cwd ( [ DIR ] )
+
+Attempt to change directory to the directory given in C<$dir>.  If
+C<$dir> is C<"..">, the FTP C<CDUP> command is used to attempt to
+move up one directory. If no directory is given then an attempt is made
+to change the directory to the root directory.
+
+=item cdup ()
+
+Change directory to the parent of the current directory.
+
+=item pwd ()
+
+Returns the full pathname of the current directory.
+
+=item restart ( WHERE )
+
+Set the byte offset at which to begin the next data transfer. Net::FTP simply
+records this value and uses it when during the next data transfer. For this
+reason this method will not return an error, but setting it may cause
+a subsequent data transfer to fail.
+
+=item rmdir ( DIR [, RECURSE ])
+
+Remove the directory with the name C<DIR>. If C<RECURSE> is I<true> then
+C<rmdir> will attempt to delete everything inside the directory.
+
+=item mkdir ( DIR [, RECURSE ])
+
+Create a new directory with the name C<DIR>. If C<RECURSE> is I<true> then
+C<mkdir> will attempt to create all the directories in the given path.
+
+Returns the full pathname to the new directory.
+
+=item ls ( [ DIR ] )
+
+=item alloc ( SIZE [, RECORD_SIZE] )
+
+The alloc command allows you to give the ftp server a hint about the size
+of the file about to be transfered using the ALLO ftp command. Some storage
+systems use this to make intelligent decisions about how to store the file.
+The C<SIZE> argument represents the size of the file in bytes. The
+C<RECORD_SIZE> argument indicates a mazimum record or page size for files
+sent with a record or page structure.
+
+The size of the file will be determined, and sent to the server
+automatically for normal files so that this method need only be called if
+you are transfering data from a socket, named pipe, or other stream not
+associated with a normal file.
+
+Get a directory listing of C<DIR>, or the current directory.
+
+In an array context, returns a list of lines returned from the server. In
+a scalar context, returns a reference to a list.
+
+=item dir ( [ DIR ] )
+
+Get a directory listing of C<DIR>, or the current directory in long format.
+
+In an array context, returns a list of lines returned from the server. In
+a scalar context, returns a reference to a list.
+
+=item get ( REMOTE_FILE [, LOCAL_FILE [, WHERE]] )
+
+Get C<REMOTE_FILE> from the server and store locally. C<LOCAL_FILE> may be
+a filename or a filehandle. If not specified, the file will be stored in
+the current directory with the same leafname as the remote file.
+
+If C<WHERE> is given then the first C<WHERE> bytes of the file will
+not be transfered, and the remaining bytes will be appended to
+the local file if it already exists.
+
+Returns C<LOCAL_FILE>, or the generated local file name if C<LOCAL_FILE>
+is not given. If an error was encountered undef is returned.
+
+=item put ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Put a file on the remote server. C<LOCAL_FILE> may be a name or a filehandle.
+If C<LOCAL_FILE> is a filehandle then C<REMOTE_FILE> must be specified. If
+C<REMOTE_FILE> is not specified then the file will be stored in the current
+directory with the same leafname as C<LOCAL_FILE>.
+
+Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
+is not given.
+
+B<NOTE>: If for some reason the transfer does not complete and an error is
+returned then the contents that had been transfered will not be remove
+automatically.
+
+=item put_unique ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Same as put but uses the C<STOU> command.
+
+Returns the name of the file on the server.
+
+=item append ( LOCAL_FILE [, REMOTE_FILE ] )
+
+Same as put but appends to the file on the remote server.
+
+Returns C<REMOTE_FILE>, or the generated remote filename if C<REMOTE_FILE>
+is not given.
+
+=item unique_name ()
+
+Returns the name of the last file stored on the server using the
+C<STOU> command.
+
+=item mdtm ( FILE )
+
+Returns the I<modification time> of the given file
+
+=item size ( FILE )
+
+Returns the size in bytes for the given file as stored on the remote server.
+
+B<NOTE>: The size reported is the size of the stored file on the remote server.
+If the file is subsequently transfered from the server in ASCII mode
+and the remote server and local machine have different ideas about
+"End Of Line" then the size of file on the local machine after transfer
+may be different.
+
+=item supported ( CMD )
+
+Returns TRUE if the remote server supports the given command.
+
+=item hash ( [FILEHANDLE_GLOB_REF],[ BYTES_PER_HASH_MARK] )
+
+Called without parameters, or with the first argument false, hash marks
+are suppressed.  If the first argument is true but not a reference to a 
+file handle glob, then \*STDERR is used.  The second argument is the number
+of bytes per hash mark printed, and defaults to 1024.  In all cases the
+return value is a reference to an array of two:  the filehandle glob reference
+and the bytes per hash mark.
+
+=back
+
+The following methods can return different results depending on
+how they are called. If the user explicitly calls either
+of the C<pasv> or C<port> methods then these methods will
+return a I<true> or I<false> value. If the user does not
+call either of these methods then the result will be a
+reference to a C<Net::FTP::dataconn> based object.
+
+=over 4
+
+=item nlst ( [ DIR ] )
+
+Send an C<NLST> command to the server, with an optional parameter.
+
+=item list ( [ DIR ] )
+
+Same as C<nlst> but using the C<LIST> command
+
+=item retr ( FILE )
+
+Begin the retrieval of a file called C<FILE> from the remote server.
+
+=item stor ( FILE )
+
+Tell the server that you wish to store a file. C<FILE> is the
+name of the new file that should be created.
+
+=item stou ( FILE )
+
+Same as C<stor> but using the C<STOU> command. The name of the unique
+file which was created on the server will be available via the C<unique_name>
+method after the data connection has been closed.
+
+=item appe ( FILE )
+
+Tell the server that we want to append some data to the end of a file
+called C<FILE>. If this file does not exist then create it.
+
+=back
+
+If for some reason you want to have complete control over the data connection,
+this includes generating it and calling the C<response> method when required,
+then the user can use these methods to do so.
+
+However calling these methods only affects the use of the methods above that
+can return a data connection. They have no effect on methods C<get>, C<put>,
+C<put_unique> and those that do not require data connections.
+
+=over 4
+
+=item port ( [ PORT ] )
+
+Send a C<PORT> command to the server. If C<PORT> is specified then it is sent
+to the server. If not, then a listen socket is created and the correct information
+sent to the server.
+
+=item pasv ()
+
+Tell the server to go into passive mode. Returns the text that represents the
+port on which the server is listening, this text is in a suitable form to
+sent to another ftp server using the C<port> method.
+
+=back
+
+The following methods can be used to transfer files between two remote
+servers, providing that these two servers can connect directly to each other.
+
+=over 4
+
+=item pasv_xfer ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
+
+This method will do a file transfer between two remote ftp servers. If
+C<DEST_FILE> is omitted then the leaf name of C<SRC_FILE> will be used.
+
+=item pasv_xfer_unique ( SRC_FILE, DEST_SERVER [, DEST_FILE ] )
+
+Like C<pasv_xfer> but the file is stored on the remote server using
+the STOU command.
+
+=item pasv_wait ( NON_PASV_SERVER )
+
+This method can be used to wait for a transfer to complete between a passive
+server and a non-passive server. The method should be called on the passive
+server with the C<Net::FTP> object for the non-passive server passed as an
+argument.
+
+=item abort ()
+
+Abort the current data transfer.
+
+=item quit ()
+
+Send the QUIT command to the remote FTP server and close the socket connection.
+
+=back
+
+=head2 Methods for the adventurous
+
+C<Net::FTP> inherits from C<Net::Cmd> so methods defined in C<Net::Cmd> may
+be used to send commands to the remote FTP server.
+
+=over 4
+
+=item quot (CMD [,ARGS])
+
+Send a command, that Net::FTP does not directly support, to the remote
+server and wait for a response.
+
+Returns most significant digit of the response code.
+
+B<WARNING> This call should only be used on commands that do not require
+data connections. Misuse of this method can hang the connection.
+
+=back
+
+=head1 THE dataconn CLASS
+
+Some of the methods defined in C<Net::FTP> return an object which will
+be derived from this class.The dataconn class itself is derived from
+the C<IO::Socket::INET> class, so any normal IO operations can be performed.
+However the following methods are defined in the dataconn class and IO should
+be performed using these.
+
+=over 4
+
+=item read ( BUFFER, SIZE [, TIMEOUT ] )
+
+Read C<SIZE> bytes of data from the server and place it into C<BUFFER>, also
+performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
+given, the timeout value from the command connection will be used.
+
+Returns the number of bytes read before any <CRLF> translation.
+
+=item write ( BUFFER, SIZE [, TIMEOUT ] )
+
+Write C<SIZE> bytes of data from C<BUFFER> to the server, also
+performing any <CRLF> translation necessary. C<TIMEOUT> is optional, if not
+given, the timeout value from the command connection will be used.
+
+Returns the number of bytes written before any <CRLF> translation.
+
+=item bytes_read ()
+
+Returns the number of bytes read so far.
+
+=item abort ()
+
+Abort the current data transfer.
+
+=item close ()
+
+Close the data connection and get a response from the FTP server. Returns
+I<true> if the connection was closed successfully and the first digit of
+the response from the server was a '2'.
+
+=back
+
+=head1 UNIMPLEMENTED
+
+The following RFC959 commands have not been implemented:
+
+=over 4
+
+=item B<SMNT>
+
+Mount a different file system structure without changing login or
+accounting information.
+
+=item B<HELP>
+
+Ask the server for "helpful information" (that's what the RFC says) on
+the commands it accepts.
+
+=item B<MODE>
+
+Specifies transfer mode (stream, block or compressed) for file to be
+transferred.
+
+=item B<SYST>
+
+Request remote server system identification.
+
+=item B<STAT>
+
+Request remote server status.
+
+=item B<STRU>
+
+Specifies file structure for file to be transferred.
+
+=item B<REIN>
+
+Reinitialize the connection, flushing all I/O and account information.
+
+=back
+
+=head1 REPORTING BUGS
+
+When reporting bugs/problems please include as much information as possible.
+It may be difficult for me to reproduce the problem as almost every setup
+is different.
+
+A small script which yields the problem will probably be of help. It would
+also be useful if this script was run with the extra options C<Debug => 1>
+passed to the constructor, and the output sent with the defect report. If you
+cannot include a small script then please include a Debug trace from a
+run of your program which does yield the problem.
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 SEE ALSO
+
+L<Net::Netrc>
+L<Net::Cmd>
+
+ftp(1), ftpd(8), RFC 959
+http://www.cis.ohio-state.edu/htbin/rfc/rfc959.html
+
+=head1 USE EXAMPLES
+
+For an example of the use of Net::FTP see
+
+=over 4
+
+=item http://www.csh.rit.edu/~adam/Progs/
+
+C<autoftp> is a program that can retrieve, send, or list files via
+the FTP protocol in a non-interactive manner.
+
+=back
+
+=head1 CREDITS
+
+Henry Gabryjelski <henryg@WPI.EDU> - for the suggestion of creating directories
+recursively.
+
+Nathan Torkington <gnat@frii.com> - for some input on the documentation.
+
+Roderick Schertler <roderick@gate.net> - for various inputs
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/FTP.pm#80 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP/A.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,118 @@
+# COPYRIGHT 1996-2000 Graham Barr. All rights reserved.
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+## $Id: //depot/libnet/Net/FTP/A.pm#17 $
+## Package to read/write on ASCII data connections
+##
+
+package Net::FTP::A;
+use strict;
+use vars qw(@ISA $buf $VERSION);
+use Carp;
+
+require Net::FTP::dataconn;
+
+@ISA = qw(Net::FTP::dataconn);
+$VERSION = "1.16";
+
+sub read {
+  my    $data 	 = shift;
+  local *buf 	 = \$_[0]; shift;
+  my    $size 	 = shift || croak 'read($buf,$size,[$offset])';
+  my    $timeout = @_ ? shift : $data->timeout;
+
+  if (length(${*$data}) < $size && !${*$data}{'net_ftp_eof'}) {
+    my $blksize = ${*$data}{'net_ftp_blksize'};
+    $blksize = $size if $size > $blksize;
+
+    my $l = 0;
+    my $n;
+
+    READ:
+    {
+      my $readbuf = defined(${*$data}{'net_ftp_cr'}) ? "\015" : '';
+
+      $data->can_read($timeout) or
+	   croak "Timeout";
+
+      if ($n = sysread($data, $readbuf, $blksize, length $readbuf)) {
+        ${*$data}{'net_ftp_bytesread'} += $n;
+	${*$data}{'net_ftp_cr'} = substr($readbuf,-1) eq "\015"
+					? chop($readbuf)
+					: undef;
+      }
+      else {
+        return undef
+	  unless defined $n;
+
+        ${*$data}{'net_ftp_eof'} = 1;
+      }
+
+      $readbuf =~ s/\015\012/\n/sgo;
+      ${*$data} .= $readbuf;
+
+      unless (length(${*$data})) {
+
+        redo READ
+	  if($n > 0);
+
+        $size = length(${*$data})
+          if($n == 0);
+      }
+    }
+  }
+
+  $buf = substr(${*$data},0,$size);
+  substr(${*$data},0,$size) = '';
+
+  length $buf;
+}
+
+sub write {
+  my    $data 	= shift;
+  local *buf 	= \$_[0]; shift;
+  my    $size 	= shift || croak 'write($buf,$size,[$timeout])';
+  my    $timeout = @_ ? shift : $data->timeout;
+
+  (my $tmp = substr($buf,0,$size)) =~ s/\r?\n/\015\012/sg;
+
+  # If the remote server has closed the connection we will be signal'd
+  # when we write. This can happen if the disk on the remote server fills up
+
+  local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+
+  my $len = length($tmp);
+  my $off = 0;
+  my $wrote = 0;
+
+  my $blksize = ${*$data}{'net_ftp_blksize'};
+
+  while($len) {
+    $data->can_write($timeout) or
+	 croak "Timeout";
+
+    $off += $wrote;
+    $wrote = syswrite($data, substr($tmp,$off), $len > $blksize ? $blksize : $len);
+    return undef
+      unless defined($wrote);
+    $len -= $wrote;
+  }
+
+  $size;
+}
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+COPYRIGHT
+
+  © 1996-2000 Graham Barr. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP/E.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+# COPYRIGHT 1996-2000 Graham Barr. All rights reserved.
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+package Net::FTP::E;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+COPYRIGHT
+
+  © 1996-2000 Graham Barr. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP/I.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,91 @@
+# COPYRIGHT 1996-2000 Graham Barr. All rights reserved.
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+## $Id: //depot/libnet/Net/FTP/I.pm#13 $
+## Package to read/write on BINARY data connections
+##
+
+package Net::FTP::I;
+
+use vars qw(@ISA $buf $VERSION);
+use Carp;
+
+require Net::FTP::dataconn;
+
+@ISA = qw(Net::FTP::dataconn);
+$VERSION = "1.12"; 
+
+sub read {
+  my    $data 	 = shift;
+  local *buf 	 = \$_[0]; shift;
+  my    $size    = shift || croak 'read($buf,$size,[$timeout])';
+  my    $timeout = @_ ? shift : $data->timeout;
+
+  my $n;
+
+  if ($size > length ${*$data} and !${*$data}{'net_ftp_eof'}) {
+    $data->can_read($timeout) or
+	   croak "Timeout";
+
+    my $blksize = ${*$data}{'net_ftp_blksize'};
+    $blksize = $size if $size > $blksize;
+
+    unless ($n = sysread($data, ${*$data}, $blksize, length ${*$data})) {
+      return undef unless defined $n;
+      ${*$data}{'net_ftp_eof'} = 1;
+    }
+  }
+
+  $buf = substr(${*$data},0,$size);
+
+  $n = length($buf);
+
+  substr(${*$data},0,$n) = '';
+
+  ${*$data}{'net_ftp_bytesread'} += $n;
+
+  $n;
+}
+
+sub write {
+  my    $data    = shift;
+  local *buf     = \$_[0]; shift;
+  my    $size    = shift || croak 'write($buf,$size,[$timeout])';
+  my    $timeout = @_ ? shift : $data->timeout;
+
+  # If the remote server has closed the connection we will be signal'd
+  # when we write. This can happen if the disk on the remote server fills up
+
+  local $SIG{PIPE} = 'IGNORE' unless $^O eq 'MacOS';
+  my $sent = $size;
+  my $off = 0;
+
+  my $blksize = ${*$data}{'net_ftp_blksize'};
+  while($sent > 0) {
+    $data->can_write($timeout) or
+	 croak "Timeout";
+
+    my $n = syswrite($data, $buf, $sent > $blksize ? $blksize : $sent ,$off);
+    return undef unless defined($n);
+    $sent -= $n;
+    $off += $n;
+  }
+
+  $size;
+}
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+COPYRIGHT
+
+  © 1996-2000 Graham Barr. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP/L.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+# COPYRIGHT 1996-2000 Graham Barr. All rights reserved.
+#
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+package Net::FTP::L;
+
+require Net::FTP::I;
+
+@ISA = qw(Net::FTP::I);
+$VERSION = "0.01";
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+COPYRIGHT
+
+  © 1996-2000 Graham Barr. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/FTP/dataconn.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,140 @@
+# COPYRIGHT 1996-2000 Graham Barr. All rights reserved.
+# 
+# This library is free software; you can redistribute it and/or modify
+# it under the same terms as Perl itself.
+
+
+
+##
+## Generic data connection package
+##
+
+package Net::FTP::dataconn;
+
+use Carp;
+use vars qw(@ISA $timeout $VERSION);
+use Net::Cmd;
+use Errno;
+
+$VERSION = '0.11';
+@ISA = qw(IO::Socket::INET);
+
+sub reading
+{
+ my $data = shift;
+ ${*$data}{'net_ftp_bytesread'} = 0;
+}
+
+sub abort
+{
+ my $data = shift;
+ my $ftp  = ${*$data}{'net_ftp_cmd'};
+
+ # no need to abort if we have finished the xfer
+ return $data->close
+    if ${*$data}{'net_ftp_eof'};
+
+ # for some reason if we continously open RETR connections and not
+ # read a single byte, then abort them after a while the server will
+ # close our connection, this prevents the unexpected EOF on the
+ # command channel -- GMB
+ if(exists ${*$data}{'net_ftp_bytesread'}
+	&& (${*$data}{'net_ftp_bytesread'} == 0)) {
+   my $buf="";
+   my $timeout = $data->timeout;
+   $data->can_read($timeout) && sysread($data,$buf,1);
+ }
+
+ ${*$data}{'net_ftp_eof'} = 1; # fake
+
+ $ftp->abort; # this will close me
+}
+
+sub _close
+{
+ my $data = shift;
+ my $ftp  = ${*$data}{'net_ftp_cmd'};
+
+ $data->SUPER::close();
+
+ delete ${*$ftp}{'net_ftp_dataconn'}
+    if exists ${*$ftp}{'net_ftp_dataconn'} &&
+        $data == ${*$ftp}{'net_ftp_dataconn'};
+}
+
+sub close
+{
+ my $data = shift;
+ my $ftp  = ${*$data}{'net_ftp_cmd'};
+
+ if(exists ${*$data}{'net_ftp_bytesread'} && !${*$data}{'net_ftp_eof'}) {
+   my $junk;
+   $data->read($junk,1,0);
+   return $data->abort unless ${*$data}{'net_ftp_eof'};
+ }
+
+ $data->_close;
+
+ $ftp->response() == CMD_OK &&
+    $ftp->message =~ /unique file name:\s*(\S*)\s*\)/ &&
+    (${*$ftp}{'net_ftp_unique'} = $1);
+
+ $ftp->status == CMD_OK;
+}
+
+sub _select {
+ my ($data, $timeout, $do_read) = @_;
+ my ($rin,$rout,$win,$wout,$tout,$nfound);
+
+ vec($rin='',fileno($data),1) = 1;
+
+ ($win, $rin) = ($rin, $win) unless $do_read;
+
+ while (1) {
+   $nfound = select($rout=$rin, $wout=$win, undef, $tout=$timeout);
+
+   last if $nfound >= 0;
+   
+   croak "select: $!"
+     unless $!{EINTR};
+ }
+
+ $nfound;
+}
+
+sub can_read
+{
+ _select(@_[0,1],1);
+}
+
+sub can_write
+{
+ _select(@_[0,1],0);
+}
+
+sub cmd
+{
+ my $ftp = shift;
+
+ ${*$ftp}{'net_ftp_cmd'};
+}
+
+sub bytes_read {
+ my $ftp = shift;
+
+ ${*$ftp}{'net_ftp_bytesread'} || 0;
+}
+
+1;
+__END__
+
+=head1 COPYRIGHT
+
+COPYRIGHT
+
+  © 1996-2000 Graham Barr. All rights reserved.
+
+This library is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/NNTP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1122 @@
+# Net::NNTP.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::NNTP;
+
+use strict;
+use vars qw(@ISA $VERSION $debug);
+use IO::Socket;
+use Net::Cmd;
+use Carp;
+use Time::Local;
+use Net::Config;
+
+$VERSION = "2.22"; # $Id: //depot/libnet/Net/NNTP.pm#18 $
+@ISA     = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my $host = shift if @_ % 2;
+ my %arg  = @_;
+ my $obj;
+
+ $host ||= $ENV{NNTPSERVER} || $ENV{NEWSHOST};
+
+ my $hosts = defined $host ? [ $host ] : $NetConfig{nntp_hosts};
+
+ @{$hosts} = qw(news)
+	unless @{$hosts};
+
+ my $h;
+ foreach $h (@{$hosts})
+  {
+   $obj = $type->SUPER::new(PeerAddr => ($host = $h), 
+			    PeerPort => $arg{Port} || 'nntp(119)',
+			    Proto    => 'tcp',
+			    Timeout  => defined $arg{Timeout}
+						? $arg{Timeout}
+						: 120
+			   ) and last;
+  }
+
+ return undef
+	unless defined $obj;
+
+ ${*$obj}{'net_nntp_host'} = $host;
+
+ $obj->autoflush(1);
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK)
+  {
+   $obj->close;
+   return undef;
+  }
+
+ my $c = $obj->code;
+ my @m = $obj->message;
+
+ unless(exists $arg{Reader} && $arg{Reader} == 0) {
+   # if server is INN and we have transfer rights the we are currently
+   # talking to innd not nnrpd
+   if($obj->reader)
+    {
+     # If reader suceeds the we need to consider this code to determine postok
+     $c = $obj->code;
+    }
+   else
+    {
+     # I want to ignore this failure, so restore the previous status.
+     $obj->set_status($c,\@m);
+    }
+ }
+
+ ${*$obj}{'net_nntp_post'} = $c == 200 ? 1 : 0;
+
+ $obj;
+}
+
+sub debug_text
+{
+ my $nntp = shift;
+ my $inout = shift;
+ my $text = shift;
+
+ if((ref($nntp) and $nntp->code == 350 and $text =~ /^(\S+)/)
+    || ($text =~ /^(authinfo\s+pass)/io)) 
+  {
+   $text = "$1 ....\n"
+  }
+
+ $text;
+}
+
+sub postok
+{
+ @_ == 1 or croak 'usage: $nntp->postok()';
+ my $nntp = shift;
+ ${*$nntp}{'net_nntp_post'} || 0;
+}
+
+sub article
+{
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->article( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB');
+
+ $nntp->_ARTICLE(@_)
+    ? $nntp->read_until_dot(@fh)
+    : undef;
+}
+
+sub articlefh {
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->articlefh( [ MSGID ] )';
+ my $nntp = shift;
+
+ return unless $nntp->_ARTICLE(@_);
+ return $nntp->tied_fh;
+}
+
+sub authinfo
+{
+ @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )';
+ my($nntp,$user,$pass) = @_;
+
+ $nntp->_AUTHINFO("USER",$user) == CMD_MORE 
+    && $nntp->_AUTHINFO("PASS",$pass) == CMD_OK;
+}
+
+sub authinfo_simple
+{
+ @_ == 3 or croak 'usage: $nntp->authinfo( USER, PASS )';
+ my($nntp,$user,$pass) = @_;
+
+ $nntp->_AUTHINFO('SIMPLE') == CMD_MORE 
+    && $nntp->command($user,$pass)->response == CMD_OK;
+}
+
+sub body
+{
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->body( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB');
+
+ $nntp->_BODY(@_)
+    ? $nntp->read_until_dot(@fh)
+    : undef;
+}
+
+sub bodyfh
+{
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->bodyfh( [ MSGID ] )';
+ my $nntp = shift;
+ return unless $nntp->_BODY(@_);
+ return $nntp->tied_fh;
+}
+
+sub head
+{
+ @_ >= 1 && @_ <= 3 or croak 'usage: $nntp->head( [ MSGID ], [ FH ] )';
+ my $nntp = shift;
+ my @fh;
+
+ @fh = (pop) if @_ == 2 || (@_ && ref($_[0]) || ref(\$_[0]) eq 'GLOB');
+
+ $nntp->_HEAD(@_)
+    ? $nntp->read_until_dot(@fh)
+    : undef;
+}
+
+sub headfh
+{
+ @_ >= 1 && @_ <= 2 or croak 'usage: $nntp->headfh( [ MSGID ] )';
+ my $nntp = shift;
+ return unless $nntp->_HEAD(@_);
+ return $nntp->tied_fh;
+}
+
+sub nntpstat
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->nntpstat( [ MSGID ] )';
+ my $nntp = shift;
+
+ $nntp->_STAT(@_) && $nntp->message =~ /(<[^>]+>)/o
+    ? $1
+    : undef;
+}
+
+
+sub group
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->group( [ GROUP ] )';
+ my $nntp = shift;
+ my $grp = ${*$nntp}{'net_nntp_group'} || undef;
+
+ return $grp
+    unless(@_ || wantarray);
+
+ my $newgrp = shift;
+
+ return wantarray ? () : undef
+	unless $nntp->_GROUP($newgrp || $grp || "")
+		&& $nntp->message =~ /(\d+)\s+(\d+)\s+(\d+)\s+(\S+)/;
+
+ my($count,$first,$last,$group) = ($1,$2,$3,$4);
+
+ # group may be replied as '(current group)'
+ $group = ${*$nntp}{'net_nntp_group'}
+    if $group =~ /\(/;
+
+ ${*$nntp}{'net_nntp_group'} = $group;
+
+ wantarray
+    ? ($count,$first,$last,$group)
+    : $group;
+}
+
+sub help
+{
+ @_ == 1 or croak 'usage: $nntp->help()';
+ my $nntp = shift;
+
+ $nntp->_HELP
+    ? $nntp->read_until_dot
+    : undef;
+}
+
+sub ihave
+{
+ @_ >= 2 or croak 'usage: $nntp->ihave( MESSAGE-ID [, MESSAGE ])';
+ my $nntp = shift;
+ my $mid = shift;
+
+ $nntp->_IHAVE($mid) && $nntp->datasend(@_)
+    ? @_ == 0 || $nntp->dataend
+    : undef;
+}
+
+sub last
+{
+ @_ == 1 or croak 'usage: $nntp->last()';
+ my $nntp = shift;
+
+ $nntp->_LAST && $nntp->message =~ /(<[^>]+>)/o
+    ? $1
+    : undef;
+}
+
+sub list
+{
+ @_ == 1 or croak 'usage: $nntp->list()';
+ my $nntp = shift;
+
+ $nntp->_LIST
+    ? $nntp->_grouplist
+    : undef;
+}
+
+sub newgroups
+{
+ @_ >= 2 or croak 'usage: $nntp->newgroups( SINCE [, DISTRIBUTIONS ])';
+ my $nntp = shift;
+ my $time = _timestr(shift);
+ my $dist = shift || "";
+
+ $dist = join(",", @{$dist})
+    if ref($dist);
+
+ $nntp->_NEWGROUPS($time,$dist)
+    ? $nntp->_grouplist
+    : undef;
+}
+
+sub newnews
+{
+ @_ >= 2 && @_ <= 4 or
+	croak 'usage: $nntp->newnews( SINCE [, GROUPS [, DISTRIBUTIONS ]])';
+ my $nntp = shift;
+ my $time = _timestr(shift);
+ my $grp  = @_ ? shift : $nntp->group;
+ my $dist = shift || "";
+
+ $grp ||= "*";
+ $grp = join(",", @{$grp})
+    if ref($grp);
+
+ $dist = join(",", @{$dist})
+    if ref($dist);
+
+ $nntp->_NEWNEWS($grp,$time,$dist)
+    ? $nntp->_articlelist
+    : undef;
+}
+
+sub next
+{
+ @_ == 1 or croak 'usage: $nntp->next()';
+ my $nntp = shift;
+
+ $nntp->_NEXT && $nntp->message =~ /(<[^>]+>)/o
+    ? $1
+    : undef;
+}
+
+sub post
+{
+ @_ >= 1 or croak 'usage: $nntp->post( [ MESSAGE ] )';
+ my $nntp = shift;
+
+ $nntp->_POST() && $nntp->datasend(@_)
+    ? @_ == 0 || $nntp->dataend
+    : undef;
+}
+
+sub postfh {
+  my $nntp = shift;
+  return unless $nntp->_POST();
+  return $nntp->tied_fh;
+}
+
+sub quit
+{
+ @_ == 1 or croak 'usage: $nntp->quit()';
+ my $nntp = shift;
+
+ $nntp->_QUIT;
+ $nntp->close;
+}
+
+sub slave
+{
+ @_ == 1 or croak 'usage: $nntp->slave()';
+ my $nntp = shift;
+
+ $nntp->_SLAVE;
+}
+
+##
+## The following methods are not implemented by all servers
+##
+
+sub active
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->active( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_LIST('ACTIVE',@_)
+    ? $nntp->_grouplist
+    : undef;
+}
+
+sub active_times
+{
+ @_ == 1 or croak 'usage: $nntp->active_times()';
+ my $nntp = shift;
+
+ $nntp->_LIST('ACTIVE.TIMES')
+    ? $nntp->_grouplist
+    : undef;
+}
+
+sub distributions
+{
+ @_ == 1 or croak 'usage: $nntp->distributions()';
+ my $nntp = shift;
+
+ $nntp->_LIST('DISTRIBUTIONS')
+    ? $nntp->_description
+    : undef;
+}
+
+sub distribution_patterns
+{
+ @_ == 1 or croak 'usage: $nntp->distributions()';
+ my $nntp = shift;
+
+ my $arr;
+ local $_;
+
+ $nntp->_LIST('DISTRIB.PATS') && ($arr = $nntp->read_until_dot)
+    ? [grep { /^\d/ && (chomp, $_ = [ split /:/ ]) } @$arr]
+    : undef;
+}
+
+sub newsgroups
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->newsgroups( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_LIST('NEWSGROUPS',@_)
+    ? $nntp->_description
+    : undef;
+}
+
+sub overview_fmt
+{
+ @_ == 1 or croak 'usage: $nntp->overview_fmt()';
+ my $nntp = shift;
+
+ $nntp->_LIST('OVERVIEW.FMT')
+     ? $nntp->_articlelist
+     : undef;
+}
+
+sub subscriptions
+{
+ @_ == 1 or croak 'usage: $nntp->subscriptions()';
+ my $nntp = shift;
+
+ $nntp->_LIST('SUBSCRIPTIONS')
+    ? $nntp->_articlelist
+    : undef;
+}
+
+sub listgroup
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->listgroup( [ GROUP ] )';
+ my $nntp = shift;
+
+ $nntp->_LISTGROUP(@_)
+    ? $nntp->_articlelist
+    : undef;
+}
+
+sub reader
+{
+ @_ == 1 or croak 'usage: $nntp->reader()';
+ my $nntp = shift;
+
+ $nntp->_MODE('READER');
+}
+
+sub xgtitle
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $nntp->xgtitle( [ PATTERN ] )';
+ my $nntp = shift;
+
+ $nntp->_XGTITLE(@_)
+    ? $nntp->_description
+    : undef;
+}
+
+sub xhdr
+{
+ @_ >= 2 && @_ <= 4 or croak 'usage: $nntp->xhdr( HEADER, [ MESSAGE-SPEC ] )';
+ my $nntp = shift;
+ my $hdr = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XHDR($hdr, $arg)
+	? $nntp->_description
+	: undef;
+}
+
+sub xover
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $nntp->xover( MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XOVER($arg)
+	? $nntp->_fieldlist
+	: undef;
+}
+
+sub xpat
+{
+ @_ == 4 || @_ == 5 or croak '$nntp->xpat( HEADER, PATTERN, MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $hdr = shift;
+ my $pat = shift;
+ my $arg = _msg_arg(@_);
+
+ $pat = join(" ", @$pat)
+    if ref($pat);
+
+ $nntp->_XPAT($hdr,$arg,$pat)
+	? $nntp->_description
+	: undef;
+}
+
+sub xpath
+{
+ @_ == 2 or croak 'usage: $nntp->xpath( MESSAGE-ID )';
+ my($nntp,$mid) = @_;
+
+ return undef
+	unless $nntp->_XPATH($mid);
+
+ my $m; ($m = $nntp->message) =~ s/^\d+\s+//o;
+ my @p = split /\s+/, $m;
+
+ wantarray ? @p : $p[0];
+}
+
+sub xrover
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $nntp->xrover( MESSAGE-SPEC )';
+ my $nntp = shift;
+ my $arg = _msg_arg(@_);
+
+ $nntp->_XROVER($arg)
+	? $nntp->_description
+	: undef;
+}
+
+sub date
+{
+ @_ == 1 or croak 'usage: $nntp->date()';
+ my $nntp = shift;
+
+ $nntp->_DATE && $nntp->message =~ /(\d{4})(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)/
+    ? timegm($6,$5,$4,$3,$2-1,$1 - 1900)
+    : undef;
+}
+
+
+##
+## Private subroutines
+##
+
+sub _msg_arg
+{
+ my $spec = shift;
+ my $arg = "";
+
+ if(@_)
+  {
+   carp "Depriciated passing of two message numbers, "
+      . "pass a reference"
+	if $^W;
+   $spec = [ $spec, $_[0] ];
+  }
+
+ if(defined $spec)
+  {
+   if(ref($spec))
+    {
+     $arg = $spec->[0];
+     if(defined $spec->[1])
+      {
+       $arg .= "-"
+	  if $spec->[1] != $spec->[0];
+       $arg .= $spec->[1]
+	  if $spec->[1] > $spec->[0];
+      }
+    }
+   else
+    {
+     $arg = $spec;
+    }
+  }
+
+ $arg;
+}
+
+sub _timestr
+{
+ my $time = shift;
+ my @g = reverse((gmtime($time))[0..5]);
+ $g[1] += 1;
+ $g[0] %= 100;
+ sprintf "%02d%02d%02d %02d%02d%02d GMT", @g;
+}
+
+sub _grouplist
+{
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot or
+    return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr)
+  {
+   my @a = split(/[\s\n]+/,$ln);
+   $hash->{$a[0]} = [ @a[1,2,3] ];
+  }
+
+ $hash;
+}
+
+sub _fieldlist
+{
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot or
+    return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr)
+  {
+   my @a = split(/[\t\n]/,$ln);
+   my $m = shift @a;
+   $hash->{$m} = [ @a ];
+  }
+
+ $hash;
+}
+
+sub _articlelist
+{
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot;
+
+ chomp(@$arr)
+    if $arr;
+
+ $arr;
+}
+
+sub _description
+{
+ my $nntp = shift;
+ my $arr = $nntp->read_until_dot or
+    return undef;
+
+ my $hash = {};
+ my $ln;
+
+ foreach $ln (@$arr)
+  {
+   chomp($ln);
+
+   $hash->{$1} = $ln
+    if $ln =~ s/^\s*(\S+)\s*//o;
+  }
+
+ $hash;
+
+}
+
+##
+## The commands
+##
+
+sub _ARTICLE   { shift->command('ARTICLE',@_)->response == CMD_OK }
+sub _AUTHINFO  { shift->command('AUTHINFO',@_)->response }
+sub _BODY      { shift->command('BODY',@_)->response == CMD_OK }
+sub _DATE      { shift->command('DATE')->response == CMD_INFO }
+sub _GROUP     { shift->command('GROUP',@_)->response == CMD_OK }
+sub _HEAD      { shift->command('HEAD',@_)->response == CMD_OK }
+sub _HELP      { shift->command('HELP',@_)->response == CMD_INFO }
+sub _IHAVE     { shift->command('IHAVE',@_)->response == CMD_MORE }
+sub _LAST      { shift->command('LAST')->response == CMD_OK }
+sub _LIST      { shift->command('LIST',@_)->response == CMD_OK }
+sub _LISTGROUP { shift->command('LISTGROUP',@_)->response == CMD_OK }
+sub _NEWGROUPS { shift->command('NEWGROUPS',@_)->response == CMD_OK }
+sub _NEWNEWS   { shift->command('NEWNEWS',@_)->response == CMD_OK }
+sub _NEXT      { shift->command('NEXT')->response == CMD_OK }
+sub _POST      { shift->command('POST',@_)->response == CMD_MORE }
+sub _QUIT      { shift->command('QUIT',@_)->response == CMD_OK }
+sub _SLAVE     { shift->command('SLAVE',@_)->response == CMD_OK }
+sub _STAT      { shift->command('STAT',@_)->response == CMD_OK }
+sub _MODE      { shift->command('MODE',@_)->response == CMD_OK }
+sub _XGTITLE   { shift->command('XGTITLE',@_)->response == CMD_OK }
+sub _XHDR      { shift->command('XHDR',@_)->response == CMD_OK }
+sub _XPAT      { shift->command('XPAT',@_)->response == CMD_OK }
+sub _XPATH     { shift->command('XPATH',@_)->response == CMD_OK }
+sub _XOVER     { shift->command('XOVER',@_)->response == CMD_OK }
+sub _XROVER    { shift->command('XROVER',@_)->response == CMD_OK }
+sub _XTHREAD   { shift->unsupported }
+sub _XSEARCH   { shift->unsupported }
+sub _XINDEX    { shift->unsupported }
+
+##
+## IO/perl methods
+##
+
+sub DESTROY
+{
+ my $nntp = shift;
+ defined(fileno($nntp)) && $nntp->quit
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::NNTP - NNTP Client class
+
+=head1 SYNOPSIS
+
+    use Net::NNTP;
+
+    $nntp = Net::NNTP->new("some.host.name");
+    $nntp->quit;
+
+=head1 DESCRIPTION
+
+C<Net::NNTP> is a class implementing a simple NNTP client in Perl as described
+in RFC977. C<Net::NNTP> inherits its communication methods from C<Net::Cmd>
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST ] [, OPTIONS ])
+
+This is the constructor for a new Net::NNTP object. C<HOST> is the
+name of the remote host to which a NNTP connection is required. If not
+given two environment variables are checked, first C<NNTPSERVER> then
+C<NEWSHOST>, then C<Net::Config> is checked, and if a host is not found
+then C<news> is used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+NNTP server, a value of zero will cause all IO operations to block.
+(default: 120)
+
+B<Debug> - Enable the printing of debugging information to STDERR
+
+B<Reader> - If the remote server is INN then initially the connection
+will be to nnrpd, by default C<Net::NNTP> will issue a C<MODE READER> command
+so that the remote server becomes innd. If the C<Reader> option is given
+with a value of zero, then this command will not be sent and the
+connection will be left talking to nnrpd.
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item article ( [ MSGID|MSGNUM ], [FH] )
+
+Retrieve the header, a blank line, then the body (text) of the
+specified article. 
+
+If C<FH> is specified then it is expected to be a valid filehandle
+and the result will be printed to it, on success a true value will be
+returned. If C<FH> is not specified then the return value, on success,
+will be a reference to an array containg the article requested, each
+entry in the array will contain one line of the article.
+
+If no arguments are passed then the current article in the currently
+selected newsgroup is fetched.
+
+C<MSGNUM> is a numeric id of an article in the current newsgroup, and
+will change the current article pointer.  C<MSGID> is the message id of
+an article as shown in that article's header.  It is anticipated that the
+client will obtain the C<MSGID> from a list provided by the C<newnews>
+command, from references contained within another article, or from the
+message-id provided in the response to some other commands.
+
+If there is an error then C<undef> will be returned.
+
+=item body ( [ MSGID|MSGNUM ], [FH] )
+
+Like C<article> but only fetches the body of the article.
+
+=item head ( [ MSGID|MSGNUM ], [FH] )
+
+Like C<article> but only fetches the headers for the article.
+
+=item articlefh ( [ MSGID|MSGNUM ] )
+
+=item bodyfh ( [ MSGID|MSGNUM ] )
+
+=item headfh ( [ MSGID|MSGNUM ] )
+
+These are similar to article(), body() and head(), but rather than
+returning the requested data directly, they return a tied filehandle
+from which to read the article.
+
+=item nntpstat ( [ MSGID|MSGNUM ] )
+
+The C<nntpstat> command is similar to the C<article> command except that no
+text is returned.  When selecting by message number within a group,
+the C<nntpstat> command serves to set the "current article pointer" without
+sending text.
+
+Using the C<nntpstat> command to
+select by message-id is valid but of questionable value, since a
+selection by message-id does B<not> alter the "current article pointer".
+
+Returns the message-id of the "current article".
+
+=item group ( [ GROUP ] )
+
+Set and/or get the current group. If C<GROUP> is not given then information
+is returned on the current group.
+
+In a scalar context it returns the group name.
+
+In an array context the return value is a list containing, the number
+of articles in the group, the number of the first article, the number
+of the last article and the group name.
+
+=item ihave ( MSGID [, MESSAGE ])
+
+The C<ihave> command informs the server that the client has an article
+whose id is C<MSGID>.  If the server desires a copy of that
+article, and C<MESSAGE> has been given the it will be sent.
+
+Returns I<true> if the server desires the article and C<MESSAGE> was
+successfully sent,if specified.
+
+If C<MESSAGE> is not specified then the message must be sent using the
+C<datasend> and C<dataend> methods from L<Net::Cmd>
+
+C<MESSAGE> can be either an array of lines or a reference to an array.
+
+=item last ()
+
+Set the "current article pointer" to the previous article in the current
+newsgroup.
+
+Returns the message-id of the article.
+
+=item date ()
+
+Returns the date on the remote server. This date will be in a UNIX time
+format (seconds since 1970)
+
+=item postok ()
+
+C<postok> will return I<true> if the servers initial response indicated
+that it will allow posting.
+
+=item authinfo ( USER, PASS )
+
+=item list ()
+
+Obtain information about all the active newsgroups. The results is a reference
+to a hash where the key is a group name and each value is a reference to an
+array. The elements in this array are:- the last article number in the group,
+the first article number in the group and any information flags about the group.
+
+=item newgroups ( SINCE [, DISTRIBUTIONS ])
+
+C<SINCE> is a time value and C<DISTRIBUTIONS> is either a distribution
+pattern or a reference to a list of distribution patterns.
+The result is the same as C<list>, but the
+groups return will be limited to those created after C<SINCE> and, if
+specified, in one of the distribution areas in C<DISTRIBUTIONS>. 
+
+=item newnews ( SINCE [, GROUPS [, DISTRIBUTIONS ]])
+
+C<SINCE> is a time value. C<GROUPS> is either a group pattern or a reference
+to a list of group patterns. C<DISTRIBUTIONS> is either a distribution
+pattern or a reference to a list of distribution patterns.
+
+Returns a reference to a list which contains the message-ids of all news posted
+after C<SINCE>, that are in a groups which matched C<GROUPS> and a
+distribution which matches C<DISTRIBUTIONS>.
+
+=item next ()
+
+Set the "current article pointer" to the next article in the current
+newsgroup.
+
+Returns the message-id of the article.
+
+=item post ( [ MESSAGE ] )
+
+Post a new article to the news server. If C<MESSAGE> is specified and posting
+is allowed then the message will be sent.
+
+If C<MESSAGE> is not specified then the message must be sent using the
+C<datasend> and C<dataend> methods from L<Net::Cmd>
+
+C<MESSAGE> can be either an array of lines or a reference to an array.
+
+The message, either sent via C<datasend> or as the C<MESSAGE>
+parameter, must be in the format as described by RFC822 and must
+contain From:, Newsgroups: and Subject: headers.
+
+=item postfh ()
+
+Post a new article to the news server using a tied filehandle.  If
+posting is allowed, this method will return a tied filehandle that you
+can print() the contents of the article to be posted.  You must
+explicitly close() the filehandle when you are finished posting the
+article, and the return value from the close() call will indicate
+whether the message was successfully posted.
+
+=item slave ()
+
+Tell the remote server that I am not a user client, but probably another
+news server.
+
+=item quit ()
+
+Quit the remote server and close the socket connection.
+
+=back
+
+=head2 Extension methods
+
+These methods use commands that are not part of the RFC977 documentation. Some
+servers may not support all of them.
+
+=over 4
+
+=item newsgroups ( [ PATTERN ] )
+
+Returns a reference to a hash where the keys are all the group names which
+match C<PATTERN>, or all of the groups if no pattern is specified, and
+each value contains the description text for the group.
+
+=item distributions ()
+
+Returns a reference to a hash where the keys are all the possible
+distribution names and the values are the distribution descriptions.
+
+=item subscriptions ()
+
+Returns a reference to a list which contains a list of groups which
+are recommended for a new user to subscribe to.
+
+=item overview_fmt ()
+
+Returns a reference to an array which contain the names of the fields returned
+by C<xover>.
+
+=item active_times ()
+
+Returns a reference to a hash where the keys are the group names and each
+value is a reference to an array containing the time the groups was created
+and an identifier, possibly an Email address, of the creator.
+
+=item active ( [ PATTERN ] )
+
+Similar to C<list> but only active groups that match the pattern are returned.
+C<PATTERN> can be a group pattern.
+
+=item xgtitle ( PATTERN )
+
+Returns a reference to a hash where the keys are all the group names which
+match C<PATTERN> and each value is the description text for the group.
+
+=item xhdr ( HEADER, MESSAGE-SPEC )
+
+Obtain the header field C<HEADER> for all the messages specified. 
+
+The return value will be a reference
+to a hash where the keys are the message numbers and each value contains
+the text of the requested header for that message.
+
+=item xover ( MESSAGE-SPEC )
+
+The return value will be a reference
+to a hash where the keys are the message numbers and each value contains
+a reference to an array which contains the overview fields for that
+message.
+
+The names of the fields can be obtained by calling C<overview_fmt>.
+
+=item xpath ( MESSAGE-ID )
+
+Returns the path name to the file on the server which contains the specified
+message.
+
+=item xpat ( HEADER, PATTERN, MESSAGE-SPEC)
+
+The result is the same as C<xhdr> except the is will be restricted to
+headers where the text of the header matches C<PATTERN>
+
+=item xrover
+
+The XROVER command returns reference information for the article(s)
+specified.
+
+Returns a reference to a HASH where the keys are the message numbers and the
+values are the References: lines from the articles
+
+=item listgroup ( [ GROUP ] )
+
+Returns a reference to a list of all the active messages in C<GROUP>, or
+the current group if C<GROUP> is not specified.
+
+=item reader
+
+Tell the server that you are a reader and not another server.
+
+This is required by some servers. For example if you are connecting to
+an INN server and you have transfer permission your connection will
+be connected to the transfer daemon, not the NNTP daemon. Issuing
+this command will cause the transfer daemon to hand over control
+to the NNTP daemon.
+
+Some servers do not understand this command, but issuing it and ignoring
+the response is harmless.
+
+=back
+
+=head1 UNSUPPORTED
+
+The following NNTP command are unsupported by the package, and there are
+no plans to do so.
+
+    AUTHINFO GENERIC
+    XTHREAD
+    XSEARCH
+    XINDEX
+
+=head1 DEFINITIONS
+
+=over 4
+
+=item MESSAGE-SPEC
+
+C<MESSAGE-SPEC> is either a single message-id, a single message number, or
+a reference to a list of two message numbers.
+
+If C<MESSAGE-SPEC> is a reference to a list of two message numbers and the
+second number in a range is less than or equal to the first then the range
+represents all messages in the group after the first message number.
+
+B<NOTE> For compatibility reasons only with earlier versions of Net::NNTP
+a message spec can be passed as a list of two numbers, this is deprecated
+and a reference to the list should now be passed
+
+=item PATTERN
+
+The C<NNTP> protocol uses the C<WILDMAT> format for patterns.
+The WILDMAT format was first developed by Rich Salz based on
+the format used in the UNIX "find" command to articulate
+file names. It was developed to provide a uniform mechanism
+for matching patterns in the same manner that the UNIX shell
+matches filenames.
+
+Patterns are implicitly anchored at the
+beginning and end of each string when testing for a match.
+
+There are five pattern matching operations other than a strict
+one-to-one match between the pattern and the source to be
+checked for a match.
+
+The first is an asterisk C<*> to match any sequence of zero or more
+characters.
+
+The second is a question mark C<?> to match any single character. The
+third specifies a specific set of characters.
+
+The set is specified as a list of characters, or as a range of characters
+where the beginning and end of the range are separated by a minus (or dash)
+character, or as any combination of lists and ranges. The dash can
+also be included in the set as a character it if is the beginning
+or end of the set. This set is enclosed in square brackets. The
+close square bracket C<]> may be used in a set if it is the first
+character in the set.
+
+The fourth operation is the same as the
+logical not of the third operation and is specified the same
+way as the third with the addition of a caret character C<^> at
+the beginning of the test string just inside the open square
+bracket.
+
+The final operation uses the backslash character to
+invalidate the special meaning of an open square bracket C<[>,
+the asterisk, backslash or the question mark. Two backslashes in
+sequence will result in the evaluation of the backslash as a
+character with no special meaning.
+
+=over 4
+
+=item Examples
+
+=item C<[^]-]>
+
+matches any single character other than a close square
+bracket or a minus sign/dash.
+
+=item C<*bdc>
+
+matches any string that ends with the string "bdc"
+including the string "bdc" (without quotes).
+
+=item C<[0-9a-zA-Z]>
+
+matches any single printable alphanumeric ASCII character.
+
+=item C<a??d>
+
+matches any four character string which begins
+with a and ends with d.
+
+=back
+
+=back
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/NNTP.pm#18 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/Netrc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,340 @@
+# Net::Netrc.pm
+#
+# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Netrc;
+
+use Carp;
+use strict;
+use FileHandle;
+use vars qw($VERSION);
+
+$VERSION = "2.12"; # $Id: //depot/libnet/Net/Netrc.pm#13 $
+
+my %netrc = ();
+
+sub _readrc
+{
+ my $host = shift;
+ my($home,$file);
+
+ if($^O eq "MacOS") {
+   $home = $ENV{HOME} || `pwd`;
+   chomp($home);
+   $file = ($home =~ /:$/ ? $home . "netrc" : $home . ":netrc");
+ } else {
+   # Some OS's don't have `getpwuid', so we default to $ENV{HOME}
+   $home = eval { (getpwuid($>))[7] } || $ENV{HOME};
+   $home ||= $ENV{HOMEDRIVE} . ($ENV{HOMEPATH}||'') if defined $ENV{HOMEDRIVE};
+   $file = $home . "/.netrc";
+ }
+
+ my($login,$pass,$acct) = (undef,undef,undef);
+ my $fh;
+ local $_;
+
+ $netrc{default} = undef;
+
+ # OS/2 and Win32 do not handle stat in a way compatable with this check :-(
+ unless($^O eq 'os2'
+     || $^O eq 'MSWin32'
+     || $^O eq 'MacOS'
+     || $^O =~ /^cygwin/)
+  { 
+   my @stat = stat($file);
+
+   if(@stat)
+    {
+     if($stat[2] & 077)
+      {
+       carp "Bad permissions: $file";
+       return;
+      }
+     if($stat[4] != $<)
+      {
+       carp "Not owner: $file";
+       return;
+      }
+    }
+  }
+
+ if($fh = FileHandle->new($file,"r"))
+  {
+   my($mach,$macdef,$tok,@tok) = (0,0);
+
+   while(<$fh>)
+    {
+     undef $macdef if /\A\n\Z/;
+
+     if($macdef)
+      {
+       push(@$macdef,$_);
+       next;
+      }
+
+     s/^\s*//;
+     chomp;
+
+     while(length && s/^("((?:[^"]+|\\.)*)"|((?:[^\\\s]+|\\.)*))\s*//) {
+       (my $tok = $+) =~ s/\\(.)/$1/g;
+       push(@tok, $tok);
+     }
+
+TOKEN:
+     while(@tok)
+      {
+       if($tok[0] eq "default")
+        {
+         shift(@tok);
+         $mach = bless {};
+   	 $netrc{default} = [$mach];
+
+         next TOKEN;
+        }
+
+       last TOKEN
+            unless @tok > 1;
+
+       $tok = shift(@tok);
+
+       if($tok eq "machine")
+        {
+         my $host = shift @tok;
+         $mach = bless {machine => $host};
+
+         $netrc{$host} = []
+            unless exists($netrc{$host});
+         push(@{$netrc{$host}}, $mach);
+        }
+       elsif($tok =~ /^(login|password|account)$/)
+        {
+         next TOKEN unless $mach;
+         my $value = shift @tok;
+         # Following line added by rmerrell to remove '/' escape char in .netrc
+         $value =~ s/\/\\/\\/g;
+         $mach->{$1} = $value;
+        }
+       elsif($tok eq "macdef")
+        {
+         next TOKEN unless $mach;
+         my $value = shift @tok;
+         $mach->{macdef} = {}
+            unless exists $mach->{macdef};
+         $macdef = $mach->{machdef}{$value} = [];
+        }
+      }
+    }
+   $fh->close();
+  }
+}
+
+sub lookup
+{
+ my($pkg,$mach,$login) = @_;
+
+ _readrc()
+    unless exists $netrc{default};
+
+ $mach ||= 'default';
+ undef $login
+    if $mach eq 'default';
+
+ if(exists $netrc{$mach})
+  {
+   if(defined $login)
+    {
+     my $m;
+     foreach $m (@{$netrc{$mach}})
+      {
+       return $m
+            if(exists $m->{login} && $m->{login} eq $login);
+      }
+     return undef;
+    }
+   return $netrc{$mach}->[0]
+  }
+
+ return $netrc{default}->[0]
+    if defined $netrc{default};
+
+ return undef;
+}
+
+sub login
+{
+ my $me = shift;
+
+ exists $me->{login}
+    ? $me->{login}
+    : undef;
+}
+
+sub account
+{
+ my $me = shift;
+
+ exists $me->{account}
+    ? $me->{account}
+    : undef;
+}
+
+sub password
+{
+ my $me = shift;
+
+ exists $me->{password}
+    ? $me->{password}
+    : undef;
+}
+
+sub lpa
+{
+ my $me = shift;
+ ($me->login, $me->password, $me->account);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Netrc - OO interface to users netrc file
+
+=head1 SYNOPSIS
+
+    use Net::Netrc;
+
+    $mach = Net::Netrc->lookup('some.machine');
+    $login = $mach->login;
+    ($login, $password, $account) = $mach->lpa;
+
+=head1 DESCRIPTION
+
+C<Net::Netrc> is a class implementing a simple interface to the .netrc file
+used as by the ftp program.
+
+C<Net::Netrc> also implements security checks just like the ftp program,
+these checks are, first that the .netrc file must be owned by the user and 
+second the ownership permissions should be such that only the owner has
+read and write access. If these conditions are not met then a warning is
+output and the .netrc file is not read.
+
+=head1 THE .netrc FILE
+
+The .netrc file contains login and initialization information used by the
+auto-login process.  It resides in the user's home directory.  The following
+tokens are recognized; they may be separated by spaces, tabs, or new-lines:
+
+=over 4
+
+=item machine name
+
+Identify a remote machine name. The auto-login process searches
+the .netrc file for a machine token that matches the remote machine
+specified.  Once a match is made, the subsequent .netrc tokens
+are processed, stopping when the end of file is reached or an-
+other machine or a default token is encountered.
+
+=item default
+
+This is the same as machine name except that default matches
+any name.  There can be only one default token, and it must be
+after all machine tokens.  This is normally used as:
+
+    default login anonymous password user@site
+
+thereby giving the user automatic anonymous login to machines
+not specified in .netrc.
+
+=item login name
+
+Identify a user on the remote machine.  If this token is present,
+the auto-login process will initiate a login using the
+specified name.
+
+=item password string
+
+Supply a password.  If this token is present, the auto-login
+process will supply the specified string if the remote server
+requires a password as part of the login process.
+
+=item account string
+
+Supply an additional account password.  If this token is present,
+the auto-login process will supply the specified string
+if the remote server requires an additional account password.
+
+=item macdef name
+
+Define a macro. C<Net::Netrc> only parses this field to be compatible
+with I<ftp>.
+
+=back
+
+=head1 CONSTRUCTOR
+
+The constructor for a C<Net::Netrc> object is not called new as it does not
+really create a new object. But instead is called C<lookup> as this is
+essentially what it does.
+
+=over 4
+
+=item lookup ( MACHINE [, LOGIN ])
+
+Lookup and return a reference to the entry for C<MACHINE>. If C<LOGIN> is given
+then the entry returned will have the given login. If C<LOGIN> is not given then
+the first entry in the .netrc file for C<MACHINE> will be returned.
+
+If a matching entry cannot be found, and a default entry exists, then a
+reference to the default entry is returned.
+
+If there is no matching entry found and there is no default defined, or
+no .netrc file is found, then C<undef> is returned.
+
+=back
+
+=head1 METHODS
+
+=over 4
+
+=item login ()
+
+Return the login id for the netrc entry
+
+=item password ()
+
+Return the password for the netrc entry
+
+=item account ()
+
+Return the account information for the netrc entry
+
+=item lpa ()
+
+Return a list of login, password and account information fir the netrc entry
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 SEE ALSO
+
+L<Net::Netrc>
+L<Net::Cmd>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+$Id: //depot/libnet/Net/Netrc.pm#13 $
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/PH.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,784 @@
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com> and
+# Alex Hristov <hristov@slb.com>. All rights reserved. This program is free
+# software; you can redistribute it and/or modify it under the same terms
+# as Perl itself.
+
+package Net::PH;
+
+require 5.001;
+
+use strict;
+use vars qw(@ISA $VERSION);
+use Carp;
+
+use Socket 1.3;
+use IO::Socket;
+use Net::Cmd;
+use Net::Config;
+
+$VERSION = "2.20"; # $Id: //depot/libnet/Net/PH.pm#7$
+@ISA     = qw(Exporter Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $pkg  = shift;
+ my $host = shift if @_ % 2;
+ my %arg  = @_; 
+ my $hosts = defined $host ? [ $host ] : $NetConfig{ph_hosts};
+ my $ph;
+
+ my $h;
+ foreach $h (@{$hosts})
+  {
+   $ph = $pkg->SUPER::new(PeerAddr => ($host = $h), 
+			  PeerPort => $arg{Port} || 'csnet-ns(105)',
+			  Proto    => 'tcp',
+			  Timeout  => defined $arg{Timeout}
+					? $arg{Timeout}
+					: 120
+			 ) and last;
+  }
+
+ return undef
+	unless defined $ph;
+
+ ${*$ph}{'net_ph_host'} = $host;
+
+ $ph->autoflush(1);
+
+ $ph->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ $ph;
+}
+
+sub status
+{
+ my $ph = shift;
+
+ $ph->command('status')->response;
+ $ph->code;
+}
+
+sub login
+{
+ my $ph = shift;
+ my($user,$pass,$encrypted) = @_;
+ my $resp;
+
+ $resp = $ph->command("login",$user)->response;
+
+ if(defined($pass) && $resp == CMD_MORE)
+  {
+   if($encrypted)
+    {
+     my $challenge_str = $ph->message;
+     chomp($challenge_str);
+     Net::PH::crypt::crypt_start($pass);
+     my $cryptstr = Net::PH::crypt::encryptit($challenge_str);
+
+     $ph->command("answer", $cryptstr);
+    }
+   else
+    {
+     $ph->command("clear", $pass);
+    }
+   $resp = $ph->response;
+  }
+
+ $resp == CMD_OK;
+}
+
+sub logout
+{
+ my $ph = shift;
+
+ $ph->command("logout")->response == CMD_OK;
+}
+
+sub id
+{
+ my $ph = shift;
+ my $id = @_ ? shift : $<;
+
+ $ph->command("id",$id)->response == CMD_OK;
+}
+
+sub siteinfo
+{
+ my $ph = shift;
+
+ $ph->command("siteinfo");
+
+ my $ln;
+ my %resp;
+ my $cur_num = 0;
+
+ while(defined($ln = $ph->getline))
+  {
+   $ph->debug_print(0,$ln)
+     if ($ph->debug & 2);
+   chomp($ln);
+   my($code,$num,$tag,$data);
+
+   if($ln =~ /^-(\d+):(\d+):(?:\s*([^:]+):)?\s*(.*)/o)
+    {
+     ($code,$num,$tag,$data) = ($1, $2, $3 || "",$4);
+     $resp{$tag} = bless [$code, $num, $tag, $data], "Net::PH::Result";
+    }
+   else
+    {
+     $ph->set_status($ph->parse_response($ln));
+     return \%resp;
+    }
+  }
+
+ return undef;
+}
+
+sub query
+{
+ my $ph = shift;
+ my $search = shift;
+
+ my($k,$v);
+
+ my @args = ('query', _arg_hash($search));
+
+ push(@args,'return',_arg_list( shift ))
+	if @_;
+
+ unless($ph->command(@args)->response == CMD_INFO)
+  {
+   return $ph->code == 501
+	? []
+	: undef;
+  }
+
+ my $ln;
+ my @resp;
+ my $cur_num = 0;
+
+ my($last_tag);
+
+ while(defined($ln = $ph->getline))
+  {
+   $ph->debug_print(0,$ln)
+     if ($ph->debug & 2);
+   chomp($ln);
+   my($code,$idx,$num,$tag,$data);
+
+   if($ln =~ /^-(\d+):(\d+):\s*([^:]*):\s*(.*)/o)
+    {
+     ($code,$idx,$tag,$data) = ($1,$2,$3,$4);
+     my $num = $idx - 1;
+
+     $resp[$num] ||= {};
+
+     $tag = $last_tag
+	unless(length($tag));
+
+     $last_tag = $tag;
+
+     if(exists($resp[$num]->{$tag}))
+      {
+       $resp[$num]->{$tag}->[3] .= "\n" . $data;
+      }
+     else
+      {
+       $resp[$num]->{$tag} = bless [$code, $idx, $tag, $data], "Net::PH::Result";
+      }
+    }
+   else
+    {
+     $ph->set_status($ph->parse_response($ln));
+     return \@resp;
+    }
+  }
+
+ return undef;
+}
+
+sub change
+{
+ my $ph = shift;
+ my $search = shift;
+ my $make = shift;
+
+ $ph->command(
+	"change", _arg_hash($search),
+	"make",   _arg_hash($make)
+ )->response == CMD_OK;
+}
+
+sub _arg_hash
+{
+ my $hash = shift;
+
+ return $hash
+	unless(ref($hash));
+
+ my($k,$v);
+ my @r;
+
+ while(($k,$v) = each %$hash)
+  {
+   my $a = $v;
+   $a =~ s/\n/\\n/sog;
+   $a =~ s/\t/\\t/sog;
+   $a = '"' . $a . '"'
+	if $a =~ /\W/;
+   $a = '""'
+	unless length $a;
+
+   push(@r, "$k=$a");   
+  }
+ join(" ", @r);
+}
+
+sub _arg_list
+{
+ my $arr = shift;
+
+ return $arr
+	unless(ref($arr));
+
+ my $v;
+ my @r;
+
+ foreach $v (@$arr)
+  {
+   my $a = $v;
+   $a =~ s/\n/\\n/sog;
+   $a =~ s/\t/\\t/sog;
+   $a = '"' . $a . '"'
+	if $a =~ /\W/;
+   push(@r, $a);   
+  }
+
+ join(" ",@r);
+}
+
+sub add
+{
+ my $ph = shift;
+ my $arg = @_ > 1 ? { @_ } : shift;
+
+ $ph->command('add', _arg_hash($arg))->response == CMD_OK;
+}
+
+sub delete
+{
+ my $ph = shift;
+ my $arg = @_ > 1 ? { @_ } : shift;
+
+ $ph->command('delete', _arg_hash($arg))->response == CMD_OK;
+}
+
+sub force
+{
+ my $ph = shift; 
+ my $search = shift;
+ my $force = shift;
+
+ $ph->command(
+	"change", _arg_hash($search),
+	"force",  _arg_hash($force)
+ )->response == CMD_OK;
+}
+
+
+sub fields
+{
+ my $ph = shift;
+
+ $ph->command("fields", _arg_list(\@_));
+
+ my $ln;
+ my %resp;
+ my $cur_num = 0;
+ my @tags = ();
+ 
+ while(defined($ln = $ph->getline))
+  {
+   $ph->debug_print(0,$ln)
+     if ($ph->debug & 2);
+   chomp($ln);
+
+   my($code,$num,$tag,$data,$last_tag);
+
+   if($ln =~ /^-(\d+):(\d+):\s*([^:]*):\s*(.*)/o)
+    {
+     ($code,$num,$tag,$data) = ($1,$2,$3,$4);
+
+     $tag = $last_tag
+	unless(length($tag));
+
+     $last_tag = $tag;
+
+     if(exists $resp{$tag})
+      {
+       $resp{$tag}->[3] .= "\n" . $data;
+      }
+     else
+      {
+       $resp{$tag} = bless [$code, $num, $tag, $data], "Net::PH::Result";
+       push @tags, $tag;
+      }
+    }
+   else
+    {
+     $ph->set_status($ph->parse_response($ln));
+     return wantarray ? (\%resp, \@tags) : \%resp;
+    }
+  }
+
+ return;
+}
+
+sub quit
+{
+ my $ph = shift;
+
+ $ph->close
+	if $ph->command("quit")->response == CMD_OK;
+}
+
+##
+## Net::Cmd overrides
+##
+
+sub parse_response
+{
+ return ()
+    unless $_[1] =~ s/^(-?)(\d\d\d):?//o;
+ ($2, $1 eq "-");
+}
+
+sub debug_text { $_[2] =~ /^(clear)/i ? "$1 ....\n" : $_[2]; }
+
+package Net::PH::Result;
+
+sub code  { shift->[0] }
+sub value { shift->[1] }
+sub field { shift->[2] }
+sub text  { shift->[3] }
+
+package Net::PH::crypt;
+
+#  The code in this package is based upon 'cryptit.c', Copyright (C) 1988 by
+#  Steven Dorner, and Paul Pomes, and the University of Illinois Board
+#  of Trustees, and by CSNET.
+
+use integer;
+use strict;
+ 
+sub ROTORSZ () { 256 }
+sub MASK () { 255 }
+
+my(@t1,@t2,@t3,$n1,$n2);
+
+sub crypt_start {
+    my $pass = shift;
+    $n1 = 0;
+    $n2 = 0;
+    crypt_init($pass);
+}
+
+sub crypt_init {
+    my $pw = shift;
+    my $i;
+
+    @t2 = @t3 = (0) x ROTORSZ;
+
+    my $buf = crypt($pw,$pw);
+    return -1 unless length($buf) > 0;
+    $buf = substr($buf . "\0" x 13,0,13);
+    my @buf = map { ord $_ } split(//, $buf);
+
+
+    my $seed = 123;
+    for($i = 0 ; $i < 13 ; $i++) {
+	$seed = $seed * $buf[$i] + $i;
+    }
+    @t1 = (0 .. ROTORSZ-1);
+    
+    for($i = 0 ; $i < ROTORSZ ; $i++) {
+	$seed = 5 * $seed + $buf[$i % 13];
+	my $random = $seed % 65521;
+	my $k = ROTORSZ - 1 - $i;
+	my $ic = ($random & MASK) % ($k + 1);
+	$random >>= 8;
+	@t1[$k,$ic] = @t1[$ic,$k];
+	next if $t3[$k] != 0;
+	$ic = ($random & MASK) % $k;
+	while($t3[$ic] != 0) {
+	    $ic = ($ic + 1) % $k;
+	}
+	$t3[$k] = $ic;
+	$t3[$ic] = $k;
+    }
+    for($i = 0 ; $i < ROTORSZ ; $i++) {
+	$t2[$t1[$i] & MASK] = $i
+    }
+}
+
+sub encode {
+    my $sp = shift;
+    my $ch;
+    my $n = scalar(@$sp);
+    my @out = ($n);
+    my $i;
+
+    for($i = 0 ; $i < $n ; ) {
+	my($f0,$f1,$f2) = splice(@$sp,0,3);
+	push(@out,
+	    $f0 >> 2,
+	    ($f0 << 4) & 060 | ($f1 >> 4) & 017,
+	    ($f1 << 2) & 074 | ($f2 >> 6) & 03,
+	    $f2 & 077);
+	$i += 3;
+   }
+   join("", map { chr((($_ & 077) + 35) & 0xff) } @out);  # ord('#') == 35
+}
+
+sub encryptit {
+    my $from = shift;
+    my @from = map { ord $_ } split(//, $from);
+    my @sp = ();
+    my $ch;
+    while(defined($ch = shift @from)) {
+	push(@sp,
+	    $t2[($t3[($t1[($ch + $n1) & MASK] + $n2) & MASK] - $n2) & MASK] - $n1);
+
+	$n1++;
+	if($n1 == ROTORSZ) {
+	    $n1 = 0;
+	    $n2++;
+	    $n2 = 0 if $n2 == ROTORSZ;
+	}
+    }
+    encode(\@sp);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::PH - CCSO Nameserver Client class
+
+=head1 SYNOPSIS
+
+    use Net::PH;
+    
+    $ph = Net::PH->new("some.host.name",
+                       Port    => 105,
+                       Timeout => 120,
+                       Debug   => 0);
+
+    if($ph) {
+        $q = $ph->query({ field1 => "value1" },
+                        [qw(name address pobox)]);
+    
+        if($q) {
+        }
+    }
+    
+    # Alternative syntax
+    
+    if($ph) {
+        $q = $ph->query('field1=value1',
+                        'name address pobox');
+    
+        if($q) {
+        }
+    }
+
+=head1 DESCRIPTION
+
+C<Net::PH> is a class implementing a simple Nameserver/PH client in Perl
+as described in the CCSO Nameserver -- Server-Client Protocol. Like other
+modules in the Net:: family the C<Net::PH> object inherits methods from
+C<Net::Cmd>.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST ] [, OPTIONS ])
+
+    $ph = Net::PH->new("some.host.name",
+                       Port    => 105,
+                       Timeout => 120,
+                       Debug   => 0
+                      );
+
+This is the constructor for a new Net::PH object. C<HOST> is the
+name of the remote host to which a PH connection is required.
+
+If C<HOST> is not given, then the C<SNPP_Host> specified in C<Net::Config>
+will be used.
+
+C<OPTIONS> is an optional list of named options which are passed in
+a hash like fashion, using key and value pairs. Possible options are:-
+
+B<Port> - Port number to connect to on remote host.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+Nameserver, a value of zero will cause all IO operations to block.
+(default: 120)
+
+B<Debug> - Enable the printing of debugging information to STDERR
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item query( SEARCH [, RETURN ] )
+
+    $q = $ph->query({ name => $myname },
+		    [qw(name email schedule)]);
+    
+    foreach $handle (@{$q}) {
+	foreach $field (keys %{$handle}) {
+            $c = ${$handle}{$field}->code;
+            $v = ${$handle}{$field}->value;
+            $f = ${$handle}{$field}->field;
+            $t = ${$handle}{$field}->text;
+            print "field:[$field] [$c][$v][$f][$t]\n" ;
+	}
+    }
+
+    
+
+Search the database and return fields from all matching entries.
+
+The C<SEARCH> argument is a reference to a HASH which contains field/value
+pairs which will be passed to the Nameserver as the search criteria.
+
+C<RETURN> is optional, but if given it should be a reference to a list which
+contains field names to be returned.
+
+The alternative syntax is to pass strings instead of references, for example
+
+    $q = $ph->query('name=myname',
+		    'name email schedule');
+
+The C<SEARCH> argument is a string that is passed to the Nameserver as the 
+search criteria. The strings being passed should B<not> contain any carriage
+returns, or else the query command might fail or return invalid data.
+
+C<RETURN> is optional, but if given it should be a string which will
+contain field names to be returned.
+
+Each match from the server will be returned as a HASH where the keys are the
+field names and the values are C<Net::PH:Result> objects (I<code>, I<value>, 
+I<field>, I<text>).
+
+Returns a reference to an ARRAY which contains references to HASHs, one
+per match from the server.
+
+=item change( SEARCH , MAKE )
+
+    $r = $ph->change({ email => "*.domain.name" },
+                     { schedule => "busy");
+
+Change field values for matching entries.
+
+The C<SEARCH> argument is a reference to a HASH which contains field/value
+pairs which will be passed to the Nameserver as the search criteria.
+
+The C<MAKE> argument is a reference to a HASH which contains field/value
+pairs which will be passed to the Nameserver that
+will set new values to designated fields.
+
+The alternative syntax is to pass strings instead of references, for example
+
+    $r = $ph->change('email="*.domain.name"',
+                     'schedule="busy"');
+
+The C<SEARCH> argument is a string to be passed to the Nameserver as the 
+search criteria. The strings being passed should B<not> contain any carriage
+returns, or else the query command might fail or return invalid data.
+
+
+The C<MAKE> argument is a string to be passed to the Nameserver that
+will set new values to designated fields.
+
+Upon success all entries that match the search criteria will have
+the field values, given in the Make argument, changed.
+
+=item login( USER, PASS [, ENCRYPT ])
+
+    $r = $ph->login('username','password',1);
+
+Enter login mode using C<USER> and C<PASS>. If C<ENCRYPT> is given and
+is I<true> then the password will be used to encrypt a challenge text 
+string provided by the server, and the encrypted string will be sent back
+to the server. If C<ENCRYPT> is not given, or I<false> then the password 
+will be sent in clear text (I<this is not recommended>)
+
+=item logout()
+
+    $r = $ph->logout();
+
+Exit login mode and return to anonymous mode.
+
+=item fields( [ FIELD_LIST ] )
+
+    $fields = $ph->fields();
+    foreach $field (keys %{$fields}) {
+        $c = ${$fields}{$field}->code;
+        $v = ${$fields}{$field}->value;
+        $f = ${$fields}{$field}->field;
+        $t = ${$fields}{$field}->text;
+        print "field:[$field] [$c][$v][$f][$t]\n";
+    }
+
+In a scalar context, returns a reference to a HASH. The keys of the HASH are
+the field names and the values are C<Net::PH:Result> objects (I<code>,
+I<value>, I<field>, I<text>).
+
+In an array context, returns a two element array. The first element is a
+reference to a HASH as above, the second element is a reference to an array
+which contains the tag names in the order that they were returned from the
+server.
+
+C<FIELD_LIST> is a string that lists the fields for which info will be
+returned.
+
+=item add( FIELD_VALUES )
+
+    $r = $ph->add( { name => $name, phone => $phone });
+
+This method is used to add new entries to the Nameserver database. You
+must successfully call L<login> before this method can be used.
+
+B<Note> that this method adds new entries to the database. To modify
+an existing entry use L<change>.
+
+C<FIELD_VALUES> is a reference to a HASH which contains field/value
+pairs which will be passed to the Nameserver and will be used to 
+initialize the new entry.
+
+The alternative syntax is to pass a string instead of a reference, for example
+
+    $r = $ph->add('name=myname phone=myphone');
+
+C<FIELD_VALUES> is a string that consists of field/value pairs which the
+new entry will contain. The strings being passed should B<not> contain any
+carriage returns, or else the query command might fail or return invalid data.
+
+
+=item delete( FIELD_VALUES )
+
+    $r = $ph->delete('name=myname phone=myphone');
+
+This method is used to delete existing entries from the Nameserver database.
+You must successfully call L<login> before this method can be used.
+
+B<Note> that this method deletes entries to the database. To modify
+an existing entry use L<change>.
+
+C<FIELD_VALUES> is a string that serves as the search criteria for the
+records to be deleted. Any entry in the database which matches this search 
+criteria will be deleted.
+
+=item id( [ ID ] )
+
+    $r = $ph->id('709');
+
+Sends C<ID> to the Nameserver, which will enter this into its
+logs. If C<ID> is not given then the UID of the user running the
+process will be sent.
+
+=item status()
+
+Returns the current status of the Nameserver.
+
+=item siteinfo()
+
+    $siteinfo = $ph->siteinfo();
+    foreach $field (keys %{$siteinfo}) {
+        $c = ${$siteinfo}{$field}->code;
+        $v = ${$siteinfo}{$field}->value;
+        $f = ${$siteinfo}{$field}->field;
+        $t = ${$siteinfo}{$field}->text;
+        print "field:[$field] [$c][$v][$f][$t]\n";
+    }
+
+Returns a reference to a HASH containing information about the server's 
+site. The keys of the HASH are the field names and values are
+C<Net::PH:Result> objects (I<code>, I<value>, I<field>, I<text>).
+
+=item quit()
+
+    $r = $ph->quit();
+
+Quit the connection
+
+=back
+
+=head1 Q&A
+
+How do I get the values of a Net::PH::Result object?
+
+    foreach $handle (@{$q}) {
+        foreach $field (keys %{$handle}) {
+            $my_code  = ${$q}{$field}->code;
+            $my_value = ${$q}{$field}->value;
+            $my_field = ${$q}{$field}->field;
+            $my_text  = ${$q}{$field}->text;
+        }
+    }
+
+How do I get a count of the returned matches to my query?
+
+    $my_count = scalar(@{$query_result});
+
+How do I get the status code and message of the last C<$ph> command?
+
+    $status_code    = $ph->code;
+    $status_message = $ph->message;
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+
+=head1 AUTHORS
+
+Graham Barr <gbarr@pobox.com>
+Alex Hristov <hristov@slb.com>
+
+=head1 ACKNOWLEDGMENTS
+
+Password encryption code ported to perl by Broc Seib <bseib@purdue.edu>,
+Purdue University Computing Center.
+
+Otis Gospodnetic <otisg@panther.middlebury.edu> suggested
+passing parameters as string constants. Some queries cannot be 
+executed when passing parameters as string references.
+
+        Example: query first_name last_name email="*.domain"
+
+=head1 COPYRIGHT
+
+The encryption code is based upon cryptit.c, Copyright (C) 1988 by
+Steven Dorner, and Paul Pomes, and the University of Illinois Board
+of Trustees, and by CSNET.
+
+All other code is Copyright (c) 1996-1997 Graham Barr <gbarr@pobox.com>
+and Alex Hristov <hristov@slb.com>. All rights reserved. This program is
+free software; you can redistribute it and/or modify it under the same
+terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/POP3.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,552 @@
+# Net::POP3.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::POP3;
+
+use strict;
+use IO::Socket;
+use vars qw(@ISA $VERSION $debug);
+use Net::Cmd;
+use Carp;
+use Net::Config;
+
+$VERSION = "2.24"; # $Id: //depot/libnet/Net/POP3.pm#24 $
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my $host = shift if @_ % 2;
+ my %arg  = @_; 
+ my $hosts = defined $host ? [ $host ] : $NetConfig{pop3_hosts};
+ my $obj;
+ my @localport = exists $arg{ResvPort} ? ( LocalPort => $arg{ResvPort} ): ();
+
+ my $h;
+ foreach $h (@{$hosts})
+  {
+   $obj = $type->SUPER::new(PeerAddr => ($host = $h), 
+			    PeerPort => $arg{Port} || 'pop3(110)',
+			    Proto    => 'tcp',
+			    @localport,
+			    Timeout  => defined $arg{Timeout}
+						? $arg{Timeout}
+						: 120
+			   ) and last;
+  }
+
+ return undef
+	unless defined $obj;
+
+ ${*$obj}{'net_pop3_host'} = $host;
+
+ $obj->autoflush(1);
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK)
+  {
+   $obj->close();
+   return undef;
+  }
+
+ ${*$obj}{'net_pop3_banner'} = $obj->message;
+
+ $obj;
+}
+
+##
+## We don't want people sending me their passwords when they report problems
+## now do we :-)
+##
+
+sub debug_text { $_[2] =~ /^(pass|rpop)/i ? "$1 ....\n" : $_[2]; }
+
+sub login
+{
+ @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->login( USER, PASS )';
+ my($me,$user,$pass) = @_;
+
+ if (@_ <= 2) {
+   ($user, $pass) = $me->_lookup_credentials($user);
+ }
+
+ $me->user($user) and
+    $me->pass($pass);
+}
+
+sub apop
+{
+ @_ >= 1 && @_ <= 3 or croak 'usage: $pop3->apop( USER, PASS )';
+ my($me,$user,$pass) = @_;
+ my $banner;
+ my $md;
+
+ if (eval { local $SIG{__DIE__}; require Digest::MD5 }) {
+   $md = Digest::MD5->new();
+ } elsif (eval { local $SIG{__DIE__}; require MD5 }) {
+   $md = MD5->new();
+ } else {
+   carp "You need to install Digest::MD5 or MD5 to use the APOP command";
+   return undef;
+ }
+
+ return undef
+   unless ( $banner = (${*$me}{'net_pop3_banner'} =~ /(<.*>)/)[0] );
+
+ if (@_ <= 2) {
+   ($user, $pass) = $me->_lookup_credentials($user);
+ }
+
+ $md->add($banner,$pass);
+
+ return undef
+    unless($me->_APOP($user,$md->hexdigest));
+
+ $me->_get_mailbox_count();
+}
+
+sub user
+{
+ @_ == 2 or croak 'usage: $pop3->user( USER )';
+ $_[0]->_USER($_[1]) ? 1 : undef;
+}
+
+sub pass
+{
+ @_ == 2 or croak 'usage: $pop3->pass( PASS )';
+
+ my($me,$pass) = @_;
+
+ return undef
+   unless($me->_PASS($pass));
+
+ $me->_get_mailbox_count();
+}
+
+sub reset
+{
+ @_ == 1 or croak 'usage: $obj->reset()';
+
+ my $me = shift;
+
+ return 0 
+   unless($me->_RSET);
+
+ if(defined ${*$me}{'net_pop3_mail'})
+  {
+   local $_;
+   foreach (@{${*$me}{'net_pop3_mail'}})
+    {
+     delete $_->{'net_pop3_deleted'};
+    }
+  }
+}
+
+sub last
+{
+ @_ == 1 or croak 'usage: $obj->last()';
+
+ return undef
+    unless $_[0]->_LAST && $_[0]->message =~ /(\d+)/;
+
+ return $1;
+}
+
+sub top
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $pop3->top( MSGNUM [, NUMLINES ])';
+ my $me = shift;
+
+ return undef
+    unless $me->_TOP($_[0], $_[1] || 0);
+
+ $me->read_until_dot;
+}
+
+sub popstat
+{
+ @_ == 1 or croak 'usage: $pop3->popstat()';
+ my $me = shift;
+
+ return ()
+    unless $me->_STAT && $me->message =~ /(\d+)\D+(\d+)/;
+
+ ($1 || 0, $2 || 0);
+}
+
+sub list
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $pop3->list( [ MSGNUM ] )';
+ my $me = shift;
+
+ return undef
+    unless $me->_LIST(@_);
+
+ if(@_)
+  {
+   $me->message =~ /\d+\D+(\d+)/;
+   return $1 || undef;
+  }
+
+ my $info = $me->read_until_dot
+	or return undef;
+
+ my %hash = map { (/(\d+)\D+(\d+)/) } @$info;
+
+ return \%hash;
+}
+
+sub get
+{
+ @_ == 2 or @_ == 3 or croak 'usage: $pop3->get( MSGNUM [, FH ])';
+ my $me = shift;
+
+ return undef
+    unless $me->_RETR(shift);
+
+ $me->read_until_dot(@_);
+}
+
+sub getfh
+{
+ @_ == 2 or croak 'usage: $pop3->getfh( MSGNUM )';
+ my $me = shift;
+
+ return unless $me->_RETR(shift);
+ return        $me->tied_fh;
+}
+
+
+
+sub delete
+{
+ @_ == 2 or croak 'usage: $pop3->delete( MSGNUM )';
+ $_[0]->_DELE($_[1]);
+}
+
+sub uidl
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $pop3->uidl( [ MSGNUM ] )';
+ my $me = shift;
+ my $uidl;
+
+ $me->_UIDL(@_) or
+    return undef;
+ if(@_)
+  {
+   $uidl = ($me->message =~ /\d+\s+([\041-\176]+)/)[0];
+  }
+ else
+  {
+   my $ref = $me->read_until_dot
+	or return undef;
+   my $ln;
+   $uidl = {};
+   foreach $ln (@$ref) {
+     my($msg,$uid) = $ln =~ /^\s*(\d+)\s+([\041-\176]+)/;
+     $uidl->{$msg} = $uid;
+   }
+  }
+ return $uidl;
+}
+
+sub ping
+{
+ @_ == 2 or croak 'usage: $pop3->ping( USER )';
+ my $me = shift;
+
+ return () unless $me->_PING(@_) && $me->message =~ /(\d+)\D+(\d+)/;
+
+ ($1 || 0, $2 || 0);
+}
+
+sub _lookup_credentials
+{
+  my ($me, $user) = @_;
+
+  require Net::Netrc;
+
+  $user ||= eval { local $SIG{__DIE__}; (getpwuid($>))[0] } ||
+    $ENV{NAME} || $ENV{USER} || $ENV{LOGNAME};
+
+  my $m = Net::Netrc->lookup(${*$me}{'net_pop3_host'},$user);
+  $m ||= Net::Netrc->lookup(${*$me}{'net_pop3_host'});
+
+  my $pass = $m ? $m->password || ""
+                : "";
+
+  ($user, $pass);
+}
+
+sub _get_mailbox_count
+{
+  my ($me) = @_;
+  my $ret = ${*$me}{'net_pop3_count'} = ($me->message =~ /(\d+)\s+message/io)
+	  ? $1 : ($me->popstat)[0];
+
+  $ret ? $ret : "0E0";
+}
+
+
+sub _STAT { shift->command('STAT')->response() == CMD_OK }
+sub _LIST { shift->command('LIST',@_)->response() == CMD_OK }
+sub _RETR { shift->command('RETR',$_[0])->response() == CMD_OK }
+sub _DELE { shift->command('DELE',$_[0])->response() == CMD_OK }
+sub _NOOP { shift->command('NOOP')->response() == CMD_OK }
+sub _RSET { shift->command('RSET')->response() == CMD_OK }
+sub _QUIT { shift->command('QUIT')->response() == CMD_OK }
+sub _TOP  { shift->command('TOP', @_)->response() == CMD_OK }
+sub _UIDL { shift->command('UIDL',@_)->response() == CMD_OK }
+sub _USER { shift->command('USER',$_[0])->response() == CMD_OK }
+sub _PASS { shift->command('PASS',$_[0])->response() == CMD_OK }
+sub _APOP { shift->command('APOP',@_)->response() == CMD_OK }
+sub _PING { shift->command('PING',$_[0])->response() == CMD_OK }
+
+sub _RPOP { shift->command('RPOP',$_[0])->response() == CMD_OK }
+sub _LAST { shift->command('LAST')->response() == CMD_OK }
+
+sub quit
+{
+ my $me = shift;
+
+ $me->_QUIT;
+ $me->close;
+}
+
+sub DESTROY
+{
+ my $me = shift;
+
+ if(defined fileno($me))
+  {
+   $me->reset;
+   $me->quit;
+  }
+}
+
+##
+## POP3 has weird responses, so we emulate them to look the same :-)
+##
+
+sub response
+{
+ my $cmd = shift;
+ my $str = $cmd->getline() || return undef;
+ my $code = "500";
+
+ $cmd->debug_print(0,$str)
+   if ($cmd->debug);
+
+ if($str =~ s/^\+OK\s*//io)
+  {
+   $code = "200"
+  }
+ else
+  {
+   $str =~ s/^-ERR\s*//io;
+  }
+
+ ${*$cmd}{'net_cmd_resp'} = [ $str ];
+ ${*$cmd}{'net_cmd_code'} = $code;
+
+ substr($code,0,1);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::POP3 - Post Office Protocol 3 Client class (RFC1939)
+
+=head1 SYNOPSIS
+
+    use Net::POP3;
+
+    # Constructors
+    $pop = Net::POP3->new('pop3host');
+    $pop = Net::POP3->new('pop3host', Timeout => 60);
+
+    if ($pop->login($username, $password) > 0) {
+      my $msgnums = $pop->list; # hashref of msgnum => size
+      foreach my $msgnum (keys %$msgnums) {
+        my $msg = $pop->get($msgnum);
+        print @$msg;
+        $pop->delete($msgnum);
+      }
+    }
+
+    $pop->quit;
+
+=head1 DESCRIPTION
+
+This module implements a client interface to the POP3 protocol, enabling
+a perl5 application to talk to POP3 servers. This documentation assumes
+that you are familiar with the POP3 protocol described in RFC1939.
+
+A new Net::POP3 object must be created with the I<new> method. Once
+this has been done, all POP3 commands are accessed via method calls
+on the object.
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST, ] [ OPTIONS ] )
+
+This is the constructor for a new Net::POP3 object. C<HOST> is the
+name of the remote host to which a POP3 connection is required.
+
+If C<HOST> is not given, then the C<POP3_Host> specified in C<Net::Config>
+will be used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<ResvPort> - If given then the socket for the C<Net::POP3> object
+will be bound to the local port given using C<bind> when the socket is
+created.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+POP3 server (default: 120)
+
+B<Debug> - Enable debugging information
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item user ( USER )
+
+Send the USER command.
+
+=item pass ( PASS )
+
+Send the PASS command. Returns the number of messages in the mailbox.
+
+=item login ( [ USER [, PASS ]] )
+
+Send both the USER and PASS commands. If C<PASS> is not given the
+C<Net::POP3> uses C<Net::Netrc> to lookup the password using the host
+and username. If the username is not specified then the current user name
+will be used.
+
+Returns the number of messages in the mailbox. However if there are no
+messages on the server the string C<"0E0"> will be returned. This is
+will give a true value in a boolean context, but zero in a numeric context.
+
+If there was an error authenticating the user then I<undef> will be returned.
+
+=item apop ( [ USER [, PASS ]] )
+
+Authenticate with the server identifying as C<USER> with password C<PASS>.
+Similar to L</login>, but the password is not sent in clear text.
+
+To use this method you must have the Digest::MD5 or the MD5 module installed,
+otherwise this method will return I<undef>.
+
+=item top ( MSGNUM [, NUMLINES ] )
+
+Get the header and the first C<NUMLINES> of the body for the message
+C<MSGNUM>. Returns a reference to an array which contains the lines of text
+read from the server.
+
+=item list ( [ MSGNUM ] )
+
+If called with an argument the C<list> returns the size of the message
+in octets.
+
+If called without arguments a reference to a hash is returned. The
+keys will be the C<MSGNUM>'s of all undeleted messages and the values will
+be their size in octets.
+
+=item get ( MSGNUM [, FH ] )
+
+Get the message C<MSGNUM> from the remote mailbox. If C<FH> is not given
+then get returns a reference to an array which contains the lines of
+text read from the server. If C<FH> is given then the lines returned
+from the server are printed to the filehandle C<FH>.
+
+=item getfh ( MSGNUM )
+
+As per get(), but returns a tied filehandle.  Reading from this
+filehandle returns the requested message.  The filehandle will return
+EOF at the end of the message and should not be reused.
+
+=item last ()
+
+Returns the highest C<MSGNUM> of all the messages accessed.
+
+=item popstat ()
+
+Returns a list of two elements. These are the number of undeleted
+elements and the size of the mbox in octets.
+
+=item ping ( USER )
+
+Returns a list of two elements. These are the number of new messages
+and the total number of messages for C<USER>.
+
+=item uidl ( [ MSGNUM ] )
+
+Returns a unique identifier for C<MSGNUM> if given. If C<MSGNUM> is not
+given C<uidl> returns a reference to a hash where the keys are the
+message numbers and the values are the unique identifiers.
+
+=item delete ( MSGNUM )
+
+Mark message C<MSGNUM> to be deleted from the remote mailbox. All messages
+that are marked to be deleted will be removed from the remote mailbox
+when the server connection closed.
+
+=item reset ()
+
+Reset the status of the remote POP3 server. This includes reseting the
+status of all messages to not be deleted.
+
+=item quit ()
+
+Quit and close the connection to the remote POP3 server. Any messages marked
+as deleted will be deleted from the remote mailbox.
+
+=back
+
+=head1 NOTES
+
+If a C<Net::POP3> object goes out of scope before C<quit> method is called
+then the C<reset> method will called before the connection is closed. This
+means that any messages marked to be deleted will not be.
+
+=head1 SEE ALSO
+
+L<Net::Netrc>,
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/POP3.pm#24 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/SMTP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,770 @@
+# Net::SMTP.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::SMTP;
+
+require 5.001;
+
+use strict;
+use vars qw($VERSION @ISA);
+use Socket 1.3;
+use Carp;
+use IO::Socket;
+use Net::Cmd;
+use Net::Config;
+
+$VERSION = "2.26"; # $Id: //depot/libnet/Net/SMTP.pm#31 $
+
+@ISA = qw(Net::Cmd IO::Socket::INET);
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my $host = shift if @_ % 2;
+ my %arg  = @_; 
+ my $hosts = defined $host ? $host : $NetConfig{smtp_hosts};
+ my $obj;
+
+ my $h;
+ foreach $h (@{ref($hosts) ? $hosts : [ $hosts ]})
+  {
+   $obj = $type->SUPER::new(PeerAddr => ($host = $h), 
+			    PeerPort => $arg{Port} || 'smtp(25)',
+			    LocalAddr => $arg{LocalAddr},
+			    LocalPort => $arg{LocalPort},
+			    Proto    => 'tcp',
+			    Timeout  => defined $arg{Timeout}
+						? $arg{Timeout}
+						: 120
+			   ) and last;
+  }
+
+ return undef
+	unless defined $obj;
+
+ $obj->autoflush(1);
+
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK)
+  {
+   $obj->close();
+   return undef;
+  }
+
+ ${*$obj}{'net_smtp_exact_addr'} = $arg{ExactAddresses};
+ ${*$obj}{'net_smtp_host'} = $host;
+
+ (${*$obj}{'net_smtp_banner'}) = $obj->message;
+ (${*$obj}{'net_smtp_domain'}) = $obj->message =~ /\A\s*(\S+)/;
+
+ unless($obj->hello($arg{Hello} || ""))
+  {
+   $obj->close();
+   return undef;
+  }
+
+ $obj;
+}
+
+##
+## User interface methods
+##
+
+sub banner
+{
+ my $me = shift;
+
+ return ${*$me}{'net_smtp_banner'} || undef;
+}
+
+sub domain
+{
+ my $me = shift;
+
+ return ${*$me}{'net_smtp_domain'} || undef;
+}
+
+sub etrn {
+    my $self = shift;
+    defined($self->supports('ETRN',500,["Command unknown: 'ETRN'"])) &&
+	$self->_ETRN(@_);
+}
+
+sub auth {
+    my ($self, $username, $password) = @_;
+
+    require MIME::Base64;
+    require Authen::SASL;
+
+    my $mechanisms = $self->supports('AUTH',500,["Command unknown: 'AUTH'"]);
+    return unless defined $mechanisms;
+
+    my $sasl;
+
+    if (ref($username) and UNIVERSAL::isa($username,'Authen::SASL')) {
+      $sasl = $username;
+      $sasl->mechanism($mechanisms);
+    }
+    else {
+      die "auth(username, password)" if not length $username;
+      $sasl = Authen::SASL->new(mechanism=> $mechanisms,
+				callback => { user => $username,
+                                              pass => $password,
+					      authname => $username,
+                                            });
+    }
+
+    # We should probably allow the user to pass the host, but I don't
+    # currently know and SASL mechanisms that are used by smtp that need it
+    my $client = $sasl->client_new('smtp',${*$self}{'net_smtp_host'},0);
+    my $str    = $client->client_start;
+    # We dont support sasl mechanisms that encrypt the socket traffic.
+    # todo that we would really need to change the ISA hierarchy
+    # so we dont inherit from IO::Socket, but instead hold it in an attribute
+
+    my @cmd = ("AUTH", $client->mechanism);
+    my $code;
+
+    push @cmd, MIME::Base64::encode_base64($str,'')
+      if defined $str and length $str;
+
+    while (($code = $self->command(@cmd)->response()) == CMD_MORE) {
+      @cmd = (MIME::Base64::encode_base64(
+	$client->client_step(
+	  MIME::Base64::decode_base64(
+	    ($self->message)[0]
+	  )
+	), ''
+      ));
+    }
+
+    $code == CMD_OK;
+}
+
+sub hello
+{
+ my $me = shift;
+ my $domain = shift || "localhost.localdomain";
+ my $ok = $me->_EHLO($domain);
+ my @msg = $me->message;
+
+ if($ok)
+  {
+   my $h = ${*$me}{'net_smtp_esmtp'} = {};
+   my $ln;
+   foreach $ln (@msg) {
+     $h->{uc $1} = $2
+	if $ln =~ /(\w+)\b[= \t]*([^\n]*)/;
+    }
+  }
+ elsif($me->status == CMD_ERROR) 
+  {
+   @msg = $me->message
+	if $ok = $me->_HELO($domain);
+  }
+
+ return undef unless $ok;
+
+ $msg[0] =~ /\A\s*(\S+)/;
+ return ($1 || " ");
+}
+
+sub supports {
+    my $self = shift;
+    my $cmd = uc shift;
+    return ${*$self}{'net_smtp_esmtp'}->{$cmd}
+	if exists ${*$self}{'net_smtp_esmtp'}->{$cmd};
+    $self->set_status(@_)
+	if @_;
+    return;
+}
+
+sub _addr {
+  my $self = shift;
+  my $addr = shift;
+  $addr = "" unless defined $addr;
+
+  if (${*$self}{'net_smtp_exact_addr'}) {
+    return $1 if $addr =~ /^\s*(<.*>)\s*$/s;
+  }
+  else {
+    return $1 if $addr =~ /(<[^>]*>)/;
+    $addr =~ s/^\s+|\s+$//sg;
+  }
+
+  "<$addr>";
+}
+
+sub mail
+{
+ my $me = shift;
+ my $addr = _addr($me, shift);
+ my $opts = "";
+
+ if(@_)
+  {
+   my %opt = @_;
+   my($k,$v);
+
+   if(exists ${*$me}{'net_smtp_esmtp'})
+    {
+     my $esmtp = ${*$me}{'net_smtp_esmtp'};
+
+     if(defined($v = delete $opt{Size}))
+      {
+       if(exists $esmtp->{SIZE})
+        {
+         $opts .= sprintf " SIZE=%d", $v + 0
+        }
+       else
+        {
+	 carp 'Net::SMTP::mail: SIZE option not supported by host';
+        }
+      }
+
+     if(defined($v = delete $opt{Return}))
+      {
+       if(exists $esmtp->{DSN})
+        {
+	 $opts .= " RET=" . ((uc($v) eq "FULL") ? "FULL" : "HDRS");
+        }
+       else
+        {
+	 carp 'Net::SMTP::mail: DSN option not supported by host';
+        }
+      }
+
+     if(defined($v = delete $opt{Bits}))
+      {
+       if($v eq "8")
+        {
+         if(exists $esmtp->{'8BITMIME'})
+          {
+	 $opts .= " BODY=8BITMIME";
+          }
+         else
+          {
+	 carp 'Net::SMTP::mail: 8BITMIME option not supported by host';
+          }
+        }
+       elsif($v eq "binary")
+        {
+         if(exists $esmtp->{'BINARYMIME'} && exists $esmtp->{'CHUNKING'})
+          {
+   $opts .= " BODY=BINARYMIME";
+   ${*$me}{'net_smtp_chunking'} = 1;
+          }
+         else
+          {
+   carp 'Net::SMTP::mail: BINARYMIME option not supported by host';
+          }
+        }
+       elsif(exists $esmtp->{'8BITMIME'} or exists $esmtp->{'BINARYMIME'})
+        {
+   $opts .= " BODY=7BIT";
+        }
+       else
+        {
+   carp 'Net::SMTP::mail: 8BITMIME and BINARYMIME options not supported by host';
+        }
+      }
+
+     if(defined($v = delete $opt{Transaction}))
+      {
+       if(exists $esmtp->{CHECKPOINT})
+        {
+	 $opts .= " TRANSID=" . _addr($me, $v);
+        }
+       else
+        {
+	 carp 'Net::SMTP::mail: CHECKPOINT option not supported by host';
+        }
+      }
+
+     if(defined($v = delete $opt{Envelope}))
+      {
+       if(exists $esmtp->{DSN})
+        {
+	 $v =~ s/([^\041-\176]|=|\+)/sprintf "+%02x", ord($1)/sge;
+	 $opts .= " ENVID=$v"
+        }
+       else
+        {
+	 carp 'Net::SMTP::mail: DSN option not supported by host';
+        }
+      }
+
+     carp 'Net::SMTP::recipient: unknown option(s) '
+		. join(" ", keys %opt)
+		. ' - ignored'
+	if scalar keys %opt;
+    }
+   else
+    {
+     carp 'Net::SMTP::mail: ESMTP not supported by host - options discarded :-(';
+    }
+  }
+
+ $me->_MAIL("FROM:".$addr.$opts);
+}
+
+sub send	  { my $me = shift; $me->_SEND("FROM:" . _addr($me, $_[0])) }
+sub send_or_mail  { my $me = shift; $me->_SOML("FROM:" . _addr($me, $_[0])) }
+sub send_and_mail { my $me = shift; $me->_SAML("FROM:" . _addr($me, $_[0])) }
+
+sub reset
+{
+ my $me = shift;
+
+ $me->dataend()
+	if(exists ${*$me}{'net_smtp_lastch'});
+
+ $me->_RSET();
+}
+
+
+sub recipient
+{
+ my $smtp = shift;
+ my $opts = "";
+ my $skip_bad = 0;
+
+ if(@_ && ref($_[-1]))
+  {
+   my %opt = %{pop(@_)};
+   my $v;
+
+   $skip_bad = delete $opt{'SkipBad'};
+
+   if(exists ${*$smtp}{'net_smtp_esmtp'})
+    {
+     my $esmtp = ${*$smtp}{'net_smtp_esmtp'};
+
+     if(defined($v = delete $opt{Notify}))
+      {
+       if(exists $esmtp->{DSN})
+        {
+	 $opts .= " NOTIFY=" . join(",",map { uc $_ } @$v)
+        }
+       else
+        {
+	 carp 'Net::SMTP::recipient: DSN option not supported by host';
+        }
+      }
+
+     carp 'Net::SMTP::recipient: unknown option(s) '
+		. join(" ", keys %opt)
+		. ' - ignored'
+	if scalar keys %opt;
+    }
+   elsif(%opt)
+    {
+     carp 'Net::SMTP::recipient: ESMTP not supported by host - options discarded :-(';
+    }
+  }
+
+ my @ok;
+ my $addr;
+ foreach $addr (@_) 
+  {
+    if($smtp->_RCPT("TO:" . _addr($smtp, $addr) . $opts)) {
+      push(@ok,$addr) if $skip_bad;
+    }
+    elsif(!$skip_bad) {
+      return 0;
+    }
+  }
+
+ return $skip_bad ? @ok : 1;
+}
+
+BEGIN {
+  *to  = \&recipient;
+  *cc  = \&recipient;
+  *bcc = \&recipient;
+}
+
+sub data
+{
+ my $me = shift;
+
+ if(exists ${*$me}{'net_smtp_chunking'})
+  {
+   carp 'Net::SMTP::data: CHUNKING extension in use, must call bdat instead';
+  }
+ else
+  {
+   my $ok = $me->_DATA() && $me->datasend(@_);
+
+   $ok && @_ ? $me->dataend
+	     : $ok;
+  }
+}
+
+sub bdat
+{
+ my $me = shift;
+
+ if(exists ${*$me}{'net_smtp_chunking'})
+  {
+   my $data = shift;
+
+   $me->_BDAT(length $data) && $me->rawdatasend($data) &&
+     $me->response() == CMD_OK;
+  }
+ else
+  {
+   carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+  }
+}
+
+sub bdatlast
+{
+ my $me = shift;
+
+ if(exists ${*$me}{'net_smtp_chunking'})
+  {
+   my $data = shift;
+
+   $me->_BDAT(length $data, "LAST") && $me->rawdatasend($data) &&
+     $me->response() == CMD_OK;
+  }
+ else
+  {
+   carp 'Net::SMTP::bdat: CHUNKING extension is not in use, call data instead';
+  }
+}
+
+sub datafh {
+  my $me = shift;
+  return unless $me->_DATA();
+  return $me->tied_fh;
+}
+
+sub expand
+{
+ my $me = shift;
+
+ $me->_EXPN(@_) ? ($me->message)
+		: ();
+}
+
+
+sub verify { shift->_VRFY(@_) }
+
+sub help
+{
+ my $me = shift;
+
+ $me->_HELP(@_) ? scalar $me->message
+	        : undef;
+}
+
+sub quit
+{
+ my $me = shift;
+
+ $me->_QUIT;
+ $me->close;
+}
+
+sub DESTROY
+{
+# ignore
+}
+
+##
+## RFC821 commands
+##
+
+sub _EHLO { shift->command("EHLO", @_)->response()  == CMD_OK }   
+sub _HELO { shift->command("HELO", @_)->response()  == CMD_OK }   
+sub _MAIL { shift->command("MAIL", @_)->response()  == CMD_OK }   
+sub _RCPT { shift->command("RCPT", @_)->response()  == CMD_OK }   
+sub _SEND { shift->command("SEND", @_)->response()  == CMD_OK }   
+sub _SAML { shift->command("SAML", @_)->response()  == CMD_OK }   
+sub _SOML { shift->command("SOML", @_)->response()  == CMD_OK }   
+sub _VRFY { shift->command("VRFY", @_)->response()  == CMD_OK }   
+sub _EXPN { shift->command("EXPN", @_)->response()  == CMD_OK }   
+sub _HELP { shift->command("HELP", @_)->response()  == CMD_OK }   
+sub _RSET { shift->command("RSET")->response()	    == CMD_OK }   
+sub _NOOP { shift->command("NOOP")->response()	    == CMD_OK }   
+sub _QUIT { shift->command("QUIT")->response()	    == CMD_OK }   
+sub _DATA { shift->command("DATA")->response()	    == CMD_MORE } 
+sub _BDAT { shift->command("BDAT", @_) }
+sub _TURN { shift->unsupported(@_); } 			   	  
+sub _ETRN { shift->command("ETRN", @_)->response()  == CMD_OK }
+sub _AUTH { shift->command("AUTH", @_)->response()  == CMD_OK }   
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::SMTP - Simple Mail Transfer Protocol Client
+
+=head1 SYNOPSIS
+
+    use Net::SMTP;
+
+    # Constructors
+    $smtp = Net::SMTP->new('mailhost');
+    $smtp = Net::SMTP->new('mailhost', Timeout => 60);
+
+=head1 DESCRIPTION
+
+This module implements a client interface to the SMTP and ESMTP
+protocol, enabling a perl5 application to talk to SMTP servers. This
+documentation assumes that you are familiar with the concepts of the
+SMTP protocol described in RFC821.
+
+A new Net::SMTP object must be created with the I<new> method. Once
+this has been done, all SMTP commands are accessed through this object.
+
+The Net::SMTP class is a subclass of Net::Cmd and IO::Socket::INET.
+
+=head1 EXAMPLES
+
+This example prints the mail domain name of the SMTP server known as mailhost:
+
+    #!/usr/local/bin/perl -w
+
+    use Net::SMTP;
+
+    $smtp = Net::SMTP->new('mailhost');
+    print $smtp->domain,"\n";
+    $smtp->quit;
+
+This example sends a small message to the postmaster at the SMTP server
+known as mailhost:
+
+    #!/usr/local/bin/perl -w
+
+    use Net::SMTP;
+
+    $smtp = Net::SMTP->new('mailhost');
+
+    $smtp->mail($ENV{USER});
+    $smtp->to('postmaster');
+
+    $smtp->data();
+    $smtp->datasend("To: postmaster\n");
+    $smtp->datasend("\n");
+    $smtp->datasend("A simple test message\n");
+    $smtp->dataend();
+
+    $smtp->quit;
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new Net::SMTP [ HOST, ] [ OPTIONS ]
+
+This is the constructor for a new Net::SMTP object. C<HOST> is the
+name of the remote host to which an SMTP connection is required.
+
+If C<HOST> is an array reference then each value will be attempted
+in turn until a connection is made.
+
+If C<HOST> is not given, then the C<SMTP_Host> specified in C<Net::Config>
+will be used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Hello> - SMTP requires that you identify yourself. This option
+specifies a string to pass as your mail domain. If not
+given a guess will be taken.
+
+B<LocalAddr> and B<LocalPort> - These parameters are passed directly
+to IO::Socket to allow binding the socket to a local port.
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+SMTP server (default: 120)
+
+B<ExactAddresses> - If true the all ADDRESS arguments must be as
+defined by C<addr-spec> in RFC2822. If not given, or false, then
+Net::SMTP will attempt to extract the address from the value passed.
+
+B<Debug> - Enable debugging information
+
+
+Example:
+
+
+    $smtp = Net::SMTP->new('mailhost',
+			   Hello => 'my.mail.domain'
+			   Timeout => 30,
+                           Debug   => 1,
+			  );
+
+=back
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item banner ()
+
+Returns the banner message which the server replied with when the
+initial connection was made.
+
+=item domain ()
+
+Returns the domain that the remote SMTP server identified itself as during
+connection.
+
+=item hello ( DOMAIN )
+
+Tell the remote server the mail domain which you are in using the EHLO
+command (or HELO if EHLO fails).  Since this method is invoked
+automatically when the Net::SMTP object is constructed the user should
+normally not have to call it manually.
+
+=item etrn ( DOMAIN )
+
+Request a queue run for the DOMAIN given.
+
+=item auth ( USERNAME, PASSWORD )
+
+Attempt SASL authentication.
+
+=item mail ( ADDRESS [, OPTIONS] )
+
+=item send ( ADDRESS )
+
+=item send_or_mail ( ADDRESS )
+
+=item send_and_mail ( ADDRESS )
+
+Send the appropriate command to the server MAIL, SEND, SOML or SAML. C<ADDRESS>
+is the address of the sender. This initiates the sending of a message. The
+method C<recipient> should be called for each address that the message is to
+be sent to.
+
+The C<mail> method can some additional ESMTP OPTIONS which is passed
+in hash like fashion, using key and value pairs.  Possible options are:
+
+ Size        => <bytes>
+ Return      => "FULL" | "HDRS"
+ Bits        => "7" | "8" | "binary"
+ Transaction => <ADDRESS>
+ Envelope    => <ENVID>
+
+The C<Return> and C<Envelope> parameters are used for DSN (Delivery
+Status Notification).
+
+=item reset ()
+
+Reset the status of the server. This may be called after a message has been 
+initiated, but before any data has been sent, to cancel the sending of the
+message.
+
+=item recipient ( ADDRESS [, ADDRESS [ ...]] [, OPTIONS ] )
+
+Notify the server that the current message should be sent to all of the
+addresses given. Each address is sent as a separate command to the server.
+Should the sending of any address result in a failure then the
+process is aborted and a I<false> value is returned. It is up to the
+user to call C<reset> if they so desire.
+
+The C<recipient> method can some additional OPTIONS which is passed
+in hash like fashion, using key and value pairs.  Possible options are:
+
+ Notify    =>
+ SkipBad   => ignore bad addresses
+
+If C<SkipBad> is true the C<recipient> will not return an error when a
+bad address is encountered and it will return an array of addresses
+that did succeed.
+
+  $smtp->recipient($recipient1,$recipient2);  # Good
+  $smtp->recipient($recipient1,$recipient2, { SkipBad => 1 });  # Good
+  $smtp->recipient("$recipient,$recipient2"); # BAD   
+
+=item to ( ADDRESS [, ADDRESS [...]] )
+
+=item cc ( ADDRESS [, ADDRESS [...]] )
+
+=item bcc ( ADDRESS [, ADDRESS [...]] )
+
+Synonyms for C<recipient>.
+
+=item data ( [ DATA ] )
+
+Initiate the sending of the data from the current message. 
+
+C<DATA> may be a reference to a list or a list. If specified the contents
+of C<DATA> and a termination string C<".\r\n"> is sent to the server. And the
+result will be true if the data was accepted.
+
+If C<DATA> is not specified then the result will indicate that the server
+wishes the data to be sent. The data must then be sent using the C<datasend>
+and C<dataend> methods described in L<Net::Cmd>.
+
+=item expand ( ADDRESS )
+
+Request the server to expand the given address Returns an array
+which contains the text read from the server.
+
+=item verify ( ADDRESS )
+
+Verify that C<ADDRESS> is a legitimate mailing address.
+
+=item help ( [ $subject ] )
+
+Request help text from the server. Returns the text or undef upon failure
+
+=item quit ()
+
+Send the QUIT command to the remote SMTP server and close the socket connection.
+
+=back
+
+=head1 ADDRESSES
+
+Net::SMTP attempts to DWIM with addresses that are passed. For
+example an application might extract The From: line from an email
+and pass that to mail(). While this may work, it is not reccomended.
+The application should really use a module like L<Mail::Address>
+to extract the mail address and pass that.
+
+If C<ExactAddresses> is passed to the contructor, then addresses
+should be a valid rfc2821-quoted address, although Net::SMTP will
+accept accept the address surrounded by angle brackets.
+
+ funny user@domain      WRONG
+ "funny user"@domain    RIGHT, recommended
+ <"funny user"@domain>  OK
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/SMTP.pm#31 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/SNPP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,414 @@
+# Net::SNPP.pm
+#
+# Copyright (c) 1995-1997 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::SNPP;
+
+require 5.001;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
+use Socket 1.3;
+use Carp;
+use IO::Socket;
+use Net::Cmd;
+use Net::Config;
+
+$VERSION = "1.11"; # $Id:$
+@ISA     = qw(Net::Cmd IO::Socket::INET);
+@EXPORT  = (qw(CMD_2WAYERROR CMD_2WAYOK CMD_2WAYQUEUED), @Net::Cmd::EXPORT);
+
+sub CMD_2WAYERROR  () { 7 }
+sub CMD_2WAYOK     () { 8 }
+sub CMD_2WAYQUEUED () { 9 }
+
+sub new
+{
+ my $self = shift;
+ my $type = ref($self) || $self;
+ my $host = shift if @_ % 2;
+ my %arg  = @_; 
+ my $hosts = defined $host ? [ $host ] : $NetConfig{snpp_hosts};
+ my $obj;
+
+ my $h;
+ foreach $h (@{$hosts})
+  {
+   $obj = $type->SUPER::new(PeerAddr => ($host = $h), 
+			    PeerPort => $arg{Port} || 'snpp(444)',
+			    Proto    => 'tcp',
+			    Timeout  => defined $arg{Timeout}
+						? $arg{Timeout}
+						: 120
+			    ) and last;
+  }
+
+ return undef
+	unless defined $obj;
+
+ ${*$obj}{'net_snpp_host'} = $host;
+
+ $obj->autoflush(1);
+
+ $obj->debug(exists $arg{Debug} ? $arg{Debug} : undef);
+
+ unless ($obj->response() == CMD_OK)
+  {
+   $obj->close();
+   return undef;
+  }
+
+ $obj;
+}
+
+##
+## User interface methods
+##
+
+sub pager_id
+{
+ @_ == 2 or croak 'usage: $snpp->pager_id( PAGER_ID )';
+ shift->_PAGE(@_);
+}
+
+sub content
+{
+ @_ == 2 or croak 'usage: $snpp->content( MESSAGE )';
+ shift->_MESS(@_);
+}
+
+sub send
+{
+ my $me = shift;
+
+ if(@_)
+  {
+   my %arg = @_;
+
+   if(exists $arg{Pager})
+    {
+     my $pagers = ref($arg{Pager}) ? $arg{Pager} : [ $arg{Pager} ];
+     my $pager;
+     foreach $pager (@$pagers)
+      {
+       $me->_PAGE($pager) || return 0
+      }
+    }
+
+   $me->_MESS($arg{Message}) || return 0
+	if(exists $arg{Message});
+
+   $me->hold($arg{Hold}) || return 0
+	if(exists $arg{Hold});
+
+   $me->hold($arg{HoldLocal},1) || return 0
+	if(exists $arg{HoldLocal});
+
+   $me->_COVE($arg{Coverage}) || return 0
+	if(exists $arg{Coverage});
+
+   $me->_ALER($arg{Alert} ? 1 : 0) || return 0
+	if(exists $arg{Alert});
+
+   $me->service_level($arg{ServiceLevel}) || return 0
+	if(exists $arg{ServiceLevel});
+  }
+
+ $me->_SEND();
+}
+
+sub data
+{
+ my $me = shift;
+
+ my $ok = $me->_DATA() && $me->datasend(@_);
+
+ return $ok
+	unless($ok && @_);
+
+ $me->dataend;
+}
+
+sub login
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $snpp->login( USER [, PASSWORD ])';
+ shift->_LOGI(@_);
+}
+
+sub help
+{
+ @_ == 1 or croak 'usage: $snpp->help()';
+ my $me = shift;
+
+ return $me->_HELP() ? $me->message
+		     : undef;
+}
+
+sub xwho
+{
+ @_ == 1 or croak 'usage: $snpp->xwho()';
+ my $me = shift;
+
+ $me->_XWHO or return undef;
+
+ my(%hash,$line);
+ my @msg = $me->message;
+ pop @msg; # Remove command complete line
+
+ foreach $line (@msg) {
+   $line =~ /^\s*(\S+)\s*(.*)/ and $hash{$1} = $2;
+ }
+
+ \%hash;
+}
+
+sub service_level
+{
+ @_ == 2 or croak 'usage: $snpp->service_level( LEVEL )';
+ my $me = shift;
+ my $level = int(shift);
+
+ if($level < 0 || $level > 11)
+  {
+   $me->set_status(550,"Invalid Service Level");
+   return 0;
+  }
+
+ $me->_LEVE($level);
+}
+
+sub alert
+{
+ @_ == 1 || @_ == 2 or croak 'usage: $snpp->alert( VALUE )';
+ my $me = shift;
+ my $value  = (@_ == 1 || shift) ? 1 : 0;
+
+ $me->_ALER($value);
+}
+
+sub coverage
+{
+ @_ == 1 or croak 'usage: $snpp->coverage( AREA )';
+ shift->_COVE(@_);
+}
+
+sub hold
+{
+ @_ == 2 || @_ == 3 or croak 'usage: $snpp->hold( TIME [, LOCAL ] )';
+ my $me = shift;
+ my $time = shift;
+ my $local = (shift) ? "" : " +0000";
+
+ my @g = reverse((gmtime($time))[0..5]);
+ $g[1] += 1;
+ $g[0] %= 100;
+
+ $me->_HOLD( sprintf("%02d%02d%02d%02d%02d%02d%s",@g,$local));
+}
+
+sub caller_id
+{
+ @_ == 2 or croak 'usage: $snpp->caller_id( CALLER_ID )';
+ shift->_CALL(@_);
+}
+
+sub subject
+{
+ @_ == 2 or croak 'usage: $snpp->subject( SUBJECT )';
+ shift->_SUBJ(@_);
+}
+
+sub two_way
+{
+ @_ == 1 or croak 'usage: $snpp->two_way()';
+ shift->_2WAY();
+}
+
+sub quit
+{
+ @_ == 1 or croak 'usage: $snpp->quit()';
+ my $snpp = shift;
+
+ $snpp->_QUIT;
+ $snpp->close;
+}
+
+##
+## IO/perl methods
+##
+
+sub DESTROY
+{
+ my $snpp = shift;
+ defined(fileno($snpp)) && $snpp->quit
+}
+
+##
+## Over-ride methods (Net::Cmd)
+##
+
+sub debug_text
+{
+ $_[2] =~ s/^((logi|page)\s+\S+\s+)\S+/$1 xxxx/io;
+ $_[2];
+}
+
+sub parse_response
+{
+ return ()
+    unless $_[1] =~ s/^(\d\d\d)(.?)//o;
+ my($code,$more) = ($1, $2 eq "-");
+
+ $more ||= $code == 214;
+
+ ($code,$more);
+}
+
+##
+## RFC1861 commands
+##
+
+# Level 1
+
+sub _PAGE { shift->command("PAGE", @_)->response()  == CMD_OK }   
+sub _MESS { shift->command("MESS", @_)->response()  == CMD_OK }   
+sub _RESE { shift->command("RESE")->response()  == CMD_OK }   
+sub _SEND { shift->command("SEND")->response()  == CMD_OK }   
+sub _QUIT { shift->command("QUIT")->response()  == CMD_OK }   
+sub _HELP { shift->command("HELP")->response()  == CMD_OK }   
+sub _DATA { shift->command("DATA")->response()  == CMD_MORE }   
+sub _SITE { shift->command("SITE",@_) }   
+
+# Level 2
+
+sub _LOGI { shift->command("LOGI", @_)->response()  == CMD_OK }   
+sub _LEVE { shift->command("LEVE", @_)->response()  == CMD_OK }   
+sub _ALER { shift->command("ALER", @_)->response()  == CMD_OK }   
+sub _COVE { shift->command("COVE", @_)->response()  == CMD_OK }   
+sub _HOLD { shift->command("HOLD", @_)->response()  == CMD_OK }   
+sub _CALL { shift->command("CALL", @_)->response()  == CMD_OK }   
+sub _SUBJ { shift->command("SUBJ", @_)->response()  == CMD_OK }   
+
+# NonStandard
+
+sub _XWHO { shift->command("XWHO")->response()  == CMD_OK }   
+
+1;
+__END__
+
+=head1 NAME
+
+Net::SNPP - Simple Network Pager Protocol Client
+
+=head1 SYNOPSIS
+
+    use Net::SNPP;
+    
+    # Constructors
+    $snpp = Net::SNPP->new('snpphost');
+    $snpp = Net::SNPP->new('snpphost', Timeout => 60);
+
+=head1 NOTE
+
+This module is not complete, yet !
+
+=head1 DESCRIPTION
+
+This module implements a client interface to the SNPP protocol, enabling
+a perl5 application to talk to SNPP servers. This documentation assumes
+that you are familiar with the SNPP protocol described in RFC1861.
+
+A new Net::SNPP object must be created with the I<new> method. Once
+this has been done, all SNPP commands are accessed through this object.
+
+=head1 EXAMPLES
+
+This example will send a pager message in one hour saying "Your lunch is ready"
+
+    #!/usr/local/bin/perl -w
+    
+    use Net::SNPP;
+    
+    $snpp = Net::SNPP->new('snpphost');
+    
+    $snpp->send( Pager   => $some_pager_number,
+	         Message => "Your lunch is ready",
+	         Alert   => 1,
+	         Hold    => time + 3600, # lunch ready in 1 hour :-)
+	       ) || die $snpp->message;
+    
+    $snpp->quit;
+
+=head1 CONSTRUCTOR
+
+=over 4
+
+=item new ( [ HOST, ] [ OPTIONS ] )
+
+This is the constructor for a new Net::SNPP object. C<HOST> is the
+name of the remote host to which a SNPP connection is required.
+
+If C<HOST> is not given, then the C<SNPP_Host> specified in C<Net::Config>
+will be used.
+
+C<OPTIONS> are passed in a hash like fashion, using key and value pairs.
+Possible options are:
+
+B<Timeout> - Maximum time, in seconds, to wait for a response from the
+SNPP server (default: 120)
+
+B<Debug> - Enable debugging information
+
+
+Example:
+
+
+    $snpp = Net::SNPP->new('snpphost',
+			   Debug => 1,
+			  );
+
+=head1 METHODS
+
+Unless otherwise stated all methods return either a I<true> or I<false>
+value, with I<true> meaning that the operation was a success. When a method
+states that it returns a value, failure will be returned as I<undef> or an
+empty list.
+
+=over 4
+
+=item reset ()
+
+=item help ()
+
+Request help text from the server. Returns the text or undef upon failure
+
+=item quit ()
+
+Send the QUIT command to the remote SNPP server and close the socket connection.
+
+=back
+
+=head1 EXPORTS
+
+C<Net::SNPP> exports all that C<Net::CMD> exports, plus three more subroutines
+that can bu used to compare against the result of C<status>. These are :-
+C<CMD_2WAYERROR>, C<CMD_2WAYOK>, and C<CMD_2WAYQUEUED>.
+
+=head1 SEE ALSO
+
+L<Net::Cmd>
+RFC1861
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1997 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/Time.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,151 @@
+# Net::Time.pm
+#
+# Copyright (c) 1995-1998 Graham Barr <gbarr@pobox.com>. All rights reserved.
+# This program is free software; you can redistribute it and/or
+# modify it under the same terms as Perl itself.
+
+package Net::Time;
+
+use strict;
+use vars qw($VERSION @ISA @EXPORT_OK $TIMEOUT);
+use Carp;
+use IO::Socket;
+require Exporter;
+use Net::Config;
+use IO::Select;
+
+@ISA = qw(Exporter);
+@EXPORT_OK = qw(inet_time inet_daytime);
+
+$VERSION = "2.09"; # $Id: //depot/libnet/Net/Time.pm#9 $
+
+$TIMEOUT = 120;
+
+sub _socket
+{
+ my($pname,$pnum,$host,$proto,$timeout) = @_;
+
+ $proto ||= 'udp';
+
+ my $port = (getservbyname($pname, $proto))[2] || $pnum;
+
+ my $hosts = defined $host ? [ $host ] : $NetConfig{$pname . '_hosts'};
+
+ my $me;
+
+ foreach $host (@$hosts)
+  {
+   $me = IO::Socket::INET->new(PeerAddr => $host,
+    	    	    	       PeerPort => $port,
+    	    	    	       Proto    => $proto
+    	    	    	      ) and last;
+  }
+
+ return unless $me;
+
+ $me->send("\n")
+	if $proto eq 'udp';
+
+ $timeout = $TIMEOUT
+	unless defined $timeout;
+
+ IO::Select->new($me)->can_read($timeout)
+	? $me
+	: undef;
+}
+
+sub inet_time
+{
+ my $s = _socket('time',37,@_) || return undef;
+ my $buf = '';
+ my $offset = 0 | 0;
+
+ return undef
+	unless $s->recv($buf, length(pack("N",0)));
+
+ # unpack, we | 0 to ensure we have an unsigned
+ my $time = (unpack("N",$buf))[0] | 0;
+
+ # the time protocol return time in seconds since 1900, convert
+ # it to a the required format
+
+ if($^O eq "MacOS") {
+   # MacOS return seconds since 1904, 1900 was not a leap year.
+   $offset = (4 * 31536000) | 0;
+ }
+ else {
+   # otherwise return seconds since 1972, there were 17 leap years between
+   # 1900 and 1972
+   $offset =  (70 * 31536000 + 17 * 86400) | 0;
+ }
+
+ $time - $offset;
+}
+
+sub inet_daytime
+{
+ my $s = _socket('daytime',13,@_) || return undef;
+ my $buf = '';
+
+ $s->recv($buf, 1024) ? $buf
+    	              : undef;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Net::Time - time and daytime network client interface
+
+=head1 SYNOPSIS
+
+    use Net::Time qw(inet_time inet_daytime);
+
+    print inet_time();		# use default host from Net::Config
+    print inet_time('localhost');
+    print inet_time('localhost', 'tcp');
+
+    print inet_daytime();	# use default host from Net::Config
+    print inet_daytime('localhost');
+    print inet_daytime('localhost', 'tcp');
+
+=head1 DESCRIPTION
+
+C<Net::Time> provides subroutines that obtain the time on a remote machine.
+
+=over 4
+
+=item inet_time ( [HOST [, PROTOCOL [, TIMEOUT]]])
+
+Obtain the time on C<HOST>, or some default host if C<HOST> is not given
+or not defined, using the protocol as defined in RFC868. The optional
+argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
+C<udp>. The result will be a time value in the same units as returned
+by time() or I<undef> upon failure.
+
+=item inet_daytime ( [HOST [, PROTOCOL [, TIMEOUT]]])
+
+Obtain the time on C<HOST>, or some default host if C<HOST> is not given
+or not defined, using the protocol as defined in RFC867. The optional
+argument C<PROTOCOL> should define the protocol to use, either C<tcp> or
+C<udp>. The result will be an ASCII string or I<undef> upon failure.
+
+=back
+
+=head1 AUTHOR
+
+Graham Barr <gbarr@pobox.com>
+
+=head1 COPYRIGHT
+
+Copyright (c) 1995-1998 Graham Barr. All rights reserved.
+This program is free software; you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/Time.pm#9 $>
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Net/libnetFAQ.pod	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,310 @@
+# Copyright (c) 1997 Graham Barr.
+# All rights reserved.
+
+=head1 NAME
+
+libnetFAQ - libnet Frequently Asked Questions
+
+=head1 DESCRIPTION
+
+=head2 Where to get this document
+
+This document is distributed with the libnet distribution, and is also
+available on the libnet web page at
+
+    http://search.cpan.org/~gbarr/libnet/
+
+=head2 How to contribute to this document
+
+You may mail corrections, additions, and suggestions to me
+gbarr@pobox.com.
+
+=head1 Author and Copyright Information
+
+Copyright (c) 1997-1998 Graham Barr. All rights reserved.
+This document is free; you can redistribute it and/or modify it
+under the terms of the Artistic License.
+
+=head2 Disclaimer
+
+This information is offered in good faith and in the hope that it may
+be of use, but is not guaranteed to be correct, up to date, or suitable
+for any particular purpose whatsoever.  The authors accept no liability
+in respect of this information or its use.
+
+
+=head1 Obtaining and installing libnet
+
+=head2 What is libnet ?
+
+libnet is a collection of perl5 modules which all related to network
+programming. The majority of the modules available provided the
+client side of popular server-client protocols that are used in
+the internet community.
+
+=head2 Which version of perl do I need ?
+
+libnet has been know to work with versions of perl from 5.002 onwards. However
+if your release of perl is prior to perl5.004 then you will need to
+obtain and install the IO distribution from CPAN. If you have perl5.004
+or later then you will have the IO modules in your installation already,
+but CPAN may contain updates.
+
+=head2 What other modules do I need ?
+
+The only modules you will need installed are the modules from the IO
+distribution. If you have perl5.004 or later you will already have
+these modules.
+
+=head2 What machines support libnet ?
+
+libnet itself is an entirely perl-code distribution so it should work
+on any machine that perl runs on. However IO may not work
+with some machines and earlier releases of perl. But this
+should not be the case with perl version 5.004 or later.
+
+=head2 Where can I get the latest libnet release
+
+The latest libnet release is always on CPAN, you will find it
+in 
+
+ http://www.cpan.org/modules/by-module/Net/
+
+The latest release and information is also available on the libnet web page
+at
+
+ http://search.cpan.org/~gbarr/libnet/
+
+=head1 Using Net::FTP
+
+=head2 How do I download files from an FTP server ?
+
+An example taken from an article posted to comp.lang.perl.misc
+
+    #!/your/path/to/perl
+
+    # a module making life easier
+
+    use Net::FTP;
+
+    # for debuging: $ftp = Net::FTP->new('site','Debug',10);
+    # open a connection and log in!
+
+    $ftp = Net::FTP->new('target_site.somewhere.xxx');
+    $ftp->login('username','password');
+
+    # set transfer mode to binary
+
+    $ftp->binary();
+
+    # change the directory on the ftp site
+
+    $ftp->cwd('/some/path/to/somewhere/');
+
+    foreach $name ('file1', 'file2', 'file3') {
+
+    # get's arguments are in the following order:
+    # ftp server's filename
+    # filename to save the transfer to on the local machine
+    # can be simply used as get($name) if you want the same name
+
+      $ftp->get($name,$name);
+    }
+
+    # ftp done!
+
+    $ftp->quit;
+
+=head2 How do I transfer files in binary mode ?
+
+To transfer files without <LF><CR> translation Net::FTP provides
+the C<binary> method
+
+    $ftp->binary;
+
+=head2 How can I get the size of a file on a remote FTP server ?
+
+=head2 How can I get the modification time of a file on a remote FTP server ?
+
+=head2 How can I change the permissions of a file on a remote server ?
+
+The FTP protocol does not have a command for changing the permissions
+of a file on the remote server. But some ftp servers may allow a chmod
+command to be issued via a SITE command, eg
+
+    $ftp->quot('site chmod 0777',$filename);
+
+But this is not guaranteed to work.
+
+=head2 Can I do a reget operation like the ftp command ?
+
+=head2 How do I get a directory listing from an FTP server ?
+
+=head2 Changing directory to "" does not fail ?
+
+Passing an argument of "" to ->cwd() has the same affect of calling ->cwd()
+without any arguments. Turn on Debug (I<See below>) and you will see what is
+happening
+
+    $ftp = Net::FTP->new($host, Debug => 1);
+    $ftp->login;
+    $ftp->cwd("");
+
+gives
+
+    Net::FTP=GLOB(0x82196d8)>>> CWD /
+    Net::FTP=GLOB(0x82196d8)<<< 250 CWD command successful.
+
+=head2 I am behind a SOCKS firewall, but the Firewall option does not work ?
+
+The Firewall option is only for support of one type of firewall. The type
+supported is an ftp proxy.
+
+To use Net::FTP, or any other module in the libnet distribution,
+through a SOCKS firewall you must create a socks-ified perl executable
+by compiling perl with the socks library.
+
+=head2 I am behind an FTP proxy firewall, but cannot access machines outside ?
+
+Net::FTP implements the most popular ftp proxy firewall approach. The scheme
+implemented is that where you log in to the firewall with C<user@hostname>
+
+I have heard of one other type of firewall which requires a login to the
+firewall with an account, then a second login with C<user@hostname>. You can
+still use Net::FTP to traverse these firewalls, but a more manual approach
+must be taken, eg
+
+    $ftp = Net::FTP->new($firewall) or die $@;
+    $ftp->login($firewall_user, $firewall_passwd) or die $ftp->message;
+    $ftp->login($ext_user . '@' . $ext_host, $ext_passwd) or die $ftp->message.
+
+=head2 My ftp proxy firewall does not listen on port 21
+
+FTP servers usually listen on the same port number, port 21, as any other
+FTP server. But there is no reason why this has to be the case.
+
+If you pass a port number to Net::FTP then it assumes this is the port
+number of the final destination. By default Net::FTP will always try
+to connect to the firewall on port 21.
+
+Net::FTP uses IO::Socket to open the connection and IO::Socket allows
+the port number to be specified as part of the hostname. So this problem
+can be resolved by either passing a Firewall option like C<"hostname:1234">
+or by setting the C<ftp_firewall> option in Net::Config to be a string
+in in the same form.
+
+=head2 Is it possible to change the file permissions of a file on an FTP server ?
+
+The answer to this is "maybe". The FTP protocol does not specify a command to change
+file permissions on a remote host. However many servers do allow you to run the
+chmod command via the C<SITE> command. This can be done with
+
+  $ftp->site('chmod','0775',$file);
+
+=head2 I have seen scripts call a method message, but cannot find it documented ?
+
+Net::FTP, like several other packages in libnet, inherits from Net::Cmd, so
+all the methods described in Net::Cmd are also available on Net::FTP
+objects.
+
+=head2 Why does Net::FTP not implement mput and mget methods
+
+The quick answer is because they are easy to implement yourself. The long
+answer is that to write these in such a way that multiple platforms are
+supported correctly would just require too much code. Below are
+some examples how you can implement these yourself.
+
+sub mput {
+  my($ftp,$pattern) = @_;
+  foreach my $file (glob($pattern)) {
+    $ftp->put($file) or warn $ftp->message;
+  }
+}
+
+sub mget {
+  my($ftp,$pattern) = @_;
+  foreach my $file ($ftp->ls($pattern)) {
+    $ftp->get($file) or warn $ftp->message;
+  }
+}
+
+
+=head1 Using Net::SMTP
+
+=head2 Why can't the part of an Email address after the @ be used as the hostname ?
+
+The part of an Email address which follows the @ is not necessarily a hostname,
+it is a mail domain. To find the name of a host to connect for a mail domain
+you need to do a DNS MX lookup
+
+=head2 Why does Net::SMTP not do DNS MX lookups ?
+
+Net::SMTP implements the SMTP protocol. The DNS MX lookup is not part
+of this protocol.
+
+=head2 The verify method always returns true ?
+
+Well it may seem that way, but it does not. The verify method returns true
+if the command succeeded. If you pass verify an address which the
+server would normally have to forward to another machine, the command
+will succeed with something like
+
+    252 Couldn't verify <someone@there> but will attempt delivery anyway
+
+This command will fail only if you pass it an address in a domain
+the server directly delivers for, and that address does not exist.
+
+=head1 Debugging scripts
+
+=head2 How can I debug my scripts that use Net::* modules ?
+
+Most of the libnet client classes allow options to be passed to the
+constructor, in most cases one option is called C<Debug>. Passing
+this option with a non-zero value will turn on a protocol trace, which
+will be sent to STDERR. This trace can be useful to see what commands
+are being sent to the remote server and what responses are being
+received back.
+
+    #!/your/path/to/perl
+
+    use Net::FTP;
+
+    my $ftp = new Net::FTP($host, Debug => 1);
+    $ftp->login('gbarr','password');
+    $ftp->quit;
+
+this script would output something like
+
+ Net::FTP: Net::FTP(2.22)
+ Net::FTP:   Exporter
+ Net::FTP:   Net::Cmd(2.0801)
+ Net::FTP:   IO::Socket::INET
+ Net::FTP:     IO::Socket(1.1603)
+ Net::FTP:       IO::Handle(1.1504)
+
+ Net::FTP=GLOB(0x8152974)<<< 220 imagine FTP server (Version wu-2.4(5) Tue Jul 29 11:17:18 CDT 1997) ready.
+ Net::FTP=GLOB(0x8152974)>>> user gbarr
+ Net::FTP=GLOB(0x8152974)<<< 331 Password required for gbarr.
+ Net::FTP=GLOB(0x8152974)>>> PASS ....
+ Net::FTP=GLOB(0x8152974)<<< 230 User gbarr logged in.  Access restrictions apply.
+ Net::FTP=GLOB(0x8152974)>>> QUIT
+ Net::FTP=GLOB(0x8152974)<<< 221 Goodbye.
+
+The first few lines tell you the modules that Net::FTP uses and their versions,
+this is useful data to me when a user reports a defect. The last seven lines
+show the communication with the server. Each line has three parts. The first
+part is the object itself, this is useful for separating the output
+if you are using multiple objects. The second part is either C<<<<<> to
+show data coming from the server or C<&gt&gt&gt&gt> to show data
+going to the server. The remainder of the line is the command
+being sent or response being received.
+
+=head1 AUTHOR AND COPYRIGHT
+
+Copyright (c) 1997 Graham Barr.
+All rights reserved.
+
+=for html <hr>
+
+I<$Id: //depot/libnet/Net/libnetFAQ.pod#6 $>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/NotesCompiler.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,712 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package NotesCompiler;
+
+use strict;
+use CGI qw(-no_debug :standard start_ul);
+use IniData;
+use RelData;
+use EnvDb;
+use MrpData;
+use IO::File;
+use File::Basename;
+
+
+#
+# Constants.
+#
+
+use constant NOTES_DIREXTENSION => '.RelNotes';
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{iniData} = shift;
+  $self->{comp} = shift;
+  $self->{ver} = shift;
+  $self->{verbose} = shift;
+  $self->{htmlMainFile} = shift;
+  $self->{outputSTDOUTonly} = shift;
+  $self->{htmlNotes} = shift; # flag to render old notes as html or plain text
+  $self->{fh} = undef; # filehandle to write to
+  $self->{envDb} = EnvDb->Open($self->{iniData}, $self->{verbose});
+  # Not using 'use constant' because that requires Utils::PrependEpocRoot to be called at compile-time
+  $self->{notes_store} = Utils::PrependEpocRoot('\\epoc32\\relinfo\\notes'); # constant
+  return $self;
+}
+
+sub DoStandardNotes {
+  my $self = shift;
+  if( !defined ($self->{htmlMainFile} )) {
+    my $filename = $self->{comp}.".".$self->{ver};
+    if ($self->{htmlNotes}) {
+      $filename.=".htmlnotes";
+    } else {
+      $filename.=".textnotes";
+    }
+    $self->{htmlName} = $self->{notes_store} . "\\$filename.html";
+  }
+  else {
+    $self->{htmlName} = $self->{htmlMainFile};
+  }
+  
+  if(!defined ($self->{outputSTDOUTonly})){
+    $self->WriteUnlessAlreadyCompiled(\&PrepareStandardNotes, undef, 1); # sub, filename, cache
+  }
+  else{
+    $self->WriteUnlessAlreadyCompiled(\&PrepareStandardNotes, undef, 0); # sub, filename, cache
+  }
+}
+
+sub DoCompSummary {
+  my $self = shift;
+  if( !defined ($self->{htmlMainFile} )) {
+    $self->{htmlName} = $self->{notes_store} . "\\$self->{comp}.summary.html";
+  }
+  else {
+    $self->{htmlName} = $self->{htmlMainFile};
+  }
+  my $relDataObjects = RelData->OpenSet($self->{iniData}, $self->{comp}, $self->{verbose});
+  @$relDataObjects = grep { $self->PassesFilter($_) } @$relDataObjects;
+  foreach my $thisRelData (@$relDataObjects) {
+    my $ver = $thisRelData->Version();
+    my $htmlName;
+    my $filename = $self->{comp}.".".$ver;
+    if ($self->{htmlNotes}) {
+      $filename.=".htmlnotes";
+    } else {
+      $filename.=".textnotes";
+    }
+    if( !defined ($self->{htmlMainFile}) ) {
+      $htmlName = $self->{notes_store} . "\\$filename.html";
+    }
+    else {
+      $htmlName = $self->{htmlMainFile} . NOTES_DIREXTENSION . "\\$filename.html";
+    }
+    $self->WriteUnlessAlreadyCompiled(\&PrepareStandardNotes, $htmlName, 1, $thisRelData); # sub, filename, cache, @args
+  }
+  $self->WriteUnlessAlreadyCompiled(\&PrepareSummary, undef, 0, $relDataObjects, 1); # sub, filename, cache, @args
+  return $self;
+}
+
+sub DoEnvSummary {
+  my $self = shift;
+  if( !defined ($self->{htmlMainFile} )) {
+    if ($self->{comp} and $self->{ver}) {
+      $self->{htmlName} = $self->{notes_store} . "\\$self->{comp}.$self->{ver}.summary.html";
+    }
+    else {
+      $self->{htmlName} = $self->{notes_store} . "\\current_env_summary.html";
+    }
+  }
+  else {
+    $self->{htmlName} = $self->{htmlMainFile};
+  }
+
+  my $versionInfo;
+  if ($self->{comp} and $self->{ver}) {
+    my $relData = RelData->Open($self->{iniData}, $self->{comp}, $self->{ver}, $self->{verbose});
+    $versionInfo = $relData->Environment();
+  }
+  else {
+    $versionInfo = $self->{envDb}->VersionInfo();
+  }
+
+  my @relData;
+  foreach my $thisComp (sort keys %$versionInfo) {
+    my $thisVer = $versionInfo->{$thisComp};
+    (my $relData, my $preview) = $self->CreateRelData($thisComp, $thisVer);
+    next unless $self->PassesFilter($relData);
+    push (@relData, $relData);
+    my $htmlName;
+    my $filename = $thisComp.".".$thisVer;
+    if ($self->{htmlNotes}) {
+      $filename.=".htmlnotes";
+    } else {
+      $filename.=".textnotes";
+    }
+    if( !defined ($self->{htmlMainFile} )) {
+      $htmlName = $self->{notes_store} . "\\$filename.html";
+    }
+    else {
+      $htmlName = $self->{htmlMainFile} . NOTES_DIREXTENSION . "\\$filename.html";
+    }
+    $self->WriteUnlessAlreadyCompiled(\&PrepareStandardNotes, $htmlName, 1, $relData, $preview); # sub, filename, cache, @args
+  }
+  $self->WriteUnlessAlreadyCompiled(\&PrepareSummary, undef, 0, \@relData); # sub, filename, cache, @args
+  return $self;
+}
+
+sub DoDiffEnvSummary {
+  my $self = shift;
+  my $comp2 = shift;
+  my $ver2 = shift;
+
+  require EnvDifferencer;
+
+  my $comp1 = $self->{comp};
+  my $ver1 = $self->{ver};
+  $comp2 ||= $comp1;
+  $ver2 ||=  $self->{envDb}->VersionInfo()->{$comp2};
+  unless ($ver2) {
+    die "Error: $comp2 not installed in current environment\n";
+  }
+  if( !defined ($self->{htmlMainFile} )) {
+    my $filename = $comp1.".".$ver1.".".$comp2.".".$ver2."-full";
+    if ($self->{htmlNotes}) {
+      $filename.=".htmlnotes";
+    } else {
+      $filename.=".textnotes";
+    }
+    $self->{htmlName} = $self->{notes_store} . "\\$filename.html";
+  }
+  else {
+    $self->{htmlName} = $self->{htmlMainFile};
+  }
+  if(!defined ($self->{outputSTDOUTonly})){
+    $self->WriteUnlessAlreadyCompiled(\&PrepareDiffEnvReport, undef, 1, $comp2, $ver2); # sub, filename, cache, @args
+  }
+  else{
+    $self->WriteUnlessAlreadyCompiled(\&PrepareDiffEnvReport, undef, 0, $comp2, $ver2); # sub, filename, cache, @args
+  }
+}
+
+sub HtmlFileName {
+  my $self = shift;
+  return $self->{htmlName};
+}
+
+sub HtmlMainFile {
+  my $self = shift;
+  return $self->{htmlMainFile};
+}
+
+sub SetProjectFilter {
+  my $self = shift;
+  $self->{filter}->{project} = shift;
+}
+
+sub SetVersionNumberFilter {
+  my $self = shift;
+  $self->{filter}->{versionregex} = shift;
+}
+
+#
+# Private.
+#
+
+sub WriteUnlessAlreadyCompiled {
+  my $self = shift;
+  my $sub = shift;
+  my $filename = shift || $self->{htmlName};
+  my $cache = shift;
+  my @args = @_;
+
+  if ($cache) {
+    return if $self->NotesFileAlreadyCompiled($filename, $self->{comp}, $self->{ver});
+  }
+
+  my $output = $sub->($self, @args);
+ 
+  if (!defined ($self->{outputSTDOUTonly})) {
+    my $fh = $self->OpenFileForWriting($filename);
+    print "FILE LOCATION: $filename\n" if ($self->{verbose});
+    print $fh $output;
+    $fh = undef; # close file
+  }
+  else {
+    print $output;
+  }
+}
+
+sub OpenFileForWriting {
+  my $self = shift;
+  my $filename = shift;
+  Utils::MakeDir(dirname($filename));
+  return new IO::File($filename, "w") or die "Couldn't open file \"$filename\" for writing: $!";
+}
+
+sub PrepareDiffEnvReport {
+  my $self = shift;
+  my $endcomp = shift;
+  my $endver = shift;
+  my $startcomp = $self->{comp};
+  my $startver = $self->{ver};
+
+  $self->{envDb} = EnvDb->Open($self->{iniData}, $self->{verbose});
+
+  my $envDifferencer = EnvDifferencer->New($self->{iniData}, $self->{verbose});
+  $envDifferencer->SetStartCompVer($startcomp, $startver);
+  $envDifferencer->SetEndCompVer($endcomp, $endver);
+
+  my @contentsrows;
+  my $bodies;
+  
+  my $changedcomps = $envDifferencer->ChangedComps();
+  my $i=0;
+  foreach my $comp (sort @$changedcomps) {
+    $i++; # counter for debug output only
+    my $endReldata = $envDifferencer->EndReldata($comp);
+    my $intermediateReldatas = $envDifferencer->IntermediateReldatas($comp);
+    
+    my @allreldatas = (@$intermediateReldatas, $endReldata);
+    @allreldatas = grep { $self->PassesFilter($_) } @allreldatas;
+    print "Processing $comp ($i/".(scalar @$changedcomps)."): ".(scalar @allreldatas)." releases to process\n" if $self->{verbose};
+    next unless @allreldatas;
+
+    my @versions;
+
+    $bodies .= hr . h2(a({name=>$comp},$comp));
+
+    my $firstver;
+    foreach my $reldata (sort { $b->ReleaseTime() <=> $a->ReleaseTime() } @allreldatas) {
+      my $ver = $reldata->Version();
+      my $link = "$comp$ver";
+      if(defined $self->{htmlMainFile})
+        {
+        $link = $self->{htmlMainFile} . NOTES_DIREXTENSION . "/" . $link;
+        }
+      # First add an entry to our contents table
+      push @versions, td(a{href=>"#$link"}, $ver);
+
+      # Now prepare the body itself
+      $bodies .= a({name=>$link}, h3($ver));
+      $bodies .= ul($self->MainBody($reldata, 1)); # 1 = concise
+    }
+    push @contentsrows, Tr(th(a({href=>"#$comp"},$comp)), @versions);
+  }
+
+  my $output = "";
+  $output .= h1("Differences between $startcomp $startver and $endcomp $endver");
+  $output .= h1("Contents");
+  $output .= p("Newer releases are on the left.");
+  $output .= table({border=>1},@contentsrows);
+
+  if(defined $bodies){
+    $output .= $bodies;
+  }
+  
+  return $output;
+}
+
+sub PrepareStandardNotes {
+  my $self = shift;
+  my $relData = shift;
+  my $preview;
+  my $comp;
+  my $ver;
+  if ($relData) {
+    $comp = $relData->Component();
+    $ver = $relData->Version();
+  } else {
+    $comp = $self->{comp};
+    $ver = $self->{ver};
+    ($relData, $preview) = $self->CreateRelData($comp, $ver);
+  }
+  my $output = "";
+
+  if ($self->{verbose}) { print "Compiling release notes for $comp $ver...\n"; }
+
+  if ($preview) {
+    $output .= start_html({-title => "$comp $ver release notes PREVIEW"})
+      .h1({-style=>'Color: red;'}, 'Release Notes Preview'). hr
+      .h1("$comp")
+      .hr;
+  }
+  else {
+    $output .= start_html({-title => "$comp $ver release notes"})
+      .h1("$comp")
+      .hr;
+  }
+
+  $output .= $self->MainBody($relData);
+  $output .= $self->EnvDetails($relData, $preview);
+  $output .= $self->SrcFilterErrors($relData, $preview);
+
+  $output .= end_html();
+ 
+  return $output;
+}
+
+sub PrepareSummary {
+  my $self = shift;
+  my $relDataObjects = shift;
+  my $compSummary = shift;
+
+  my $output = "";
+
+  if ($compSummary) {
+    if ($self->{verbose}) { print "Writing component summary for $self->{comp}...\n"; }
+    $output .= (start_html({-title => "Release note summary for component $self->{comp}"})
+      .h1("Release note summary for component $self->{comp}")
+      .hr);
+  }
+  else {
+    if ($self->{comp} and $self->{ver}) {
+      if ($self->{verbose}) { print "Writing environment summary for $self->{comp} $self->{ver}...\n"; }
+      $output .= (start_html({-title => "Release note summary for environment $self->{comp} $self->{ver}"})
+      .h1("Release note summary for environment $self->{comp} $self->{ver}")
+      .hr);
+    }
+    else {
+      if ($self->{verbose}) { print "Writing environment summary for current environment...\n"; }
+      $output .= (start_html({-title => "Release note summary for the current environment"})
+        .h1("Release note summary for the current environment")
+        .hr);
+    }
+  }
+
+  foreach my $thisRelData (@$relDataObjects) {
+    my $thisVer = $thisRelData->Version();
+    my $thisComp = $thisRelData->Component();
+    my $thisIntVer = $thisRelData->InternalVersion();
+
+    my $link;
+    if ($compSummary) {
+      my $filename = $self->{comp}.".".$thisVer;
+      if ($self->{htmlNotes}) {
+        $filename.=".htmlnotes";
+      } else {
+        $filename.=".textnotes";
+      }
+      $link = "$filename.html";
+    }
+    else {
+      my $filename = $thisComp.".".$thisVer;
+      if ($self->{htmlNotes}) {
+        $filename.=".htmlnotes";
+      } else {
+        $filename.=".textnotes";
+      }
+      $link = "$filename.html";
+    }
+
+    if(defined $self->{htmlMainFile})
+      {
+      $link = $self->{htmlMainFile} . NOTES_DIREXTENSION . "/" . $link;
+      }
+
+    my $caption = $thisVer;
+    if ($thisIntVer) {
+      $caption .= " [$thisIntVer]";
+    }
+    unless ($compSummary) {
+      $caption = "$thisComp $caption";
+    }
+    my $notesSrc = $thisRelData->NotesSource();
+    $output .= a({ -href => $link }, $caption). ' - ';
+    $output .= ("Made by $notesSrc->{releaser} on $notesSrc->{date}");
+    $output .= (p(""));
+  }
+
+  $output .= (end_html());
+  return $output;
+}
+
+sub CreateRelData {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $installedVer = $self->{envDb}->Version($comp);
+  my $preview = 0;
+  my $relData;
+  if (defined $installedVer) {
+    if ($ver eq $installedVer) {
+      if ($self->{envDb}->Status($comp) == EnvDb::STATUS_PENDING_RELEASE) {
+        # This release has not yet been made, so preview the notes.
+        $preview = 1;
+        my $intVer = $self->{envDb}->InternalVersion($comp);
+        unless (defined $intVer) {
+          $intVer = ' ';
+        }
+        my $mrpData = MrpData->New($self->{envDb}->MrpName($comp),
+          $ver, $intVer, $self->{iniData}, $self->{verbose});
+          $relData = RelData->New($self->{iniData}, $mrpData,
+          Utils::PrependSourceRoot($mrpData->NotesSource()), $self->{envDb}->VersionInfo(), 'viewnotes', $self->{verbose}, 1);
+      }
+    }
+  }
+  unless (defined $relData) {
+    # This release has already been made, so we can read it's reldata.
+    $relData = RelData->Open($self->{iniData}, $comp, $ver, $self->{verbose});
+  }
+
+  return ($relData, $preview);
+}
+
+sub MainBody {
+  my $self = shift;
+  my $relData = shift;
+  my $concise = shift;
+
+  my $output = "";
+
+  if ($self->{verbose} > 1) {
+    print "Compiling release notes main body for ".$relData->Component()." ".$relData->Version()."...\n";
+  }
+
+  my $notesSrc = $relData->NotesSource();
+  
+  my $release_version = $relData->MadeWithVersion();
+
+  foreach my $key (keys %{$notesSrc}) {
+    my $html_markers;
+    my $note = $notesSrc->{$key};
+    if (ref $note eq 'ARRAY') {
+      $html_markers = $self->CheckHtmlMarkers(join("",@$note));
+    } else {
+      $html_markers = $self->CheckHtmlMarkers($note);
+    }
+    if (!$html_markers) {
+      if (Utils::CompareVers($release_version, "2.83.1013") > 0) {
+        # 'Recent' release: escape html chars
+        $notesSrc->{$key} = $self->EscapeHtmlChars($note);
+      } else {
+        # Old release
+        if (!($self->{htmlNotes})) {
+          # User hasn't set html_notes: escape html chars
+          $notesSrc->{$key} = $self->EscapeHtmlChars($note);
+        }
+      }
+    }
+  }
+  
+  unless ($concise) {
+    my $comp = $relData->Component();
+    my $ver = $relData->Version();
+    my $intVer = $relData->InternalVersion();
+    my $toolsver = $relData->MadeWith();
+    my $sourcecode = $relData->SourceIncluded();
+    my $mrpName = $relData->MrpName();
+    my $project = $self->ComponentProject($comp, $ver);
+    my $envUserName = $relData->EnvUserName() || "";
+    my $firstCompatibleVersion = $relData->FirstCompatibleVersion() || "&lt;unknown&gt;";
+    my $zipsize;
+    eval {
+      $zipsize = $self->{envDb}->GetReleaseSize($relData->Component(), $relData->Version());
+    };
+    $zipsize ||= "-"; # for example, if we're pending release...
+
+    $output .= table({-border=>0}, Tr({-align =>'left'},
+               [td([b('Version'), $ver]),
+          td([b('Internal version'), ($intVer || "&lt;none&gt;")]),
+          td([b('Made by'), $notesSrc->{releaser}]),
+          td([b('Date'), $notesSrc->{date}]),
+          td([b('Made with'), $toolsver]),
+          td([b('Earliest compatible tools'), $firstCompatibleVersion]),
+          td([b('Source included'), tt($sourcecode)]),
+          td([b('Size of release zips'), tt($zipsize)]),
+          td([b('Project storage archive'), $project]),
+          td([b('MRP file used'), tt($mrpName)]),
+          td([b('Environment username'), $envUserName])
+               ]));
+  }
+
+  $output .= hr;
+  $output .= h2("Release Summary");
+  $output .= h3("Reason for release");
+  foreach my $line (@{$notesSrc->{releaseReason}}) {
+    $output .= tt($line). br;
+  }
+  $output .= h3("General release comments");
+  foreach my $line (@{$notesSrc->{generalComments}}) {
+      $output .= tt($line). br;
+  }
+  $output .= h3("Known omissions, deviations and discrepancies");
+  foreach my $line (@{$notesSrc->{knownDeviations}}) {
+      $output .= tt($line). br;
+  }
+  
+  @{$notesSrc->{bugsFixed}} = map tt($_), @{$notesSrc->{bugsFixed}};
+  @{$notesSrc->{bugsRemaining}} = map tt($_), @{$notesSrc->{bugsRemaining}}; 
+  @{$notesSrc->{otherChanges}} = map tt($_), @{$notesSrc->{otherChanges}};
+   
+  $output .= hr;
+  $output .= h2("Bugs fixed");
+  $output .= ul(li($notesSrc->{bugsFixed}));
+  $output .= hr;
+  $output .= h2("Known bugs remaining");
+  $output .= ul(li($notesSrc->{bugsRemaining}));
+  $output .= hr;
+  $output .= h2("Other changes");
+  $output .= ul(li($notesSrc->{otherChanges}));
+  $output .= hr;
+
+  return $output;
+}
+
+sub EscapeHtmlChars {
+  my $self = shift;
+  my $note = shift;
+  
+  my $newnote;
+  if (ref $note eq 'ARRAY') {
+    $newnote = [];
+    foreach my $line (@$note) {
+      my $newline = $line;
+      $newline =~ s/&/&amp;/g;
+      $newline =~ s/</&lt;/g;
+      $newline =~ s/>/&gt;/g;
+      push @$newnote, $newline;
+    }
+  } else {
+    $newnote = $note;
+    $newnote =~ s/&/&amp;/g;
+    $newnote =~ s/</&lt;/g;
+    $newnote =~ s/>/&gt;/g;
+  }
+  return $newnote;
+}
+
+sub CheckHtmlMarkers {
+  my $self = shift;
+  my $note = shift;
+  if ($note =~ /^\s*<\s*html\s*>.*<\s*[\/\\]\s*html\s*>\s*$/i) {
+    # Note begins with <html> and ends with </html> or something along those lines
+    return 1;
+  } else {
+    return 0;
+  }
+}
+
+sub EnvDetails {
+  my $self = shift;
+  my $relData = shift;
+  my $preview = shift;
+
+  my $contents = "";
+
+  if ($preview) {
+    $contents .= h2("Release environment");
+    $contents .= span({-style=>'Color: red;'}, '[not yet known]');
+    $contents .= br();
+  }
+  else {
+    my $env = $relData->Environment();
+    if (defined $env) {
+      $contents .= h2("Release environment");
+      my $tableData;
+      $contents .= p("Number of components: ".(scalar keys %$env));
+      foreach my $comp (sort keys %{$env}) {
+  push (@$tableData, td([b($comp), $env->{$comp}]));
+      }
+      $contents .= table({-border=>0}, Tr({-align =>'left'}, $tableData));
+    }
+  }
+  return $contents;
+}
+
+sub SrcFilterErrors {
+  my $self = shift;
+  my $relData = shift;
+  my $preview = shift;
+  my $notesSrc = $relData->NotesSource();
+
+  my $contents = "";
+
+  if (defined $notesSrc->{srcFilterErrors} and scalar(@{$notesSrc->{srcFilterErrors}}) > 0) {
+    $contents .= hr, h2("Source filter errors");
+    foreach my $errorLine (@{$notesSrc->{srcFilterErrors}}) {
+      $contents .= $errorLine, br();
+    }
+  }
+  return $contents;
+}
+
+sub NotesFileAlreadyCompiled {
+  my $self = shift;
+  my $fileName = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $alreadyCompiled = 0;
+
+  if(!(defined $self->{htmlMainFile})) {
+    if (-e $fileName && $comp && $ver) {
+      my $reldata = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $ver) . '\\reldata';
+      if (-e $reldata and Utils::FileModifiedTime($reldata) < Utils::FileModifiedTime($fileName)) {
+        $alreadyCompiled = 1;
+      }
+    }
+  }
+  return $alreadyCompiled;
+}
+
+sub PassesFilter {
+  my $self = shift;
+  my $rd = shift;
+  my $comp = $rd->Component();
+  my $ver = $rd->Version();
+  if ($self->{filter}->{project}) {
+    return 0 unless $self->ComponentProject($comp, $ver) eq $self->{filter}->{project};
+  }
+  if ($self->{filter}->{versionregex}) {
+    my $re = $self->{filter}->{versionregex};
+    return 0 unless $ver =~ m/$re/i;
+  }
+  return 1;
+}
+
+sub ComponentProject {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  return $self->{iniData}->PathData->ComponentProject($comp, $ver);
+}
+
+1;
+  
+__END__
+
+=head1 NAME
+
+NotesCompiler.pm - Compiles a set of release notes into HTML.
+
+=head1 INTERFACE
+
+=head2 New
+
+Expects to be passed an C<IniData> reference, a component name, a version, a verbosity level, an output HTML file name and an output STDOUT only flag. Creates a C<RelData> object for the component release and uses the information contained within it to compile the output HTML file.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Optimisation	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,97 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Overview
+
+This document is intended to make suggestions about how the tools can be made to operate quicker.
+
+=head1 Getting releases and baselines
+
+=over 4
+
+=item *
+
+Use the C<required_binaries> directive in your F<reltools.ini> to limit the selection of binaries that are installed.
+
+=item *
+
+Don't use the -s switch on C<GetEnv> to install source code. Use C<GetSource> subsequently to fetch source code for the components you want.
+
+=item *
+
+If you are working over a slow network link, create a local archive on your own PC using the C<PullEnv> commands. List this local cache first in your F<reltools.ini> and the tools will automatically search that archive first, to find any releases you need. This is also useful if you need to work offline.
+
+=back
+
+=head1 Making baselines
+
+=over 4
+
+=item *
+
+If you are making several baselines (for example, one with strong cryptography and one without) or you make a succession of baselines over a period (for example, fortnightly baselines) try to keep releases common to both. For example, if I<viewsrv> has not changed over the course of a fortnight then the new baseline should contain the same component release of viewsrv. Use the C<ValidateEnv> command to check which components you need to release afresh.
+
+=item *
+
+Try to make components as small as possible. Then, on average, fewer parts of the system will need to be transferred/installed for each new baseline. Having said that, small components gives no advantage if they are so interlinked that they always need to be released together.
+
+=back
+
+=head1 Transferring Releases
+
+=over 4
+
+=item *
+
+Again, use C<required_binaries> to restrict which binary platforms are transferred.
+
+=item *
+
+In the export table (F<exportdata.csv>) don't deliver more source code than you have to.
+
+=item *
+
+If you are delivering the same thing to several parties, don't do multiple C<ExportEnv>s. Instead use a single F<exportdata.csv> with everyone's PGP key listed along the top. Then do a single C<ExportEnv>; the files will be encrypted to each PGP key.
+
+=item *
+
+If you have to deliver something to several FTP sites, use the above method and export to a local drive (or a network share). Then, transfer things to each of the FTP sites. This saves on the encryption time and ensures you deliver the same stuff to each party.
+
+=item *
+
+If you have a secure network connection to a third party, then use C<PushEnv> instead of C<ExportEnv>. This eliminates the encryption/decryption stage. But be aware that it does not do source code filtering, so the recipient will be able to see all the source code.
+
+=back
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PathData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,289 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package PathData;
+
+use strict;
+
+#
+# Constructor
+#
+
+sub New {
+  my $pkg = shift;
+  my $verbose = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{verbose} = $verbose;
+  return $self;
+}
+
+#
+# Public
+#
+#
+
+# This function is called by IniData when it comes across an archive_path*
+# line. It will only be called once, because the first thing it does
+# is reclassify this object as a PathData::ComponentBased or a
+# PathData::ProjectBased. Subsequent calls to ProcessLine will therefore
+# call the derived class methods.
+sub ProcessLine {
+  my $self = shift;
+  my $keywordref = shift;
+  my $lineref = shift;
+
+  $self->SubclassifyMyselfByKeyword($keywordref); # make myself a subclass
+  $self->ProcessLine($keywordref, $lineref); 
+      # now ask the subclass to process the line
+}
+
+sub LocalArchivePathForExistingOrNewComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $project = shift;
+  my $result = $self->LocalArchivePathForExistingComponent($comp, $ver, $project);
+  $result ||=  $self->LocalArchivePathForNewComponent($comp, $ver, $project);
+  return $result;
+}
+
+sub LocalArchivePathForNewOrExistingComponent {
+  die "You meant LocalArchivePathForExistingOrNewComponent... teehee";
+}
+
+# These methods must all be reimplemented by the subclass
+sub LocalArchivePathForNewComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $project = shift;
+  die "No path data found in reldata.ini. Cannot provide local archive path for new component.\n";
+}
+
+sub LocalArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  die "No archive found in reldata.ini. Cannot provide local archive path for existing component.\n";
+}
+
+sub LocalArchivePathForImportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remotepath = shift;
+  die "No path data found in reldata.ini. Cannot provide local archive path for importing component.\n";
+}
+
+sub RemoteArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  die "No path data found in reldata.ini. Cannot provide remote archive path for existing component.\n";
+}
+
+sub RemoteArchivePathForExportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $localpath = shift;
+  die "No path data found in reldata.ini. Cannot provide remote archive path for exporting component.\n";
+}
+
+sub ListComponents {
+  my $self = shift;
+  die "No path data found in reldata.ini. Cannot return list of components.\n";
+}
+
+sub ListVersions {
+  my $self = shift;
+  my $comp = shift;
+  my $filter = shift;
+  die "No path data found in reldata.ini. Cannot return a list of versions.\n";
+}
+
+sub ListProjects {
+  my $self = shift;
+  die "No path data found in reltools.ini. Cannot return list of projects.\n";
+}
+
+sub ComponentProjects {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  die "No path data found in reldata.ini. Cannot return which project a component belongs to.\n";
+}
+
+sub ComponentProject {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  die "No path data found in reldata.ini. Cannot return which project a component belongs to.";
+}
+
+sub ReleaseExists {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $relDir = $self->LocalArchivePathForExistingComponent($comp, $ver);
+  if ($relDir && -e $relDir) {
+    return 1;
+  }
+  return 0;
+}
+
+sub CheckReleaseExists {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  unless ($self->ReleaseExists($comp, $ver)) {
+    die "Error: $comp $ver not found\n";
+  }
+}
+
+
+#
+# Private
+#
+#
+
+sub SubclassifyMyselfByKeyword {
+  my $self = shift;
+  my $keywordref = shift;
+
+  if ($$keywordref =~ m/archive_path_file/i) {
+    require PathData::ComponentBased;
+    bless ($self, "PathData::ComponentBased");
+  } elsif ($$keywordref =~ m/archive_path/i) {
+    require PathData::ProjectBased;
+    bless ($self, "PathData::ProjectBased");
+  } else {
+    die "Unknown archive_path related keyword: ".$$keywordref."\n";
+  }
+  print "Using ".(ref $self)." type of archive path arrangement. Keyword was $$keywordref\n" if ($self->{verbose});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+PathData.pm - Provides the location of archived releases.
+
+=head1 DESCRIPTION
+
+Provides a class to represent knowledge of the archive structure. The class is mostly abstract; however, an object of this class may exist temporarily before it converts itself to a subclass.
+
+=head1 INTERFACE
+
+=head2 New
+
+Expects to be passed a verbosity flag.
+
+=head2 ProcessLine
+
+Processes a line from the C<reltools.ini> file. This will cause the object to bless itself into a subclass, depending on the keyword, then it will ask the subclass to process the line.
+
+=head2 LocalArchivePathForExistingOrNewComponent
+
+This method returns C<LocalArchivePathForExistingComponent>, or failing that, C<LocalArchivePathForNewComponent>.
+
+=head2 ComponentProject
+
+This returns the first item returned by the subclass method C<ComponentProjects>.
+
+=head2 Methods to be implemented by the subclass
+
+All the remaining methods should be implemented by the subclass of the C<PathData>. All of these methods are expected to return the full location where the files should be stored; i.e. local archive paths should end in "\component\version" and remote archive paths should end in "/component".
+
+=head2 LocalArchivePathForNewComponent
+
+This takes a component and a version and (optionally) the name of the project to store the component in.
+
+=head2 LocalArchivePathForExistingComponent
+
+This takes a component and a version.
+
+=head2 LocalArchivePathForImportingComponent
+
+This takes a component, a version, and the remote path where the component was found.
+
+=head2 RemoteArchivePathForExistingComponent
+
+This takes a component, a version and a C<RemoteSite> object.
+
+=head2 RemoteArchivePathForExportingComponent
+
+This takes a component, a version, and the local path where the component was found.
+
+=head2 ListComponents
+
+This may take "1" to indicate that it should list the components stored remotely, not locally.
+
+=head2 ListVersions
+
+This takes a component. It may optionally take a "1" to indicate that it should list the versions stored remotely, not locally. The third parameter is also optional; a regular expression that can be applied to filter the list of versions that is returned.
+
+=head2 ListProjects
+
+=head2 ComponentProjects
+
+This takes a component and a version and returns the project name of all archives where the release is found.
+
+=head2 ComponentProject
+
+This takes a component name and a version and returns the project name of the first archive where the release is found.  It gives the corresponding project name to the path that LocalArchivePathForExistingComponent gives for the same arguments.
+
+=head2 ReleaseExists
+
+Takes a component name and a version number. Return true if the component release is present in the local archive, false otherwise.
+
+=head2 CheckReleaseExists
+
+Takes a component name and a version number. Dies if the component release is not present in the local archive.
+
+=head1 IMPLEMENTATION
+
+=head2 SubclassifyMyselfByKeyword
+
+This will convert the object to either a C<PathData::ProjectBased> or C<PathData::ComponentBased> depending on the keyword passed in.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PathData/ComponentBased.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,344 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# PathData/ComponentBased.pm
+#
+
+package PathData::ComponentBased;
+use strict;
+
+BEGIN {
+  @PathData::ComponentBased::ISA=('PathData');
+};
+
+#
+# Public
+#
+#
+
+sub ProcessLine {
+  my $self = shift;
+  my $keywordref = shift;
+  my $lineref = shift;
+
+  die "Unknown keyword $$keywordref for component-based path data" unless ($$keywordref =~ m/archive_path_file/i);
+  print "Warning: Deprecated keyword 'archive_path_file' found.  Support for component-based archives is planned for removal - please see documention for the 'archive_path' keyword for how to use project-based archives.\n"; 
+
+  die "Can't have multiple archive_path_file keywords in reltools.ini." if ($self->{archive_path_file});
+
+  $self->{archive_path_file} = $$lineref; # store the filename, just in case anybody wants to debug us - it might be useful.
+  $self->ParsePathData();
+}
+
+sub LocalArchivePathForNewComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $project = shift;
+  die "Project $project does not make any sense when we are using an archive_path_data.txt file";
+  return $self->LocalArchivePath($comp, $ver);
+}
+
+sub LocalArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  return $self->LocalArchivePath($comp, $ver);
+}
+
+sub LocalArchivePathForImportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remotepath = shift;
+  return $self->LocalArchivePath($comp, $ver);
+}
+
+sub RemoteArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  return $self->RemoteArchivePath($comp, $ver);
+}
+
+sub RemoteArchivePathForExportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $localpath = shift;
+  return $self->RemoteArchivePath($comp, $ver);
+}
+
+sub ListComponents {
+  my $self = shift;
+  my $remote = shift || 0;
+  my @comps;
+  if ($remote) { # list those in the remote archive
+    die "Must pass a remote site object to ListComponents if you want a list of the components on the remote site" unless ref $remote;
+    foreach my $location (values %{$self->{remote_archive_path}}) {
+      my $list = $remote->DirList($location);
+      $location =~ s/\\/\//g;
+      foreach (@$list) {
+        s/^$location\/?//i;
+        push @comps, $_;
+      }
+    }
+  } else { # list those in the local archive
+    foreach my $location (values %{$self->{local_archive_path}}) {
+      push @comps, @{Utils::ReadDir($location)} if (-d $location);
+    }
+  }
+  return \@comps;
+}
+
+sub ListProjects {
+  my $self = shift;
+  die "Cannot give a list of projects because we are using the component-based style of archive path data.";
+}
+
+sub ListVersions {
+  my $self = shift;
+  my $comp = shift;
+  my $remote = shift;
+  my $filter = shift;
+  my $found;
+  if ($remote) { # list those in the remote archive
+    die "Must pass a remote site object to ListVersions if you want a list of the versions on the remote site" unless ref $remote;
+    my $compDir = $self->GetArchivePath($comp, "remote_archive_path")."/$comp";
+    my $files = $remote->DirList($compDir);
+    my @results = map { m/\Q$comp\E([^\\\/]*)\.zip/i; $1 } @$files;
+    $found = \@results;
+  } else { # list those in the local archive
+    my $compDir = $self->GetArchivePath($comp, "local_archive_path")."\\$comp";
+    return [] unless (-d $compDir);
+    $found = Utils::ReadDir($compDir);
+  }
+  @$found = grep { m/$filter/i } @$found if ($filter);
+  return @$found if wantarray;
+  return $found;
+}
+
+sub ComponentProjects {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  return ("<n/a>");
+}
+
+sub ComponentProject {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  return ("<n/a>");
+}
+
+#
+# Private
+#
+#
+#
+
+sub GetArchivePath {
+  my $self = shift;
+  my $component = lc(shift);
+  my $type = shift;
+
+  die "Couldn't get archive path for undefined component" unless defined $component;
+  die unless defined $type;
+
+  if ($self->{$type}->{$component}) {
+    return $self->{$type}->{$component};
+  }
+  elsif ($self->{$type}->{default}) {
+    return $self->{$type}->{default};
+  }
+  else {
+    die "Error: archive path not specified for $component\n";
+  }
+}
+
+sub LocalArchivePath {
+  my $self = shift;
+  my $component = shift;
+  my $ver = shift;
+
+  return $self->GetArchivePath($component, "local_archive_path")."\\$component\\$ver";
+}
+
+sub RemoteArchivePath {
+  my $self = shift;
+  my $component = shift;
+  my $ver = shift;
+
+  return $self->GetArchivePath($component, "remote_archive_path")."/$component";
+}
+
+sub ParsePathData {
+  my $self = shift;
+
+  my $path_file = $self->{archive_path_file};
+  
+  unless (-f $path_file) {
+    die "Error: $path_file not found\n";
+  }    
+  
+  open PATH, "$path_file" or die "Unable to open $path_file for reading\n";
+
+  while (my $line = <PATH>) {
+    # Remove line feed, white space and comments.	   
+    chomp $line;
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+    my ($component, $local, $remote) = split (/\s+/, $line, 4);
+    $component = lc($component);
+    unless ($local and $remote) {
+      die "Error: Path not defined for \"$component\" in \"$path_file\"\n";
+    }
+    if (exists $self->{local_archive_path}->{$component}) {
+      die "Error: \"$component\" specified more than once in \"$path_file\"\n";
+    }
+    $self->{local_archive_path}->{$component} = $local;
+    $self->{remote_archive_path}->{$component} = $remote;   
+  }  
+  close PATH;
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+PathData/ComponentBased.pm - Provides the location of archived releases with an old-style archive arrangement.
+
+=head1 DESCRIPTION
+
+Parses a file containing paths to component release packets on both the local and remote archives.
+
+=head1 INTERFACE
+
+=head2 ProcessLine
+
+This interprets an C<archive_path_file> line from your F<reltools.ini>, and goes away to parse the F<archive_path.txt> file (which it does using the internal method C<ParsePathData>).
+
+The parser expects each line in the file to have the following form: 
+ 
+ <component_name>  <local_archive_path>  <remote_archive_path>
+
+So an example file might have the following structure:
+
+ #
+ # App Engines
+ #
+ agnmodel     X:\ProjectX\appeng      \ProjectX\appeng
+ cntmodel     X:\ProjectX\appeng      \ProjectX\appeng
+ damodel      X:\ProjectX\appeng      \ProjectX\appeng
+ ...
+ ...
+ #
+ # App Framework
+ #
+ apparc       X:\ProjectX\appframework      \ProjectX\appframework
+ eikstd       X:\ProjectX\appframework      \ProjectX\appframework
+ etext        X:\ProjectX\appframework      \ProjectX\appframework
+ ...
+ ...
+ #
+ # Default path
+ #
+ default      X:\ProjectX\misc       \ProjectX\misc
+
+The C<default> line is optional (and there should be only one in the file). The C<default> value is the path given to all component releases which are not explicity listed in the file.
+
+[Note: text following a # is treated as a comment]   
+
+=head2 Methods that return paths
+
+All of these methods are expected to return the full location where the files should be stored; i.e. local archive paths should end in "\component\version" and remote archive paths should end in "/component".
+
+=head2 LocalArchivePathForNewComponent
+
+This takes a component and a version and (optionally) the name of the project to store the component in.
+
+=head2 LocalArchivePathForExistingComponent
+
+This takes a component and a version.
+
+=head2 LocalArchivePathForImportingComponent
+
+This takes a component, a version, and the remote path where the component was found.
+
+=head2 RemoteArchivePathForExistingComponent
+
+This takes a component and a version.
+
+=head2 RemoteArchivePathForExportingComponent
+
+This takes a component, a version, and the local path where the component was found.
+
+=head2 ListComponents
+
+This may take "1" to indicate that it should list the components stored remotely, not locally. 
+
+=head2 ListVersions
+
+This takes a component. It may optionally take a "1" to indicate that it should list the versions stored remotely, not locally.
+
+=head2 ListProjects
+
+=head2 ComponentProjects
+
+=head2 ComponentProject
+
+These methods all throw an error, since projects aren't a relevant concept in this type of archive structure.
+
+=head1 IMPLEMENTATION
+
+=head2 LocalArchivePath
+
+Takes a component name. Returns the path of the component release packet on the local archive. Dies if not found.
+
+=head2 RemoteArchivePath
+
+Takes a component name. Returns the path of the component release packet on the remote archive (either an FTP site or a network drive). Dies if not found.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PathData/ProjectBased.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,485 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# PathData/ProjectBased.pm
+#
+
+package PathData::ProjectBased;
+use Utils;
+use Carp;
+use File::Spec;
+use strict;
+
+BEGIN {
+  @PathData::ProjectBased::ISA=('PathData');
+};
+
+#
+# Public
+#
+#
+
+sub ProcessLine {
+  my $self = shift;
+  my $keywordref = shift;
+  my $lineref = shift;
+
+  die "Unknown keyword $$keywordref for project-based path data" unless ($$keywordref =~ m/archive_path/i);
+  $$lineref =~ m/(\S+)\s+(\S+)(?:\s+(\S*))?/ or die "Error: Couldn't cope with archive path arguments \"$$lineref\": possibly the wrong number of arguments?\n";
+  my $entry = {
+    'name' => lc $1,
+    'local' => $2,
+    'remote' => $3
+  };
+ 
+
+  $self->{project_paths} ||= []; # I know this line is redundant, but I prefer explicitness :-)
+  die "You cannot have multiple archive_path lines with the same project name (".$entry->{name}.")" if (grep { $_->{name} eq $entry->{'name'} } @{$self->{project_paths}});
+  # You are allowed to have multiple lines with the same local and/or remote path lines,
+  # but it ain't necessarily a good plan.
+  push @{$self->{project_paths}}, $entry;
+}
+
+sub LocalArchivePath {
+  my $self = shift;
+  my $project = shift;
+  my $result;
+  $self->BasicChecks();
+
+  if(defined $project){
+    $self->CheckProject($project);
+    $result = $self->FindEntry("name", $project);
+  }
+  else{
+    $result = $self->FindEntryWithSub(sub { -d ($_->{'local'})});
+  }
+  
+  return undef unless $result;
+  print "Existing component stored at $result\n" if ($self->{verbose});
+  return $result->{'local'};
+}
+
+sub LocalArchivePathForNewComponent {
+  my $self = shift;
+  my $comp = shift || confess "No component provided";
+  my $ver = shift || confess "No version provided";
+  my $project = shift;
+  $self->BasicChecks();
+
+  my $result;
+  if (defined $project) {
+    $self->CheckProject($project);
+    $result = $self->FindEntry("name", $project);
+  } else {
+    $result = $self->{project_paths}->[0];
+  }
+  die "Error: No archive paths found\n" unless $result; # should never happen due to BasicChecks
+  $self->CreateLocalDirectory($result);
+  $result = $result->{'local'};
+  print "New component being stored at $result\n" if ($self->{verbose});
+  return $result . "\\$comp\\$ver";
+}
+
+sub LocalArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $project = shift;
+  
+  my $result;
+  
+  $self->BasicChecks();
+  confess "Component name undefined" unless defined $comp;
+  confess "Version number undefined" unless defined $ver;
+
+  if(defined $project){
+    $self->CheckProject($project);
+    $result = $self->FindEntry("name", $project);
+  }
+  else{
+    $result = $self->FindEntryWithSub(sub { -d ($_->{'local'}.'\\'.$comp.'\\'.$ver)});
+  }
+  
+  return undef unless $result;
+  print "Existing component stored at $result\n" if ($self->{verbose});
+  return $result->{'local'} . "\\$comp\\$ver";
+}
+
+sub LocalArchivePathForImportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remotepath = shift; 
+  $self->BasicChecks();
+  confess "Component name undefined" unless defined $comp;
+  confess "Version number undefined" unless defined $ver;
+  $remotepath =~ s/(.*)\/.*/$1/;
+  my $result = $self->FindEntry("remote", $remotepath);
+  $self->CreateLocalDirectory($result);
+  die "Couldn't find the remote project directory $remotepath where component $comp is being imported from." unless defined $result;
+  return $result->{'local'} . "\\$comp\\$ver";
+}
+
+sub RemoteArchivePathForExistingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remotesite = shift; # we must get passed a remote site object
+
+  $self->CheckRemoteSites();
+
+  $self->BasicChecks();
+  confess "Component name undefined" unless defined $comp;
+  confess "Version number undefined" unless defined $ver;
+  confess "No remote site object was provided" unless (ref $remotesite);
+  die "Component name undefined" unless defined $comp;
+  my %checked;
+  my $result = $self->FindEntryWithSub(sub {
+     return undef unless $_->{'remote'}; # skip those with no remote path
+     return undef if $checked{$_->{'remote'}}; # already checked this remote path
+     $checked{$_->{'remote'}} = 1;
+     $remotesite->FileExists($_->{'remote'}."/$comp/$comp$ver.zip"
+   )});
+  return undef unless defined $result;
+  $result = $result->{remote};
+  return $result . "/$comp";
+}
+
+sub RemoteArchivePathForExportingComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $localpath = shift;
+
+  $self->CheckRemoteSites();
+
+  $localpath =~ s/(.*)[\/\\].*?[\/\\].*?$/$1/; # remove last two path segments
+  $self->BasicChecks();
+  confess "Component name undefined" unless defined $comp;
+  my $result = $self->FindEntry("local", $localpath);
+  die "Couldn't find the local project directory $localpath where component $comp is being exported from." unless (defined $result);
+  die "Error: The archive ".$result->{name}." does not have a remote path listed in reltools.ini" unless (defined $result->{remote});
+  return $result->{remote} . "/$comp";
+}
+
+sub ListComponents {
+  my $self = shift;
+  my $remote = shift || 0;
+  my $continue = shift || 0;
+  # This returns a list of the components we have locally or remotely.
+  
+  my $archiveExists;
+  
+  $self->BasicChecks();
+  my @list;
+  if ($remote) { # list remote archive
+    $self->CheckRemoteSites();
+    die "Need a remote site object" unless (ref $remote);
+    foreach (map { $_->{'remote'} } @{$self->{project_paths}}) {
+      next unless $remote->DirExists($_);
+      $archiveExists = 1;
+      my $rawlist = $remote->DirList($_);
+      if ($rawlist) {
+        push @list, grep { !m/^\./ } map { s/.*[\\\/]//; $_ } @$rawlist;
+      }
+    }
+  } else { # list local archive
+    foreach (map { $_->{'local'} } @{$self->{project_paths}}) {
+      if (!-d $_) {
+        if ($continue) {
+          next;
+        }		
+        die "Project path $_ does not correspond to a real directory" ;
+      }
+      
+      $archiveExists = 1;
+      
+      opendir LISTHANDLE, $_;
+      push @list, grep { !/^\./ } readdir LISTHANDLE;
+      closedir LISTHANDLE;
+    }
+  }
+  
+  if (!$archiveExists) {
+    warn "Warning: The archive path locations specified in your reltools.ini do not exist\n";
+  }
+    
+  # Now unique-ify list as per Perl Cookbook recipe
+  my %seen;
+  @list = grep { ! $seen{$_} ++ } @list;
+
+  return @list if wantarray;
+  return \@list;
+}
+
+sub ListProjects {
+  my $self = shift;
+  $self->BasicChecks();
+  my @results = map { $_->{name} } @{$self->{project_paths}};
+  return @results if wantarray;
+  return \@results;
+}
+
+sub ListVersions {
+  my $self = shift;
+  my $comp = shift;
+  my $remote = shift || 0;
+  my $filter = shift;
+  my $latestverFilter = shift;
+  $self->BasicChecks();
+
+  my $archiveExists;
+
+  confess "Component name undefined" unless defined $comp;
+  my @found;
+  if ($remote) {
+    $self->CheckRemoteSites();
+    die "Need a remote site object" unless (ref $remote);
+    foreach (map { $_->{'remote'} } @{$self->{project_paths}}) {
+      my $dir = "$_/$comp";
+      next unless $remote->DirExists($dir);
+      $archiveExists = 1;
+      my $files = $remote->DirList($dir);
+      push @found, grep { $_ } map { m/.*(?:^|\\|\/)\Q$comp\E[\\\/]\Q$comp\E(.*?)\.zip$/i; $1 } @$files;
+    }
+  } else {
+    foreach (map { $_->{'local'} } @{$self->{project_paths}}) {
+      if (-e $_) {
+        $archiveExists = 1;
+      }
+      
+      my $dir = "$_\\$comp";
+      if (-d $dir) {
+        foreach my $entry (@{Utils::ReadDir($dir)}) {
+          if (-d File::Spec->catdir($dir, $entry)) {
+            push @found, $entry;
+          }
+        }
+      }
+    }
+  }
+  
+  if (!$archiveExists) {
+    warn "Warning: The archive path locations specified in your reltools.ini do not exist\n";
+  }
+  
+  # Now unique-ify list as per Perl Cookbook recipe
+  my %seen;
+  @found = grep { ! $seen{$_} ++ } @found;
+
+  # The filter regexes may have been compiled, here we uncompile them
+  $latestverFilter =~ s/^\(\?[-imsx]*:(.*)\)$/$1/i if ($latestverFilter);
+  $filter =~ s/^\(\?[-imsx]*:(.*)\)$/$1/i if ($filter);
+           
+  # Now apply a filter to the list
+  @found = grep { ! m/$latestverFilter/i } @found if ($latestverFilter);
+  @found = grep { m/$filter/i } @found if ($filter);
+  return @found if wantarray;
+  return \@found;
+}
+
+sub ComponentProjects {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  confess "Component name undefined" unless defined $comp;
+  confess "Version number undefined" unless defined $ver;
+  $self->BasicChecks();
+  my @results = $self->FindEntriesWithSub(sub {
+    -d ($_->{local}."\\$comp\\$ver")
+  });
+  return map {$_->{name}} @results; 
+}
+
+sub ComponentProject {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  confess "Component name undefined" unless defined $comp;
+  confess "Version number undefined" unless defined $ver;
+  $self->BasicChecks();
+  my $archive = $self->FindEntryWithSub(sub {
+    -d ($_->{local}."\\$comp\\$ver")
+  });
+
+  if (defined $archive) {
+    return $archive->{name};
+  } else {
+    return "<none>";
+  }
+}
+
+#
+# Private
+#
+
+sub BasicChecks {
+  my $self = shift;
+  die "No project paths are defined" unless ($self->{project_paths});
+}
+
+sub CheckProject {
+  my $self = shift;
+  my $project = shift;
+
+  die "Project \"$project\" unknown" unless $self->FindEntry("name", $project);
+}
+
+sub FindEntry {
+  my $self = shift;
+  my $type = shift;
+  my $what = shift;
+
+  return ($self->FindEntries($type, $what))[0];
+}
+
+sub FindEntries {
+  my $self = shift;
+  my $type = shift;
+  my $what = shift;
+
+  return $self->FindEntriesWithSub(sub { lc $_->{$type} eq lc $what });
+}
+
+sub CreateLocalDirectory {
+  my $self = shift;
+  my $entry = shift;
+  if (-e $entry->{'local'}) {
+    die "Error: Local archive path ".$entry->{'local'}." is not a directory\n" unless (-d _);
+  } else {
+    print "Warning: creating local archive path ".$entry->{local}."\n";
+    Utils::MakeDir($entry->{'local'});
+  }
+}
+
+sub FindEntryWithSub {
+  my $self = shift;
+  my $checksub = shift;
+  my $projectPath;
+  
+  foreach (@{$self->{project_paths}}) {
+    if (&$checksub) {
+      $projectPath = $_;
+      last;
+    }
+  }
+
+  return $projectPath;
+} 
+
+sub FindEntriesWithSub {
+  my $self = shift;
+  my $checksub = shift;
+
+  return grep { &$checksub } @{$self->{project_paths}};
+}
+
+sub CheckRemoteSites {
+  my $self = shift;
+  my $hasRemoteSite = 0;
+  
+  foreach my $project (@{$self->{project_paths}}) {
+    $hasRemoteSite = 1 if ($project->{remote}); 
+  }
+  
+  die "Error: No remote sites are defined in your reltools.ini\n" if (!$hasRemoteSite);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+PathData/ProjectBased.pm - Provides the location of archived releases with a new-style archive structure.
+
+=head1 DESCRIPTION
+
+A subclass of C<PathData>, provides the understanding of the new-style archive path structure and returns information on where to store releases, and where existing releases are stored.
+
+=head1 INTERFACE
+
+The abstract methods of C<PathData> are implemented.
+
+=head2 LocalArchivePathForNewComponent
+
+This takes a component and a version and (optionally) the name of the project to store the component in.
+
+=head2 LocalArchivePathForExistingComponent
+
+This takes a component, version and optionally a project. 
+
+=head2 LocalArchivePathForImportingComponent
+
+This takes a component, a version, and the remote path where the component was found.
+
+=head2 RemoteArchivePathForExistingComponent
+
+This takes a component, a version and a C<RemoteSite> object.
+
+=head2 RemoteArchivePathForExportingComponent
+
+This takes a component, a version, and the local path where the component was found.
+
+=head2 ListComponents
+
+This takes a remote and continue flag. The remote flag when set as "1" is used to indicate that it should list the components stored remotely, not locally. The continue flag when set as "1" is used to indicate that the script should continue regardless of any problems found with regards to the paths set.
+
+=head2 ListVersions
+
+This takes a component. It may optionally take a "1" to indicate that it should list the versions stored remotely, not locally. The third parameter is also optional; it's a Perl-syntax pattern match for the versions.
+
+=head2 ListProjects
+
+=head2 ComponentProjects
+
+This takes a component and a version and returns the project name of all archives where the release is found.
+
+=head2 ComponentProject
+
+This takes a component name and a version and returns the project name of the first archive where the release is found.  It gives the corresponding project name to the path that LocalArchivePathForExistingComponent gives for the same arguments.
+=head2 ProcessLine
+
+This processes a line from the F<reltools.ini>.
+
+=head1 IMPLEMENTATION
+
+This object has a data member, C<project_paths>, which is an array of the project descriptions found in the F<reltools.ini>. Each line is stored as a hash struct, with keys "name", "local" and "remote". It's filled in by C<ProcessLine>, and used by all the other methods via a variety of subroutines which check the contents of this array.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PrepEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,366 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use Utils;
+use PrepRel;
+use CommandController;
+
+
+#
+# Constants.
+#
+
+use constant UPDATED => 0;
+use constant UNCHANGED => 1;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $newMrpName;
+my $inputFile;
+my $comp;
+my $ver;
+my $intVer;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PrepEnv');
+my $envDb;
+my $mode;
+my $samemrps;
+my $fixedIntVer;
+my $printlatestversion;
+my $skipPendingRelease;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrepEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "m" => \$samemrps, "i=s" => \$fixedIntVer, "l" => \$printlatestversion, "p" => \$skipPendingRelease);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $inputFile = shift @ARGV;
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+  if ($printlatestversion && $inputFile) {
+    print "Error: can't use -l with an input file\n";
+    Usage(1);
+  }
+  if ($skipPendingRelease && $inputFile) {
+    print "Error: can't use -p with an input file\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: prepenv [options] [<input_file_name>]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-m          don't query for MRP location (assume same as previously)
+-i <number> use this internal version number for each component
+
+Options only valid in interactive mode:
+-l          print latest version number
+-p          skip those components that are pending release
+
+Note: if prepenv is failing to recognise some components are dirty,
+run 'envinfo -f' then run 'prepenv' again.\n");
+}
+
+sub PrepEnv {
+  if (defined $inputFile) {
+    HandleInputFile();
+  }
+  else {
+    HandleInteractive();
+  }
+}
+
+sub HandleInputFile {
+  open (IN, $inputFile) or die "Error: Couldn't open $inputFile: $!\n";
+  my $numEntriesUpdated = 0;
+  my $numEntriesAdded = 0;
+  my $numErrors = 0;
+  my $lineNum = 0;
+  while (my $line = <IN>) {
+    ++$lineNum;
+    # Remove line feed, white space and comments.
+    chomp $line;
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+
+    local @ARGV;
+    @ARGV = split (/\s+/, $line);
+    my $mrpName;
+    GetOptions("m=s" => \$mrpName);
+    (my $comp, my $ver, my $intVer) = @ARGV;
+    unless (defined $comp and defined $ver and $#ARGV <= 2) {
+      die "Error: Line $lineNum contains invalid arguments in \"$inputFile\"\n";
+    }
+    $intVer ||= undef;
+    $mrpName ||= undef;
+    if (!defined $mrpName && $samemrps) {
+      eval {
+        $mrpName = $envDb->MrpName($comp);
+      };
+      if ($@) {
+        die "Error: Could not get MRP location for \"$comp\", because $@\n";
+      }
+    }
+    if (!defined $intVer && $fixedIntVer) {
+      $intVer = $fixedIntVer;
+    }
+    my $updating = $envDb->Version($comp);
+    if ($verbose) {
+      if (defined $updating) {
+	print "Updating $comp $ver...\n";
+      }
+      else {
+	print "Adding $comp $ver...\n";
+      }
+    }
+    eval {
+      PrepRel::PrepRel($iniData, $envDb, $comp, $ver, $intVer, $mrpName);
+    };
+    if ($@) {
+      print $@;
+      ++$numErrors;
+    }
+    elsif (defined $updating) {
+      ++$numEntriesUpdated;
+    }
+    else {
+      ++$numEntriesAdded;
+    }
+  }
+  close (IN);
+  print "$numEntriesAdded component(s) added, $numEntriesUpdated component(s) updated, $numErrors error(s)\n";
+}
+
+sub HandleInteractive {
+  my $verInfo = $envDb->VersionInfo();
+  my $numUpdatedEntries = 0;
+  my $numUnchangedEntries = 0;
+  foreach my $thisComp (sort keys %{$verInfo}) {
+    my $thisStatus = $envDb->Status($thisComp);
+    if ($thisStatus == EnvDb::STATUS_DIRTY or $thisStatus == EnvDb::STATUS_DIRTY_SOURCE or ($thisStatus == EnvDb::STATUS_PENDING_RELEASE && !$skipPendingRelease)) {
+      my $action = DoInteraction($thisComp, $verInfo->{$thisComp});
+      if ($action == UPDATED) {
+        ++$numUpdatedEntries;
+      }
+      else {
+        ++$numUnchangedEntries;
+      }
+    }
+  }
+  print "$numUpdatedEntries component(s) updated, $numUnchangedEntries component(s) unchanged\n";
+  if ($numUpdatedEntries + $numUnchangedEntries == 0) {
+    my $pendingReleaseString = $skipPendingRelease?"":" or pending release";
+    print <<ENDGIBBER;
+No components appeared dirty$pendingReleaseString. If you were expecting to see more dirty 
+components, run 'envinfo -f' then run prepenv again.
+ENDGIBBER
+  }
+}
+
+sub DoInteraction {
+  my $comp = shift;
+  my $ver = shift;
+  my $modified = 0;
+
+  ShowLatestVer($comp) if $printlatestversion;
+
+  print "$comp version [$ver] ";
+
+  my $newVer = <STDIN>;
+  chomp $newVer;
+  if ($newVer) {
+    $modified = 1;
+  }
+  else {
+    undef $newVer;
+  }
+
+  my $newIntVer;
+  if ($fixedIntVer) {
+    $newIntVer = $fixedIntVer;
+  } else {
+    my $intVer = $envDb->InternalVersion($comp);
+    print "$comp internal version ";
+    if (defined $intVer and !defined $newVer) {
+      print "[$intVer] ";
+    }
+    $newIntVer = <STDIN>;
+    chomp $newIntVer;
+    if ($newIntVer) {
+      $modified = 1;
+    }
+    else {
+      undef $newIntVer;
+    }
+  }
+
+  my $mrpName = $envDb->MrpName($comp);
+  my $newMrpName;
+  if ($samemrps) {
+    $newMrpName = $mrpName;
+  } else {
+    print "$comp mrp name [$mrpName] ";
+    $newMrpName = <STDIN>;
+    chomp $newMrpName;
+    if ($newMrpName) {
+      $modified = 1;
+    }
+    else {
+      undef $newMrpName;
+    }
+  }
+
+  my $return = UNCHANGED;
+  if ($modified) {
+    eval {
+      PrepRel::PrepRel($iniData, $envDb, $comp, $newVer, $newIntVer, $newMrpName);
+    };
+    if ($@) {
+      print $@;
+    }
+    else {
+      $return = UPDATED;
+    }
+  }
+
+  print "\n";
+  return $return;
+}
+
+sub ShowLatestVer {
+  my $comp = shift;
+  my $reldata = RelData->OpenSet($iniData, $comp, $verbose);
+  if ($reldata) {
+    my $reldatum = $reldata->[0];
+    if ($reldatum) {
+      print "$comp: Latest version: ".$reldatum->Version . " (internal version ".$reldatum->InternalVersion.")\n";
+      return;
+    }
+  }
+  print "No previous versions.\n";
+}
+
+__END__
+
+=head1 NAME
+
+PrepEnv - Prepares an environment for release.
+
+=head1 SYNOPSIS
+
+  prepenv [options] [<input_file_name>]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -i  <internal> use this internal version number instead of prompting
+  -m  don't prompt for MRP location
+
+Options valid only in interactive mode:
+
+  -l  show latest version number
+  -p  skip those components that are pending release
+
+=head1 DESCRIPTION
+
+Before an environment can be released, the status of each component that needs to be released must be set to I<pending release> and the new versions and F<mrp> names must be specified. C<PrepEnv> provides two ways of manipulating this information in the environment database:
+
+=over 4
+
+=item 1 Interactively
+
+If no arguments are given to C<PrepEnv>, it will enter an interactive mode asking for version, internal version and mrp name for each component in the database with a status of I<dirty> or I<binaries clean, source dirty> (or I<pending release> unless -p is specified). It won't ask for internal version or MRP name if you have used the -i or -m respectively. The current value of each will be presented in square brackets. Hitting I<return> will preserve the current value. If all the current values are selected for a particular component, it's environment database entry will not be changed, otherwise the values will be updated and its status will be set to I<pending release>.
+
+=item 3 Via an input file
+
+The name of an input file may be specified as an argument. The structure of each line in the file must be as follows:
+
+ <component_name> <version> [<internal_version>] [-m <mrp_name>]
+
+Note, you can optionally specify internal version (assuming the F<reltools.ini> keyword C<require_internal_versions> has not been specified) and F<mrp> name. You can also optionally specify a new F<mrp> name, but to distinguish this from an internal version you much precede it with '-m'.
+
+=back
+
+Note, C<PrepEnv> (and its counterpart C<PrepRel>) do nothing more than update your the environment database. You can execute these commands as many times as you like before running C<MakeEnv> to actually release the environment.
+
+C<PrepEnv> does not always identify dirty components correctly. If you've just made a component dirty, then run C<prepenv> immediately afterwards, it will not notice that dirty component. To solve this you should run C<EnvInfo -f> before running C<PrepEnv>. C<PrepEnv> will then ask you about components correctly. This is a deliberate design decision: otherwise, C<PrepEnv> would have to do a slow environment scan before prompting you. Normally, you'll have run C<envinfo -f> first, so the environment scan is redundant.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PrepEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PrepRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,148 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use Utils;
+use PrepRel;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $mrpName;
+my $comp;
+my $ver;
+my $intVer;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PrepRel');
+my $envDb;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrepRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "m=s" => \$mrpName, "v+" => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+  $intVer = shift @ARGV;
+
+  unless (defined $comp and $#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: preprel [options] <component> [<version>] [<internal_version>]
+
+options:
+
+-h             help
+-m <mrp_name>  specify a new mrp file name
+-v             verbose output (-vv very verbose)\n");
+}
+
+sub PrepRel {
+  my $updating = $envDb->Version($comp);
+  PrepRel::PrepRel($iniData, $envDb, $comp, $ver, $intVer, $mrpName);
+  if (not $ver and not $mrpName) {
+    print "$comp removed\n";
+  }
+  elsif (not $ver and $mrpName) {
+    print "$comp mrp updated\n";
+  }
+  elsif ($updating) {
+    print "$comp updated\n";
+  }
+  else {
+    print "$comp added\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+PrepRel - Prepares a component for release.
+
+=head1 SYNOPSIS
+
+  preprel [options] <component> [<version>] [<internal_version>]
+
+options:
+
+  -h             help
+  -m <mrp_name>  specify a new mrp file name
+  -v             verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Before a component can be released, it's environment database status must be set to I<pending release>. Also, a new version (and optionally internal version - note, if the C<reltools.ini> keyword C<require_internal_versions> has be set, an internal version is manatory) must be specifed. C<PrepRel> provides a means of editing this information in the environment database. To check that the values have been correctly updated, use C<EnvInfo>. Note, this will now take longer to run because the information in the F<mrp> files of the components pending release will need to be gathered. To remove the environment database entry for a component altogether, execute C<PrepRel> with no version.
+
+Note, C<PrepRel> (and its counterpart C<PrepEnv>) do nothing more than update your the environment database. You can execute these commands as many times as you like before running C<MakeEnv> to actually release the environment.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PrepRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PrepRel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,171 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package PrepRel;
+
+use strict;
+use IniData;
+use MrpData;
+use Utils;
+
+
+#
+# Public.
+#
+
+sub PrepRel {
+  my $iniData = shift;
+  my $envDb = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $intVer = shift;
+  my $mrpName = shift;
+
+  $envDb->CheckCompName($comp);
+  die "Error: $ver is not a valid version number\n" if (defined $ver && !$ver);
+  die "Error: $intVer is not a valid internal version number\n" 
+    if (defined $intVer && !$intVer);
+
+  if (not defined $ver and not defined $intVer and not defined $mrpName) {
+    RemoveDbEntry($envDb, $comp);
+    return;
+  }
+
+  my $updating = 0;
+  if (not defined $ver) {
+    $ver = $envDb->Version($comp);
+    if (not defined $ver) {
+      die "Error: $comp not installed; could not work out what version to use. Please specify a version number.\n";
+    }
+    elsif ($envDb->Status($comp) != EnvDb::STATUS_PENDING_RELEASE) {
+      die "Error: New version not specified\n";
+    }
+    else {
+      $updating = 1;
+    }
+  }
+  else {
+    my $currentVer = $envDb->Version($comp);
+    if (defined $currentVer) {
+      if (lc($ver) eq $currentVer) {
+	$updating = 1;
+      }
+    }
+    my $relDir = $iniData->PathData->LocalArchivePathForExistingOrNewComponent($comp,$ver);
+    if (-e $relDir) {
+      die "Error: $comp $ver already exists\n";
+    }
+  }
+
+  if (not defined $intVer and $iniData->RequireInternalVersions() and not $updating) {
+    die "Error: Internal version number not specified for $comp $ver\n";
+  }
+
+  if (defined $mrpName) {
+    Utils::CheckExists($mrpName);
+    Utils::AbsoluteFileName(\$mrpName);
+    
+    if($iniData->HasMappings()) {
+      $mrpName = $iniData->PerformReverseMapOnFileName($mrpName);
+    }
+    
+    $mrpName = Utils::RemoveSourceRoot($mrpName);
+  }
+  else {
+    my $currentVersion = $envDb->Version($comp);
+    unless (defined $currentVersion) {
+      die "Error: Mrp name not specified for $comp $ver\n";
+    }
+  }
+
+  $envDb->SetVersion($comp, $ver);
+  $envDb->SetStatus($comp, EnvDb::STATUS_PENDING_RELEASE);
+  if (defined $mrpName) {
+    $envDb->SetMrpName($comp, $mrpName);
+  }
+  if (defined $intVer) {
+    $envDb->SetInternalVersion($comp, $intVer);
+  }
+  $envDb->GenerateEmptySignature($comp, $ver);
+}
+
+
+#
+# Private.
+#
+
+sub RemoveDbEntry {
+  my $envDb = shift;
+  my $comp = shift;
+  my $ver = $envDb->Version($comp);
+  if (defined $ver) {
+    print "Remove environment database entry for $comp? [y/n] ";
+    my $response = <STDIN>;
+    chomp $response;
+    if ($response =~ /^y$/i) {
+      $envDb->DeleteSignature($comp, $ver);
+      $envDb->SetVersion($comp, undef);
+    }
+    else {
+      die "Remove aborted\n";
+    }
+  }
+  else {
+    die "Error: $comp not installed\n";
+  }
+}
+
+
+1;
+
+=head1 NAME
+
+PrepRel.pm - Provides an interface to edit the environment database to prepare a component for release.
+
+=head1 WARNING!
+
+This is NOT the documentation for the command C<PrepRel>. This documentation refers to the internal release tools module called F<PrepRel.pm>. 
+
+For the PrepRel command documentation, you'll need to explicitly specify the path to the C<PrepRel> command,
+
+=head1 INTERFACE
+
+=head2 PrepRel
+
+Expects to be passed an C<IniData> reference, an C<EnvDb> reference, a component name. May optionally be passed in addition a version, an internal version and an F<mrp> file name. If no version parameter is specified, the component's database entry is removed. Otherwise the component's database entry is updates with the information provided, and its status set to C<STATUS_PENDING_RELEASE>.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PullEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,147 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Copy;
+use File::Path;
+use IniData;
+use RelData;
+use PathData;
+use CommandController;
+use PushPullRel;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $force = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PullEnv');
+my $comp;
+my $ver;
+my $externalIniDataFile;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PullEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+  $externalIniDataFile = shift @ARGV;
+
+  unless (defined $comp and defined $ver and defined $externalIniDataFile and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  unless (-e $externalIniDataFile) {
+    die "Error: $externalIniDataFile does not exist\n";
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: pullenv [options] <component> <version> <remote-reltools-ini-file>
+
+options:
+
+-h  help
+-f  if check fails, overwrite local copy
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub PullEnv {
+  my $ppr = new PushPullRel(
+    $iniData,
+    $externalIniDataFile,
+    0, # pushing
+    $verbose,
+    $force
+  );
+  $ppr->TransferEnv($comp,$ver);
+  $ppr->SummariseErrors;
+}
+
+
+__END__
+
+=head1 NAME
+
+PullEnv - Copies a released environment from another archive.
+
+=head1 SYNOPSIS
+
+  pullenv [options] <component> <version> <remote-reltools-ini-file>
+
+options:
+
+  -h  help
+  -f  if check fails, overwrite local copy
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+If two sites that share a common WAN want to have separate local archives, the commands C<PushEnv> and C<PullEnv> can be used to keep them in sync. They are similar is spirit to C<ExportEnv> and C<ImportEnv>, however the files are copied directly rather than being encrypted and placed on a shared repository.
+
+For each component in the specified external environment, checks to see if the corresponding release directory exists in the local archive. If it does, each if is checked to ensure its modified time and size is that same as in the external archive. If the check fails an error is thrown (by default, unless the C<-f> switch is used). If is does not, the directory is created and the component is copied into it.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PullEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PushEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,145 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Copy;
+use IniData;
+use RelData;
+use PathData;
+use CommandController;
+use PushPullRel;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $force = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PushEnv');
+my $comp;
+my $ver;
+my $externalIniDataFile;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PushEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+  $externalIniDataFile = shift @ARGV;
+
+  unless (defined $comp and defined $ver and defined $externalIniDataFile and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  unless (-e $externalIniDataFile) {
+    die "Error: $externalIniDataFile does not exist\n";
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: pushenv [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+-h  help
+-f  if check fails, overwrite external copy
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub PushEnv {
+  my $ppr = new PushPullRel(
+    $iniData,
+    $externalIniDataFile,
+    1, # pushing
+    $verbose,
+    $force
+  );
+  $ppr->TransferEnv($comp,$ver);
+  $ppr->SummariseErrors;
+}
+
+__END__
+
+=head1 NAME
+
+PushEnv - Copies a released environment to another archive.
+
+=head1 SYNOPSIS
+
+  pushenv [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+  -h  help
+  -f  if check fails, overwrite external copy
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+If two sites that share a common WAN want to have separate local archives, the commands C<PushEnv> and C<PullEnv> can be used to keep them in sync. They are similar is spirit to C<ExportEnv> and C<ImportEnv>, however the files are copied directly rather than being encrypted and placed on a shared repository.
+
+For each component in the specified local environment, checks to see if the corresponding release directory exists on the remote site. If it does, each if is checked to ensure its modified time and size is that same as in the local archive. If the check fails an error is thrown (by default, unless the C<-f> switch is used). If is does not, the directory is created and the component is copied into it.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PushEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/PushPullRel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,253 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# PushPullRel - abstracts out common parts of PushEnv, PullEnv, PushRel, PullRel
+#
+
+package PushPullRel;
+
+use strict;
+use File::Copy;
+use IniData;
+use RelData;
+use PathData;
+use CommandController;
+
+sub new {
+  my $class = shift;
+  my $localinidata = shift;
+  my $foreigninifile = shift; # can be an ini file location or an IniData object
+  my $pushing = shift; # flag, whether we're pushing a release or pulling it
+  my $verbose = shift;
+  my $force = shift;
+
+  my $self = bless {}, (ref $class || $class);
+
+  $self->{localinidata} = $localinidata;
+  if (ref $foreigninifile) {
+    $self->{foreigninidata} = $foreigninifile;
+  } else{ 
+    $self->{foreigninidata} = IniData->New($foreigninifile);
+  }
+
+  $self->{pushing} = $pushing || 0;
+  if ($self->{pushing}) {
+    $self->{frominidata} = $self->{localinidata};
+    $self->{toinidata} = $self->{foreigninidata};
+  } else {
+    $self->{toinidata} = $self->{localinidata};
+    $self->{frominidata} = $self->{foreigninidata};
+  }
+  $self->{errors} = [];
+  $self->{verbose} = $verbose;
+  $self->{force} = $force;
+
+  return $self;
+}
+
+sub TransferRel {
+  my $self = shift;
+  my $thisComp = shift;
+  my $thisVer = shift;
+  eval {
+    my $toRelDir = $self->{toinidata}->PathData->LocalArchivePathForExistingOrNewComponent($thisComp, $thisVer);
+    my $fromRelDir = $self->{frominidata}->PathData->LocalArchivePathForExistingComponent($thisComp, $thisVer);
+    die "Error: Couldn't find component \"$thisComp\" \"$thisVer\"\n" unless defined $fromRelDir;
+    $self->PerformCopying($thisComp, $thisVer, $toRelDir, $fromRelDir);
+  };
+
+  if ($@) {
+    print "$@";
+    $self->_AddError($@);
+  }
+}
+
+sub PerformCopying {
+  my $self = shift;
+  my $thisComp = shift;
+  my $thisVer = shift;
+  my $toRelDir = shift;
+  my $fromRelDir = shift;
+  
+  if (-e $toRelDir and Utils::CrossCheckDirs($toRelDir, $fromRelDir)) {
+    print "$thisComp $thisVer already present\n";
+  }
+  elsif (-e $toRelDir) {
+    if ($self->{force}) {
+      print "Overwriting \"$toRelDir\" with \"$fromRelDir\"...\n";
+      $self->_DoCopying($fromRelDir, $toRelDir);
+    }
+    else {
+      die "\"$toRelDir\" present, but doesn't match \"$fromRelDir\". Use -f to force copy.\n";
+    }
+  }
+  else {
+    # Directory not present, so create an copy release files.
+    print "Copying $thisComp $thisVer to \"$toRelDir\"...\n";
+    $self->_DoCopying($fromRelDir, $toRelDir);
+  }
+}
+
+sub TransferEnv {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $relData = RelData->Open($self->{frominidata}, $comp, $ver, $self->{verbose});
+  my $env = $relData->Environment();
+
+  my @errors;
+  foreach my $thisComp (sort keys %{$env}) {
+    my $thisVer = $env->{$thisComp};
+    $self->TransferRel($thisComp, $thisVer);
+  }
+}
+
+sub Errors {
+  my $self = shift;
+  return @{$self->{errors}} if wantarray;
+  return $self->{errors};
+}
+
+sub SummariseErrors {
+  my $self = shift;
+  my $copyRel = shift || 0;
+  
+  my $errors = $self->Errors;
+  if ($#$errors >= 0) {
+    print "\nSummary of errors:\n\n";
+    foreach my $thisError (@$errors) {
+      print $thisError;
+    }
+    
+    if($copyRel){
+      print "\nError: Unable to copy release successfully\n";
+    }
+    else{
+      print "\nError: Unable to push/pull release successfully\n";
+    }
+  }
+}
+
+sub _DoCopying {
+  my $self = shift;
+  my $localRelDir = shift;
+  my $externalRelDir = shift;
+  die "Local release directory not provided" unless $localRelDir;
+  die "External release dir was undefined" unless defined $externalRelDir;
+  opendir(DIR, $localRelDir) or die "Error: Couldn't open directory \"$localRelDir\": $!\n";
+  Utils::MakeDir($externalRelDir);
+  
+  while (defined(my $file = readdir(DIR))) {
+    next if ($file eq '.' or $file eq '..');
+    my $localFile = "$localRelDir\\$file";
+    my $externalFile = "$externalRelDir\\$file";
+    if (-f $localFile) {
+      if (-e "$externalRelDir\\$file" and $self->{force}) {
+        if ($self->{verbose}) { print "\tMaking \"$externalRelDir\\$file\" writable...\n"; }
+        Utils::SetFileWritable("$externalRelDir\\$file");
+      }
+      elsif (-e "$externalRelDir\\$file") {
+        die;
+      }
+      if ($self->{verbose}) { print "\tCopying \"$localFile\" to \"$externalRelDir\"...\n"; }
+      
+      unless (copy ($localFile, $externalFile)){
+         my $errormessage = $!;
+         
+         if($errormessage =~ /No such file or directory/i) {
+           $errormessage = "Unknown Error - Check disk space or missing file/directory";
+         }
+
+         die "Error: Couldn't copy \"$localFile\" to \"$externalFile\": $errormessage";
+      }
+    }
+    else {
+      die "Error: \"$file\" is not a file\n";
+    }
+  }
+}
+
+sub _AddError {
+  my $self = shift;
+  my $error = shift;
+  push @{$self->{errors}}, $error;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+PushPullRel.pm - class for moving releases between two local archives
+
+=head1 DESCRIPTION
+
+Provides an API to transfer releases between two local archives. (That is, non-encrypted archives,
+accessible as standard disk drives from the PC). Used by C<pushenv>, C<pullenv>, C<pushrel>,
+C<pullrel>.
+
+=head1 INTERFACE
+
+=head2 new
+
+Creates a new object of this class. Takes five parameters. 1) An IniData object corresponding
+to your local repository. 2) A foreign IniData object (or just a filename) describing the 
+remote repository. 3) A boolean, saying whether you're pushing to the remote site. If false,
+assumes you're pulling from the remote site. 4) Verbose. 5) Force (overwrites).
+
+=head2 TransferRel
+
+Takes a component name and version. Transfers that component.
+
+=head2 TransferEnv
+   
+Takes a component name and version. Transfers the environment of that component.
+
+=head2 PerformCopying
+
+Takes a component name, version, to release and from release directory. Performs initial checks on the release directories passed and then calls _DoCopying.
+
+=head2 Errors
+
+Returns an arrayref of all the errors encountered during TransferEnv.
+
+=head2 SummariseErrors
+
+Optional input copyRel flag which indicates whether to this summary is for a copyrel or not. Prints all the errors encountered.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/QuickStart	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,162 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+=head1 Overview
+
+This document is intended to familiarise the reader with basic release tool commands. It covers topics such as installing and upgrading a development environment, and viewing details about particular releases within that environment. It does not cover the process of preparing new environments or making releases (see the document I<Making Releases> for material on that topic).
+
+=head1 Glossary
+
+=over 4
+
+=item *
+
+B<Component> - A deliverable piece of software.
+
+=item *
+
+B<Release> - A delivery of a component (may contain source or binaries or both).
+
+=item *
+
+B<Version> - The name of a specific component release (must be unique).
+
+=item *
+
+B<Baseline> - A set of component releases (referred to by their version) that are known to work together.
+
+=item *
+
+B<Environment> - A development drive that contains an F<\epoc32> tree generated from the binaries in a set of component releases.
+
+=back
+
+=head1 Getting an Environment
+
+When ever a component release is made, the release tools make note of the entire environment from which it was made. To install the environment from which the component C<mycomp> version C<059> was made, use the command C<GetEnv>:
+
+  getenv mycomp 059
+
+This will install into the root of the current drive all the binaries that were present when C<mycomp 059> was released. It is possible therefore to reproduce the environment from which any component release has been made. Normally, however, each project will have official environments that are prepared by a build / integration team. They will release a dummy component (normally the name of the project) that can be used to reproduce these official environments. The dummy component will probably not contain any binaries, but should contain a set of release notes (see the section I<Viewing a Component's Release Notes>).
+
+=head1 Upgrading a Single Component
+
+Single components can be installed into an environment using the command C<GetRel>, for example:
+
+  getrel mycomp 060
+
+If a version of C<mycomp> is already installed in the current environment, it's binaries will be removed before those from C<060> are installed.
+
+=head1 Upgrading to a New Environment
+
+The command C<GetEnv> can be used to upgrade an existing environment, for example:
+
+  getenv myproject 030
+
+As with C<GetRel>, old component versions are removed before the new are installed. If environment already contains something similar to C<myproject 030>, the process of upgrading it should be fairly quick.
+
+=head1 Viewing the State of an Environment
+
+The component versions that are currently installed in an environment can be listed with the following command:
+
+  envinfo
+
+Which will display something like:
+
+ Component   Version
+
+ mycomp1     032
+ mycomp2     036
+
+=head1 Getting the Source Code for a Component
+
+By default, the commands C<GetEnv> and C<GetRel> do not install the source code contained within component releases. If you want to get the source for a single component, use the command C<GetSource>:
+
+  getsource mycomp
+
+This will unpack the source for the currently installed version of C<mycomp> into the root of the current drive. Note, the commands C<GetEnv> and C<GetRel> both have a C<-s> switch that instructs them to unpack source code as well as binaries. Note also that the release tools make no attempt to keep track of source files that have been unpacked into a drive (unlike binary files, which they do keep track of). This means that any existing files of the same name will be over written.
+
+There's also a C<RemoveSource> command.
+
+=head1 Viewing a Component's Release Notes
+
+The release notes for a component can be compiled on the fly using the command C<ViewNotes>. This will compile the release notes into a temporary file and then launch your default web browser to view. For example:
+
+  viewnotes mycomp 032
+
+If the version is ommitted, then the notes for the version that is currently installed will be displayed. Note, C<ViewNotes> assumes that a web browser is already installed, and than there is an association between it and the file extension F<.html>.
+
+C<ViewNotes> can also be used to display a summary of all releases that have been made to date using the C<-s> switch. For example:
+
+  viewnotes -s mycomp 032
+
+This can be useful if you want to look back through old release notes.
+
+=head1 Other information commands
+
+C<BinInfo> lists all the binary files belonging to a component, or to which component a given binary file belongs. C<SourceInfo> does exactly the same with source code directories.
+
+C<EnvMembership> and C<DiffEnv> show you information about the contents of different environments. C<ListComponents>, C<LatestVer> and C<EnvSize> report the contents of the local archive.
+
+=head1 Recovering your Environment to a Known State
+
+If you have forgotten what's on your development drive, and you want to get it back to a clean baseline, you could use C<EnvInfo -f> to examine it, then reinstall all the dirty components and delete any loose files. But C<CleanEnv> does this automatically.
+
+=head1 Viewing the Source Differences between Two Component Releases
+
+The command C<DiffRel> can be used to compare the source of two releases using a differencing tool of your choice (this must be specified in the release tools configuration file C<reltools.ini> - see the installation guide for details). For example...
+
+  diffrel mycomp 031 032
+
+...will diff C<mycomp> version C<031> against version C<032>. Alternatively...
+
+  diffrel mycomp 031 \mycomp
+
+...will diff C<mycomp 031> against the source in the directory F<\mycomp>.
+
+=head1 Making Releases
+
+See the separate Making Releases document.
+
+=head1 Importing and Exporting Releases
+
+This is the process of transferring a release from one site to another. It involves encryption, and typically FTP sites. See the separate Exporting and Importing Releases document.
+
+=head1 "Validation"
+
+If you have two releases that you believe to be the same, you can use the commands C<ValidateRel> and C<ValidateEnv> to compare them. The comparison is intelligent and ignores differences in the timestamps in DLL headers (it uses the standard Symbian utility 'evalid').
+
+In particular, if you have constructed a baseline of many individual component releases, we recommend that you occasionally do a 'full build' of all the source code. You can then use 'validateenv' to ensure that the full build has produced the same results as all the individual components.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RelData.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,567 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package RelData;
+
+use strict;
+use Data::Dumper;
+use MrpData;
+use PathData;
+
+#
+# Data version history.
+#
+# 1 - Original release.
+# 2 - Added 'relToolsVer' tag.
+#
+
+
+#
+# Public.
+#
+
+sub New {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{iniData} = shift;
+  $self->{mrpData} = shift;
+  $self->{notesSrc} = shift;
+  $self->{data}->{env} = shift;
+  $self->{data}->{toolName} = shift;
+  $self->{verbose} = shift;
+  $self->{dontPersist} = shift;
+  $self->{project} = shift;
+
+  $self->{comp} = $self->{mrpData}->Component();
+  $self->{ver} = $self->{mrpData}->ExternalVersion();
+  $self->{data}->{dataFormatVer} = 2;
+  $self->{data}->{intVer} = $self->{mrpData}->InternalVersion();
+  $self->{data}->{mrpName} = $self->{mrpData}->MrpName();
+  $self->{data}->{relToolsVer} = Utils::ToolsVersion();
+  $self->{data}->{notesSrc}->{srcFilterErrors} = $self->{mrpData}->SourceFilterErrors();
+  $self->{data}->{notesSrc}->{date} = localtime;
+  
+  foreach my $srcitem (keys %{$self->{mrpData}->SourceItems()}) {
+    if($self->{iniData}->HasMappings()){
+      $srcitem = $self->{iniData}->PerformReverseMapOnFileName($srcitem);
+      $srcitem = Utils::RemoveSourceRoot($srcitem);
+    }
+
+    $self->{data}->{srcitems}->{$srcitem} = 1;
+  }
+
+  unless(defined $self->{data}->{srcitems}){
+    $self->{data}->{srcitems} = $self->{mrpData}->SourceItems();
+  }
+  
+  $self->{data}->{envUserName} = ($ENV{FirstName} || '') . " " . ($ENV{LastName} || '');
+  $self->ParseNotesSource();
+  $self->WorkOutFirstCompatibleVersion();
+  unless (defined $self->{dontPersist}) {
+    $self->WriteToFile();
+  }
+  return $self;
+}
+
+sub Open {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  $self->{iniData} = shift;
+  $self->{comp} = shift;
+  $self->{ver} = shift;
+  $self->{verbose} = shift;
+  $self->ReadFromFile();
+  return $self;
+}
+
+sub OpenExternal {
+  my $pkg = shift;
+  my $externalArchive = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $self = {};
+  $self->{comp} = $comp;
+  $self->{ver} = $ver;
+  my $externalFile = File::Spec->catdir($externalArchive, $comp, $ver);
+  bless $self, $pkg;
+  $self->ReadFromSpecificFile($externalFile);
+  return $self;
+}
+
+
+sub OpenSet {
+  my $pkg = shift;
+  my $iniData = shift;
+  my $comp = shift;
+  my $verbose = shift;
+  my $versionfilter = shift;
+  
+  my @relDataObjects;
+  foreach my $ver (@{$iniData->PathData->ListVersions($comp, 0, $versionfilter, $iniData->LatestVerFilter)}) {
+    my $thisRelData = {};
+    bless $thisRelData, $pkg;
+    eval {
+      # ReadFromFile may die, if the file is corrupt.
+      # In which case we do not add it to the set.
+      $thisRelData->{iniData} = $iniData;
+      $thisRelData->{comp} = $comp;
+      $thisRelData->{ver} = $ver;
+      $thisRelData->{verbose} = $verbose;
+      $thisRelData->ReadFromFile();
+      push (@relDataObjects, $thisRelData);
+    };
+    print "Warning: could not examine \"$comp\" \"$ver\" because $@" if ($@);
+  }
+  
+  @relDataObjects = sort { $b->ReleaseTime() <=> $a->ReleaseTime() } @relDataObjects;
+
+  return \@relDataObjects;;
+}
+
+sub Component {
+  my $self = shift;
+  die unless exists $self->{comp};
+  return $self->{comp};
+}
+
+sub MadeWith {
+  my $self = shift;
+  my $ver = $self->{data}->{relToolsVer} || "(unknown version)";
+  my $tool = $self->{data}->{toolName} || "(unknown tool)";
+  return "$tool $ver";
+}
+
+sub MadeWithVersion {
+  my $self = shift;
+  return "".$self->{data}->{relToolsVer};
+}
+
+sub SourceIncluded {
+  my $self = shift;
+  my $items;
+  eval {
+    $items = $self->SourceItems();
+  };
+  return "(unknown)" if $@;
+  return join (", ", keys %$items);
+}
+
+sub Version {
+  my $self = shift;
+  die unless exists $self->{ver};
+  return $self->{ver};
+}
+
+sub InternalVersion {
+  my $self = shift;
+  die unless exists $self->{data};
+  return $self->{data}->{intVer};
+}
+
+sub MrpName {
+  my $self = shift;
+  die unless exists $self->{data};
+  return $self->{data}->{mrpName};
+}
+
+sub FirstCompatibleVersion {
+  my $self = shift;
+  die unless exists $self->{data};
+  return $self->{data}->{firstCompatibleVersion};
+}
+
+sub Environment {
+  my $self = shift;
+  die unless exists $self->{data};
+  return $self->{data}->{env};
+}
+
+sub NotesSource {
+  my $self = shift;
+  die unless exists $self->{data};
+  return $self->{data}->{notesSrc};
+}
+
+sub UpdateProject {
+  my $self = shift;
+  $self->{project} = shift;
+  $self->WriteToFile();
+}
+
+sub UpdateNotes {
+  my $self = shift;
+  $self->{notesSrc} = shift;
+  $self->DeleteNotesSource();
+  $self->ParseNotesSource();
+  $self->WriteToFile();
+}
+
+sub UpdateInternalVersion {
+  my $self = shift;
+  $self->{data}->{intVer} = shift;
+  $self->WriteToFile();
+}
+
+sub UpdateEnv {
+  my $self = shift;
+  $self->{data}->{env} = shift;
+  $self->WriteToFile();
+}
+
+sub ReleaseTime {
+  my $self = shift;
+  unless (exists $self->{releaseTime}) {
+    $self->{releaseTime} = Utils::TextTimeToEpochSeconds($self->{data}->{notesSrc}->{date});
+  }
+  return $self->{releaseTime};
+}
+
+sub SourceItems {
+  my $self = shift;
+  unless (defined $self->{data}->{srcitems}) {
+    my $createdver = $self->{data}->{relToolsVer} || 0;
+    if (Utils::CompareVers($createdver,2.54)<0) {
+      die "this release was created with Release Tools $createdver, and the necessary information is only present in releases created with 2.54 or later.\n";
+    }
+    die "Could not return the list of \"source\" statements used in the MRP file." 
+  }
+  return $self->{data}->{srcitems};
+}
+
+sub EnvUserName {
+  my $self = shift;
+  return $self->{data}->{envUserName};
+  }
+
+#
+# Private.
+#
+
+sub WriteToFile {
+  my $self = shift;
+  my $relDir = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($self->{comp}, $self->{ver}, $self->{project});
+
+  my $file = "$relDir\\reldata";  
+  
+  if (-e $file) {
+    Utils::SetFileWritable($file);
+  }
+  open (OUT, ">$file") or die "Error: Couldn't open \"$file\" for writing: $!\n";
+  print OUT Data::Dumper->Dump([$self->{data}], ['self->{data}']);
+  close (OUT);
+  Utils::SetFileReadOnly($file);
+}
+
+sub ReadFromFile {
+  my $self = shift;
+  my $pathData = shift || $self->{iniData}->PathData;
+
+  my $comp = $self->{comp};
+  my $ver = $self->{ver};
+
+  my $relDir = $pathData->LocalArchivePathForExistingComponent($comp, $ver);
+  die "Error: \"$comp $ver\" does not exist\n" unless $relDir;
+  die "Error: \"$comp $ver\" was not a valid release (can't find \"$relDir\\reldata\")\n" unless -e "$relDir\\reldata";
+  $self->{project} = $pathData->ComponentProject($comp, $ver);
+  $self->ReadFromSpecificFile($relDir);
+}
+
+sub ReadFromSpecificFile {
+  my $self = shift;
+  my $relDir = shift;
+  unless (-e $relDir) {
+    die "Error: $self->{comp} $self->{ver} does not exist\n";
+  }
+  my $file = "$relDir\\reldata";
+  open (IN, $file) or die "Error: Couldn't open \"$file\" for reading: $!\n";
+  local $/ = undef;
+  my $data = <IN>;
+  die "Error: Reldata in \"$relDir\" is blank" unless $data =~ (m/\S/);
+  eval ($data) or die "Error: Couldn't parse reldata in \"$relDir\"\n";
+  close (IN);
+}
+
+sub ParseNotesSource {
+  my $self = shift;
+
+  if ($self->{verbose} > 1) { print "Parsing notes source...\n"; }
+
+  open(SRC,"$self->{notesSrc}") or die "Unable to open $self->{notesSrc} for reading: $!\n";
+
+  my $thisTag;
+  while (<SRC>) {
+    if (m/^NOTESRC/i) {
+      chomp;
+      $thisTag = $_;
+    }
+    elsif (m/^\s*$/) {
+      next;
+    }
+    elsif (defined $thisTag) {
+      $self->AddLine($thisTag, $_);
+    }
+  }
+  close SRC;
+
+  $self->ValidateSource();
+}
+
+sub AddLine {
+  my $self = shift;
+  my $thisTag = shift;
+  my $thisLine = shift;
+  chomp $thisLine;
+
+  if ($thisTag =~ m/^NOTESRC_RELEASER$/i) {
+    $self->{data}->{notesSrc}->{releaser} = $thisLine;		
+  }
+  elsif ($thisTag =~ m/^NOTESRC_RELEASE_REASON$/i) {
+    push @{$self->{data}->{notesSrc}->{releaseReason}}, $thisLine;
+  }
+  elsif ($thisTag =~ m/^NOTESRC_GENERAL_COMMENTS$/i) {
+    push @{$self->{data}->{notesSrc}->{generalComments}}, $thisLine;
+  }
+  elsif ($thisTag =~ m/^NOTESRC_KNOWN_DEVIATIONS$/i) {
+    push @{$self->{data}->{notesSrc}->{knownDeviations}}, $thisLine;
+  }
+  elsif ($thisTag =~ m/^NOTESRC_BUGS_FIXED$/i) {
+    push @{$self->{data}->{notesSrc}->{bugsFixed}}, $thisLine;
+  }
+  elsif ($thisTag =~ m/^NOTESRC_BUGS_REMAINING$/i) {
+    push @{$self->{data}->{notesSrc}->{bugsRemaining}}, $thisLine;
+  }
+  elsif ($thisTag =~ m/^NOTESRC_OTHER_CHANGES$/i) {
+    push @{$self->{data}->{notesSrc}->{otherChanges}}, $thisLine;
+  }
+  else {
+    die "Error: Unknown tag \"$thisTag\" in $self->{notesSrc}\n";
+  }
+}
+
+sub ValidateSource {
+  my $self = shift;
+
+  if ($self->{verbose} > 1) { print "Validating notes source...\n"; }
+
+  unless (exists $self->{data}->{notesSrc}->{releaser}) {
+    die "Error <NOTESRC_RELEASER> not specified in $self->{notesSrc}\n";
+  } 
+  unless (exists $self->{data}->{notesSrc}->{releaseReason}) {
+    die "Error <NOTESRC_RELEASE_REASON> not specified in $self->{notesSrc}\n";
+  } 
+  unless (exists $self->{data}->{notesSrc}->{generalComments}) {
+    push @{$self->{data}->{notesSrc}->{generalComments}}, "<unspecified>";
+  } 
+  unless (exists $self->{data}->{notesSrc}->{knownDeviations}) {
+    push @{$self->{data}->{notesSrc}->{knownDeviations}}, "<unspecified>";
+  }
+  unless (exists $self->{data}->{notesSrc}->{bugsFixed}) {
+    push @{$self->{data}->{notesSrc}->{bugsFixed}}, "<unspecified>";
+  }
+  unless (exists $self->{data}->{notesSrc}->{bugsRemaining}) {
+    push @{$self->{data}->{notesSrc}->{bugsRemaining}}, "<unspecified>";
+  }
+  unless (exists $self->{data}->{notesSrc}->{otherChanges}) {
+    push @{$self->{data}->{notesSrc}->{otherChanges}}, "<unspecified>";
+  }
+}
+
+sub DeleteNotesSource {
+  my $self = shift;
+  delete $self->{data}->{notesSrc}->{releaser};		
+  delete $self->{data}->{notesSrc}->{releaseReason};
+  delete $self->{data}->{notesSrc}->{generalComments};
+  delete $self->{data}->{notesSrc}->{knownDeviations};
+  delete $self->{data}->{notesSrc}->{bugsFixed};
+  delete $self->{data}->{notesSrc}->{bugsRemaining};
+  delete $self->{data}->{notesSrc}->{otherChanges};
+}
+
+sub WorkOutFirstCompatibleVersion {
+  my $self = shift;
+
+  my $version = "2.00";
+  $version = "2.50" if ($self->{iniData}->CategoriseBinaries());
+  $version = "2.59" if ($self->{iniData}->CategoriseExports());
+  $version = "2.80.1000" if grep /[^A-GX]/, @{$self->{mrpData}->SourceCategories()}; 
+  # Add to this when extra features are added which break
+  # backward compatibility of release formats.
+  $self->{data}->{firstCompatibleVersion} = $version;
+}
+
+sub WarnIfReleaseTooNew {
+  my $self = shift;
+  # Called from EnvDb::InstallComponent
+  my $relversion = $self->FirstCompatibleVersion();
+  return unless defined $relversion;
+  my $toolsver = Utils::ToolsVersion;
+  if (Utils::CompareVers($relversion,$toolsver)>0) {
+    my $thisComp = $self->{comp};
+    print "Warning: $thisComp requires Release Tools version $relversion or later. You have $toolsver.\n";
+    print "         It's recommended you stop and upgrade your tools before continuing, as\n";
+    print "         the release probably won't install correctly.\n";
+    print "         Continue? [y/n] ";
+    my $response = <STDIN>;
+    chomp $response;
+    if (lc $response eq 'y') {
+      return;
+    }
+    die "Aborting operation.\n";
+  }
+}
+
+1;
+
+=head1 NAME
+
+RelData.pm - Provides an interface to data associated with a release.
+
+=head1 DESCRIPTION
+
+Along with the source and binaries of a component release, the following information is also stored:
+
+=over 4
+
+=item *
+
+The name of the F<mrp> file used to create the release.
+
+=item *
+
+The release's internal version.
+
+=item *
+
+The name and version of every component in the environment used to create the release.
+
+=item *
+
+The time and date the release was made.
+
+=item *
+
+The release notes source, which can subsequently be used to compile the release notes.
+
+=back
+
+All this information is stored in a single file named F<reldata> within the release directory using the module Data::Dumper.
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a new C<RelData> object and corresponding data file. Expects to be passed an C<IniData> reference, a component name, a version, an internal version,  an F<mrp> file name, release notes source file name, a reference to a list of components in the release environment and a verbosity level. This information is assembled into an in-memory data structure, and then written into F<reldata> in the component's release directory. You may optionally pass a "project" name to this function, to specify where the F<reldata> should be written.
+
+=head2 Open
+
+Creates a C<RelData> object from an already existing data file. Expects to be passed an C<IniData> reference, a component name, a version, and a verbosity level.
+
+=head2 OpenExternal
+
+As C<New> except expects to be explicitly passed an archive path file name, rather than an C<IniData> object. Effectively creates a C<RelData> object from an external archive.
+
+=head2 OpenSet
+
+Expects to be passed an C<IniData> reference, a component name, and a verbosity level. Opens C<RelData> objects for all of the releases of the specified component made to date and returns a reference to an array of references to them in descending date order.
+
+Optionally takes a regular expression to limit the versions that are returned.
+
+=head2 Component
+
+Returns the component name.
+
+=head2 Version
+
+Returns the component's version.
+
+=head2 InternalVersion
+
+Returns the component's internal version.
+
+=head2 MrpName
+
+Returns the component's F<mrp> file name.
+
+=head2 Environment
+
+Returns a reference to a hash containing component name / version pairs for the components that were in the release environment.
+
+=head2 NotesSource
+
+Returns a reference to a hash containing all the data needed to compile a set of release notes.
+
+=head1 SourceItems
+
+Returns a reference to a hash of all the "source" lines that were in the MRP file used to create this component. This function will die if no such information was found; this means it will die for releases created with Release Tools versions prior to 2.54.
+
+Note that a hash is used just to ensure uniqueness. Only the keys of the hash have value; the values of the hash currently have no meaning.
+
+=head2 SourceIncluded
+
+Returns a string version of the output of SourceItems.
+
+=head2 UpdateProject
+
+Expects to be passed a project. The project passed is then set as the project for the reldata.pm object, which is used when writing the reldata file.
+
+=head2 UpdateNotes
+
+Expects to be passed the name of a notes source file. Parses this and replaces the persisted version of the release notes.
+
+=head2 UpdateInternalVersion
+
+Expects to be passed an internal version. The internal version is then set as internal version for the reldata.pm object, which is used when writing the reldata file.
+
+=head2 UpdateEnv
+
+Expects to be passed an environment. The environment is then set as environment for the reldata.pm object, which is used when writing the reldata file.
+
+=head2 ReleaseTime
+
+Returns the time (in epoch seconds) at which the release was made.
+
+=head2 MadeWith
+
+Returns a string describing which tool this was made with, including the version number.
+
+=head2 EnvUserName
+
+Returns the full name of the user who made this release, according to environment variables FirstName and LastName.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RelTransfer.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,199 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package RelTransfer;
+
+use strict;
+use Utils;
+
+#
+# Constructor
+#
+
+sub New {
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my %args = @_;
+  my $self = {iniData => $args{ini_data},
+	      verbose => $args{verbose},
+	      force => $args{force},
+        dummy => $args{dummy},
+	excludeSource => $args{excludeSource},
+        pgpPassPhrase => $args{passphrase}
+	     };
+  
+  if($self->{excludeSource}){
+    PrintHeinousWarning();
+  }
+  
+  $self->{verbose} ||= 1 if $self->{dummy};
+  bless $self, $class;
+  $self->Initialize();
+  return $self;
+}
+
+sub Initialize {
+  my $self = shift;
+  
+  Utils::InitialiseTempDir($self->{iniData});   #create and initialize temp dir
+  $self->{crypt} = $self->CreateCrypt();            #create a Crypt:: object
+  $self->{remoteSite} = $self->CreateRemoteSite();  #create a RemoteSite:: object
+}
+
+sub PrintHeinousWarning {
+  Utils::QueryUnsupportedTool(<<GUILTY, 0);  # Set $reallyrun as 0
+Warning: The use of the -e flag is for internal use only. Using the -e flag can corrupt an export archive if used incorrectly. Please ensure that the target export archive is specifically for non source releases. Export archives should not contain releases which contain both source and non source.
+
+Do you want to continue? (y/n)
+GUILTY
+}
+
+sub CreateCrypt {
+  my $self = shift;
+
+  my $module = 'Crypt::'.$self->{iniData}->PgpTool;
+  eval "require $module";
+  my $crypt = $module->New(default_path => $self->{iniData}->PgpConfigPath(),
+			   verbose => $self->{verbose});
+  return $crypt;
+}
+
+sub CreateRemoteSite {
+  my $self = shift;
+
+  my $module = 'RemoteSite::'.$self->{iniData}->RemoteSiteType();
+  eval "require $module";  
+  my $remote = $module->New(host => $self->{iniData}->RemoteHost(),
+			    username => $self->{iniData}->RemoteUsername(),
+			    password => $self->{iniData}->RemotePassword(),
+			    passive_mode => $self->{iniData}->PasvTransferMode(),
+			    resume_mode => $self->{iniData}->FtpServerSupportsResume(),
+			    proxy => $self->{iniData}->Proxy(),
+			    proxy_username => $self->{iniData}->ProxyUsername(),
+			    proxy_password => $self->{iniData}->ProxyPassword(),
+			    timeout => $self->{iniData}->FtpTimeout(),
+			    reconnects => $self->{reconnects},
+			    max_export_volume_size => $self->{iniData}->MaxExportVolumeSize(),
+			    verbose => $self->{verbose});
+  return $remote;
+}
+
+#
+# Abstract methods
+#
+
+sub TransferRelease {
+  my $self = shift;
+  $self->HandleError("Call to abstract method ".ref($_[0])."::TransferRelease");
+}
+
+#
+# Private
+#
+
+sub PathData {
+  my $self = shift;
+  return $self->{iniData}->PathData;
+}
+
+sub ReleaseExistsInLocalArchive {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $path = $self->PathData->LocalArchivePathForExistingComponent($comp, $ver); # undef if component doesn't exist
+  return ($path && -d $path);
+}
+
+sub ReleaseExistsOnRemoteSite {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  
+  my $relDir = $self->PathData->RemoteArchivePathForExistingComponent($comp, $ver, $self->{remoteSite});
+  return 0 unless $relDir;
+  return 1; # if RemoteArchivePathForExistingComponent returns a true value, then it exists
+}
+
+sub CleanupTempDir {
+  my $self = shift;
+  my $tempDir = Utils::TempDir();
+
+  print "Cleaning \"$tempDir\"...\n" if ($self->{verbose} > 1);
+
+  opendir(DIR, $tempDir) or die "Error: cannot open $tempDir\n";
+  my @allFiles = grep {$_ ne '.' and $_ ne '..'} map {"$tempDir/$_"} readdir DIR;
+  closedir(DIR);
+  unlink @allFiles;
+}
+
+sub HandleError {
+  my $self = shift;
+  my $errorString = shift;
+  
+  die "Error: $errorString\n";
+}
+
+#
+# Destructor
+#
+
+sub DESTROY {
+  my $self = shift;
+
+  if (-e Utils::TempDir()) {
+    Utils::RemoveTempDir();
+  }
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+RelTransfer.pm - Base class for modules used to export and import releases
+
+=head1 DESCRIPTION
+
+A typical project involves many development teams working at different locations. To share releases between the various sites a central repositry (e.g typically an FTP server) is setup with each team transferring releases to and from this remote site.
+
+This module is the base class for modules used to export and import single releases between the local archive and the remote site.
+
+The export and import subclass modules must implement the abstract method C<TransferRelease> to perform the actual export/import of the release. 
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RelTransfer/Export.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,458 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RelTransfer::Export.pm
+#
+
+package RelTransfer::Export;
+
+use strict;
+use ExportData;
+use Utils;
+use Cwd;
+
+use RelTransfer;
+use vars qw(@ISA);
+@ISA=("RelTransfer");
+
+#
+# Constructor
+#
+
+sub Initialize {
+  my $self = shift;
+
+  $self->SUPER::Initialize();
+  $self->{exportData} = ExportData->New(exports_file => $self->{iniData}->ExportDataFile(),
+					verbose => $self->{verbose});
+
+  #check to see if all the pgp keys used for exporting exist on the public keyring
+  my @pgpKeys = @{$self->{iniData}->PgpEncryptionKeys};
+  unless (@pgpKeys) {
+    die "Error: No PGP encrypting keys defined in reltools.ini\n";
+  }
+  push @pgpKeys, @{$self->{exportData}->AllPgpKeys};
+  foreach my $pgpKey (@pgpKeys) {
+    unless ($self->{crypt}->PublicKeyExists($pgpKey)) {
+      die "Error: PGP key $pgpKey is required for exporting but does not exist on public keyring\n";
+    }
+  }	
+}
+
+#
+# Public methods
+#
+
+sub CheckExportable {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  unless ($self->ReleaseExistsInLocalArchive($comp, $ver)) {
+    die "Error: $comp $ver does not exist in local archive\n";
+  }
+  unless ($self->{exportData}->ComponentIsExportable($comp)) {
+    print "Warning: component \"$comp\" is not defined in export table.\n";
+  }
+}
+
+sub TransferRelease {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  if ($self->{verbose}) {
+    print "\nExporting $comp $ver...\n";
+  }
+
+  #check to see if ok to export
+  unless ($self->ReleaseExistsInLocalArchive($comp, $ver)) {
+    die "Error: $comp $ver does not exist in local archive\n";
+  }
+
+  my $releaseExists = $self->ReleaseExistsOnRemoteSite($comp, $ver);
+  unless ($self->{exportData}->ComponentIsExportable($comp)) {
+    if (not $releaseExists or $self->{force}) {
+      die "Error: cannot export $comp: not defined in export table\n";
+    }
+    else {
+      if ($self->{verbose}) {
+	print "$comp $ver already exported to remote site\n";
+      }	
+      return 0;
+    }
+  }
+  else {
+    if ($releaseExists and not $self->{force}) {
+      if ($self->{verbose}) {
+	print "$comp $ver already exported to remote site\n";
+      }	
+      return 0;
+    }
+  }
+
+  #encrypt, zip and then send release to remote site
+  eval {
+    my $localdir = $self->PathData->LocalArchivePathForExistingComponent($comp, $ver);
+    print "Local directory for \"$comp\" \"$ver\" is \"$localdir\"\n" if ($self->{verbose});
+    $self->EncryptReleaseFiles($comp, $ver, $localdir);
+    $self->ZipEncryptedReleaseFiles($comp, $ver);
+    $self->SendZippedReleaseFile($comp, $ver, $localdir);
+    return 1 if ($self->{dummy});
+    my $localsize = $self->SizeOfNewlyZippedFile($comp, $ver);
+    my $remotesize = $self->SizeOfRemoteFile($comp, $ver);
+    $self->CompareSizes($localsize, $remotesize, $comp, $ver);
+  };
+  if ($@) {
+    my $error = $@;
+    $self->CleanupTempDir();
+    die $error;
+  }
+
+  #optionally send a log file to the remote site
+  if (defined $self->{iniData}->RemoteLogsDir) {
+    eval {
+      $self->SendLogFile($comp, $ver);
+    };
+    if ($@) {
+      print "Warning: Export of log file failed. $@\n";
+    }
+  }
+
+  #delete all the files in the temporary directory
+  $self->CleanupTempDir();
+
+  if ($self->{verbose}) {
+    print "$comp $ver successfully exported to remote site.\n";
+  }
+  return 1;
+}
+
+sub ExamineExportedRelease {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  unless ($self->ReleaseExistsInLocalArchive($comp, $ver)) {
+    die "Error: $comp $ver does not exist in local archive\n";
+  }
+
+  eval {
+    my $localdir = $self->PathData->LocalArchivePathForExistingComponent($comp, $ver);
+    my $remotesize = $self->SizeOfRemoteFile($comp, $ver);
+    $self->EncryptReleaseFiles($comp, $ver, $localdir);
+    $self->ZipEncryptedReleaseFiles($comp, $ver);
+    my $localsize = $self->SizeOfNewlyZippedFile($comp, $ver);
+    $self->CompareSizes($localsize, $remotesize, $comp, $ver);
+  };
+  if ($@) {
+    my $error = $@;
+    $self->CleanupTempDir();
+    die $error;
+  }
+
+  $self->CleanupTempDir();
+}
+
+#
+# Private methods
+#
+
+sub CompareSizes {
+  my $self = shift;
+  my $localsize = shift;
+  my $remotesize = shift;
+  my $comp = shift; # comp and ver are just used for error messages
+  my $ver = shift;
+
+  my $diff = abs ($remotesize - $localsize);
+  if ($diff == 0) {
+    return; # disappointingly rare
+  } elsif ($diff <=8) {
+    print "Warning: the size of the exported $comp $ver is slightly different ($remotesize) to the local copy ($localsize): difference $diff. This may be due to the way the remote site reports sizes, or the randomness of PGP encryption.\n" if ($self->{verbose});
+  } else {
+    die "Error: $comp $ver exported file size ($remotesize) differs from local copy ($localsize)\n";
+  }
+}
+
+sub SizeOfNewlyZippedFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  my $tempDir = Utils::TempDir();
+  my $zipName = "$tempDir/$comp$ver.zip";
+  die "Error: newly zipped file \"$zipName\" for $comp $ver didn't exist\n" unless -e $zipName;
+  return -s $zipName;
+}
+
+sub SizeOfRemoteFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  die "No component name provided to SizeOfRemoteFile" unless $comp;
+  die "No version for $comp provided to SizeOfRemoteFile" unless $ver;
+
+  my $remoteFile = $self->PathData->RemoteArchivePathForExistingComponent($comp, $ver, $self->{remoteSite})."/$comp$ver.zip";
+  die "Error: $comp $ver didn't exist on the remote site\n" unless $remoteFile;
+  return $self->{remoteSite}->FileSize($remoteFile);
+}
+
+sub EncryptReleaseFiles {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $relDir = shift;
+  my $tempDir = Utils::TempDir();
+  
+  my %excludedKeys;
+  @excludedKeys{@{$self->{exportData}->AllPgpKeys()}} = ();
+
+  #encrypt release files using pgp keys from export table and reltools.ini
+  opendir(RELDIR, $relDir) or die "Error: Cannot open $relDir\n";
+  while (defined(my $file = readdir RELDIR)) {
+    my @pgpKeys;
+    next if ($file =~ /^\.\.?$/);
+    
+    if ($file =~ /^(exports)([a-z])\.zip$/i or $file =~ /^(exports)([a-z])\.txt$/i) {
+      @pgpKeys = @{$self->{exportData}->PgpKeysForExports($comp, $2)};
+    }
+    elsif ($file =~ /^(source)([a-z])\.zip$/i or $file =~ /^(source)([a-z])\.txt$/i) {
+      if($self->{excludeSource}) {
+        print "Skipping the encryption of source file $file (in directory \"$relDir\")\n" if ($self->{verbose});	
+        next;
+      }
+      @pgpKeys = @{$self->{exportData}->PgpKeysForSource($comp, $2)};
+    }
+    elsif ( $file =~ /^reldata$/i ){
+      @pgpKeys = @{$self->{exportData}->PgpKeysForRelData($comp)};
+    }
+    elsif ($file =~ /^binaries.zip$/i or $self->IsBinaryZipRequired($comp, $ver, $file)) {
+      @pgpKeys = @{$self->{exportData}->PgpKeysForBinaries($comp)};
+    } 
+    else { 
+      die "Error: Unexpected release file \"$file\" in $comp $ver\n";
+    }
+
+    #do the encryption
+    if (@pgpKeys) {
+      push @pgpKeys, @{$self->{iniData}->PgpEncryptionKeys}; #encrypt with users keys aswell
+      print "Encrypting \"$file\" (in directory \"$relDir\") to keys @pgpKeys\n" if ($self->{verbose});
+        # Warning: productisation scripts may depend on the format of the above line.
+      $self->{crypt}->Encrypt("$relDir/$file", "$tempDir/$file.pgp", \@pgpKeys) unless ($self->{dummy});
+    
+      #Remove the keys that have been used from the list of keys which have been excluded for this release
+      delete @excludedKeys{@pgpKeys};
+    }
+  }
+  closedir(RELDIR);
+  
+  # DEF104279 The exclude keyword in the CBR export table breaks the exported archive.
+  # All keys which are not used for this release will be used to encrypt a file called exclude.txt
+  # When the release is imported it will not give the unable to decrypt any part error
+  # as it can decrypt the exclude.txt file.
+
+  if (keys %excludedKeys) {
+    # Create an exclude.txt in the reldir  
+    open (EXCLUDE, ">$tempDir/exclude.txt");
+    print EXCLUDE "If you can decrypt this file then this release has been excluded for you based on your PGP key\n";
+    close EXCLUDE;    
+    
+    $self->{crypt}->Encrypt("$tempDir/exclude.txt", "$tempDir/exclude.txt.pgp", \@{[keys %excludedKeys]}) unless ($self->{dummy});
+  }
+}
+
+sub IsBinaryZipRequired {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $zip = shift;
+
+  # If the required_binaries keyword isn't used, we need all builds
+  return 1 unless defined $self->{iniData}->RequiredBinaries($comp);
+
+  unless ($zip =~ /^binaries_(.*)\.zip$/) {
+    die "Error: Unexpected file \"$zip\" in $comp $ver\n";
+  }
+  my $category = $1;
+  foreach my $requiredBinary (@{$self->{iniData}->RequiredBinaries($comp)}) {
+    if ($category =~ /^$requiredBinary/) {
+      return 1;
+    }
+  }
+  return 0;
+}
+
+sub ZipEncryptedReleaseFiles {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  if ($self->{verbose}) {
+    print "Zipping encrypted files to $comp$ver.zip ...\n";
+  }
+	
+  #build up list of pgp encrypted files in TEMP_DIR 
+  my $tempDir = Utils::TempDir();  
+  opendir(TEMPDIR, $tempDir);
+  my @encryptedFiles = grep {/\.pgp$/} readdir TEMPDIR;
+  closedir(TEMPDIR);
+
+  unless (@encryptedFiles || $self->{dummy}) {
+    die "Error: No encrypted files exist in $tempDir\n";
+  }	
+
+  #zip list of pgp encrypted files (archive only, no compression)
+  my $origDir = getcwd();
+  chdir($tempDir);
+  my $zipName = "$tempDir/$comp$ver.zip";
+  print "Zipping @encryptedFiles to \"$zipName\"\n";
+  eval {
+    Utils::ZipList($zipName, \@encryptedFiles, $self->{verbose} > 1, 1) unless ($self->{dummy});
+  };
+  chdir ($origDir);
+  if ($@) {
+    die $@;
+  }	 
+}
+
+sub SendZippedReleaseFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $localdir = shift;
+  
+  my $localFile = Utils::TempDir()."/$comp$ver.zip";
+  my $remoteFile = $self->PathData->RemoteArchivePathForExportingComponent($comp, $ver, $localdir, $self->{remoteSite})."/$comp$ver.zip";
+
+  print "Sending \"$localFile\" to \"$remoteFile\"\n" if ($self->{verbose});
+  $self->{remoteSite}->SendFile($localFile, $remoteFile) unless ($self->{dummy});
+}
+
+sub SendLogFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  
+  my $localLogFile = Utils::TempDir()."/$comp$ver.log";
+  my $remoteLogFile = $self->{iniData}->RemoteLogsDir($comp)."/$comp$ver.log";
+
+  if ($self->{verbose}) {
+    print "Sending $comp $ver log file to remote site \"$remoteLogFile\"\n";
+  }
+
+  return if ($self->{dummy});
+
+  #create empty log file
+  open LOG, ">$localLogFile"  or die "Error: Cannot open $localLogFile for writing\n";
+  close LOG;
+
+  #send log file to the remote site
+  $self->{remoteSite}->SendFile($localLogFile, $remoteLogFile);
+
+  unlink $localLogFile;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+RelTransfer::Export.pm - Export releases to the remote site
+
+=head1 SYNOPSIS
+
+ use RelTransfer::Export;
+
+ $exporter = RelTransfer::Export->New(ini_data => $iniData,
+				      force => 1;
+				      verbose => 1);
+
+ $exporter->TransferRelease('componentname', 'componentversion');
+
+=head1 DESCRIPTION
+
+Implements the abstract TransferRelease method from the C<RelTransfer> base class module which transfers a release from the local archive to the remote site.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+ ini_data    =>  $iniData_object
+ force       =>  $force_integer
+ verbose     =>  $verbosity_integer
+
+Returns a reference to a C<RelTransfer::Export> object.
+
+=head2 TransferRelease
+
+Passed a component name and version number. Performs the following steps:
+
+=over 4
+
+=item *
+
+Check to see if the release can or needs to be exported. If the component does not exist in the users export table no attempt will be made to export it. If the component is listed in the export table but the release already exists on the remote site then, again, no attempt will be made to export it (unless the C<force> member variable is set to a nonzero value)
+
+=item *
+
+Encrypt the release files (ie source zips, binaries zip and reldata file). The keys used to encrypt the files depend on the data stored in the users export table 
+
+=item *
+
+Create a zip archive (without compression) of the encrypted files 
+
+=item *
+
+Send the release zip file to the remote site
+
+=item *
+
+If a remote logs dir is defined in the F<reltools.ini> file send an empty log file to the remote site 
+
+=back
+
+=head2 ExamineExportedRelease
+
+This goes through most of the same stages above, but instead of actually transferring the zip file, it will ensure that the size of the existing file on the remote site matches that which is expected.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RelTransfer/Import.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,344 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RelTransfer::Import.pm
+#
+
+package RelTransfer::Import;
+
+use strict;
+use Utils;
+use File::Copy;
+use File::Basename;
+use File::Path;
+use Cwd;
+use RelTransfer;
+use vars qw(@ISA);
+@ISA=("RelTransfer");
+
+#
+# Constructor
+#
+
+sub Initialize {
+  my $self = shift;
+
+  $self->SUPER::Initialize();
+
+  #set the passphrase for decryption
+  $self->SetPgpPassPhrase();
+}
+
+#
+# Public methods
+#
+
+sub TransferRelease {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $noPassphraseRetry = shift;
+
+  print "\nImporting $comp $ver...\n" if ($self->{verbose});
+
+  #check to see if ok to import
+  if ($self->ReleaseExistsInLocalArchive($comp, $ver) and not $self->{force}) {
+    my $localReleaseDir = $self->PathData->LocalArchivePathForExistingComponent($comp, $ver);
+    my $reldatafile = File::Spec->catfile( $localReleaseDir,"reldata");
+    if (-f $reldatafile) {
+      print "$comp $ver already exists in local archive\n" if ($self->{verbose});
+      return 0;
+    }
+    print "$comp $ver is corrupted - attempting to remove and re-import.\n";
+    my $origDir = cwd();
+
+    chdir(dirname($localReleaseDir)); #If you try to rmtree a UNC path the cwd must also be a UNC path
+    rmtree ($localReleaseDir) or die "$localReleaseDir can't be deleted\n";
+    chdir($origDir);
+  }
+  unless ($self->ReleaseExistsOnRemoteSite($comp, $ver)) {
+    die "Error: $comp $ver does not exist on remote site\n";
+  }
+
+  my $excludeRelease = 0;
+
+  #Get remote release file, unzip, decrypt and move to local archive
+  # We pass around the remote archive path because with the project-based
+  # PathData scheme, the remote location might affect which local location
+  # to put it in.
+  my $remoteDir = $self->PathData->RemoteArchivePathForExistingComponent($comp, $ver, $self->{remoteSite});
+  eval {
+    $self->GetZippedReleaseFile($comp, $ver, $remoteDir);
+    select STDOUT;$|=1;
+    $self->UnzipReleaseFile($comp, $ver);
+    select STDOUT;$|=1;
+    $self->DecryptReleaseFiles($comp, $ver, $noPassphraseRetry);
+    
+    # DEF104279 - If the users key can decrypt the exclude.txt then the user is not able to recieve this release.  
+    opendir(DIR, Utils::TempDir()) or die "Error: cannot open Utils::TempDir()\n";
+    $excludeRelease = 1 if (grep /exclude.txt$/, readdir DIR);
+    closedir(DIR);
+    
+    $self->MoveDecryptedFilesToArchive($comp, $ver, $remoteDir) if (!$excludeRelease);
+  };
+  if ($@) {
+    my $error = $@;
+    $self->CleanupTempDir();
+    my $localReleaseDir = $self->PathData->LocalArchivePathForImportingComponent($comp, $ver, $remoteDir);
+    if (-d $localReleaseDir) {
+      my $origDir = cwd();
+
+      chdir(dirname($localReleaseDir)); #If you try to rmtree a UNC path the cwd must also be a UNC path
+      rmtree ($localReleaseDir) or die "$localReleaseDir can't be deleted\n";
+      chdir($origDir);
+    }
+    die $error;
+  }
+  $self->CleanupTempDir();
+
+  print "$comp $ver successfully imported from remote site.\n" if ($self->{verbose} && !$excludeRelease);
+  return 1;
+}
+
+#
+# Private methods
+#
+
+sub GetZippedReleaseFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remoteDir = shift;
+
+  my $localFile = Utils::TempDir()."/$comp$ver.zip";
+  my $remoteFile = "$remoteDir/$comp$ver.zip";
+
+  $self->{remoteSite}->GetFile($remoteFile, $localFile);
+}
+
+sub UnzipReleaseFile {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+
+  if ($self->{verbose}) {
+    print "Unzipping $comp$ver.zip ...\n";
+  }	
+  my $tempDir = Utils::TempDir();
+  $tempDir =~ s/[\/\\]$//;
+  $tempDir .= "/";
+  my $zipName = File::Spec->catfile("$tempDir","$comp$ver.zip");
+
+  my $zip = Archive::Zip->new($zipName);
+  foreach my $member ($zip->members()) {
+    my $filename=$member->fileName();
+    eval {Utils::ExtractFile($tempDir, $filename,$member, 0, 1, $self->{verbose})};  # 0 is being passed in because we are not validating 1 = Overwrite.
+    die "$@\n" if ($@); 
+  }
+  unlink $zipName;
+}
+
+sub DecryptReleaseFiles {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $noPassphraseRetry = shift;
+
+  #build up list of pgp encrypted files in TEMP_DIR 
+  my $tempDir = Utils::TempDir();
+  opendir(TEMPDIR, $tempDir);
+  my @encryptedFiles = grep {/\.pgp$/} readdir TEMPDIR;
+  closedir(TEMPDIR);
+
+  my $noFilesDecrypted = 1;
+ TRYAGAIN:
+  foreach my $encryptedFile (@encryptedFiles) {
+    my ($decryptedFile) = ($encryptedFile =~ /(.+).pgp$/);
+
+    #set the passphrase for decryption
+    $self->SetPgpPassPhrase();
+    # returns if it's already set
+
+    if ($self->{verbose}) {
+      print "Decrypting $encryptedFile ... \n";
+    }
+    eval {
+      $self->{crypt}->Decrypt("$tempDir/$encryptedFile", "$tempDir/$decryptedFile", $self->{pgpPassPhrase});
+    };
+    if ($@) {
+      if ($@ =~ /BAD_PASSPHRASE/i) {
+	$@ =~ s/BAD_PASSPHRASE//;
+	print "Incorrect PGP passphrase\n";
+
+        if ($noPassphraseRetry) {
+          die "\n";
+        }
+
+	$self->{pgpPassPhrase} = undef;
+	redo TRYAGAIN;
+      }
+      elsif ($@ =~ /NO_SECKEY/i) {
+	# Do nothing - it's perfectly possible that we don't have access to certain release files, particularly
+	# since the addition of 'exclude' keyword to ExportData.
+      }	
+      else {
+	die $@;
+      }	
+    }
+    else {
+      $noFilesDecrypted = 0;
+    }
+    unlink "$tempDir/$encryptedFile";
+  }
+
+  if ($noFilesDecrypted) {
+    die "Error: Unable to decrypt any part of $comp $ver (see FAQ for more detail)\n";
+  }
+}
+
+sub MoveDecryptedFilesToArchive {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = shift;
+  my $remotedir = shift;
+
+  if ($self->{verbose}) {
+    print "Moving release files to local archive ... \n";
+  }
+  my $tempDir = Utils::TempDir(); 
+  opendir(DIR, $tempDir) or die "Error: cannot open $tempDir\n";
+  my @releaseFiles = grep {$_ ne '.' and $_ ne '..'} readdir DIR;
+  closedir(DIR);
+  if (grep(lc($_) eq "reldata", @releaseFiles)) {
+    # Move the 'reldata' entry to the end
+    @releaseFiles = grep(lc($_) ne "reldata", @releaseFiles);
+    push @releaseFiles, "reldata";
+  }
+  unless (@releaseFiles) {
+    die; # If we've got this far, there should have been some files decyrpted.
+  }
+
+  #create release directory if doesnot exist
+  my $localReleaseDir = $self->PathData->LocalArchivePathForImportingComponent($comp, $ver, $remotedir);
+  unless (-e $localReleaseDir) {
+    Utils::MakeDir($localReleaseDir);
+  }
+  else {
+    #clean the local release directory if it already exists
+    opendir(DIR, $localReleaseDir) or die "Error: cannot open $localReleaseDir\n";
+    my @allFiles = grep {$_ ne '.' and $_ ne '..'} map {"$localReleaseDir/$_"} readdir DIR;
+    closedir(DIR);
+    unlink @allFiles;
+  }
+  foreach my $releaseFile (@releaseFiles) {
+    move("$tempDir/$releaseFile", "$localReleaseDir/$releaseFile") or die "Error: Unable to move $tempDir/$releaseFile to $localReleaseDir/$releaseFile: $!";
+
+    Utils::SetFileReadOnly("$localReleaseDir/$releaseFile");
+  }
+}
+
+sub SetPgpPassPhrase {
+  my $self = shift;
+
+  return if ($self->{pgpPassPhrase});
+  print "PGP passphrase: \n";
+  $self->{pgpPassPhrase} = Utils::QueryPassword();
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+RelTransfer::Import.pm - Import releases from the remote site
+
+=head1 SYNOPSIS
+
+ use RelTransfer::Import;
+
+ $importer = RelTransfer::Import->New(ini_data => $iniData,
+				      force => 1,
+				      verbose => 1);
+
+ $importer->TransferRelease('componentname', 'componentversion');
+
+=head1 DESCRIPTION
+
+Implements the abstract TransferRelease method from the C<RelTransfer> base class module which transfers a release from the remote site to the local archive.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+ ini_data    =>  $iniData_object
+ force       =>  $force_integer
+ verbose     =>  $verbosity_integer
+
+Returns a reference to a C<RelTransfer::Import> object.
+
+=head2 TransferRelease
+
+Passed a component name and version number. Performs the following steps:
+
+=over 4
+
+=item *
+
+Check to see if the release can or needs to be imported. If the release already exists on the local archive or does not exist on the remote site then do not attempt to import 
+
+=item *
+
+Get the release zip from the remote site
+
+=item *
+
+Unzip the release zip
+
+=item *
+
+Decrypt the release files (ie the reldata, source and binary zips)
+
+=item *
+
+Move the release files to the local archive
+
+=back
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,159 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package RemoteSite;
+
+use strict;
+use File::Basename;
+use Utils;
+
+#
+# Constructor
+#
+
+sub New {
+  my $invocant = shift;
+  my $class = ref($invocant) || $invocant;
+  my $self = {
+	      host => undef,
+	      verbose => 0
+	     };
+  bless $self, $class;
+  $self->Initialize(@_);
+  return $self;
+}
+
+sub Initialize {
+  my $self = shift;
+
+  my %args = @_;
+  $self->{host} = $args{host};
+  $self->{verbose} = $args{verbose};
+}
+
+#
+# Public getters/setters
+#
+
+sub Host {
+  my $self = shift;
+  if (defined $_[0]) {$self->{host} = shift;}
+  return $self->{host};
+}
+
+#
+# Private Methods
+#
+
+sub HandleError {
+  my $self = shift;
+  my $errorString = shift;
+
+  die "Error: $errorString\n";
+}
+
+#
+# Abstract methods (must be implemented in a subclass)
+#
+
+sub SendFile {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::SendFile.\n";
+}
+
+sub GetFile {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::GetFile.\n";
+}
+
+sub FileExists {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::FileExists.\n"; 
+}
+
+sub DirList {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::DirList.\n";
+}
+
+sub MakeDir {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::MakeDir.\n";
+}
+
+sub FileSize {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::FileSize.\n";
+}
+
+sub DeleteFile {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::DeleteFile.\n";
+}
+
+sub MoveFile {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::MoveFile.\n";
+}
+
+sub FileModifiedTime {
+  die "Error: Call to unimplemented abstract method ".ref($_[0])."::FileModifiedTime.\n";
+}
+
+
+
+1;
+
+=head1 NAME
+
+RemoteSite.pm - Abstract base module for remote site access
+
+=head1 DESCRIPTION
+
+C<RemoteSite> is the abstract base module to a family of modules of the form C<RemoteSite::>F<HostType> which are used to transfer files to and from a remote site. Each module in the C<RemoteSite> directory must implement the following abstract interface...
+
+=over 4
+
+=item * SendFile($localFile, $remoteFile)
+
+Should copy C<$localFile> from the local drive to C<$remoteFile> on the remote site.
+
+=item * GetFile($remoteFile, $localFile)
+
+Should copy C<$remoteFile> from the remote site to C<$localFile> on the local drive.
+
+=item * bool FileExists($remoteFile)
+
+Should return a non zero value if C<$remoteFile> exists or zero if not.
+
+=back
+
+If no connection can be made to the remote site then the module must throw an error containing the words C<"cannot connect">
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/FTP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,867 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::FTP.pm
+#
+
+package RemoteSite::FTP;
+
+use strict;
+use Net::FTP;
+use File::Basename;
+use IO::File;
+
+use RemoteSite;
+use vars qw(@ISA);
+@ISA=("RemoteSite");
+
+#
+# Constants
+#
+
+use constant DEFAULTRECONNECTS => 5;
+use constant DEFAULTTIMEOUT => 30;
+use constant BLOCKSIZE => 32768;
+
+#
+# Initialization
+#
+
+sub Initialize {
+  my $self = shift;
+
+  my %args = @_;
+  $self->{username} = $args{username};
+  $self->{password} = $args{password};
+  $self->{passiveMode} = $args{passive_mode};
+  $self->{resumeMode} = $args{resume_mode};
+  $self->{timeout} = $args{timeout};
+  $self->{reconnects} = $args{reconnects};
+
+  #call base class initialization
+  $self->SUPER::Initialize(@_);
+
+  #if username or password not defined ask for them interactively
+  unless ($self->Username()) {
+    $self->HandleError("No remote host defined.") unless $self->Host();
+    print 'FTP username: ';
+    my $userName = <STDIN>;
+    if ($userName) {
+      chomp ($userName);
+      $self->Username($userName);
+    }
+  }
+  unless ($self->Password()) {
+    print 'FTP password: ';
+    $self->Password(Utils::QueryPassword());
+  }
+
+  #set timeout to default value if not set or not a positive integer
+  unless (defined $self->{timeout} and $self->{timeout} =~ /^\d+$/) {
+    $self->{timeout} = DEFAULTTIMEOUT;
+  }
+
+  #set reconnects to default value if not set or not a positive integer
+  unless (defined $self->{reconnects} and $self->{reconnects} =~ /^\d+$/) {
+    $self->{reconnects} = DEFAULTRECONNECTS;
+  }
+
+  #connect to FTP site, login and set to binary mode
+  $self->Connect();
+}
+
+#
+# Public getters/setters
+#
+
+sub Username {
+  my $self = shift;
+  if (defined $_[0]) {$self->{username} = shift;}
+  return $self->{username};
+}
+
+sub Password {
+  my $self = shift;
+  if (defined $_[0]) {$self->{password} = shift;}
+  return $self->{password};
+}
+
+sub PassiveMode {
+  my $self = shift;
+  if (defined $_[0]) {$self->{passiveMode} = shift;}
+  return $self->{passiveMode};
+}
+
+sub ResumeMode {
+  my $self = shift;
+  if (defined $_[0]) {$self->{resumeMode} = shift;}
+  return $self->{resumeMode};
+}
+
+sub Timeout {
+  my $self = shift;
+  return $self->{timeout};
+}
+
+sub Reconnects {
+  my $self = shift;
+  return $self->{reconnects};
+}
+
+#
+# Public (from RemoteSite)
+#
+
+sub SendFile {
+  my $self = shift;
+  my $localFile = shift;
+  my $remoteFile = shift;
+
+  unless (defined $localFile and defined $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::SendFile");
+  }
+  $remoteFile =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  my $localFileSize = Utils::FileSize($localFile);
+
+  if ($self->{verbose}) {
+    print 'Uploading '.basename($localFile).' to FTP site '.$self->Host()." ...\n";
+  }
+  elsif ($localFileSize) {
+    print 'Uploading '.basename($localFile).':    ';
+  }
+
+  #check the file to upload exists
+  unless (-e $localFile) {
+    $self->HandleError("Local file $localFile does not exist");
+  }
+
+  #check remote dir exists and create it if it doesn't
+  my $remoteDir = dirname($remoteFile);
+  unless ($self->DirExists($remoteDir)) {
+    $self->MakeDir($remoteDir);
+  }
+
+  #if a file with same name as the remote file already exists delete it (even if it has different case)
+  if (my $actualFileName = $self->FileExists($remoteFile)) {
+    $self->DeleteFile($actualFileName);
+  }
+
+  #create a temporary file name in the remote directory for uploading to
+  my $tmpFile = $self->CreateTemporaryFile($remoteDir);
+
+  #send the file
+  if ($self->ResumeMode()) {
+    $self->SendFileWithResume($localFile, $tmpFile);
+  }
+  else {
+    if ($self->{verbose} and $localFileSize) {
+      print "Upload progress: ";
+    }
+    $self->DisplayProgress($localFileSize);
+    $self->SendFileWithoutResume($localFile, $tmpFile);
+  }
+
+  #rename the temporary file to the final remote file name
+  $self->MoveFile($tmpFile, $remoteFile);
+
+  if ($self->{verbose} > 1) {
+    print "Upload successful. Stored as $remoteFile on FTP site.\n";
+  }
+}
+
+sub GetFile {
+  my $self = shift;
+  my $remoteFile = shift;
+  my $localFile = shift;
+
+  unless (defined $localFile and defined $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::GetFile");
+  }
+
+  $remoteFile =~ s{\\}{\/}g;     #convert back slashes to forward slashes
+
+  if ($self->{verbose}) {
+    print "Downloading ".$remoteFile." from FTP site ".$self->Host()." ...\n";
+  }
+  else {
+    print "Downloading ".basename($remoteFile).":    ";
+  }
+
+  #check that the file to download exists
+  my $actualFileName;
+  unless ($actualFileName = $self->FileExists($remoteFile)) {
+    $self->HandleError("Remote file $remoteFile does not exist");
+  }
+
+  $remoteFile = $actualFileName;  #handles case sensitivity correctly
+
+
+  #check local dir exists and create it if it doesn't
+  my $localDir = dirname($localFile);
+  unless (-e $localDir) {
+    Utils::MakeDir($localDir);
+    if ($self->{verbose}) {
+      print "Created directory $localDir on local drive\n";
+    }
+  }
+
+  my $remoteFileSize = $self->FileSize($remoteFile);
+
+  if ($self->{verbose} and $remoteFileSize) {
+    print "Download progress: ";
+  }
+
+  #get the file
+  if ($self->ResumeMode()) {
+    $self->DisplayProgress($remoteFileSize);
+    $self->GetFileWithResume($remoteFile, $localFile);
+  }
+  else {
+    $self->DisplayProgress($remoteFileSize);
+    $self->GetFileWithoutResume($remoteFile, $localFile);
+  }
+
+  if ($self->{verbose} > 1) {
+    print "Download successful. Stored as $localFile on local site.\n";
+  }
+}
+
+sub FileExists {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  unless (defined $remoteFile) {
+    return 0;
+  }
+
+  #use Carp qw/cluck/;
+  #cluck "Called FileExists";
+
+  # List the directory the file is in, and see if the file name is in it.
+  $remoteFile =~ s{\/}{\\}g;     #convert forward slashes to back slashes
+  (my $path, my $baseName, my $ext) = Utils::SplitFileName($remoteFile);
+  my $fileName = $baseName . $ext;
+  $path =~ s/\\$//;       #remove trailing slash
+  $path =~ s/\\/\//g;     #convert back slashes to forward slashes
+  my $ls = $self->DirList($path);
+  print "Checking for existence of remote file \"$remoteFile\" by looking for \"$fileName\" in \"$path\".\n" if ($self->{verbose} && $ls);
+  return 0 unless $ls; # definitely doesn't exist if nothing in the directory
+
+  my @present = grep /(\/|\\|^\s*)\Q$fileName\E\s*$/i, @$ls;
+  if (@present) {
+    print "Have found file: YES\n" if ($self->{verbose});
+    $present[0] = $path."/".$present[0] if ( $present[0] !~ /\// );
+    return $present[0];
+  }
+  else {
+    print "Have found file: NO\n" if ($self->{verbose});
+    return 0;
+  }
+}
+
+sub DirList {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  print "Listing FTP directory $remoteDir\n" if ($self->{verbose});
+
+  my $dirlist_retries = 3;
+
+  $remoteDir =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  my $retry;
+  for ($retry = 0; $retry < $dirlist_retries; $retry++) {
+
+    unless ($self->Connected()) {
+      $self->Connect();
+    }
+
+    # The Net::FTP module that we're using here has two options for listing the contents
+    # of a directory. They are the 'ls' and 'dir' calls.
+    # The 'ls' call is great, and just returns a list of the items. But, irritatingly, it
+    # misses out directories: the returned list just contains names of *files*.
+    # dir is better, in some ways, as it lists directories too, but its output format
+    # varies from one FTP site to the next. So we have to stick with ls.
+    print "About to call dir(\"$remoteDir\")\n" if ($self->{verbose});
+    my $ls = $self->{ftp}->ls($remoteDir);
+    my $resp = $self->{ftp}->message;
+    print "FTP response to list command was \"$resp\"\n" if ($self->{verbose});
+    if (ref $ls) {
+      print "FTP dir returned \"$ls\" which is a ".(ref $ls)." containing ".(scalar @$ls)." items\n" if ($self->{verbose});
+      $ls = undef if ($resp eq ""); # if we didn't get "Opening BINARY mode connection..." or something similar, then we've
+        # come across the problem where Net::FTP says Net::FTP: Unexpected EOF on command channel at d:/reltools/2.6x/personal/bin/Net
+        # /FTP/dataconn.pm line 73. Unfortunately, it doesn't die, and it returns an empty array, so the only way to find out this has
+        # happened is to check message.
+      $ls = undef if ($resp =~ m/^connection closed/i);
+    }
+    # $ls might now be undef
+    if (ref($ls)) {
+      return $ls;
+    }
+    else {
+      if ($self->Connected()) {
+        return undef;
+      }
+      else {
+        print "Warning: Listing of \"$remoteDir\" failed due to an FTP site problem: " . $self->{ftp}->message . ". ";
+        if ($self->PassiveMode()) {
+          print "PASV mode FTP is currently enabled. This can cause connectivity issues under certain circumstances. ",
+            "To disable, remove the pasv_transfer_mode directive from your reltools.ini file.\n";
+        }
+        else {
+          print "PASV mode FTP is currently disabled. Enabling it can prevent connectivity issues under certain circumstances. ",
+            "To enable, add the pasv_transfer_mode directive to your reltools.ini file.\n";
+        }
+        # Fall through to next loop iteration
+      }
+    }
+  }
+  die "Error: have tried to list \"$remoteDir\" $retry times with no success - giving up\n";
+}
+
+sub MakeDir {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  $remoteDir =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  if ($self->{ftp}->mkdir($remoteDir, 1)) {
+    if ($self->{verbose}) {
+      print "Created directory $remoteDir on FTP site\n";
+    }
+  }
+  else {
+    if ($self->Connected()) {
+      $self->HandleError("Cannot make directory $remoteDir on FTP site");
+    }
+    else {
+      $self->MakeDir($remoteDir);
+    }
+  }
+}
+
+sub FileSize {
+  my $self = shift;
+  my $file = shift;
+
+  $file =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  my $size;
+  if (defined($size = $self->{ftp}->size($file))) {
+    return $size;
+  }
+  else {
+    if ($self->Connected()) {
+      return 0;
+    }
+    else {
+      $self->FileSize($file);  #try to get the size again after reconnecting
+    }
+  }
+}
+
+sub DeleteFile {
+  my $self = shift;
+  my $file = shift;
+
+  $file =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  if ($self->{ftp}->delete($file)) {
+    return;
+  }
+  elsif ($self->{ftp}->rmdir($file)) {
+    return;
+  }
+  else {
+    if ($self->Connected()) {
+      $self->HandleError("Cannot delete $file on FTP site");
+    }
+    else {
+      $self->DeleteFile($file);
+    }
+  }
+}
+
+sub MoveFile {
+  my $self = shift;
+  my $oldFile = shift;
+  my $newFile = shift;
+
+  $oldFile =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+  $newFile =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  if ($self->{ftp}->rename($oldFile, $newFile)) {
+    return;
+  }
+  else {
+    if ($self->Connected()) {
+      $self->HandleError("Cannot move $oldFile to $newFile on FTP site");
+    }
+    else {
+      $self->MoveFile($oldFile, $newFile);
+    }
+  }
+}
+
+sub FileModifiedTime {
+  my $self = shift;
+  my $file = shift;
+
+  $file =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  my $modifiedTime;
+  if (defined($modifiedTime = $self->{ftp}->mdtm($file))) {
+    return $modifiedTime;
+  }
+  else {
+    if ($self->Connected()) {
+      print "Warning: failed to find modified time for file \"$file\"\n";
+      return undef;
+    }
+    else {
+      $self->FileModifiedTime($file);
+    }
+  }
+}
+
+#
+# Private
+#
+
+sub Connect {
+  my $self = shift;
+
+  unless ($self->Host()) {
+    $self->HandleError("Cannot connect FTP host name not defined");
+  }
+  my $debug = (($self->{verbose} && $self->{verbose} > 1) ? 1 : 0);
+
+  #Attempt to connect (or reconnect if connection fails)
+  for (1..$self->Reconnects()) {
+    $self->{ftp} = undef;
+    if ($self->{verbose}) {
+      print "Connecting to FTP site ".$self->Host()."...\n";
+    }
+    $self->{ftp} = Net::FTP->new($self->Host(),
+				 Passive => $self->PassiveMode(),
+				 Debug => $debug,
+				 Timeout => $self->Timeout());
+    if (defined $self->{ftp}) {
+      #login to FTP site
+      $self->{ftp}->login($self->Username(), $self->Password())
+	or $self->HandleError("FTP login failed");
+
+      #change transfer mode to binary
+      $self->{ftp}->binary()
+	or $self->HandleError("Failed to set FTP server to binary transfer mode");
+      return;
+    }
+  }
+  $self->HandleError("Cannot connect to FTP site ".$self->Host());
+}
+
+sub Connected {
+  my $self = shift;
+  return (defined $self->{ftp} and defined $self->{ftp}->pwd);
+}
+
+sub SendFileWithResume {
+  my $self = shift;
+  my $localFile = shift;
+  my $remoteFile = shift;
+
+  #open the local file for reading
+  $self->{localfh} = IO::File->new("< $localFile");
+  binmode($self->{localfh});
+
+  my $localFileSize = Utils::FileSize($localFile);
+
+  my $buffer;
+  my $bytesSent;
+  my $totalBytesSent = 0;
+
+ RESUME:
+  #Open the temporary file on the FTP site for writing/appending
+  $self->{dataconn} = $self->OpenRemoteFileForAppending($remoteFile);
+
+  if ($self->{verbose} and $localFileSize) {
+    print "Upload progress:    ";
+  }
+
+  #upload temporary file in blocks
+  while ($self->{localfh}->read($buffer, BLOCKSIZE)) {
+    eval {
+      $bytesSent = $self->{dataconn}->write($buffer, length($buffer));
+    };
+    unless ($bytesSent) {
+      if (my $ftpResponse = $self->{ftp}->getline()) {
+        $self->{ftp}->ungetline($ftpResponse);
+        next if ($ftpResponse !~ m/^(3|4|5)/);
+        chomp $ftpResponse;
+        print "\nError: The FTP server returned \'$ftpResponse\'\n";
+      }
+      
+      if ($self->Connected()) {
+	$self->HandleError("Cannot append to remote file $remoteFile");
+      }
+      else {
+	#connection dropped. Reconnect and resume upload
+	if ($self->{verbose}) {print "\n"}
+	$self->Connect();
+	$totalBytesSent = $self->FileSize($remoteFile);
+	seek($self->{localfh}, $totalBytesSent, 0);
+	goto RESUME;
+      }
+    }
+    else {
+      $totalBytesSent += $bytesSent;
+      $self->UpdateProgress($totalBytesSent, $localFileSize);
+    }
+  }
+
+  #close the remote and local files now the transfer has finished
+  $self->CloseAllOpenFiles();
+}
+
+sub SendFileWithoutResume {
+  my $self = shift;
+  my $localFile = shift;
+  my $remoteFile = shift;
+
+  my $putSuccess;
+  eval {
+    $putSuccess = $self->{ftp}->put($localFile, $remoteFile);
+  };
+  unless ($putSuccess) {
+    $self->HandleError("Problem occurred during FTP upload of $localFile");
+  }
+}
+
+sub GetFileWithResume {
+  my $self = shift;
+  my $remoteFile = shift;
+  my $localFile = shift;
+
+  my $totalBytesReceived = 0;
+  my $getSuccess;
+
+ RESUME:
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  eval {
+    $getSuccess = $self->{ftp}->get($remoteFile, $localFile, $totalBytesReceived);
+  };
+
+  unless ($getSuccess or !$@) {
+    if ($self->Connected()) {
+      $self->HandleError("Problem occurred during FTP download of $remoteFile");
+    }
+    else {
+      $totalBytesReceived = Utils::FileSize($localFile);
+      goto RESUME;
+    }
+  }
+}
+
+sub GetFileWithoutResume {
+  my $self = shift;
+  my $remoteFile = shift;
+  my $localFile = shift;
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  my $getSuccess;
+  eval {
+    $getSuccess = $self->{ftp}->get($remoteFile, $localFile);
+  };
+  unless ($getSuccess) {
+    $self->HandleError("Problem occurred during FTP download of $remoteFile");
+  }
+}
+
+sub DirExists {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  $remoteDir =~ s{\\}{\/}g;     #convert back slashes to forward slashes
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  my $pwd = $self->{ftp}->pwd() or $self->HandleError("Problem reading current working directory on FTP site\n");
+  my $exists = 0;
+  if ($self->{ftp}->cwd($remoteDir)) {
+    $exists = 1;
+    $self->{ftp}->cwd($pwd) or $self->HandleError("Problem changing current working directory back to $pwd on FTP site\n");
+  }
+
+  return $exists;
+}
+
+
+sub OpenRemoteFileForAppending {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  unless ($self->Connected()) {
+    $self->Connect();
+  }
+
+  my $dataconn;
+  if (defined($dataconn = $self->{ftp}->appe($remoteFile))) {
+    return $dataconn;
+  }
+  else {
+    if ($self->Connected()) {
+      $self->HandleError("Cannot open $remoteFile for appending on FTP site");
+    }
+    else {
+      $self->OpenRemoteFileForAppending($remoteFile);
+    }
+  }
+}
+
+sub CloseAllOpenFiles {
+   my $self = shift;
+
+  if ($self->{localfh}) {
+    $self->{localfh}->close;
+    $self->{localfh} = undef;
+  }
+  if ($self->{dataconn}) {
+    $self->{dataconn}->close();
+    $self->{dataconn} = undef;
+  }
+}
+
+sub DisplayProgress {
+  my $self = shift;
+  my $total = shift;
+
+  my $numHashes = 50;
+  my $bytesPerHash = int $total / $numHashes;
+  if ($total) {
+    $self->{ftp}->hash(\*STDERR, $bytesPerHash);
+  }
+}
+
+sub UpdateProgress {
+  my $self = shift;
+  my $current = shift;
+  my $total = shift;
+
+  my $bytesPerPercent = int $total/100;
+  if ($current == $total) {
+    print "\b\b\b100%\n";
+  }
+  elsif ($bytesPerPercent == 0) {
+    print "\b\b0%";
+  }
+  else {
+    my $percentComplete = int $current/$bytesPerPercent;
+    if ($percentComplete < 10) {
+      print "\b\b$percentComplete%";
+    }
+    else {
+      print "\b\b\b$percentComplete%";
+    }
+  }
+}
+
+sub HandleError {
+  my $self = shift;
+  my $errorString = shift;
+
+  if (defined $self->{ftp}) {
+    $self->{ftp}->quit();
+    $self->{ftp} = undef;
+  }
+  $self->CloseAllOpenFiles();
+
+  #call the super class error handler
+  $self->SUPER::HandleError($errorString);
+}
+
+sub CreateTemporaryFile {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  my $fileNum = 10000;
+  my $tmpFile = $remoteDir.'/lpdrt'.$fileNum.'.tmp';
+  while ($self->FileExists($tmpFile)) {
+    ++$fileNum;
+    $tmpFile = $remoteDir.'/lpdrt'.$fileNum.'.tmp';
+  }
+  return $tmpFile;
+}
+
+
+#
+# Destructor
+#
+
+sub DESTROY {
+  my $self = shift;
+
+  $self->CloseAllOpenFiles();
+
+  if (defined $self->{ftp}) {
+    if ($self->{verbose}) {
+      print "Dropping connection to FTP site ".$self->Host()."\n";
+    }
+    $self->{ftp}->quit();
+    $self->{ftp} = undef;
+  }
+}
+
+1;
+
+=head1 NAME
+
+RemoteSite::FTP.pm - Access a remote FTP site.
+
+=head1 SYNOPSIS
+
+ use RemoteSite::FTP;
+
+ $ftp = RemoteSite::FTP->New(host => 'ftp.somehost.com',
+	         	     username => 'myusername',
+			     password => 'mypassword',
+			     verbose => 1);
+
+ if ($ftp->FileExists('/somedir/someremotefile')) {
+   do something...
+ }
+ $ftp->SendFile('somelocalfile', 'someremotefile');
+ $ftp->GetFile('someremotefile', 'somelocalfile');
+
+=head1 DESCRIPTION
+
+C<RemoteSite::FTP> is inherited from the abstract base class C<RemoteSite>, implementing the abstract methods required for transfer of files to and from a remote site when the remote site is an FTP server.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host             => $host_address_string
+  username         => $user_name_string
+  password         => $pass_word_string
+  passiveMode      => $passive_mode_bool
+  resumeTransfers  => $resume_transfers_bool
+  timeout          => $timeout_integer
+  reconnects       => $reconnects_integer
+  verbose          => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::FTP> object
+
+=head2 Host
+
+Returns the current value of the C<host> attribute which contains the host FTP address. If passed an argument sets the attribute to this new value.
+
+=head2 Username
+
+Returns the current value of the C<username> attribute which stores the user name required to access the FTP site. If passed an argument sets the attribute to this new value.
+
+=head2 Password
+
+Returns the current value of the C<password> attribute which stores the password required to access the FTP site. If passed an argument sets the attribute to this new value.
+
+=head2 SendFile
+
+Passed a local and a remote file name. Uploads the local file to the FTP site. Dies if upload fails
+
+=head2 GetFile
+
+Passed a remote and local file name. Downloads the remote file from the FTP site and stores it on the local drive. Dies if download fails.
+
+=head2 FileExists
+
+Passed a filename (with full path) on the FTP site. Returns a non zero value if the file exists.
+
+=head2 DirList
+
+Passed a directory name. Returns a list of files contained in the directory or undef if fails to read directory
+
+=head2 MakeDir
+
+Passed a directory name. Creates the directory on the FTP site
+
+=head2 DeleteFile
+
+Passed a file name. Deletes the file on the FTP site. Dies if fails
+
+=head2 FileSize
+
+Passed a file name. Returns the size of the file. Returns 0 if fails.
+
+=head2 FileModifiedTime
+
+Passed a file name. Returns the last modified time stamp of the file. Returns undef if fails
+
+=head2 MoveFile
+
+Passed two file names. Renames the first file to the second file name. Dies if fails.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/FTP/Experimental.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,120 @@
+# RemoteSite::FTP.pm
+#
+#Copyright (c) 2000-2006, The Perl Foundation. All rights reserved.
+#This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+#
+
+package RemoteSite::FTP::Experimental;
+
+use strict;
+
+use RemoteSite::FTP;
+use vars qw(@ISA);
+@ISA=("RemoteSite::FTP");
+
+sub DirList {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  print "Listing FTP directory $remoteDir\n" if ($self->{verbose});
+
+  my $dirlist_retries = 3;
+  
+  $remoteDir =~ s{\\}{\/}g;   #convert back slashes to forward slashes
+  
+  my $retry;
+  for ($retry = 0; $retry < $dirlist_retries; $retry++) {
+
+    unless ($self->Connected()) {
+      $self->Connect();
+    }
+
+    # The Net::FTP module that we're using here has two options for listing the contents 
+    # of a directory. They are the 'ls' and 'dir' calls.
+    # The 'ls' call is great, and just returns a list of the items. But, irritatingly, it
+    # misses out directories: the returned list just contains names of *files*.
+    # dir is better, in some ways, as it lists directories too, but its output format
+    # varies from one FTP site to the next. So we have to stick with ls.
+    print "About to call dir(\"$remoteDir\")\n" if ($self->{verbose});
+    my %hash = $self->dir($remoteDir);
+    my @items = keys %hash;
+    @items = grep { $_ ne "." && $_ ne ".." } @items;
+    @items = map { "$remoteDir/$_" } @items; # prepend the path as that's the output format
+      # that is expected of this function
+    return \@items;
+  }
+  die "Error: have tried to list \"$remoteDir\" $retry times with no success - giving up\n";
+}
+
+# Code from Net::FTP::Common v 4.0a
+sub dir {       
+  my ($self, $directory) = @_;
+
+  my $ftp = $self->{ftp};
+
+  my $dir = $ftp->dir($directory);
+  if (!defined($dir)) {
+    return ();
+  } else
+  {
+    my %HoH;
+
+    # Comments were made on this code in this thread:
+    # http://perlmonks.org/index.pl?node_id=287552
+
+    foreach (@{$dir})
+        {
+	      $_ = m#([a-z-]*)\s*([0-9]*)\s*([0-9a-zA-Z]*)\s*([0-9a-zA-Z]*)\s*([0-9]*)\s*([A-Za-z]*)\s*([0-9]*)\s*([0-9A-Za-z:]*)\s*([\w*\W*\s*\S*]*)#;
+
+        my $perm = $1;
+        my $inode = $2;
+        my $owner = $3;
+        my $group = $4;
+        my $size = $5;
+        my $month = $6;
+        my $day = $7;
+        my $yearOrTime = $8;
+        my $name = $9;
+        my $linkTarget;
+
+        if ( $' =~ m#\s*->\s*([A-Za-z0-9.-/]*)# )       # it's a symlink
+                { $linkTarget = $1; }
+
+        $HoH{$name}{perm} = $perm;
+        $HoH{$name}{inode} = $inode;
+        $HoH{$name}{owner} = $owner;
+        $HoH{$name}{group} = $group;
+        $HoH{$name}{size} = $size;
+        $HoH{$name}{month} = $month;
+        $HoH{$name}{day} = $day;
+        $HoH{$name}{yearOrTime} =  $yearOrTime;
+        $HoH{$name}{linkTarget} = $linkTarget;
+
+        }
+  return(%HoH);
+  }
+}
+
+
+1;
+
+=head1 NAME
+
+RemoteSite::FTP::Experimental.pm - Access a remote FTP site.
+
+=head1 DESCRIPTION
+
+C<RemoteSite::FTP::Experimental> is inherited from the abstract base class C<RemoteSite>, implementing the abstract methods required for transfer of files to and from a remote site when the remote site is an FTP server.
+
+This class differs from C<RemoteSite::FTP> only in using a different mechanism for listing the contents of directories on FTP sites.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000-2006, The Perl Foundation. All rights reserved.
+This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/FTP/Proxy.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,212 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::FTP::Proxy.pm
+#
+
+package RemoteSite::FTP::Proxy;
+
+use strict;
+use Net::FTP;
+
+use RemoteSite::FTP;
+use vars qw(@ISA);
+@ISA=("RemoteSite::FTP");
+
+#
+# Initialization 
+#
+
+sub Initialize {
+  my $self = shift;
+
+  my %args = @_;
+  $self->{proxy} = $args{proxy};
+  $self->{proxyUsername} = $args{proxy_username};
+  $self->{proxyPassword} = $args{proxy_password};
+
+  #if proxy username or password not defined ask for them interactively
+  unless ($self->ProxyUsername()) {
+    print 'Proxy FTP username: ';
+    my $userName = <STDIN>;
+    if ($userName) {
+      chomp ($userName);
+      $self->ProxyUsername($userName);
+    }
+  }
+  unless ($self->ProxyPassword()) {
+    print 'Proxy FTP password: ';
+    $self->ProxyPassword(Utils::QueryPassword());
+  }
+  
+  #call base class initialization
+  $self->SUPER::Initialize(@_);
+}
+
+#
+# Public getters/setters
+#
+
+sub Proxy {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxy} = shift;}
+  return $self->{proxy};
+}
+
+sub ProxyUsername {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxyUsername} = shift;}
+  return $self->{proxyUsername};
+}
+
+sub ProxyPassword {
+  my $self = shift;
+  if (defined $_[0]) {$self->{proxyPassword} = shift;}
+  return $self->{proxyPassword};
+}
+
+#
+# Private
+#
+
+sub Connect {
+  my $self = shift;
+
+  unless ($self->Proxy()) {
+    $self->HandleError("Cannot connect to proxy, host name not defined");
+  }
+  unless ($self->Host()) {
+    $self->HandleError("Cannot connect to FTP site from proxy, host name not defined");
+  } 
+
+  my $debug = (($self->{verbose} > 1) ? 1 : 0);
+
+  #Attempt to connect (or reconnect of connection fails)
+  for (1..$self->Reconnects()) {
+    $self->{ftp} = undef;    
+    if ($self->{verbose}) {
+      print "Connecting to proxy server ".$self->Proxy()."...\n";
+    }
+    $self->{ftp} = Net::FTP->new($self->Proxy(),
+				 Passive => $self->PassiveMode(),
+				 Debug => $debug,
+				 Timeout => $self->Timeout());
+    if (defined $self->{ftp}) {
+      # code to support Blue Coat proxy ftp server
+
+      if ($self->{ftp}->message =~ /Blue Coat Ftp Service/) {
+      # do BC login
+      $self->{ftp}->login($self->Username().'@'.$self->Host()." ".$self->ProxyUsername(),
+        $self->Password(),
+        $self->ProxyPassword())
+        or $self->HandleError("FTP via Blue Coat proxy login failed");
+      }
+      else {
+        #login to proxy server
+        $self->{ftp}->login($self->ProxyUsername(), $self->ProxyPassword())
+          or $self->HandleError("Proxy server login failed");
+
+        #login to ftp site from proxy server
+        $self->{ftp}->login($self->Username().'@'.$self->Host(), $self->Password())
+          or $self->HandleError("FTP login failed");
+        }
+      #change transfer mode to binary
+      $self->{ftp}->binary()
+        or $self->HandleError("Failed to set FTP server to binary transfer mode");
+      return; 
+    }
+  }
+  $self->HandleError("Cannot connect to proxy server ".$self->Proxy());
+}  
+
+1;
+
+=head1 NAME
+
+RemoteSite::FTP::Proxy.pm - Access a remote FTP site via a proxy.
+
+=head1 SYNOPSIS
+
+ use RemoteSite::FTP::Proxy;
+
+ $ftp = RemoteSite::FTP::Proxy->New(host => 'ftp.somehost.com',
+				    username => 'myusername',
+				    password => 'mypassword',
+				    proxy => 'ftp.proxyhost.com',
+				    proxy_username => 'myproxyuser',
+				    proxy_password => 'myproxypass',
+				    verbose => 1);
+
+ if ($ftp->FileExists('/somedir/someremotefile')) {
+   do something...
+ }
+ $ftp->SendFile('somelocalfile', 'someremotefile');
+ $ftp->GetFile('someremotefile', 'somelocalfile'); 
+
+=head1 DESCRIPTION
+
+C<RemoteSite::FTP::Proxy> is inherited from C<RemoteSite::FTP>, it modifies base module methods to implement accessing an FTP site via a proxy server
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host           => $host_address_string
+  username       => $user_name_string
+  password       => $pass_word_string
+  proxy          => $proxy_address_string
+  proxy_username => $proxy_username_string
+  proxy_password => $proxy_password_string
+  verbose        => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::FTP::Proxy> object
+
+=head2 Proxy
+
+Returns the current value of the C<proxy> attribute which contains the proxy FTP address. If passed an argument sets the attribute to this new value.
+
+=head2 ProxyUsername
+
+Returns the current value of the C<proxyUsername> attribute which stores the user name required to access the proxy FTP site. If passed an argument sets the attribute to this new value.
+
+=head2 ProxyPassword
+
+Returns the current value of the C<proxyPassword> attribute which stores the password required to access the proxy FTP site. If passed an argument sets the attribute to this new value.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/FTP/Proxy/Experimental.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,70 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::FTP::Proxy::Experimental.pm
+#
+
+package RemoteSite::FTP::Proxy::Experimental;
+
+use strict;
+
+use RemoteSite::FTP::Experimental;
+use RemoteSite::FTP::Proxy;
+use vars qw(@ISA);
+@ISA=("RemoteSite::FTP::Experimental", "RemoteSite::FTP::Proxy");
+
+sub Connect {
+	my $self = shift;
+	$self->RemoteSite::FTP::Proxy::Connect();
+}
+
+sub DirList {
+	my $self = shift;
+	$self->RemoteSite::FTP::Experimental::DirList();
+}
+
+1;
+
+=head1 NAME
+
+RemoteSite::FTP::Experimental::Proxy.pm - Access a remote FTP site.
+
+=head1 DESCRIPTION
+
+This class differs from C<RemoteSite::FTP::Proxy> only in using a different mechanism for listing the contents of directories on FTP sites.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/NetDrive.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,343 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::NetDrive.pm
+#
+
+package RemoteSite::NetDrive;
+
+use strict;
+use File::Copy;
+use File::Basename;
+
+use RemoteSite;
+use vars qw(@ISA);
+@ISA=("RemoteSite");
+
+#
+# Initialization 
+#
+
+sub Initialize {
+  my $self = shift;
+  $self->SUPER::Initialize(@_);
+
+  #connect to network drive
+  $self->Connect();	
+}
+
+#
+# Public (from RemoteSite)
+#
+
+sub SendFile {
+  my $self = shift;
+  my $localFile = shift;
+  my $remoteFile = shift;
+
+  unless (defined $localFile and defined $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::SendFile");
+  }
+
+  $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile);
+  $remoteFile =~ s{\\}{\/}g;
+
+  if ($self->{verbose}) {
+    print "Copying ".basename($localFile)." to network drive ".$self->Host()."...\n";
+  }
+  elsif (Utils::FileSize($localFile)) {
+    print "Copying ".basename($localFile)."...\n";
+  }
+
+  unless (-e $localFile) {
+    $self->HandleError("Local file $localFile does not exist");
+  }
+
+  $self->Connect();
+
+  my $remoteDir = dirname($remoteFile);
+  unless (-e $remoteDir) {
+    eval {
+      Utils::MakeDir($remoteDir);
+    };
+    if ($@) {
+      $self->HandleError("Cannot make directory $remoteDir on network drive ".$self->Host());
+    }
+    if ($self->{verbose}) {
+      print "Created directory $remoteDir on network drive\n";
+    }
+  } 	
+ 
+  #use a temporary file during uploads
+  my $tmpFile = $remoteDir.'/TMP_'.basename($remoteFile);
+
+  unless (copy($localFile, $tmpFile)){
+    my $flag = 0;
+    my $errormessage = $!;
+    
+    if(-e $tmpFile) { 
+      unlink $tmpFile or $flag=1;
+    }
+
+    if($errormessage =~ /No such file or directory/i) {
+      $errormessage = "Unknown Error - Check disk space or missing file/directory";
+    }
+    
+    if($flag) {
+      $self->HandleError("Unable to cleanup $tmpFile, after the copy of $localFile failed : $errormessage");
+    }
+    $self->HandleError("Unable to copy $localFile to $tmpFile : $errormessage");
+  }
+  
+  unless (move($tmpFile, $remoteFile)){
+    unlink $tmpFile;    
+    $self->HandleError("Unable to move $tmpFile to $remoteFile : $!");
+  }
+  
+  if ($self->{verbose} > 1) {
+    print "Copy successful. Stored as $remoteFile on network drive.\n";
+  }  
+}
+
+sub GetFile {
+  my $self = shift;
+  my $remoteFile = shift;
+  my $localFile = shift;
+
+  unless (defined $localFile and defined $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::GetFile");
+  }
+
+  my $host = $self->Host();
+  $host =~ s{\\}{\/}g;
+  $remoteFile =~ s{\\}{\/}g;
+
+  if ($self->{verbose}) {
+    print "Copying ".basename($remoteFile)." from network drive $host...\n";
+  }
+  else {
+    print "Copying ".basename($remoteFile)."...\n";
+  }
+
+  $self->Connect();
+
+  if ($self->{verbose}) {
+    print "Checking whether \"$remoteFile\" exists...\n";
+  }
+  unless ($self->FileExists($remoteFile)) {
+    $self->HandleError("Remote file $remoteFile does not exist on $host");
+  }
+
+  #check local dir exists and create it if it doesn't
+  my $localDir = dirname($localFile);
+  unless (-e $localDir) {
+    Utils::MakeDir($localDir);
+    if ($self->{verbose}) {
+      print "Created directory $localDir on local drive\n";
+    }
+  }
+
+  unless (copy($host.$remoteFile, $localFile)) {
+    unlink $localFile;
+    $self->HandleError("Transfer of $remoteFile from $host to local drive failed");
+  }
+  if ($self->{verbose} > 1) {
+    print "Copy successful. Stored as $localFile on local drive.\n";
+  }
+}
+
+sub FileExists {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  unless (defined $remoteFile) {
+    return 0;
+  }
+
+  $self->Connect();
+
+  $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile);
+  $remoteFile =~ s{\\}{\/}g; 
+  return (-e $remoteFile);
+}
+
+sub DirExists {
+  my $self = shift;
+  my $remoteDir = shift;
+  return $self->FileExists($remoteDir);
+}
+
+sub DirList {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  my $host = $self->Host();
+  $host =~ s{\\}{\/}g;
+  $remoteDir =~ s{\\}{\/}g;
+
+  opendir(DIR, Utils::ConcatenateDirNames($host, $remoteDir)) or $self->HandleError("Cannot open $remoteDir on network drive ".$self->Host());
+  my @dir = map {"$remoteDir/$_"} grep {$_ ne '.' and $_ ne '..'} readdir DIR;
+  closedir(DIR);
+  return \@dir;
+}
+
+sub MakeDir {
+  my $self = shift;
+  my $remoteDir = shift;
+
+  $remoteDir = $self->Host().$remoteDir;
+  $remoteDir =~ s{\\}{\/}g;
+
+  eval {
+    Utils::MakeDir($remoteDir);
+  };
+  if ($@) {
+    $self->HandleError("Cannot make directory $remoteDir on network drive ".$self->Host());
+  }
+}
+
+sub FileSize {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile);
+  $remoteFile =~ s{\\}{\/}g; 
+
+  return Utils::FileSize($remoteFile);
+}
+
+sub DeleteFile {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile);
+  $remoteFile =~ s{\\}{\/}g; 
+  
+  rmdir $remoteFile or unlink $remoteFile or $self->HandleError("Cannot delete $remoteFile on network dirve ($!)");
+}
+
+sub MoveFile {
+  my $self = shift;
+  my $oldFile = shift;
+  my $newFile = shift;
+
+  $oldFile = Utils::ConcatenateDirNames($self->Host(), $oldFile);
+  $oldFile =~ s{\\}{\/}g;
+  $newFile = Utils::ConcatenateDirNames($self->Host(), $newFile);
+  $newFile =~ s{\\}{\/}g;
+
+  move($oldFile, $newFile) or $self->HandleError("Cannot move $oldFile to $newFile on network drive");
+}
+
+sub FileModifiedTime {
+  my $self = shift;
+  my $remoteFile = shift;
+
+  $remoteFile = Utils::ConcatenateDirNames($self->Host(), $remoteFile);
+  $remoteFile =~ s{\\}{\/}g; 
+
+  return Utils::FileModifiedTime($remoteFile);
+}
+
+
+#
+# Private
+#
+
+sub Connect {
+  my $self = shift;
+
+  unless ($self->Host()) {
+    $self->HandleError("Network drive host name not defined");
+  }
+  my $hostName = $self->Host();
+  unless (-e $hostName) {
+    $self->HandleError("Cannot connect to network drive $hostName");
+  }
+}
+
+1;
+
+=head1 NAME
+
+RemoteSite::NetDrive.pm - Access a remote network drive
+
+=head1 SYNOPSIS
+
+ use RemoteSite::NetDrive;
+
+ $drive = RemoteSite::NetDrive->New(host => '\\server\share',
+			            verbose => 1);
+
+ if ($drive->FileExists('/somedir/someremotefile')) {
+   do something...
+ }
+ $drive->SendFile('somelocalfile', 'someremotefile');
+ $drive->GetFile('someremotefile', 'somelocalfile');
+
+=head1 DESCRIPTION
+
+C<RemoteSite::NetDrive> is inherited from the abstract base class C<RemoteSite>, implementing the abstract methods required for transfer of files to and from a remote site when the remote site is a network drive.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host      => $host_address_string
+  verbose   => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::NetDrive> object
+
+=head2 Host
+
+Returns the current value of the C<host> attribute which contains the UNC path of the network drive. If passed an argument sets the attribute to this new value.
+
+=head2 SendFile
+
+Passed a local and a remote file name. Uploads the local file to the network drive.
+
+=head2 GetFile
+
+Passed a remote and local file name. Downloads the remote file from the network drive and stores it on the local drive.
+
+=head2 FileExists
+
+Passed a filename (with full path) on the network drive. Returns a non zero value if the file exists.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/NetDrive/MultiVolumeExport.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,300 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::NetDrive::MultiVolumeExport.pm
+#
+
+package RemoteSite::NetDrive::MultiVolumeExport;
+
+use strict;
+use File::Copy;
+use File::Basename;
+
+use RemoteSite;
+use RemoteSite::NetDrive;
+use vars qw(@ISA);
+@ISA=("RemoteSite::NetDrive");
+
+
+#
+# Constants,
+#
+
+use constant KLogDirName => '\sent_log';
+
+
+#
+# Initialization
+#
+
+sub Initialize {
+  my $self = shift;
+  my %args = @_;
+  $self->{maxExportVolumeSize} = $args{max_export_volume_size};
+  $self->SUPER::Initialize(@_);
+  $self->Connect();
+  $self->InitNextExportVolume();
+}
+
+
+#
+# Public (from RemoteSite)
+#
+
+sub SendFile {
+  my $self = shift;
+  my $localFile = shift;
+  my $remoteFile = shift;
+
+  unless ($localFile and $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::SendFile");
+  }
+  unless (-e $localFile) {
+    $self->HandleError("Local file $localFile does not exist");
+  }
+
+  my $fileSize = Utils::FileSize($localFile);
+  if ($fileSize > $self->{maxExportVolumeSize}) {
+    die "Error: \"$localFile\" is larger than the maximum export volume size ($self->{maxExportVolumeSize})\n";
+  }
+  $self->{currentExportVolumeSize} += $fileSize;
+  if ($self->{currentExportVolumeSize} > $self->{maxExportVolumeSize}) {
+    $self->InitNextExportVolume();
+    $self->{currentExportVolumeSize} = $fileSize;
+  }
+  $self->SUPER::SendFile($localFile, Utils::ConcatenateDirNames($self->CurrentExportVolumeName(), $remoteFile));
+  $self->WriteIndexEntry($remoteFile);
+}
+
+sub GetFile {
+  my $self = shift;
+  $self->HandleError("Function 'GetFile' not supported by ".ref($self)."\n");
+}
+
+sub FileExists {
+  my $self = shift;
+  my $remoteFile = shift;
+  unless (defined $remoteFile) {
+    return 0;
+  }
+  $self->Connect();
+  $remoteFile = Utils::ConcatenateDirNames($self->LogDir(), $remoteFile);
+  return (-e $remoteFile);
+}
+
+sub DirList {
+  my $self = shift;
+  $self->HandleError("Function 'DirList' not supported by ".ref($self)."\n");
+}
+
+sub MakeDir {
+  my $self = shift;
+  $self->HandleError("Function 'MakeDir' not supported by ".ref($self)."\n");
+}
+
+sub FileSize {
+  my $self = shift;
+  my $file = shift;
+  my $volume = $self->LookupIndexEntry($file);
+  my $fullName = Utils::ConcatenateDirNames($self->Host(), $self->ExportVolumeName($volume));
+  $fullName = Utils::ConcatenateDirNames($fullName, $file);
+  return Utils::FileSize($fullName);
+}
+
+sub DeleteFile {
+  my $self = shift;
+  $self->HandleError("Function 'DeleteFile' not supported by ".ref($self)."\n");
+}
+
+sub MoveFile {
+  my $self = shift;
+  $self->HandleError("Function 'MoveFile' not supported by ".ref($self)."\n");
+}
+
+sub FileModifiedTime {
+  my $self = shift;
+  $self->HandleError("Function 'FileModifiedTime' not supported by ".ref($self)."\n");
+}
+
+
+#
+# Private.
+#
+
+sub SetExportVolumePrefix {
+  my $self = shift;
+  $self->{exportVolumePrefex} = time . '__#';
+}
+
+sub CurrentExportVolumeName {
+  my $self = shift;
+  return $self->ExportVolumeName($self->{currentExportVolume});
+}
+
+sub ExportVolumeName {
+  my $self = shift;
+  my $volume = shift;
+  my $name = "$self->{exportVolumePrefex}$volume";
+  Utils::TidyFileName(\$name);
+  return $name;
+}
+
+sub LookupIndexEntry {
+  my $self = shift;
+  my $file = lc(shift);
+  Utils::TidyFileName(\$file);
+  if (exists $self->{index}->{$file}) {
+    return $self->{index}->{$file};
+  }
+  return undef;
+}
+
+sub WriteIndexEntry {
+  # Index entries keep track of which volume of a set a particular release may be found in.
+  my $self = shift;
+  my $file = lc(shift);
+  Utils::TidyFileName(\$file);
+  $self->WriteLogEntry($file);
+  $self->{index}->{$file} = $self->{currentExportVolume};
+}
+
+sub WriteLogEntry {
+  # Log entries keep track of what has been sent. KLogDirName should not be deleted between exports.
+  my $self = shift;
+  my $file = shift;
+  $file = Utils::ConcatenateDirNames($self->LogDir(), $file);
+  Utils::MakeDir(dirname($file));
+  $self->WriteLogReadMe();
+  open (LOG, ">$file") or die "Error: Unable to write log entry \"$file\": $!\n";
+  close (LOG);
+}
+
+sub WriteLogReadMe {
+  my $self = shift;
+  my $readMe = Utils::ConcatenateDirNames($self->LogDir(), 'readme.txt');
+  unless (-e $readMe) {
+    open (README, ">$readMe") or die "Error: Couldn't open \"$readMe\" for writing: $!\n";
+    print README "This directory contains a log automatically written by the LPD Release Tools as a result of one
+or more exports being performed to a remote site of type 'multi-volume'. It's purpose is to keep track of which
+component releases have already been exported, so they don't get sent again. If you delete this directory, on next
+export, all component releases will need to be sent.";
+    close (README);
+  }
+}
+
+sub ExternaliseIndex {
+  # The index will later be interalised by MultiVolumeExport.
+  my $self = shift;
+  for (my $i = 0; $i <= $self->{currentExportVolume}; ++$i) {
+    my $dir = Utils::ConcatenateDirNames($self->Host(), $self->ExportVolumeName($i));
+    Utils::MakeDir($dir);
+    open (INDEX, ">$dir/index") or die "Error: Couldn't open \"$dir/index\" for writing: $!\n";
+    foreach my $file (sort keys %{$self->{index}}) {
+      print INDEX "$file\t$self->{index}->{$file}\n";
+    }
+    close (INDEX);
+  }
+}
+
+sub InitNextExportVolume {
+  my $self = shift;
+  $self->{currentExportVolumeSize} = 0;
+  if (exists $self->{currentExportVolume}) {
+    ++$self->{currentExportVolume};
+  }
+  else {
+    $self->{currentExportVolume} = 0;
+    $self->SetExportVolumePrefix();
+  }
+  my $exportVol = Utils::ConcatenateDirNames($self->Host(), $self->CurrentExportVolumeName());
+  Utils::MakeDir($exportVol);
+}
+
+sub LogDir {
+  my $self = shift;
+  return Utils::ConcatenateDirNames($self->Host(), KLogDirName);
+}
+
+sub DESTROY {
+  my $self = shift;
+  if ($self->{currentExportVolume} == 0 and not exists $self->{index}) {
+    # Nothing was exported, so cleanup.
+    my $dir = Utils::ConcatenateDirNames($self->Host(), $self->CurrentExportVolumeName());
+    rmdir ($dir) or die "Error: Couldn't remove directory \"$dir\": $!\n";
+  }
+  else {
+    $self->ExternaliseIndex();
+  }
+}
+
+1;
+
+=head1 NAME
+
+RemoteSite::NetDrive::MultiVolumeExport.pm - Export encyrpted releases to multiple fixed size volumes
+
+=head1 DESCRIPTION
+
+The purpose of this remote site module is to allow releases to be exported to directories to be stored on removable media such as writable CD ROMs. It is derived from C<RemoteSite::NetDrive> since a lot of the basic file manipulation is identical.
+
+The maximum size of each export volume can be specified using the C<IniData> keyword C<max_export_volume_size>. This is used to determine when to start a new volume. At the end of the export process a set of uniquely named directories (the export volumes) will have been created in C<host> directory (specified using the C<IniData> keyword C<remote_host>). There will also be a directory called F<sent_log>, which should be retain between exports so the tools can work out which release have already been exported. Once the export volumes have been archived, they may be deleted.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host                   => $host_address_string
+  max_export_volume_size => $max_export_volume_size_integer
+  verbose                => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::NetDrive::MultiVolumeExport> object.
+
+=head2 SendFile
+
+Passed a local and a remote file name. Checks the file will fit in the current volume, if not creates a new volume. Logs the file and then differs to C<RemoteSite::NetDrive> to perform the copy.
+
+=head2 GetFile
+
+Not suppored, since this module may only be used for exporting.
+
+=head2 FileExists
+
+Passed a filename (with full path). Checks the F<sent_log> to see is this has already been exported. Returns true if it has, false otherwise.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoteSite/NetDrive/MultiVolumeImport.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,227 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# RemoteSite::NetDrive::MultiVolumeImport.pm
+#
+
+package RemoteSite::NetDrive::MultiVolumeImport;
+
+use strict;
+use File::Copy;
+use File::Basename;
+
+use RemoteSite;
+use RemoteSite::NetDrive;
+use vars qw(@ISA);
+@ISA=("RemoteSite::NetDrive");
+
+
+#
+# Initialization
+#
+
+sub Initialize {
+  my $self = shift;
+  $self->SUPER::Initialize(@_);
+  $self->Connect();	
+}
+
+
+#
+# Public (from RemoteSite)
+#
+
+sub SendFile {
+  my $self = shift;
+  $self->HandleError("Function 'SendFile' not supported by ".ref($self)."\n");
+}
+
+sub GetFile {
+  my $self = shift;
+  my $remoteFile = shift;
+  my $localFile = shift;
+
+  unless (defined $localFile and defined $remoteFile) {
+    $self->HandleError("Incorrect args passed to ".ref($self)."::GetFile");
+  }
+
+  $self->InitAppropriateImportVolume($remoteFile);
+  $self->SUPER::GetFile($remoteFile, $localFile);
+}
+
+sub FileExists {
+  my $self = shift;
+  my $remoteFile = shift;
+  unless (defined $remoteFile) {
+    return 0;
+  }
+  $self->Connect();
+  return (defined $self->LookupIndexEntry($remoteFile));
+}
+
+sub DirList {
+  my $self = shift;
+  $self->HandleError("Function 'DirList' not supported by ".ref($self)."\n");
+}
+
+sub MakeDir {
+  my $self = shift;
+  $self->HandleError("Function 'MakeDir' not supported by ".ref($self)."\n");
+}
+
+sub FileSize {
+  my $self = shift;
+  $self->HandleError("Function 'FileSize' not supported by ".ref($self)."\n");
+}
+
+sub DeleteFile {
+  my $self = shift;
+  $self->HandleError("Function 'DeleteFile' not supported by ".ref($self)."\n");
+}
+
+sub MoveFile {
+  my $self = shift;
+  $self->HandleError("Function 'MoveFile' not supported by ".ref($self)."\n");
+}
+
+sub FileModifiedTime {
+  my $self = shift;
+  $self->HandleError("Function 'FileModifiedTime' not supported by ".ref($self)."\n");
+}
+
+
+#
+# Private.
+#
+
+sub LookupIndexEntry {
+  my $self = shift;
+  my $file = lc(shift);
+  Utils::TidyFileName(\$file);
+  unless (exists $self->{index}) {
+    $self->InternaliseIndex();
+  }
+  if (exists $self->{index}->{$file}) {
+    return $self->{index}->{$file};
+  }
+  return undef;
+}
+
+sub InternaliseIndex {
+  # Read the index created by MultiVolumeExport.
+  my $self = shift;
+  my $index = $self->Host(). '/index';
+  unless (-e $index) {
+    $self->ChangeImportVolume(0);
+  }
+  open (INDEX, $index) or die "Error: Couldn't open \"$index\": $!\n";
+  while (my $line = <INDEX>) {
+    (my $file, my $volume) = $line =~ /(.*)\t(.*)/;
+    $self->{index}->{$file} = $volume;
+  }
+  close (INDEX);
+}
+
+sub InitAppropriateImportVolume {
+  my $self = shift;
+  my $file = shift;
+  my $requiredVolume = $self->LookupIndexEntry($file);
+  unless (defined $requiredVolume) {
+    die "Error: \"$file\" not found in any volumes\n";
+  }
+  if ($requiredVolume == $self->{currentImportVolume}) {
+    return;
+  }
+  else {
+    $file = Utils::ConcatenateDirNames($self->Host(), $file);
+  AGAIN:
+    $self->ChangeImportVolume($requiredVolume);
+    unless (-e $file) {
+      print "Error: \"$file\" not found
+       Try again? [y/n] ";
+      my $response = <STDIN>;
+      chomp $response;
+      if ($response =~ /^y$/i) {
+	goto AGAIN;
+      }
+      die "Aborting...\n";
+    }
+  }
+}
+
+sub ChangeImportVolume {
+  my $self = shift;
+  my $volume = shift;
+  print "Insert import volume #$volume and hit return...\n";
+  <STDIN>;
+  $self->{currentImportVolume} = $volume;
+}
+
+1;
+
+=head1 NAME
+
+RemoteSite::NetDrive::MultiVolumeImport.pm - Import releases that were exported using RemoteSite::NetDrive::MultiVolumeExport
+
+=head1 DESCRIPTION
+
+The purpose of this remote site module is to allow releases that were exported using C<RemoteSite::NetDrive::MultiVolumeExport> to be imported. The export process writes a complete index into each volume. This is read to determine which volumes contain which files. The user is prompted to change volumes are necessary. Location of the import volume is specified using the C<IniData> keyword C<remote_host>.
+
+=head1 INTERFACE
+
+=head2 New
+
+Passed an argument list in the form of hash key value pairs. The supported arguments are...
+
+  host      => $host_address_string
+  verbose   => $verbosity_integer
+
+Returns a reference to a C<RemoteSite::NetDrive::MultiVolumeImport> object
+
+=head2 SendFile
+
+Not suppored, since this module may only be used for importing.
+
+=head2 GetFile
+
+Passed a remote and local file name. Finds out which volume the file lives on, and requests that the user changes volumes if necessary. Then differs to C<RemoteSite::NetDrive> to perform the copy.
+
+=head2 FileExists
+
+Passed a filename (with full path). Returns true if the file exists in the volume index, false otherwise.
+
+=head1 KNOWN BUGS
+
+None
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoveRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,142 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'RemoveRel');
+my $comp;
+my $source;
+my $force;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+RemoveRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  
+  GetOptions("h" => \$help, "v+" => \$verbose, "s" => \$source, "f" => \$force);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+
+  unless (defined $comp and $#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: removerel [options] <component>
+
+options:
+
+-h  help
+-s  remove source also
+-f  (deprecated)
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub RemoveRel {
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  
+  if (!$envDb->ComponentExistsInDatabase($comp)) {
+    die "Error: $comp not currently installed\n";
+  }
+  
+  eval {
+    if($source) {
+      $envDb->DeleteSource($comp, undef, 1);
+    }
+  };
+  if ($@) {
+    print "$@";
+  }
+  
+  $envDb->RemoveComponent($comp);
+}
+
+
+__END__
+
+=head1 NAME
+
+RemoveRel - Removes the binaries of a component release from the current environment.
+
+=head1 SYNOPSIS
+
+  removerel [options] <component>
+
+options:
+
+  -h  help
+  -f  (deprecated)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+When the binaries from a component release are installed into an environment using either C<GetRel> or C<GetEnv>, a file is stored in F<\epoc32\relinfo> containing details of the files that were unpacked. This information is used by C<RemoveRel> to remove the installed binaries. C<RemoveRel> also updates the environment database to reflect this change. Note, C<RemoveRel> makes no attempt to the remove the release's source code.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/RemoveRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/SourceInfo	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,862 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use DirHandle;
+use Utils;
+
+
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'SourceInfo');
+my $envDb;
+my $file;
+my $comp;
+my $listindividualfiles;
+my $includeignores;
+my $includebinaries;
+my $summary;
+my $expandepoc32;
+my $countfiles;
+my $skipWarnings;
+
+$envDb = EnvDb->Open($iniData, $verbose);
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+SourceInfo();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'v+' => \$verbose, 'f' => \$listindividualfiles, 'i' => \$includeignores, 'b' => \$includebinaries, 's' => \$summary, 'c' => \$countfiles, 'force' => \$skipWarnings);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if (!$ARGV[0]) {
+    $comp = undef; # it already is, but let's be explicit...
+  } else {
+    if ($envDb->Version($ARGV[0])) {
+      $comp = shift @ARGV;
+    } else {
+      $file = shift @ARGV;
+      Utils::AbsoluteFileName(\$file);
+    }
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: sourceinfo [options] [ component | file ]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-f  list individual files, not just directories
+-c  count the files in each directory (can be slow)
+-b  include binary files in report
+-i  include 'ignored' files in report
+--force (deprecated)
+-s  print summary report (don't specify a component or a file)\n");
+}
+
+sub SourceInfo {
+  $expandepoc32 = WorkOutWhetherExpandEpoc32();
+  if ($file) {
+    die "Error: can't do summary report about a particular file.\n" if ($summary);
+    DoFileReport($file);
+  } elsif ($comp) {
+    die "Error: can't do summary report about a particular component.\n" if ($summary);
+    DoComponentReport($comp);
+  } elsif ($summary) {
+    DoSummaryReport();
+  } else {
+    DoFullReport();
+  }
+}
+
+##############################################################################################
+# Implementation notes
+#
+# This script is very complex. Here is a guide to what's going on.
+# First look at the main SourceInfo function, above. You'll see there's four different
+# types of report, corresponding to the four ways the command line can be used. (-s is
+# treated as its own type of report).
+# Each one of these creates and uses a similar set of objects in different ways.
+#
+# The objects used are:
+#   SourceInfo::OwnerFinder::xxxx - these classes are factories for SourceInfo::Owners.
+#   SourceInfo::Owner - these objects represent each way a directory or file can be owned.
+#                       A single component may produce many 'owners' - for example,
+#                       one for each of its binary files and one for each of the 'source'
+#                       items in its MRP.
+#   SourceInfo::Item - this class is the heart of this script. It represents each item
+#                      on disk (whether a directory or file). It may contain a link
+#                      to one or more owners, if that directory or file is owned.
+#
+# Each of the reports work like this:
+#  1- build up (partial) tree of all the files/directories on disk made of SourceInfo::Items.
+#  2- create a load of SourceInfo::Owners.
+#  3- tell the owners to attach themselves to the relevant items in the tree of Items.
+#  4- tell the items to make themselves shown/hidden depending on various settings.
+#  5- gather the shown items into a list which can be made into a table.
+# 
+# The only exception is the -s option, which doesn't really stick to this pattern for
+# stage 5. But it does for the rest.
+#
+# The different reports work on this in different ways. For example, if a component is 
+# specified on the command line, OwnerFinders (and therefore owners) are only created for 
+# that component.
+#
+# The tree created in Stage 1 starts out small. (In fact, it's just the root). It grows
+# items under many circumstances:
+#  -- an owner item requests an item deep in the tree which hasn't been expanded that
+#     far yet.
+#  -- ExpandAll is called, corresponding to the -f option.
+#  -- ExpandUnownedDirs is called, which will list all the items inside each directory
+#     that isn't owned. This ensures that all unowned files and directories are listed
+#     in the tree.
+#  -- we're a sourceinfo <file> and we have to expand the tree to include the file.
+#  
+#  It's worth noting that the -b flag has two effects. Firstly, binary OwnerFinders
+#  and Owners are not created. Secondly, (more importantly?) neither ExpandAll
+#  nor ExpandUnownedDirs will do any expansion inside \epoc32. So you'll never
+#  see items inside that tree, and 'binary' items outside that tree won't appear
+#  either. (In fact, they'll be reported as having no owner).
+#  \epoc32 is not included if -i is specified, either.
+#
+############################################################################
+
+sub WorkOutWhetherExpandEpoc32 {
+  return 1 if $includebinaries && $includeignores;
+  return 0;
+}
+  
+# The four following methods are the different types of report that can
+# be done.
+
+sub DoFileReport {
+  my $file = shift;
+
+  print "Warning: \"$file\" is not a file and is not a component that is currently installed. The following report assumes it is a file which you could install with \"getsource\"\n" unless -e $file;
+
+  my $owners = FindOwners(); # we have to create all possible owners
+  my $root = new SourceInfo::Item("", undef);
+  $root->FindItem($file, 1); # expand the tree to include our file
+
+  print "Finding owned items\n" if $verbose;
+  FindOwnedItems($owners, $root, 0); # mark the Items as having Owners
+
+  my $items = $root->GetAll;
+  $root->DecideVisibility;
+
+  $iniData->TableFormatter->PrintTable(MakeTable($items), 1); 
+}
+
+sub DoSummaryReport {
+  my $root = CreateRoot();
+  $root->ExpandAll() if ($listindividualfiles);
+  my $owners = FindOwners();
+  FindOwnedItems($owners, $root, 1);
+  $root->ExpandUnownedDirs();
+
+  $root->DecideVisibility;
+
+  my @noowners;
+  my @multiowners;
+  foreach my $item (@{$root->GetAllVisible}) {
+    my $count = $item->NumOwners;
+    if ($count == 0) {
+      push @noowners, $item;
+    } elsif ($count > 1) {
+      push @multiowners, $item;
+    } else {
+      # This has exactly one ownership. Joy!
+    }
+  }
+
+  print "Files/areas without ownership:\n";
+  foreach (@noowners) {
+    print "  ".$_->Path . "\n";
+  }
+ 
+  print "Files/areas with multiple ownership:\n";
+  foreach (@multiowners) {
+    print "  ".$_->Path . "\n";
+  }
+}
+
+sub DoFullReport {
+  print "Doing full report\n" if $verbose;
+  my $root = CreateRoot();
+  $root->ExpandAll() if ($listindividualfiles);
+  my $owners = FindOwners();
+  FindOwnedItems($owners, $root, 1);
+  $root->ExpandUnownedDirs() unless $listindividualfiles; # might have already done it
+
+  my $items = $root->GetAll;
+  if ($listindividualfiles) {
+    $root->ShowAll();
+  } else {
+    $root->DecideVisibility();
+  }
+
+  $iniData->TableFormatter->PrintTable(MakeTable($items), 1); 
+}
+
+sub DoComponentReport {
+  my $component = shift;
+
+  my $root = CreateRoot();
+  my $owners = FindOwners($component);
+  FindOwnedItems($owners, $root, 1);
+  $root->ExpandOwnedDirs() if ($listindividualfiles);
+
+  my $items = $root->GetAll;
+  if ($listindividualfiles) {
+    $root->ShowAll();
+  } else {
+    $root->DecideVisibility();
+  }
+
+  $iniData->TableFormatter->PrintTable(MakeTable($items), 1); 
+}
+
+# The following global functions are used by all the above types of report.
+
+sub CreateRoot {
+  return new SourceInfo::Item("",undef);
+}
+
+sub LimitRelevantOwners {
+  my $ownername = shift;
+  my $owners = shift;
+
+  my @owners = grep { $_->Component =~ m/^\Q$ownername\E$/i } @$owners;
+  return \@owners;
+}
+
+# This takes a load of Items and makes a nice table. Mostly, it
+# just tells each item to produce some relevant rows.
+
+sub MakeTable {
+  my $items = shift;
+
+  my @header = ( "Area" );
+  push @header, "Files" if $countfiles;
+  push @header, ( "Component", "Element", "Status", "Notes" );
+  my @rows = (\@header);
+  foreach my $item (sort { $a->Path cmp $b->Path } @$items) {
+    next unless $item->{show};
+    push @rows, @{$item->MakeRows()};
+  }
+  return \@rows;
+}
+
+# This tells each owner to attach itself to the right place
+# in the tree of Items.
+
+sub FindOwnedItems {
+  my $owners = shift;
+  my $root = shift;
+  my $createnew = shift;
+
+  foreach my $owner (@$owners) {
+    $owner->FindOwnedItem($root, $createnew);
+  }
+}
+
+# This produces all the Owner objects, by way of creating some
+# ephemeral OwnerFinder objects. This is the only place
+# OwnerFinders are used.
+
+sub FindOwners {
+  my $component = shift; # may be undefined
+  my @owners;
+
+  my @ownerfinders = (new SourceInfo::OwnerFinder::Source);
+  push @ownerfinders, new SourceInfo::OwnerFinder::Ignores if $includeignores;
+  push @ownerfinders, new SourceInfo::OwnerFinder::Binaries if $includebinaries;
+
+  @owners = map { @{ $_->FindOwners($component) } } @ownerfinders;
+
+  return \@owners;
+}
+
+##########################################################################################
+##########################################################################################
+package SourceInfo::Item;
+
+sub new {
+  my $class = shift;
+  my $name = shift;
+  my $parent = shift;
+  my $status = shift;
+  die "No name provided" unless (defined $name);
+  return bless {
+    name => $name, # '' if root. NOT '\'
+    children => undef,
+    parent => $parent, # undef if root
+    category => undef,
+    owners => [], # links to any Owner objects.
+    fullpath => undef,
+    status => $status,
+    children => {}, # yes, there are circular references and the whole tree won't die until global cleanup
+    show => 0 # whether to show in the results
+  }, (ref $class || $class);
+}
+
+# Produce rows relevant to put into the results tables
+
+sub MakeRows {
+  my $self = shift;
+
+  my $owners = $self->Owners();
+
+  my @rows;
+  foreach my $owner (@$owners) { # for each owner...
+    push @rows, $self->MakeARow($owner);
+  }
+  if ($self->NumOwners == 0) { # or, if we don't have an owner :-(
+    push @rows, $self->MakeARow();
+  }
+  return \@rows;
+}
+
+sub MakeARow {
+  my $self = shift;
+  my $owner = shift;
+
+  my @row = ($self->Path());
+  push @row, $self->NumFiles() if ($countfiles);
+  if ($owner) {
+    push @row, $owner->Component();
+    push @row, $owner->Element();
+    push @row, $self->Category() || $owner->Status() || "-";
+  } else {
+    push @row, ("-", "-");
+    push @row, $self->Category() || "-";
+  }
+  push @row, $self->Notes();
+  return \@row;
+}
+
+sub NumOwners {
+  my $self = shift;
+  return scalar @{$self->Owners()};
+}
+
+# Will later be used for IPR category.
+# This currently isn't used.
+
+sub Category {
+  my $self = shift;
+  return undef;
+}
+
+# These two methods are alternatives for making some or all of the
+# items visible, depending on their ownership.
+
+sub ShowAll {
+  my $self = shift;
+  $self->{show} = 1;
+  $self->ExecuteChildren(sub {$_->ShowAll});
+}
+
+sub DecideVisibility {
+  my $self = shift;
+  print "Deciding visibility for ".$self->Path.". Is directory: ".$self->IsDirectory.", owners: ".@{$self->{owners}}.", children: ".%{$self->{children}}."\n" if $verbose > 3;
+  if ( $self->IsFile() || @{$self->{owners}} || !%{$self->{children}} ) {
+    $self->{show} = 1;
+  }
+  $self->ExecuteChildren(sub { $_->DecideVisibility } );
+}
+
+sub NumFiles {
+  my $self = shift;
+
+  $self->ExpandAll;
+  my $files = ($self->IsDirectory)?0:1;
+  foreach (values %{$self->{children}}) {
+    $files += $_->NumFiles;
+  }
+  
+  return $files;
+}
+
+sub Notes {
+  my $self = shift;
+  my $numowners = $self->NumOwners;
+  if ($numowners == 0) {
+    return "NONE";
+  } elsif ($numowners > 1) {
+    return "MULTIPLE";
+  } elsif ($self->Owners()->[0]->Type() eq "ignore") {
+    return "IGNORED";
+  }
+}
+ 
+sub IsDirectory {
+  my $self = shift;
+  return -d ($self->Path || "\\");
+}
+
+sub IsFile {
+  my $self = shift;
+  return -f ($self->Path || "\\");
+}
+
+# Destructor. Not currently used - just in case we want to delete
+# a tree full of circular references.
+
+sub DeleteAll {
+  my $self = shift;
+  $self->{parent} = undef;
+  $self->ExecuteChildren( sub { $_->DeleteAll } );
+}
+
+# Returns a list of each item
+
+sub GetAll {
+  my $self = shift;
+  my @items = ($self);
+  $self->ExecuteChildren(sub { push @items, @{$_->GetAll} } );
+  return \@items;
+}
+
+# Returns a list of each item that's visible
+
+sub GetAllVisible {
+  my $self = shift;
+  my @items = grep { $_->{show} } @{$self->GetAll};
+  return \@items;
+}
+
+sub ExpandAll {
+  my $self = shift;
+  print "." if $verbose;
+  $self->FindChildren;
+  $self->ExecuteChildren( sub { $_->ExpandAll } );
+}
+
+# This expands any directories which don't have owners, but some
+# of the subdirectories are owned.
+
+sub ExpandUnownedDirs {
+  my $self = shift;
+  print "Expanding unowned for ".$self->Path."\n" if $verbose>1;
+  return unless $self->IsDirectory;
+  return if $self->NumOwners;
+  # We also return if NONE of the children are owned, 
+  # i.e. we're a totally unowned directory.
+  return unless $self->{childownersfound};
+  $self->FindChildren;
+  $self->ExecuteChildren (sub { $_->ExpandUnownedDirs } );
+}
+
+sub ExpandOwnedDirs {
+  my $self = shift;
+
+  $self->ExpandAll() if (@{$self->{owners}});
+  $self->ExecuteChildren (sub { $_->ExpandOwnedDirs } );
+}
+
+# Recursively applies a function to each item
+
+sub ExecuteChildren {
+  my $self = shift;
+  my $sub = shift;
+  &$sub($_) foreach (values %{$self->{children}});
+}
+
+sub FindChildren {
+  my $self = shift;
+  print "Finding children for ".$self->Path."\n" if $verbose>1;
+  return if defined $self->{foundchildren};
+  return if ($self->Path eq "\\epoc32" && !$expandepoc32);
+  $self->{foundchildren} = 1;
+  $self->ReadDir();
+  my %kids = map { (lc $_, new SourceInfo::Item($_, $self)) } @{$self->{dirlisting}};
+  print "Currently has these children: ".(join (', ', map { "$_->{name} ".$_->NumOwners } values %{$self->{children}}))."\n" if $verbose>2;
+  $self->{children} ||= {};
+  $self->{children} = { %kids, %{$self->{children}} };
+}
+
+sub NumChildren {
+  my $self = shift;
+  $self->ReadDir;
+  return @{$self->{dirlisting}};
+}
+
+sub ReadDir {
+  my $self = shift;
+  return if $self->{dirlisting};
+  $self->{dirlisting} = [] and return unless $self->IsDirectory();
+  print "Reading directory for ".$self->Path."\n" if $verbose > 1;
+  my $dh = new DirHandle($self->Path() || "\\") or die "Couldn't open directory handle for \"".$self->Path()||"\\"."\" because $!";
+  $self->{dirlisting} = [ grep { ! m/^\./ } $dh->read ];
+  $dh = undef; # I know this is OBVIOUSLY going to happen at the end of this function but
+               # I am getting strange out-of-file-descriptor errors.
+}
+
+sub Path {
+  my $self = shift;
+  unless (defined $self->{fullpath}) {
+    if (defined $self->{parent}) {
+      $self->{fullpath} = $self->{parent}->Path() . "\\" . $self->{name};
+    } else {
+      $self->{fullpath} = $self->{name};
+    }
+  }
+  return $self->{fullpath};
+}
+
+# This is used to find a particular item in the tree,
+# given a path. (It's used when searching for something
+# that is owned, for example). The 'createnew' flag
+# specifies whether it should create new files and directories
+# if necessary.
+
+sub FindItem {
+  my $self = shift;
+  my $path = shift;
+  my $createnew = shift;
+
+  print "Asked to find \"$path\"...\n" if ($verbose > 3);
+  
+  my @segments = split (/\\/, $path);
+  unshift @segments, "" unless $segments[0] eq ""; # root segment has no name
+  $self->FindItemBySegments($createnew, @segments);
+}
+
+sub FindItemBySegments {
+  my ($self, $createnew, $firstseg, @othersegs) = @_;
+
+  print "\n$self->{name} (path ".$self->Path().") (createnew $createnew):--\n" if ($verbose > 3);
+  print "First segment $firstseg, others @othersegs\n" if ($verbose > 3);
+
+  die "No path provided" unless defined $firstseg;
+
+  if (lc $firstseg eq lc $self->{name}) {
+    if (@othersegs) {
+      foreach (values %{$self->{children}}) {
+        my $found = $_->FindItemBySegments($createnew, @othersegs);
+        return $found if $found;
+      }
+      return undef unless $createnew;
+      return $self->CreateNewSegment(@othersegs);
+    } else {
+      return $self;
+    }
+  } else {
+    return undef;
+  }
+}
+
+sub CreateNewSegment {
+  my ($self, $firstseg, @othersegs) = @_;
+  print "Creating new segment for $firstseg (others @othersegs) within ".$self->Path."\n" if $verbose>1;
+
+  my $kid = new SourceInfo::Item($firstseg, $self);
+  $self->{children}->{lc $firstseg} = $kid;
+  $self->{childownersfound} = 1;
+  return $kid->FindItemBySegments(1, $firstseg, @othersegs);
+}
+
+sub Owners {
+  my $self = shift;
+  my @allowners = @{$self->{owners}};
+  return \@allowners unless ($self->{parent});
+  push @allowners, @{$self->{parent}->Owners};
+  return \@allowners;
+}
+
+sub AddOwner {
+  my $self = shift;
+  my $owner = shift;
+  push @{$self->{owners}}, $owner;
+}
+
+##########################################################################################
+##########################################################################################
+package SourceInfo::Owner;
+
+sub new {
+  my $class = shift;
+  my $type = shift;
+  my $component = shift;
+  my $element = shift;
+  my $status = shift;
+
+  return bless {
+    type => $type, # ignore, binary or source
+    component => $component,
+    element => $element,
+    status => $status
+  }, (ref $class || $class);
+}
+
+sub FindOwnedItem {
+  my $self = shift;
+  my $root = shift;
+  my $createnew = shift;
+  
+  print "About to find the owned item for \"$self->{element}\" ($createnew)\n" if ($verbose > 3);
+  my $item = $root->FindItem($self->{element}, $createnew);
+  die "Failed to create new item" if (!$item && $createnew);
+  $item->AddOwner($self) if $item;
+}
+
+sub Component {
+  my $self = shift;
+  return "-" if ($self->Type() eq "ignore");
+  return $self->{component};
+}
+
+sub Element {
+  my $self = shift;
+  return "<binary>" if ($self->{type} eq "binary");
+  return "<ignore>" if ($self->Type() eq "ignore");
+  return $self->{element} || "-";
+}
+
+sub Type {
+  my $self = shift;
+  return $self->{type};
+}
+
+sub Status {
+  my $self = shift;
+  return $self->{status};
+}
+
+##########################################################################################
+##########################################################################################
+package SourceInfo::OwnerFinder;
+
+sub new {
+  my $class = shift;
+  return bless {}, (ref $class || $class);
+}
+
+sub Components {
+  my $self = shift;
+  my $versionInfo = $envDb->VersionInfo();
+  return sort keys %$versionInfo;
+}
+
+package SourceInfo::OwnerFinder::Ignores;
+BEGIN { @SourceInfo::OwnerFinder::Ignores::ISA = qw(SourceInfo::OwnerFinder); };
+
+sub FindOwners {
+  my $self = shift;
+  my @owners;
+  # First, the ignored items
+  print "Finding ignored binaries.\n" if $verbose;
+  my $ignoreList = $iniData->BinariesToIgnore();
+  push (@$ignoreList, '\\epoc32\\relinfo\\*');
+  foreach my $ignore (@$ignoreList) {
+    my @found = glob $ignore;
+    if (@found) {
+      push @owners, new SourceInfo::Owner("ignore", undef, $_, undef) foreach (@found);
+    } elsif ($ignore =~ s/\\\*$//) {
+      push @owners, new SourceInfo::Owner("ignore", undef, $ignore, undef);
+    }
+  }
+  return \@owners;
+}
+
+package SourceInfo::OwnerFinder::Source;
+BEGIN { @SourceInfo::OwnerFinder::Source::ISA = qw(SourceInfo::OwnerFinder); };
+
+sub FindOwners {
+  my $self = shift;
+  my $component = shift;
+  print "Finding source directories owned.\n" if $verbose;
+  my @owners;
+  my @comps_to_examine;
+  if ($component) {
+    @comps_to_examine = ($component);
+  } else {
+    @comps_to_examine = $self->Components();
+  }
+
+  foreach my $comp (@comps_to_examine) {
+    eval {
+      foreach my $element (keys %{$self->GetSourceInfo($comp)}) {
+        
+        if($iniData->HasMappings()){
+          $element = $iniData->PerformMapOnFileName($element);
+          $element = Utils::RemoveSourceRoot($element);
+        }
+	      
+        push @owners, new SourceInfo::Owner("source", $comp, $element, undef);
+      }
+    };
+    if ($@) {
+      print "Warning: could not find owner information for \"$comp\" because $@";
+    }
+  }
+  return \@owners;
+}
+
+sub GetSourceInfo {
+  my $self = shift;
+  my $comp = shift;
+  my $ver = $envDb->Version($comp);
+  my $relData = RelData->Open($iniData, $comp, $ver, $verbose);
+  return $relData->SourceItems();
+}
+
+package SourceInfo::OwnerFinder::Binaries;
+BEGIN { @SourceInfo::OwnerFinder::Binaries::ISA = qw(SourceInfo::OwnerFinder); };
+
+sub FindOwners {
+  my $self = shift;
+  my $component = shift;
+  my @owners;
+  print "Finding binaries owned.\n" if $verbose;
+  my @comps_to_examine;
+  if ($component) {
+    @comps_to_examine = ($component);
+  } else {
+    @comps_to_examine = $self->Components();
+  }
+  foreach my $comp (@comps_to_examine) {
+    my $bfowned = $envDb->ListBins($comp);
+    shift @$bfowned; # get rid of the header row
+    foreach my $binfile (@$bfowned) {
+      my $file = $binfile->[0];
+      my $status = $binfile->[1];
+      push @owners, new SourceInfo::Owner("binary", $comp, $file, $status);
+    }
+  }
+  return \@owners;
+}
+
+
+__END__
+
+=head1 NAME
+
+SourceInfo - Displays information about the source code associated with components.
+
+=head1 SYNOPSIS
+
+  sourceinfo [options] [any file | component]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -f  list individual files, not just directories
+  -b  include binary files
+  -i  include 'ignored' files
+  -s  print summary report (don't specify a component or a file)
+  --force (deprecated)
+  -c  show a count of the files in each directory (and its subdirectories) -- can be slow
+
+=head1 DESCRIPTION
+
+If given a filename, prints information about what component(s) release the source directory(ies) containing that file.
+
+  Area                     Files   Component   Element     Status   Notes
+  \aardvark                6       aardvark    \aardvark   -
+  \aardvark\aardvark.mrp   1       aardvark    \aardvark   -
+
+The confusing 'element' column lists what MRP 'source' statement owns that item of source code. 
+
+If given a component name, prints information about what directories that component releases.
+
+  Area        Files   Component   Element     Status   Notes
+  \aardvark   6       aardvark    \aardvark   -
+
+If no component name is specified, then a full report will be provided for each component.  This will also report any files or directories that are not owned by any component, as well as any file or directories which are owned by more than one component.
+
+  Area             Files   Component   Element       Status Notes
+  \aardvark        6       aardvark    \aardvark     -
+  \albatross       6       albatross   \albatross    -
+  \anteater        6       anteater    \anteater     -
+  \buffalo         6       buffalo     \buffalo      -
+
+If the -s flag is provided, then only the information about files/directories with zero or multiple ownership is shown.
+
+  Files/areas without ownership:
+    \prepenv-input.txt
+    \reltools-tmp-cleanremote-conf.txt
+  Files/areas with multiple ownership:
+
+The F<\epoc32> tree is not normally included in reports. Similarly, files owned as "binary" files by components aren't included in reports - so, if a component releases binary files outside of F<\epoc32> then they will be shown as having no ownership.
+
+For completeness, you can include binary ownership in the report using C<-b>. A similar option is C<-i>. This turns on the scanning of 'ignored' areas, such as F<\epoc32\wins\c>. 
+
+The final option is C<-f>. If a directory is uniformly owned, then normally the files inside that directory will not be listed. Adding C<-f> prompts the tool to list every file.
+
+Note that the output of this may NOT be suitable for distributing to licensees, because it may include directory structures of bits of IPR they are not licensed to see.
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None, but this tool is still rather experimental so please treat the output with caution.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/SourceInfo.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/ApplyDelta.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,415 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::ApplyDelta.pm
+#
+
+package Symbian::CBR::ApplyDelta;
+
+use strict;
+use File::Basename;
+use FindBin qw($Bin);
+use File::Spec;
+use Symbian::CBR::Component::Manifest;
+use Symbian::CBR::DeltaRelease::Manifest qw(META_FILES DELTA_MANIFEST_FILE);
+use ExportData;
+use EnvDb;
+use Utils;
+use File::Path;
+use File::Temp;
+use XML::Simple;
+use File::Copy;
+use Carp;
+use Cwd;
+
+
+sub new {
+  my $pkg = shift;
+  my $iniData = shift;
+  my $verbose = shift;
+  my $self;
+  $self->{iniData} = $iniData;
+  $self->{verbose} = $verbose;
+  bless $self, $pkg;
+  return $self;
+}
+
+
+sub ReconstructEnv {
+  my $self = shift;
+  my $zipFile = shift;
+  my $overwrite = shift;
+
+  $self->{deltaManifest} = Symbian::CBR::DeltaRelease::Manifest->new($self->{verbose});
+  Utils::InitialiseTempDir($self->{iniData});
+  $self->{deltaDir} = Utils::TempDir();
+
+  my $deltaManifestFile = File::Spec->catfile($self->{deltaDir}, DELTA_MANIFEST_FILE );
+  print "Extracting delta release package.\n";
+  eval {Utils::Unzip($zipFile,$self->{deltaDir},0,1);};
+  croak "Error: Couldn't Extract File $zipFile $@\n" if($@);
+  #Read delta manifest file.
+
+  $self->{deltaManifest}->LoadManifest($deltaManifestFile);
+  my $referenceBaseline = $self->{deltaManifest}->GetReferenceBaselineComp();
+  my $referenceVersion = $self->{deltaManifest}->GetReferenceBaselineVer();
+  my $destination =  $self->{iniData}->PathData->LocalArchivePathForExistingComponent($referenceBaseline, $referenceVersion);
+  croak "Error: Reference baseline $referenceBaseline $referenceVersion does not exist.\n" unless (defined $destination);
+  my $index = index($destination, $referenceBaseline);
+  $destination = substr($destination, 0, ($index));
+  foreach  my $comp (sort keys %{$self->{deltaManifest}->ListAllComponents()}) {
+    my $compStatus = $self->{deltaManifest}->GetCompStatus($comp);
+    my $hasError;
+    if ($compStatus eq "modified") {
+      $hasError = $self->ReconstructComp($comp, $destination, $overwrite); #Reconstruct modified component.
+    }
+    elsif ($compStatus eq "added") {
+      $hasError = $self->CopyCompToBaseline($comp, $destination, $overwrite); #Directly copy component to baseline.
+    }
+    
+    if ($hasError) {
+      my $version = $self->{deltaManifest}->GetCompNominatedVer($comp);
+      print "Error: Can't reconstruct component $comp, version $version\n";
+      next;
+    }
+  }
+  rmtree($self->{deltaDir}) or print "Warning: Couldn't delete temp directory ".$self->{deltaDir}.".\n";
+}
+
+sub CopyCompToBaseline {
+  my $self = shift;
+  my $comp = shift;
+  my $destination = shift;
+  my $overwrite = shift;
+
+  print "$comp is newly added to the baseline.\n";
+  my $tempNewCompPath = File::Spec->catfile($self->{deltaDir},"new", $comp);
+  my $nomVersion = $self->{deltaManifest}->GetCompNominatedVer($comp);
+  my $archiveCompPath = File::Spec->catdir($destination, $comp, $nomVersion);
+  if (-d $archiveCompPath and !$overwrite) {
+    print "Error: $comp already exists. Please use -o option to overwrite.\n";
+    return 1;
+  }
+  mkpath($archiveCompPath) unless (-d $archiveCompPath);
+  foreach my $thisFile (@{Utils::ReadDir($tempNewCompPath)}) {
+    my $thisTempFile = File::Spec->catfile($tempNewCompPath, $thisFile);
+    my $thisArchivepFile = File::Spec->catfile($archiveCompPath, $thisFile);
+    if (-e $thisArchivepFile) {
+      print "Overwriting $thisFile.\n " if ($self->{verbose});	
+      unless (unlink($thisArchivepFile)) {
+        print "Error: Couldn't delete $thisArchivepFile : $!\n";
+	return 1;
+      }
+    }	  
+    unless (copy($thisTempFile, $thisArchivepFile)) {
+      print "Error: Couldn't copy file from $thisTempFile to $thisArchivepFile.\n";
+      return 1;
+    }
+  }
+  return 0;
+}
+
+sub ReconstructComp {
+  my $self = shift;
+  my $comp = shift;
+  my $destination = shift;
+  my $overwrite = shift;
+
+  my $refVersion =  $self->{deltaManifest}->GetCompReferenceVer($comp);
+  my $nomVersion = $self->{deltaManifest}->GetCompNominatedVer($comp);
+  print "Reconstructing $comp component.\n";
+  my $refCompVer = File::Spec->catdir($destination, $comp, $refVersion);
+  my $nomCompVer = File::Spec->catdir($destination, $comp, $nomVersion);
+  if (-d $nomCompVer and !$overwrite) {
+    print "Error: $comp of $nomVersion version already exists. Please use -o option to overwrite.\n";
+    return 1;
+  }
+  if (-d $nomCompVer) {
+    print "Overwriting $comp\n" if($self->{verbose});
+    my $origDir = cwd();
+
+    chdir(dirname($nomCompVer)); #If you try to rmtree a UNC path the cwd must also be a UNC path
+    unless (rmtree($nomCompVer)) {
+      print "Error: Couldn't delete $nomCompVer directory\n";
+      return 1;
+    }
+    chdir($origDir);
+  }
+  mkpath($nomCompVer);
+  #Make copy of reference version.
+  foreach my $thisFile (@{Utils::ReadDir($refCompVer)}) {
+    my $thisRefFile = File::Spec->catfile($refCompVer, $thisFile);
+    my $thisNomFile = File::Spec->catfile($nomCompVer, $thisFile);
+    unless (copy($thisRefFile, $thisNomFile)) {
+      print "Error: Couldn't copy file from $thisRefFile to $thisNomFile. $!\n";
+      return 1;
+    }
+  }
+
+  #Reconstruct modified zip files, copy newly added zip files and delete deleted zip files.
+  foreach  my $zipfile (keys  %{$self->{deltaManifest}->GetZipFilesForComp($comp)}) {
+    my $zipStatus = $self->{deltaManifest}->GetZipStatus($comp, $zipfile);
+    my $nomZipFile = File::Spec->catfile($nomCompVer, $zipfile);
+    if ($zipStatus eq "modified") {
+      my $hasError = $self->ReconstructZipFile($comp, $zipfile, $nomCompVer); #If zip file is modified, then reconstruct it.
+      return $hasError if($hasError);
+    }
+    
+    elsif ($zipStatus eq "added") {
+      my $tempZipFile = File::Spec->catfile(Utils::TempDir(),"modified","addedZips",$comp,$zipfile);
+      if (-e $nomZipFile) {
+        print "Overwriting $nomZipFile.\n " if ($self->{verbose});
+        unless (unlink($nomZipFile)) {
+          print "Error: Couldn't delete $nomZipFile : $!\n";
+	  return 1;
+	}
+      }
+      unless (copy($tempZipFile, $nomZipFile)) {
+        print "Error: Couldn't copy $tempZipFile to $nomZipFile. $!\n";
+	return 1;
+      }
+    }
+    elsif ($zipStatus eq "deleted") {
+      if (-e $nomZipFile) {
+        unless (unlink($nomZipFile)) {
+          print "Error: Couldn't delete $nomZipFile : $!\n";
+	  return 1;
+        }
+      }
+    }
+    elsif ($zipStatus eq "identical") {
+      print "$zipfile is not modified.\n" if($self->{verbose} > 1);
+    }
+    else {
+      print "Error: Unknown zip file status \"$zipStatus\" for $zipfile of $comp component in delta manifest file.\n";
+      return 1;
+    }
+  }
+  #Reconstruct reldata, manifest.xml and exports.txt files.
+  my $deltaFilePath = File::Spec->catdir($self->{deltaDir}, META_FILES);
+  foreach my $metafile (keys %{$self->{deltaManifest}->GetMetaFiles($comp)}) {
+    my $nomFile = File::Spec->catfile($nomCompVer, $metafile);
+    my $deltaFile = $comp."_".$metafile;
+    $deltaFile = File::Spec->catfile($deltaFilePath, $deltaFile);
+    #retry 10 times
+    my $retries = 10;
+    while ($retries > 0) {
+      if (-e $nomFile) {
+        unlink($nomFile) or print "Warning: delete file $nomFile failed. $?, $!\n";
+      }
+      print "Copying $metafile.\n" if( -e $metafile and $self->{verbose});
+      if (copy($deltaFile, $nomFile) == 0) {
+        #copy failed, warning and try again
+        print "Warning: Couldn't copy file from $deltaFile to $nomFile. $!\n";
+        $retries--;
+      }
+      else {
+        #copy successfully, jump out of the loop
+        last;
+      }
+    }
+    if ($retries<=0) {
+      print "Error: Couldn't copy file $deltaFile to $nomFile. $!\n";
+      return 1;
+    }
+  }
+  
+  return 0;
+}
+
+
+sub ReconstructZipFile {
+  my $self = shift;
+  my $comp = shift;
+  my $zipfile = shift;
+  my $releaseFolder = shift;
+  
+  my $nomZipFile = File::Spec->catfile($releaseFolder, $zipfile);
+  my $tempCompPath = mkdtemp($self->{iniData}->TempDir().'\_XXXX');
+  mkpath ($tempCompPath) unless(-d $tempCompPath);
+  my $tempCompZips = File::Spec->catdir($self->{deltaDir}, "TempZips");
+  mkpath($tempCompZips) unless(-d $tempCompZips);
+  my $tempCompZipFile = File::Spec->catdir($tempCompZips, $zipfile);
+  #Move zip file to temporary location.
+  unless (move($nomZipFile, $tempCompZipFile)) {
+    print "Error: Couldn't move $zipfile to temp directory. $!\n";
+    return 1;
+  }
+  print "Extracting $zipfile file.\n" if($self->{verbose} > 1);
+  Utils::Unzip($tempCompZipFile,$tempCompPath,0,1);
+  unless (unlink($tempCompZipFile)) {
+    print "Error: Couldn't delete $tempCompZipFile : $!\n";
+    return 1;
+  }
+
+  foreach my $file (keys %{$self->{deltaManifest}->GetFilesForZip($comp, $zipfile)}) {
+    my $deltaFilePath = File::Spec->catfile($self->{deltaDir},"modified",$file);
+    my $tempCompFilePath = File::Spec->catfile($tempCompPath,$file);
+    my $fileStatus = $self->{deltaManifest}->GetFileStatus($comp, $zipfile, $file);
+    my $type = $self->{deltaManifest}->GetFileType($comp, $zipfile, $file );
+
+    if ($fileStatus eq "added") {
+      print "Copying $file\n" if($self->{verbose});
+      my $tempFilePath = dirname ($tempCompFilePath);
+      unless (-e $tempFilePath) {
+        unless (mkpath ($tempFilePath)) {
+          print "Error: Unable to create $tempFilePath path.\n";
+	  return 1;
+	}
+      }
+      unless (-e $deltaFilePath) {
+        print "Error: $deltaFilePath file doesn't exists.\n";
+	return 1;
+      }
+      unless (copy($deltaFilePath, $tempCompFilePath)) {
+        print "Error: Couldn't copy file from $deltaFilePath to $tempCompFilePath\n";
+	return 1;
+      }
+    }
+    elsif ($fileStatus eq "modified") {
+      if ($type eq "file") {
+        if (-e $tempCompFilePath) {
+          unless (unlink($tempCompFilePath)) {
+            print "Error: Couldn't delete $tempCompFilePath : $!\n";
+	    return 1;
+	  }
+        }
+        my $tempFilePath = dirname ($tempCompFilePath);
+        unless (-e $tempFilePath) {
+          mkpath ($tempFilePath) or croak "Error: Unable to create $tempFilePath path.\n";
+        }		  
+        unless (-e $deltaFilePath) {
+          print "Error: $deltaFilePath file doesn't exist.\n";
+	  return 1;
+	}
+        unless (copy ($deltaFilePath, $tempCompFilePath)) {
+          print "Error: Couldn't copy file from $deltaFilePath to $tempCompFilePath\n";
+	  return 1;
+	}
+      }
+      elsif ($type eq "delta") {
+        my $deltaFile = $deltaFilePath.".delta";
+        $self->ReconstructFile($tempCompFilePath, $deltaFile, $tempCompFilePath);
+      }
+      else {
+        print "Error: Unknown file type \"$type\" in delta manifest file.\n";
+	return 1;
+      }
+    }
+    elsif ($fileStatus eq "deleted") {
+      if (unlink($tempCompFilePath) == 0) {
+        if (-e $tempCompFilePath) {
+          print "Error: Couldn't delete $tempCompFilePath : $!\n";
+	  return 1;
+        }
+        else {
+          print "Warning: Expecting to delete $tempCompFilePath, but it does not exist.\n";
+        }
+      }
+    }
+    else {
+      print "Error: Unknown file status \"$fileStatus\" for \"$file\" file.\n";
+      return 1;
+    }
+  }
+  #Pack all files of a zipfile to form a category.zip file.
+  my @allFiles;
+  my @filesToBeZipped;
+  Utils::ListAllFiles($tempCompPath, \@allFiles);
+  foreach  my $thisFile (@allFiles) {
+    my $file = substr($thisFile, (length($tempCompPath)+1));
+    push @filesToBeZipped, $file;
+  }
+  Utils::ZipList( $nomZipFile, \@filesToBeZipped, $self->{verbose}, undef,$tempCompPath);
+  unless (rmtree ($tempCompPath)) {
+    print "Error: Couldn't delete $tempCompPath directory.\n"; 
+    return 1;
+  }
+  
+  return 0;
+}
+
+sub ReconstructFile {
+  my $self = shift;
+  my $referenceFile = shift;
+  my $deltaFilePath = shift;
+  my $destination = shift;
+
+  my $destinationDir = dirname($destination);
+  mkpath($destinationDir) unless(-d $destinationDir);
+  print "Reconstructing ".basename($referenceFile)." file.\n" if($self->{verbose} > 1);
+  my $status = system "zdu \"$referenceFile\" \"$deltaFilePath\"  \"$destination\"" ;
+  if( $status != 0 ) {
+    $status = system "zdu" ;
+    $! = $? >> 8;
+    if( $status != 0 ) {
+      print "Error: The zdelta tool is not installed. Please install zdelta.\n";
+      croak;
+    }
+    else {
+      print "Error: The zdelta tool is not installed properly. Please install zdelta once again.\n";
+      croak;
+    }
+  }
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Symbian::CBR::ApplyDelta.pm - Reconstructs the nominated baseline using deltas and reference version of baseline.
+
+=head2 new
+
+Expects to be passed an C<IniData> reference and verbosity level. Creates an ApplyDelta object. 
+
+=head2 ReconstructEnv
+
+Expects to be passed a delta zip file path, a destination archive where the environment is to be created, and an overwrite flag specifying whether existing components should be overwritten or not. It makes use of the delta zip file and a reference baseline (specified by the delta manifest file) and reconstructs the originally nominated baseline.
+
+=head2 ReconstructComp
+
+Expects to be passed a component name, a destination and an overwrite flag specifying whether existing component should be overwritten or not. It makes use of the delta for a component and a reference version of a component (specified by the delta manifest file) and reconstructs the originally nominated version of a component.
+
+=head2 ReconstructFile
+
+Expects to be passed a reference file, path to a delta file and a destination path. Makes use of the zdelta third party tool to reconstruct the originally nominated version of the file from the inputs.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/Component/Manifest.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,686 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package Symbian::CBR::Component::Manifest;
+use base qw(Exporter);
+use EnvDb;
+use strict;
+use IniData;
+use MrpData;
+use XML::Simple;
+use POSIX qw(strftime);
+use Utils;
+use Carp;
+use File::Spec;
+use File::Basename;
+use CatData;
+use IniData;
+
+eval { push @INC, Utils::PrependEpocRoot('\epoc32\tools') };
+
+#
+#Constants
+#
+
+use constant CONTENTTYPE_SOURCE => 'source';
+use constant CONTENTTYPE_BINARY => 'binary';
+use constant CONTENTTYPE_EXPORT => 'export';
+use constant CONTENT_TYPE       => 'content-type';
+use constant IPR_CATEGORY       => 'ipr-category';
+use constant BINARY_PLATFORM    => 'platform';
+use constant EVALID_MD5         => 'evalid-checksum';
+use constant MODIFIED_TIME      => 'modified-timestamp';
+use constant MANIFEST_FILE      => 'manifest.xml';
+use constant STATUS_CLEAN       => 0;
+use constant STATUS_DIRTY       => 1;
+use constant STATUS_DIRTY_SOURCE=> 4;
+our @EXPORT = qw(MANIFEST_FILE CONTENT_TYPE IPR_CATEGORY);
+
+#
+#Public Interfaces
+#
+
+sub new {
+    my $class = shift;
+    my $file  = shift;
+    my $verbose = shift;
+
+    croak "Error: $file does not exist\n" if !-e $file;
+
+    my $self = bless {}, $class;
+    $self->{verbose} = $verbose;
+    if ( $file =~ /.mrp$/i ) { #check if file is a mrp file
+        $self->PopulateDataFromMRP($file);
+    }
+    elsif ( basename($file) =~ /.xml$/i ) { #check if file is a manifest file
+        $self->LoadManifestFile($file);
+    }
+    else { #cannot proceed if file is neither MRP nor manifest file
+        croak "Error: File is neither an MRP file nor a manifest file.\n";
+    }
+    return $self;
+}
+
+sub Save {
+    my $self             = shift;
+    my $manifestLocation = shift;
+    my $myManifestFileBasename = shift;
+    my $manifestFile = undef;
+    
+    if (defined $myManifestFileBasename) {
+        print "-----> Use user defined manifest file basename: $myManifestFileBasename \n";
+        $manifestFile = File::Spec->catfile( $manifestLocation, $myManifestFileBasename);
+    }
+    else {
+        print "---- > Use default manifest file basename\n";
+        $manifestFile = File::Spec->catfile($manifestLocation, MANIFEST_FILE);
+    }
+
+    #Die, if the directory path doesn't exist
+    croak "Error: Directory path does not exist : $manifestLocation\n" if !-d $manifestLocation;
+
+    #Create an EnvDb object to retrieve component versions
+    my $iniData = IniData->New();
+    my $envDb = EnvDb->Open($iniData, 0);
+
+    #Hash structure to be provided as input for XML::Simple->XMLout()
+    my $component = {
+        name       => $self->{componentName},
+        meta    => {
+            'cbr-version'    => { 'content' => $self->{cbrVersion} },
+            'created-time'   => { 'content' => strftime( '%Y-%m-%dT%H:%M:%S', localtime()) },
+            'mrp-path'       => { 'content' => $self->{mrpFilePath} },
+        },
+        manifest => { files => [] }
+    };
+
+    if (defined $envDb->Version($self->{componentName})) {
+        $component->{version} = $envDb->Version($self->{componentName});
+    }
+    
+    if (defined $envDb->InternalVersion($self->{componentName})) {
+        $component->{'internal-version'} = $envDb->InternalVersion($self->{componentName});
+    }
+
+    if (defined $self->{evalidVersion}) {
+        $component->{meta}{'evalid-version'}{content} = $self->{evalidVersion};
+    }
+
+    #Construct the file group structure hierarchy
+    my $groups = {};
+
+    foreach my $path (keys %{$self->{files}}) {
+        # make file representation
+        my $file = { path => $path };
+    
+        for $_ (qw(evalid-checksum modified-timestamp)) {
+            next if !defined $self->{files}{$path}{$_}; # skip undef
+            $file->{$_} = $self->{files}{$path}{$_};
+        }
+    
+        # pick file group
+    
+        my $groupid = join(',', grep defined, (
+            $self->{files}{$path}{'content-type'},
+            $self->{files}{$path}{'ipr-category'},
+            $self->{files}{$path}{'platform'}));
+    
+        # make new group if it doesn't exist
+    
+        if (!defined $groups->{$groupid}) {
+            $groups->{$groupid} = { file => [] }; # make ref
+            for $_ (qw(content-type ipr-category platform)) {
+                next if !defined $self->{files}{$path}{$_}; # skip undef
+                $groups->{$groupid}{$_} = $self->{files}{$path}{$_};
+            }
+            push @{$component->{manifest}{files}}, $groups->{$groupid};
+        }
+    
+        # add file to correct group
+    
+        push @{$groups->{$groupid}{file}}, $file;
+    }
+
+    #Use the hash structure for calling the XMLout() to write the manifest file
+    eval {XMLout(
+        $component,
+        xmldecl     => '<?xml version="1.0" encoding="ISO-8859-1"?>',
+        rootname    => 'component',
+        outputfile  => $manifestFile )};
+
+    croak "Error: Can't write manifest file: $@\n" if $@;
+
+    return $manifestFile;
+}
+
+sub Compare {
+    my $self           = shift;
+    my $manifestObj    = shift;
+    my $validatesource = shift;
+    my $keepGoing      = shift;
+    my $callback       = shift;
+    
+    my $status = STATUS_CLEAN;
+
+    #Check for similarity of component names
+    croak "Error: Component names does not match between manifest versions\n" if lc($self->{componentName}) ne lc($manifestObj->{componentName});
+
+    #Check for presence of evalid md5 in both versions of the component
+    croak "Error: MD5 info incomplete\n" if !defined $self->{evalidVersion} or !defined $manifestObj->{evalidVersion};
+
+    #Check for similarity of evalid versions used in both versions of components
+    croak "Error: Incompatible evalid versions\n" if $self->{evalidVersion} ne $manifestObj->{evalidVersion};
+   
+    #Get list of files in MRP and manifest file
+    #do not include source if validate source not specified
+    my $filesFromThisComponent   = $self->GetFiles(!$validatesource);
+    my $filesFromBaselineComponent = $manifestObj->GetFiles(!$validatesource);
+    if ( @$filesFromThisComponent != @$filesFromBaselineComponent ) { #Check if counts of files in both versions are same
+        print "File counts differ\n";
+        $status = STATUS_DIRTY;
+    }
+    %{$self->{compareFiles}} = (); # Hash to store all zip files, files for zipfile and their status.
+    my @noChecksumFiles;
+
+    foreach my $file ( @{$filesFromThisComponent} ) { #Iterate through each files listed in mrp
+        my $zipname = $self->GetZipName($file);
+        my $fileContentType = $self->GetFileInfo($file, CONTENT_TYPE);
+
+        next if !$validatesource and $fileContentType eq 'source'; #Skip comparison source files if $validatesource is not set
+        if ( !$manifestObj->FileExists($file) ) { #Check if a corresponding entry for the file exist in manifest file
+            print "File added in the new environment : $file\n";
+            $self->{compareFiles}{$zipname}{files}{$file} = "added";
+            if ( $fileContentType eq 'source' && $status != STATUS_DIRTY) {
+                $status = STATUS_DIRTY_SOURCE;
+            }
+            else {
+                $status = STATUS_DIRTY;
+                return $status unless $keepGoing; #If $keepGoing is set, continue the iteration. Else, stop the comparison and return back to the caller
+            }
+            next;
+        }
+
+        #Check evalid md5 checksums of all files
+        if (not defined $manifestObj->GetFileInfo( $file, EVALID_MD5 ) or not defined $self->GetFileInfo($file, EVALID_MD5)) {
+            push @noChecksumFiles,$file;
+        }
+        elsif ( $manifestObj->GetFileInfo( $file, EVALID_MD5 ) ne $self->GetFileInfo($file, EVALID_MD5) ) { #comparison of Evalid checksum of both verisons
+            print "The evalid checksum does not match for the file : $file\n";  
+            $self->{compareFiles}{$zipname}{files}{$file} = "modified";
+            if ( $fileContentType eq 'source' && $status != STATUS_DIRTY) {
+                $status = STATUS_DIRTY_SOURCE;
+            }
+            else {
+                $status = STATUS_DIRTY;
+                return $status unless $keepGoing; #If $keepGoing is set, continue the iteration. Else, stop the comparison and return back to the caller
+            }
+        }
+
+        #Check for mismatches in ipr-categories for source and export files
+        if ($validatesource && ($fileContentType eq 'source' or $fileContentType eq 'export')) {
+            if ($self->GetFileInfo($file, IPR_CATEGORY) ne $manifestObj->GetFileInfo($file, IPR_CATEGORY)) {
+                print "Content-type mismatch between version : $file\n";
+                
+                $self->{compareFiles}{$zipname}{files}{$file} = "added";
+                
+                my $zipnameOriginal = $manifestObj->GetZipName($file);
+                $self->{compareFiles}{$zipnameOriginal}{files}{$file} = "deleted";
+                
+                if ( $fileContentType eq 'source' && $status != STATUS_DIRTY) {
+                    $status = STATUS_DIRTY_SOURCE;
+                }
+                else {
+                    $status = STATUS_DIRTY;
+                    return $status unless $keepGoing; #If $keepGoing is set, continue the iteration. Else, stop the comparison and return back to the caller            
+                }
+            }
+        }
+        
+        #Check for moving some files from one zip file to another
+        my $ref_zipname = $manifestObj->GetZipName($file);
+        if ($zipname ne $ref_zipname) {
+        	   #The file is moved from $ref_zipname to $zipname
+            $self->{compareFiles}{$zipname}{files}{$file} = "added";
+            if ($manifestObj->FileExists($file))  {
+                $self->{compareFiles}{$ref_zipname}{files}{$file} = "deleted";
+            }
+        }
+    }
+    
+    if (scalar @noChecksumFiles > 0) {
+        if (defined $callback) {
+            unless (&$callback(\@noChecksumFiles,$self,$keepGoing)) {
+                $status = STATUS_DIRTY if ($status  == STATUS_CLEAN);
+            }
+        }
+        
+        foreach my $file (@noChecksumFiles) {
+            my $zipname = $self->GetZipName($file);
+            $self->{compareFiles}{$zipname}{files}{$file} = "modified"; #set to modified as don't have a method to compare no-checksum files
+        }
+    }
+    
+    foreach my $file ( @{$filesFromBaselineComponent } ) { 
+        my $zipname = $manifestObj->GetZipName($file);
+        if ( !$self->FileExists($file) ) {
+            $self->{compareFiles}{$zipname}{files}{$file} = "deleted";
+        }
+        else {
+            #Check for moving some files from one zip file to another
+            my $ref_zipname = $self->GetZipName($file);
+            if ($zipname ne $ref_zipname) {
+                #The file is moved from $zipname to $ref_zipname
+                $self->{compareFiles}{$zipname}{files}{$file} = "deleted";
+                $self->{compareFiles}{$ref_zipname}{files}{$file} = "added";
+           }
+        }
+    }
+   
+    return $status;
+}
+
+sub GetDiffZipFiles {
+  my $self = shift;
+  return $self->{compareFiles};
+}
+
+sub GetDiffFilesForZip {
+  my $self = shift;
+  my $zipfile = shift;
+  return $self->{compareFiles}{$zipfile}{files};
+}
+
+sub GetFileStatus {
+  my $self = shift;
+  my $zipfile = shift;
+  my $file = shift;
+  return $self->{compareFiles}{$zipfile}{files}{$file};
+}
+
+
+#
+#Private Methods
+#
+
+sub PopulateDataFromMRP {
+    my $self    = shift;
+    my $mrpFile = shift;
+
+    #Check if EvalidCompare is installed
+    if (eval { require EvalidCompare }) {
+        $self->{evalidInstalled} = 1;
+    } else {
+        print "Remark: Evalid is not available ($@)\n";
+    }
+
+    #Create a mrpData object to retrieve files list that define the component
+    my $iniData = IniData->New();
+    
+    #need to remove SRCROOT from MRP file
+    $mrpFile = Utils::RemoveSourceRoot($mrpFile);
+    
+    my $mrpData = MrpData->New( $mrpFile, undef, undef, $iniData, 0, 0 );
+
+    #Set the evalid version only if EValidCompare is installed
+    if ( $self->{evalidInstalled} ) {
+        $self->{evalidVersion}      = $EvalidCompare::VERSION;
+    }
+    #Set rest of meta data information
+    $self->{cbrVersion}         = Utils::ToolsVersion();
+    $self->{componentName}      = $mrpData->Component();
+    $self->{mrpFilePath}        = $mrpData->MrpName();
+    if ( Utils::WithinSourceRoot( $self->{mrpFilePath} ) ) {
+        $self->{mrpFilePath} = Utils::RemoveSourceRoot( $self->{mrpFilePath} );
+    }
+
+    #Iterate through list of files list returned by mrpData and calculate the manifest informations
+    #Make calls to SetFileInfo and save the manifest informations of the file to a common file hash
+    foreach my $sourcecategory ( @{ $mrpData->SourceCategories() } ) {
+        foreach my $file ( @{ $mrpData->Source( $sourcecategory ) }) {
+            my $absFilePath = Utils::RelativeToAbsolutePath( $file, $mrpData->{iniData}, SOURCE_RELATIVE );
+            
+            # Reverse any source mappings as we don't want them in the manifest...
+            $file = $iniData->PerformReverseMapOnFileName($file);
+            
+            # We also want to remove the SRCROOT from the file name
+            if (Utils::WithinSourceRoot($file)){
+                $file = Utils::RemoveSourceRoot($file);
+            }
+            if (-f $absFilePath) {
+                $self->SetFileInfo( $file, CONTENT_TYPE, CONTENTTYPE_SOURCE );
+                $self->SetFileInfo( $file, IPR_CATEGORY, $sourcecategory );
+                $self->SetFileInfo( $file, MODIFIED_TIME, Utils::FileModifiedTime( $absFilePath ) );
+                if ($self->{evalidInstalled}) {
+                    $self->GenerateEvalidSignature($file, $absFilePath);
+                }
+            }
+        }
+    }    
+
+    #List of binary files, their manifest calculations and saving to the file hash
+    foreach my $binarycategory ( @{ $mrpData->BinaryCategories() } ) {
+        foreach my $file ( @{ $mrpData->Binaries($binarycategory) } ) {
+            my $absFilePath = Utils::RelativeToAbsolutePath( $file, $mrpData->{iniData}, EPOC_RELATIVE );
+            if (-f $absFilePath) {
+                $self->SetFileInfo( $file, CONTENT_TYPE, CONTENTTYPE_BINARY );
+                if ( $binarycategory ne 'unclassified') {
+                    $self->SetFileInfo( $file, BINARY_PLATFORM, $binarycategory );
+                }
+                $self->SetFileInfo( $file, MODIFIED_TIME, Utils::FileModifiedTime( $absFilePath ) );
+                if ($self->{evalidInstalled}) {
+                    $self->GenerateEvalidSignature($file, $absFilePath);
+                }
+            }
+        }
+    }
+
+    #List of export files, their manifest calculations and saving to the file hash
+    foreach my $exportcategory ( @{ $mrpData->ExportCategories() } ) {
+        foreach my $file ( @{ $mrpData->Exports($exportcategory) } ) {
+            my $absFilePath = Utils::RelativeToAbsolutePath( $file, $mrpData->{iniData}, EPOC_RELATIVE );
+            if (-f $absFilePath) {
+                $self->SetFileInfo( $file, CONTENT_TYPE, CONTENTTYPE_EXPORT );
+                $self->SetFileInfo( $file, IPR_CATEGORY, $exportcategory );
+                $self->SetFileInfo( $file, MODIFIED_TIME, Utils::FileModifiedTime( $absFilePath ) );
+                if ($self->{evalidInstalled}) {
+                    $self->GenerateEvalidSignature($file, $absFilePath);
+                }
+            }
+        }
+    }
+}
+
+sub LoadManifestFile {
+    my $self         = shift;
+    my $manifestFile = shift;
+
+    my $iniData = IniData->New();
+
+    #Generate the hash structure from manifest file
+    my $component   = eval{XMLin(
+                    $manifestFile,
+                    forcearray => [ qw(files file) ])};
+
+    croak "Error: Can't read manifest file '$manifestFile': $@\n" if $@;
+
+    #Extract meta data informations from the generated structure
+    $self->{componentName}      = $component->{name};
+    $self->{evalidVersion}      = $component->{meta}{'evalid-version'}{content};
+    $self->{cbrVersion}         = $component->{meta}{'cbr-version'}{content};
+    $self->{mrpFilePath}        = $component->{meta}{'mrp-path'}{content};
+    $self->{createdTimeString}  = $component->{meta}{'created-time'}{content};
+
+    #Extract the manifest information of files from the generated structure
+    foreach my $category ( @{ $component->{manifest}{files} } ) {
+        foreach my $file ( @{ $category->{file} } ) {
+            
+            # DEF107988	Source mapping breaks manifest
+            # Manifest files created with CBR Tools < 2.82.1003 may contain source
+            # mapping information, which needs to be removed if present
+            my $fileName = $iniData->PerformReverseMapOnFileName($file->{path});
+            
+            # We also want to remove the SRCROOT from the file name
+            if (Utils::WithinSourceRoot($fileName)){
+                $fileName = Utils::RemoveSourceRoot($fileName);
+            }elsif (Utils::SourceRoot() ne "\\"){
+                $fileName =~ s!^[\\\/]!!;
+            }
+            
+            $self->{files}{$fileName}{'content-type'} = $category->{'content-type'};
+            $self->{files}{$fileName}{'modified-timestamp'} = $file->{'modified-timestamp'};
+            $self->{files}{$fileName}{'ipr-category'} = $category->{'ipr-category'};
+            $self->{files}{$fileName}{'platform'} = $category->{'platform'};
+            $self->{files}{$fileName}{'evalid-checksum'} = $file->{'evalid-checksum'};
+        }
+    }
+}
+
+sub RefreshMetaData {
+    my $self = shift;
+    my $comp = shift;
+    my $ver  = shift;
+
+    if (eval { require EvalidCompare }) {
+        $self->{evalidInstalled} = 1;
+    } else {
+        print "Remark: Evalid is not available ($@)\n";
+    }
+
+    my $iniData = IniData->New();
+    my %catdata;
+    my %categories;
+    
+    foreach my $file (keys %{$self->{files}}) {
+        if ($self->{files}->{$file}->{'content-type'} =~ m/export/i && !$categories{$self->{files}->{$file}->{'ipr-category'}}) {        
+        my $tempcatdata = CatData->Open($iniData, $comp, $ver, $self->{files}->{$file}->{'ipr-category'});        
+        %catdata = (%catdata, %{$tempcatdata->{data}->{exportinfo}});        
+        $categories{$self->{files}->{$file}->{'ipr-category'}} = 1;
+        }
+    }
+
+    $self->{createdTimeString} = strftime( '%Y-%m-%dT%H:%M:%S', localtime());
+    $self->{cbrVersion} = Utils::ToolsVersion();
+
+    foreach my $file (keys  %{$self->{files}}) {
+        my $type = $self->{files}->{$file}->{'content-type'};
+        my $absFilePath;
+
+        if ($type eq CONTENTTYPE_EXPORT or $type eq CONTENTTYPE_BINARY) {
+            $absFilePath = Utils::RelativeToAbsolutePath($file, $iniData, EPOC_RELATIVE);
+        } else {
+            $absFilePath = Utils::RelativeToAbsolutePath($file, $iniData, SOURCE_RELATIVE);
+        }
+        
+        if (!-e $absFilePath) {
+            delete $self->{files}->{$file};
+            next;
+        }
+        
+        $self->SetFileInfo($file, MODIFIED_TIME, Utils::FileModifiedTime($absFilePath));
+        $self->GenerateEvalidSignature($file, $absFilePath) if ($self->{evalidInstalled});
+        
+        my $policy;
+        
+        if ($self->{files}->{$file}->{'content-type'} =~ /source/i) {
+            my ($category) = Utils::ClassifyPath($iniData, $absFilePath, 0, 0, $comp);        
+            $self->SetFileInfo($file, IPR_CATEGORY, $category);
+        } elsif ($self->{files}->{$file}->{'content-type'} =~ /export/i) {
+            my $sourcefile = Utils::RelativeToAbsolutePath($catdata{$file}, $iniData, SOURCE_RELATIVE);
+            my ($category) = Utils::ClassifyPath($iniData, $sourcefile, 0, 0, $comp);     
+            $self->SetFileInfo($file, IPR_CATEGORY, $category);
+        }
+    }
+}
+
+sub SetFileInfo {
+    my $self       = shift;
+    my $file       = shift;
+    my $infoType   = shift;
+    my $valueToSet = shift;
+    $self->{files}{$file}{$infoType} = $valueToSet;
+}
+
+sub UnsetFileInfo {
+    my $self       = shift;
+    my $file       = shift;
+    my $infoType   = shift;
+    delete $self->{files}{$file}{$infoType} if exists $self->{files}{$file}{$infoType};
+}
+
+sub GetFiles {
+    my $self = shift;
+    my $excludesource = shift;
+    
+    if (!$excludesource) {
+        my @fileList = keys %{$self->{files}};
+        return \@fileList;
+    }
+    
+    my @fileList = grep (($self->GetFileInfo($_, CONTENT_TYPE) ne 'source'), keys %{$self->{files}});
+    return \@fileList;
+}
+
+sub GetFileInfo {
+    my $self     = shift;
+    my $file     = shift;
+    my $infoType = shift;
+    my $fileInfo = $self->{files}{$file}{$infoType};
+    unless (defined $fileInfo) {
+    	  $file = lc $file;
+    	  $fileInfo = $self->{files}{$file}{$infoType};
+    }
+    return $fileInfo;
+}
+
+sub FileExists {
+  my $self = shift;
+  my $file = shift;
+  my $isExists = exists $self->{files}{$file};
+  if (!$isExists) {
+    foreach my $ff (keys %{$self->{files}}) {
+      return 1 if(lc($ff) eq lc($file));
+    }
+  }
+  return $isExists;
+}
+
+sub GenerateEvalidSignature {
+    my $self = shift;
+    my $file = shift;
+    my $absFilePath = shift;
+    
+    my $error=0;
+    # Reroute STDOUT via our error handler
+    tie *STDOUT, 'Symbian::CBR::Component::Manifest::EvalidErrorHandler', \$error;
+    my ($md5Checksum, $type) = EvalidCompare::GenerateSignature($absFilePath);
+    untie *STDOUT;
+    
+    if ($error == 0) {
+        $self->SetFileInfo($file, EVALID_MD5, $md5Checksum);
+        return 1;
+    } else {
+        print "Warning: Unable to generate checksum for file $file\n" if $error == 2;
+        $self->UnsetFileInfo($file, EVALID_MD5);
+        return 0;
+    }
+}
+sub GetZipName {
+  my $self = shift;
+  my $file = shift;
+  my $fileContentType = $self->GetFileInfo($file, CONTENT_TYPE);
+  my $zipname;
+  
+  $fileContentType =~ s/export/exports/i;
+
+  if ($fileContentType eq 'binary') {
+    my $platform = $self->GetFileInfo($file, 'platform');
+    if (defined $platform) {
+      $zipname = "binaries_".$platform.".zip";
+    }
+    else {
+      $zipname = "binaries".".zip";
+    }
+  }
+  else {
+    my $cat = $self->GetFileInfo($file, 'ipr-category');
+    $zipname = $fileContentType.$cat.".zip";
+  }
+  
+  return $zipname;
+}
+
+package Symbian::CBR::Component::Manifest::EvalidErrorHandler;
+
+sub TIEHANDLE {
+    my $self = {};
+    bless $self, shift;
+    my $errorflag = shift;
+    $self->{errorflag} = $errorflag;
+    return $self;
+}
+
+sub PRINT {
+    my $self = shift;
+    my $message = shift;
+    my $errorflag = $self->{errorflag};
+
+    # Untie STDOUT
+    my $handle = tied *STDOUT;
+    untie *STDOUT;
+
+    # Check for evalidcompare dependency failures
+    if (
+      $message =~ /^Error: (.*) failed \(\d+\) on file .* - not retrying as raw binary/ or
+      $message =~ /^Error: (.*) failed again \(\d+\) on .* - reporting failure/
+    ) {
+        # Failure: checksum will be corrupt
+
+        if ($1 =~ /dumpbin/i) {
+            # Suppress known error
+            $$errorflag = 1;
+        } else {
+            $message =~ s/^Error:\s*//;
+            print "Warning: Tool dependency 'evalidcompare' failed with message: ".$message;
+            $$errorflag = 2;
+        }
+    } else {
+        # Output wasn't an error message
+        print $message;
+    }
+
+    # Re-tie the handle
+    tie *STDOUT, ref($handle), $errorflag;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Manifest.pm - A module that helps the construction of manifest objects for inclusion during component release process and for validation of component release
+
+=head1 DESCRIPTION
+
+The module is used for constructing manifest objects for individual components from either a mrp file or a manifest file. The objects obtained from either processes include informations on the environment and the files that define the component.
+
+The file properties include useful informations that can be used for validating components during the release processes like the ipr-category of sources and export files, content-type, platform in which binary files are built, evalid md5 checksum and modified timestamp.
+
+=head1 INTERFACE
+
+=head2 Object Management
+
+=head3 new
+
+Expects a full file path of a mrp file or a manifest file path. A valid manifest xml file should be available in the path. Responsible for constructing the manifest object with a list of files that define the component along with useful manifest informations and metadata information regarding the environment
+
+=head2 Data Management
+
+=head3 Compare
+
+Expects a manifest object reference as parameter. Performs a comparison of the manifest informations available in the two manifest objects returns a status of the comparison.
+
+The comparison is mainly done between the evalid md5 checksums of the both components along with basic environment check on similarity of evalid version being used for generating the checksum on the files.
+
+The comparison results in a status being returned as CLEAN (integer equivalent of 0), if the manifest object informations are the same between versions and returns DIRTY (integer equivalent of 1), if the versions differ.
+
+=head3 Save
+
+Expects a directory path as parameter. The path should be a valid existing directory path and is used by the object to save the manifest informations of the component in the form of a manifest.xml file.
+
+The manifest file will not be saved if the path mentioned for the function does not exist.
+
+The manifest file contains manifest information of all the files that define the component and are segregated based on filegroups. The filegroups are listed based on basic attributes of the files like the ipr-category, content-type and binary-platform.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/CreateDelta.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,639 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::CreateDelta.pm
+#
+
+package Symbian::CBR::CreateDelta;
+
+use File::Basename;
+use File::Spec;
+use File::Path;
+use File::Copy;
+use XML::Simple;
+use Carp;
+use Digest::Md5;
+use ExportData;
+use EnvDb;
+use Utils;
+use Symbian::CBR::DeltaRelease::Manifest qw(ADDED_ZIPS META_FILES);
+use Symbian::CBR::Component::Manifest;
+
+
+sub new {
+  my $pkg = shift;
+  my $iniData = shift;
+  my $pgpkey = shift;
+  my $releaseManifest = shift;
+  my $verbose = shift;
+  my $noevalid = shift;
+  my $nodelta = shift;
+  my $maxdelta = shift;
+
+  my $self;
+  $self->{iniData} = $iniData;
+  $self->{pgpKey} = $pgpkey;
+  $self->{releaseManifest} = $releaseManifest;
+  $self->{verbose} = $verbose;
+  $self->{noevalid} = $noevalid;
+  $self->{nodelta} = $nodelta;
+  $self->{maxdelta} = $maxdelta;
+  bless $self, $pkg;
+  return $self;
+}
+
+sub compareEnvironments {
+  my $self = shift;
+  my $referenceComp = shift;
+  my $referenceVer = shift;
+  my $nominatedComp = shift;
+  my $nominatedVer = shift;
+
+  print "Comparing reldata files\n" if($self->{verbose});
+  my $referenceRelData = RelData->Open($self->{iniData}, $referenceComp, $referenceVer, $self->{verbose});
+  my $nominatedRelData = RelData->Open($self->{iniData}, $nominatedComp, $nominatedVer, $self->{verbose});
+
+  my $referenceEnv = $referenceRelData->Environment();
+  my $nominatedEnv = $nominatedRelData->Environment();
+
+  foreach my $thisComp ( sort keys %{$nominatedEnv}){
+    if (defined $referenceEnv->{$thisComp}) {
+      if ($referenceEnv->{$thisComp} ne $nominatedEnv->{$thisComp}) {
+        $self->{diffComps}{modified}{$thisComp}{$referenceEnv->{$thisComp}} = $nominatedEnv->{$thisComp};
+      }
+      else {
+        $self->{diffComps}{identical}{$thisComp} = $nominatedEnv->{$thisComp};
+      }
+    }
+    else {
+      $self->{diffComps}{added}{$thisComp} = $nominatedEnv->{$thisComp};
+    }
+  }
+  foreach my $thisComp( sort keys %{$referenceEnv}){
+    unless (defined $nominatedEnv->{$thisComp}) {
+      $self->{diffComps}{deleted}{$thisComp} = $referenceEnv->{$thisComp};
+    }
+  }
+}
+
+sub compareFiles {
+  my $self = shift;
+  my $comp = shift;
+  my $referenceVersion = shift;
+  my $nominatedVersion = shift;
+  my $diffFiles;
+  my $referenceComp = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $referenceVersion);
+  my $nominatedComp = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $nominatedVersion);
+  my $referenceManifest = File::Spec->catdir($referenceComp,MANIFEST_FILE);
+  my $nominatedManifest = File::Spec->catdir($nominatedComp,MANIFEST_FILE);
+  if (-e $referenceManifest and -e $nominatedManifest) {
+    $diffFiles =   $self->compareManifestFiles($referenceManifest,$nominatedManifest);
+  }
+  else {
+    $diffFiles =   $self->compareAllZipFiles($comp, $nominatedComp, $referenceComp);
+  }
+  #List meta files (reldata, manifest and exports.txt files).
+  foreach my $thisFile (@{Utils::ReadDir($nominatedComp)}) {
+    unless ($thisFile =~ /\.zip$/) {
+      $diffFiles->{$comp}{files}{$thisFile} = 1;
+    }
+  }
+  return $diffFiles;
+}
+
+sub compareAllZipFiles {
+  my $self = shift;
+  my $comp = shift;
+  my $nominatedComp = shift;
+  my $referenceComp = shift;
+  my $tempRefPath = File::Spec->catdir($self->{tempDir},"ref");
+  my $tempNomPath = File::Spec->catdir($self->{tempDir},"nom");
+  print "Manifest file is not available for $comp\n";
+  my $nominatedCompFiles = Utils::ReadDir($nominatedComp);
+  my $referenceCompFiles = Utils::ReadDir($referenceComp);
+  my $nominatedZipFiles ;
+  my $referenceZipFiles ;
+  my %diffFiles;
+  foreach  my $thisFile (@{$nominatedCompFiles}) {
+    $nominatedZipFiles->{$thisFile} = 1 if ($thisFile =~ /\.zip$/) ;
+  }
+  foreach  my $thisFile (@{$referenceCompFiles}) {
+    $referenceZipFiles->{$thisFile} = 1 if ($thisFile =~ /\.zip$/) ;
+  }
+  foreach  my $thisZip (keys %{$nominatedZipFiles}) {
+    next unless ( $self->isExportableCat($comp, $thisZip) );
+    if (defined $referenceZipFiles->{$thisZip}) {
+      #Modified zip file
+      my $refZipFile = File::Spec->catdir($referenceComp, $thisZip);
+      my $nomZipFile = File::Spec->catdir($nominatedComp, $thisZip);
+      print "Extracting $thisZip.\n" if($self->{verbose});
+      Utils::Unzip($refZipFile ,$tempNomPath,0,1); # 0 = verbose, 1 = overwrite.
+      Utils::Unzip($nomZipFile,$tempRefPath,0,1);
+      my @referenceFiles;
+      my @nominatedFiles;
+      Utils::ListAllFiles($tempRefPath, \@referenceFiles);
+      Utils::ListAllFiles($tempNomPath, \@nominatedFiles);
+      foreach my $thisnomFile (@nominatedFiles) {
+        my $file1 = $thisnomFile;
+        $thisnomFile = substr($thisnomFile, (length( $tempNomPath)+1));
+        my $file2 = File::Spec->catfile($tempRefPath,$thisnomFile);
+        if (-e $file2) {
+          unless ($self->compareFile($file1 ,$file2)) {
+            $diffFiles->{$comp}{zips}{$thisZip}{modified}{$thisnomFile} = 1; #modified file.
+            unlink($file1) or print "Warning: Couldn't delete $file1 : $!\n";
+            unlink($file2) or print "Warning: Couldn't delete $file2 : $!\n";
+          }
+        }
+        else {
+          $diffFiles{$comp}{zips}{$thisZip}{added}{$thisnomFile} = 1; #added file.
+          unlink($file1) or print "Warning: Couldn't delete $file1 : $!\n";
+        }
+      }
+      foreach my $thisFile (@referenceFiles) {
+        my $file1 = substr($thisFile, (length( $tempRefPath)+1));
+        $file1  = File::Spec->catfile($tempNomPath,$file1);
+        unless (-e $file1) {
+          $diffFiles{$comp}{zips}{$thisZip}{deleted}{$file1} = 1 ; #deleted file for zip file.
+          unlink($thisFile) or print "Warning: Couldn't delete $thisFile : $!\n";
+        }
+      }
+    }
+    else {
+      #Newly added zip file.
+      my $nomZipFile = File::Spec->catdir($nominatedComp, $thisZip);
+      print "Extracting $thisZip.\n" if($self->{verbose});
+      Utils::Unzip($nomZipFile,$tempNomPath,0,1); # 0 = verbose, 1 = overwrite.
+      my @nominatedCompFiles;
+      Utils::ListAllFiles($tempNomPath, \@nominatedCompFiles);
+      foreach my $thisFile (@nominatedCompFiles) {
+        my $file = substr($thisFile, (length( $tempNomPath)+1));
+        $diffFiles{$comp}{zips}{$thisZip}{added}{$thisFile} = 1;
+        unlink($thisFile) or print "Warning: Couldn't delete $thisFile : $!\n";
+      }
+    }
+  }
+  #check for deleted zip files.
+  foreach  my $thisZip (keys %{$referenceZipFiles}) {
+    unless (defined $nominatedZipFiles->{$thisZip}) {
+      my @referenceCompFiles;
+      my $refZipFile = File::Spec->catdir($referenceComp, $thisZip);
+      print "Extracting $thisZip.\n" if($self->{verbose});
+      Utils::Unzip($refZipFile ,$tempRefPath,0,1); # 0 =  verbose, 1 = overwrite.
+      Utils::ListAllFiles($tempRefPath, \@referenceCompFiles);
+      foreach my $thisFile (@referenceCompFiles) {
+        my $file = substr($thisFile , (length( $tempRefPath)+1));
+        $diffFiles{$comp}{zips}{$thisZip}{deleted}{$file} = 1;
+        unlink($thisFile) or print "Warning: Couldn't delete $thisFile : $!\n";
+      }
+    }
+  }
+  return \%diffFiles;
+}
+
+sub compareFile {
+  my $self = shift;
+  my $file1 = shift;
+  my $file2 = shift;
+  my $Checksum1;
+  my $Checksum2;
+  unless ($self->{noevalid}) {
+    my $type1;
+    my $type2;
+    ($Checksum1, $type1) = EvalidCompare::GenerateSignature($file1);
+    ($Checksum2, $type2) = EvalidCompare::GenerateSignature($file2);
+  }
+  else {
+    open(FILEHANDLE1,"$file1");
+    open(FILEHANDLE2,"$file2");
+    my $ctx1 = Digest::MD5->new;
+    my $ctx2 = Digest::MD5->new;
+    $ctx1->addfile(FILEHANDLE1);
+    $ctx2->addfile(FILEHANDLE2);
+    $Checksum1 = $ctx1->hexdigest;
+    $Checksum2 = $ctx2->hexdigest;
+    close FILEHANDLE1;
+    close FILEHANDLE2;
+  }
+  return 1 if ($Checksum1 eq $Checksum2);
+  return 0;
+}
+
+
+sub compareManifestFiles {
+  my $self = shift ;
+  my $referenceManifest = shift;
+  my $nominatedManifest = shift;
+  my %diffFiles;
+  my $referenceManifestObj = Symbian::CBR::Component::Manifest->new($referenceManifest);
+  my $nominatedManifestObj = Symbian::CBR::Component::Manifest->new($nominatedManifest);
+  my $comp = lc($referenceManifestObj->{componentName});
+  $nominatedManifestObj->Compare($referenceManifestObj,1,1); # 1 = validatesource, 1 = keepgoing
+  foreach my $zipName (keys %{$nominatedManifestObj->GetDiffZipFiles()}) {
+    foreach my $thisFile (keys %{$nominatedManifestObj->GetDiffFilesForZip($zipName)}) {
+      my $fileStatus = $nominatedManifestObj->GetFileStatus($zipName, $thisFile);
+      $diffFiles{$comp}{zips}{$zipName}{$fileStatus}{$thisFile} = 1;
+    }
+  }
+  return  \%diffFiles;
+}
+
+sub isExportableCat {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $exportPgp = [ ];
+  return 1 if($self->{exportAll});
+  if ($zipFile =~ /^source([a-z])\.zip$/i) {
+    $exportPgp  = $self->{exportData}->PgpKeysForSource($comp,$1);
+  }
+  elsif ($zipFile =~ /^exports([A-Z])\.zip$/i) {
+    $exportPgp  = $self->{exportData}->PgpKeysForExports($comp,$1);
+  }
+  elsif ($zipFile =~ /^binaries/i) {
+    $exportPgp  = $self->{exportData}->PgpKeysForBinaries($comp);
+  }
+  if (scalar @{$exportPgp} > 0) {
+    foreach  my $thisKey (@{$exportPgp}) {
+      return 1 if ($self->{pgpKey} eq $thisKey);
+    }
+  }
+  return 0;
+}
+
+sub createDeltaEnv {
+  my $self = shift;
+  my $referenceComp = shift;
+  my $referenceVersion = shift;
+  my $nominatedComp = shift;
+  my $nominatedVersion = shift;
+  my $destination = shift;
+  Utils::InitialiseTempDir($self->{iniData});
+  $self->{tempDir} = Utils::TempDir();
+  my $deltaDestination = File::Spec->catdir($self->{tempDir},"modified");
+  my $newCompPath = File::Spec->catdir($self->{tempDir}, "new");
+  $self->{exportData} = ExportData->New(exports_file => $self->{iniData}->ExportDataFile(),verbose => $self->{verbose}) unless ($self->{exportAll});
+  my $referenceRelData = RelData->Open($self->{iniData}, $referenceComp, $referenceVersion, $self->{verbose});
+  my $nominatedRelData = RelData->Open($self->{iniData}, $nominatedComp, $nominatedVersion, $self->{verbose});
+  my $referenceEnv = $referenceRelData->Environment();
+  my $nominatedEnv = $nominatedRelData->Environment();
+  unless ($self->{exportAll}) {
+    my $foundPgpKey = 0;
+    foreach my $thisPgpKeys (@{$self->{exportData}->AllPgpKeys()}) {
+      if ($thisPgpKeys eq $self->{pgpKey}) {
+        $foundPgpKey = 1;
+        last;
+      }
+    }
+    croak "Error: PGP key ".$self->{pgpKey}." is not defined in ".$self->{iniData}->ExportDataFile()." file.\n" unless($foundPgpKey);
+
+    foreach  my $thisComp (keys %{$nominatedEnv}) {
+      unless ($self->{exportData}->ComponentIsExportable($thisComp)) {
+        print "Warning: component \"$thisComp\" is not defined in export table.\n";
+      }
+    }
+  }
+
+  unless ($self->{noevalid} or eval { require EvalidCompare }) {
+    print "Warning: EvalidCompare is not installed. Setting --noevalid option. ($@)\n";
+    $self->{noevalid} = 1;
+  }
+
+  $self->{DeltaManifest} = Symbian::CBR::DeltaRelease::Manifest->new();
+
+  $self->{DeltaManifest}->SetReferenceBaselineComp($referenceComp);
+  $self->{DeltaManifest}->SetReferenceBaselineVer($referenceVersion);
+  $self->{DeltaManifest}->SetNominatedBaselineComp($nominatedComp);
+  $self->{DeltaManifest}->SetNominatedBaselineVer($nominatedVersion);
+ 
+  $self->compareEnvironments($referenceComp,$referenceVersion,$nominatedComp,$nominatedVersion);
+
+  foreach my $thisComp ( sort keys %{$self->{diffComps}{modified}} ) {
+    eval{ $self->createDeltaForComp($thisComp,$$referenceEnv{$thisComp},$$nominatedEnv{$thisComp}, $deltaDestination) };
+    print "Error: Unable to create Deltas for $thisComp,$$referenceEnv{$thisComp},$$nominatedEnv{$thisComp} $@\n" if($@);
+  }
+
+  foreach my $thisComp (sort keys %{$self->{diffComps}{added}}) {
+    $self->addComponent($thisComp, $newCompPath);
+  }
+
+  foreach my $thisComp (sort keys %{$self->{diffComps}{identical}}) {
+    $self->recordIdenticalOrDeletedComponent($thisComp, "identical");
+  }
+  foreach my $thisComp (sort keys %{$self->{diffComps}{deleted}}) {
+    $self->recordIdenticalOrDeletedComponent($thisComp, "deleted");
+  }
+  $self->{DeltaManifest}->Save($self->{tempDir}); # Write delta manifest file.
+
+  #Package modified, new directories and delta manifest file into zip files
+  my @filesToBeZipped ;
+  my @allFiles;
+  my $tempRefPath = File::Spec->catdir($self->{tempDir},"ref");
+  my $tempNomPath = File::Spec->catdir($self->{tempDir},"nom");
+  rmtree($tempRefPath) if($tempRefPath);
+  rmtree($tempNomPath) if($tempNomPath);
+  Utils::ListAllFiles($self->{tempDir}, \@allFiles);
+  foreach  my $thisFile (@allFiles) {
+    my $file = substr($thisFile, (length($self->{tempDir})+1));
+    push @filesToBeZipped, $file;
+  }
+  my $tempPackageZipFile = $referenceVersion."_".$nominatedVersion.".tmp";
+  $tempPackageZipFile = File::Spec->catfile($destination, $tempPackageZipFile );
+  my $packageZipFile = $referenceVersion."_".$nominatedVersion.".zip";
+  $packageZipFile = File::Spec->catfile($destination, $packageZipFile );
+  if (-e $packageZipFile) {
+    print "Overwriting $packageZipFile.\n";
+    unlink ($packageZipFile);
+  }
+  print "Packaging all files into $packageZipFile.\n";
+  Utils::ZipList( $tempPackageZipFile, \@filesToBeZipped, $self->{verbose}, 0,$self->{tempDir});
+  rename ($tempPackageZipFile, $packageZipFile) or croak "Error: Couldn't rename $tempPackageZipFile to $packageZipFile.\n ";
+  rmtree ($self->{tempDir});
+}
+
+sub recordIdenticalOrDeletedComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $compStatus = shift;
+  $self->{DeltaManifest}->SetComponentDetails($comp, $compStatus, $self->{diffComps}{$compStatus}{$comp}, undef); # undef for nominated version.
+  print "$comp is $compStatus.\n" if ($self->{verbose});
+}
+
+sub addComponent {
+  my $self = shift;
+  my $comp = shift;
+  my $newCompPath = shift;
+  print "$comp is newly added.\n";
+  $self->{DeltaManifest}->SetComponentDetails($comp, "added", undef, $self->{diffComps}{added}{$comp}); # undef for reference version.
+
+  $newCompPath = File::Spec->catdir($newCompPath,$comp);
+  mkpath($newCompPath) unless (-e $newCompPath);
+
+  my $archiveForComp = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $self->{diffComps}{added}{$comp});
+  my $archiveFiles = Utils::ReadDir($archiveForComp);
+
+  foreach my $thisFile (@{$archiveFiles}) {
+    my $archiveFilePath = File::Spec->catdir($archiveForComp,$thisFile);
+    my $destFilePath = File::Spec->catfile($newCompPath,$thisFile);
+    if ($thisFile =~ /\.zip$/) {
+      if ($self->isExportableCat($comp,$thisFile)) {
+        $self->{DeltaManifest}->SetZipfileDetails($comp, $thisFile, "added");
+        eval{ copy($archiveFilePath,$destFilePath) ;};
+		croak "Error: File $archiveFilePath cannot be copied to $destFilePath. $@" if($@);
+      }
+    }
+    else {
+     eval{ copy($archiveFilePath,$destFilePath) ;};
+	 croak "Error: File $archiveFilePath cannot be copied to $destFilePath. $@" if($@);
+      $self->{DeltaManifest}->RecordMetaFile($comp, $thisFile);
+    }
+  }
+}
+
+sub createDeltaForComp {
+  my $self = shift;
+  my $comp = shift;
+  my $referenceVersion = shift;
+  my $nominatedVersion = shift;
+  my $deltaDestination = shift;
+  print "Creating Delta for $comp component.\n";
+
+  my $referenceCompPath = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $referenceVersion);
+  my $nominatedCompPath = $self->{iniData}->PathData->LocalArchivePathForExistingOrNewComponent($comp, $nominatedVersion);
+
+  my $relDataManifestDestination = File::Spec->catdir($self->{tempDir},META_FILES);
+  $self->{DeltaManifest}->SetComponentDetails($comp, "modified", $referenceVersion, $nominatedVersion);
+  my $filesList = $self->compareFiles($comp,$referenceVersion,$nominatedVersion);
+  foreach my $zipFile (keys %{$filesList->{$comp}{zips}}) { #Iterate through all zip files.
+    if ($self->isExportableCat($comp,$zipFile)) {
+      if ($self->{deltaAllFiles} or $self->{releaseManifest}->FileExists($comp, $zipFile)) { #Check whether zip file is present at receiving site or.
+        $self->{DeltaManifest}->SetZipfileDetails($comp, $zipFile, "modified");
+        $self->createDeltaForZip($comp, $referenceCompPath, $nominatedCompPath, $zipFile, $deltaDestination, $filesList);
+      }
+      else {
+        $self->{DeltaManifest}->SetZipfileDetails($comp, $zipFile, "added"); #added zip file for the component.
+        my $newZipFilePath = File::Spec->catdir($deltaDestination, ADDED_ZIPS, $comp);
+        mkpath ($newZipFilePath) unless(-d $newZipFilePath);
+        my $addedZipFile = File::Spec->catfile($newZipFilePath, $zipFile);
+        my $archiveFile = File::Spec->catfile($nominatedCompPath,$zipFile);
+        copy($archiveFile,$addedZipFile) or print "Warning: Couldn't copy $zipFile\n";
+      }
+    }
+    else {
+      print "Warning: $zipFile is not exportable.\n" if ($self->{verbose});
+    }
+  }
+  foreach my $thisFile (@{Utils::ReadDir($referenceCompPath)}) {
+    if ($thisFile =~/\.zip$/ and $self->isExportableCat($comp,$thisFile)) {
+      unless (defined $filesList->{$comp}{zips}{$thisFile}) {
+        $self->{DeltaManifest}->SetZipfileDetails($comp, $thisFile, "identical");
+      }
+    } 
+  }
+
+  #Process reldata manifest and export.txt files.
+  foreach my $thisFile (keys %{$filesList->{$comp}{files}}) {
+    $self->{DeltaManifest}->RecordMetaFile($comp, $thisFile);
+    my $archiveFile = File::Spec->catfile($nominatedCompPath, $thisFile);
+    my $destinationFile = $comp."_".$thisFile;
+    mkpath($relDataManifestDestination) unless(-d $relDataManifestDestination);
+    $destinationFile = File::Spec->catfile($relDataManifestDestination, $destinationFile);
+    copy($archiveFile,$destinationFile) or print "Warning: Couldn't copy $thisFile\n";
+  }
+}
+
+sub createDeltaForZip {
+  my $self = shift;
+  my $comp = shift;
+  my $referenceCompPath = shift;
+  my $nominatedCompPath  = shift;
+  my $zipFile = shift;
+  my $deltaDestination = shift;
+  my $filesList = shift;
+
+  my $refZipFilePath = File::Spec->catfile($referenceCompPath, $zipFile);
+  my $nomZipFilePath = File::Spec->catfile($nominatedCompPath, $zipFile);
+  my $tempRefPath = File::Spec->catdir($self->{tempDir},"ref");
+  my $tempNomPath = File::Spec->catdir($self->{tempDir},"nom");
+  print "Creating delta for $zipFile\n" if($self->{verbose});
+
+  #Process all files of a zip file.
+  foreach my $file (keys %{$filesList->{$comp}{zips}{$zipFile}{'modified'}}) {
+    #create delta for a file if it is modified.
+    unless ($self->{nodelta}) {
+      #Extract and create delta for a file.
+      print "Extracting $file from nominated $zipFile.\n" if($self->{verbose});
+      eval{Utils::UnzipSingleFile($nomZipFilePath,$file,$tempNomPath,0,1, $comp)};  # 0 = verbose. 1 = overwrite.
+      croak "Error: Couldn't Extract File $file $@\n" if($@);
+      my $file2 = File::Spec->catfile($tempNomPath,$file);
+
+      my $outputDeltaPath = File::Spec->catdir($deltaDestination, dirname($file));
+
+      my $size = -s $file2;
+      if (!defined $self->{maxdelta} or $size <= $self->{maxdelta}) {
+        print "Extracting $file from reference $zipFile.\n" if($self->{verbose});
+        eval{Utils::UnzipSingleFile($refZipFilePath,$file,$tempRefPath,0,1, $comp)};
+        croak "Error: Couldn't Extract File $file $@\n" if($@);
+        my $file1 = File::Spec->catfile($tempRefPath,$file);
+
+        $self->{DeltaManifest}->SetFileDetails($comp, $zipFile, $file, "modified", "delta");
+
+        $self->generateFileDelta($file1,$file2,$outputDeltaPath);
+      } else {
+        # File is too big to delta
+        $self->{DeltaManifest}->SetFileDetails($comp, $zipFile, $file, "modified", "file");
+        print "Not creating a delta of $file due to it being $size bytes\n" if ($self->{verbose});
+        if (! -d $outputDeltaPath) {
+          mkpath($outputDeltaPath) or croak "Error: Couldn't create directory for large file $file2 in delta\n";
+        }
+        system("move /Y \"".$file2."\" \"".$outputDeltaPath."\"") and croak "Error: Couldn't move large file $file2 into delta\n";
+      }
+    } else {
+      #add file to output delta package.
+      $self->{DeltaManifest}->SetFileDetails($comp, $zipFile, $file, "modified", "file");
+      print "Extracting $file from $zipFile.\n" if($self->{verbose});
+      eval{Utils::UnzipSingleFile($nomZipFilePath,$file,$deltaDestination,0,1, $comp); # 0 = verbose. 1 = overwrite.
+      };
+      croak "Error: Couldn't Extract File $file $@\n" if($@);
+    }
+  }
+
+  foreach my $file (keys %{$filesList->{$comp}{zips}{$zipFile}{'added'}}) {
+    #Newly added file to component.
+    print "$file is newly added.\n" if ($self->{verbose});
+    $self->{DeltaManifest}->SetFileDetails($comp, $zipFile, $file, "added", "file"); 
+    print "Extracting $file from $zipFile\n" if($self->{verbose});
+    eval{Utils::UnzipSingleFile($nomZipFilePath,$file,$deltaDestination,0, 1, $comp)};
+    croak "Error: Couldn't Extract File $file:$@\n" if($@);
+  }
+
+  foreach my $file (keys %{$filesList->{$comp}{zips}{$zipFile}{'deleted'}}) {
+    #deleted file.
+    print "$file is deleted.\n" if ($self->{verbose});
+    $self->{DeltaManifest}->SetFileDetails($comp, $zipFile, $file, "deleted", "file"); 
+  }
+}
+
+sub generateFileDelta {
+  my $self = shift;
+  my $file1 = shift;
+  my $file2 = shift;
+  my $destination = shift;
+  my $deltaFile = shift;
+  mkpath($destination) unless (-e $destination);
+  $deltaFile =  basename($file2).".delta" unless(defined $deltaFile);
+  $deltaFile = File::Spec->catfile($destination,$deltaFile);
+
+  $file1  =~ s/^\\/\\\\/g; # Replace leading \ by \\.
+  $file2  =~ s/^\\/\\\\/g;
+
+  print "Creating delta for file ". basename($file1). "\n" if ($self->{verbose});
+  my $status = system "zdc \"$file1\" \"$file2\"  \"$deltaFile\"" ;
+  if( $status != 0 ) {
+    $status = system "zdc" ;
+    $! = $? >> 8;
+    if ($status != 0) {
+      $! = $? >> 8;
+      print "Error: The zdelta tool is not installed. Please install zdelta, or use the --nodelta option to skip delta creation.\n";
+      croak;
+    }
+    else {
+      print "Error: The zdelta tool is not installed properly. Please install zdelta once again, or use the --nodelta option to skip delta creation.\n";
+      croak;
+    }
+  }
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Symbian::CBR::CreateDelta.pm - Creates deltas for modified files from reference baseline to the nominated baseline.
+
+=head2 new
+
+Creates a CreateDelta object. Expects to be passed:
+
+=over 4
+
+=item *
+an C<IniData> reference
+
+=item *
+a C<Release manifest> reference
+
+=item *
+a verbosity level
+
+=item *
+a flag to indicate not to use evalid for comparision
+
+=item *
+a flag to skip delta creation
+
+=item *
+a maximum file size (in bytes) above which the tool won't create a delta of the file (assuming the flag to skip delta creating in all cases is not used).  
+
+=back
+
+=head2 compareEnvironments
+
+Expects to be passed a reference component name, a reference component version, a nominated component name and a nominated component version. Compares these environments to list identical, modified, added and deleted components.
+
+=head2 compareFiles
+
+Expects to be passed a full path for a reference version and a nominated version of a component. Lists modified, added and deleted files for the component between the two versions. If the manifest file is present for both versions, then it compares using manifest objects. Otherwise it extracts all zip files and compares each file, one at a time.
+
+=head2 compareFile
+
+Expects to be passed full paths for two versions of a file. Compares them using EvalidCompare if noevalid is not specified, otherwise uses Digest::MD5 for the file comparison. Returns 1 if checksum for both the files matches, otherwise 0.
+
+=head2 createDeltaEnv
+
+Expects to be passed a reference component name, a reference component version, a nominated component name, a nominated component version, and a destination. Creates the deltas for the modified files between two baselines, adds newly added files and components and packages these files into a zip file at the path provided as a destination. 
+
+=head2 createDeltaForComp
+
+Expects to be passed a component name, reference version of component, nominated version of a component, and path where deltas to be stored. Compares the modified, added and deleted files from reference version to nominated version and creates the deltas for modified files, then copies the newly added files.
+
+=head2 generateFileDelta 
+
+Expects to be passed a full path for two versions of a file, destination path where delta file should be stored, and optionally delta file name. Makes use of zdelta third party tool to create delta for a file.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/DeltaRelease/Manifest.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,380 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::Delta::Manifest.pm
+#
+
+package Symbian::CBR::DeltaRelease::Manifest;
+
+use strict;
+use XML::Simple;
+use Carp;
+use POSIX qw(strftime);
+use base qw (Exporter);
+
+#
+#Constants
+#
+
+use constant DELTA_MANIFEST_FILE      => 'delta_manifest_baseline.xml';
+use constant META_FILES               => 'metafiles';
+use constant ADDED_ZIPS               => 'addedZips';
+
+our @EXPORT_OK = qw(DELTA_MANIFEST_FILE META_FILES ADDED_ZIPS);
+
+
+
+#
+#Public.
+#
+
+sub new {
+  my $pkg = shift;
+  my $self = {};
+  bless $self, $pkg;
+  return $self;
+}
+
+sub Save {
+  my $self = shift;
+  my $destination = shift;
+  mkpath ($destination) unless (-e $destination);
+  my $manifestFile = File::Spec->catfile($destination,DELTA_MANIFEST_FILE);
+  print "Writing Delta manifest file.\n " ;
+  #Hash structure to be provided as input for XML::Simple->XMLout()
+  my $manifestHash = {
+    version => "1.0.0",
+    meta => { 'reference-baseline' => { 'value' => $self->{referenceBaseline} },
+              'reference-version' => { 'value' => $self->{referenceVersion} },
+              'nominated-baseline' => { 'value' => $self->{nominatedBaseline} },
+              'nominated-version' => { 'value' => $self->{nominatedVersion} },
+              'created-time' => { 'value' => strftime( '%Y-%m-%dT%H:%M:%S', localtime() ) } }
+  };
+  my $cgroups = {};
+  foreach my $thisComp (sort keys %{$self->{components}}) {
+    my $compStatus = $self->{components}{$thisComp}{'status'};
+    my $nomVer = $self->{components}{$thisComp}{'nominatedVersion'} if (defined $self->{components}{$thisComp}{'nominatedVersion'});
+    my $refVer = $self->{components}{$thisComp}{'referenceVersion'} if (defined $self->{components}{$thisComp}{'referenceVersion'});
+    my $zgroups = {};
+    my @zGroupArray = ();
+    foreach  my $thisZip (sort keys %{$self->{components}{$thisComp}{'zipFiles'}}) {
+      my $thisZipFileStatus = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{'status'};
+      if ( !defined $zgroups->{$thisZip} ) {
+        $zgroups->{$thisZip} = {file => []};
+        if ($thisZip =~ /^exports([A-Z])\.zip$/i) {
+          $zgroups->{$thisZip}{'ipr-category'} = $1;
+          $zgroups->{$thisZip}{'content-type'} = "exports";
+        }
+        elsif ($thisZip =~ /^source([A-Z])\.zip$/i) {
+          $zgroups->{$thisZip}{'ipr-category'} = $1;
+          $zgroups->{$thisZip}{'content-type'} = "source";
+        }
+        elsif ($thisZip =~ /^binaries\.zip$/i) {
+          $zgroups->{$thisZip}{'content-type'} = "binary";
+        }
+        elsif ($thisZip =~ /^binaries\_([_a-zA-Z0-9]+)\.zip$/i) {
+          $zgroups->{$thisZip}{'content-type'} = "binary";
+          $zgroups->{$thisZip}{'platform'} = $1;
+        }
+        $zgroups->{$thisZip}{status} = $thisZipFileStatus;
+        push @zGroupArray, $zgroups->{$thisZip};
+      }
+      foreach my $thisFile (keys %{$self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}}) {
+        my $file = { path => $thisFile };
+        $file->{status} = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}{$thisFile}{status};
+        $file->{type} = $self->{components}{$thisComp}{'zipFiles'}{$thisZip}{files}{$thisFile}{type};
+        push @{$zgroups->{$thisZip}{file}}, $file;
+      }
+    }
+    if ( !defined $cgroups->{$thisComp} ) {
+      $cgroups->{$thisComp} = { files => [] };
+      $cgroups->{$thisComp}{name} = $thisComp;
+      $cgroups->{$thisComp}{status} = $compStatus;
+      $cgroups->{$thisComp}{referenceVersion} = $refVer if(defined $refVer);
+      $cgroups->{$thisComp}{nominatedVersion} = $nomVer if(defined $nomVer);
+      push @{$manifestHash->{component}}, $cgroups->{$thisComp};
+    }
+    foreach my $zgroup (@zGroupArray) {
+      push @{$cgroups->{$thisComp}{files}}, $zgroup;
+    }
+    foreach my $thisFile (sort keys %{$self->{components}{$thisComp}{metafiles}}) {
+      my $file = { path => $thisFile };
+      push @{$cgroups->{$thisComp}{metafiles}{file}}, $file;
+    }
+  }
+  #Use the hash structure for calling the XMLout() to write the manifest file
+  eval {XMLout(
+        $manifestHash,
+        xmldecl     => '<?xml version="1.0" ?>',
+        rootname    => 'manifest',
+        outputfile  => $manifestFile )};
+  croak "Error: Can't write manifest file: $@\n" if $@;
+}
+
+sub LoadManifest {
+  my $self = shift;
+  my $manifestFile = shift;
+  print "Reading $manifestFile file.\n";
+
+  my $manifest    = eval{XMLin(
+                    $manifestFile,
+                    forcearray => [ qw(component files file metafiles) ], keyattr => [])
+                    };
+
+  croak "Error: Can't read manifest file '$manifestFile': $@\n" if $@;
+
+  # Mapping from xml keyword to our internal data structure keyword
+  my %metaFieldMap = ('nominated-baseline' => 'nominatedBaseline',
+                      'nominated-version'  => 'nominatedVersion',
+                      'reference-baseline' => 'referenceBaseline',
+                      'reference-version'  => 'referenceVersion',
+                      'created-time'       => 'createdTime');
+
+  foreach my $metaInformation (@{$manifest->{meta}}) {
+    $self->{$metaFieldMap{$metaInformation->{name}}} = $metaInformation->{value};
+  }
+  
+  foreach my $component ( @{$manifest->{component} } ) {  
+    $self->{components}->{$component->{name}} = {
+                referenceVersion => $component->{referenceVersion},
+                nominatedVersion => $component->{nominatedVersion},
+                status => $component->{status}}; 
+
+    foreach my $zipfile ( @{ $component->{files} } ) {
+      my $content = $zipfile->{'content-type'};
+      my $category;
+      my $platform;
+      my $zipFileName ;
+      if ($content eq "source" or $content eq "exports") {
+        $category = $zipfile->{'ipr-category'};
+        $zipFileName = $content.$category.".zip";
+      }
+      else {
+        $platform = $zipfile->{platform};
+        if (defined $platform) {
+          $zipFileName = "binaries_".$platform.".zip";
+        }
+        else {
+          $zipFileName = "binaries.zip";
+        }
+      }
+      
+      $self->{components}->{$component->{name}}->{zipFiles}->{$zipFileName}->{status} = $zipfile->{status};
+     
+      foreach my $file (@{$zipfile->{file}}) {      
+        $self->{components}->{$component->{name}}->{zipFiles}->{$zipFileName}->{files}->{$file->{path}} = {
+                                                                                          status => $file->{status},
+                                                                                          type => $file->{type}};
+      }
+    }
+    foreach my $metafiles ( @{ $component->{metafiles} } ) {
+      foreach my $file (@{$metafiles->{file}}) {
+        my $name = $file->{path};
+        $self->{components}->{$component->{name}}->{metafiles}->{$name} = 1;
+      }
+    }
+  }
+}
+
+sub SetReferenceBaselineComp {
+  my $self = shift;
+  my $comp = shift;
+  $self->{referenceBaseline} = $comp;
+}
+
+sub SetReferenceBaselineVer {
+  my $self = shift;
+  my $version = shift;
+  $self->{referenceVersion} = $version;
+}
+
+sub SetNominatedBaselineComp {
+  my $self = shift;
+  my $comp = shift;
+  $self->{nominatedBaseline} = $comp;
+}
+
+sub SetNominatedBaselineVer {
+  my $self = shift;
+  my $version = shift;
+  $self->{nominatedVersion} = $version;
+}
+
+sub SetComponentDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $status = shift;
+  my $refVersion = shift;
+  my $nomVersion = shift;
+  $self->{components}{$comp}{'status'} = $status;
+  $self->{components}{$comp}{'referenceVersion'} = $refVersion if(defined $refVersion);
+  $self->{components}{$comp}{'nominatedVersion'} = $nomVersion if(defined $nomVersion);
+}
+
+sub SetZipfileDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $status = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{'status'} = $status;
+}
+
+sub SetFileDetails {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file = shift;
+  my $status = shift;
+  my $type = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{status} = $status;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{type} = $type;
+}
+
+sub RecordMetaFile {
+  my $self = shift;
+  my $comp = shift;
+  my $file = shift;
+  $self->{components}{$comp}{metafiles}{$file} = 1;
+}
+
+sub GetReferenceBaselineComp {
+  my $self = shift;
+  return $self->{referenceBaseline} ;
+}
+
+sub GetReferenceBaselineVer {
+  my $self = shift;
+  return $self->{referenceVersion};
+}
+
+sub GetNominatedBaselineComp {
+  my $self = shift;
+  return $self->{nominatedBaseline};
+}
+
+sub GetNominatedBaselineVer {
+  my $self = shift;
+  return $self->{nominatedVersion};
+}
+
+sub ListAllComponents {
+  my $self = shift;
+  return $self->{components};
+}
+
+sub GetCompStatus {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'status'};
+}
+
+sub GetCompReferenceVer {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'referenceVersion'};
+}
+
+sub GetCompNominatedVer {
+  my $self = shift;
+  my $comp = shift;
+  return $self->{components}{$comp}{'nominatedVersion'};
+}
+
+
+sub GetZipFilesForComp {
+  my $self = shift;
+  my $comp = shift;
+  return ($self->{components}{$comp}{zipFiles} || {});
+}
+
+sub GetZipStatus {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  return $self->{components}{$comp}{zipFiles}{$zipFile}{'status'};
+}
+
+sub GetFilesForZip {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  return ($self->{components}{$comp}{zipFiles}{$zipFile}{files} || {});
+}
+
+sub GetFileStatus {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file  = shift;
+  $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{status};
+}
+
+sub GetFileType {
+  my $self = shift;
+  my $comp = shift;
+  my $zipFile = shift;
+  my $file  = shift;
+  return $self->{components}{$comp}{zipFiles}{$zipFile}{files}{$file}{type};
+}
+
+sub GetMetaFiles {
+  my $self = shift;
+  my $comp = shift;
+  return ($self->{components}{$comp}{metafiles} || {});
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Symbian::CBR::DeltaRelease::Manifest.pm - Provides an interface to data associated with a deltas created from reference version to the nominated version.
+
+=head2 new
+
+Creates a new Symbian::CBR::Delta::Manifest object.
+
+=head2 Save
+
+Expects to be passed a destination path. Creates destination path if destination path is not existing, and save the hash structure to xml file.
+
+=head2 LoadManifest
+
+Expects to be passed a manifest file name. Reads delta manifest file and converts into a hash structure.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/IPR/DISTRIBUTION.policy	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/IPR/MRP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,443 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::IPR::MRP
+#
+
+package Symbian::CBR::IPR::MRP;
+
+use strict;
+use Carp;
+use File::Spec;
+use File::Basename;
+use Cwd;
+use Symbian::CBR::MRP::Reader;
+
+use base qw(Class::Singleton);
+
+use constant SRCROOT => ($ENV{SRCROOT} || '\\');
+
+BEGIN {
+    # The location of the CBR Tools may not be known to Perl, so we do a seach 
+    # to see if they are available...
+    if (!eval {require IniData}) {
+        if (-e File::Spec->catdir(File::Basename::dirname("$0"), 'IniData.pm')) {
+            push @INC, File::Spec->catdir(File::Basename::dirname("$0"));
+        } 
+        else {
+            for my $path (split(/;/,$ENV{PATH})) {
+                if (-e $path."\\IniData\.pm") {
+                    push @INC, $path;
+                    last;
+                }
+            }
+        }
+    } 
+}
+
+
+sub _new_instance {
+    my $pkg = shift;
+    my $typeOfMrp = shift;
+    my $verbose = shift;
+
+    if (!$typeOfMrp || shift) {
+        # caller(0))[3] gives the package and the method called, e.g. Symbian::CBR::IPR::MRP::_new_instance
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    my $self = {};
+    bless $self, $pkg;
+       
+    $self->{typeOfMrp} = $typeOfMrp;
+    $self->{verbose} = $verbose;
+    
+    return $self;
+}
+
+sub PrepareInformationForComponent {
+    my $self = shift;
+    my $component = shift;
+    
+    my @mrpLocation;
+    
+    #if it's a comp name then look it up/read it 
+    if (@mrpLocation = $self->GetMRPLocations($component)) {
+        $self->ReadMRPFiles(\@mrpLocation);
+    }
+    else {
+        # If we can't get any MRP locations then we can't use MRP files for IPR information
+        return undef;
+    }
+}
+
+sub PrepareInformationForMrpFile {
+    my $self = shift;
+    my @mrps = shift;
+    
+    #can take a single or a list
+    
+    $self->ReadMRPFiles(\@mrps);
+}
+
+sub Populate {
+    my $self = shift;
+
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+    
+    if (exists $self->{populated}) {
+        # We only need to populate the tree once
+        return 1;
+    }
+    else {
+        # Set a flag and continue
+        $self->{populated} = 1;
+    }
+    
+    my @mrpFiles;
+    
+    if (@mrpFiles = $self->GetMRPLocations()) {
+        $self->ReadMRPFiles(\@mrpFiles);
+        
+        if (!(keys %{$self->{iprTree}})) {
+            # If we can't get any IPR information from MRP files then we can't use MPR files for IPR information
+            return undef;
+        }        
+    }
+    else {
+        # If we can't get any MRP locations then we can't use MRP files for IPR information
+        return undef;   
+    }
+}
+
+
+sub GetMRPLocations {
+    my $self = shift;
+    my $component = shift;
+
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+
+    my @mrpFiles; 
+   
+    # Try to get MRP locations from environment database.
+    if ($self->InvokeCBRTools()) {      
+        @mrpFiles = $self->{envDB}->GetMRPLocations($component);
+        
+        if (scalar @mrpFiles) {
+            # envDb may return \
+            @mrpFiles = grep /\.mrp$/, @mrpFiles;
+        }
+
+        if (!scalar @mrpFiles) {
+            return ();
+        }
+    
+        return (@mrpFiles);
+    }
+    else {
+        return ();
+    }
+}
+
+
+sub InvokeCBRTools {
+    my $self = shift;
+    
+    # If we have already tried to use the CBR Tools but have been unable to then return undef
+    if ($self->{noCbrTools}) {
+        return undef;
+    }
+    
+    # If we have successfully created a CBR Tools EnvDB object then return true
+    if (exists $self->{envDB}) {
+        return 1;
+    }
+    
+    # Otherwise we try to create a CBR Tools EnvDB object...
+    my $iniData;
+    my @errors;
+    
+    if (eval {require IniData} && eval {require EnvDb}) {
+        eval {$iniData = IniData->New()};
+ 
+         push @errors, $@ if ($@);
+
+        if ($iniData) {
+            eval {$self->{envDB} = EnvDb->Open($iniData)};
+
+            push @errors, $@ if ($@);
+        } 
+    }
+    
+    if ($iniData && $self->{envDB} && !scalar(@errors)) {
+        return 1;        
+    }
+    else {
+        # If not successful then we produce a warning and return undef
+        carp "Warning: Unable to use the CBR Tools for obtaining MRP locations\n";
+        carp "The following errors were returned: @errors\n" if (scalar(@errors) > 0);
+
+        $self->{noCbrTools} = 1;
+        return undef;   
+    }
+}
+
+
+sub ReadMRPFiles {
+    my $self = shift;
+    my $mrpFiles = shift;
+
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (shift);
+        
+    # Construct a reader object, specifying the type of MRP object to populate
+    if (!exists $self->{reader}) {
+        print "Obtaining IPR information from MRP files...\n" if ($self->{verbose});
+        $self->{reader} = Symbian::CBR::MRP::Reader->instance();
+        $self->{reader}->SetVerbose() if ($self->{verbose});
+    }
+    
+    my @dependencies;
+    
+    foreach my $mrpFile (@$mrpFiles) {
+        # It is possible that the file doesn't exist, e.g. only binaries may be installed
+        next if (!-e $mrpFile);
+        
+        # Skip this file if it has already been processed
+        next if (exists $self->{processedMrpFiles}->{lc($mrpFile)}); 
+        
+        # Keep a record of the MRP files that we have processed...
+        $self->{processedMrpFiles}->{lc($mrpFile)} = 1;
+        
+        eval {
+            # Parse the MRP file.  The reader returns an MRP object
+            my $mrpObj = $self->{reader}->ReadFile($mrpFile, $self->{typeOfMrp});
+            
+            # Get the IPR information from the MRP object
+            my $iprInformation = $mrpObj->GetIPRInformation();
+            
+            # Add it to the IPR lookup tree
+            $self->AddToTree($iprInformation);
+    
+            if (scalar($mrpObj->GetExportComponentDependencies())) {
+                @dependencies = $mrpObj->GetExportComponentDependencies();
+            }
+        };
+
+        if ($@) {
+          print $@;
+        }
+    }
+      
+    # if any left over then call PrepareInformationForComponent
+    foreach my $dependancy (@dependencies) {
+        if (my @mrpLocations = $self->GetMRPLocations($dependancy)) {
+            $self->ReadMRPFiles(\@mrpLocations);
+        }
+        else {
+            carp "Warning: Unable to locate MRP file for dependant component \"$dependancy\"\n";
+        }
+    }
+}
+
+
+sub AddToTree {
+    my $self = shift;
+    my $iprInformation = shift;
+
+    if (!$iprInformation || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    foreach my $path (keys %{$iprInformation}) {
+        my $lcPath = lc($path);
+    
+        # each folder is a branch on the tree
+        $lcPath =~ s/^[\\\/]//;
+        my @folders = split /[\\\/]/, $lcPath;
+    
+        # used to track position in tree
+        my $branch = \%{$self->{iprTree}};
+    
+        foreach my $folder (@folders) {
+            if (!exists $branch->{$folder}) {
+                $branch->{$folder} = {};
+            }
+	    
+            # ignore the special folder '.'
+            unless ($folder eq '.') {
+                $branch = $branch->{$folder};
+            }
+        }
+	
+        if (exists $branch->{'_category'}) {
+            if ($branch->{'_category'} ne $iprInformation->{$path}->{'category'} || $branch->{'_exportRestricted'} ne $iprInformation->{$path}->{'exportRestricted'}) {
+                # If IPR information has already been set and differs then we should set the data as null
+                # so that distribution policy files will be used instead.
+                $branch->{'_category'} = '';
+                $branch->{'_exportRestricted'} = '';
+                carp "Warning: IPR information for \"$path\" defined more than once in MRP files and differs and so will be ignored\n";
+            }
+        }
+        else {
+            $branch->{'_category'} = $iprInformation->{$path}->{'category'};
+            $branch->{'_exportRestricted'} = $iprInformation->{$path}->{'exportRestricted'};
+        }
+    }
+}
+
+
+sub Category {
+    my $self = shift;
+    my $path = shift;
+
+    if (!$path || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    return $self->GetIPRinfo($path)->{'category'};
+}
+
+
+sub ExportRestricted {
+    my $self = shift;
+    my $path = shift;
+    
+    if (!$path || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    return $self->GetIPRinfo($path)->{'exportRestricted'};
+}
+
+
+sub GetIPRinfo {
+    my $self = shift;
+    my $path = lc(shift); # We need to lowercase the path
+
+    if (!$path || shift) { 
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    if (!exists $self->{iprTree}) {
+        # If no information exists in the tree then try to populate all the information from the EnvDB database
+        $self->Populate();
+    }
+    
+    # Turn paths into abs from rel, some tools may pass relative paths (e.g. ExportIPR.pl)
+    $path = File::Spec->rel2abs($path);
+
+    # We need to remove drive letters
+    $path =~ s/^[a-z]://i;
+
+    my $results = {
+                'category' => undef, # As the distribution policy modules return X if no category is found
+                'exportRestricted' => undef};
+
+    $path =~ s/^[\\\/]//; # Remove the first slash otherwise splitting the path on slashes will create an empty array entry
+    my @folders = split /[\\\/]/, $path;
+
+    my $branch = $self->{iprTree};
+
+    # find the path in the tree
+    foreach my $folder (@folders) {
+        if (exists $branch->{$folder}) {
+            $branch = $branch->{$folder};
+            
+            if (exists $branch->{'_category'}) {
+                $results = {
+                    'category' => $branch->{'_category'},
+                    'exportRestricted' => $branch->{'_exportRestricted'}};
+            }
+        }
+        else {
+            last;
+        }
+    }
+
+    return $results;
+}
+
+1;
+
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Symbian::CBR::IPR::MRP - An interface to IPR information contained within MRP files
+
+=head1 SYNOPSIS
+
+ use Symbian::CBR::IPR::MRP;
+
+ # Instantiate a Symbian::CBR::IPR::MRP object
+ my $iprMrp = Symbian::CBR::IPR::MRP->instance();
+
+ # Get the IPR category for a path
+ my $category = $iprMrp->Category('\aPath\somewhere');
+
+ # Get the export restricted flag for a path
+ my $exportRestricted = $iprMrp->ExportRestricted('\aPath\somewhere');
+
+=head1 DESCRIPTION
+
+This package collates IPR information for either an entire environment, or for a
+component, and provides methods to access IPR information for a given path.
+
+=head1 METHODS
+
+=head2 instance(component, typeOfMrp, verbose)
+
+Instantiates a Symbian::CBR::IPR::MRP object.
+
+The typeOfMrp argument is non-optional.  Valid types are MRP and MRPDATA.  See the
+documentation for Symbian::CBR::MRP::Reader for more information.
+
+If a component had been specified then the MRP file for the component will be processed
+and the IPR information obtained.  Any MRP files for dependant components will be located
+and processed too.  If no component name has been specified all MRP files in the environment
+will be processed.
+
+=head2 Category(path)
+
+Returns the IPR category of the path.  If no IPR information exists for the
+specified path then undef will be returned.
+
+=head2 ExportRestricted(path)
+
+Returns true if the specified path is export restricted, and false if it is not.
+If no IPR information exists for the specified path then false will be returned.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/MRP.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,496 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::MRP
+#
+
+package Symbian::CBR::MRP;
+
+use strict;
+use Carp;
+use File::Spec;
+use base qw(Symbian::CBR::MRPInterface);
+
+
+sub new {
+    my $pkg = shift;
+    my $mrpName = shift;
+    my $verbose = shift;
+
+    if (!$mrpName || shift) {
+        # caller(0))[3] gives the package and the method called, e.g. Symbian::CBR::MRP::new
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    my $self = {
+            'mrpName' => $mrpName,
+            'verbose' => $verbose};
+
+    bless $self, $pkg;
+
+    return $self;
+}
+
+sub SetIPR {
+    my $self = shift;
+    my $category = shift;
+    my $path = lc(shift) || 'default';
+    my $exportRestricted = (shift) ? 1 : 0;
+    
+    if (!$category || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";        
+    }
+    
+    if ($category !~ /^[a-z]$/i) {
+        #Check that the IPR category specified is indeed a valid category
+        croak "Error: IPR category $category is invalid\n";
+    }
+
+    $path = File::Spec->canonpath($path); # Normalise the path
+    
+    # remove trailing slashes
+    $path =~ s/[\\\/]$//;
+    
+    if (exists $self->{unresolvedIPR}->{$path}) {
+        return 0;
+    }
+    
+    $self->{unresolvedIPR}->{$path} = {
+                    category => uc($category),
+                    exportRestricted => $exportRestricted};
+    
+    return 1;
+}
+
+sub SetComponent {
+    my $self = shift;
+    my $operand = shift;
+
+    if (!$operand || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    if (exists $self->{componentName}) {
+        return 0;
+    }
+    
+    $self->{componentName} = $operand;
+    
+    return 1;
+}
+
+sub SetNotesSource {
+    my $self = shift;
+    my $operand = shift;
+
+    if (!$operand || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    if (exists $self->{notesSource}) {
+        return 0;
+    }
+
+    $operand = File::Spec->canonpath($operand); # Normalise the path
+    
+    if (!-f $operand) {
+       croak "Error: Notes source \"$operand\" does not exist\n";
+    }
+
+    $self->{notesSource} = $operand;
+    
+    return 1;
+}
+
+sub SetSource {
+    my $self = shift;
+    my $operand = shift;
+
+    if (!$operand || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    $operand = File::Spec->canonpath($operand); # Normalise the path
+    
+    #remove trailing slashes
+    $operand =~ s/[\\\/]$//;
+    
+    if (!-e $operand) {
+       croak "Error: Source \"$operand\" does not exist\n";
+    }
+    
+    if (exists $self->{sourceItems}->{$operand}) {
+        return 0;
+    }
+    
+    $self->{sourceItems}->{$operand} = 1;
+    
+    return 1;
+}
+
+sub SetBinary {
+    my $self = shift;
+    my @operand = @{shift()} if (ref $_[0] eq 'ARRAY');
+    my $test = (shift) ? 1 : 0;
+    my $remove = (shift) ? 1 : 0;
+
+    if (!scalar(@operand) || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    my $path = shift @operand;
+
+    $path = File::Spec->canonpath($path); # Normalise the path
+
+    push @{$self->{binary}}, {
+                        path    => $path,
+                        test    => $test,
+                        remove  => $remove,
+                        words   => [@operand]};
+}
+
+sub SetExports {
+    my $self = shift;
+    my $operand = shift;
+    my $test = (shift) ? 1 : 0;
+    my $dependantComponent = shift;
+
+    if (!$operand || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    if (exists $self->{exports}->{$operand}) {
+        croak "Error: 'exports' entry for \"$operand\" defined more than once in $self->{mrpName}\n";
+    }
+
+    $operand = File::Spec->canonpath($operand); # Normalise the path
+
+    if (!-e $operand) {
+        croak "Error: Exports path \"$operand\" does not exist\n";
+    }
+
+    $self->{exports}->{$operand} = $test;
+    
+    if ($dependantComponent) {
+        push (@{$self->{exports}->{_dependantComponent}}, $dependantComponent);
+    }
+}
+
+sub SetExportFile {
+    my $self = shift;
+    my $source = shift;
+    my $destination = shift;
+    my $remove = (shift) ? 1 : 0;
+    my $dependantComponent = shift;
+
+    if (!$source || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    unless ($source and $destination) {
+        croak "Error: Incorrect syntax to 'export_file' keyword in \"$self->{mrpName}\"\n";
+    }
+
+    $source = File::Spec->canonpath($source); # Normalise the path
+    $destination = File::Spec->canonpath($destination);
+    
+    if (!$remove) {
+        if (!-e $source) {
+            croak "Error: Export file \"$source\" does not exist\n";
+        }
+    }
+
+    push @{$self->{exportFiles}}, {
+                    source      => $source,                  
+                    destination => $destination,
+                    remove      => $remove};
+
+    if ($dependantComponent) {
+        push (@{$self->{exports}->{_dependantComponent}}, $dependantComponent);
+    }
+}
+
+sub GetIPRInformation {
+    my $self = shift;
+    
+    if (exists $self->{IPR}) {
+        return $self->{IPR};
+    }
+    else {
+        return {};
+    }
+}
+
+sub Component {
+    my $self = shift;
+    
+    if ($self->{componentName}) {
+        return $self->{componentName};
+    }
+    
+    return undef;
+}
+
+sub GetExportComponentDependencies {
+    my $self = shift;
+
+    if (exists $self->{exports}->{_dependantComponent}) {
+        return @{$self->{exports}->{_dependantComponent}}
+    }
+
+    return undef;
+}
+
+sub GetSource {
+    my $self = shift;
+    
+    if (exists $self->{sourceItems}) {
+        return [keys %{$self->{sourceItems}}];
+    }
+    
+    return [];
+}
+
+sub ValidateParsing {
+    my $self = shift;
+
+    # This flag stops the reader from trying to populate the object more than once
+    $self->{populated} = 1;
+
+    if (exists $self->{sourceItems} && !exists $self->{unresolvedIPR}) {
+        # If no IPR information exists in the MRP file then we set the IPR category
+        # for each source item to undef.  This is so that incorrect IPR information is
+        # not returned.
+        
+        foreach my $sourceItem (keys %{$self->{sourceItems}}) {
+            $self->{IPR}->{$sourceItem} = {
+                                           category => undef,
+                                           exportRestricted => undef,
+                                           };
+        }
+    }
+    else {
+        # Reconcile the IPR information here so that any warnings are produced sooner...
+        # IPR information can only be included if it matches a source line in the MRP file
+        # All other IPR lines will be ignored.  The reconciliation is done here as IPR
+        # lines may appear before source lines in the MRP file.
+
+        if (!defined $self->{sourceItems} && exists $self->{unresolvedIPR}->{default}) {
+            carp "Warning: The default IPR entry does not apply to any source statements in \"$self->{mrpName}\"\n";
+        }
+
+        # Match IPR against source statement by using the length...
+        foreach my $sourceItem (keys %{$self->{sourceItems}}) {    
+            # The sort below sorts by longest line first, not shortest line first. Note $b <=> $a, not $a <=> $b...
+            # This allows us to match the most relevant line first, based on longest length/best match 
+            foreach my $iprItem (sort {length($b) <=> length($a)} keys %{$self->{unresolvedIPR}}) {
+                next if ($iprItem eq 'default');
+                # If the source item contains the IPR path then it is a match 
+                if ($sourceItem =~ m/^\Q$iprItem\E([\\\/]|$)/i) {
+                    $self->{IPR}->{$sourceItem} = $self->{unresolvedIPR}->{$iprItem};
+                    
+                    last;   
+                }
+            }
+                 
+            # If it didn't match an IPR then we assign the default
+            if (!exists $self->{IPR}->{$sourceItem}) {
+                $self->{IPR}->{$sourceItem} = $self->{unresolvedIPR}->{default};
+            }
+        }
+    
+        delete $self->{unresolvedIPR}->{default};
+    
+        # Find IPR entries which do live under a source folder...
+        foreach my $iprItem (keys %{$self->{unresolvedIPR}}) {
+            next if (exists $self->{IPR}->{$iprItem});
+            
+            foreach my $sourceItem (keys %{$self->{sourceItems}}) {
+                if ($iprItem =~ /^\Q$sourceItem\E/i) {
+                    $self->{IPR}->{$iprItem} = $self->{unresolvedIPR}->{$iprItem};
+                    last;
+                }
+            }
+         
+            if (!grep /\Q$iprItem\E/i, (keys %{$self->{IPR}})) {
+                # Otherwise this IPR statement does not apply to this MRP file...
+                carp "Warning: The IPR entry for \"$iprItem\" does not apply to any source statements in \"$self->{mrpName}\"\n";
+            }     
+        }
+        
+        delete $self->{unresolvedIPR};
+    }
+}
+
+sub Populated {
+  my $self = shift;
+  
+  return $self->{populated};
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Symbian::CBR::MRP - An object representation of an MRP file
+
+=head1 SYNOPSIS
+
+ use Symbian::CBR::MRP;
+
+ # Construct a Symbian::CBR::MRP object 
+ my $mrpObject = Symbian::CBR::MRP->new(mrpName);
+
+ # Use the setters to populate the object
+ 
+ $mrpObject->SetComponent('componentName');
+ 
+ $mrpObject->SetSource('\src\aSrcFolder');
+ 
+ $mrpObject->SetNotesSource('\componentDefs\notes.src');
+ 
+ # Validate the parsing\perform any post parsing operations
+ $mrpObject->ValidateParsing();
+ 
+ ...
+ 
+ # Getting information from the Symbian::CBR::MRP object
+ my $iprInformation = $mrpObject->GetIPRInformation();
+ 
+ # Get the component name
+ my $componentName = $mrpObject->GetComponent();
+
+=head1 DESCRIPTION
+
+This object represents an MRP file.  It is intended to be created and populated
+by an MRP file parser, for example Symbian::CBR::MRP::Reader.  No parsing
+functionality is included with this object.
+
+Once the object has been populated the parser should call the ValidateParsing()
+method, which will perform any post-population actions, such as resolving IPR
+information etc.
+
+=head1 METHODS
+
+=head2 new(mrpName, verbose)
+
+Instantiates a Symbian::CBR::MRP object.  The mrpName argument is only used for
+printing error and warning messages.
+
+=head2 GetIPRInformation()
+
+Returns a hash containing the IPR information for the component.
+
+The format is the returned data is a hash:
+
+    Path = (
+                    category = char,
+                    exportRestricted = boolean
+            )
+
+=head2 SetBinary(@arguments, test, remove)
+
+Sets the binary information.  @arguments is an array containing the arguments
+from the MRP line, in the order in which they appeared.  
+
+=head2 SetComponent(componentName)
+
+Sets the name of the component to componentName.
+
+=head2 SetExportFile(source, destination, remove, dependantComponent)
+
+Sets the export file information.  The source and destination arguments are both
+required, if they are not specified a fatal error will be produced.  The source
+file will also be checked to see if it exists and that it has not already been
+specified as an export file.
+
+If the export file is not included as source for the current MRP component then
+the dependant component will also need to be specified.
+
+=head2 SetExports(path, test, dependantComponent)
+
+Sets the location of the bld.inf from where the export information can be derived.
+The location will be checked to see if it exists and that it has not already been
+specified.
+
+If the exports are not included as source for the current MRP component then
+the dependant component will also need to be specified.
+
+=head2 SetIPR(category, path, exportRestricted)
+
+Sets the IPR information for the component.  If no path is specified then the
+IPR category is set to be the default category for the component.  The
+exportRestricted argument is boolean.
+
+If the same path is specified more than once a fatal error will be produced.
+
+=head2 SetNotesSource(noteSourcePath)
+
+Sets the notes source to the notesSourcePath specified.  If the notes source has
+already been set, or the path does not exist, a fatal error will be produced.
+
+=head2 SetSource(sourcePath)
+
+Adds the sourcePath to the list of included source entries for the component.
+If the source path does not exist or the path has already been added then a
+fatal error will be produced.
+
+=head2 ValidateParsing()
+
+This method needs to be called once the parser has finished setting all the
+information.  Currently this method reconciles IPR statements against the
+components source, and also checks that required dependant components have
+been set.
+
+If this method is not run then IPR information will be unavailable.
+
+=head2 GetExportComponentDependencies()
+
+Returns an array containing the any components which the current component has
+dependencies on.
+
+=head2 Component()
+
+Returns the component name.
+
+=head2 Populated()
+
+The MRP file is parsed by a reader, which then populates this MRP object.  The
+Populated method returns a boolean value indicating if the object has been
+populated.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/MRP/DISTRIBUTION.policy	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/MRP/Reader.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,288 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::MRP::Reader
+#
+
+package Symbian::CBR::MRP::Reader;
+
+use strict;
+use Carp;
+use Symbian::CBR::MRP;
+
+use base qw(Class::Singleton);
+
+sub _new_instance {
+    my $pkg = shift;
+    my $self = {};
+    
+    # caller(0))[3] gives the package and the method called, e.g. Symbian::CBR::MRP::Reader::_new_instance
+    croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n" if (scalar(@_));
+    
+    bless $self, $pkg;
+}
+
+sub ReadFile {
+    my $self = shift;    
+    my $file = shift;
+    my $type = shift;
+    
+    if (!$file || !$type || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }    
+    
+    my $mrpObject;
+    
+    # First we create the type of object required...
+    if ($type eq 'MRP') {
+        $mrpObject = Symbian::CBR::MRP->new($file);
+    }
+    elsif ($type eq 'MRPDATA') {
+        if (!eval "require MrpData") {
+            croak "Error: MrpData module is not available\n";
+        }
+        
+        # PDDEF128617 fix
+        # The envDb uses the path to the mrp file as a key with SRCROOT removed
+        # An earlier MrpData->New was provided data from the envDb to create an MrpData Object
+        # (so the key was mrp location with SRCROOT removed)
+        # The below MrpData->New is given the full filename (because this function has to read the file)
+        # This is wrong, the key for MrpData->New is not the full path
+        # So the below line removes the SRCROOT from the key before providing it to MrpData->New
+        my $localMrpName = $file;
+        if (Utils::WithinSourceRoot($localMrpName)){
+            $localMrpName = Utils::RemoveSourceRoot($localMrpName);        
+        }
+        #The 1 is to tell MrpData not to read the file
+        $mrpObject = MrpData->New($localMrpName, undef, undef, undef, undef, undef ,1);
+    }
+    else {
+        croak "Error: Invalid MRP object type $type\n";
+    }
+
+    if ($mrpObject->Populated()) {
+        # MrpData is a multiton, it's possible a populated object has been returned
+        return $mrpObject;
+    }
+    
+    if (!$mrpObject) {
+        croak "Unable to create an $type object for '$file'\n";   
+    }
+    
+    if (!-f $file) {
+        croak "Error: \"$file\" does not exist\n";
+    }
+
+    if ($self->{verbose}) {
+        print "Reading $file...\n";
+    }
+
+    # Then parse the file and populate the object
+    open MRP, $file or die "Unable to open \"$file\" for reading: $!\n";
+    
+    while (my $line = <MRP>) {
+        chomp $line;
+        
+        $line =~ s/(?<!\\)#.*$//;  # remove comments
+        $line =~ s/^\s+//;
+        next if (!$line); # blank lines
+
+        my @parts;
+        
+        my $string = $line;
+        while ($string) {
+            if ($string =~ s/^\"(.*?)\"//    # Match and remove next quoted string
+            or $string =~ s/^(.*?)\s+//  # or, match and remove next (but not last) unquoted string
+            or $string =~ s/^(.*)\s*$//) {  # or, match and remove last unquoted string.
+                push (@parts, $1);
+                $string =~ s/^\s+//; # Remove delimiter if present.
+            }
+        }
+        
+        my $keyword = shift @parts;
+
+        my $remove = ($keyword =~ s/^-//);
+        
+        if (!scalar(@parts) or ($remove && $keyword !~ /binary|testbinary|export_file/)) {
+            croak "Error: Invalid line in \"$file\" \(Line $.\): \"$line\"\n";
+        }
+
+        if ($keyword eq 'component') {
+            if (scalar @parts > 1) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";   
+            }
+            if (!$mrpObject->SetComponent($parts[0])) {
+                croak "Error: 'component' keyword used more than once in \"$file\"\n";
+            }
+        }
+        elsif ($keyword eq 'notes_source') {
+            if (scalar @parts > 1) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";   
+            }
+            if (!$mrpObject->SetNotesSource($parts[0])) {
+                croak "Error: 'notes_source' keyword used more than once in \"$file\"\n";
+            }
+        }       
+        elsif ($keyword eq 'source') {
+            my $source = join ' ', @parts;
+            if (!$mrpObject->SetSource($source)) { # some source statements contain spaces in the name
+                croak "Error: 'source' entry for \"$source\" defined more than once in \"$file\"\n";
+            }
+        }
+        elsif ($keyword =~ /^(test)?binary$/) {
+            if (scalar @parts > 4) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";
+            }
+            
+            # SetBinary (operand, test, remove)
+            $mrpObject->SetBinary(\@parts, $1, $remove);
+        }
+        elsif ($keyword =~ /^(test)?exports$/) {
+            if (scalar @parts > 2) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";
+            }
+
+            # SetExports (operand, test, dependantComponet)
+            $mrpObject->SetExports($parts[0], $1, $parts[1]);
+        }
+        elsif ($keyword eq 'export_file') {
+            if (scalar @parts > 3) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";
+            }
+
+            # SetExportFile (source, destination, remove, dependantComponet)
+            $mrpObject->SetExportFile($parts[0], $parts[1], $remove, $parts[2]);
+        }
+        elsif ($keyword eq 'ipr') {
+            if (scalar @parts > 3) {
+                croak "Error: Invalid number of arguments to $keyword keyword in \"$file\"\n";
+            }
+
+            # SetIPR (category, path, exportRestricted)
+            if ($parts[0] eq 'export-restricted') {
+                if (!$mrpObject->SetIPR($parts[1], $parts[2], 1)) {
+                   croak "Error: IPR information for \"$parts[2]\" specified more than once in \"$file\"\n";
+                }
+            }
+            else {
+                if (!$mrpObject->SetIPR($parts[0], $parts[1], 0)) {
+                   croak "Error: IPR information for \"$parts[1]\" specified more than once in \"$file\"\n";
+                }
+            }
+        }
+        else {
+            croak "Error: Invalid line in \"$file\" \(Line $.\): \"$line\"\n";
+        }
+    }
+    close MRP;
+    
+    $mrpObject->ValidateParsing();
+
+    return $mrpObject;
+}
+
+sub SetVerbose {
+    my $self = shift;
+    
+    $self->{verbose} = 1;
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Symbian::CBR::MRP::Reader - Parses MRP files and returns a populated MRP object
+
+=head1 SYNOPSIS
+
+ use Symbian::CBR::MRP::Reader;
+
+ # Instantiate an instance of the Symbian::CBR::MRP::Reader object
+ my $mrpReader = Symbian::CBR::MRP::Reader->instance();
+
+ my $mrpFile = '\someFolder\anMrpFile.mrp';
+
+ # Enable verbose output
+ $mrpReader->SetVerbose();
+
+ # Call ReadFile on the mrp reader, specifying the MRP file to parse and the type
+ # of MRP object you want to be populated and returned
+ my $mrpObject = $mrpReader->ReadFile($mrpFile, 'MRP');
+
+ ...
+
+ # Call methods on the returned MRP object
+ $mrpObject->GetIPRInformation();
+
+=head1 DESCRIPTION
+
+This module is used to parse MRP files and populate MRP objects.  The user can
+specify the type of MRP object to be populated and returned.  This module includes
+basic MRP syntax checking but stronger syntax checking should be implemented
+in the MRP object to be populated.
+
+=head1 METHODS
+
+=head2 instance()
+
+Instantiates and returns Symbian::CBR::MRP::Reader object.  This object is a
+singleton.
+
+=head2 ReadFile (mrpfile, type)
+
+Reads the specified MRP file, instantiates and populates an MRP object of the
+type specified and then returns the populated MRP object to the caller.
+
+Valid MRP types are MRP and MRPDATA.
+
+MRP: This is a Symbian::CBR::MRP object.  It is a lightweight MRP object and
+contains only basic MRP functionality.  This option should be used when MRP
+objects are required for tools which are not part of the CBR Tools.  See the
+Symbian::CBR::MRP documentation for more details.
+
+MRPDATA:  This is an MrpData object, as used by the CBR Tools.  This option
+should only be used for the CBR Tools. See the MrpData documentation
+for more details.
+
+=head2 SetVerbose ()
+
+Used to set enable verbose output.  Once set it is not possible to unset the
+verbose output.  This is because this package is a singleton, and disabling the
+verbose output could disrupt other code using this same instance.  This means
+that it is not possible to disable the verbosity once it has been enabled.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/MRPInterface.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,78 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::MRPInterface
+#
+
+package Symbian::CBR::MRPInterface;
+
+use strict;
+use Carp;
+
+
+sub new {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::new\n";
+}
+
+sub _new_instance {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::_new_instance\n";
+}
+
+sub SetIPR {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetIPR\n";
+}
+
+sub SetComponent {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetComponent\n";
+}
+
+sub SetNotesSource {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetNotesSource\n";
+}
+
+sub SetSource {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetSource\n";
+}
+
+sub SetBinary {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetBinary\n";
+}
+
+sub SetExports {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetExports\n";
+}
+
+sub SetExportFile {    
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::SetExportFile\n";
+}
+
+sub GetIPRInformation {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::GetIPRInformation\n";
+}
+
+sub GetExportComponentDependencies {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::GetExportComponentDependencies\n";    
+}
+
+sub ValidateParsing {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::Validate\n";
+}
+
+sub Populated {
+    croak 'Error: Call to interface method ' .  __PACKAGE__ . "::Populated\n";
+}
+
+1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/CBR/release/Manifest.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,258 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::CBR::Release::Manifest.pm
+#
+
+package Symbian::CBR::Release::Manifest;
+
+use File::Basename;
+use File::Spec;
+use File::Path;
+use RelData;
+use XML::Simple;
+use Carp;
+use POSIX qw(strftime);
+
+
+#
+#Constants
+#
+
+use constant MD5                => 'md5';
+use constant SIZE               => 'size';
+use constant MODIFIED_TIME      => 'modified-timestamp';
+use constant VERSION            =>   '1.0.0';
+
+
+#
+#Public.
+#
+
+sub new {
+  my $pkg = shift;
+  my $iniData = shift;
+  my $verbose = shift;
+  my $self;
+  $self->{iniData} = $iniData;
+  $self->{verbose} = $verbose;
+  bless $self, $pkg;
+  return $self;
+}
+
+sub GenerateManifest {
+  my $self = shift;
+  my $comp = shift;
+  my $version = shift;
+  my $archive = shift;
+
+  my $relData;
+  if (defined $archive) {
+    $relData  = RelData->OpenExternal($archive, $comp, $version);
+  }
+  else {
+    $relData = RelData->Open($self->{iniData}, $comp, $version, $self->{verbose});
+  }
+
+  $self->{'baselineName'} = $comp;
+  $self->{'baselineVersion'} = $version;
+
+  print "Generating Release manifest file.\n";
+  
+  #Get envirnoment from baseline's reldata.
+  my $environment = $relData->Environment();
+
+  foreach my $thisComp (sort keys %{$environment}){
+    #Identify the release directory for all components.
+    my $thisVer = $environment->{$thisComp};
+    print "Reading $thisComp $thisVer.\n " if($self->{verbose});
+    
+    my $relDir;
+    if (defined $archive) {
+      $relDir = File::Spec->catdir($archive, $thisComp, $thisVer);
+    }
+    else {
+      $relDir = $self->{iniData}->PathData->LocalArchivePathForExistingComponent($thisComp, $thisVer);
+    }
+    croak "$thisComp $thisVer doesn't exist.\n" unless(-e $relDir);
+    
+    opendir(RELDIR, $relDir) or croak "Error: can't opendir $relDir\n";
+    my @allFiles = grep {$_ ne '.' and $_ ne '..'} map {"$relDir\\$_"} readdir(RELDIR);
+    close RELDIR;
+    $self->{components}{$thisComp}{version} = $thisVer;
+    #List all files from component release.
+    foreach my $thisFile (@allFiles) {
+      my $file = basename($thisFile);
+      next if($file eq "." or $file eq "..");
+
+      #Record size, md5 checksum and modified timestamp for all files.
+      open(FILEHANDLE,"$thisFile") or croak "Couldn't open file \"$thisFile\".\n";
+      $md5 = Digest::MD5->new;
+      $md5->addfile(FILEHANDLE);
+      close FILEHANDLE;
+
+      my $modifiedTimeStamp = Utils::FileModifiedTime($thisFile);
+
+      $self->{components}{$thisComp}{files}{$file}{+SIZE} = -s $thisFile;
+      $self->{components}{$thisComp}{files}{$file}{+MD5} = $md5->hexdigest;
+      $self->{components}{$thisComp}{files}{$file}{+MODIFIED_TIME} = $modifiedTimeStamp;
+    }
+  }
+
+}
+
+sub Save {
+  my $self = shift;
+  my $manifestFilePath = shift;
+
+  unless (-d $manifestFilePath) {
+    eval {mkpath($manifestFilePath)};
+    if ($@) {
+      my $error = $@;
+      $error =~ s/ at .*?(?i:manifest\.pm) line \d+$//;
+      die "Error: Unable to create path $manifestFilePath: $error\n";
+    }
+  }
+  print "Writing release manifest to $manifestFilePath path.\n ";
+  my $release = {
+        version =>   VERSION,
+        meta => { 'baseline-name' => { 'value' => $self->{'baselineName'} },
+                  'baseline-version' => { 'value' => $self->{'baselineVersion'} },
+                  'created-time' => { 'value' => strftime( '%Y-%m-%dT%H:%M:%S', localtime() ) } },
+        manifest => { component => [] }
+  };
+  my $manifest = $self->{'baselineName'} ."_".$self->{'baselineVersion'}."_manifest.xml";
+  my $manifestFile = File::Spec->catfile( $manifestFilePath, $manifest );
+  my $components = {};
+  foreach  my $thisComp(sort keys %{$self->{components}}) {
+    $thisVer = $self->{components}{$thisComp}{version};
+    my $index = "$thisComp,$thisVer";
+    foreach  my  $thisFile (sort keys %{$self->{components}{$thisComp}{files}}) {
+      my $file = { 
+           'name' => $thisFile,
+           'size' => $self->{components}{$thisComp}{files}{$thisFile}{+SIZE},
+           'md5'  => $self->{components}{$thisComp}{files}{$thisFile}{+MD5},
+           'modified-timestamp' => $self->{components}{$thisComp}{files}{$thisFile}{+MODIFIED_TIME}
+	  };
+      if (!defined $components->{$index}) {
+        $components->{$index} = { file => [], name => $thisComp, version => $thisVer }; # make ref
+        push @{$release->{manifest}{component}}, $components->{$index};
+      }
+      push @{$components->{$index}{file}}, $file;
+    }
+  }
+
+  eval {XMLout(
+        $release,
+        xmldecl     => '<?xml version="1.0" ?>',
+        rootname    => 'release',
+        outputfile  => $manifestFile )};
+
+  croak "Error: Can't write manifest file: $@\n" if $@;
+}
+
+sub Load {
+  my $self = shift;
+  my $manifestFile = shift;
+  
+  if (!-e $manifestFile) {
+    die "Error: Can't read manifest file '$manifestFile': File does not exist\n";
+  }
+  
+  my %metaFieldMap = qw(baseline-name baselineName baseline-version baselineVersion created-time createdTime);
+  my $release   = eval{XMLin(
+                    $manifestFile,
+                    forcearray => [ qw(component file) ],
+                    keyattr => [])};
+
+
+  die "Error: Can't read manifest file '$manifestFile': $@\n" if $@;
+  print "Reading $manifestFile file.\n " if($self->{verbose});
+
+  for my $meta (@{$release->{meta}}) {
+    $self->{$metaFieldMap{$meta->{name}}} = $meta->{value};
+  }
+  foreach my $component ( @{ $release->{manifest}{component} } ) {
+    my $comp = $component->{'name'};
+    my $version = $component->{version};
+    $self->{components}{$comp}{version} = $version;
+    foreach my $file ( @{ $component->{file} } ) {
+      my $fileName = $file->{'name'};
+      $self->{components}{$comp}{files}{$fileName}{+SIZE} = $file->{+SIZE};
+      $self->{components}{$comp}{files}{$fileName}{+MD5} = $file->{+MD5};
+      $self->{components}{$comp}{files}{$fileName}{+MODIFIED_TIME} = $file->{+MODIFIED_TIME};
+    }
+  }
+}
+
+sub FileExists {
+  my $self = shift;
+  my $comp = shift;
+  my $file = shift;
+  croak "Error: Component and file name must be specified.\n" unless(defined $comp and defined $file);
+  return exists $self->{components}{$comp}{files}{$file};
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+Symbian::CBR::Release::Manifest.pm - Provides an interface to data associated with a particular release.
+
+=head2 new
+
+Creates a new Symbian::CBR::Release::Manifest object. Expects to be passed a reference to an iniData object and verbose level.
+
+=head2 GenerateManifest
+
+Expects to be passed a component, version and optionally archive path. Generates a release manifest hash using component version and archive if provided. Otherwise uses archive specified in reltools.ini.
+
+=head2 Save
+
+Expects to be passed a destination path. Create destination path if destination path is not existing, and save the hash structure to manifest.xml file.
+
+=head2 Load
+
+Expects to be passed a manifest file path. Reads manifest file and converts into a hash structure.
+
+=head2 FileExists
+
+Expects to be passed a component name and file name. If file is present in the component returns 1, otherwise 0.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/DistributionPolicy.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,446 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package Symbian::DistributionPolicy;
+use strict;
+
+use POSIX qw(mktime);
+
+# create OSD bit vector constants for $obj->{osd}
+use constant SYMBIAN_DPOL_COMMON      => 0x0001;
+use constant SYMBIAN_DPOL_OPTIONAL    => 0x0002;
+use constant SYMBIAN_DPOL_SYMBIAN     => 0x0004;
+use constant SYMBIAN_DPOL_REPLACEABLE => 0x0008;
+use constant SYMBIAN_DPOL_TEST        => 0x0010;
+
+sub new {
+    my $class = shift;
+    my $self = {
+        authorized        => {},
+        category          => undef,
+        description       => '',
+        expires           => undef,
+        export_restricted => undef,
+        osd               => 0,
+    };
+    bless $self, $class;
+    return $self;
+}
+
+# public.
+
+sub Authorized {
+    my $self = shift;
+    my $licensee = shift;
+    my $time = @_ ? shift : time; # use current time if not specified
+    # absent = fail
+    return if !exists $self->{authorized}{$licensee};
+    # present without expiry = pass
+    return 1 if !defined $self->{authorized}{$licensee};
+    # check expiry
+    return $self->{authorized}{$licensee} > $time;
+}
+
+sub SetAuthorizedUntil {
+    my $self = shift;
+    my $licensee = shift;
+    my $until = shift;
+    return if !defined $licensee;
+    $self->{authorized}{$licensee} = $self->parsedate($until);
+    # success depends on whether a date was passed and parsed successfully
+    return defined $until ? defined $self->{authorized}{$licensee} : 1;
+}
+
+sub Category {
+    return $_[0]->{category};
+}
+
+sub SetCategory {
+    my $self = shift;
+    my $cat = uc(shift); # uppercase
+    return if !defined $cat;
+    if ($cat !~ /^[A-Z]$/) {
+        warn "Invalid IPR category: '$cat'\n";
+        return;
+    }
+    $self->{category} = $cat;
+    return 1;
+}
+
+sub Common {
+    return $_[0]->{osd} & SYMBIAN_DPOL_COMMON;
+}
+
+sub SetCommon {
+    my $self = shift;
+    my $bool = shift;
+    return $self->SetOptional(1) if !$bool;
+    $self->{osd} |= SYMBIAN_DPOL_COMMON;
+    $self->{osd} &= ~SYMBIAN_DPOL_OPTIONAL; # toggles optional off
+    return 1;
+}
+
+sub Description {
+    return $_[0]->{description};
+}
+
+sub SetDescription {
+    my $self = shift;
+    my $desc = shift;
+    $self->{description} = defined $desc ? $desc : '';
+    return 1;
+}
+
+sub Expires {
+    return $_[0]->{expires};
+}
+
+sub SetExpires {
+    my $self = shift;
+    my $date = shift;
+    return if !defined $date;
+    $self->{expires} = $self->parsedate($date);
+    # if parsedate failed it returned undef so that is our status
+    return defined $self->{expires};
+}
+
+sub Expired {
+    my $self = shift;
+    my $time = @_ ? shift : time;
+    # not defined = no expiry
+    return if !defined $self->{expires};
+    # check expiry
+    return $self->{expires} < $time;
+}
+
+sub ExportRestricted {
+    my $self = shift;
+    
+    # If the category is defined then we know a distribution policy file has been parsed.
+    if ($self->{category}) {
+        # double ! reduces the value to a boolean
+        return !!$self->{export_restricted};
+    }
+    return undef;
+}
+
+sub SetExportRestricted {
+    my $self = shift;
+    my $flag = shift;
+    $self->{export_restricted} = $flag;
+    return 1;
+}
+
+sub Optional {
+    return $_[0]->{osd} & SYMBIAN_DPOL_OPTIONAL;
+}
+
+sub SetOptional {
+    my $self = shift;
+    my $bool = shift;
+    return $self->SetCommon(1) if !$bool;
+    $self->{osd} |= SYMBIAN_DPOL_OPTIONAL;
+    $self->{osd} &= ~SYMBIAN_DPOL_COMMON; # toggles common off
+    return 1;
+}
+
+sub Replaceable {
+    return $_[0]->{osd} & SYMBIAN_DPOL_REPLACEABLE;
+}
+
+sub SetReplaceable {
+    my $self = shift;
+    my $bool = shift;
+    return $self->SetSymbian(1) if !$bool;
+    $self->{osd} |= SYMBIAN_DPOL_REPLACEABLE;
+    $self->{osd} &= ~SYMBIAN_DPOL_SYMBIAN; # toggles symbian off
+    return 1;
+}
+
+sub Symbian {
+    return $_[0]->{osd} & SYMBIAN_DPOL_SYMBIAN;
+}
+
+sub SetSymbian {
+    my $self = shift;
+    my $bool = shift;
+    return $self->SetReplaceable(1) if !$bool;
+    $self->{osd} |= SYMBIAN_DPOL_SYMBIAN;
+    $self->{osd} &= ~SYMBIAN_DPOL_REPLACEABLE; # toggles replaceable off
+    return 1;
+}
+
+sub Test {
+    return $_[0]->{osd} & SYMBIAN_DPOL_TEST;
+}
+
+sub SetTest {
+    my $self = shift;
+    my $bool = shift;
+    if ($bool) {
+        $self->{osd} |= SYMBIAN_DPOL_TEST; # on
+    } else {
+        $self->{osd} &= ~SYMBIAN_DPOL_TEST; # off
+    }
+    return 1;
+}
+
+# private.
+
+sub parsedate {
+    my $self = shift;
+    my $date = shift; # dd/mm/yyyy
+    return unless defined $date;
+    if ($date !~ m!^(\d\d)/(\d\d)/(\d{4})$!) {
+        warn "Invalid date: '$date'\n";
+        return;
+    }
+    my($d, $m, $y) = ($1, $2, $3);
+    my $time = mktime(59, 59, 23, $d, --$m, $y-1900);
+    if (!defined $time) {
+        warn "Date out of range: '$date'\n";
+        return;
+    }
+    return $time;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Symbian::DistributionPolicy - OO representation of a DISTRIBUTION.POLICY file.
+
+=head1 SYNOPSIS
+
+ # normally you would not create a policy object directly but
+ # use one returned by the Symbian::DistributionPolicy::Reader...
+
+ use Symbian::DistributionPolicy::Reader;
+
+ my $dpr = Symbian::DistributionPolicy::Reader->new();
+
+ my $policy = $dpr->ReadPolicyFile($path);
+
+ # then you may query the object using the methods below
+
+=head1 DESCRIPTION
+
+This module provides an object to represent the data in a DISTRIBUTION.POLICY
+file. The DISTRIBUTION.POLICY file specifies the policy information for all the
+source code files in the same directory. The directives are:
+
+=head2 Authorized LICENSEE_ID [until DATE]
+
+The C<Authorized> directive overrides any IPR restriction and makes available
+the source to the licensee with a specific I<LICENSEE_ID>. If the C<until>
+keyword is used then I<DATE> should be a string in the format dd/mm/yyyy. The
+exception made by this directive will expire at the end of this date. Only
+one C<Authorized> directive is allowed per I<LICENSEE_ID>.
+
+=head2 Category IPR_CATEGORY
+
+The C<Category> directive specifies the IPR category of the source.
+I<IPR_CATEGORY> may be any single character from the range A to Z. The default for
+unclassified source is X.
+
+=head2 Description TEXT
+
+The C<Description> directive specifies a one-line textual description of the
+directory content. I<TEXT> need not be quoted (in fact, it should not be).
+
+=head2 Expires DATE
+
+The C<Expires> directive specifies the date after which the directive(s) in the
+DISTRIBUTION.POLICY file become invalid. I<DATE> must be in dd/mm/yyyy format.
+
+=head2 Export STATUS
+
+The C<Export> keyword specifies whether the source is export restricted or not.
+The default is that it is not and this is equivalent to setting I<STATUS> to
+Unrestricted. Changing I<STATUS> to Restricted will enable this feature.
+
+=head2 OSD: ((COMMON|OPTIONAL) (SYMBIAN|REPLACEABLE)|REFERENCE/TEST) [NAME]
+
+The OSD line describes the nature of the source in five metrics: (COMMON vs.
+OPTIONAL and SYMBIAN vs. REPLACEABLE) or REFERENCE/TEST. The descriptions of
+these are available in Schedule 2 of the CKL.
+
+=head1 METHODS
+
+In addition to the constructor, getters and setters are provided for all policy
+directives:
+
+=begin text
+
+    +--------------+-------------------+----------------------+
+    | Directive    | Getter            | Setter               |
+    +--------------+-------------------+----------------------+
+    | Authorized   | Authorized        | SetAuthorizedUntil   |
+    | Category     | Category          | SetCategory          |
+    | Description  | Description       | SetDescription       |
+    | Expires      | Expires           | SetExpires           |
+    | Export       | ExportRestricted  | SetExportRestricted  |
+    | OSD          | See table below for individual methods.  |
+    +--------------+-------------------+----------------------+
+
+=end
+
+Individual OSD metrics getters and setters are detailed in the following table:
+
+=begin text
+
+    +-----------------+--------------+-----------------+
+    | Metric          | Getter       | Setter          |
+    +-----------------+--------------+-----------------+
+    | COMMON          | Common       | SetCommon       |
+    | OPTIONAL        | Optional     | SetOptional     |
+    | REPLACEABLE     | Replaceable  | SetReplaceable  |
+    | SYMBIAN         | Symbian      | SetSymbian      |
+    | REFERENCE/TEST  | Test         | SetTest         |
+    +-----------------+--------------+-----------------+
+
+=end
+
+=head2 new()
+
+Creates the policy object with default settings (cat=X, desc='', expires=never,
+export=unrestricted).
+
+=head2 Authorized($licensee_id[, $time])
+
+Returns the authorized status as a boolean (1=authorized, undef=not) for a
+given $licensee_id. If a $time is not specified the current time will be used.
+This is required if the C<Authorized> directive makes use of the I<until>
+keyword and the expiry time needs to be checked.
+
+=head2 SetAuthorizedUntil($licensee_id[, $date])
+
+Adds an authorized licensee to the policy. If an expiry date is specified it
+must be in dd/mm/yyyy format.
+
+=head2 Category()
+
+Returns the IPR category as a single-character string. If no IPR category exists
+in the distrubution file then 'undef' will be returned.
+
+=head2 SetCategory($cat)
+
+Sets the category. Will accept any single character from the range A to Z as a
+string in $cat.
+
+=head2 Common()
+
+Returns non-zero if the OSD metric COMMON is set.
+
+=head2 SetCommon($bool)
+
+Sets the OSD metric COMMON if $bool is true. Unsets it if $bool is false. Also
+sets the mutually exclusive OPTIONAL to the opposite.
+
+=head2 Description()
+
+Returns the description text (never undef - if blank you get an empty string).
+
+=head2 SetDescription($text)
+
+Sets the description text.
+
+=head2 Expires()
+
+Returns the expiry time specified in the file (or undef if not specified). It
+will be in UNIX (epoch) time format for your convenience. See Expired().
+
+=head2 SetExpires($date)
+
+Sets the expiry time to 23:59:59 on the date provided. $date should be a string
+in dd/mm/yyyy format.
+
+=head2 Expired([$time])
+
+Will test whether the policy data has (or will have) expired at the time
+specified. If no time is specified, the current time will be used - i.e. to
+determine whether the policy has already expired.
+
+=head2 ExportRestricted()
+
+Returns the export restricted status as a boolean (1=restricted,
+0=unrestricted, undef=information not available).
+
+=head2 SetExportRestricted($flag)
+
+Sets the export restricted status. $flag is a boolean (undef is allowed for
+false).
+
+=head2 Optional()
+
+Returns non-zero if the OSD metric OPTIONAL is set.
+
+=head2 SetOptional($bool)
+
+Sets the OSD metric OPTIONAL if $bool is true. Unsets it if $bool is false. Also
+sets the mutually exclusive COMMON to the opposite.
+
+=head2 Replaceable()
+
+Returns non-zero if the OSD metric REPLACEABLE is set.
+
+=head2 SetReplaceable($bool)
+
+Sets the OSD metric REPLACEABLE if $bool is true. Unsets it if $bool is false.
+Also sets the mutually exclusive SYMBIAN to the opposite.
+
+=head2 Symbian()
+
+Returns non-zero if the OSD metric SYMBIAN is set.
+
+=head2 SetSymbian($bool)
+
+Sets the OSD metric SYMBIAN if $bool is true. Unsets it if $bool is false. Also
+sets the mutually exclusive REPLACEABLE to the opposite.
+
+=head2 Test()
+
+Returns non-zero if the OSD metric REFERENCE/TEST is set.
+
+=head2 SetTest($bool)
+
+Sets the OSD metric REFERENCE/TEST if $bool is true. Unsets it if $bool is
+false.
+
+=head1 SEE ALSO
+
+L<Symbian::DistributionPolicy::Reader> to see how to get your $policy object(s).
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/DistributionPolicy/Reader.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,176 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package Symbian::DistributionPolicy::Reader;
+use strict;
+
+use File::Basename;
+use Symbian::DistributionPolicy;
+
+our $cache = {}; # Persistent (private) cache
+
+sub new {
+    return bless {};
+}
+
+# public.
+
+sub ReadPolicyFile {
+    my $self = shift;
+    my $path = shift;
+    my $dir  = -d $path ? $path : dirname($path);
+    # look in cache first, retrieve if not already defined
+    return $cache->{$dir} ||= $self->readfile($dir.'\\DISTRIBUTION.POLICY');
+}
+
+# private.
+
+sub readfile {
+    my $self = shift;
+    my $file = shift;
+    my $hasCategory;
+    my $policy = Symbian::DistributionPolicy->new();
+    # default policy applies when the file does not exist
+    return $policy if !-e $file;
+    # attempt to open the policy file
+    open(POLICY, $file) or die "Couldn't open $file: $!\n";
+    # read policy data
+    while (<POLICY>) {
+        s/(?<!\\)#.*$//;  # ignore comments
+        s/^\s+|\s+$//g;   # trim whitespace
+        next unless /\S/; # skip blank line
+        # parse line
+        if (/^authori[sz]ed\s+(.+?)(?:\s+until\s+(.+?))?$/i) {
+            # licensee specific authorisation
+            if (!$policy->SetAuthorizedUntil($1, $2)) {
+                warn "Invalid Authorized directive in $file\n";
+            }
+        } elsif (/^category\s+([a-z])$/i) {
+            # ipr category
+            if (!$policy->SetCategory($1)) {
+                warn "Invalid Category directive in $file\n";
+            }
+            $hasCategory = 1;
+        } elsif (/^description\s+(.*)$/i) {
+            # free text description
+            $policy->SetDescription($1);
+        } elsif (/^expires\s+(.*)$/i) {
+            # best before date
+            if (!$policy->SetExpires($1)) {
+                warn "Invalid Expires directive in $file\n";
+            }
+        } elsif (/^export\s+(un)?restricted$/i) {
+            # exportable/embargoed?
+            $policy->SetExportRestricted(!defined($1));
+        } elsif (/^osd:\s*(.+?)$/i) {
+            # parse osd info
+            $self->handle_osd($1, $policy);
+        }
+    }
+    close(POLICY);
+    
+    if (!$hasCategory) {
+        warn "Warning: \'$file\' does not contain an IPR category\n";
+    }
+    
+    return $policy;
+}
+
+sub handle_osd {
+    my $self = shift;
+    local $_ = shift;
+    my $policy = shift;
+    # SGL.PPS246.201DistributionPolicyFileContents.doc
+    if (/^(common|optional)\s+(symbian|replaceable)\s+(.+)$/i) {
+        # set common/optional
+        if (lc($1) eq 'common') {
+            $policy->SetCommon(1);
+        } else {
+            $policy->SetOptional(1);
+        }
+        # set symbian/replaceable
+        if (lc($2) eq 'symbian') {
+            $policy->SetSymbian(1);
+        } else {
+            $policy->SetReplaceable(1);
+        }
+    } elsif (/^(?:reference\/test)\s+(.+)$/i) {
+        # set test
+        $policy->SetTest(1);
+    } elsif (/^(?:test\/reference)\s+(.+)$/i) {
+        # synonym for reference/test
+        $policy->SetTest(1);
+    } else {
+        warn "Invalid OSD directive: '$_' (see SGL.PPS246.201)\n";
+    }
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+Symbian::DistributionPolicy::Reader - Caching DISTRIBUTION.POLICY file reader.
+
+=head1 SYNOPSIS
+
+ use Symbian::DistributionPolicy::Reader;
+
+ my $dpr = Symbian::DistributionPolicy::Reader->new();
+
+ my $policy = $dpr->ReadPolicyFile($path);
+
+=head1 DESCRIPTION
+
+This module parses and caches policy data from DISTRIBUTION.POLICY files.
+
+=head1 METHODS
+
+=head2 new()
+
+Creates the reader object.
+
+=head2 ReadPolicyFile($path)
+
+Read the DISTRIBUTION.POLICY file in $path (which can be e.g. a source file, a
+directory or the DISTRIBUTION.POLICY file itself) and return a
+Symbian::DistributionPolicy object containing the policy data. The policy is
+cached to prevent unnecessary re-reading of .POLICY files in subsequent calls.
+
+=head1 SEE ALSO
+
+L<Symbian::DistributionPolicy> to find out what you can do with your $policy
+object.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Symbian/IPR.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,325 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# Symbian::IPR
+#
+
+package Symbian::IPR;
+
+use strict;
+use Carp;
+use Symbian::CBR::IPR::MRP;
+use Symbian::DistributionPolicy::Reader;
+
+use base qw(Class::Singleton);
+
+
+sub _new_instance {
+    my $pkg = shift;
+    my $useDistPolFirst = shift;
+    my $disallowUnclassifiedSource = shift;
+    my $typeOfMrp = shift;
+    my $verbose = shift;
+    my $captureDistributionPolicyOutput = shift;
+    
+    if (!$typeOfMrp || shift) {
+        # caller(0))[3] gives the package and the method called, e.g. Symbian::IPR::_new_instance
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    my $self = {
+            'useDistPolFirst' => $useDistPolFirst,
+            'disallowUnclassifiedSource' => $disallowUnclassifiedSource,
+            'verbose' => $verbose,
+            'typeOfMrp' => $typeOfMrp,
+            'captureDistributionPolicyOutput' => $captureDistributionPolicyOutput};
+
+    bless $self, $pkg;
+
+    if (!$useDistPolFirst) {
+        # If we are not using distribution policy files as default then create a Symbian::CBR::IPR::MRP object... 
+        $self->CreateMrpObject();
+    }
+    
+    return $self;
+}
+
+sub CreateMrpObject {
+    my $self = shift;
+    
+    if (!exists $self->{'mrpObject'}) {
+        $self->{'mrpObject'} = Symbian::CBR::IPR::MRP->instance($self->{typeOfMrp}, $self->{verbose});
+    }
+    
+    # We may have cached calls to PrepareInformationForComponent...
+    if (defined $self->{prepareInformationForComponentCache}) {
+        foreach my $component (@{$self->{prepareInformationForComponentCache}}) {
+            $self->PrepareInformationForComponent($component);
+        }
+        delete $self->{prepareInformationForComponentCache};
+    }
+    
+    # and also to PrepareInformationForMrpFile...
+    if (defined $self->{prepareInformationForMrpFileCache}) {
+        $self->PrepareInformationForMrpFile->(@{$self->{prepareInformationForMrpFileCache}});
+        delete $self->{prepareInformationForMrpFileCache};
+    }
+}
+
+sub PrepareInformationForComponent {
+    my $self = shift;
+    my $component = shift;
+    
+    # An MRP object may not have been created, for example if using distribution policy files first.
+    # In that case we cache the calls to PrepareInformationForComponent, and will pass them onto the
+    # MRP object if it is ever created.
+    if (defined $self->{'mrpObject'}) {
+        $self->{'mrpObject'}->PrepareInformationForComponent($component);
+    }
+    else {
+        push @{$self->{prepareInformationForComponentCache}}, $component;
+    }
+}
+
+sub PrepareInformationForMrpFile {
+    my $self = shift;
+    my @mrps = shift;   
+
+    # An MRP object may not have been created, for example if using distribution policy files first.
+    # In that case we cache the calls to PrepareInformationForMrpFile, and will pass them onto the
+    # MRP object if it is ever created.
+    if (defined $self->{'mrpObject'}) {
+        $self->{'mrpObject'}->PrepareInformationForMrpFile(@mrps);
+    }
+    else {
+        push @{$self->{prepareInformationForMrpFileCache}}, @mrps;
+    }
+}
+
+
+sub Category {
+    my $self = shift;
+    my $path = shift;
+
+    if (!$path || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    my ($category, $errors) = $self->GetRequestedInformation($path, 'Category');
+
+    if (!$category) {
+        $category = 'X';
+    }
+
+    return ($category, $errors);
+}
+
+sub ExportRestricted {
+    my $self = shift;
+    my $path = shift;
+
+    if (!$path || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+
+    my ($exportRestricted, $errors) = $self->GetRequestedInformation($path, 'ExportRestricted');
+
+    return ($exportRestricted, $errors);
+}
+
+sub GetRequestedInformation {
+    my $self = shift;
+    my $path = shift;
+    my $what = shift;
+
+    my @errors; # This collects the errors produced from the distribution policy modules.
+                # The CBR Tools handle these errors in a different way.
+
+    if (!$path || !$what || shift) {
+        croak "Invalid number of arguments passed to " . (caller(0))[3] . "\n";
+    }
+    
+    my $result = undef;
+    my $informationFrom = undef;
+    
+    if (!$self->{useDistPolFirst} && $self->{mrpObject}) {
+        # If to use MRP files first and an Mrp object exists...
+        $result = $self->{mrpObject}->$what($path);
+
+        $informationFrom = 'M' if (defined $result);
+    }
+    
+    if (! defined $result) {
+        # If  distribution policies are to be used first or could not obtain information
+        # from MRP object then use distribution policies
+
+        # Create a distribution policy reader if one does not already exist...
+        if (!$self->{distPolReader}) {
+            # Create a distribution policy reader if one does not already exist...
+            $self->{distPolReader} = Symbian::DistributionPolicy::Reader->new();
+        }
+        
+        if ($self->{distPolReader}->isa("Symbian::DistributionPolicy::Reader")) {
+            my $warner;
+            
+            # We may need to capture the output of the distribution policy modules
+            if ($self->{'captureDistributionPolicyOutput'}) {
+                $warner = sub { push @errors, shift; };
+            }
+            local $SIG{__WARN__} = $warner if ($warner);
+
+            # We want to make sure that we do have a reader before trying to read a file
+            eval {  my $distPolObj = $self->{distPolReader}->ReadPolicyFile($path);
+                    $result = $distPolObj->$what()};
+
+            $informationFrom = 'D' if (defined $result);
+        }
+    }
+
+    if ((!defined $result) && $self->{useDistPolFirst}) {
+        # If distribution policies have been used first and failed then try getting the information from MRP files...
+        
+        # The Symbian::CBR::IPR::MRP might not yet have been created
+        if (!exists $self->{mrpObject}) {
+            $self->CreateMrpObject();
+        }
+        
+        $result = $self->{mrpObject}->$what($path);
+
+        $informationFrom = 'M' if (defined $result);
+    }
+   
+    if (!defined $informationFrom && $self->{disallowUnclassifiedSource}) {
+        carp "Warning: IPR information for '$path' could not be obtained from either MRP files or distribution policy files\n";
+    }
+        
+    if ($self->{verbose} > 1) {
+        # If verbose then we print information saying where the IPR information was obtained from
+        if ($informationFrom eq 'M') {
+            print "Info: IPR information for '$path' was obtained using MRP files\n";
+        }
+        elsif ($informationFrom eq 'D') {
+            print "Info: IPR information for '$path' was obtained using Distribution Policy files\n";
+        }        
+    }
+
+    return ($result, \@errors);
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+Symbian::IPR - An interface to IPR information within MRP files and Distribution
+Policy files.
+
+=head1 SYNOPSIS
+
+use Symbian::IPR;
+
+ # Instantiate a Symbian::IPR object
+ my $iprObject = Symbian::IPR->instance(0, 0, 'MRP', undef, 1);
+
+ # Get the IPR category for a path
+ my $category = $iprObject->Category('\aPath\somewhere');
+
+ # Get the export restricted flag for a path
+ my $exportRestricted = $iprObject->ExportRestricted('\aPath\somewhere');
+
+=head1 DESCRIPTION
+
+This package provides an interface to obtaining IPR information from MRP files
+and Distribution Policy files.  The user can specify the order of preference
+between MRP and distribution policies.  If the requested information can not be
+obtained from the preferred choice then the package will fall back to using the
+other option.
+
+=head1 METHODS
+
+=head2 new(useDistPolFirst, disallowUnclassifiedSource, typeOfMrp, component, verbose)
+
+Instantiates a Symbian::IPR object.
+
+The default order is for IPR information to be obtained from MRP files first, and
+if unsuccessful then to obtain the IPR information from distribution policy files.
+If the boolean value useDistPolFirst is specified then IPR information will be
+obtained from distribution policy files by default, and if not successful then
+MRP files will be used.
+
+If the disallowUnclassifiedSource flag is specified then warnings will be produced
+if IPR information can not be obtained both MRP files and distribution.policy files.
+
+The typeOfMrp argument is non-optional.  Valid types are MRP and MRPDATA.  See the
+documentation for Symbian::CBR::MRP::Reader for more information.
+
+If a component had been specified then the MRP file for the component will be processed
+and the IPR information obtained.  Any MRP files for dependant components will be
+located and processed too.  If no component name has been specified all MRP files
+in the environment will be processed.
+
+=head2 Category(path)
+
+Returns the IPR category of the path.  If no IPR information exists for the
+specified path then X will be returned.
+
+=head2 ExportRestricted(path)
+
+Returns true if the specified path is export restricted, and false if it is not.
+If no IPR information exists for the specified path then undef will be returned.
+
+=head2 PrepareInformationForComponent(component_name)
+
+If using MRP files for IPR information it is possible to specify which components
+contain the information required.  This improves performance as only required
+MRP files are processed.  The default behaviour is to process all MRP files listed
+in the CBR Tools environment database.
+
+If using distribution policy files as default then information passed to this method
+will be cached and realised only if it becomes necessary to use MRP files for IPR
+information (e.g. distribution policy file does not exist).
+
+=head2 PrepareInformationForMrpFile(list_of_mrp_files)
+
+If using MRP files for IPR information it is possible to specify which MRP files
+contain the information required.  This can be used in scenarios where a CBR Tools
+environment database does not exist, and so MRP locations are unknown.
+
+If using distribution policy files as default then information passed to this method
+will be cached and realised only if it becomes necessary to use MRP files for IPR
+information (e.g. distribution policy file does not exist).
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,126 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+package TableFormatter;
+
+use constant TABLE_MARGIN => 3;
+
+use strict;
+
+sub New {
+  my $class = shift;
+  my $inidata = shift;
+  my $args = shift;
+  # SUBCLASSES: don't store $iniData anywhere, because then you'll
+  # get a reference loop and a memory leak.
+
+  my $self = bless {}, (ref $class || $class);
+  $self->{args} = $args;
+
+  return $self;
+}
+
+### Static methods
+
+sub CreateFormatter {
+  my $type = shift;
+  my $inidata = shift;
+  my $args = shift;
+
+  die "Error: couldn't create a formatter without a type" unless $type;
+
+  $type = ucfirst($type);
+  my $class = "TableFormatter::$type";
+  eval "require $class";
+  if ($@) {
+    die "Could not load the table formatter \"$class\" for format \"$type\" because $@";
+  }
+  return $class->New($inidata, $args) or die "Could not create the table formatter \"$class\" for format \"$type\"";
+}
+
+### Private
+
+sub FindColWidths {
+  my $self = shift;
+  my $data = shift;
+  my @widths;
+  return [] unless defined ($data->[0]);
+  my $numCols = scalar(@{$data->[0]});
+  for (my $col = 0; $col < $numCols; ++$col) {
+    my $width = $self->FindWidestColElement($data, $col);
+    $width += TABLE_MARGIN unless ($col == $numCols-1);
+    # Don't pad the last column in case it gives us unnecessary line wrapping
+    push @widths, $width;
+  }
+  return \@widths;
+}
+
+sub FindWidestColElement {
+  my $self = shift;
+  my $data = shift;
+  my $col = shift;
+  my $widest = 0;
+  my $numRows = scalar(@{$data});
+  for (my $row = 0; $row < $numRows; ++$row) {
+    my $this = $data->[$row][$col];
+    my $lengthThis = length($this);
+    if ($lengthThis > $widest) {
+      $widest = $lengthThis;
+    }
+  }
+  return $widest;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter.pm - An abstract superclass for table formatting classes.
+
+=head1 INTERFACE FOR SUBCLASSES
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable
+
+Prints a table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Auto.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,130 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Text.pm
+#
+
+package TableFormatter::Auto;
+
+use constant MAX_WIDTH => 75;
+use constant MAX_ROWS => 10;
+
+use strict;
+use TableFormatter;
+use TableFormatter::Text;
+use vars qw/@ISA/;
+
+@ISA = qw(TableFormatter);
+
+sub New {
+  my $class = shift;
+  my $inidata = shift;
+  my $args = shift;
+  
+  my ($complex, $complexargs) = $args =~ m/^(\w+)\s*(.*)/;
+  my $self = bless {}, (ref $class || $class);
+
+  $self->CreateFormatters($complex, $inidata, $complexargs);
+
+  return $self;
+}
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $doHeading = shift;
+
+  my $usecomplex = $self->UseComplexFormatter($data);
+
+  my $formatter = ($usecomplex?$self->{complex}:$self->{simple});
+  return $formatter->PrintTable($data, $doHeading);
+}
+
+## Private
+
+sub CreateFormatters {
+  my $self = shift;
+  my $complex = shift;
+  my $inidata = shift;
+  my $complexargs = shift;
+
+  $self->{complex} ||= TableFormatter::CreateFormatter($complex, $inidata, $complexargs);
+  $self->{simple} ||= TableFormatter::Text->New($inidata);
+}
+
+sub UseComplexFormatter {
+  my $self = shift;
+  my $data = shift;
+
+  # Currently {maxrows} and {maxwidth} are unused
+  my $maxrows = $self->{maxrows} || MAX_ROWS;
+  my $maxwidth = $self->{maxwidth} || MAX_WIDTH;
+
+  return 1 if (@$data > $maxrows);
+  return 1 if ($self->TotalWidth($data) > $maxwidth);
+  return 0;
+}
+
+sub TotalWidth {
+  my $self = shift;
+  my $data = shift;
+  
+  my $widths = $self->FindColWidths($data);
+  my $total = 0;
+  $total += $_ foreach (@$widths);
+  return $total;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Text.pm - Formats tables in text
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Csv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,88 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Csv.pm
+#
+
+package TableFormatter::Csv;
+
+use strict;
+use Utils;
+use TableFormatter;
+use vars qw/@ISA/;
+@ISA = qw(TableFormatter);
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $location = Utils::PrependEpocRoot("\\epoc32\\relinfo\\temp-table.csv");
+  open(CSV, ">$location") or die "Couldn't open \"$location\" for writing because $!";
+  foreach my $row (@$data) {
+    my $rowtext = "";
+    foreach my $cell (@$row) {
+      $cell =~ s/\"/\\\"/g;
+      $cell =~ s/(.*)/\"$1\"/ if $cell =~ m/[\,\"]/;
+      $rowtext .= $cell . ",";
+    }
+    chop $rowtext;
+    print CSV "$rowtext\n";
+  }
+  close CSV;
+  system ($location);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Csv.pm - Formats tables in text
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+The name of this file (i.e. Csv.pm) must be in that capitalisation, for IniData.pm to be able to find it.
+
+No actual bugs.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Excel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,157 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Excel.pm
+#
+
+package TableFormatter::Excel;
+
+use Utils;
+use TableFormatter;
+use vars qw/@ISA/;
+@ISA = qw(TableFormatter);
+
+use strict;
+use Win32::OLE;
+use Cwd;
+
+sub New {
+  my $class = shift;
+  my $iniData = shift;
+
+  if ($iniData->Win32ExtensionsDisabled()) {
+    print "Cannot use Excel table format with win32 extensions disabled. It relies on Win32::OLE module to communicate with Excel. If anybody really cares about this, please rewrite the module to use Spreadsheet::WriteExcel... but you'll have to write your own auto-fit engine. Meanwhile, using Text formatting instead.";
+    require TableFormatter::Text;
+    return TableFormatter::Text->New($iniData);
+  }
+
+  return bless {}, (ref $class || $class);
+}
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $doHeading = shift;
+
+  my $excel = new ExcelConnection;
+
+  my $filename = Utils::PrependEpocRoot("\\epoc32\\relinfo\\temp-table.xls");
+  my $cwd = cwd;
+  $cwd =~ m/^(\w\:)/;
+  my $driveletter = $1 || "";
+  $filename = "$driveletter$filename";
+  unlink ($filename);
+
+  my $wb = $excel->Workbooks->Add;
+
+  my $ws = $wb->Worksheets(1);
+
+  if ($doHeading) {
+    my $style = $wb->Styles->Add("Headings");
+    $style->{Font}->{Bold} = 1;
+    $ws->Rows(1)->{Style} = "Headings";
+  }
+
+  for (my $row=0; $row<@$data; $row++) {
+    my $rowdata = $data->[$row];
+    for (my $col=0; $col<@$rowdata; $col++) {
+      my $cell = $ws->Cells($row+1, $col+1);
+      my $value = $rowdata->[$col];
+      next if ($value eq ""); # otherwise Excel seems to think it's 0
+      $cell->{Value} = "'$value";
+    }
+  }
+
+  $self->DoFinalFormatting($ws);
+  # We want to save, because otherwise Excel will prompt whether you
+  # want to save when you close the workbook. But on the other hand
+  # it prints horrible error messages if there is already a workbook
+  # open with the same name.
+  # So we need to implement a scheme to give each output workbook
+  # a unique name, which means some sort of cleanup mechanism. TODO!
+  #eval {
+    #$wb->SaveAs($filename);
+  #}; # ignore errors, we don't really care.
+  $excel->{Visible} = (1);
+}
+
+### Private
+
+sub FormatHeadingCell {
+  my $self = shift;
+  my $cell = shift;
+  $cell->{Style}->{Font}->{Bold} = 1;
+}
+
+sub DoFinalFormatting {
+  my $self = shift;
+  my $ws = shift;
+  $ws->Columns("A:J")->AutoFit();
+}
+
+package ExcelConnection;
+
+sub new {
+  my $excel;
+  eval {$excel = Win32::OLE->GetActiveObject('Excel.Application')};
+  die "Excel not installed" if $@;
+  unless (defined $excel) {
+      $excel = Win32::OLE->new('Excel.Application', sub {}) or die "Oops, cannot start Excel";
+  }
+  return $excel;
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Excel.pm - Formats tables in Excel
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Html.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,104 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Html.pm
+#
+
+package TableFormatter::Html;
+
+use strict;
+use Utils;
+use TableFormatter;
+use vars qw/@ISA/;
+@ISA = qw(TableFormatter);
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $hasHeader = shift;
+
+  my $location = Utils::PrependEpocRoot("\\epoc32\\relinfo\\temp-table.html");
+  open(HTML, ">$location") or die "Couldn't open \"$location\" for writing because $!";
+  print HTML <<ENDHEAD;
+<html>
+<head>
+  <title>Release tools command output</title>
+</head>
+<body>
+<table border>
+ENDHEAD
+  foreach my $row (@$data) {
+    print HTML "  <tr>\n";
+    my $celltype = "td";
+    if ($hasHeader) {
+      $celltype = "th";
+      $hasHeader = 0; # only first row gets header cells
+    }
+    foreach my $cell (@$row) {
+      $cell =~ s/\&/\&amp;/g;
+      $cell =~ s/\</\&lt;/g;
+      $cell =~ s/\>/\&gt;/g;
+      print HTML "  <$celltype>$cell</$celltype>\n";
+    }
+    print HTML "  </tr>\n";
+  }
+  print HTML "</table>\n</body>\n</html>\n";
+  close HTML;
+  system ($location);
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Html.pm - Formats tables in HTML format
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+The name of this file (i.e. Html.pm) must be in that capitalisation, for IniData.pm to be able to find it.
+
+No actual bugs.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/TableFormatter/Text.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,100 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+# Description:
+# TableFormatter/Text.pm
+#
+
+package TableFormatter::Text;
+
+use strict;
+use TableFormatter;
+use vars qw/@ISA/;
+@ISA = qw(TableFormatter);
+
+sub PrintTable {
+  my $self = shift;
+  my $data = shift;
+  my $doHeading = shift;
+  unless (defined $doHeading) {
+    $doHeading = 0;
+  }
+
+  my $colWidths = $self->FindColWidths($data);
+  my $numRows = scalar(@$data);
+  for (my $row = 0; $row < $numRows; ++$row) {
+    if ($doHeading and $row == 1) {
+      print "\n";
+    }
+    $self->PrintRow($data, $colWidths, $row);
+  }  
+}
+
+## Private
+
+sub PrintRow {
+  my $self = shift;
+  my $data = shift;
+  my $colWidths = shift;
+  my $row = shift;
+  my $numCols = scalar(@{$data->[$row]});
+  for (my $col = 0; $col < $numCols; ++$col) {
+    my $this = $data->[$row][$col];
+    $this = '<UNDEFINED>' unless defined $this;
+    print $this, ' ' x ($colWidths->[$col] - length($this));
+  }
+  print "\n";
+}
+
+1;
+
+__END__
+
+=head1 NAME
+
+TableFormatter/Text.pm - Formats tables in text
+
+=head1 INTERFACE
+
+=head2 New
+
+Creates a formatter.
+
+=head2 PrintTable 
+
+Prints the table. Two arguments: firstly, a 2D array of the data. Secondly, a Boolean specifying whether the first row is a header row.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Text/Glob.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,187 @@
+# Copyright (C) 2002 Richard Clamp.  All Rights Reserved.
+#
+# This module is free software; you can redistribute it and/or modify it
+# under the same terms as Perl itself.
+
+package Text::Glob;
+use strict;
+use Exporter;
+use vars qw/$VERSION @ISA @EXPORT_OK
+            $strict_leading_dot $strict_wildcard_slash/;
+$VERSION = '0.06';
+@ISA = 'Exporter';
+@EXPORT_OK = qw( glob_to_regex match_glob );
+
+$strict_leading_dot    = 1;
+$strict_wildcard_slash = 1;
+
+use constant debug => 0;
+
+sub glob_to_regex {
+    my $glob = shift;
+    my ($regex, $in_curlies, $escaping);
+    local $_;
+    my $first_byte = 1;
+    for ($glob =~ m/(.)/gs) {
+        if ($first_byte) {
+            if ($strict_leading_dot) {
+                $regex .= '(?=[^\.])' unless $_ eq '.';
+            }
+            $first_byte = 0;
+        }
+        if ($_ eq '/') {
+            $first_byte = 1;
+        }
+        if ($_ eq '.' || $_ eq '(' || $_ eq ')' || $_ eq '|' ||
+            $_ eq '+' || $_ eq '^' || $_ eq '$' ) {
+            $regex .= "\\$_";
+        }
+        elsif ($_ eq '*') {
+            $regex .= $escaping ? "\\*" :
+              $strict_wildcard_slash ? "[^/]*" : ".*";
+        }
+        elsif ($_ eq '?') {
+            $regex .= $escaping ? "\\?" :
+              $strict_wildcard_slash ? "[^/]" : ".";
+        }
+        elsif ($_ eq '{') {
+            $regex .= $escaping ? "\\{" : "(";
+            ++$in_curlies unless $escaping;
+        }
+        elsif ($_ eq '}' && $in_curlies) {
+            $regex .= $escaping ? "}" : ")";
+            --$in_curlies unless $escaping;
+        }
+        elsif ($_ eq ',' && $in_curlies) {
+            $regex .= $escaping ? "," : "|";
+        }
+        elsif ($_ eq "\\") {
+            if ($escaping) {
+                $regex .= "\\\\";
+                $escaping = 0;
+            }
+            else {
+                $escaping = 1;
+            }
+            next;
+        }
+        else {
+            $regex .= $_;
+            $escaping = 0;
+        }
+        $escaping = 0;
+    }
+    print "# $glob $regex\n" if debug;
+    qr/^$regex$/;
+}
+
+sub match_glob {
+    print "# ", join(', ', map { "'$_'" } @_), "\n" if debug;
+    my $glob = shift;
+    my $regex = glob_to_regex $glob;
+    local $_;
+    grep { $_ =~ $regex } @_;
+}
+
+1;
+__END__
+
+=head1 NAME
+
+Text::Glob - match globbing patterns against text
+
+=head1 SYNOPSIS
+
+ use Text::Glob qw( match_glob glob_to_regex );
+
+ print "matched\n" if match_glob( "foo.*", "foo.bar" );
+
+ # prints foo.bar and foo.baz
+ my $regex = glob_to_regex( "foo.*" );
+ for ( qw( foo.bar foo.baz foo bar ) ) {
+     print "matched: $_\n" if /$regex/;
+ }
+
+=head1 DESCRIPTION
+
+Text::Glob implements glob(3) style matching that can be used to match
+against text, rather than fetching names from a filesystem.  If you
+want to do full file globbing use the File::Glob module instead.
+
+=head2 Routines
+
+=over
+
+=item match_glob( $glob, @things_to_test )
+
+Returns the list of things which match the glob from the source list.
+
+=item glob_to_regex( $glob )
+
+Returns a compiled regex which is the equiavlent of the globbing
+pattern.
+
+=back
+
+=head1 SYNTAX
+
+The following metacharacters and rules are respected.
+
+=over
+
+=item C<*> - match zero or more characters
+
+C<a*> matches C<a>, C<aa>, C<aaaa> and many many more.
+
+=item C<?> - match exactly one character
+
+C<a?> matches C<aa>, but not C<a>, or C<aa>
+
+=item Character sets/ranges
+
+C<example.[ch]> matches C<example.c> and C<example.h>
+
+C<demo.[a-c]> matches C<demo.a>, C<demo.b>, and C<demo.c>
+
+=item alternation
+
+C<example.{foo,bar,baz}> matches C<example.foo>, C<example.bar>, and
+C<example.baz>
+
+=item leading . must be explictly matched
+
+C<*.foo> does not match C<.bar.foo>.  For this you must either specify
+the leading . in the glob pattern (C<.*.foo>), or set
+C<$Text::Glob::strict_leading_dot> to a false value while compiling
+the regex.
+
+=item C<*> and C<?> do not match /
+
+C<*.foo> does not match C<bar/baz.foo>.  For this you must either
+explicitly match the / in the glob (C<*/*.foo>), or set
+C<$Text::Glob::strict_wildcard_slash> to a false value with compiling
+the regex.
+
+=back
+
+=head1 BUGS
+
+The code uses qr// to produce compiled regexes, therefore this module
+requires perl version 5.005_03 or newer.
+
+=head1 AUTHOR
+
+Richard Clamp <richardc@unixbeard.net>
+
+=head1 COPYRIGHT
+
+Copyright (C) 2002 Richard Clamp.  All Rights Reserved.
+
+This module is free software; you can redistribute it and/or modify it
+under the same terms as Perl itself.
+
+=head1 SEE ALSO
+
+L<File::Glob>, glob(3)
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/Utils.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1719 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+
+package Utils;
+use base qw(Exporter);
+use strict;
+use Win32;
+use Win32::File;
+use Win32::Console;
+use File::stat;
+use File::Path;
+use File::Basename;
+use File::Find;
+use File::Temp;
+use File::Spec;
+use FindBin;
+use Archive::Zip qw( :ERROR_CODES :CONSTANTS );
+use Cwd 'abs_path';
+use Data::Dumper;
+use Time::Local;
+use IPC::Open2;
+use Cwd;
+use Symbian::IPR;
+
+$|++;
+
+#
+# Constants.
+#
+
+use constant EPOC_RELATIVE => 1;
+use constant SOURCE_RELATIVE => 2;
+use constant MAX_OS_PATH_LENGTH => 255;
+our @EXPORT = qw(EPOC_RELATIVE SOURCE_RELATIVE);
+
+#
+# Globals;
+#
+
+my $console; # Needs to be global because (for some reason) file descriptors get screwed up if it goes out of scope.
+my $tempDir;
+my $haveCheckedEpocRoot;
+my $haveCheckedSrcRoot;
+our %zipFileCache; # used to cache the Archive::Zip object of the last zip file used
+
+#
+# Subs.
+#
+
+sub StripWhiteSpace {
+  my $a = shift;
+  $$a =~ s/^\s*//;
+  $$a =~ s/\s*$//;
+}
+
+sub TidyFileName {
+  my $a = shift;
+  $$a =~ s/\//\\/g;      # Change forward slashes to back slashes.
+  $$a =~ s/\\\.\\/\\/g;  # Change "\.\" into "\".
+
+  if ($$a =~ /^\\\\/) {  # Test for UNC paths.
+    $$a =~ s/\\\\/\\/g;  # Change "\\" into "\".
+    $$a =~ s/^\\/\\\\/;  # Add back a "\\" at the start so that it remains a UNC path.
+  }
+  else {
+    $$a =~ s/\\\\/\\/g;  # Change "\\" into "\".
+  }
+
+  # Colapse '\..\' sequences.
+  my $hasLeadingSlash = $$a =~ s/^\\//;
+  my $hasTrailingSlash = $$a =~ s/\\$//;
+  my @elements = split (/\\/, $$a);
+  my @result; # An array to store the colapsed result in.
+  foreach my $element (@elements) {
+    if ($element eq '..') {
+      my $last = pop @result;
+      if ($last) {
+	if ($last eq '..') { # Throw away the previous element, unless it's another '..'.
+	  push (@result, $last);
+	  push (@result, $element);
+	}
+	next;
+      }
+    }
+    push (@result, $element);
+  }
+  if ($hasLeadingSlash) {
+    $$a = '\\';
+  }
+  else {
+    $$a = '';
+  }
+  $$a .= join ('\\', @result);
+  if ($hasTrailingSlash) {
+    $$a .= '\\';
+  }
+}
+
+sub IsAbsolute {
+  my $path = shift;
+  if ($path =~ /^[\\\/]/) {
+    return 1;
+  }
+  return 0;
+}
+
+sub AbsoluteFileName {
+  my $fileName = shift;
+  (my $base, my $path) = fileparse($$fileName);
+  my $absPath = abs_path($path);
+  $absPath =~ s/^\D://; # Remove drive letter.
+  $$fileName = $absPath;
+  unless ($$fileName =~ /[\\\/]$/) {
+    $$fileName .= "\\";
+  }
+  $$fileName .= $base;
+  TidyFileName($fileName);
+}
+
+sub AbsolutePath {
+  my $path = shift;
+  my $absPath = abs_path($$path);
+  $absPath =~ s/^\D://; # Remove drive letter.
+  $$path = $absPath;
+  TidyFileName($path);
+}
+
+sub EpocRoot {
+  my $epocRoot = $ENV{EPOCROOT};
+  unless ($haveCheckedEpocRoot) {
+    #use Carp qw/cluck/;
+    #cluck "Checking for EpocRoot";
+    die "Error: Must set the EPOCROOT environment variable\n" if (!defined($epocRoot));
+    die "Error: EPOCROOT must not include a drive letter\n" if ($epocRoot =~ /^.:/);
+    die "Error: EPOCROOT must be an absolute path without a drive letter\n" if ($epocRoot !~ /^\\/);
+    die "Error: EPOCROOT must not be a UNC path\n" if ($epocRoot =~ /^\\\\/);
+    die "Error: EPOCROOT must end with a backslash\n" if ($epocRoot !~ /\\$/);
+    die "Error: EPOCROOT must specify an existing directory\n" if (!-d $epocRoot);
+    $haveCheckedEpocRoot = 1;
+  }
+  return $epocRoot;
+}
+
+sub SourceRoot {
+  my $srcRoot = $ENV{SRCROOT};
+  unless ($haveCheckedSrcRoot) {
+    if (defined $srcRoot) { # undefined SRCROOTs are OK
+      die "Error: SRCROOT must not include a drive letter\n" if ($srcRoot =~ /^.:/);
+      die "Error: SRCROOT must be an absolute path without a drive letter\n" if ($srcRoot !~ /^\\/);
+      die "Error: SRCROOT must not be a UNC path\n" if ($srcRoot =~ /^\\\\/);
+      die "Error: SRCROOT must end with a backslash\n" if ($srcRoot !~ /\\$/);
+      die "Error: SRCROOT must specify an existing directory\n" if (!-d $srcRoot);
+    }
+    $haveCheckedSrcRoot = 1;
+  }
+  return $srcRoot || "\\";
+}
+
+sub CheckWithinEpocRoot {
+  my $path = shift;
+  die "Error: \"$path\" is not within EPOCROOT\n" unless (WithinEpocRoot($path));
+}
+
+sub WithinEpocRoot {
+  my $path = shift;
+  my $epocRoot = EpocRoot();
+  return ($path =~ /^\Q$epocRoot\E/i);
+}
+
+sub PrependEpocRoot {
+  my $path = shift;
+  if (EpocRoot() ne "\\") {
+    #use Carp qw/cluck/;
+    #cluck "here";
+    die "Error: EPOCROOT already present in \"$path\"\n" if ($path =~ /^\Q$ENV{EPOCROOT}\E/i);
+  }
+  $path =~ s!^[\\\/]!!; # Remove leading slash.
+  return EpocRoot().$path;
+}
+
+sub RelativeToAbsolutePath {
+	my $path = shift;
+	my $iniData = shift;
+	my $pathType = shift;
+
+	if ( $pathType == SOURCE_RELATIVE ) {
+		if( $iniData->HasMappings() && SourceRoot() eq "\\" ) {
+			$path = $iniData->PerformMapOnFileName( $path );
+		}
+		else{
+			$path = PrependSourceRoot( $path );
+		}
+	}
+	else {
+		$path = PrependEpocRoot( $path );
+	}
+	return $path;
+}
+
+sub RemoveEpocRoot {
+  my $path = shift;
+  unless ($path =~ s/^\Q$ENV{EPOCROOT}\E//i) {
+    die "Error: Path does not contain EPOCROOT - EPOCROOT:\"$ENV{EPOCROOT}\" - Path:\"$path\"\n";
+  }
+  return $path;
+}
+
+sub CheckWithinSourceRoot {
+  my $path = shift;
+  die "Error: \"$path\" is not within SRCROOT\n" unless (WithinSourceRoot($path));
+}
+
+sub WithinSourceRoot {
+  my $path = shift;
+  my $sourceRoot = SourceRoot();
+  return ($path =~ /^\Q$sourceRoot\E/i);
+}
+
+sub PrependSourceRoot {
+  my $path = shift;
+  my $sourceRoot = SourceRoot();
+  if ($sourceRoot ne "\\") {
+    die "Error: SRCROOT already present in \"$path\"\n" if ($path =~ /^\Q$sourceRoot\E/i);
+  }
+
+  $path =~ s!^[\\\/]!!; # Remove leading slash.
+  return SourceRoot() . $path;
+}
+
+sub RemoveSourceRoot {
+  my $path = shift;
+  my $sourceRoot = SourceRoot();
+  unless ($path =~ s/^\Q$sourceRoot\E//i) {
+    die "Error: Couldn't remove \"$sourceRoot\" from \"$path\"\n";
+  }
+  return $path;
+}
+
+sub MakeDir ($) {
+  my $dir = shift;
+  $dir =~ s/\//\\/g; # Convert all forward slashes to back slashes in path.
+  unless (-e $dir) {
+    if ($dir =~ /^\\\\/) {
+      # This is a UNC path - make path manually because UNC isn't supported by mkpath.
+      my $dirToMake = '';
+      my @dirs = split /\\/, $dir;
+      shift @dirs;  # Get rid of undefined dir.
+      shift @dirs;  # Get rid of undefined dir.
+      my $server = shift @dirs;
+      my $share = shift @dirs;
+      $dirToMake .= "\\\\$server\\$share";
+      unless (-e $dirToMake) {
+	die "Error: Network share \"$dirToMake\" does not exist\n";
+      }
+      foreach my $thisDir (@dirs) {
+	$dirToMake .=  "\\$thisDir";
+	unless (-e $dirToMake) {
+	  mkdir($dirToMake,0) or die "Error: Couldn't make directory $dirToMake: $!\n";
+	}
+      }
+    }
+    else {
+      my @warnings;
+      local $SIG{__WARN__} = sub {push @warnings, $!};
+      
+      eval {mkpath($dir)};
+      if (@warnings) {
+        die "Error: Couldn't make path \"$dir\": " . (join ', ', @warnings) . "\n";
+      }
+    }
+  }
+}
+
+sub FileModifiedTime {
+  my $file = shift;
+  my $st = stat($file) or return 0;
+  return TimeMinusDaylightSaving($st->mtime);
+}
+
+sub FileSize {
+  my $file = shift;
+  my $st = stat($file) or return 0;
+  return $st->size;
+}
+
+sub FileModifiedTimeAndSize {
+  my $file = shift;
+  my $st = stat($file) or return 0;
+  return (TimeMinusDaylightSaving($st->mtime), $st->size);
+}
+
+sub TimeMinusDaylightSaving {
+  my $time = shift;
+  (undef, undef, undef, undef, undef, undef, undef, undef, my $isDaylightSaving) = localtime;
+  if ($isDaylightSaving) {
+    $time -= 3600;
+  }
+  return $time;
+}
+
+sub TextTimeToEpochSeconds {
+  my $textTime = shift;
+  $textTime =~ /(\S+) (\S+) {1,2}(\d+) {1,2}(\d+):(\d+):(\d+) {1,2}(\d+)/;
+  my $weekDay = $1;
+  my $month = $2;
+  my $monthDay = $3;
+  my $hours = $4;
+  my $minutes = $5;
+  my $seconds = $6;
+  my $year = $7 - 1900;
+
+  if    ($month eq 'Jan') { $month = 0; }
+  elsif ($month eq 'Feb') { $month = 1; }
+  elsif ($month eq 'Mar') { $month = 2; }
+  elsif ($month eq 'Apr') { $month = 3; }
+  elsif ($month eq 'May') { $month = 4; }
+  elsif ($month eq 'Jun') { $month = 5; }
+  elsif ($month eq 'Jul') { $month = 6; }
+  elsif ($month eq 'Aug') { $month = 7; }
+  elsif ($month eq 'Sep') { $month = 8; }
+  elsif ($month eq 'Oct') { $month = 9; }
+  elsif ($month eq 'Nov') { $month = 10; }
+  elsif ($month eq 'Dec') { $month = 11; }
+
+  return timelocal($seconds, $minutes, $hours, $monthDay, $month, $year);
+}
+
+sub TextDateToEpochSeconds {
+  my $textDate = shift;
+  (my $day, my $month, my $year) = split (/\//, $textDate, 3);
+  unless ($day and $month and $year) {
+    die "Error: Invalid date specification: \"$textDate\"\n";
+  }
+  return timelocal(0, 0, 0, $day, $month - 1, $year - 1900);
+}
+
+sub SetFileReadOnly {
+  my $file = shift;
+  Utils::TidyFileName(\$file);
+  system "attrib +r $file";
+}
+
+sub SetFileWritable {
+  my $file = shift;
+  Utils::TidyFileName(\$file);
+  system "attrib -r $file";
+}
+
+sub SplitFileName {
+  my $fileName = shift;
+  my $path = '';
+  my $base = '';
+  my $ext = '';
+
+  if ($fileName =~ /\\?([^\\]*?)(\.[^\\\.]*)?$/) {
+    $base = $1;
+  }
+  if ($fileName =~ /^(.*\\)/) {
+    $path = $1;
+  }
+  if ($fileName =~ /(\.[^\\\.]*)$/o) {
+    $ext =  $1;
+  }
+
+  unless ($fileName eq "$path$base$ext") {
+    my $prob = ($^V eq "v5.6.0")?" There is a known defect in Perl 5.6.0 which triggers this issue with filenames with two extensions (e.g. .exe.map). Please upgrade to Perl 5.6.1.":"";
+    die "Couldn't parse filename \"$fileName\".$prob";
+  }
+  return ($path, $base, $ext);
+}
+
+sub SplitQuotedString {
+  my $string = shift;
+  my $original = $string;
+  my @output = ();
+  $string =~ s/^\s+//; # Remove leading delimiter if present.
+  while ($string) {
+    if ($string =~ s/^\"(.*?)\"//    # Match and remove next quoted string
+	or $string =~ s/^(.*?)\s+//  # or, match and remove next (but not last) unquoted string
+	or $string =~ s/^(.*)$//) {  # or, match and remove last unquoted string.
+      push (@output, $1);
+      $string =~ s/^\s+//; # Remove delimiter if present.
+    }
+    else {
+      die "Error: Unable to decode string \"$original\"\n";
+    }
+  }
+  return @output;
+}
+
+sub ConcatenateDirNames {
+  my $dir1 = shift;
+  my $dir2 = shift;
+  TidyFileName(\$dir1);
+  TidyFileName(\$dir2);
+  $dir1 =~ s/([^\\]$)/$1\\/;
+  $dir2 =~ s/^\\//;
+  return $dir1.$dir2;
+}
+
+sub FindInPath {
+  my $file = shift;
+  unless (exists $ENV{PATH}) {
+    die "Error: No path environment variable\n";
+  }
+  foreach my $dir (split (/;/, $ENV{PATH})) {
+    if (-e "$dir\\$file") {
+      return "$dir\\$file";
+    }
+  }
+  die "Error: \"$file\" not found in path\n";
+}
+
+sub ReadDir {
+  my $dir = shift;
+  my @dir;
+  opendir(DIR, $dir) or die "Error: Couldn't open directory \"$dir\": $!\n";
+  while (defined(my $file = readdir(DIR))) {
+    next if ($file eq '.' or $file eq '..');
+    push (@dir, $file);
+  }
+  closedir(DIR);
+  return \@dir;
+}
+
+sub ReadGlob {
+  my $glob = shift;
+  (my $path, my $base, my $ext) = SplitFileName($glob);
+  $glob = "$base$ext";
+  $glob =~ s/\./\\\./g; # Escape '.'
+  $glob =~ s/\*/\.\*/g; # '*' -> '.*'
+  $glob =~ s/\?/\./g;   # '?' -> '.'
+  my @entries;
+  foreach my $entry (@{ReadDir($path)}) {
+    if ($entry =~ /$glob/) {
+      push (@entries, "$path$entry");
+    }
+  }
+  return \@entries;
+}
+
+sub ReadDirDescendingDateOrder {
+  my $dir = shift;
+  my $unsortedList = ReadDir($dir);
+  my %mtimeHash;
+  foreach my $entry (@$unsortedList) {
+    my $mTime = FileModifiedTime("$dir\\$entry");
+    while (exists $mtimeHash{$mTime}) {
+      ++$mTime;
+    }
+    $mtimeHash{$mTime} = $entry;
+  }
+  my @dir;
+  foreach my $key (sort { $b <=> $a } keys %mtimeHash) {
+    push (@dir, $mtimeHash{$key});
+  }
+  return \@dir;
+}
+
+sub SignificantDir {
+  my $dir = shift;
+  my $significantSubDirs = FindSignificantSubDirs($dir);
+  my $commonDir = CommonDir($significantSubDirs);
+  return $commonDir;
+}
+
+
+# For a given directory, find which sub-directories contain files (rather than just other sub-directories).
+sub FindSignificantSubDirs {
+  my $dir = shift;
+  my $dirContents = ReadDir($dir);
+  my @files;
+  my @dirs;
+  foreach my $thisEntry (@$dirContents) {
+    if (-f "$dir\\$thisEntry") {
+      push (@files, "$dir\\$thisEntry");
+    }
+    elsif (-d "$dir\\$thisEntry") {
+      push (@dirs, "$dir\\$thisEntry");
+    }
+  }
+  if (scalar @files > 0) {
+    # This directory contains some files, so it is significant.
+    return [$dir];
+  }
+  elsif (scalar @dirs > 0) {
+    # Only sub-directories in this directory, so recurse.
+    my @significantSubDirs;
+    foreach my $thisDir (@dirs) {
+      push (@significantSubDirs, @{FindSignificantSubDirs($thisDir)});
+    }
+    return \@significantSubDirs;
+  }
+  else {
+    # Nothing of interest;
+    return [];
+  }
+}
+
+sub CrossCheckDirs {
+  my $dir1 = shift;
+  my $dir2 = shift;
+  my $matched = CrossCheckDirsOneWay($dir1, $dir2);
+  if ($matched) {
+    $matched = CrossCheckDirsOneWay($dir2, $dir1);
+  }
+  return $matched;
+}
+
+sub CrossCheckDirsOneWay {
+  my $dir1 = shift;
+  my $dir2 = shift;
+
+  my $matched = 1;
+  opendir(DIR1, $dir1) or die "Error: Couldn't open directory $dir1: $!\n";
+  while (defined(my $dir1File = readdir(DIR1))) {
+    next if ($dir1File eq '.' or $dir1File eq '..');
+    $dir1File = "$dir1\\$dir1File";
+    (my $dir1MTime, my $dir1Size) = Utils::FileModifiedTimeAndSize($dir1File);
+    (undef, my $base, my $extension) = Utils::SplitFileName($dir1File);
+    my $dir2File = "$dir2\\$base$extension";
+    if (-e $dir2File) {
+      (my $dir2MTime, my $dir2Size) = Utils::FileModifiedTimeAndSize($dir2File);
+      unless ($dir2MTime == $dir1MTime and $dir2Size == $dir1Size) {
+	print "\"$dir1File\" does not match modified time and size of \"$dir2File\"\n";
+	$matched = 0;
+      }
+    }
+    else {
+      print "\"$dir2File\" not found\n";
+      $matched = 0;
+    }
+  }
+  closedir(DIR1);
+
+  return $matched;
+}
+
+sub ZipSourceList {
+  my $zipName = shift;
+  my $list = shift;
+  my $verbose = shift;
+  my $relativeTo = shift;
+  my $iniData = shift;
+
+  if (scalar(@$list) == 0) {
+    if ($verbose) { print "No files to put into $zipName...\n"; }
+    return;
+  }
+
+  my $dirName = dirname($zipName);
+  unless (-d $dirName) {
+    MakeDir($dirName) || die "ERROR: Unable to create directory.";
+  }
+
+  if ($verbose) { print "Creating $zipName...\n"; }
+
+  my $zip = Archive::Zip->new() or die "ERROR: Unable to create new zip.\n";
+  
+  my $processedDirs = {};
+
+  foreach my $file (@$list) {
+    my $fileToZip = $file;
+    $file = "$relativeTo"."$file";
+
+    if(-f $file) {
+	  # We need to add distribution policy files for each directory
+	  my $dirname = dirname($file);
+	  
+	  if (!exists $processedDirs->{$dirname}) {
+		if (-e File::Spec->catdir($dirname, 'distribution.policy')) {
+		  push @$list, Utils::RemoveSourceRoot(File::Spec->catdir($dirname, 'distribution.policy'));
+		  $processedDirs->{$dirname} = 1;
+		}
+	  }
+	  
+      if($iniData->HasMappings()){
+        $fileToZip = $iniData->PerformReverseMapOnFileName($file);
+        $fileToZip = Utils::RemoveSourceRoot($fileToZip);
+      }
+      my $member = $zip->addFile($file, $fileToZip);
+      if (!defined $member) {
+        die "ERROR: Cannot add file '$file' to new zip.\n";
+      }
+      $member->fileAttributeFormat(FA_MSDOS);
+      my $attr = 0;
+      Win32::File::GetAttributes($file, $attr);
+      $member->{'externalFileAttributes'} |= $attr; # preserve win32 attrs
+    }
+    elsif(-e $file){}
+    else {
+      die "ERROR: $file does not exist, so can not add to $zipName.\n";
+    }
+  }
+
+  # Warning message appears when an error code (which is a non zero) is returned.
+
+  my $returnVal = $zip->writeToFileNamed($zipName);
+
+  if ($returnVal) {
+    die "Error: Failed to write ZIP file '$zipName'\n";
+  }
+}
+
+sub ZipList {
+  my $zipName = shift;
+  my $list = shift;
+  my $verbose = shift;
+  my $noCompress = shift;
+  my $relativeTo = shift;
+
+  if (scalar(@$list) == 0) {
+    if ($verbose) { print "No files to put into $zipName...\n"; }
+    return;
+  }
+
+  my $dirName = dirname($zipName);
+  unless (-e $dirName) {
+    MakeDir($dirName);
+  }
+
+  if ($verbose) { print "Creating $zipName...\n"; }
+
+  my $cwd = Cwd::cwd();
+  if ($relativeTo) {
+    chdir($relativeTo) or die "Error: Couldn't change working directory to \"$relativeTo\": $!\n";
+  }
+
+  my @opts = ('-@');;
+  if ($verbose == 0) {
+    push @opts, '-qq';
+  }
+  elsif ($verbose == 1) {
+    push @opts, '-q';
+  }
+  elsif ($verbose > 1) {
+    push @opts, '-v';
+  }
+  if ($noCompress) {
+    push @opts, '-0';
+  }
+  
+  my $missing = 0;
+  my $retval;
+  my $count = 0;
+  do{
+     open(ZIP, "| \"$FindBin::Bin\\zip\" @opts $zipName") or die "Error: Couldn't execute _zip.exe - $!\n";
+
+     foreach my $file (@$list) {
+       unless (-e $file) {
+         $missing = $file;
+         last;
+       }
+       $file =~ s/\[/\[\[\]/g;
+       print ZIP "$file\n";
+     }
+     close(ZIP);
+     
+     $count ++;
+     $retval = $? >> 8;
+     if (!$missing && $retval > 1){
+       print "Warning: Zipping failed with error code $retval for the $count times.\n";
+     }
+     
+  }while(!$missing && $retval > 1 && $count < 10);
+  
+  if ($relativeTo) {
+    chdir($cwd) or die "Error: Couldn't change working directory back to \"$cwd\": $!\n";
+  }
+
+  if ($missing) {
+    die "Error: \"" . Utils::ConcatenateDirNames($relativeTo, $missing) . "\" does not exist\n";
+  }
+
+  die "Zipping failed with error code $retval\n" if $retval > 1; # 1 is warnings only
+}
+
+# So EnvDb::UnpackBinaries can be called from the test suite, use %INC to find path instead of FindBin::Bin
+sub UnzipPath {
+    my $unzippath;
+    my $envdbpath = $INC{'EnvDb.pm'};
+    if(defined $envdbpath) {
+	# find the unzip binary
+	$envdbpath =~ s/\\/\//g;
+	$envdbpath =~ s/\/[^\/]+$//;
+	$unzippath .= $envdbpath;
+    } else {
+	$unzippath .= $FindBin::Bin;
+    }
+    $unzippath .= "\\unzip";
+    $unzippath = "\"$unzippath\"";
+
+    return $unzippath;
+}
+
+sub UnzipSource {
+  my $zipName = shift;
+  my $destinationPath = shift;
+  my $verbose = shift;
+  my $overwrite = shift;
+  my $iniData = shift;
+  my $toValidate = shift;
+  my $comp = shift;
+  
+  unless(defined $overwrite) {
+    $overwrite = 0;
+  }
+
+  if($verbose) {
+    print "Unpacking ";
+    if($overwrite) {
+      print "[in overwrite mode] ";
+    }
+    print "$zipName...\n";
+  }
+
+  my $catInArchive;
+  my $changeInCat = 0;
+  my $fileDirBuffer;
+
+  # Sets $catInArchive to the category found on the source zip.
+  if($toValidate==1 && $zipName =~ /source(.*).zip/){
+    $catInArchive = $1;
+  }
+
+  my $zip = Archive::Zip->new($zipName);
+  my @members = $zip->members();
+
+  # Only print warning message if validation is not being performed, destination path is \\ and verbose is set.
+
+  if($toValidate==0 && $destinationPath ne "\\" && $verbose) {
+    print "Warning: Ignoring all mappings defined since either source path or SRCROOT is set as $destinationPath.\n";
+  }
+
+  foreach my $member (@members) {
+
+    my $fileName = $member->fileName();
+
+    $fileName =~ s/\//\\/g;
+
+    if($fileName !~ /^\\/) {
+      $fileName = "\\$fileName";
+    }
+
+    $iniData->CheckFileNameForMappingClash($fileName);
+
+    my $newFileName;
+
+    # PerfromMapOnFileName is only used for an validation and if the destintionPath is \\.
+
+    if($toValidate==1 || $destinationPath eq "\\") {
+      $newFileName = $iniData->PerformMapOnFileName($fileName);
+    }
+    else {
+      $newFileName = $fileName;
+    }
+
+    # Check if the category has changed. Only occurs for validation.
+    if(defined $catInArchive && -e $newFileName && $toValidate==1) {
+      my $fileDir;
+      my $classifySourceFlag = 1; # Classify source using function ClassifySourceFile only if set as 1 and not when set as 0;
+
+      if(defined $fileDirBuffer) {
+        ($fileDir) = SplitFileName($newFileName);
+
+        if($fileDirBuffer =~ /^\Q$fileDir\E$/i){
+          $classifySourceFlag = 0;
+        }
+      }
+
+      if($classifySourceFlag){
+        my ($catInEnv, $errors) = ClassifyPath($iniData, $newFileName, 0, 0, $comp); # verbose = 0 and logErrors = 0
+        if($catInArchive !~ /$catInEnv/i){
+          $changeInCat = 1;
+        }
+        ($fileDirBuffer) = SplitFileName($newFileName);
+      }
+    }
+    ExtractFile($destinationPath, $newFileName, $member, $toValidate, $overwrite, $verbose);
+  }
+
+  return $changeInCat;
+}
+
+
+sub ExtractFile {
+  my $destinationPath = shift;
+  my $newFileName = shift;
+  my $member = shift;
+  my $toValidate = shift;
+  my $overwrite = shift;
+  my $verbose = shift;
+  my $unzipRetVal = shift; # The return value from unzip if it has already been tried
+  my $extractFlag = 0;
+  
+  my $attr;
+
+  # If the file is a distribution.policy file then set the overwrite flag to true
+  if ($newFileName =~ /distribution\.policy/i) {
+	$overwrite = 1;
+  }
+
+  # If extracting file for validation or destination path is not equal to \\ unzip file to $destinationPath.
+
+  if($toValidate==1 || $destinationPath ne "\\") {
+    $newFileName = File::Spec->catfile($destinationPath, $newFileName);
+  }
+
+  CheckPathLength($newFileName);
+
+  # If the file exists need to check if file is to be overwritten.
+
+  if(-f $newFileName) {
+    if($overwrite) {
+      if((Win32::File::GetAttributes($newFileName, $attr)) && ($attr & HIDDEN)){
+      	Win32::File::SetAttributes($newFileName, ARCHIVE|NORMAL) || die "ERROR: Unable to overwrite the hidden file $newFileName: $!";
+	  }
+	  elsif(!-w $newFileName){
+        chmod(0777,$newFileName) || die "ERROR: Unable to overwrite the read-only file $newFileName: $!";
+      }
+      $extractFlag = 1;
+    }
+    else {
+      if($verbose) {
+        print "Ignoring the file $newFileName, as this is already present.\n";
+      }
+    }
+  }
+  else{
+    $extractFlag = 1;
+  }
+
+  if($extractFlag){
+    {
+      #DEF122018
+      # Invalid paths will cause Archive::Zip to give an error.  We capture the error and re-format it.
+      my @warnings;
+      local $SIG{__WARN__} = sub {
+        push @warnings, $!;
+      };
+      
+      eval { mkpath(dirname($newFileName)) };
+  
+      if (@warnings) {
+        die "Error: Unable to make the directory \"$newFileName\": " . (join "\n", @warnings) . "\n";
+      }
+    }
+
+    # A non-zero is returned if there is a problem with extractToFileNamed().
+    if($member->extractToFileNamed($newFileName)) {
+      warn "ERROR: Failed to extract $newFileName.\n";
+      CheckUnzipError($unzipRetVal);
+      die;
+    }
+    utime($member->lastModTime(), $member->lastModTime(), $newFileName);
+    my $newattr = $member->externalFileAttributes() & 0xFFFF;
+    Win32::File::SetAttributes($newFileName, $newattr); # reapply win32 attrs
+  }
+}
+
+sub Unzip {
+  my $zipName = shift;
+  my $destinationPath = shift;
+  my $verbose = shift;
+  my $overwrite = shift || '';
+  
+  $overwrite = '-o' if $overwrite eq '1'; # Some callers to this method may send a boolean value rather then an unzip option
+  
+  if ($verbose) {
+    print "Unpacking ";
+    if ($overwrite) {
+      print "[in overwrite mode] ";
+    }
+    print "$zipName...\n";
+  }
+
+  my $v;
+  if ($verbose == 0) {
+    $v = "-qq";
+  }
+  elsif ($verbose == 1) {
+    $v = "-q";
+  }
+  if ($verbose > 1) {
+    $v = "";
+  }
+
+  # Here we check that the files in the zip file are not so long they can not be unpacked
+  my $zip = Archive::Zip->new($zipName);
+  my @members = $zip->members();
+
+  foreach my $member (@members) {
+    my $fileName = File::Spec->catdir('\.', $destinationPath, $member->fileName());
+    CheckPathLength($fileName);
+  }
+
+  MakeDir($destinationPath);
+  
+  # prepare command
+  my $cmd = "unzip $overwrite $v $zipName -d $destinationPath 2>&1";
+  
+  # run $cmd, fetching io handles for it
+  my $pid = open2(\*IN, \*OUT, $cmd);
+  
+  # one character per read
+  local $/ = \1;
+  
+  # command output line buffer
+  my $line = '';
+  
+  while (<IN>) {
+    # accumulate line data
+    $line .= $_;
+    
+    # look for expected output
+    if ($line =~ /^(?:(replace).*\[r\]ename|new name): $/) {
+      # dump line buffer so user can read prompt
+      print $line and $line = '';
+      
+      # read whole lines for user response
+      local $/ = "\n";
+      
+      # read user's response
+      chomp(my $response = <STDIN>);
+      
+      if (defined $1) { # matched "replace"
+	# set overwrite mode if the user chooses to replace [A]ll
+	$overwrite = '-o' if $response =~ /^A/;
+	
+	# set no-overwrite mode if the user chooses to replace [N]one
+	$overwrite = '-n' if $response =~ /^N/;
+      }
+      
+      # convey response to the command
+      print OUT "$response\n";
+    }
+    
+    # dump line buffer at EOL
+    print $line and $line = '' if $line =~ /\n$/;
+  }
+  
+  close (OUT);
+  close (IN);
+  
+  waitpid($pid,0);
+
+  CheckUnzipError($?);  
+  
+  return $overwrite;
+}
+
+sub CheckUnzipError {
+  my $retval = shift;
+  $retval = $retval >> 8;
+  # Error numbers found in unzip (Info-ZIP) source code: there doesn't
+  # seem to be a manual. Common with return values from PKZIP so
+  # unlikely to change
+  # Error 1 is just a warning, so we only care about those > 1
+  die "Unzip reported an out-of-memory error ($retval)\n" if ($retval>3 && $retval<9);
+  die "Unzip reported a problem with the zip file ($retval)\n" if ($retval>1 && $retval<4);
+  die "Unzip reported disk full (though this might mean it's trying to overwrite files in use) ($retval)\n" if ($retval==50);
+  die "Unzip reported error code ($retval)" if ($retval>1 && $retval<52);
+  warn "Warning: Unzip returned an unexpected error code ($retval)\n" if ($retval >51)
+}
+
+sub UnzipSingleFile {
+  my $zipName = shift;
+  my $file = shift;
+  my $destinationPath = shift;
+  my $verbose = shift;
+  my $overwrite = shift;
+  my $comp = shift;
+  
+  unless (defined $overwrite) {
+    $overwrite = 0;
+  }
+
+  if ($verbose) {
+    print "Unpacking ";
+    if ($overwrite) {
+      print "[in overwrite mode] ";
+    }
+    print "\"$file\" from \"$zipName\"...\n";
+  }
+
+
+  my $v;
+  if ($verbose == 0) {
+    $v = "-qq";
+  }
+  elsif ($verbose == 1) {
+    $v = "-q";
+  }
+  if ($verbose > 1) {
+    $v = "";
+  }
+
+  my $o = "";
+  if ($overwrite) {
+    $o = "-o";
+  }
+
+  MakeDir($destinationPath);
+  my $retval = system(UnzipPath()." $o $v \"$zipName\" \"$file\" -d \"$destinationPath\"");
+
+  unless (-e ConcatenateDirNames($destinationPath, $file)) {
+    #Fallback to using archive::zip
+    print "Unable to extract $file using unzip. Trying alternative extraction method...\n";
+    
+    my $zip = GetArchiveZipObject($zipName, $comp);
+
+    my $fileWithForwardSlashes = $file;
+    $fileWithForwardSlashes =~ s/\\/\//g; # Archive::Zip stores file names with forward slashes
+  
+    my $member = $zip->memberNamed($fileWithForwardSlashes);
+    
+    if (!defined $member) {
+      # Archive::Zip is also case-sensitive.  If it doesn't find the required file we compile the filename into
+      # a case insensitive regex and try again.  This takes longer than just calling memberNamed.
+      my $fileNameRegEx = qr/$fileWithForwardSlashes/i;
+      ($member) = $zip->membersMatching($fileNameRegEx);
+      
+      # If it still can't find the file then it doesn't exist in the zip file
+      if (!defined $member) {
+        warn "Unable to find $file in $zipName\n";
+        CheckUnzipError($retval);
+        die;
+      }
+    }
+  
+    ExtractFile($destinationPath, $file, $member, 0, $overwrite, $verbose, $retval);
+    print "Successfully extracted $file\n";
+  }
+}
+
+sub ListZip {
+  my $zipName = shift;
+  my @list;
+
+  my $zipper = Archive::Zip->new();
+  unless ($zipper->read($zipName) == AZ_OK) {
+    die "Error: problem reading \"$zipName\"\n";
+  }
+
+  my @members = $zipper->members();
+  foreach my $thisMember (@members) {
+    my $file = $thisMember->fileName();
+    TidyFileName(\$file);
+    unless ($file =~ /^\\/) {
+      $file = "\\$file";
+    }
+    push (@list, $file);
+  }
+
+  return \@list;
+}
+
+sub CheckZipFileContentsNotPresent {
+  my $zipName = shift;
+  my $where = shift;
+  my $iniData = shift;
+  my $checkFailed = 0;
+  foreach my $thisFile (@{ListZip($zipName)}) {
+    if ($thisFile =~ /\\$/) {
+      next;
+    }
+    my $fullName = ConcatenateDirNames($where, $thisFile);
+
+    if($iniData->HasMappings()){
+      $fullName = $iniData->PerformMapOnFileName($fullName);
+    }
+
+	if ($fullName =~ /distribution\.policy$/i) {
+	  return $checkFailed;
+	}
+
+    if (-e $fullName) {
+      print "Error: \"$fullName\" would be overwritten by unpacking \"$zipName\"\n";
+      $checkFailed = 1;
+    }
+  }
+  return $checkFailed;
+}
+
+sub SignificantZipDir {
+  my $zipName = shift;
+
+  my $zipper = Archive::Zip->new();
+  unless ($zipper->read($zipName) == AZ_OK) {
+    die "Error: problem reading \"$zipName\"\n";
+  }
+
+  my %dirs;
+  my @members = $zipper->members();
+  foreach my $thisMember (@members) {
+    my $file = $thisMember->fileName();
+    my $dir = lc(dirname($file));
+    TidyFileName(\$dir);
+    unless (exists $dirs{$dir}) {
+      $dirs{$dir} = 1;
+    }
+  }
+
+  my @dirs = sort keys %dirs;
+  return CommonDir(\@dirs);
+}
+
+# Given an array of directories, find the common directory they share.
+sub CommonDir {
+  my $dirs = shift;
+  my $disectedDirs = DisectDirs($dirs);
+  my $numDirs = scalar @$dirs;
+  if ($numDirs == 1) {
+	# if there is only one signifigant directory then this has to be
+	# the common one so return it.
+	return $dirs->[0];
+  }
+  my $commonDir = '';
+  my $dirLevel = 0;
+  while (1) {
+    my $toMatch;
+    my $allMatch = 0;
+    for (my $ii = 0; $ii < $numDirs; ++$ii, ++$allMatch) {
+      if ($dirLevel >= scalar @{$disectedDirs->[$ii]}) {
+        $allMatch = 0;
+        last;
+      }
+      if (not $toMatch) {
+        $toMatch = $disectedDirs->[0][$dirLevel];
+      }
+      elsif ($disectedDirs->[$ii][$dirLevel] ne $toMatch) {
+        $allMatch = 0;
+        last;
+      }
+    }
+    if ($allMatch) {
+      if ($toMatch =~ /^[a-zA-Z]:/) {
+        $commonDir .= $toMatch;
+      }
+      else {
+        $commonDir .= "\\$toMatch";
+      }
+      ++$dirLevel;
+    }
+    else {
+      last;
+    }
+  }
+  return $commonDir;
+}
+
+sub DisectDirs {
+  my $dirs = shift;
+  my $disectedDirs;
+  my $numDirs = scalar @$dirs;
+  for (my $ii = 0; $ii < $numDirs; ++$ii) {
+    my $thisDir = $dirs->[$ii];
+    $thisDir =~ s/^\\//; # Remove leading backslash to avoid first array entry being empty.
+    my @thisDisectedDir = split(/\\/, $thisDir);
+    push (@$disectedDirs, \@thisDisectedDir);
+  }
+  return $disectedDirs;
+}
+
+sub CheckExists {
+  my $file = shift;
+  unless (-e $file) {
+    die "Error: $file does not exist\n";
+  }
+}
+
+sub CheckIsFile {
+  my $file = shift;
+  unless (-f $file) {
+    die "Error: $file is not a file\n";
+  }
+}
+
+sub CurrentDriveLetter {
+  my $drive = Win32::GetCwd();
+  $drive =~ s/^(\D:).*/$1/;
+  return $drive;
+}
+
+sub InitialiseTempDir {
+  my $iniData = shift;
+  
+  if (defined $iniData->TempDir) {
+    $tempDir = mkdtemp($iniData->TempDir().'\_XXXX');
+  }
+  else {
+    my $fstempdir = File::Spec->tmpdir;
+    $fstempdir =~ s/[\\\/]$//;
+    $tempDir = mkdtemp($fstempdir.'\_XXXX');
+  }
+  
+  die "Error: Problem creating temporary directory \"$tempDir\": $!\n" if (!$tempDir);
+}
+
+sub RemoveTempDir {
+  die unless $tempDir;
+  rmtree $tempDir or die "Error: Problem emptying temporary directory \"$tempDir\": $!\n";
+  undef $tempDir;
+}
+
+sub TempDir {
+  die unless $tempDir;
+  return $tempDir;
+}
+
+sub ToolsVersion {
+  my $relPath = shift;
+  unless (defined $relPath) {
+    $relPath = '';
+  }
+  my $file = "$FindBin::Bin/$relPath" . 'version.txt';
+  open (VER, $file) or die "Error: Couldn't open \"$file\": $!\n";
+  my $ver = <VER>;
+  chomp $ver;
+  close (VER);
+  return $ver;
+}
+
+sub QueryPassword {
+  unless ($console) {
+    $console = Win32::Console->new(STD_INPUT_HANDLE);
+  }
+  my $origMode = $console->Mode();
+  $console->Mode(ENABLE_PROCESSED_INPUT);
+  my $pw = '';
+  my $notFinished = 1;
+  while ($notFinished) {
+    my $char = $console->InputChar();
+    if ($char and $char eq "\r") {
+      print "\n";
+      $notFinished = 0;
+    }
+    elsif ($char and $char eq "\b") {
+      if ($pw) {
+	$pw =~ s/.$//;
+	print "\b \b";
+      }
+    }
+    else {
+      $pw .= $char;
+      print '*';
+    }
+  }
+  $console->Mode($origMode);
+  return $pw;
+}
+
+sub PrintDeathMessage {
+  my $exitCode = shift;
+  my $msg = shift;
+  my $relPath = shift;
+  
+  my $ver = ToolsVersion($relPath);
+  print "$msg\nLPD Release Tools version $ver\n";
+  exit $exitCode;
+}
+
+sub PrintTable {
+  my $data = shift;
+  my $doHeading = shift;
+
+  require IniData;
+  my $iniData = New IniData;
+  my $tf = $iniData->TableFormatter;
+  $tf->PrintTable($data, $doHeading);
+}
+
+sub QueryUnsupportedTool {
+  my $warning = shift; # optional
+  my $reallyrun = shift; # optional - value of a '-f' (force) flag or similar
+  return if $reallyrun;
+
+  $warning ||= <<GUILTY;
+Warning: this tool is unsupported and experimental. You may use it, but there
+may be defects. Use at your own risk, and if you find a problem, please report
+it to us. Do you want to continue? (y/n)
+GUILTY
+
+  print $warning."\n";
+  my $resp = <STDIN>;
+  chomp $resp;
+  die "Cancelled. You typed \"$resp\".\n" unless $resp =~ m/^y/i;
+}
+
+sub CompareVers($$) {
+  my ($version1, $version2) = @_;
+
+  # New format or old format?
+  my $style1 = (($version1 =~ /^(\d+\.\d+)/) and ($1 >= 2.8));
+  my $style2 = (($version2 =~ /^(\d+\.\d+)/) and ($1 >= 2.8));
+
+  # Validate version strings
+  if ($style1 == 1) {
+    $version1 = ValidateNewFormatVersion($version1);
+  } else {
+    ValidateOldFormatVersion($version1);
+  }
+
+  if ($style2 == 1) {
+    $version2 = ValidateNewFormatVersion($version2);
+  } else {
+    ValidateOldFormatVersion($version2);
+  }
+
+  # Compare version strings
+  if ($style1 != $style2) {
+    return $style1-$style2; # New format always beats old format
+  } else  {
+    return CompareVerFragment($version1, $version2);
+  }
+}
+
+sub ValidateOldFormatVersion($) {
+  my ($version) = @_;
+
+  if (($version !~ /^\d[\.\d]*$/) or ($version !~ /\d$/)) {
+    die "Error: $version is not a valid version number\n";
+  }
+  
+  return $version;
+}
+
+sub ValidateNewFormatVersion($) {
+  my ($version) = @_;
+  
+  my $ver; 
+  if ($version !~ /^(\d+\.\d+)\.(.+)$/) {
+    die "Error: $version is not a valid version number; patch number must be given\n";
+  } else {
+    $ver = $1;
+    my $patch = $2;
+    
+    if (($patch =~ /^\d*$/) and ($patch > 9999)) {
+      die "Error: Version number $version has an invalid patch number\n";
+      
+    } elsif ($patch =~ /\./) {
+      die "Error: Version number $version has an invalid patch number\n";
+      
+    }
+  }
+  
+  return $ver; # Return significant version number only
+}
+
+sub CompareVerFragment($$) {
+  # 1.xxx = 01.xxx, while .1.xxx = .10.xxx
+  my ($frag1, $frag2) = @_;
+
+  my $isfrag1 = defined($frag1) ? 1 : 0;
+  my $isfrag2 = defined($frag2) ? 1 : 0;
+
+  my $compare;
+
+  if ($isfrag1 and $isfrag2) {
+    my ($rest1, $rest2);
+
+    $frag1=~s/^(\.?\d+)(\..*)$/$1/ and $rest1=$2; # If pattern fails, $rest1 is undef
+    $frag2=~s/^(\.?\d+)(\..*)$/$1/ and $rest2=$2;
+
+    $compare = $frag1-$frag2; # Numeric comparison: .1=.10 but .1>.01
+
+    if ($compare == 0) {
+      $compare = &CompareVerFragment($rest1, $rest2);
+    }
+  }
+  else {
+    $compare = $isfrag1-$isfrag2;
+  }
+  return $compare;
+}
+
+sub ClassifyPath {
+  my $iniData = shift;
+  my $path = shift;
+  if (!WithinSourceRoot($path)){
+   $path = Utils::PrependSourceRoot($path);
+  }
+  my $verbose = shift;
+  my $logDistributionPolicyErrors = shift; # 0 = no, 1 = yes
+  my $component = shift;
+
+  if ($verbose) {
+    print "Finding category of source file $path...\n";
+  }
+  
+  Utils::TidyFileName(\$path);
+  
+  my $cat = '';
+  my $errors = [];
+  
+  my $symbianIPR = Symbian::IPR->instance($iniData->UseDistributionPolicyFilesFirst(), $iniData->DisallowUnclassifiedSource(), 'MRPDATA', $verbose, $logDistributionPolicyErrors);
+  $symbianIPR->PrepareInformationForComponent($component);
+  eval {($cat, $errors) = $symbianIPR->Category($path)};
+  
+  if ($@) {
+    print $@;
+  }
+
+  if (uc $cat eq "X" and $iniData->DisallowUnclassifiedSource()) {
+    die "Error: \"$path\" contains unclassified source code\n";
+  }
+
+  if ($verbose) {
+    print "ClassifySource for $path: returning cat $cat";
+    if (scalar (@$errors) > 0) {
+      print " and errors @$errors";
+    }
+    print "\n";
+  }
+  
+  return uc($cat), $errors; # copy of $errors
+}
+
+sub ClassifyDir {
+  return ClassifyPath(IniData->New(), @_);  
+}
+
+sub ClassifySourceFile {
+  return ClassifyPath(@_);
+}
+
+sub CheckForUnicodeCharacters {
+  my $filename = shift;
+  
+  # Unicode characters in filenames are converted to ?'s 
+  $filename =~ /\?/ ? return 1 : return 0; 
+}
+
+sub CheckIllegalVolume {
+  my $iniData = shift;
+  
+  my ($volume) = File::Spec->splitpath(cwd());
+  $volume =~ s/://; # remove any : from $volume
+  
+  # Check that the environment is not on an illegal volume - INC105548
+  if (grep /$volume/i, $iniData->IllegalWorkspaceVolumes()) {
+    die "Error: Development is not permitted on an excluded volume: " . (join ',', $iniData->IllegalWorkspaceVolumes()) . "\n";
+  }
+}
+sub ListAllFiles {
+  my $directory = shift;
+  my $list = shift;
+  find(sub { push @{$list}, $File::Find::name if (! -d);}, $directory);
+}
+
+sub CheckPathLength {
+  my $path = shift;
+
+  if (length($path) > MAX_OS_PATH_LENGTH) {
+    my $extraMessage = '';
+    
+    if ($tempDir && $path =~ /^\Q$tempDir\E/) {
+      $extraMessage = "\nThe folder you are extracting to is under your temp folder \"$tempDir\". Try reducing the size of your temp folder by using the temp_dir <folder> keyword in your reltools.ini file.";
+    }
+    
+    die "Error: The path \"$path\" contains too many characters and can not be extracted.$extraMessage\n"; 
+  }  
+}
+
+sub GetArchiveZipObject {
+  my $zipName = shift;
+  my $comp = lc(shift);
+  
+  my $zip;
+  
+  if ($comp) { # If $comp is defined then we need to cache Archive::Zip objects by component
+    if (exists $zipFileCache{$comp}) {
+      if (defined $zipFileCache{$comp}->{$zipName}) {
+        $zip = $zipFileCache{$comp}->{$zipName};
+      }
+      else {
+	$zip = Archive::Zip->new($zipName);
+	$zipFileCache{$comp}->{$zipName} = $zip;
+      }
+    }
+    else { # New component
+      %zipFileCache = (); # Delete the cache as it is no longer required
+      $zip = Archive::Zip->new($zipName);
+      $zipFileCache{$comp}->{$zipName} = $zip;
+    }
+  }
+  else {
+    $zip = Archive::Zip->new($zipName);
+  }
+  
+  return $zip;
+}
+
+sub CheckDirectoryName {
+  my $dirName = shift;
+  
+  my @dirParts = split /[\\\/]/, $dirName;
+  
+  foreach my $dirPart (@dirParts) {
+    next if ($dirPart =~ /^\w:$/ && $dirName =~ /^$dirPart/);
+    
+    if ($dirPart =~ /[:\?\*\"\<\>\|]/) {
+      die "Error: The directory \"$dirName\" can not contain the characters ? * : \" < > or |\n";
+    }
+  }
+}
+
+
+1;
+
+__END__
+
+=head1 NAME
+
+Utils.pm - General utility functions.
+
+=head1 INTERFACE
+
+=head2 StripWhiteSpace
+
+Expects a reference to a string. Strips white space off either end of the string.
+
+=head2 TidyFileName
+
+Expects a reference to a string. Changes any forward slashes to back slashes. Also changes "\.\" and "\\" to "\" (preserving the "\\" at the start of UNC paths). This is necessary to allow effective comparison of file names.
+
+=head2 AbsoluteFileName
+
+Expects a reference to a string containing a file name. Modifies the string to contain the corresponding absolute path version of the file name (without the drive letter). For example, the string ".\test.txt" would generate a return value of "\mydir\test.txt", assuming the current directory is "\mydir".
+
+=head2 AbsolutePath
+
+Expects a reference to a string containing a path. Modifies the string to contain the corresponding absolute path (without the drive letter).
+
+=head2 FileModifiedTime
+
+Expects a filename, returns C<stat>'s last modified time. If there's a problem getting the stats for the file, an C<mtime> of zero is returned.
+
+=head2 FileSize
+
+Expects a filename, returns the file's size.
+
+=head2 FileModifiedTimeAndSize
+
+Expects a filename. Returns a list containing the file's last modified time and size.
+
+=head2 SetFileReadOnly
+
+Expects to be passed a file name. Sets the file's read only flag.
+
+=head2 SetFileWritable
+
+Expects to be passed a file name. Clear the file's read only flag.
+
+=head2 SplitFileName
+
+Expects to be passed a file name. Splits this into path, base and extension variables (returned as a list in that order). For example the file name C<\mypath\mybase.myextension> would be split into C<mypath>, C<mybase> and C<.myextension>. An empty string will be returned for segments that don't exist.
+
+=head2 SplitQuotedString
+
+Expects to be passed a string. Splits this string on whitespace, ignoring whitespace between quote (C<">) characters. Returns an array containing the split values.
+
+=head2 ConcatenateDirNames
+
+Expects to be passed a pair of directory names. Returns a string that contains the two directory names joined together. Ensures that there is one (and only one) back slash character between the two directory names.
+
+=head2 MakeDir
+
+Expects to be passed a directory name. Makes all the directories specified. Can copy with UNC and DOS style drive letter paths.
+
+=head2 ReadDir
+
+Expects to be passed a directory name. Returns an array of file names found within the specified directory.
+
+=head2 ReadGlob
+
+Expects to be passed a scalar containing a file name. The file name path may relative or absolute. The file specification may contains C<*> and/or C<?> characters. Returns a reference to an array of file names that match the file specification.
+
+=head2 SignificantDir
+
+Expects to be passed a directory name. Returns the name of the deepest sub-directory that contains all files.
+
+=head2 CrossCheckDirs
+
+Expects to be passed a pair of directory names. Checks that the contents of the directories are identical as regards file names, their last modified times and their size. Returns false if any checks fail, otherwise true.
+
+=head2 ZipList
+
+Expects to be passed a zip filename and a reference to a list of file to be put into the zip file. The zip filename may contain a full path - missing directories will be created if necessary.
+
+=head2 Unzip
+
+Expects to be passed a zip filename, a destination path, a verbosity level, and optionally a flag indicating whether exisitng files should be overwritten or not. Unpacks the named zip file in the specified directory.
+
+=head2 UnzipSingleFile
+
+Expects to be passed a zip filename, a filename to unpack, a destination path, a verbosity level, and optionally a flag indicating whether existing files should be overwritten or not. Unpacks only the specified file from the zip file into the specified directory.
+
+=head2 ListZip
+
+Expects to be passed a zip filename. Returns a reference to a list containing the names of the files contained in the zip file.
+
+=head2 CheckZipFileContentsNotPresent
+
+Expects to be passed a zip filename and a destination path. Prints errors to C<STDOUT> for each file contained within the zip that would overwrite an existing file in the destination path. Returns true if any errors were printed, false otherwise.
+
+=head2 SignificantZipDir
+
+Expects to be passed a zip filename. Returns the name of the deepest sub-directory that contains all the files within the zip.
+
+=head2 CheckExists
+
+Expects to be passed a filename. Dies if the file is not present.
+
+=head2 CheckIsFile
+
+Expects to be passed a filename. Dies if the filename isn't a file.
+
+=head2 CurrentDriveLetter
+
+Returns a string containing the current drive letter and a colon.
+
+=head2 InitialiseTempDir
+
+Creates an empty temporary directory.
+
+=head2 RemoveTempDir
+
+Removes the temporary directory (recursively removing any other directories contained within it).
+
+=head2 ToolsVersion
+
+Returns the current version of the release tools. This is read from the file F<version.txt> in the directory the release tools are running from.
+
+=head2 QueryPassword
+
+Displays the user's input as '*' characters. Returns the password.
+
+=head2 PrintDeathMessage
+
+Expects to be passed a message. Dies with the message plus details of the current tools version.
+
+=head2 PrintTable
+
+Expects to be passed a reference to a two dimentional array (a reference to an array (the rows) of referrences to arrays (the columns)). May optionally be passed a flag requesting that a line break be put between the first and second rows (useful to emphasise headings). Prints the data in a left justified table.
+
+=head2 TextTimeToEpochSeconds
+
+Convert a human readable time/date string in the format generated by C<scalar localtime> into the equivalent number of epoch seconds.
+
+=head2 TextDateToEpochSeconds
+
+Convert a date string in the format C<dd/mm/yyyy> into the equivalent number of epoc seconds.
+
+=head2 QueryUnsupportedTool
+
+Warns the user that the tool is unsupported, and asks whether they wish to continue. Takes two parameters, both optional. The first is the text to display (instead of a default). It must finish with an instruction asking the user to type y/n. The second is an optional flag for a 'force' parameter.
+
+=head2 CompareVers
+
+Takes two version numbers in the form of a dot separated list of numbers (e.g 2.05.502) and compares them, returning 0 if they are equivalent, more than 0 if the first version given is greater or less than 0 if the first version is lesser. Dies if versions are not of the required format.
+
+=head2 CompareVerFragment
+
+The main code behind C<CompareVers()>. This is not meant to be called directly because it assumes version numbers only consist of numbers and dots.
+
+=head2 ZipSourceList
+
+Expects to be passed a zip filename and a reference to a list of source files to be put into the zip file.
+
+=head2 UnzipSource
+
+Expects to be passed a source zip filename, a destination path, a verbosity level, a flag indicating whether existing files should be overwritten or not, an inidata and a flag indicating whether this operation is for a validation or not. Unpacks the named source zip file to the specified directory. If for validation, a check for change in category occurs. Returns a change in category flag, when flag is 1 a change in category has been found.
+
+=head2 ExtractFile
+
+Expects to be passed a destination path, a file name, a member and a flag indicating whether existing files should be overwritten or not. Is used to extract a file from a zip file to a specified location.
+
+=head2 ClassifySourceFile
+
+Expects to be passed an iniData, a source filename, a verbosity level, and log error flag. Is used to calculate the category of the source file passed. Returns the category calculated.
+
+=head2 ListAllFiles
+
+Expects to be passed a directory path and an array reference. Lists all files from the directory specified and sub directories into an array reference. Entries in the array contain full path of the file, not just file name.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ValidateEnv	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,143 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'ValidateEnv');
+my $verbose = 0;
+my $validatesource = 0;
+my $fullbincheck = 0;
+my $comp;
+my $ver;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+ValidateEnv();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "s" => \$validatesource, "f" => \$fullbincheck);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: validateenv [options] [<component> <version>]
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-s  validate source code too
+-f  fully check for added binaries (can be very slow)\n");
+}
+
+sub ValidateEnv {
+  my $iniData = IniData->New();
+  my $envDb = EnvDb->Open($iniData, $verbose);
+  my $failedMrps = $envDb->ValidateEnv($comp, $ver, $validatesource, $fullbincheck);
+  my $numFailedMrps = scalar(@$failedMrps);
+  unless ($numFailedMrps == 0) {
+    print "\nThe following component(s) failed their validation:\n\n";
+    foreach my $mrp (@$failedMrps) {
+      print "$mrp\n";
+    }
+    print "\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ValidateEnv - Validates the integrity of all the binaries in the current environment.
+
+=head1 SYNOPSIS
+
+  validateenv [options] [<component> <version>]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -s  also validate source code
+  -f  fully check for added binaries
+
+=head1 DESCRIPTION
+
+C<ValidateEnv> is intended to be used on a drive that contains the output of a clean build. It is assumed that the drive has been populated using C<GetRel> or C<GetEnv>. This is important since C<ValidateEnv> needs to know the version of each component installed on the drive - it gets this information from the drive's environment Database. Its role is to establish the status of each component by comparing the released binary files against those present in the current environment. The comparison is done using the tool C<EValid> which ignores irrelevant differences (such as those in header blocks). Components with a status of I<pending release> will be ignored. Components that pass their validation will have their status set to I<clean> and a new signature file written. Components that fail their validation will have their status set to I<dirty>.
+
+You may also give a -s flag to indicate that you want to validate the source code. This is useful because in some cases the source code may change, without the binary files changing. (For example, a change of distrubution.policy). If this validation fails, but the binary validation succeeds, the status will be set to I<binaries clean, source dirty>. Only source code in the release packet will be validated - source files missing from the release packets will not be detected.
+
+By default C<ValidateEnv> validates against the component version installed in current environment, however instead you can specify a different environment by referring to the component and version of it. This can only be done if the current environment database is empty. This facility was designed to allow builds delivered without using the release tools to be analysed and subsequently delivered using the release tools. It effectively allows you to construct an environment database by comparing the binaries on the current drive with another environment. Components that pass the validation will have their status set to clean and a signature file written. Components that fail their validation will have their status set to dirty and a dummy signature file written. This will contain the name of each binary previously released, with zero time stamp and size. This signature will never match the files on the drive and so will cause C<EnvInfo> to correctly find the component as dirty.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ValidateEnv.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ValidateRel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,187 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'ValidateRel');
+my $verbose = 0;
+my $validatesource = 0;
+my $fullbincheck = 0;
+my $keeptemp;
+my @comps;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+ValidateRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "s" => \$validatesource, "t" => \$keeptemp, "f" => \$fullbincheck);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if ($#ARGV == 0) {
+    if (-f $ARGV[0]) {
+      open IN, $ARGV[0] or die "Error: Couldn't open $ARGV[0] for reading: $!\n";
+      while (my $line = <IN>) {
+        chomp $line;
+        $line =~ s/^\s*$//; #remove lines entirely filled with white space
+        $line =~ s/#.*//; #remove comments from lines
+		$line =~ s/^\s*//; #remove whitespace from the start of lines
+        if ($line eq '') {
+          next; #Nothing left
+        }
+		my @cmdLine = split(/\s+/,$line);
+		my $cmdLineCount = @cmdLine;
+		my %relStruct;
+		if($cmdLineCount > 0) {
+			$relStruct{name} = $cmdLine[0];
+			if($cmdLineCount > 1) {
+				$relStruct{ver} = $cmdLine[1];
+			}
+			push @comps, \%relStruct;
+		}
+      }
+    close IN;
+    }
+    else {
+      push @comps, {name => $ARGV[0]};
+    }
+  }
+  elsif ($#ARGV == 1) {
+    # Both component and version are specified
+    push @comps, {name => $ARGV[0],
+                  ver  => $ARGV[1]};    
+  }
+  else {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: validaterel [options] (<component> [<version>]) | <component_list_file>
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-s  validate source code too
+-f  fully check for added binaries (can be very slow)
+-t  don't delete the temporary directory
+");
+}
+
+sub ValidateRel {
+  my $iniData = IniData->New();
+  my $envDb = EnvDb->Open($iniData, $verbose);
+ 
+  foreach my $comp (@comps) {
+	my $version;	
+	if(exists($comp->{ver})) {
+		$version = $comp->{ver};
+	}
+	else {
+		$version = $envDb->Version($comp->{name});
+	}
+
+	if(defined $version) {
+		$envDb->ValidateComp($comp->{name}, $version, undef, $validatesource, $keeptemp, $fullbincheck);
+	}
+    else {
+      print $comp->{name}." not installed\n";
+    }
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ValidateRel - Validates the integrity of the installed binaries of a given component.
+
+=head1 SYNOPSIS
+
+  validaterel [options] (<component> [<version>]) | <component_list_file>
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -s  validate source code too
+  -f  fully check for added binaries
+  -t  keep temporary directory
+
+=head1 DESCRIPTION
+
+Unpacks the binaries of the specified version of the component to a temporary directory (if a version is not specified, the version of the component that was originally installed in the environment is retrieved from the environment database). It then compares them with the binaries in the current drive's F<\epoc32> tree using the standard EPOC tool C<EValid>. Reports the status of the component as a result of the validation. This will be I<clean> if the validation passed, I<dirty> if the validation failed, or I<pending release> if the component was already pending release. If the component passes its validation and the version is the same as the one present in the environment database, its signature file in F<\epoc32\relinfo> will be updated.
+
+You may also give a -s flag to indicate that you want to validate the source code. This is useful because in some cases the source code may change, without the binary files changing. (For example, a change of distrubution.policy). If this validation fails, but the binary validation succeeds, the status will be set to I<binaries clean, source dirty>. Only source code in the release packet will be validated - source files missing from the release packets will not be detected.
+
+A list of component names stored in a text file may be passed to validaterel to validate multiple components.
+
+With the -t flag, you will be told where the temporary directory was. You
+can then use that to investigate validation failures with evalid.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ValidateRel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ViewNotes	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,250 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use EnvDb;
+use NotesCompiler;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'ViewNotes');
+my $comp1;
+my $ver1;
+my $comp2;
+my $ver2;
+my $compSummary;
+my $envSummary;
+my $diffEnvSummary;
+my $projectFilter;
+my $numberFilter;
+my $outputLocation;
+my $outputSTDOUTonly;
+my $htmlNotes="";
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+if ($htmlNotes eq "") {
+  # User didn't specify --html or --nohtml
+  $htmlNotes = $iniData->HtmlNotes();
+}
+my $notesCompiler = NotesCompiler->New($iniData, $comp1, $ver1, $verbose, $outputLocation, $outputSTDOUTonly, $htmlNotes);
+$notesCompiler->SetProjectFilter($projectFilter);
+$notesCompiler->SetVersionNumberFilter($numberFilter);
+if ($compSummary) {
+  if ($outputSTDOUTonly) {
+    die "Error: Cannot use -s with -t\n";
+    Usage(1);
+  }
+  $notesCompiler->DoCompSummary();
+}
+elsif ($envSummary or (not $comp1 and not $ver1)) {
+  if ($outputSTDOUTonly && $envSummary) {
+    die "Error: Cannot use -e with -t\n";
+    Usage(1);
+  }
+  elsif ($outputSTDOUTonly and (not $comp1 and not $ver1)){
+    die "Error: When using the -t flag, either <component> or <version> (or both) must be specified\n";
+    Usage(1);
+  }
+  
+  $notesCompiler->DoEnvSummary();
+}
+elsif ($diffEnvSummary) {
+  $notesCompiler->DoDiffEnvSummary($comp2, $ver2);
+}
+else {
+  $notesCompiler->DoStandardNotes();
+}
+if ($outputLocation) {
+  print "LAUNCH LOCATION: ".$notesCompiler->HtmlMainFile();
+}
+elsif (!$outputSTDOUTonly){
+  system "start ".$notesCompiler->HtmlFileName();
+}
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'e' => \$envSummary, 's' => \$compSummary, 'v+' => \$verbose, 'd' => \$diffEnvSummary, 'p=s' => \$projectFilter, 'n=s' => \$numberFilter, 'o=s' => \$outputLocation, 't' => \$outputSTDOUTonly, 'html!' => \$htmlNotes);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp1 = shift @ARGV;
+  $ver1 = shift @ARGV;
+  $comp2 = shift @ARGV;
+  $ver2 = shift @ARGV;
+
+  if (@ARGV) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  if (defined ($compSummary) + defined ($envSummary) + defined ($diffEnvSummary) > 1) {
+    print "Error: Incompatible options\n";
+    Usage(1);
+  }
+
+  if ($projectFilter || $numberFilter) {
+    unless ($compSummary || $diffEnvSummary || $envSummary) {
+      print "Error: the -p and -n filters don't make sense if you're just viewing the notes for one release\n";
+      Usage(1);
+    }
+  }
+
+  if ($compSummary) {
+    unless ($comp1) {
+      print "Error: A component must be specified when using the -s option\n";
+      Usage(1);
+    }
+    if ($ver1) {
+      print "Error: Too many arguments\n";
+      Usage(1);
+    }
+  }
+  elsif ($diffEnvSummary) {
+    if ($comp2 && !$ver2) {
+      print "Error: You must specify a version number for each component\n";
+      Usage(1);
+    }
+    unless ($comp1 && $ver1) {
+      print "Error: You must specify a component and version to difference against\n";
+      Usage(1);
+    }
+  }
+  elsif ($comp1 and not $ver1) {
+    SetVersionToCurrent();
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "
+Usage: viewnotes [options] [[-t] <component> [<version>]]
+       viewnotes [options] -s <component>
+       viewnotes [options] -e [<component> [<version>]]
+       viewnotes [options] -d [-t] <component> <version> [<component> <version>]
+
+options:
+
+-h  help
+-s  display a summary all releases made to date for a specified component
+-e  display a summary of all the releases in the specified environment
+-d  display a report of all the changes between two environments
+-v  verbose output (-vv very verbose)
+-t  output HTML directly to STDOUT, without generating a file
+-p <project> only display notes for releases in this project
+-n <version Number> only display notes for releases whose number matches this
+--html   Display notes made using tools v2.83.1013 and earlier as html
+--nohtml Display notes made using tools v2.83.1013 and earlier as plain text
+
+The --html and --nohtml options override the html_notes setting in reltools.ini\n");
+}
+
+sub SetVersionToCurrent {
+  my $envDb = EnvDb->Open($iniData);
+  $ver1 = $envDb->Version($comp1);
+  unless (defined $ver1) {
+    die "Error: $comp1 not installed in current environment\n";
+  }
+}
+
+
+
+=head1 NAME
+
+ViewNotes - View the release notes of a component release.
+
+=head1 SYNOPSIS
+
+       viewnotes [options] [[-t] <component> [<version>]]
+       viewnotes [options] -s <component>
+       viewnotes [options] -e [<component> [<version>]]
+       viewnotes [options] -d [-t] <component> <version> [<component> <version>]
+       
+options:
+
+  -h  help
+  -s  display a summary all releases made to date for a specified component
+  -e  display a summary of all the releases in the specified environment
+  -d  display a report of all the changes between two environments
+  -v  verbose output (-vv very verbose)
+  -t  output HTML directly to STDOUT, without generating a file
+  -p <project> only display notes for releases in this project
+  -n <version Number> only display notes for releases whose number matches this
+  --html   Display notes made using tools v2.83.1013 and earlier as html
+  --nohtml Display notes made using tools v2.83.1013 and earlier as plain text
+
+=head1 DESCRIPTION
+
+Launches a web browser to view the HTML release notes of the requested component release. Without C<-s>, C<-e> or C<-d>, it displays the notes for a single component version. If the version is specified, the notes for that component version are displayed. If the version is not specified, the notes for the currently installed component version are displayed. If the version is not specified and the component is currently C<pending release>, the notes for the component are displayed for previewing. 
+
+The C<-s> switch may be used to display a summary of all releases made to date (most recent first). The C<-e> switch displays notes for all the components in the specified environment (or your current environment, if you don't specify one).
+
+The C<-d> switch produces a single page which shows the release notes for all components which have changed between two environments. This page contains the release notes for each changed release, including any intervening releases which may exist on your release archive.
+
+The C<-s>, C<-e> and C<-d> switches all produce information for several releases. In all cases, but especially with C<-d>, you may not want information produced for every release. You can therefore use C<-p> and C<-n> to filter the releases for which you want to see the notes. The C<-n> switch can take a regular expression, so that you can (for example) show only releases starting with a certain phrase.
+
+The C<-t> switch will not create a file, but instead, will output the HTML to STDOUT. The output to STDOUT is useful for viewnotes to be built into other scripts and provides more flexibility in viewing release notes.
+
+The C<--html> and C<--nohtml> switches override the setting of the html_notes keyword in your reltools.ini file.  This setting controls how the text in release notes made using tools version 2.83.1013 and earlier is displayed in a web browser - either as html (allowing tags to be used) or as plain text.  Note that release notes used with newer versions of tools use the <html/> element to specify whether the text is html or not at time of writing, so this setting is ignored with those releases.
+
+(Note: there is also a C<--dummy> switch, which prompts the page to be generated but not displayed in a web browser. This is intended for the use of test scripts).
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/ViewNotes.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/archive_path.txt.ex	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,26 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+# Miscellaneous components.
+default \\pixieshare\release_archive\misc	/mycompany/pixie/misc
+
+# Components delivered by our company.
+comp1	\\pixieshare\release_archive\mycompany	/mycompany/pixie
+comp2	\\pixieshare\release_archive\mycompany	/mycompany/pixie
+
+# Components delivered by other companies.
+comp3	\\pixieshare\release_archive\company_x	/company_x/pixie
+comp4	\\pixieshare\release_archive\company_y	/company_y/pixie
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/cleanremote	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,330 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use CommandController;
+use Cleaner;
+use Utils;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $dummyRun = 0;
+my $descriptionFile;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'CleanRemote');
+my $keepAfter;
+my %envsToKeep;
+my %relsToKeep;
+my %relsToClean;
+my @filesToDelete;
+my $remoteSite = $iniData->RemoteSite;
+my $cleaner;
+my $doall = 0; # skips prompting
+my $skipWarnings;
+
+#
+# Main.
+#
+ProcessCommandLine();
+$cleaner = Cleaner->New($iniData, 1, $verbose, 0); # 1 = remote
+$cleaner->SetCleaningSubroutine(\&CleaningSubroutine);
+ParseDescriptionFile($descriptionFile);
+$cleaner->Clean();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'd' => \$dummyRun, 'v+' => \$verbose, 'f' => \$skipWarnings);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $descriptionFile = shift @ARGV;
+
+  unless ($descriptionFile) {
+    print "Error: Archive cleaning description file not specified\n";
+    Usage(1);
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  if ($dummyRun and not $verbose) {
+    $verbose = 1;
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: cleanremote [options] <description_file>
+
+options:
+
+-h  help
+-d  dummy run (don't do anything) - assumes -v
+-f  (deprecated)
+-v  verbose output (-vv very verbose).\n");
+
+}
+
+sub ParseDescriptionFile {
+  if ($verbose) { print "Parsing \"$descriptionFile\"...\n"; }
+  open (DES, $descriptionFile) or die "Unable to open \"$descriptionFile\" for reading: $!\n";
+
+  while (my $line = <DES>) {
+    # Remove line feed, white space and comments.
+    chomp($line);
+    $line =~ s/^\s*$//;
+    $line =~ s/#.*//;
+    if ($line eq '') {
+      # Nothing left.
+      next;
+    }
+
+    my $keyWord;
+    my @operand;
+    if ($line =~ /^(\w+)\s+(.*)/) {
+      $keyWord = $1;
+      @operand = ();
+      if ($2) {
+        @operand = split /\s+/, $2;
+      }
+    } else {
+      $keyWord = $line;
+    }
+
+    unless (defined $keyWord) {
+      die "Error: Invalid line in \"$descriptionFile\":\n$line\n";
+      next;
+    }
+
+    if ($cleaner->ProcessDescriptionLine($descriptionFile, $keyWord, @operand)) {
+      # We're happy because Cleaner.pm knows what to do with this line
+    }
+    elsif ($keyWord =~ /^(?:no_prompt)$/ ) {
+      $doall = 1;    
+    } elsif ($keyWord =~ /^(?:clean_to|expunge)$/ ) {
+      my $msg = "You have accidentally left a \"$keyWord\" keyword in your configuration file. That's appropriate for cleaning local archives, but cleanremote just completely deletes stuff. Do you want to continue?";
+      die unless $cleaner->Query($msg);
+    }
+    else {
+      die "Error: Unknown keyword \'$keyWord\' in \"$descriptionFile\"\n";
+    }
+  }
+
+  close (DES);
+
+  if ($verbose > 1) {
+    $cleaner->PrintEnvsToKeep();
+  }
+}
+
+sub CleaningSubroutine {
+  # This actually gets run by Cleaner.pm (it's a callback)
+  my $thisComp = shift;
+  my $thisVer = shift;
+  my $relDir = shift;
+  print "Cleaning $thisComp $thisVer from $relDir...\n" if ($verbose);
+  unless ($doall) {
+    print "Do it?\n";
+    my $ans = <STDIN>;
+    die "Not doing" unless $ans =~ m/[ay]/i;
+    $doall = 1 if $ans =~ m/a/i;
+  }
+  die "Couldn't delete $relDir because it didn't exist" unless $remoteSite->DirExists($relDir);
+  my $fullfile = "$relDir/$thisComp$thisVer.zip";
+  print "Actually deleting release file $fullfile\n";
+  DeleteFile($fullfile);
+  my @files = @{$remoteSite->DirList($relDir) || []};
+  foreach my $fullfile (@files) {
+    if ($fullfile =~ m/lpdrt\d{5}\.tmp$/) {
+      # Remove temp files older than $keepAfter time
+      my $modifiedTime = $remoteSite->FileModifiedTime($fullfile);
+      my $keepAfter = $cleaner->{keepAfter};
+      if ($modifiedTime and (not defined $keepAfter or $modifiedTime <= $keepAfter)) {
+        print "Actually deleting temp file $fullfile\n";
+        DeleteFile($fullfile);
+      } else {
+        print "Not deleting temp file $fullfile because too new\n";
+      }
+    }
+  }
+  if (!$dummyRun) {
+    # Now check the directory is empty and delete the directory if so
+    @files = @{$remoteSite->DirList($relDir) || []};
+    @files = map { m/.*\/(.*?)$/; $1 } @files;
+    print "Wanting to remove directory $relDir - @files files left in it\n" if ($verbose);
+    DeleteFile($relDir) unless @files;
+  }
+
+  return 1; # This cleaner doesn't currently support returning of any errors
+}
+
+sub DeleteFile {
+  my $file = shift;
+  print "Deleting \"$file\"\n" if ($verbose);
+	eval {
+		$remoteSite->DeleteFile($file) unless ($dummyRun);
+	};
+	if ($@) {
+		print "Warning: Couldn't delete \"$file\" because \"$@\"\n";
+		# Usually because $file is a directory, which turns out not to be
+		# empty.
+	}
+}
+
+__END__
+
+=head1 NAME
+
+CleanRemote - Cleans unwanted releases and files from a remote archive.
+
+=head1 SYNOPSIS
+
+  cleanremote [options] <description_file>
+
+options:
+
+  -h  help
+  -d  dummy run (don't do anything) - assumes -v
+  -f  (deprecated)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+C<cleanremote> allows releases to be cleaned out of a remote archive. This may be useful if a remote archive is consuming a large amount of disk space and there are old releases present that are no longer required.
+
+B<Warning: C<cleanremote> has the potential to seriously alter the state of a remote archive, and hence seriously damage productivity of all users of the remote archive. Be very careful using it.>
+
+Before using C<cleanremote> you must write a plain text file that describes which releases you want to keep etc. The following keywords are supported:
+
+=over 4
+
+=item keep_env <component> <version>
+
+Instructs C<cleanremote> to keep all the component versions in the environment from which the specified component was released. This keyword may be used multiple times.
+
+=item keep_rel <component> <version>
+
+Instructs C<cleanremote> to keep a specific component release. This keyword may be used multiple times.
+
+=item keep_recent_env <component> <num_days>
+
+Instructs C<cleanremote> to keep all named component releases, including their environments, where the component release has been exported within the specified number of days (since the current time) (note: the export time, rather than release time is used).
+
+It should be noted that for this keyword to work, an accessible local archive must contain copies of the same component releases as are identified on the remote server as ones to keep.
+
+This keyword may be used multiple times provided it is used for different components each time.
+
+=item keep_recent_rel [component] <num_days>
+
+Instructs C<cleanremote> to keep any component releases exported within the specified number of days (since the current time). If a component name is specified, C<cleanremote> will only keep component releases which match that name (and are sufficiently recent). Please note that the time is taken from time of export, not time of release.
+
+This keyword may be used multiple times if the command is used for different components. 
+
+=item keep_recent <num_days>
+
+B<Depricated:> Equivalent to keep_recent_rel without a component name entered.
+
+=item no_prompt
+
+Instructs C<cleanremote> to not prompt the user to delete every component. This is equivalent to typing 'a' (all) at the first component prompt.
+
+=back
+
+For example:
+
+ keep_env     pixie alpha
+ keep_env     pixie beta
+ keep_rel     comp1 rel1
+ keep_recent  10
+
+C<cleanremote> will work out which component releases need to be kept in order to satisfy the specified keep criteria. All other component releases found in the archive will be deleted (along with temporary files used during FTP uploads). B<It is therefore extremely important that the list of environments to keep is complete>. It is recommended that this file be controlled using a configuration management tool. It is also recommended that each project has only one description file, and that all users of C<cleanremote> know where to find it.
+
+Recommended procedure for using C<cleanremote>:
+
+=over 4
+
+=item 1
+
+Inform all users of the archive that a clean is about to be performed, and that the archive will be unavailable whilst this is happening.
+
+=item 2
+
+Take the archive off-line or alter permissions such that you are the only person that can access it.
+
+=item 3
+
+Backup the archive.
+
+=item 4
+
+Run C<cleanremote> and carefully check the list of components that are about to be cleaned. If you are happy, type 'yes' to continue, otherwise type 'no', modify your description file and re-run C<cleanremote>.
+
+=item 5
+
+Bring the archive back on-line.
+
+=item 6
+
+Inform all users of the archive that it is available for use once more.
+
+=back
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/cleanremote.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/envmembership	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,163 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use Utils;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $force;
+my $commandController = CommandController->New($iniData, 'EnvMembership');
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "f" => \$force);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  # Functional description:
+  # create reldata objects for each release of <environment>
+  # for each release find if <component> is present in the environment
+  # and if so if <version> matches the version in the environment.
+  # if these conditions are met, place the current <environment> release id in 
+  # an array and print the contents of the array at the end of the script
+  #
+  #
+  if ($#ARGV == 2) {
+    # Extract the command line arguments (Note: GetOptions() will have already
+    # stripped out the options part of the command line
+    my $component_name = shift @ARGV;
+    my $component_version= shift @ARGV;
+    my $env_name= shift @ARGV;
+		
+    # Scalar variable $envRelDatas will contain a reference to an array of reldata
+    # objects following this call.
+    my $envRelDatas = RelData->OpenSet($iniData, $env_name, $verbose);
+    my @outputTable;
+    my @tableHeader = ("Component", "Version");
+    push (@outputTable, \@tableHeader);
+    foreach my $currentEnvRelData (@$envRelDatas) {
+      my $currentEnv = $currentEnvRelData->Environment();
+      # $currentEnv now contains a reference to a hash containing 
+      # component name / version pairs for all the components that were
+      # present in the current release of the environment component
+      if ($currentEnv->{$component_name}) {
+	# component is present in the current environment
+	if ($currentEnv->{$component_name} eq $component_version) {
+	  # component version of interest is present in the current environment
+	  my @tableRow = ($currentEnvRelData->Component(),$currentEnvRelData->Version());
+	  push (@outputTable, \@tableRow);
+	}
+      }
+    }
+    # print the environment versions in which componet version is present
+    my $tableLength = @outputTable;
+    if ($tableLength > 0) {
+      $iniData->TableFormatter->PrintTable(\@outputTable);
+    }
+  } else {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: envmembership [options] <component> <version> <environment>
+
+options:
+
+-h  help
+-f  (deprecated)
+-v  verbose output (-vv very verbose)\n");
+
+}
+
+__END__
+
+=head1 NAME
+
+EnvMembership - Returns the environments to which a particular component belongs
+
+=head1 SYNOPSIS
+
+  envmembership [options] <component> <version> <environment>
+
+options:
+
+  -h  help
+  -f  (deprecated)
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Returns all the versions of a specified component for which a particular version of another specified component is present in its release environment. For example, to discover which release of a component called C<my_product> contains the component C<my_comp> at version C<my_ver>, type:
+
+  envmembership my_comp my_ver my_product 
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/envmembership.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/envsize	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,167 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use RelData;
+use EnvDb;
+use Utils;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'EnvSize');
+my $comp;
+my $ver;
+my $quick;
+my $force;
+my $deltasize = 0;
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+my $envdb = EnvDb->Open($iniData, $verbose);
+$ver = $envdb->Version($comp) if (!$ver);
+
+EnvSize();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions("h" => \$help, "v+" => \$verbose, "q" => \$quick, 'f' => \$force, "d" => \$deltasize);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if ($quick && $deltasize) {
+    die "Error: It is not possible to use the -d and -q flags together\n";
+  }
+
+  $comp = shift @ARGV;
+  unless ($comp) {
+    die "Error: No component name specified\n";
+  }
+  if (scalar @ARGV == 1) {
+    $ver = shift @ARGV;
+  }
+  elsif (!scalar @ARGV == 0) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: envsize [options] <component> <version>
+
+options:
+
+-h  help
+-v  verbose output (-vv very verbose)
+-f  (deprecated)
+-q  quick (don't print size of environment)
+-d  delta size (only matching versions)
+  
+Note: It is not possible to use the -q and -d flags together.\n");
+}
+
+sub EnvSize {
+  print "Size of component zips in local archive: ".$envdb->GetReleaseSize($comp, $ver)." bytes\n";
+  print "Size of whole environment zips in local archive: ".$envdb->GetEnvironmentSize($comp, $ver, 0)." bytes\n" if (!$quick && !$deltasize);
+  print "Size of environment zips in local archive that match the requested version: ".$envdb->GetEnvironmentSize($comp, $ver, $deltasize)." bytes\n" if (!$quick && $deltasize);
+}
+
+__END__
+
+=head1 NAME
+
+EnvSize - Prints the size of the zip files of the component and its environment.
+
+=head1 SYNOPSIS
+
+  envsize [options] component [version]
+
+options:
+
+  -h  help
+  -v  verbose output (-vv very verbose)
+  -q  quick; only print the size of the component, not its environment
+  -d  delta size; only includes components that match the requested version
+
+Note: It is not possible to use the C<-q> and C<-d> flags together.
+
+=head1 DESCRIPTION
+
+Adds up the size of the zip files of the component. The result is printed,
+in bytes.
+
+Unless you specify the C<-q> flag, it also adds up the sizes of all the
+components that make up its environment, and prints that. (This, of course,
+includes the component you specify).
+
+If you specify the C<-d> flag it will add up the sizes of all the components in
+the archive that match the version number specified.  This is useful if when you
+create an environment you use the same version number for all new components,
+you can see the size taken up by the components released in the new
+environment, and not components which have been re-used.
+
+The first item of information is also shown in the output of C<viewnotes>.
+
+=head1 STATUS
+
+Supported. If you find a problem, please report it to us.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/envsize.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/getrel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,241 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $overwriteSource = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'GetRel');
+my $envDb;
+my $installSource;
+my $sourceInstallPath = undef;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  my $stdin;
+  GetOptions('h' => \$help, 's' => \$installSource, 'o' => \$overwriteSource, 'v+' => \$verbose, 'p' => \$stdin, 'i=s' => \$sourceInstallPath);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  if ($sourceInstallPath and not $installSource) {
+    print "Error: Invalid options - cannot specify install path (using -i) without installing source (using -s)\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+ 
+  if ($#ARGV == -1 and $stdin) {
+    my @failedGets;
+    my @lines;
+    my $line;
+    while (defined ($line = <STDIN>)) {
+      # Remove line feed, white space and comments.
+      chomp $line;
+      $line =~ s/^\s*//;
+      $line =~ s/\s$//;
+      $line =~ s/#.*//;
+      if ($line eq '') {
+        # Nothing left.
+        next;
+      }
+      push @lines, $line;
+    }
+
+    # We do this as a separate loop to work around a weird defect in Perl 5.8.0
+    # where <STDIN> only reads the first line if a system() call happens
+    # in between (which would be done by InstallComponent)
+    # This defect is #21717 and is due to be fixed in 5.8.1
+    my $lineNum = 0;
+    foreach $line (@lines) {
+      $lineNum++;
+      eval {
+        my @words = split (/\s+/, $line);
+        unless ($#words == 1) {
+          die "Error: Invalid number of arguments at line $lineNum from STDIN\n";
+        }
+        InstallComponent(@words);
+      };
+      if ($@) {
+        print $@;
+        push (@failedGets, $line);
+      }
+    }
+
+    if ($#failedGets >= 0) {
+      print "\nThere was an error getting the following release(s):\n\n";
+      foreach (@failedGets) {
+        print;
+      }
+    }
+  }
+  elsif ($#ARGV == 0) {
+    my $comp = shift @ARGV;
+    my $ver = $envDb->Version($comp);
+    unless (defined $ver) {
+      die "Error: Couldn't find version of $comp - not currently installed\n";
+    }
+    InstallComponent($comp, $ver);
+  }
+  elsif ($#ARGV == 1) {
+    InstallComponent(@ARGV);
+  }
+  else {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: getrel [options] <component> [<version>]
+
+options:
+
+-h  help
+-s  install source code also
+-o  overwrite any existing source
+-v  verbose output (-vv very verbose)
+-p  read a piped list of components from STDIN\n");
+}
+
+sub InstallComponent {
+  my $comp = shift;
+  my $ver = shift;
+
+  $comp = lc($comp);
+
+  $iniData->PathData()->CheckReleaseExists($comp, $ver);
+
+  my $relData = RelData->Open($iniData, $comp, $ver, $verbose);
+
+  #change the version string to that stored in the reldata file (version nums are case dependent)
+  my $env = $relData->Environment();
+  $ver = $env->{$comp};
+
+  my $noinstall = 0;
+  my $installedVer = $envDb->Version($comp);
+  if (defined $installedVer and lc($installedVer) eq lc($ver)) {
+    (my $status) = $envDb->CheckComp($comp, 0);
+    if ($status == EnvDb::STATUS_CLEAN) {
+      print "$comp $ver already installed and clean\n";
+      $noinstall = 1;
+    }
+  }
+
+  unless ($noinstall) {
+    # Remove old binaries if present.
+    if (defined $installedVer and $envDb->Status($comp) != EnvDb::STATUS_PENDING_RELEASE) {
+      if (lc($installedVer) eq lc($ver)) {
+        print "Re-installing $comp $ver...\n";
+      }
+      else {
+        print "Switching $comp from $installedVer to $ver...\n";
+      }
+      $envDb->RemoveComponent($comp);
+    }
+    else {
+      print "Installing $comp $ver...\n";
+    }
+    $envDb->InstallComponent($comp, $ver, $overwriteSource);
+  }
+
+  if ($installSource) {
+    my $installPath = $sourceInstallPath;
+    if (!defined ($installPath)) {
+      $installPath="\\";
+    }
+    $envDb->UnpackSource($comp, $ver, $installPath, $overwriteSource, 1);
+  }
+}
+
+
+__END__
+
+=head1 NAME
+
+GetRel - Installs the binaries of a component release into the current environment.
+
+=head1 SYNOPSIS
+
+  getrel [options] <component> [<version>]
+
+options:
+
+  -h  help
+  -s  install source code also
+  -o  overwrite any existing source
+  -v  verbose output (-vv very verbose)
+  -p  read a piped list of components from STDIN
+
+=head1 DESCRIPTION
+
+Before installing new binaries, any existing binaries are removed. If no version is specifed, the current version will be re-installed (if it is dirty). Multiple releases may be installed by specifying the C<-p> switch and piping in text via C<STDIN> that contains lines in a <component> <version> format. Releases that fail to install are listed at the end.
+
+Source code may optionally be installed also. If specified, this will be installed into the root of the current drive. Any existing files will be overwritten with -o.
+
+As well as overwriting existing source code, C<-o> will overwrite any binaries which are left on the drive. There will only be leftover binaries in exceptional circumstances; normally C<getrel> will remove old versions of components before trying to install new ones.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/getrel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/listcomponents	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,132 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+
+
+#
+# Globals.
+#
+
+my $iniData = IniData->New();
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PrintListComponents();
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: listcomponents [options] 
+
+options:
+
+-h  help\n");
+}
+
+sub PrintListComponents {
+  my @Components = ();
+  
+  foreach my $component (sort @{$iniData->PathData->ListComponents()}){
+    my $found = 0;
+    
+    $component = lc($component);
+
+    foreach(@Components){
+      if($component eq $_){
+        $found = 1;
+	last;
+      }
+    }
+    
+    unless($found){
+      push(@Components, $component);
+    }
+  }
+
+  foreach(@Components){
+    print "$_\n";
+  }
+}
+
+__END__
+
+=head1 NAME
+
+ListComponents - Prints a list of the components on the local archive.
+
+=head1 SYNOPSIS
+
+  listcomponents [options] 
+
+options:
+
+  -h  help
+
+=head1 DESCRIPTION
+
+Lists all the components on the local archive.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/listcomponents.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/mbld	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,351 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Cwd;
+use Getopt::Long;
+use Utils;
+
+$|++;
+
+#
+# Globals
+#
+
+my @bldData;
+my $descriptionFile;
+my $keepGoing = '';
+my $saveSpace = '';
+my $verbose = 0;
+my $clean = 0;
+my $outFile = "stdout.log";
+my $errorFile = "stderr.log";
+my $startTime;
+my $cwd;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+ParseDescriptionFile();
+Init();
+DoBuild();
+End();
+
+
+#
+# Subs
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('c+' => \$clean, 'h' => \$help, 'k' => \$keepGoing, 's' => \$saveSpace, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $descriptionFile = shift @ARGV;
+
+  unless ($descriptionFile and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: mbld [options] <build_description_file>
+
+options:
+
+-h  help
+-c  clean (-cc reallyclean)
+-k  keep going
+-s  save space
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub Init {
+  $startTime = time;
+  unlink $outFile;
+  unlink $errorFile;
+  $cwd = cwd();
+  $outFile = "$cwd\\$outFile";
+  $errorFile = "$cwd\\$errorFile";
+}
+
+
+sub ParseDescriptionFile {
+  open(FILE, $descriptionFile) or die "Error: Unable to open \"$descriptionFile\" for reading: $!\n";
+
+  my $line = -1;
+  while (<FILE>) {
+    ++$line;
+    # Remove line feed, white space and comments.
+    chomp;
+    s/^\s*$//;
+    s/#.*//;
+    if ($_ eq '') {
+      # Nothing left.
+      next;
+    }
+
+    (my @words) = split /\s+/;
+
+    if ($#words < 2) {
+      print "Warning: Not enough arguments on line $line\n";
+      next;
+    }
+
+    my $bldEntry;
+    $bldEntry->{name} = shift @words;
+    $bldEntry->{bldInf} = shift @words;
+    if ($words[0] eq 'test') {
+      $bldEntry->{test} = 1;
+      shift @words;
+      if ($#words == -1) {
+	print "Warning: Not enough arguments on line $line\n";
+	next;
+      }
+    }
+    $bldEntry->{plat} = shift @words;
+    if ($#words >= 0) {
+      if ($words[0] =~ /(udeb)|(urel)/) {
+	$bldEntry->{var} = shift @words;
+      }
+    }
+    if ($#words >= 0) {
+      $bldEntry->{mmp} = shift @words;
+    }
+
+    push (@bldData, $bldEntry);
+  }
+    
+  close FILE;
+}
+
+sub DoBuild {
+  if ($clean == 1) {
+    DoPlatformVariantCommand('clean:       ', 'abld', 'clean');
+  }
+  elsif ($clean == 2) {
+    DoPlatformVariantCommand('reallyclean: ', 'abld', 'reallyclean');
+  }
+  DoBldMake();
+  DoExport();
+  DoPlatformCommand('makefile:    ', 'abld', 'makefile');
+  DoPlatformCommand('library:     ', 'abld', 'library');
+  DoPlatformVariantCommand('resource:    ', 'abld', 'resource');
+  my $target = 'target';
+  if ($keepGoing) {
+    $target .= " $keepGoing";
+  }
+  if ($saveSpace) {
+    $target .= " $saveSpace";
+  }
+  DoPlatformVariantCommand('target:      ', 'abld', $target);
+  DoPlatformVariantCommand('final:       ', 'abld', 'final');
+  DoPlatformVariantCommand('check:       ', 'abld -check', 'build');
+}
+
+sub DoBldMake {
+  my %built;
+  foreach my $bldEntry (@bldData) {
+    unless (exists $built{lc($bldEntry->{bldInf})}) {
+      DoPrint("bldfiles:     $bldEntry->{name} [bldmake bldfiles]");
+      chdir $bldEntry->{bldInf} or die "Error: Couldn't change working directory to \"$bldEntry->{bldInf}\": $!\n";
+      system "bldmake bldfiles >>$outFile 2>>$errorFile";
+      chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+      $built{lc($bldEntry->{bldInf})} = 1;
+    }
+  }
+}
+
+sub DoExport {
+  my %built;
+  my %builtTest;
+  foreach my $bldEntry (@bldData) {
+    if (exists $bldEntry->{test}) {
+      unless (exists $builtTest{lc($bldEntry->{bldInf})}) {
+	DoPrint("export:       $bldEntry->{name} [abld test export]");
+	chdir $bldEntry->{bldInf} or die "Error: Couldn't change working directory to \"$bldEntry->{bldInf}\": $!\n";
+	system "abld test export >>$outFile 2>>$errorFile";
+	chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+	$builtTest{lc($bldEntry->{bldInf})} = 1;
+      }
+    }
+    else {
+      unless (exists $built{lc($bldEntry->{bldInf})}) {
+	DoPrint("export:       $bldEntry->{name} [abld export]");
+	chdir $bldEntry->{bldInf} or die "Error: Couldn't change working directory to \"$bldEntry->{bldInf}\": $!\n";
+	system "abld export >>$outFile 2>>$errorFile";
+	chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+	$built{lc($bldEntry->{bldInf})} = 1;
+      }
+    }
+  }
+}
+
+sub DoPlatformCommand {
+  my $prompt = shift;
+  my $command1 = shift;
+  my $command2 = shift;
+
+  foreach my $bldEntry (@bldData) {
+    my $command = $command1;
+    if (exists $bldEntry->{test}) {
+      $command .= ' test';
+    }
+    $command .= " $command2 $bldEntry->{plat}";
+    if (exists $bldEntry->{mmp}) {
+      $command .= " $bldEntry->{mmp}";
+    }
+    DoPrint("$prompt $bldEntry->{name} [$command]");
+    chdir $bldEntry->{bldInf} or die "Error: Couldn't change working directory to \"$bldEntry->{bldInf}\": $!\n";
+    system "$command >>$outFile 2>>$errorFile";
+    chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+  }
+}
+
+sub DoPlatformVariantCommand {
+  my $prompt = shift;
+  my $command1 = shift;
+  my $command2 = shift;
+
+  foreach my $bldEntry (@bldData) {
+    my $command = $command1;
+    if (exists $bldEntry->{test}) {
+      $command .= ' test';
+    }
+    $command .= " $command2 $bldEntry->{plat}";
+    if (exists $bldEntry->{var}) {
+      $command .= " $bldEntry->{var}";
+    }
+    if (exists $bldEntry->{mmp}) {
+      $command .= " $bldEntry->{mmp}";
+    }
+    DoPrint("$prompt $bldEntry->{name} [$command]");
+    chdir $bldEntry->{bldInf} or die "Error: Couldn't change working directory to \"$bldEntry->{bldInf}\": $!\n";
+    system "$command >>$outFile 2>>$errorFile";
+    chdir $cwd or die "Error: Couldn't change working directory to \"$cwd\": $!\n";
+  }
+}
+
+sub DoPrint {
+  my $prompt = $_[0];
+
+  print "$prompt\n";
+  system "echo === $prompt >> $outFile";
+  system "echo === $prompt >> $errorFile";
+}
+
+sub End {
+  my $finishTime = time;
+  my $total = $finishTime - $startTime;
+  my $seconds =  $total % 60;$total = ($total - $seconds) / 60;
+  my $minutes =  $total % 60;$total = ($total - $minutes) / 60;
+  my $hours =  $total % 24;$total = ($total - $hours)   / 24;
+
+  print "\nTotal build time: $hours:$minutes:$seconds\n";
+  chdir $cwd;
+}
+
+
+__END__
+
+=head1 NAME
+
+MBld - Builds multiple components in one pass.
+
+=head1 SYNOPSIS
+
+  mbld [options] <build_description_file>
+
+options:
+
+  -h  help
+  -c  clean (-cc reallyclean)
+  -k  keep going
+  -s  save space
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+The build description file must be plain text with lines of the following format (one for each item that you want to be built):
+
+ component_name  bld_inf_path  [test] platform [variant] [mmp_file]
+
+=over 4
+
+=item component_name
+
+A string that can be used to identify the component being built - can be anything you like provided it's a single word.
+
+=item bld_inf_path
+
+An absolute or relative path to where the componen't F<bld.inf> file can be found.
+
+=item test
+
+An optional argument to allow test code to be built.
+
+=item platform
+
+The build plaform required (e.g. C<WINS>, C<WINCW>, C<THUMB>, C<ARM4>, C<ARMI>, C<MISA> etc).
+
+=item variant
+
+The build variant (either C<udeb> or C<urel>). If ommitted, both variants will be built.
+
+=item mmp_file
+
+A optional argument that allows specific projects (defined by an F<mmp> file) to be built. If ommitted all F<mmp> files will be used.
+
+=back
+
+The build output is captured to a pair of log files; F<stdout.log> for C<STDOUT> and F<stderr.log> for C<STDERR>.
+
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/mbld.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/pullrel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Copy;
+use IniData;
+use RelData;
+use PathData;
+use CommandController;
+use PushPullRel;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $force = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PullRel');
+my $comp;
+my $ver;
+my $externalIniDataFile;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PullRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+  $externalIniDataFile = shift @ARGV;
+
+  unless (defined $comp and defined $ver and defined $externalIniDataFile and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  unless (-e $externalIniDataFile) {
+    die "Error: $externalIniDataFile does not exist\n";
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: pullrel [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+-h  help
+-f  if check fails, overwrite external copy
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub PullRel {
+  my $ppr = new PushPullRel(
+    $iniData,
+    $externalIniDataFile,
+    0, # pushing
+    $verbose,
+    $force
+  );
+  $ppr->TransferRel($comp,$ver);
+  $ppr->SummariseErrors;
+}
+
+
+__END__
+
+=head1 NAME
+
+PullRel - Copies a released component to another archive.
+
+=head1 SYNOPSIS
+
+  pullrel [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+  -h  help
+  -f  if check fails, overwrite external copy
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+If two sites that share a common WAN want to have separate local archives, the commands C<PullEnv> and C<PullEnv> (and C<PullRel> and C<PullRel>) can be used to keep them in sync. They are similar is spirit to C<ExportEnv> and C<ImportEnv>, however the files are copied directly rather than being encrypted and placed on a shared repository.
+
+For each component in the specified remote environment, checks to see if the corresponding release directory exists on the local site. If it does, each if is checked to ensure its modified time and size is that same as in the local archive. If the check fails an error is thrown (by default, unless the C<-f> switch is used). If is does not, the directory is created and the component is copied into it.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/pullrel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/pushrel	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use File::Copy;
+use IniData;
+use RelData;
+use PathData;
+use CommandController;
+use PushPullRel;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $force = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'PushRel');
+my $comp;
+my $ver;
+my $externalIniDataFile;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+PushRel();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'f' => \$force, 'v+' => \$verbose);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+  $ver = shift @ARGV;
+  $externalIniDataFile = shift @ARGV;
+
+  unless (defined $comp and defined $ver and defined $externalIniDataFile and $#ARGV == -1) {
+    print "Error: Invalid arguments\n";
+    Usage(1);
+  }
+
+  unless (-e $externalIniDataFile) {
+    die "Error: $externalIniDataFile does not exist\n";
+  }
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: pushrel [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+-h  help
+-f  if check fails, overwrite external copy
+-v  verbose output (-vv very verbose)\n");
+}
+
+sub PushRel {
+  my $ppr = new PushPullRel(
+    $iniData,
+    $externalIniDataFile,
+    1, # pushing
+    $verbose,
+    $force
+  );
+  $ppr->TransferRel($comp,$ver);
+  $ppr->SummariseErrors;
+}
+
+
+__END__
+
+=head1 NAME
+
+PushRel - Copies a released component to another archive.
+
+=head1 SYNOPSIS
+
+  pushrel [options] <component> <version> <remote-site-reltools-ini-file>
+
+options:
+
+  -h  help
+  -f  if check fails, overwrite external copy
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+If two sites that share a common WAN want to have separate local archives, the commands C<PushEnv> and C<PullEnv> (and C<PushRel> and C<PullRel>) can be used to keep them in sync. They are similar is spirit to C<ExportEnv> and C<ImportEnv>, however the files are copied directly rather than being encrypted and placed on a shared repository.
+
+For each component in the specified local environment, checks to see if the corresponding release directory exists on the remote site. If it does, each if is checked to ensure its modified time and size is that same as in the local archive. If the check fails an error is thrown (by default, unless the C<-f> switch is used). If is does not, the directory is created and the component is copied into it.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/pushrel.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/relnotes.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2835 @@
+Version 2.84.3
+
+Made by Build Tools China, 08/09/2009
+
+Defect fixes:
+        DPDEF141526 - raptor errors when validating tools_redistribution_common in MakeCBR
+New Features:
+*   REQ12751 - CBR Tools use Raptor.
+        
+-----------------------------------------------------------------------------------
+
+Version 2.84.2
+
+Made by Build Tools China, 02/09/2009
+
+Defect fixes:
+        DPDEF141709 - DeltaEnv create delta_manifest_baseline.xml format error
+        
+-----------------------------------------------------------------------------------
+
+Version 2.84.1
+
+Made by Build Tools China, 20/07/2009
+
+Defect fixes:
+        DPDEF140962 - Miss manifest.xml when apply delta between 141 & 142 tb91sf 
+        DPDEF141079 - deltaenv keep the file which has been moved to another one in old zip file 
+        
+-----------------------------------------------------------------------------------
+
+Version 2.84.0
+
+Made by Release & Integration Tools China, 30/06/2009
+
+New Features:
+*   REQ9701  - Faster, Optimised Packaging process.
+*   REQ11393 - SBSv2 support in CBR tools.
+
+Compatibility notes:
+*   There is a new reldata format introduced in this REQ. 
+    Then if an enviornment is got by any prior CBR version, there will be reldata mismatch 
+    when using any CBR tool in this version. So please keep the CBR tools version consistent.
+    
+-----------------------------------------------------------------------------------
+
+Version 2.83.1031
+
+Made by Release & Integration Tools China, 17/06/2009
+
+Defect fixes:
+        DPDEF140280 - CBR Tools 2.83.1030 fail to compile
+        
+-----------------------------------------------------------------------------------
+
+Version 2.83.1030
+
+Made by Release & Integration Tools China, 18/05/2009
+
+Defect fixes:
+        DEF139216 - DeltaEnv: keep going with error during create and apply delta
+        
+-----------------------------------------------------------------------------------
+
+Version 2.83.1029
+
+Made by Release & Integration Tools China, 01/04/2009
+
+Defect fixes:
+        DPDEF137305 - CBR will report "Error: didn't find any platforms"
+        
+-----------------------------------------------------------------------------------
+
+Version 2.83.1028
+
+Made by Release & Integration Tools China, 26/03/2009
+
+Defect fixes:
+        DEF130995 - Deltaenv errors in creating delta package for 9.5 - M04693
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1027
+
+Made by Release & Integration Tools China, 16/03/2009
+
+Defect fixes:
+        DPDEF136548 - CBR tools don't work with raptor-generated abldcache file
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1026
+
+Made by Release & Integration Tools China, 04/03/2009
+
+Defect fixes:
+        DPDEF135800 - The CBR Tools do not classify IPR for source statements using relative paths
+        DPDEF135797 - CBR Tools do not support relative paths in MRP files
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1025
+
+Made by Release & Integration Tools UK, 19/02/2009
+
+Defect fixes:
+        DPDEF135168: - CBR Tools do not automatically include DP files 
+    
+-----------------------------------------------------------------------------------
+
+Version 2.83.1024
+
+Made by Release & Integration Tools China, 22/01/2009
+
+Defect fixes:
+        DPDEF128617 - MakeEnv does not work with SRCROOT set to anything other than \
+    
+-----------------------------------------------------------------------------------
+
+Version 2.83.1023
+
+Made by Release & Integration Tools China, 12/01/2009
+
+Defect fixes:
+        DPDEF128818 - Envinfo fails testing a mrp with a source statement pointing to a directory
+        DPDEF132654 - Project Loki - 23 - Archive-Tar 
+    
+-----------------------------------------------------------------------------------
+        
+Version 2.83.1022
+
+Made by Release & Integration Tools China, 08/01/2009
+
+Defect fixes:
+        DEF130274   - Intermittent failures in CBR import of releases to Beijing site
+        DPDEF132728 - Project Loki - 175 - net-ftp-common
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1021
+
+Made by Release & Integration Tools China, 23/12/2008
+
+Defect fixes:        
+        DPDEF132236 - unzip version is too old in the CBR packages
+        PDEF131197  - Deltaenv re-construction fails - transferring vFuture M04717 -> M04719	
+
+-----------------------------------------------------------------------------------
+Version 2.83.1020
+
+Made by Release & Integration Tools China, 17/12/2008
+
+Defect fixes:
+        DEF131119   - deltaEnv can't create delta data of gt_techview_baseline component 
+        DEF131116   - Permission deny issue when doing zip and delete command by using deltaenv
+        DPDEF130547 - CBR tools should report error to the log when import file failed
+	
+-----------------------------------------------------------------------------------
+
+Version 2.83.1019
+
+Made by Release & Integration Tools China, 05/11/2008
+
+Defect fixes:
+	DPDEF129430 - Improve the warning message for envinfo with -c,-d or -p
+	DPDEF129931 - DeltaEnv apply need to handle one error senario 
+	
+-----------------------------------------------------------------------------------
+
+Version 2.83.1018
+
+Made by Release & Integration Tools UK, 23/10/2008
+
+Defect fixes:
+	DPDEF128531 - problems creating delta package using manifest file in 9.1
+	DPINC128056 - Missing argument handling in CleanEnv.pm
+	DPDEF126632 - Deprecate support for Component-Based Archives in the CBR Tools
+	
+Compatability notes:
+*	Component-based archives (using the 'archive_path_file' keyword) are now deprecated, and produce a warning - however, no functionality has been disabled.  It's recommended that users migrate to using project-based archives with the 'archive_path' keyword.
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1017
+
+Made by Integration & Variant Tools, 03/10/2008
+
+Defect fixes:
+	DPDEF125527 - CBR tools source mappings break binary platform statements
+	DPINC128057 - Issue with reltools and [...] deep recursion
+	DPDEF127628 - Deltaenv produces errors on pathnames > 255
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1016
+
+Made by Integration & Variant Tools, 12/09/2008
+
+Defect fixes:
+	DPDEF126625 - Problem with ViewNotes [viewnotes doesn't always return immediately with some browsers]
+	DPDEF124626 - deltaenv -c -ra doesn't work
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1015
+
+Made by Product Creation Tools, 17/07/2008
+
+Defect fixes:
+	DEF114845 - Latestver doesn't spot if the archive path doesn't exist 
+	DEF122011 - GT0410 CBR tools: open archive file when cleaning, cleanlocalarch warns 
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1014
+
+Made by Product Creation Tools, 11/07/2008
+
+Defect fixes:
+	DEF124892 - wrong command name in the synopsis of RemoveSource.html
+	DEF124119 - Use of uninitialized value in split at c:/apps/SITK/cbr/Utils.pm line 1467.
+	INC123162 - viewnotes behaves differently between old CBR and SITK's
+	DEF122117 - GT0410 CBR tools: perl crash for invalid paths: deltaenv -r and deltaenv -c --dp
+	DEF122116 - GT0410 CBR tools: perl crash if source file held open while running removesource
+
+Compatability notes:
+*   When writing release notes for use with these tools, this version of the
+    tools permits HTML tags to be used.  To tell the tools not to treat your
+    comment as plain text, wrap the comment in <html> </html> tags
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1013
+
+Made by Product Creation Tools, 20/05/2008
+
+Defect fixes:
+	DEF114845 - Latestver doesn't spot if the archive path doesn't exist
+	DEF118532 - Warnings from cleanremote if remote archive paths not specified
+	DEF121046 - CBR tool Cleanlocalarch fails using Perl 5.8.8
+	DEF121945 - GT0410 CBR tools: file held open while removing component
+                    crashes envdb line1639
+	DEF121958 - GT0410 CBR tools: no archive path crashes latestver, exportenv
+                    and exportrel
+	DEF121964 - GT0410 CBR tools: wrong number of args for archive path crashes
+                    pathdata
+	DEF121972 - GT0410 CBR tools: perl warnings 'exiting subroutines via next
+                    at cleaner.pm'
+	DEF122005 - GT0410 CBR tools: keep_recent_env and rel give warnings on non
+                    numeric arguments
+	DEF122012 - GT0410 CBR tools: incorrect configuration gives perl warnings
+	DEF122018 - GT0410 CBR tools: invalid source dir specified to getrel -I,
+                    getsource -i crash
+	DEF122110 - GT0410 CBR tools: invalid archive path in remote reltools.ini
+                    (pullenv, pullrel)
+	DEF122114 - GT0410 CBR tools: pullrel -h gives the wrong help
+	DEF122115 - GT0410 CBR tools: perl crash when removing source for a non
+                    installed component
+	DEF122119 - GT0410 CBR tools: use of uninitialised value when calling
+                    deltaenv -r (no args)
+	DEF122122 - GT0410 CBR tools: perl crash if bad values given to --maxdelta
+	DEF122142 - ImportEnv command line help is missing an option
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1012
+
+Made by Product Creation Tools, 09/04/2008
+
+Defect fixes:
+	PDEF120528 DeltaEnv -a : error in constructing base_documentation component
+	DEF119931 DeltaEnv -c tool unable to read a generated release manifest file
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1011
+
+Made by Product Creation Tools, 26/03/2008
+
+Defect fixes:
+	DEF115306 Errors when running EnvInfo
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1010
+
+Made by Product Creation Tools, 22/02/2008
+
+Defect fixes:
+	PDEF111988 Adding archives to reltools.ini slows down getenv
+	DEF118518 "experimentalproxy" remote site type doesn't work
+	DEF118517 CleanRemote doesn't work: undefined values
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1009
+
+Made by Product Creation Tools, 26/11/2007
+
+Defect fixes:
+        DEF114351 DeltaEnv is very slow processing developer library components
+        DEF113317 zdc.exe crashes in deltaenv
+        DEF110665 CBR Tools GPG documentation is out of date
+        DEF113042 CBR tools return a '0' value even with invalid arguments
+        DEF114436 GT0366: DeltaEnv: ApplyDelta.pm has incorrect English messages
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1008
+
+Made by Product Creation Tools, 15/11/2007
+
+Defect fixes:
+
+    INC113318 - RELTOOLS: deltaenv can not co-op with multiple local archive
+    INC105515 - RELTOOLS: viewnotes and angled-brackets
+    DEF113091 - Inconsistent behaviour of CBR tools
+    DEF114173 - DeltaEnv Fails with Perl Error
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1007
+
+Made by Product Creation Tools, 30/10/2007
+
+Defect fixes:
+
+    DEF112925 - DeltaEnv does not remove deleted exports
+    DEF113007 - DeltaEnv can create invalid delta manifests
+    DEF112186 - DeltaEnv fails to apply delta due to long path lengths
+    DEF113394 - Releasing an already existing version of a CBR comp deletes the 
+                original from the archive
+    INC113252 - RELTOOLS: blddoc exit with an error
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1006
+
+Made by Product Creation Tools, 22/10/2007
+
+Defect fixes:
+
+    PDEF113136 - CBR: Bad reference when remote path missing from reltools.ini  
+    PDEF107504 - ImportEnv and ImportRel do not provide a summary
+    DEF113056 - DeltaEnv produces Perl warnings
+    DEF112883 - PullEnv/PushEnv have ceased to work
+    DEF112532 - DeltaEnv cannot create a delta     
+    DEF112367 - CBR errors and warnings in M04358 v9.6
+
+Compatibility notes:
+*   The output of ImportRel/ExportRel/ImportEnv and ExportEnv has been changed.
+    All the tools now produce a table of successful transfers, and then a table
+    of failed transfers (if any).  The table also includes a column to display
+    the status or failure reason.
+    
+-----------------------------------------------------------------------------------
+
+Version 2.83.1005
+
+Made by Product Creation Tools, 09/10/2007
+
+Defect fixes:
+
+    DEF112571 - CBR creation more fragile in recent System Builds
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1004
+
+Made by Product Creation Tools, 27/09/2007
+
+Defect fixes:
+
+    INC111277 - RELTOOLS: slow exporting / exportdata parsing
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1003
+
+Made by Product Creation Tools, 26/09/2007
+
+Defect fixes:
+
+    DEF112113 - DeltaEnv fails to overwrite even if the overwrite flag is set
+    DEF112116 - DeltaEnv won't apply a delta
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1002
+
+Made by Product Creation Tools, 20/09/2007
+
+Defect fixes:
+
+    DEF111270 - Mysterious warning in latestver
+    DEF105111 - Symbian::DistributionPolicy perldoc incorrect since CL653690
+    DEF110092 - CBR tools do not indicate whether or not abld cache is being used
+    DEF108677 - BldDocs does not build the docs for DeltaEnv 
+    DEF109761 - DeltaEnv obliges the user to provide a PGP key 
+    DEF111453 - DeltaEnv causes problems for archive cleaning tool
+    DEF111817 - DeltaEnv fails to handle changes to export rules 
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1001
+
+Made by Product Creation Tools, 31/08/2007
+
+Defect fixes:
+
+    DEF108536 - autoCBR releases components unnecessarily 
+
+Compatibility notes:
+*   Archived components which contain abld.bat in the manifest.xml or the zip
+    files may be reported as dirty.  Components created with this release of the
+    CBR Tools will not contain abld.bat files.
+
+-----------------------------------------------------------------------------------
+
+Version 2.83.1000
+
+Made by Product Creation Tools, 30/08/2007
+
+New Features:
+*   PREQ775 - Alignment of CBR and System Model components
+
+Compatibility notes:
+*   There is a new keyword supported for specifying IPR information in MRP files.
+    Information on the syntax and usage of the 'ipr' keyword can be found in the
+    CBR Tools CHM help file->CBR Tools User Guide->Creating a typical MRP file->
+    Adding IPR information.
+
+    IPR information will be obtained from MRP files by default, unless the MRP files
+    do not contain IPR information in which case it will fall back to
+    using distribution.policy files.
+    
+    You can specify that distribution.policy files are to be used by default by
+    adding the 'use_distribution_policy_files_first' directive to your reltools.ini.
+    
+    If you are using distribution.policy files as default and the required
+    distribution.policy file is missing then the CBR Tools will attempt to get the
+    information from MRP files.    
+    
+-----------------------------------------------------------------------------------
+
+Version 2.82.1004
+
+Made by Product Creation Tools, 17/08/2007
+
+Defect fixes:
+
+    INC105524 - Cleanremote command does not work...
+    DEF110377 - GetSource does not print warning with missing archives
+
+-----------------------------------------------------------------------------------
+
+Version 2.82.1003
+
+Made by Product Creation Tools, 10/07/2007
+
+Defect fixes:
+
+    DEF103662 - Add support to envsize command to only count 'new' components
+    DEF107988 - Source mapping breaks manifest
+    DEF108734 - DeltaEnv fails to run from SITK
+
+-----------------------------------------------------------------------------------
+
+Version 2.82.1002
+
+Made by Product Creation Tools, 06/07/2007
+
+Defect fixes:
+
+    INC108949 - RELTOOLS: Cannot run GetEnv because another command is already running
+    DEF100309 - CBR Tools do not work with GNU Diff 
+
+-----------------------------------------------------------------------------------
+
+Version 2.82.1001
+
+Made by Product Creation Tools, 29/06/2007
+
+Defect fixes:
+
+    DEF102405 - reltools don't seem to cope with importing releases with sourceX
+                but no key
+    DEF105028 - Cleanlocalarch did not keep a recent component when it was specified to
+    DEF107829 - Autoflush turned on for reltool scripts
+    DEF107832 - Import.pm should have setting so that "Incorrect PGP passphrase"
+                doesn't hang YG
+
+Compatibility notes:
+*   Previously Cleanlocalarch would remove components which were corrupt or which
+    were being released into the archive at the same time Cleanlocalarch was
+    running.  Now Cleanlocalarch will not remove these components by default.
+    If you wish for Cleanlocalarch to remove such components you will need to
+    specify the -r (really clean) flag when running Cleanlocalarch.
+
+-----------------------------------------------------------------------------------
+
+Version 2.82.1000
+
+Made by Product Creation Tools, 26/06/2007
+
+New Features:
+*   GT0366/PREQ1703 Traceability PREQ for changes to legacy functionality which
+    have been delivered as part of Nutmeg
+    REQ7325 CBR intelligent bitwise-delta releases
+
+Compatibility notes:
+*   This change provides the new DeltaEnv command - there is no change to the
+    existing release/import/export commands or their functionality
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1018
+
+Made by Product Creation Tools, 19/06/2007
+
+Defect Fixes:
+
+    DEF107823 - CBR Tools compatibility fix for export sources owned by another component
+
+Compatiblity notes:
+*   If you specify the wrong number of arguments for the 'export_file' keyword in
+    an MRP file then an error will be produced.  The new error is 'Error: Invalid
+    number of arguments to 'export_file' keyword in "MRP name"'.
+
+-----------------------------------------------------------------------------------
+
+
+Version 2.81.1017
+
+Made by Engineering Tools, 08/06/2007
+
+Defect Fixes:
+
+    DEF107823 - CBR Tools compatibility fix for export sources owned by another component
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1016
+
+Made by Engineering Tools, 30/05/2007
+
+Defect Fixes:
+
+    INC104253 - ExportRel exits silently if release exists on FTP site
+
+Compatiblity notes:
+*   Additional messages in the ExportRel command:
+    - a note of anything that didn't need exporting because it already exists
+    - a report at the end of all successful exports
+    - a messsage at the end if the overall effect of the tool was to do nothing
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1015
+
+Made by Engineering Tools, 25/05/2007
+
+Defect Fixes:
+
+    INC105513 - Using validaterel results in releases with corrupt manifest files
+    INC105514 - Cannot find mrp file when using validaterel
+    INC105518 - Out-commented line in mrp file picked up anyway...
+    INC105677 - CBR Tools behave badly with special characters in passwords
+    INC105539 - Viewnotes produce not so good html...
+    INC105535 - Greek and Russian characters are not supported by reltools
+    INC105548 - Reltools allowing to build on drives lower than F:
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1014
+
+Made by Engineering Tools, 30/04/2007
+
+Defect Fixes:
+
+    DEF101018 - CBR getenv gets stopped
+    DEF101032 - Unnecessary confirmation dialog in installer during upgrade
+    DEF104279 - The exclude keyword in the CBR export table breaks the exported archive
+    DEF104280 - CBR Documentation of export tables is incomplete
+
+Minor Changes:
+    Amended the error messages produces when UnZip fails to include the return code
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1013
+                             
+Made by Engineering Tools, 01/03/2007
+
+Defect Fixes:
+    DEF099673 - OS limits on path length are not enforced by CBR tools
+    DEF102329 - Importenv runs slowly
+
+Compatibility Notes:
+*   Amended CleanEnv so that warning messages are produced instead of error
+    messages in relation to files and the OS path length.
+
+-----------------------------------------------------------------------------------
+    
+Version 2.81.1012
+                             
+Made by Engineering Tools, 20/02/2007
+
+Defect Fixes:
+    INC101483 - dumpbin /symbols /exports failed
+
+Compatibility Notes:
+*   The tools will now continue on from errors originating from an evalid
+    dependency (e.g. dumpbin, and also others such as elfdump).  The errors are
+    suppressed if they originate from dumpbin, and appear as warnings if
+    originating from other tools.
+*   When validating the message 'No checksum found for files(s)...' will appear
+    in all these cases, or when validating against a release which experienced
+    one of the above evalid dependency failures when it was made.
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1011
+                             
+Made by Engineering Tools, 22/01/2007
+
+Defect Fixes:
+    DEF098727 - Add support for forcing an import of an environment
+    DEF092967 - [CBR Tools] Re-enable newly disabled functionality in fix for DEF092883
+    DEF099673 - OS limits on path length are not enforced by CBR tools
+    DEF100138 - LatestVer filtering is case sensitive
+    DEF097215 - CBR/Evalid generates incorrect manifest checksum when dumpbin not present
+
+Compatibility Notes:
+*   Path lengths are now enforced by the CBR tools.  It is now not possible to
+    release a file with a path of containing more than 245 characters.
+*   A new informational message has been added.  When validating against a
+    component which was built on a machine with no 'dumpbin' program, and which
+    contains files that require dumpbin in order to be validated, the code will
+    now revert to the validation process which predated version 2.81 of the
+    tools.
+    The new message is 'No checksum found for files(s) <files> - reverting to
+    old evalid process.'
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1010
+Made by Engineering Tools, 03/01/2007
+
+Defect Fixes:
+    DEF091267 - CBR tools 2.80 produce warning when used with Perl 5.8.7
+    DEF095504 - Support for 'ipr' keyword tolerance
+    DEF099019 - Export does not give FTP information without extra options
+
+Compatibility Notes:
+*   The 'ipr' keyword is not to be used in MRP files as the CBR Tools will
+    ignore it.  This functionality has been added to support PREQ775.
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1009
+Made by Engineering Tools, 12/12/2006
+
+Defect Fixes:
+    DEF097247 - CBR command diffrel is broken unless you provide version information
+    INC096841 - ImportEnv can lead to corrupt environments in low-disc space situations
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1008
+Made by Engineering Tools, 24/11/2006
+
+Defect Fixes:
+    DEF097671: CBR assumption makes binaries from a new tools platform orphans 
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1007
+Made by Engineering Tools, 2/11/2006
+
+New Features:
+*   Implemented CR0751 - Remove GPG binary from CBR Tools distribution
+
+Compatibility Notes:
+*   Users will need to have installed a version of GPGv1.x or PGP Command Line
+    version 6 or later to use the import/export functionality.  The tools no
+    longer come with a default tool.
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1006
+Made by Engineering Tools, 21/09/2006
+
+Defect Fixes:
+    DEF091264	LatestVer should filter results by a pattern
+    DEF092244	Use of uninitialised value in Manifest.pm line 128
+    DEF092722	exclude.txt parsing dislikes hyphens in wildcard specifications
+    DEF092972	ViewNotes creates blank documents when attempting to view notes
+                for a component which has not been released
+    DEF093204	CBR Tools Quick Reference typo
+    DEF093609	validaterel assumptions about path case can lead to CBR errors
+    DEF094460	[System Build] - Can't locate EvalidCompare.pm
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1005
+Made by Engineering Tools, 17/08/2006
+
+Defect Fixes:
+    DEF092883  [System Build] - CBR Tools identifying folders as orphans
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1004
+Made by Engineering Tools, 08/08/2006
+
+Defect Fixes:
+    DEF087684  [CBR Tools] Diffrel can't cope with paths longer than as little as 115 chars
+    DEF090893  [CBR Tools] The reltools.ini 'experimentalproxy' keyword is treated as 'proxy'
+    DEF088308  [CBR Tools] Run-time error when EPOCROOT is invalid
+    DEF088479  [CBR Tools] Tools never warn about missing cbrtargetalias.cfg
+    DEF089530  "cleanenv -rf" doesn't remove rogue dirs
+    DEF085602  [CBR Tools] Get source for any environment
+    INC089568  reltools.ini.ex out of date
+
+Compatibility Notes:
+*   GetEnv functionality has been extended to allow the source code for any
+    environment to be downloaded, irrespective of whether it is the current
+    environment or not.  This is achieved by using the --source-only switch.
+*   When using cleanenv it will now remove any empty directories it finds within
+    the EPOC tree.  The list of directories to be removed will be displayed
+    with the list of files to be removed.
+*   If the 'remote_site_type experimentalproxy' option was specified in the
+    reltools.ini file, it would actually have been interpreted as 'proxy' and
+    not 'experimentalproxy'.  Users using the 'experimentalproxy' keyword will
+    find that the tools now respect that keyword.  To get the old behaviour,
+    the remote_site_type value should be 'proxy'.
+*   The CBR tools now create temporary directories under the system temp dir.
+    If your system temp dir is deeply nested, it may be better to override this
+    with a shorter path, since there are limitations on internal path lengths
+    for certain cbr commands.  This can be done my specifying the 'temp_dir'
+    keyword in reltools.ini, e.g. 'temp_dir c:\temp'
+*   The CBR tools should produce a warning message if the cbrtargetalias.cfg
+    file is missing.  This functionality was not working properly and has now
+    been fixed.  This warning message can be suppressed by specifying the
+    'no_target_alias_warning' in your reltools.ini.
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1003
+Made by Engineering Tools, 06/06/2006
+
+Defect Fixes:
+    DEF065262  [CBR Tools] cleanremote fails to clean old releases (documentation issue)
+    DEF084397  Upgrading releases using getenv doesn't remove empty include directories
+    DEF085780  ValidateRel fails when no MRP file exists (e.g. due to having no source)
+    DEF087482  cleanremote broken in 2.80.1002
+
+Compatibility Notes:
+*   If using cleanlocalarch and the copy of the component in the local archive is
+    corrupt then cleanlocalarch will give the following error message and continue:
+    "Warning: Unable to identify the environment for 'Component Version'. This may
+    result in additional component releases being cleaned from the archive.
+    (Corrupt release; missing reldata file)".  This replaces the error message:
+    "No Reldata file exists for $thisComp $thisVer as it would appear to be corrupt.
+    A fresh version shall need to be installed".
+
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1002
+Made by Engineering Tools, 26/04/2006
+
+Defect Fixes:
+    DEF084619: [CBR Tools] Cat X is pre-2.80.1000 Compatible
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1001
+Made by Engineering Tools, 19/04/2006
+
+Defect Fixes:
+    DEF068972: [CBR Tools] A CBR component being installed can't be interrupted
+
+-----------------------------------------------------------------------------------
+
+Version 2.81.1000
+Made by Engineering Tools, 12/04/2006
+
+New Features:
+* GT0278/TREQ0017 Significantly Reduce CBR Build Time
+    REQ0035  Add component manifest
+     An XML manifest is created during component release - contains Evalid MD5
+     checksums of component content.
+    REQ0036  ValidateEnv/Rel using Evalid MD5
+     Validation uses the manifest checksums rather than installing a temporary
+     local copy and generating evalid data every time.
+
+N.B.: The text above is a summary of the requirements.
+
+Defect Fixes:
+    DEF058539: [CBR Tools] Timestamp of source clobbered by reapplication of MSDOS attributes
+    DEF077956: [CBR Tools 2.80.1001] Unhelpful Warnings
+
+Compatibility Notes:
+*   A manifest.xml file is added to each new component published. This can be
+    found at the same level as the component reldata file within the archive.
+
+-----------------------------------------------------------------------------------
+
+Version 2.80.1003
+Made by Engineering Tools, 04/04/2006
+
+Defect Fixes:
+    DEF083821: CBR tools 2.81beta3 breaks the PATH environment setting
+
+-----------------------------------------------------------------------------------
+
+Version 2.80.1002
+Made by Engineering Tools, 03/04/2006
+
+Defect Fixes:
+    DEF083670: cleanlocalarch stops cleaning
+    DEF083808: CBR tools have incorrect "earliest compatible version" in reldata
+    DEF077676: CBR tools create perl warnings and unhelpful output given a bad .mrp file
+    DEF082745: CBR tools envinfo releasable error should be clearer
+    DEF083234: CBR Tools MrpData->Source() method returns some directories
+
+Compatibility Notes:
+
+*   The error message for a bad line in an MRP file has been changed.  The line
+    number of the bad line is now printed inbetween the MRP file name and the
+    bad line offending line is always printed too e.g. Warning: Invalid line in
+    "helloworld\group\helloworld.mrp" (Line 3) - "source\helloworld"
+    instead of:
+    Warning: Invalid line in "helloworld\group\helloworld.mrp" - .
+*   When the EPOCROOT could not be removed from the path the following error
+    message was displayed: "Error: Couldn't remove "\" from "afolder".
+    This has now been changed to:
+    Error: Path does not contain EPOCROOT - EPOCROOT:"\" - Path:"afolder".
+
+-----------------------------------------------------------------------------------
+
+Version 2.80.1001
+Made by Engineering Tools, 12/01/2006
+
+Defect Fixes:
+    DEF077665: [CBR Tools] does not add any files warning should be a remark
+
+-----------------------------------------------------------------------------------
+
+Version 2.80.1000
+Made by Engineering Tools, 06/01/2006
+
+New Features:
+* GT0278/TREQ0018 CBR Tools ISC Support
+    REQ0018  Comply with new version numbering
+     The CBR Tools must adhere to the Engineering Tools versioning standard.
+    REQ0037  Update tools documentation
+     The CBR Tools documentation must be updated to include new features.
+    REQ0045  Arbitrary IRP categorisation (A-Z)
+     The CBR Tools must allow arbitrary IPR categorisation of source and
+     exports to permit additions within the CKL.
+    REQ0076  Enhance existing export filtering
+     The CBR Tools export functionality must be able to differentiate between
+     source and exports when encryptying based on IPR category.
+
+N.B.: The text above is a summary of the requirements.
+
+Defects Fixed:
+    DEF044949  [Reltools] Missing in-source documentation
+    DEF052380  [RelTools] Misleading warning message from 2.76.3
+    DEF053523  [Reltool] bininfo after preprel does not work
+    DEF054781  [Reltools] InstallSnapshot falls over if given no options.
+    DEF054800  [Reltools] CBR Release Tools message in 'importenv' is gibberish.
+    DEF054806  [reltools] Release tools command 'BuildRel' compatibility break
+    DEF055785  [Reltools] DiffRel upset if no source
+    DEF058539  [Reltools] Timestamp of source clobbered by reapplication of MSDOS attributes
+    DEF058760  [Reltools] GPG decrypt less verbose than GPG encrypt
+    DEF060192  cleanlocalarch does not report failure to delete files / directories
+    DEF061247  CBR tools Installation document still refers to source_filter keyword
+    DEF061580  [RelTools] PASV mode suggested when PASV mode enabled
+    DEF061684  GPG Encrypt/Decrypt does not show command executed in very verbose mode
+    DEF062294  [RelTools] Validateenv produces warnings
+    DEF064016  [RelTools] Validateenv fails if source is not present
+    DEF064912  validaterel does not report filename of reclassified export
+    DEF065010  CBR Tools treat "-exports" as "exports"
+
+Compatibility Notes:
+*   The CBR Tools were incorrectly interpreting the (illegal) MRP syntax "-exports"
+    to mean "exports". Version 2.80 of the CBR Tools corrects this defective action
+    and will now stop with the fatal error, 'Error: Unknown keyword "-exports" in
+    [file.mrp]' should this be encountered (where [mrp.file] is replaced by the
+    path to the actual MRP file containing the incorrect syntax). Actions to
+    resolve: 1. Ensure no MRP files contain the illegal syntax. 2. Use the
+    -export_file syntax instead (if required). 3. Be aware that any files thought
+    to have been excluded from export were actually being exported.
+*   CBR Tools release 2.76.4 inadvertently 'touch'ed the files as a result of
+    reapplying the MSDOS file attributes after unzipping (e.g. during a getenv
+    operation). This overwrote the original Modified timestamps with the current
+    system time. CBR Tools release 2.80 will preserve the timestamps as all releases
+    prior to 2.76.4 used-to. If any dependency has been introduced based on this
+    unintentional change then the actions to resolve will depend on the actual
+    implementation of the dependency. We do not believe it is likely that any issue
+    will exist due to the obscurity and relative short life of this defective
+    action.
+*   Additional -v (verbose output) has been added to the tools during GPG
+    decryption. This will permit the output from the encryption utility to be seen.
+    This brings the decryption action into line with the encryption action which
+    already displays the utility output. During a CBR import and when in verbose
+    mode, this additional output will be included in the command output. The
+    additional output will follow the form of the encryption output display in that
+    each line will be indented with a tab character. These lines may be safely
+    ignored as verbose output.
+*   IPR categorisation of source files was until recently restricted to A-G or X
+    (for undefined). Any letter: A-Z, is now permitted (with X retaining its special
+    property of representing "IPR not specified"). The behaviour in previous
+    versions of the tools was undefined should a previously-invalid categorisation
+    have been encountered. In the unlikely event that any dependencies were created
+    on this undefined behaviour then each will need to be looked at to determine
+    sensible resolutions.
+*   Export table syntax has been updated to allow for separate treatment of source
+    and exports. The old syntax is still supported but more rigorous error checking
+    will ensure that any invalid content will cause a fatal error to be thrown. Only
+    the keywords "exclude", "exclude_bin", IPR categories consisting single letters
+    "A"-"Z" and whitespace will be allowed. Any other punctuation will not be
+    permitted, e.g. hyphens, brackets, braces etc. These were not explicitly
+    disallowed in the previous versions but must now be, to allow the additional new
+    syntax to be checked properly. Actions to resolve any issue: 1. restrict export
+    table content to only the above permitted keywords and the new syntax (details
+    of which will are available in the documentation).
+
+-----------------------------------------------------------------------------------
+
+Version 2.76.4
+Made by Nic Percival, 15/02/2005
+
+From Nic Percival:
+* Fixes for:
+    DEF054892 - Missing option "exclude_bin" from the documentation in module "Installation"
+
+From Hocine Adjerid:
+* Fixes for:
+    DEF053737 - [Reltools] CBR Tools Fail to work with "testexports" keyword
+    DEF051278 - [Reltools] zip does not accept filenames with '['
+    DEF050304 - [Reltools] Commands within the RelTools indicate they are not supported
+    DEF050374 - [Reltools] importrel should not rely on EPOCROOT being set
+    DEF051241 - [Reltools] CBR tools provided GnuPG does not support IDEA encryption algorithm
+    DEF049473 - [Reltools] CBR tools users must not 'send us a patch'
+    DEF052150 - [Reltools] importrel/importenv are case sentive in 2.76.3 unlike earlier version
+    DEF051424 - [Reltools] RemoteSite::NetDrive unhelpful
+* Implemented CR:
+    CR-EKOS-653GJ9 :  add the possiblity to exclude binaries from a component when exporting.
+
+From George Sin:
+* Fixes for:
+    DEF043802 - [Reltools] CleanLocalArch is not atomic in it's move operations
+    DEF049619 - [Reltools] viewnotes -d between gt_techview and gt_only_baseline crashes
+    DEF049823 - [Reltools] Cleanlocalarch in release tools 2.76.2 documentation needs updating
+    DEF047825 - [Reltools] CBR tools inefficient at searching for releases
+    DEF043820 - [Reltools] lastestver documentation is unclear
+* Implemented CR:
+    ABEK-63REXV: Option to overwrite destination when using cleanlocalarch of the CBR tools.
+    CLEN-65CEUW: RemoveSource functionality needed for redundant components found during a Getenv\Getrel command
+    JROE-62DHSZ: Add support to CBR viewnotes to output HTML on stdout rather than creating a file.
+    EMAE-68LJZF: Minimising CBR delta sizes when transferring CBR builds between parties with shared source access
+
+From Larry Knibb
+* Fix for:
+    DEF053799 - [Reltools] CBR tools do not preserve file attributes
+
+
+From Conor Lennon:
+* Fix for:
+    DEF051830 - [Reltools] reltools 2.76.3 causing IO errors
+* Implemented CR:
+    CLEN-65CF94 Baseline component for DevLib and Documentation components so as to install documention as an option
+    CLEN-65CEUW  Remove Source functionality needed for redundant components found during a Getenv\Getrel command
+
+-----------------------------------------------------------------------------------
+
+Version 2.76.3
+Made by Iain Williamson, 04/11/2004
+
+From Conor Lennon:
+*Fix for:
+    DEF050197  [System Build] CBR Warnings in 03387 (8.1a) introduced by new RelTools
+
+-----------------------------------------------------------------------------------
+
+Version 2.76.2
+Made by Nic Percival, 08/10/2004
+
+From Hocine Adjerid:
+* Fixes for:
+    DEF045203  CBR Tools do not support all FTP server s/w
+    DEF048538  CBR: Archive::Zip module truncates some files during unzip
+    DEF049213  zip.exe does not accept name with '['
+    DEF049351  CBR tools do not find cbrtargetalias unless EPOCROOT is set to /
+
+From George Sin:
+* Fixes for:
+   DEF045331  RelTools v2.74 fail on removesource if full component not present
+   DEF046291  Latestver of the reltools does not like archives that don't exist
+   DEF047874  Cleanlocalarch determine from the output if it's was a dummy run
+   DEF047458  Release tools: ftp_timeout field not used
+   DEF047935  Reltools docs error
+
+* Also includes implementation for CR WROS-5ZLKHS Provide a tool which can create a new version
+  of a CBR component by copying and manipulating the archive metadata of an existing version
+
+From Iain Williamson:
+* Implemented CR ABEK-5z5GXE Usable CBR archive cleaning - new keep_recent_rel
+  and keep_recent_env keywords
+
+From George Sin:
+
+* Fixes for:
+   DEF047062 [Reltools] CBR Tools fail to identify the need to upversion a component.
+   DEF048513 [Reltools] validateenv does not check for additional binaries.
+
+From Uma Ahamed:
+* Added fix for DEF045288 - latestver and viewnotes don't work in 2.75.2 with gt_only_baseline
+
+-----------------------------------------------------------------------------------
+
+Version 2.76.1
+Made by Iain Williamson, 11/08/2004
+
+From Uma Ahamed:
+
+* Added fix for DEF043802 "CleanLocalArch is not atomic in it's move operations"
+
+* Added fix for DEF046030 "cleanenv removes component without re-installing it"
+
+From George Sin:
+
+* Fixes for:
+   DEF043820  lastestver documentation is unclear
+   DEF044978  Error in how source is unpacked in the Release tools...
+   DEF045715  Incorrect warning about -binary in comms-infras_commdb_cedar
+   DEF046148  Release Tools do not allow spaces in their installation directory
+   DEF046325  RelTools don't report correct error messages in local arch disc
+     full conditions
+   DEF046711  Release tools 2.76 cannot install files that already exist and is
+     read only...
+
+From Hocine Adjerid:
+
+* Fix for DEF046532  RelTools v2.76 won't configure to work with an internal
+    proxy for FTP traffic
+
+-----------------------------------------------------------------------------------
+
+Version 2.76
+Made by Iain Williamson, 07/06/04
+
+From George Sin:
+
+* Have added all build from anywhere functionality as part of PR0097.
+
+* The keyword source_map is now accepted in the reltools.ini file.
+
+* In source documentation updated to refect the change.
+
+From Nic Percival:
+
+* Added fix for DEF045096, retry gpg if it fails with return code 2.
+
+From Iain Williamson:
+
+* Fixes for DEF043798, 043802, 044943 and 044944 (various cleanlocal/remote
+  archive defects)
+
+From Paul Ross:
+
+* Added fixes for DEF045417, DEF045416, DEF045414, DEF044950, DEF044948
+  DEF044947, DEF044946, DEF044781, DEF044778, DEF044777, DEF044775, DEF044773
+  DEF044771 (code review defects)
+
+-----------------------------------------------------------------------------------
+
+Version 2.75.2
+Made by Iain Williamson, 10/05/04
+
+From Paul Ross:
+
+* Suppressed warning of missing alias file if not using 'all' functionality
+  (DEF044726)
+* Suppressed directory listing during FTP (DEF044724)
+
+From Iain Williamson:
+
+* Fixed 'argument "n.nn.n" isn't numeric...' warning (DEF044699)
+
+From George Sin:
+
+* Fixed broken link when building 'MakingReleases' doc (DEF044976)
+
+-----------------------------------------------------------------------------------
+
+Version 2.75.1
+Made by Iain Williamson, 23/04/04
+
+From Paul Ross:
+
+* Fixed bug where tools failed to obtain the correct IPR category for export
+  restricted files (DEF044565)
+
+-----------------------------------------------------------------------------------
+
+Version 2.75
+Made by Iain Williamson, 21/04/04
+
+From Paul Ross:
+
+* Added support for the aliasing system in MRP files, for example using
+  a target 'ALL' in an MRP file.
+
+* The data needed to resolve aliases is in \epoc32\tools\variant\cbrtargetalias.cfg,
+  if this is absent a warning is issued only when required and then only once.
+  The warning can be suppressed by the presense of a flag 'no_target_alias_warning'
+  in the reltools.ini file.
+
+* In IniData.pm added APIs ReadTargetAlias(), ReadTargetAliasFile() to read the
+  alias file. Added APIs HasTargetPlatforms() and TargetPlatforms() to resolve
+  MRP aliases. Added API CheckAliasWarning() to handle the absence of alias
+  file warning.
+
+* In MrpData.pm added implementation code in HandleBinSet() to provide resolution of
+  aliases if appropriate.
+
+From Adrian Taylor:
+
+* Removed obsolete GenMrp and UpdateMrp commands.
+
+* Marked several obscure tools as 'unsupported'
+
+* Added warnings if -binary or -export_file are not doing anything.
+
+* Added two new types of remote archive: 'experimentalftp' and
+  'experimentalproxy'. These are exactly the same as 'ftp' and 'proxy',
+  but use a different algorithm for listing the contents of the FTP site.
+  You may find that these new remote site types work successfully with
+  CleanRemote, whilst the standard 'ftp' and 'proxy' types almost
+  certainly will not.
+
+* Rejigged the test suite to use a real FTP site for testing.
+
+-----------------------------------------------------------------------------------
+
+Version 2.74
+Made by Adrian Taylor, 12/02/04
+
+This version is identical to 2.73-Testing-Only.
+
+-----------------------------------------------------------------------------------
+
+Version 2.73  *** TESTING ONLY ***
+Made by Adrian Taylor, 30/01/04
+
+From Adrian Taylor:
+
+* Added -i flag to GetRel
+
+* Ensured little dots march across screen even with the dodgy IO layer
+  of Perl 5.8.x
+
+* Fixed bug where tools didn't complain if EPOCROOT wasn't set (DEF041251)
+
+* 'component' argument to EnvInfo -f <component> was case-sensitive. INC040759.
+  Fixed.
+
+* Added Optimisation document.
+
+* Added new field to reldata: 'first compatible version'. This shows the first
+  version of the tools that a given release should work with. It's set based on
+  the CategoriseXXX features in the reltools.ini. GetRel and GetEnv issue a
+  warning if they're trying to install a release that's too recent.
+
+* Added optional version number filter to LatestVer, so it only shows versions
+  with a certain phrase in their version number.
+
+* Tests for GetSource -i, GetRel -s and GetRel -si added to test suite.
+
+* Fix for serious bug, introduced in 2.71, where duplicate ownership files were
+  sometimes not reported.
+
+* Increased diagnostics for problems listing directories on FTP sites, to try
+  to work out what's up with the Symbian FTP site.
+
+* Increased robustness of RemoteSite::FTP::DirList now I've seen the symptoms
+  that the Symbian FTP site has.
+
+* Improved efficiency of ExportEnv - it no longer does so many redundant checks
+  to find out if a release has already been exported.
+
+* Upgraded Net::FTP to libnet-1.17
+
+* Reverted 2.72 change where FTP connections used 'dir' instead of 'ls'. This
+  will reveal problems with CleanRemote, which I have tried to work around.
+
+From Matt Davies (merged by Ade):
+
+* Fix for INC040720 - CBR Tools: Categorised Exports cannot have spaces in the source path
+
+-----------------------------------------------------------------------------------
+
+Version 2.72
+Made by Adrian Taylor, 4/12/03
+
+From Adrian Taylor:
+
+* Added 'testexports' MRP directive
+
+* Re-enabled limited SourceInfo functionality
+
+* Fixed many bugs in CleanRemote.
+
+* Ensure 'PGP passphrase' prompt is never invisible even on Perl 5.8.x
+
+* Added \epoc32\release\tools\* to the list of standard ignores, as the
+  files in there are intermediate files. (They get copied to \epoc32\tools,
+  which is the final resting place). See DEF039764 for the reasoning.
+
+* Prevented the use of Win32::Semaphore module when disable_win32_extensions
+  is turned on
+
+From Joe Branton:
+
+* Added checks to ensure that all exported files referred to by an MRP file physically
+  exist. Also added a defensive check to Utils::ZipList to throw an error if any
+  of the files being zipped are not present (previously such situations were being
+  ignored).
+
+-----------------------------------------------------------------------------------
+
+Version 2.71
+Made by Joe Branton, 08/10/2003
+
+Know Problems:
+
+* The command 'SourceInfo' is broken in this release.
+
+From Adrian Taylor:
+
+* Removing -d option from LatestVer documentation
+
+* Removed annoying FTP site prompting with LatestVer -vv when no FTP site
+  defined.
+
+* Prevented the version number '0' which confused the tools
+
+* Fixed bug which prevented BinInfo <file> working if the component was
+  pending release.
+
+From Joe Branton:
+
+* Added support for EPOCROOT with a value other that '\'. When installing binaries
+  they will be installed into %EPOCROOT%\epoc32. When making releases, EPOCROOT is
+  not stored in the zip files, thereby allowing a release to be installed into an
+  environment configured with a different EPOCROOT.
+
+* Added support for a new environment variable - SRCROOT. This is similar to EPOCROOT
+  except that it defines where the release tools install source (by default - the -i
+  option can still be used to override this). SRCROOT information is not stored in
+  release zip files.
+
+* Added support for relative paths in MRP files. You can now do things like:
+
+    binary . all
+    exports ..\somepath
+
+  Such paths are read as being relative to the directory inwhich the MRP file is stored.
+  If absolute paths are specified, the following rules apply to each keyword:
+
+    'notes_source <file>'                    - SRCROOT is prepended to <file>.
+    'source <file|dir>'                      - SRCROOT is prepended to <file> or <dir>.
+    '[-][test]binary <abld_path>'            - SRCROOT is prepended to <abld_path>.
+    '[-][test]binary <file|dir>'             - EPOCROOT is prepended to <file> or <dir>.
+    'exports <abld_path>'                    - SRCROOT is prepended to <abld_path>.
+    '[-]export_file <src_file> <dest_file>'  - SRCROOT is prepended to <src_file>.
+                                             - EPOCROOT is prepended to <dest_file>.
+
+  Note, it is assumed that all components are EPOCROOT compliant (i.e. only generate files
+  within %EPOCROOT%). Currently at least one component (Java) is known to not comply. This
+  has the consequence that it is not currently possible to release Java using an EPOCROOT
+  of anything other than '\'. It also means that when installing an environment containing
+  Java, its 'erj' directoy will be put in %EPOCROOT%\erj rather than \erj.
+
+  Tools developers note, within MrpData all paths are stored in absolute form, but
+  without EPOCROOT or SRCROOT at the beginning. This is because parts of MrpData get
+  written into RelData objects, and these need to be independent of EPOC/SRCROOT. The
+  consequence of this is that care must be taken both within MrpData and by users of
+  MrpData to prepend EPOCROOT or SRCROOT as appropriate before using the paths.
+
+* Added support for :zip statements in the PRJ_EXPORTS section of bld.inf files. Note,
+  at the time of writing bldmake.pl contained bugs in it's implemention of this
+  functionality. Tested against a hacked version of bldmake.pl that contained fixes to:
+    a) "abld -w export" listing "\" as an export (bug in GetArchiveExportList()).
+    b) "abld -w export" not listing exports relative to EPOCROOT.
+
+-----------------------------------------------------------------------------------
+
+Version 2.70
+Made by Adrian Taylor, 07/08/2003
+
+From Adrian Taylor:
+
+* Better error checking of 'unzip' return code, detecting invalid releases.
+  Similarly with GPG.
+
+* Fix to allow 'perldoc CleanEnv' to produce the command manual page,
+  rather than the manual page for the internal module.
+
+* Fixed problem with -f option on Push/Pull/Rel/Env
+
+* Worked around bug in Perl 5.8.0 itself, which prevented GetRel -p and
+  MakeRel -p from working (Perl bug #21217)
+
+* Fixing minor bug in test suite t_snapshot and Perl 5.005
+
+-----------------------------------------------------------------------------------
+
+Version 2.69
+Made by Adrian Taylor, 30/7/2003
+
+From Adrian Taylor:
+
+* Fixing bug in ValidateEnv which resulted in complaints about "uninitialised
+  value at line 644".
+
+-----------------------------------------------------------------------------------
+
+Version 2.68
+Made by Adrian Taylor 23/7/2003
+
+From Adrian Taylor:
+
+* Fixing bug in ValidateRel. If there was a component with binary files,
+  none of which were within \epoc32, and no source code files, its status
+  would always be reported as clean by validation.
+
+-----------------------------------------------------------------------------------
+
+Version 2.67
+Made by Joe Branton 9/07/2003
+
+From Adrian Taylor:
+
+* Fixing bug in ValidateRel. If you had a pending release component, then
+  you validated against a component that didn't match what you had, the tools
+  got temporarily confused and you had to PrepRel the component to get things
+  back to normal.
+
+From Joe Branton:
+
+* Added '-d' option to CleanLocalArch to allow dummy runs to be performed.
+
+* Changed behaviour of CleanLocalArch so that it cleans entire releases - previously
+  it left reldata files behind in an attempt to preserve release note history. However
+  with this file in place the tools will not warn the user if they attempt to install
+  the corresponding release even though there is nothing to install. This issue
+  needs to be addressed in a more fundamental way. For the time being cleaned releases
+  are removed without trace.
+
+* Removed output to STDERR from the majority of the tools. Note, this has not been done
+  for the Net (FTP etc) modules and IPRTOOL since sources are not technically part of
+  the release tools and we don't want to branch them.
+
+-----------------------------------------------------------------------------------
+
+Version 2.66
+Made by Adrian Taylor 24/06/2003
+
+From Adrian Taylor:
+
+* Reinstating CleanLocalArch command
+
+-----------------------------------------------------------------------------------
+
+Version 2.65
+Made by Joe Branton 16/06/2003
+
+From Adrian Taylor:
+
+* Fixing bug in MakeSnapShot - no error message was printed if the filename
+  was not specified
+
+* Fixing bug which prevented 'viewnotes -s <comp>' when <comp> not installed
+
+From Joe Branton:
+
+* Fixed defect that caused .lib file binaries (and potentially other duplicate files
+  to be incorrectly categorised. Duplicate files should now be put into the 'unclassified'
+  category so that they are available regardless of the user's 'required_binary'
+  configuration.
+
+-----------------------------------------------------------------------------------
+
+Version 2.64
+Made by Joe Branton 8/5/2003
+
+From John Roe (merged by Joe Branton):
+
+* Fixed bug in mrp parser that caused an error to be thrown when parsing mrp files
+  with multiple "exports" statements with export classification enabled.
+
+-----------------------------------------------------------------------------------
+
+Version 2.63
+Made by Andy Salter 14/04/2003
+
+From Andy Salter:
+
+* Added EnvUserName to reldata.pm and viewnotes.
+
+-----------------------------------------------------------------------------------
+
+Version 2.62
+Made by Joe Branton 07/04/2003
+
+From Adrian Taylor:
+
+* Fixed bug that prevented reltools.ini keyword 'pasv_transfer_mode' from working.
+
+* Added helpful error message if Utils::SplitFileName dies due to a known bug in Perl 5.6.0 (fixed in 5.6.1)
+
+* Added more files to blddocs
+
+* Ignore whitespace at start and end of lines with getrel -p
+
+From Andy Salter:
+
+* Added -o option to ViewNotes, to allow writing output to a file or directory.
+
+From Joe Branton:
+
+* Added utility InstCol2. See documentation for details.
+
+* Fixed minor interface bug in BinInfo - died nastily if given no arguments.
+
+* Fixed defect in ini file parser that caused spurious "Unknown keyword" errors to be
+  displayed when running the test t_exportimport. It's unlikely that this defect would
+  ever be seen in 'the wild' because it would have been necessary for the Perl variable
+  $1 have been set before parsing the ini file. Since the tools always parse the ini file
+  pretty much before doing anything else, this is unlikely to happen. (Also in 2.60.01)
+
+* Fixed identical problem to that described above in MrpData. (Also in 2.60.01)
+
+* Integrated latest version of IPRTOOL (provided by Uma Ahamed) which fixes problem
+  relating to '.' characters in directory names. Removed corresponding assertions from
+  MrpData.
+
+From Iain Williamson (merged by Joe):
+
+* Fixed defect in the way the required_binaries reltools.ini keyword is handled. Now,
+  for example, specifying 'wincw' will not result in 'wins' also being installed.
+  (Also in 2.60.01)
+
+* Added -i <source install directory> option to GetEnv (mirrors GetSource -i option).
+  Note, the supplied patch was slightly modified - the logic for checking that -i is
+  always accompanied with -s was wrong. (Also in 2.60.01)
+
+-----------------------------------------------------------------------------------
+
+Version 2.61
+Made by Joe Branton 13/03/2003
+
+From Joe Branton:
+
+* Extended the behaviour of Im/ExportRel regarding the handling of a list of component
+  versions specified in a text file. The commands now support im/exporting multiple
+  versions of the same component.
+
+* Fixed minor interface bugs in ViewNotes. Now correctly reports when a component
+  does not exist, rather than displaying an empty web page.
+
+* Added 'dummy run' option (-d) to CleanRemote.
+
+* Overhalled configuration of the automated tests. There is now a 'developer_specific.txt'
+  configuration file in the 'configs' directory which should be all developers need to
+  change in order to set up the test harness. The various configurations are generated
+  using a new module ConfigMaker. This provides some C pre-processor like functionality
+  to allow the amount of duplication between configurations to be minimised. See the test
+  documentation for details.
+
+* Fixed defect in ini file parser that caused spurious "Unknown keyword" errors to be
+  displayed when running the test t_exportimport. It's unlikely that this defect would
+  ever be seen in 'the wild' because it would have been necessary for the Perl variable
+  $1 have been set before parsing the ini file. Since the tools always parse the ini file
+  pretty much before doing anything else, this is unlikely to happen.
+
+* Fixed identical problem to that described above in MrpData.
+
+* Added MrpComplexity command. See documentation for details.
+
+* Fixed defect in PrepEnv interactive mode that caused it to prematurely abort if an
+  internal version was not specified when internal versions are required. It now reports
+  an error and carries on.
+
+* Added new commands MakeSnapShot and InstallSnapShot. See documentation for details.
+
+From Adrian Taylor:
+
+* Tidied error message in PathData/ProjectBased
+
+* Fixed regression in 2.59 where diffenv -v no longer overrode -d
+
+* Clarified documentation of -a in latestver
+
+* Added further documentation for -n in viewnotes
+
+* Clarified messages printed by validate[env|rel] -vs
+
+* Spaces at the end of 'source XXX' lines in MRP files are now ignored
+
+Note this release did NOT contain the changes made in 2.60.01 below. These fixes
+have been merged in 2.62.
+
+-----------------------------------------------------------------------------------
+
+Version 2.60.01
+Made by Joe Branton 31/03/2003
+
+From Iain Williamson (merged by Joe):
+
+* Fixed defect in the way the required_binaries reltools.ini keyword is handled. Now,
+  for example, specifying 'wincw' will not result in 'wins' also being installed.
+
+* Added -i <source install directory> option to GetEnv (mirrors GetSource -i option).
+  Note, the supplied patch was slightly modified - the logic for checking that -i is
+  always accompanied with -s was wrong.
+
+From Joe Branton (bug fixes taken from latest branch to get tests to pass):
+
+* Fixed defect in ini file parser that caused spurious "Unknown keyword" errors to be
+  displayed when running the test t_exportimport. It's unlikely that this defect would
+  ever be seen in 'the wild' because it would have been necessary for the Perl variable
+  $1 have been set before parsing the ini file. Since the tools always parse the ini file
+  pretty much before doing anything else, this is unlikely to happen.
+
+* Fixed identical problem to that described above in MrpData.
+
+----------------------------------------------------------------------------------
+Version 2.60
+Made by Joe Branton 26/02/2003
+
+From Joe Branton:
+
+* Fixed defect in new export categorisation functionality that caused a
+  "Can't use string as an ARRAY" Perl error for components whose mrp file contained
+  an 'exports' statement, but which did not actually export anything.
+
+* Changed the way that exported files are IPR classified. Previously the classifications
+  were read from the corresponding source file classifications. However, this meant
+  that unless exported files are released as source, the tools would fail to find
+  the classification and throw an error. Now IPRTOOL is invoked to explicitly classify
+  the source of every  exported file, which lifts this limitation.
+
+-----------------------------------------------------------------------------------
+
+Version 2.59
+Made by ---, --/--/--
+
+From Adrian Taylor:
+
+* 'envinfo' and other read-only commands will no longer try to create all the
+  archives listed in your reltools.ini.
+
+* Fixed documentation error in latestver
+
+* Added check that 'source' directories do not contain '.', because iprtool
+  fails and therefore no source gets packaged up.
+
+* Improved realism of 'fake abld' in test suite.
+
+* Added check that archive_path lines in reltools.ini have a remote path
+  specified, when it's needed.
+
+* Added -d flag to 'ViewNotes' which produces a single HTML page concatenating
+  the release notes between one environment and another.
+
+* Changed DiffEnv to use a new class, EnvDifferencer.pm, which is also used
+  by ViewNotes.
+
+* Added warning to CheckBc that it requires Perl 5.6.1
+
+* Added information to "Installation" about where to get Perl 5.6.1
+
+* Added tests for 'viewnotes'. Added minimal tests to ensure that CheckBc
+  and CheckRls do at least run
+
+* getenv -o now overwrites binaries as well as source (including pending
+  release components)
+
+* Added new "Further Information" document and added information to
+  "Quick Start".
+
+* Fixed bug making releases of 'tools rel' or 'tools deb' components
+
+From Joe Branton
+
+* EnvSize now checks that the user has provided a component name before attempting
+  to calculate its sizes.
+
+* Added 'categorise_exports' keyword and corresponding functionality. See the
+  'Installation' section in the documentation for details.
+
+* Added '[-]export_file' mrp keyword and corresponding functionality. See the
+  'Making Releases' section in the doucmentation for details.
+
+* Added '-d' option to blddocs. By default 'Implementation Notes' are no longer
+  generated. This option can be used to override the default.
+
+* Added 'exclude' keyword and corresponding functionality to the export table parser
+  ExportData. See the 'Installation' section in the documentation for details.
+
+* Changed the failure report summaries of ImportEnv and ExportEnv to print a formatted
+  table.
+
+* Added multi-volume export / import functionality to allow exports to be done
+  do writable CD drives and the like.
+
+-----------------------------------------------------------------------------------
+Version 2.58
+Made by Adrian Taylor, 15/01/03
+
+From Adrian Taylor:
+
+* Fixed bug introduced in 2.56 where an environment scan would continue
+  to run if a binary file didn't exist. This reported very confusing
+  error messages from envinfo and makeenv, and if you agreed to the
+  prompts, cleanenv would delete extra files.
+
+* Added extra documentation and warning messages to prepenv, to note
+  that it doesn't always notice dirty components.
+
+* Fixed prepenv bugs. Firstly, it ignored new MRP locations. Secondly,
+  it misleadingly implied you didn't have to specify a new internal
+  version number for updated components.
+
+* Table formatter always now displays using text format if the output
+  is not a TTY.
+
+* Added -d flag to exportrel and exportenv, which means 'dummy run'.
+  It reports what would happen, without actually doing anything.
+  In particular it reports what PGP keys will be used to encrypt each
+  file.
+
+-----------------------------------------------------------------------------------
+
+Version 2.57
+Made by Adrian Taylor, 09/01/03
+
+From Joe Branton:
+
+* Fixed bug relating to unpacking zip files (say from a getsource) into a directory
+  that doesn't exist. It seems that zip can cope with a single directory not exisiting,
+  but not more than one.
+
+* Added vtable checking functionality to CheckBc.
+
+* Added options to CheckBc to allow individual tests to be disabled.
+
+* Added utility CheckRls.
+
+* Added check to ensure the EPOCROOT environment variable is set to '\'.
+
+* Fixed bug in PrepRel/Env that allowed a new mrp file to be specified without specifying a new version.
+
+From Adrian Taylor:
+
+* Added envsize command
+
+* Added reporting of release size into viewnotes
+
+* Added extra check to exporting, to ensure that the size of the resulting
+  file on the FTP site matches the expected size.
+
+* Added flag -x to exportenv, to just check the size of the exported files
+  instead of doing any exporting. This can provide a report of what exported
+  components are corrupted, if there's a dodgy FTP site.
+
+* Fixed bug in MrpData where directories reported by 'abld -what' would
+  get included in the zip file, instead of their contents.
+
+* Optimised sourceinfo <component>
+
+* Added extra check that the component name in the MRP file matches the component
+  name in the environment database. ("The Fitzgerald Case").
+
+* Changed test suite so t_run requires a drive letter as a command-line
+  argument. (Because I managed to run it on C: and delete most of c:\apps
+  before I realised what was happening...)
+
+* Importenv/exportenv problem summary now displays what went wrong.
+
+* Added -t flag to validaterel, which stops deletion of the temporary
+  directory. This allows further investigation with evalid and other tools.
+
+* Fixed MRP parsing bug where there were comments on the ends of lines
+
+* Made third (remote path) argument to 'archive_path' in reltools.ini optional
+
+* Fixed typo in listcomponents help
+
+* Fixed bug in Excel table formatter where 001 was coming out as 1
+
+* Added -a [number] option to latestver, to show the last 'n' releases.
+  Also allowed -vvv to work even if there is no remote site properly
+  defined.
+
+-----------------------------------------------------------------------------------
+
+Version 2.56
+Made by Adrian Taylor, 21/11/02
+
+From Adrian Taylor:
+
+* Added SourceInfo tool. This shows what source files belong to
+  a component, and vice-versa.
+
+* Added BuildRel tool, which will try to build all the platforms
+  listed in the MRP file of that component.
+
+* Stopped envinfo -f from classifying all the source code. We now do
+  it only when you actually require the classified source code. This
+  makes environment scans about five times as fast when you have lots of
+  components pending release.
+
+* Added table_format keyword to reltools.ini, allowing you to see the
+  output of envinfo, latestver and similar commands in Excel, HTML or
+  CSV format if you like. (Reason: the reports that sourceinfo outputs
+  are far too long to be readable in a console).
+
+* Added 'all' option for binary MRP syntax. e.g.
+   binary \rabbit\hole\group all
+  (Reason: a licensee wanted all possible binaries delivered).
+
+* Changed exportenv to warn if components aren't in the export table,
+  before it starts tranferring data.
+
+* Added a little more readily available information to viewnotes output.
+
+* Fixed bug in viewnotes -s <comp> where <comp> didn't exist - the error
+  message was illogical.
+
+* Fixed bug in MergeEnvironments where -i would stop it all from working
+
+* Fixed bug where extension makefiles using the TO_ROOT variable would
+  cause envinfo to report unknown origins.
+
+* Fixed typo in spelling of disable_win32_extensions. The old spelling
+  still works.
+
+* Tidied up the options that were added to prepenv in 2.55.
+
+* envinfo now states component names in error messages during its
+  scanning phase.
+
+* Checking for error-free completion of bldmake bldfiles.
+
+* Fixed bug where duplicate item checking for MRP binaries was
+  sometimes case-sensitive with categorise_binaries
+
+* Notice more errors from abld build -w and build makefile to fix
+  them.
+
+* Fixed bug where "exports xxx" line in MRP wouldn't trigger bldmake. Normally
+  this was OK because there would be a 'binary' line first which would call
+  bldmake.
+
+-----------------------------------------------------------------------------------
+
+Version 2.55
+Made by Adrian Taylor, 07/11/2002
+
+From Joe Branton:
+
+* Changed CleanEnv so that it removes empty directories associated with the clean.
+
+* Added -d option to DiffEnv. This causes the command to ignore components that are
+  younger in the first environment compared to the second. Useful when younger
+  releases are known to be backwards compatible with older ones.
+
+* Added 'globbing' functionality to BinInfo. You can now do things like:
+	bininfo \epoc32\release\wins\udeb\*.dl?
+
+From Adrian Taylor:
+
+* Fixed bug where project-style archive structures would not successfully create
+  directories on network shares.
+
+* Added -t option to diffrel, to allow you to specify a particular diffing tool
+  on the command line. This is useful with -t "diff -bBru" to produce diff
+  files, that can later be used with the 'patch' command to patch another version.
+
+* Removing troublesome debug print from RelData when using -v and a new-style
+  archive path.
+
+* Added lots of options to prepenv. -l: shows latest version of each component
+  available. -i <num>: always use this internal version number. -m: don't
+  prompt for MRP location. -p: skip components that are pending release.
+  These options work, but aren't very polished yet.
+
+* Added minimal test scripts for prepenv, getsource, removesource.
+
+* Added pushrel and pullrel (at last). In the process, I abstracted out
+  a lot of PushEnv, PullEnv, PushRel and PullRel into a new module,
+  called PushPullRel.
+
+* Added removesource.
+
+* Make cleanenv -f less confusing with another message.
+
+* bininfo <component> now works for components that are pending release.
+
+* bininfo <file> now reports if a file is part of an ignore_binary line
+
+* getrel -o now overwrites binaries as well as source.
+
+-----------------------------------------------------------------------------------
+
+Version 2.54
+Made by Adrian Taylor, 20/09/2002
+
+From Joe Branton:
+
+* Generally improved CheckBc. It now has been run over a pair of Hurricane source
+  trees. Only e32 and f32 are still causing problems.
+
+* Changed viewnotes so that it compiles HTML files into \epoc32\relinfo\notes and
+  reuses them if they're already present.
+
+* Fixed bug that caused auto-generation of abld.bat to fail if 'cleanenv -r' had
+  previously been run on the environment.
+
+* Modified interface to GetSource - an install directory can now be optionally be
+  specified using the switch '-i'. Previously it was specified by the last parameter
+  which made it useless if you wanted to the source for all components.
+
+* GetSource when used to get the source for all components now doesn't abort at the
+  first error.
+
+* Commands that remove comonents now throw an error if their not able to remove a
+  particular file (previously they just warned). This is to prevent the tools getting
+  into the situation where subsequently the zip utility prompts the user about
+  overwriting files.
+
+* Added some additional robustness to the signature generation code. Previously it
+  didn't ensure that all entries in the zip file were files. It turns out that some
+  zip utilities put directories as entries. If these kind of zip files are
+  encountered now, the signature is generated correctly and a warning is displayed.
+
+From Adrian Taylor:
+
+* Added new error check to project-based path data module. It now gives you
+  a sensible error message if you enter a non-existent project name.
+
+* Fixed "uninitialized value" warning from bininfo after a validateenv against
+  an external environment where you validated against a component whose binaries
+  didn't exist on the local site.
+
+* Finally fixed source validation. Previously, there were occasional false-
+  positive results (i.e. wrongly reported dirty) where a component had
+  several source code directories listed in its MRP. The sorry tale begins
+  with the need to check for added files. To do this, it has to deduce
+  what the root source code directory is for the component, then check
+  whether any extra files have been added inside that directory. If there
+  are several root directories, the algorithm goes wrong and selects too
+  'wide' a directory, where it probably will find other files inside.
+
+  The only way to solve this was to remember the "source" lines stored
+  in the MRP. From this release on, we remember that information and
+  store it in the release packet. We later use that information in source
+  validation.
+
+  This means that source validation won't fully work against releases made with
+  earlier versions of the release tools. But don't worry: you'll get a nice
+  error message explaining the situation. The only part of source validation
+  which fails is the check for added files - the check for removed files
+  and changed files still works fine.
+
+* Expanded test suite to test a variety of 'source' MRP statements.
+
+-----------------------------------------------------------------------------------
+
+Version 2.53
+Made by Adrian Taylor, 21/08/2002
+
+From Adrian Taylor:
+
+* Fixed bug where remote archive locations were getting made lowercase if you
+  use the new archive-path arrangement.
+
+* Made blddocs runnable from anywhere. Documents whichever tools version is
+  in your $PATH.
+
+* Added some extra commands/modules into BldDocs.
+
+* Fixed bug where some validateenv would set some components to dirty instead
+  of "binaries clean, source dirty". Validaterel did not have this bug.
+
+* Fixed an untidy error message in latestver
+
+* Added new tool, "MergeEnvironments". This is a specialised tool for taking
+  a subset of the components from one environment, and a subset from another,
+  and making a third environment (as a new release but without any binaries
+  or source). The intention is that you would then validate against that
+  merged environment. Currently the tool only supports the subset selection
+  using the prefix of the version number.
+
+* Made error checking in RelData.pm and MrpData.pm stricter
+
+-----------------------------------------------------------------------------------
+
+Version 2.52
+Made by Joe Branton 01/08/2002
+
+From Joe Branton:
+
+* Fixed bug in mrp parsing code that caused an assertion to fail is the component
+  concerned didn't have any binaries.
+
+* Fixed bug in mrp parsing code associated with the classification of 'tools' binaries.
+  Previously everything was expected to support the build variants 'udeb' and 'urel'.
+  'tools' has now been made a special case, and are always unclassified.
+
+* Fixed bug in mrp parsing code the prevented '-binary' from working properly when use
+  the 'categorise_binaries' reltools.ini keyword. Previously '-binary <file>' only excluded
+  binaries from the 'unclassified' category. They are not excluded from all categories.
+
+-----------------------------------------------------------------------------------
+
+Version 2.51
+Made by Adrian Taylor 26/07/2002
+
+From Adrian Taylor:
+
+* Fixed bug where envinfo -f didn't work for pending release components when
+  using a project-based archive path
+
+* Fixed a bug where validation would die if it had to make a fake signature
+
+* Fixed cosmetic error message if a release didn't exist
+
+From Joe Branton:
+
+* Fixed a bug where envinfo would complain of uninitialized values when
+  MRPs contained some strange targets
+
+-----------------------------------------------------------------------------------
+
+Version 2.50
+Made by Adrian Taylor 24/07/2002
+
+From Adrian Taylor:
+
+* Restructured the archive path arrangement. A new "archive_path" keyword
+  is now possible instead of the old "archive_path_file" keyword. See
+  the Installation document for details. This is optional; the old
+  arrangement will still work.
+
+* Fixed bug in binary categorisation where components with no binaries could
+  not be exported or envinfo'd.
+
+* Added 'listcomponents' command
+
+* Extended latestver with -aa switch, -vv and -vvv switches, and the ability
+  to show output about all installed components.
+
+* Fixed error in "usage" message of envmembership
+
+* Added additional test cases: t_bininfo, t_pushpullenv, t_latestver,
+  t_envmembership, t_envinfo, t_exportimport
+
+* Added -f ("force") flag to CleanEnv, to allow easier use in test scripts
+
+* Fixed bug in source validation where the "binaries clean, source dirty" status
+  appeared as "dirty" if the component had been dirty immediately beforehand
+
+* Fixed error message in ValidateRel if a non-existent component was specified
+
+* Components can now be validated against an external version even if they're
+  pending release.
+
+From Joe Branton:
+
+* Fixed bug in ViewNotes that prevented versions containing upper case characters from
+  being previewed.
+
+* Added CheckBc utility - does some simple tests for backwards compatibility breaks.
+
+* Added two new reltools.ini keywords - 'categorise_binaries' and 'required_binaries'.
+  The first instructs the tools to categorise binaries according to their build
+  variants. The second allows a particular individual (or project) to select which
+  build variants they require. See the documentation 'Installation Guide' for more
+  details.
+
+------------------------------------------------------------------------------------
+
+Version 2.30
+Made by Adrian Taylor 23/7/2002
+
+From Adrian Taylor:
+
+* Fixed regression caused by CommandController changes where validaterel would
+  no longer print second and subsequent validation failures.
+
+-----------------------------------------------------------------------------------
+
+Version 2.29
+Made by Adrian Taylor 22/7/2002
+
+From Adrian Taylor:
+
+* Fixed bug where source directories with "authorised <licenseename>" IPR data
+  did not get zipped up.
+
+-----------------------------------------------------------------------------------
+
+Version 2.28
+Made by Adrian Taylor 1/7/2002
+
+From Adrian Taylor:
+
+* Fixed bug introduced by source validation, where previously dirty components
+  refused to go clean again.
+
+* Used updated version of iprtool from Richard Harrison, which reports even
+  directories containing just "distribution.policy". Removed the workaround
+  added in 2.26.
+
+-------------------------------------------------------------------------
+
+Version 2.27
+Made by Adrian Taylor 28/6/2002
+
+From Adrian Taylor;
+
+* Fixed bug in CommandController stuff that stopped imports and exports working
+
+------------------------------------------------------------------------------------
+
+Version 2.26
+Made by Adrian Taylor 27/6/2002
+
+From Adrian Taylor:
+
+* Changed behaviour of ValidateRel <comp> <ver> so that it will change the version
+  number in the environment database if the validation succeeds.
+
+* Fixed bug in MrpData.pm where directories with spaces in their name were not
+  getting included in source zips.
+
+* Fixed bug in MrpData.pm where . and .. were accidentally getting put into all
+  release zips. (So far as we know, this had no effect.)
+
+* Changed (binary) validation to work properly for components which release
+  binary files outside \epoc32
+
+* Changed validation to overwrite files in the temporary directory,
+  so it should keep going under more circumstances
+
+* Fixed bug where source validation would try to validate source for components
+  without any source code.
+
+* Worked around a bug in iprtool where directories containing just "distribution.policy"
+  were not put into zip files. This upset validaterel later on.
+
+* Fixed bug in ValidateRel where it didn't keep going after first error.
+
+* Added "\epoc32\winscw\c\*" to the list of standard ignores
+
+From Joe Branton:
+
+* Added -r option to DiffRel, and fixed bugs associated with the -l option. This means
+  that now you can specify exactly which directories you'd like to diff (both the local
+  directory and/or the directory within the release zip file) if you want to.
+
+* Added a new class (CommandController) that allows certain types of commands to run
+  concurrently, and prevents others from running concurrently. Also gave temporary
+  directories a unique name to allow for this concurrency.
+
+* Added new keyword to IniData - disable_win32_extentions - this currently only disables
+  the above CommandController functionality, but I intend to use it more widely in the
+  future.
+
+------------------------------------------------------------------------------------
+
+Version 2.25
+Made by Adrian Taylor 18/6/2002
+
+From Adrian Taylor;
+
+* Fixed bug in source validation which incorrectly classified some components as
+  'binaries clean, source dirty' when they were in reality completely clean.
+
+-----------------------------------------------------------------------------
+
+Version 2.24
+Made by Adrian Taylor 17/6/2002
+
+From Adrian Taylor:
+
+* Fixed RelData.pm so that latestver works correctly even when there are
+  corrupt (blank) reldata files in the archive.
+
+* Added -s flag to ValidateRel and ValidateEnv, to permit the validation of
+  source code. The purpose of this is to detect changes to source code that
+  don't cause changes in the binaries. (For example, changes to distribution
+  policy). There are some associated changes in EnvDb; in particular
+  the addition of an extra status "binaries clean, source dirty" which
+  is only ever set by these two commands.
+
+* Updated test example output for the above change and various other recent
+  changes.
+
+------------------------------------------------------------------------------------
+
+Version 2.23
+Made by Joe Branton 10/6/2002
+
+From Joe Branton:
+
+* Fixed bug in Utils::CommonDir that caused a GetSource to get stuck in a
+  'Use of uninitialized value' infinite loop.
+
+From Lee Luchford:
+
+* Updated iprtool to latest version from GT. Fixed defect in previous version
+  which outputted all directory names in upper case
+
+-----------------------------------------------------------------------------------
+
+Version 2.22
+Made by Joe Branton 10/6/2002
+
+From Adrian Taylor:
+
+* Added facility to prefix # with \ in reltools.ini, to escape literal #
+  (in this case the need was for an FTP site password)
+
+From Joe Branton:
+
+* Fixed bug in mbld that caused '-h' to fail.
+* Changed behaviour of environment scans to improve performance when there are a lot
+  of files that will be ignored. Previously the \epoc32 tree was scanned fully and
+  at the end files to be ignored were removed from the data structure. Now the ignore
+  list is checked during the scan to allow entire directory branches to be ingored
+  without scanning them.
+* Added functionality to ViewNotes to allow it to display a summary of all the
+  release notes in a specific (or the current) environment.
+* Added 'disallow_unclassified_source' keyword to IniData and changed MrpData to
+  make use of the new flag. This is intended to allow sites to ensure that all
+  source code is given a category.
+* Fixed bug in GenMrp that was causing binary statements to be added for aif and mbm
+  files that live in \epoc32\data\z.
+* Changed GenMrp to ignore the platform 'cw_ide' (for the time being).
+* Changed GetSource so that it displays the name of the significant directory the
+  source is being unpacked into.
+* Changed GetSource so that it doesn't allow you to overwrite files that are already
+  present in your development drive.
+* Added '-o' option to GetSource, GetRel and GetEnv to allow existing source code
+  to be overwritten.
+
+-----------------------------------------------------------------------------------
+
+Version 2.21
+
+Made by Lee Luchford 29/05/2002
+
+From Lee Luchford:
+
+* Added 'cleanremote' tool to delete unwanted releases from remote archive and made
+  necessary modifications to RemoteSite modules to support this tool
+
+* Removed changes to all tools related to introduction of CleanLocalArch tool
+  (e.g checks to see if releases have been cleaned) It has been decided to remove
+  this tool in future
+
+* Fix for component name case dependency bug in getrel
+
+From James Gibbons:
+
+* Modified ValidateRel so that the binaries of a component on the current drive can be validated against
+  a version of the component other than the version held in the environment database.
+
+* Fixed usage text for EnvMembership so the name of the command is correct.
+
+From Joe Branton:
+
+* Fixed a bug in diffrel where it didn't cope with diffing components where the top level directory
+  for a component contained files (rather than just directories).
+------------------------------------------------------------------------------------
+
+Version 2.20
+
+Made by Lee Luchford 03/05/2002
+
+From Lee Luchford:
+
+* Added ftp_timeout keyword to reltools.ini. This overrides the default timeout value which
+  may not be long enough for poor FTP connections
+
+* Added ftp_reconnect_attempts to reltools.ini. This overrides the default number of reconnect
+  attempts made when the connection to the FTP site is dropped. This should be set to higher
+  value for poor FTP connections
+
+* Fixed a bug in EnvDb.pm related to the getsource command. The regular expression used
+  to grep for source files just looked for the word 'source' in the file name. Since the
+  file name includes the path if the release directory contains the string 'source'
+  all zips in the release dir are unzipped, including binaries.
+
+* Fixed getrel to handle case dependency of version numbers
+
+-----------------------------------------------------------------------------------
+
+Version 2.19
+Made by Joe Branton  15/04/2002
+
+From Lee Luchford:
+
+* Modified NotesCompiler.pm to interpret new lines as line breaks in HTML
+
+* ImportRel now checks to see if releases exist locally before connecting to the remote
+  and asking for passwords etc...
+
+* ValidateRel now takes the name of a file containing a list of
+  component names as an argument. All of the components listed in the
+  file are validated
+
+* Fixed case dependency of version numbers bug in DiffEnv
+
+* Fixed warnings in BldDocs
+
+* Fixed POD errors in FAQ document
+
+From Joe Branton:
+
+* Fixed bug that caused 'viewnotes -s' to miss out releases if there are more than one
+  release directory with exactly the same modified time. Added a record of 'the right
+  thing to do' to todo.txt (read the release dates out of RelData).
+
+* Fixed bug in bininfo that caused it to report incorrectly that there is no information
+  available when the owning component is pending release (file name case problem).
+
+* Fixed bug in makefile auto-generation code that caused components with multiple 'binary'
+  statements in the mrp file to only have their first set of makefiles generated.
+
+* BinInfo if given a component name, now displays a list of all files owned by that
+  component and their current status.
+
+* Archive path files are now checked to ensure they don't contain more than one entry
+  for the same component.
+
+* The archive path and export data files now don't need to exist until they are actually
+  required. This should allow use of tools like envinfo when not connected to the network.
+
+* Added license file for zip and unzip. Also removed the leading underscore from the
+  executable file names so as to conform to the license.
+
+* Added CleanLocalArch command which can be used to clear out old releases from a release archive.
+  See documentation for details.
+
+* Changed viewnotes -s so that the summary is ordered according the release time and date
+  stored in the release's reldata file (previously it used the timestamp of the corresponding
+  release archive directory).
+
+* Added new command - 'latestver'. See documentation for details.
+
+* Added new utility command - 'mbld'. See documentation for details.
+
+* Upgraded to the latest version of IPRTOOL (//EPOC/main/sysint/tools/iprtool.pl@140492).
+
+* ViewNotes is now tolerent to directories within a component's release archive not being releases.
+  A warning is now issued rather than bailing out altogether.
+
+* Added 'relToolsVer' tag to reldata.
+
+* Changed '\\epoc32\\data\\emulator\\epoc.sys.ini' to '\\epoc32\\data\\emulator\\*.sys.ini'.
+
+* Changed the interface to DiffRel - it'll now attempt to work out how to difference against
+  the source in a development environment (rather than having to be giving the name of a
+  directory against which to difference).
+
+* Added 'reallyclean' flag to CleanEnv. Causes it to clean out files that are normally ignored
+  from the point of view of unknown origin status (intermediate build files etc).
+
+From James Gibbons:
+
+* Added new command EnvMembership. To allow querying of baselines to see if a particular component
+  component release is present.
+
+-----------------------------------------------------------------------------------
+
+Version 2.18
+Made by Lee Luchford  28/01/2002
+
+From Lee Luchford:
+
+* Fix IO bug affecting Perl 5005 during FTP transfers. The FTP.pm module now
+  quits the FTP connection whenever an error occurs instead of just aborting the
+  failed command but keeping the connection open.
+
+* Increase TIMEOUT value in Proxy.pm module
+
+* Add -r option to export and import tools. The user can now force the use of FTP
+  resume mode from the command line overriding the ftp_server_supports_resume
+  value in the reltools.ini file
+
+* Implemented an FTP get command with resume in FTP.pm
+
+* Fix for PGP.pm. Check to see if error code defined before using in numerical
+  comparisons
+
+-----------------------------------------------------------------------------------
+
+Version 2.17
+Made by Lee Luchford 21/01/2002
+
+From Lee Luchford:
+
+* Added a fix for PGP version 7 in PGP.pm. Error codes have changed between 6 and 7
+  so errors were not being handled correctly
+
+* Changes to ExportRel, ExportEnv, ImportRel, ImportEnv and FTP.pm to handle case
+  dependency of file names on the FTP server.
+  Now when exporting, component names are all converted to lower case and the actual
+  version number (ie with the correct case) is read from the releases reldata file
+  The FTP module ignores case when checking to see if a file exists and selects the
+  correct filename to download.
+
+* Changed naming of the temporary files used during uploads to FTP sites.
+  Now of the form lpdrt*****.tmp. Should make it more obvious that we can delete
+  these files if they are left lying around on the server
+
+------------------------------------------------------------------------------------
+
+Version 2.16
+Made by Joe Branton 10/01/2002
+
+From Lee Luchford:
+
+* Added support for FTP servers with firewalls (ie passive transfers) and servers that do not
+  support reconnect and resume. Use the new keywords "pasv_transfer_mode" and
+  "ftp_server_supports_resume" in the reltools.ini to activate these features
+
+* RelTransfer::Export module modified. A failed log file send no longer reports that the actual
+  release failed to export
+
+* Removed FTP download with resume code. Not reliable at the moment.
+
+From Joe Branton:
+
+* PrepEnv and PrepRel now throw an error if a version already exists.
+
+* BinInfo now handles file name arguments of any case.
+
+* Fixed bug in EnvDb that caused duplicates to not be reported accurately when making
+  a release (or scanning an environment using EnvInfo).
+
+* Fixed bug in Utils::TidyFileName that cause UNC paths to get converted into absolute
+  paths. This caused a "Path not found" error message when making a release to an archive
+  specified using UNC paths. This is not a fatal error, but the release files do not get
+  their read only attribute set.
+
+* Testing importing/exporting against the Symbian FTP site showed that the file / directory
+  existance checking routes weren't working for this server (though they worked fine
+  against others). Changed the implementation, and tested again our normal test Linux box,
+  the Symbian server and the Bayou server.
+
+----------------------------------------------------------------------------------------
+
+Version 2.15
+Made by Joe Branton 20/12/2001
+
+From Joe Branton:
+
+* The reltools.ini keywords 'remote_username' and 'remote_password' are no longer mandatory
+  for FTP access - if not provided, they are prompted for at runtime. This also applies to
+  the keywords 'proxy_username' and 'proxy_password' for use with proxy FTP servers.
+
+* Implemented 'hidden text' password entry ('*' characters are displayed rather than the
+  actual text). This is used when the user is asked to enter encryption passphrases or
+  FTP passwords.
+
+* Fixed a bug in the NETDRIVE exporting code that caused exported files to appear in the root
+  of the current drive rather than the network drive.
+
+* Added minimal progress information to imports and exports when the verbosity level is zero.
+
+* Imported files are now set to read only in the archive (corresponding to MakeEnv and MakeRel's
+  behaviour).
+
+----------------------------------------------------------------------------------------
+
+Version 2.14
+Made by Joe Branton 19/12/2001
+
+From Lee Luchford:
+
+* In FTP.pm comment out file size comparison check for successful uploads. Appears to
+  cause problems on the Symbian FTP server
+
+* FTP move command cannot overwrite existing files. RemoteSite::FTP.pm now deletes the remote file
+  before a move is attempted
+
+* Win32::File module function calls replaced with system "attrib ..." in Utils.pm since Win32::File
+  fails in some situations
+
+* glob replaced with readdir + small fix for filtering individual source files in
+  MrpData.pm
+
+From Joe Branton:
+
+* Fixed Win2K only problem associated with finding 'evalid.bat' in the user's path. This
+  cause ValidateRel/Env to fail on Win2K machines.
+
+* DiffEnv now displays "Environments identical" rather than an empty table if there are
+  no differences.
+
+* Fixed another suspicious forward slash in file name when using GetSource.
+
+* Fixed bug in ViewNotes that caused the summary feature (available via -s) to produce
+  a summary page with broken links on IE 5.0 and Opera 6.0 (and possibly other browsers).
+  The problem was that these browsers expect any files they are asked to render to have
+  the extention .html. This is now the case.
+
+* Fixed regression in mrp parser that allowed the binary.zip file to contain multiple files
+  whose name only differs with regard to case.
+
+----------------------------------------------------------------------------------------
+
+Version 2.13
+Made by Joe Branton 27/11/2001
+
+From Joe Branton:
+
+* Fixed a regression introduced by changing the behaviour of the tools to not lower
+  the case of file names. Bug caused the tools to wrongly report files as having
+  unkown origin.
+
+----------------------------------------------------------------------------------------
+
+Version 2.12
+Made by Joe Branton 27/11/2001
+
+From Lee Luchford:
+
+* Added support for proxy FTP servers by adding RemoteSite::FTP::Proxy module
+  If remote_site_type keyword in reltools.ini has value 'PROXY' then FTP access is
+  via the proxy server and the keywords proxy, proxy_username and proxy_password must
+  be defined in reltools.ini
+
+* fix to handle FTP sites that have problems with back slashes in paths
+
+* Some changes to FTP module code for improved reconnect and resume handling
+
+* Added passive mode support to FTP module. Include pasv_transfer_mode keyword in reltools.ini.
+  If keyword specified then connects to FTP site in passive mode.
+
+* Ask for PGP passphrase in Import module constructor ie before any files are downloaded
+
+From Joe Branton:
+
+* Removed the file name case lowering behaviour of the tools. This behaviour broke certain
+  regression tests that depended upon file and directory names being in upper case (as they are
+  when the build tools create them).
+
+* DiffEnv now displays the components in alphabetical order.
+
+----------------------------------------------------------------------------------------
+
+Version 2.11
+Made by Joe Branton 19/11/2001
+
+From Lee Luchford:
+
+* ExportRel and ImportRel added support for exporting and importing multiple releases by passing
+  a file containing a list of component names and version numbers
+
+* ExportEnv and ImportEnv now check to see if all components in the environment are defined
+  in the archive path file before attempting to export/import
+
+* Various fixes for potential problems with FTP uploading/downloading in RemoteSite::FTP.pm
+
+From Joe Branton:
+
+* Added a new switch to EnvInfo (-ff). -f now displays a table of component name, version, and status.
+  -ff displays a table of component name, version, internal version status and mrp name.
+
+* Tidied up new line handling in EnvInfo when displaying progress dots and an error occurs.
+
+* PrepRel now warns before removing an entry from the environment database.
+
+* Fixed bug in PrepRel that caused entries to be removed if only the mrp name is specified.
+  Now updates the mrp name instead.
+
+* Changed PrepEnv interactive mode so that any change in an entries data is written to the database.
+  Previously the version needed to be changed to prevoke a write.
+
+* The check for binaries being released by more than one component is now done in EnvInfo
+  as well as MakeEnv.
+
+* Tidied up the output of EnvInfo, MakeEnv and CleanEnv.
+
+* ViewNotes now supports previewing the release notes for components that are currently pending
+  release.
+
+* Put the "Release environment" section of the release notes into a table.
+
+* Added a new command - ModNotes. This allows the release notes of an release that has already
+  been made to be modified.
+
+* Added a new command - BinInfo. This displays the name of the component that owns a particular
+  binary file, the currently installed version and the file's current status.
+
+* Added support for releasing test code. Mrp files now support a new keyword - 'testbinary' (and also
+  -testbinary). The syntax for this is very similar to the original 'binary' keyword.
+
+* Added support for displaying a summary of all releases to date of a particular component
+  in ViewNotes.
+
+* The ini file can now be in either \epoc32\relinfo for the directory the tools are installed
+  in. \epoc32\relinfo is checked first. If not found there, but found in the tools dir then
+  a warning is issued. To disable this warning use the new "no_ini_location_warning" keyword.
+
+* check_ignore.txt is no more. The standard ignores that used to ship in this file have been moved
+  into the body of the Perl scripts (IniData.pm to be precise). Project specific customisations
+  can be added to reltools.ini using the "ignore_binary" keyword. See the Installation Guide for
+  details.
+
+----------------------------------------------------------------------------------------
+
+Version 2.10
+Made by Lee Luchford 02/11/2001
+
+From Lee Luchford:
+
+* Rewrite of Crypt modules. Broken up into a base module Crypt.pm and 2 modules Crypt::PGP.pm and
+  Crypt::GPG.pm both of which implement an abstract interface defined in Crypt.pm
+
+* Fixed decryption bug in Crypt::GPG.pm. Open2 was not killing off child processes, now uses open
+  instead but dumps the output to a file which is then parsed for errors.
+
+* Rewrite of RemoteSite modules. Broken up into a base module RemoteSite.pm and 2 modules RemoteSite::FTP.pm and
+  RemoteSite::NetDrive.pm both of which implement an abstract interface defined in RemoteSite.pm
+
+* RemoteSite::FTP now has support for reconnect and resume for downloads and uploads
+
+* RemoteSite::FTP and RemoteSite::NetDrive both use temporary files during uploads and then rename the
+  temporary file to the final release name. Therefore .log files are no longer needed to confirm that
+  an upload was successful
+
+* RelExporter and RelImporter replaced by a base module RelTransfer.pm and 2 modules RelTransfer::Export
+  and RelTransfer::Import which inherit from the base module.
+
+* pgp passphrase errors handled better in RelTransfer::Import. Keep asking for passphrase until
+  correct
+
+* ExportRel, ExportEnv and ImportRel now have a -f option which forces the export and import of
+  releases even if they already exist
+
+* reltools.ini and check_ignore.txt now assumed to be stored in \epoc32\relinfo instead of the
+  release tools directory
+
+* Changed pgp_path keyword in reltools.ini to pgp_config_path
+
+* Changed pgp_users_keyid keyword to pgp_encrpytion_key in reltools.ini. Also this keyword can
+  be used more than once to build up a list of default keys used for encryption
+
+* Remote site type no longer determined by remote_host value in reltools.ini. Added remote_site_type
+  keyword which should have the value FTP or NETDRIVE
+
+* Added zero compression option to Utils::ZipList function
+
+* Replace globs with readdir in RelTransfer modules and EnvDb.pm
+
+From Joe Branton:
+
+* Partially fixed bug to do with the way file modified times are stored in the environment
+  database. The WIN32 Perl implementation returns file modified times taking into account
+  daylight saving. Previously they were stored in this form in the environment database,
+  which meant that when daylight saving changed, environments were reported as dirty. The
+  fix attempts to undo the daylight saving accounting, and store the times in GMT.
+
+  It is a partial fix, because testing has revealed that certain time zones (e.g. Cairo, GMT +2)
+  cause unexpected hour shifts in some files. The reason for this is currently unknown (although
+  some test code was written in C using the Windows stdlib, and this showed the same behaviour).
+
+  NOTE, ANY EXISTING ENVIRONMENT DATABASES WILL HAVE THEIR TIMES IN THE WRONG FORMAT. This
+  will manifest itself as the environment appearing completely dirty. To fix this, either run
+  ValidateEnv, or re-run GetEnv. In most cases, this problem should not return. Because of the
+  issue described above, users in some time zones may experience a recurrence of this problem
+  when daylight saving changes. Also, users that change their time zone to one of the affected
+  ones, may see this problem recur.
+
+* Release notes source files are now checked for existance as well as whether they are
+  actually a file (results in a more meaningful error message if the file does not exist).
+
+* DiffRel now removes the drive letter if specified for the source path.
+
+* PrepRel/Env now removes the drive letter if specified for the mrp file name.
+
+----------------------------------------------------------------------------------------
+
+Version 2.09
+Made by Lee Luchford 17/10/2001
+
+From Lee Luchford:
+
+* Fixed critical bug in MrpData.pm. Iprtool parsing failed in some cases causing some source
+  files to be missing from release
+
+-----------------------------------------------------------------------------------------
+
+Version 2.08
+Made by Joe Branton 12/10/2001
+
+From Lee Luchford:
+
+* Fixed bug in RemoteSite::FTP. Sometimes a release was getting exported
+  even though it already existed on the remote site. This problem occurs if the connection is
+  dropped during the check for existence of a release on the remote site. Now attempts to reconnect
+  several times if the connection is dropped, if this does not work then dies marking the export
+  as failed
+
+* Improved error handling for components mistakenly ommitted from the export table. Now throws an
+  error if the component does not exist in the export table and the release does not exist on the
+  remote site.
+
+From Joe Branton:
+
+* Added more status checking to GetEnv - now checks the status of components that will be removed
+  and warns if their status is pending release (providing an oportunity to abort the GetEnv).
+
+* Fixed a bug in PrepRel. If called with no version argument, the specified component is removed
+  from the environment database. Previously, if a component name that did not exist was specified
+  PrepRel would still report successful removal from the database. It now reports an error. It
+  also removes that component's signature file as well as the database entry (i.e. fully cleans up).
+
+* Tweaked the code in MrpData that interacts with the build tools to cope with the version shipped
+  with Hurricane. The build tools now use GNU Make for most task (rather than Microsoft's NMake),
+  and this reports errors in a different way. The old build tools should still be supported.
+
+* Automatic calling of bldmake and generation of makefiles now only does one attempt of each (rather
+  than getting stuck in an infinite loop if there is a problem).
+
+* Add protection against makefiles that list files for release with double back slashes (e.g.
+  "\epoc32\release\wins\udeb\\test.dll") since these cause problems for the zip. Double slash
+  is replaced with a single slash.
+
+* Added a check in GenMrp to ensure that the bld.inf file exists - dies cleanly if not.
+
+* Fixed a bug in DiffEnv that caused components present in "environment 2" but not in "environment 1"
+  to be wrongly assigned to "environment 1".
+
+* Added "keep going" style error handling to PullEnv.
+
+* Added "-l" switch to GenMrp to allow the source directory nesting level to be specified. This allows
+  the tool to be used effectively with GT's new sub-system directory structure.
+
+* Fixed bug that meant whitespace in the release tools installation directory name caused the
+  tools to fail badly.
+
+* Fixed "uninitialised variable" warning in the exporting commands that occurs when there is no
+  pgp_path keyword in the reltools.ini.
+
+----------------------------------------------------------------------------------------
+
+Version 2.07
+Made by Lee Luchford 19/9/2001
+
+From Lee Luchford:
+
+* Replaced CryptTool with Crypt::PGP and Crypt::GNUPG grouping
+  together all modules with a common interface for encrypting and
+  decrypting files into one directory
+  Crypt::PGP uses NA command line PGP client (executable name pgp.exe)
+  Crypt::GNUPG uses GNU Privacy guard PGP client (executable name gpg.exe)
+
+* Changed FtpSite to RemoteSite::FTP and NetworkDrive to RemoteSite::LANShare
+  grouping together all modules with a common interface for accessing
+  a remote site into one directory
+
+* Updated modules which are affected by above changes
+
+* ExportRel replaced by RelExporter and ImportRel replaced by RelImporter
+
+* All Export and Import related modules now use named argument lists in constructors
+
+* Fix to Net::Config module to remove 'uninitialized value' warning when exporting/importing
+
+* Fixed handling of PGP passphrases with blank spaces
+
+* Added the ImportRel tool for importing single releases
+
+* MrpData.pm now handles single source files listed in the mrp file.
+  Runs IPRTool on the directory where the file is stored to get the
+  category of the file.
+
+* ExportData.pm now allows comment lines starting with #
+
+* ExportData.pm now allows spaces in recipient names in column headers
+
+* ExportData.pm returns empty anonymous array references instead
+  of undef. Fixes potential dererencing a non array reference bugs
+
+* RelExporter now checks to see if PGP keys listed in export data file exist on keyring
+  before attempting to encrypt releases
+
+* Crypt::PGP and Crypt::GNUPG include fixes for handling directory names with spaces
+
+From Joe Branton:
+
+* Fixed bug in GenMrp that caused an extra invalid binary statement to be printed.
+
+* Fixed bug in EnvDb::InstallComponent that caused an invalid database entry to be
+  written if the components reldata file fails to open.
+
+* Changed EnvDb::CheckEnv so that warnings about "unknown origin" files are not displayed
+  if there were any errors parsing mrp files. This was done because errors in mrp files
+  are likely to cause many "unknown origin" as a knock on effect.
+
+* Fixed bug in MakeRel.pm that causes releases to fail if they didn't contain any source
+  or binaries (release directory not made correctly).
+
+* Fixed bug in MakeRel.pm that caused an "Uninitialised value" warning to be displayed
+  when no internal version was specified.
+
+* Fixed bug in ViewNotes that cause the page displayed by the web browser to be invalid.
+  The temporary file was getting deleted before the browser had had a chance to read it.
+  ViewNotes now pauses until the user hits a key before deleting.
+
+* Added FAQ section to documentation.
+
+* Changed EnvDb::ValidateComp to pick up evalid from anywhere in the user's path, rather
+  than only \epoc32\tools (mainly to make running the test code easier).
+
+* Added an automated test suite for testing core (non-interactive) commands.
+
+* Added 'keep going' error handling functionality to PrepEnv - total number of errors is
+  listed at the end.
+
+* Added check to PrepRel.pm to ensure that a valid mrp file name is specified.
+
+* Fixed bugs in PushEnv/PullEnv that caused UNC paths to fail.
+
+* Added better parameter checking to PushEnv and PullEnv.
+
+* Fixed bug in EnvDb::CheckComp that caused an invalid db entry to be written if a check
+  was attempted on a component that did not exists. This manifested itself in EnvInfo if
+  you give the name of a non-existent component as a parameter.
+
+------------------------------------------------------------------------------------------
+
+Version 2.06
+Made by Joe Branton 30/8/2001
+
+From Joe Branton:
+
+* Fixed (another) bug in GetEnv that cause getting an environment on a clean drive
+  to fail (doh!).
+
+------------------------------------------------------------------------------------------
+
+Version 2.05
+Made by Joe Branton 24/8/2001
+
+From Lee Luchford:
+
+* Added some additional information about setting up PGP to the Installation Guide.
+
+From Joe Branton:
+
+* Fixed a bug in GetEnv that caused environment upgrading to fail.
+
+* Fixed a bug in CleanEnv that caused re-installation of dirty components to fail.
+
+* Fixed some cosmetic problems relating to the 'dot' progress information when
+  performing an environment scan.
+
+* Added additional status output to ValidateEnv.
+
+* Added additional feedback to PrepEnv and PrepRel.
+
+* Added implementation of interactive mode to PrepEnv.
+
+------------------------------------------------------------------------------------------
+
+Version 2.04
+Made by Joe Branton 20/8/2001
+
+From Lee Luchford:
+
+* Updated CPan Net module to latest release.
+
+* Change to CryptTool to display less warnings.
+
+* EnvDb.pm, ExportRel.pm and ImportRel.pm now use File::DosGlob as a workaround to glob
+  bug in latest Perl release.
+
+* Added a new ExportRel tool to export individual releases.
+
+* Source filtering (with IPR tool) is now used by default. Therefore the source_filter
+  keyword in reltools.ini is deprecated. A new keyword, ignore_source_filter_errors, maybe
+  used to switch off displaying of source filter errors in release notes.
+
+
+From Joe Branton:
+
+* Added new tools CleanEnv, PullEnv and PushEnv (see documentation for details).
+
+* Added progress dots to environment scanning code (when used with a verbosity of 0).
+
+* Added 'keep going' type error handling to mrp file parsing during an environment scan.
+
+* Added makefile generation functionality to GenMrp.
+
+* Changed behaviour of GetEnv to work in phases. Phase 1 checks that each component in the
+  requested environment is physically available. Phase 2 removes all old binaries. Phase 3
+  installs all new binaries. This makes the process robust when binary files have moved from
+  one component into another.
+
+* Added -l option to MakeRel which causes lib files to be copied from the thumb release
+  directory if they are not found in the armi release directory.
+
+* Added progress info (via verbosity level 1) and exit info to PrepEnv.
+
+* Fixed uninitialised variable bug in GetSource when an install path is not specified.
+
+* Added extra progress info to GetSource and PrepEnv.
+
+* Changed PrepEnv to have the same syntax as PrepRel - now uses '-m' to denote an mrp file name.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/reltools.ini.ex	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,50 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+#*****************************************#
+# Reltools.ini configuration example file #
+#*****************************************#
+
+# Common configuration options
+# ----------------------------
+diff_tool 			windiff
+require_internal_versions
+categorise_binaries
+categorise_exports
+disallow_unclassified_source
+
+# Archives containing your releases
+# ---------------------------------
+archive_path	my_releases	\\myserver\builds\componentised\my_build_config	/Optional_path_on_remote_server
+archive_path	my_other_releases	\\myserver\builds\componentised\my_other_build_config	/Optional_path_on_remote_server
+
+# Remote server configuration
+# ----------------------------
+export_data_file       		\\myserver\config_man\reltools\export_data.csv
+pgp_config_path        		\\myserver\config_man\reltools
+pgp_tool                        pgp           # Must be pgp or gpg
+pgp_encryption_key              0x12345678
+remote_site_type                ftp           # Common values are netdrive and ftp
+remote_host		 	ourftp.mycompany.com.invalid
+remote_username		 	myusername
+remote_password		 	mypassword
+remote_logs_dir		 	/release_logs # Path on server for logs
+pasv_transfer_mode
+ftp_server_supports_resume
+ftp_timeout			30
+ftp_reconnect_attempts		5
+proxy_host                      myproxyftpserver # Only valid if using remote_site_type proxy
+proxy_username                  myproxyusername
+proxy_password                  myproxypassword
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/removesource	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+#
+
+use strict;
+use FindBin;
+use lib "$FindBin::Bin";
+use Getopt::Long;
+use IniData;
+use EnvDb;
+use CommandController;
+use File::Path;
+
+
+#
+# Globals.
+#
+
+my $verbose = 0;
+my $dryrun = 0;
+my $iniData = IniData->New();
+my $commandController = CommandController->New($iniData, 'RemoveSource');
+my $envDb;
+my $comp;
+my $force;
+
+
+#
+# Main.
+#
+
+ProcessCommandLine();
+RemoveSource();
+
+
+#
+# Subs.
+#
+
+sub ProcessCommandLine {
+  Getopt::Long::Configure ("bundling");
+  my $help;
+  GetOptions('h' => \$help, 'v+' => \$verbose, 'd' => \$dryrun, 'f' => \$force);
+
+  if ($help) {
+    Usage(0);
+  }
+
+  $comp = shift @ARGV;
+
+  unless ($#ARGV == -1) {
+    print "Error: Invalid number of arguments\n";
+    Usage(1);
+  }
+
+  $envDb = EnvDb->Open($iniData, $verbose);
+}
+
+sub Usage {
+  my $exitCode = shift;
+
+  Utils::PrintDeathMessage($exitCode, "\nUsage: removesource [options] <component> 
+
+options:
+
+-h  help
+-d  dry run - don't do anything, just state what would happen
+-v  verbose output (-vv very verbose)
+-f  force - even delete write-protected stuff\n");
+}
+
+sub RemoveSource {
+  if (defined $comp) {	  
+    $envDb->DeleteSource($comp, $dryrun, $force);
+  }
+  else {
+    print "About to remove the source for the entire environment. Continue? [y/n] ";
+    my $response = <STDIN>;
+    if ($response =~ /^y$/i) {
+      my $versionInfo = $envDb->VersionInfo();
+      foreach my $thisComp (sort keys %{$versionInfo}) {
+        eval {
+          $envDb->DeleteSource($thisComp, $dryrun, $force);
+        };
+        print "Problem removing source for \"$thisComp\" - continuing with others: $@\n" if $@;
+      }
+    }
+  } 
+}
+
+__END__
+
+=head1 NAME
+
+RemoveSource - Removes the source code for one component or all
+
+=head1 SYNOPSIS
+
+  removesource [options] [<component>]
+
+options:
+
+  -h  help
+  -d  dry run - only states what would happen, doesn't actually do it
+  -f  force - even deletes write protected stuff
+  -v  verbose output (-vv very verbose)
+
+=head1 DESCRIPTION
+
+Deletes the source code for a particular component. If no component is specifies, deletes all known source code in your environment.
+
+=head1 KNOWN BUGS
+
+None.
+
+=head1 COPYRIGHT
+
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+ 
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+ 
+ Contributors:
+ 
+ Description:
+ 
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/removesource.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,98 @@
+@REM Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of the License "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM 
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM 
+@REM Description:
+@REM 
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -w -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl -w
+#line 15
+$0 =~ s|\.bat||i;
+unless (-f $0) {
+    $0 =~ s|.*[/\\]||;
+    for (".", split ';', $ENV{PATH}) {
+	$_ = "." if $_ eq "";
+	$0 = "$_/$0" , goto doit if -f "$_/$0";
+    }
+    die "`$0' not found.\n";
+}
+doit: exec "perl", "-x", $0, @ARGV;
+die "Failed to exec `$0': $!";
+__END__
+
+=head1 NAME
+
+runperl.bat - "universal" batch file to run perl scripts
+
+=head1 SYNOPSIS
+
+	C:\> copy runperl.bat foo.bat
+	C:\> foo
+	[..runs the perl script `foo'..]
+	
+	C:\> foo.bat
+	[..runs the perl script `foo'..]
+	
+
+=head1 DESCRIPTION
+
+This file can be copied to any file name ending in the ".bat" suffix.
+When executed on a DOS-like operating system, it will invoke the perl
+script of the same name, but without the ".bat" suffix.  It will
+look for the script in the same directory as itself, and then in
+the current directory, and then search the directories in your PATH.
+
+It relies on the C<exec()> operator, so you will need to make sure
+that works in your perl.
+
+This method of invoking perl scripts has some advantages over
+batch-file wrappers like C<pl2bat.bat>:  it avoids duplication
+of all the code; it ensures C<$0> contains the same name as the
+executing file, without any egregious ".bat" suffix; it allows
+you to separate your perl scripts from the wrapper used to
+run them; since the wrapper is generic, you can use symbolic
+links to simply link to C<runperl.bat>, if you are serving your
+files on a filesystem that supports that.
+
+On the other hand, if the batch file is invoked with the ".bat"
+suffix, it does an extra C<exec()>.  This may be a performance
+issue.  You can avoid this by running it without specifying
+the ".bat" suffix.
+
+Perl is invoked with the -x flag, so the script must contain
+a C<#!perl> line.  Any flags found on that line will be honored.
+
+=head1 BUGS
+
+Perl is invoked with the -S flag, so it will search the PATH to find
+the script.  This may have undesirable effects.
+
+=head1 SEE ALSO
+
+perl, perlwin32, pl2bat.bat
+
+=cut
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/cbrtools/perl/version.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+2.84.3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/CBROutputFile.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,422 @@
+<cbrmessages>
+	<Error>Line .* in .* has circular reference in .*</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>.* is pending release and contains a path which is .*</Error>
+		<!--> MrpData.pm: CheckPathLength<-->
+	<Error>Failed to extract .*</Error>
+		<!--> Utils.pm: ExtractFile<-->
+	<Error>SRCROOT must not be a UNC path</Error>
+		<!--> Utils.pm: SourceRoot<-->
+	<Error>Couldn&apos;t open directory &quot;.*&quot;: .*</Error>
+		<!--> EnvDb.pm: ExecuteAllSignatures<-->
+	<Error>Problem generating makefile for .* .* in .*</Error>
+		<!--> MrpData.pm: CallMakMake<-->
+	<Error>No path environment variable</Error>
+		<!--> Utils.pm: FindInPath<-->
+	<Error>SRCROOT must specify an existing directory</Error>
+		<!--> Utils.pm: SourceRoot<-->
+	<Error>Unzip reported error code .*</Error>
+		<!--> Utils.pm: CheckUnzipError<-->
+	<Error>Unable to overwrite the hidden file .*: .*</Error>
+		<!--> Utils.pm: ExtractFile<-->
+	<Error>No path data found in reldata.ini. Cannot provide remote archive path for existing component.</Error>
+		<!--> pathdata.pm: RemoteArchivePathForExistingComponent<-->
+	<Error>Component .* version .* didn&apos;t exist</Error>
+		<!--> EnvDb.pm: AddUpEnvSize<-->
+	<Error>Couldn&apos;t remove .* from .*</Error>
+		<!--> Utils.pm: RemoveSourceRoot<-->
+	<Error>Couldn&apos;t open .* for writing: .*</Error>
+		<!--> RelData.pm: WriteToFile CatData.pm: WriteToFile<-->
+	<Error>Zipping failed with error code .*</Error>
+		<!--> Utils.pm: ZipList<-->
+	<Error>EPOCROOT must not be a UNC path</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>No category was provided</Error>
+		<!--> MrpData.pm: HandleBinFile<-->
+	<Error>Couldn&apos;t open database DB_NAME: .*</Error>
+		<!--> EnvDb.pm: Open<-->
+	<Error>.* is not a valid version number</Error>
+		<!--> Utils.pm: ValidateOldFormatVersion PrepRel.pm: PrepRel<-->
+	<Error>.* is not within SRCROOT</Error>
+		<!--> Utils.pm: CheckWithinSourceRoot<-->
+	<Error>Couldn&apos;t delete .*: .*</Error>
+		<!--> EnvDb.pm: DeleteFilesInSignature CleanEnv.pm: CleanEnv, RemoveDirIfEmpty<-->
+	<Error>No path data found in reldata.ini. Cannot provide local archive path for new component.</Error>
+		<!--> pathdata.pm: LocalArchivePathForNewComponent<-->
+	<Error>EPOCROOT must not include a drive letter</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>Unable to create component release successfully, archive might be corrupted.</Error>
+		<!--> MakeRel.pm: MakeReleases<-->
+	<Error>abld .* returned an error code .*</Error>
+		<!--> MrpData.pm: GatherAbldOutput<-->
+	<Error>No versions were found.</Error>
+		<!--> LatestVer: PrintLatestVersions<-->
+	<Error>.* .* does not exist</Error>
+		<!--> RelData.pm: ReadFromFile, ReadFromSpecificFile CatData.pm: ReadFromFile, ReadFromFile<-->
+	<Error>Could not create the table formatter .* for format .*</Error>
+		<!--> TableFormatter.pm: CreateFormatter<-->
+	<Error>No path data found in reldata.ini. Cannot return a list of versions.</Error>
+		<!--> pathdata.pm: ListVersions<-->
+	<Error>.* would be overwritten by unpacking .*</Error>
+		<!--> Utils.pm: CheckZipFileContentsNotPresent<-->
+	<Error>Invalid date specification: .*</Error>
+		<!--> Utils.pm: TextDateToEpochSeconds<-->
+	<Error>EPOCROOT must specify an existing directory</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>.* not found in path</Error>
+		<!--> Utils.pm: FindInPath<-->
+	<Error>.* contains unclassified source code</Error>
+		<!--> Utils.pm: ClassifySourceFile<-->
+	<Error>Couldn&apos;t open abld cache data file &apos;.*&apos;</Error>
+		<!--> MrpData.pm: HandleBinSet<-->
+	<Error>Can&apos;t validate against an external environment, because the current environment database is not empty</Error>
+		<!--> EnvDb.pm: ValidateEnv<-->
+	<Error>Problem stating .*</Error>
+		<!--> EnvDb.pm: ListBinsStandard<-->
+	<Error>&lt;NOTESRC_RELEASE_REASON&gt; not specified in .*</Error>
+		<!--> RelData.pm: ValidateSource<-->
+	<Error>Invalid number of arguments to &apos;testbinary&apos; keyword in .*</Error>
+		<!--> MrpData.pm: DoReadMrp<-->
+	<Error>.* not installed; could not work out what version to use. Please specify a version number.</Error>
+		<!--> PrepRel.pm: PrepRel<-->
+	<Error>.* does not exist</Error>
+		<!--> MrpData.pm: DoReadMrp Utils.pm: CheckExists Manifest.pm: new<-->
+	<Error>Invalid line in signature file .*</Error>
+		<!--> EnvDb.pm: ExecuteSignature<-->
+	<Error>Unzip reported disk full (though this might mean it&apos;s trying to overwrite files in use)</Error>
+		<!--> Utils.pm: CheckUnzipError<-->
+	<Error>Project path .* does not correspond to a real directory</Error>
+		<!--> PathData/ProjectBased.pm: ListComponents<-->
+	<Error>.* is not a file</Error>
+		<!--> Utils.pm: CheckIsFile<-->
+	<Error>.* is not a valid version number; patch number must be given</Error>
+		<!--> Utils.pm: ValidateNewFormatVersion<-->
+	<Error>.* .* was not a valid release (can&apos;t find .*\\reldata)</Error>
+		<!--> RelData.pm: ReadFromFile<-->
+	<Error>&apos;notes_src&apos; keyword used more than once in .*</Error>
+		<!--> MrpData.pm: DoReadMrp<-->
+	<Error>Can&apos;t find IPR category for export .* in .*</Error>
+		<!--> MrpData.pm: AddExport<-->
+	<Error>Couldn&apos;t cope with archive path arguments .*: possibly the wrong number of arguments?</Error>
+		<!--> PathData/ProjectBased.pm: ProcessLine<-->
+	<Error>Release environment is dirty</Error>
+		<!--> MakeEnv: CheckEnvironment<-->
+	<Error>No &apos;component&apos; keyword specified in .*</Error>
+		<!--> MrpData.pm: Validate<-->
+	<Error>No components are pending release</Error>
+		<!--> MakeEnv: CheckEnvironment<-->
+	<Error>.* already exists</Error>
+		<!--> MakeRel.pm: CheckDirs<-->
+	<Error>Problem creating temporary directory .*: .*</Error>
+		<!--> Utils.pm: InitialiseTempDir<-->
+	<Error>Incorrect syntax to &apos;export_file&apos; keyword in .*</Error>
+		<!--> MrpData.pm: DoReadMrp<-->
+	<Error>Can&apos;t find .*\\exports.* .* .* is an incompatible release</Error>
+		<!--> CatData.pm: ReadFromFile<-->
+	<Error>Invalid component name .*</Error>
+		<!--> EnvDb.pm: GetMrpData<-->
+	<Error>Invalid line in .* (Line .*) - .*</Error>
+		<!--> MrpData.pm: DoReadMrp<-->
+	<Error>Could not load the table formatter .* for format .* because .*</Error>
+		<!--> TableFormatter.pm: CreateFormatter<-->
+	<Error>No path data found in reltools.ini. Cannot return list of projects.</Error>
+		<!--> pathdata.pm: ListProjects<-->
+	<Error>Unknown keyword .* for project-based path data</Error>
+		<!--> PathData/ProjectBased.pm: ProcessLine<-->
+	<Error>.* is pending release and cannot be refreshed; use &apos;preprel&apos; to remove it from your environment</Error>
+		<!--> EnvDb.pm: RefreshComponent<-->
+	<Error>Couldn&apos;t decode signature name .*</Error>
+		<!--> EnvDb.pm: DecodeSignatureName<-->
+	<Error>Couldn&apos;t open directory .*: .*</Error>
+		<!--> Utils.pm: ReadDir, CrossCheckDirsOneWay<-->
+	<Error>SRCROOT must end with a backslash</Error>
+		<!--> Utils.pm: SourceRoot<-->
+	<Error>Could not return the list of source statements used in the MRP file.</Error>
+		<!--> RelData.pm: SourceItems<-->
+	<Error>Component .* .* didn&apos;t exist</Error>
+		<!--> EnvDb.pm: AddUpReleaseSize<-->
+	<Error>Cannot run .* because another command is already running</Error>
+		<!--> CommandController.pm: New<-->
+	<Error>Unable to overwrite the read-only file .*: .*</Error>
+		<!--> Utils.pm: ExtractFile<-->
+	<Error>Couldn&apos;t parse abld cache data in &apos;.*&apos;: .*</Error>
+		<!--> MrpData.pm: HandleBinSet<-->
+	<Error>&apos;component&apos; keyword used more than once in .*</Error>
+		<!--> MrpData.pm: DoReadMrp<-->
+	<Error>Unable to create directory.</Error>
+		<!--> Utils.pm: ZipSourceList<-->
+	<Error>Problem emptying temporary directory .*: .*</Error>
+		<!--> Utils.pm: RemoveTempDir<-->
+	<Error>Couldn&apos;t run bldmake bldfiles -v | in abldPath: .*</Error>
+		<!--> MrpData.pm: ExportMakeFile<-->
+	<Error>Couldn&apos;t run EValid: .*</Error>
+		<!--> EnvDb.pm: EvalidateDirectories<-->
+	<Error>Version number .* has an invalid patch number</Error>
+		<!--> Utils.pm: ValidateNewFormatVersion, ValidateNewFormatVersion<-->
+	<Error>Couldn&apos;t parse reldata in .*</Error>
+		<!--> RelData.pm: ReadFromSpecificFile CatData.pm: ReadFromFile<-->
+	<Error>&lt;NOTESRC_RELEASER&gt; not specified in .*</Error>
+		<!--> RelData.pm: ValidateSource<-->
+	<Error>Path does not contain EPOCROOT - EPOCROOT:.* - Path:.*</Error>
+		<!--> Utils.pm: RemoveEpocRoot<-->
+	<Error>No path data found in reldata.ini. Cannot provide local archive path for importing component.</Error>
+		<!--> pathdata.pm: LocalArchivePathForImportingComponent<-->
+	<Error>SRCROOT already present in .*</Error>
+		<!--> Utils.pm: PrependSourceRoot<-->
+	<Error>couldn&apos;t create a formatter without a type</Error>
+		<!--> TableFormatter.pm: CreateFormatter<-->
+	<Error>Problem extracting export IPR categories for .*</Error>
+		<!--> MrpData.pm: ClassifyAutomaticExports<-->
+	<Error>problem reading .*</Error>
+		<!--> Utils.pm: ListZip, SignificantZipDir<-->
+	<Error>.* .* already exists</Error>
+		<!--> MrpData.pm: EnsureDoesNotExist PrepRel.pm: PrepRel<-->
+	<Error>.* does not exist, so can not add to .*</Error>
+		<!--> Utils.pm: ZipSourceList<-->
+	<Error>No path data found in reldata.ini. Cannot return list of components.</Error>
+		<!--> pathdata.pm: ListComponents<-->
+	<Error>Unknown archive_path related keyword: </Error>
+		<!--> pathdata.pm: SubclassifyMyselfByKeyword<-->
+	<Error>Local archive path .* is not a directory</Error>
+		<!--> PathData/ProjectBased.pm: CreateLocalDirectory<-->
+	<Error>Cannot add file &apos;.*&apos; to new zip.</Error>
+		<!--> Utils.pm: ZipSourceList<-->
+	<Error>Component name in MRP file is .* whilst the name of this component in the environment database is .*</Error>
+		<!--> EnvDb.pm: GetMrpData<-->
+	<Error>.* is not within EPOCROOT</Error>
+		<!--> Utils.pm: CheckWithinEpocRoot<-->
+	<Error>Unknown tag .* in .*</Error>
+		<!--> RelData.pm: AddLine<-->
+	<Error>Couldn&apos;t open .* for reading: .*</Error>
+		<!--> ValidateRel: ProcessCommandLine EnvDb.pm: ExecuteSignature RelData.pm: ReadFromSpecificFile CatData.pm: ReadFromFile<-->
+	<Error>Couldn&apos;t make path .*: .*</Error>
+		<!--> Utils.pm: MakeDir<-->
+	<Error>Couldn&apos;t make directory .*: .*</Error>
+		<!--> Utils.pm: MakeDir EnvDb.pm: Open<-->
+	<Error>Failed to write ZIP file &apos;.*&apos;</Error>
+		<!--> Utils.pm: ZipSourceList<-->
+	<Error>Invalid line in .*:.*</Error>
+		<!--> IniData.pm: ReadIni, ReadIni, ReadTargetAliasFile<-->
+	<Error>Unable to find EXPORT.MAKE or EXPORTTEST.MAKE for .*</Error>
+		<!--> MrpData.pm: ExportMakeFile<-->
+	<Error>Invalid line in .*:.* does not exist or is an invalid directory name</Error>
+		<!--> IniData.pm: ReadIni<-->
+	<Error>.* .* is dirty</Error>
+		<!--> MakeEnv: CheckEnvironment<-->
+	<Error>Couldn&apos;t change working directory back to .*: .*</Error>
+		<!--> MrpData.pm: ReadMrp Utils.pm: ZipList<-->
+	<Error>.* not found in environment database</Error>
+		<!--> EnvDb.pm: SetInternalVersion, Status, SetStatus, MrpName, SetMrpName<-->
+	<Error>Line .* in .* has forward reference to .*</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>SRCROOT must not include a drive letter</Error>
+		<!--> Utils.pm: SourceRoot<-->
+	<Error>&quot;.*&quot; does not exist</Error>
+		<!--> Utils.pm: ZipList<-->
+	<Error>Reldata in .* is blank</Error>
+		<!--> RelData.pm: ReadFromSpecificFile CatData.pm: ReadFromFile<-->
+	<Error>.* not currently installed; aborting refreshing of binaries</Error>
+		<!--> EnvDb.pm: RefreshComponent<-->
+	<Error>Unknown keyword .* in .*</Error>
+		<!--> MrpData.pm: DoReadMrp IniData.pm: ReadIni<-->
+	<Error>Couldn&apos;t open .*: .*</Error>
+		<!--> MrpData.pm: ProcessExportMakeFile Utils.pm: ToolsVersion EnvDb.pm: GenerateSignature, GenerateFakeSignature, GenerateEmptySignature Symbian/DistributionPolicy/Reader.pm: readfile<-->
+	<Error>Problem reading stats of .*</Error>
+		<!--> EnvDb.pm: GenerateSignature<-->
+	<Error>bldmake bldfiles failed in .* (exit status .*)</Error>
+		<!--> MrpData.pm: CallBldMake<-->
+	<Error>No path data found in reldata.ini. Cannot provide remote archive path for exporting component.</Error>
+		<!--> pathdata.pm: RemoteArchivePathForExportingComponent<-->
+	<Error>No targets detected for .*</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>You cannot have multiple archive_path lines with the same project name (&quot;..*&quot;)</Error>
+		<!--> PathData/ProjectBased.pm: ProcessLine<-->
+	<Error>Problem unpacking .* from .*</Error>
+		<!--> Utils.pm: UnzipSingleFile<-->
+	<Error>Multiple targets in list declared &lt;EMPTY&gt; for alias .*</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>.* contains unclassified source code</Error>
+		<!--> MrpData.pm: HandleSourceDir<-->
+	<Error>.* not currently installed, aborting removal of binaries</Error>
+		<!--> EnvDb.pm: RemoveComponent<-->
+	<Error>Could not remove directory .*: .*</Error>
+		<!--> EnvDb.pm: DeleteFilesInSignature, DeleteFilesInSignature<-->
+	<Error>Unable to decode string .*</Error>
+		<!--> Utils.pm: SplitQuotedString<-->
+	<Error>Couldn&apos;t run .*\\abld</Error>
+		<!--> MrpData.pm: GetPlatforms<-->
+	<Error>SRCROOT must be an absolute path without a drive letter</Error>
+		<!--> Utils.pm: SourceRoot<-->
+	<Error>Couldn&apos;t parse filename .*</Error>
+		<!--> Utils.pm: SplitFileName<-->
+	<Error>The path .* contains too many characters and can not be extracted</Error>
+		<!--> Utils.pm: ExtractFile, Unzip<-->
+	<Error>Fatal parser error.</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>Must set the EPOCROOT environment variable</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>creating local archive path &quot;..*&quot;</Error>
+		<!--> PathData/ProjectBased.pm: CreateLocalDirectory<-->
+	<Error>Unable to open .* for reading: .*</Error>
+		<!--> MrpData.pm: DoReadMrp IniData.pm: ReadIni, ReadTargetAliasFile RelData.pm: ParseNotesSource<-->
+	<Error>.* .* not found</Error>
+		<!--> pathdata.pm: CheckReleaseExists<-->
+	<Error>Couldn&apos;t open directory .* because .*</Error>
+		<!--> EnvDb.pm: AddUpReleaseSize<-->
+	<Error>.* is not a file or directory in .*</Error>
+		<!--> MrpData.pm: ClassifySource<-->
+	<Error>Component name not found in mrp</Error>
+		<!--> MrpData.pm: Component<-->
+	<Error>Platform .* not supported</Error>
+		<!--> MrpData.pm: GatherAbldOutput<-->
+	<Error>Couldn&apos;t make .* writable: .*</Error>
+		<!--> Utils.pm: SetFileWritable<-->
+	<Error>EPOCROOT already present in .*</Error>
+		<!--> Utils.pm: PrependEpocRoot<-->
+	<Error>No path data found in reldata.ini. Cannot provide local archive path for existing component.</Error>
+		<!--> pathdata.pm: LocalArchivePathForExistingComponent<-->
+	<Error>Internal version number not specified for .* .*</Error>
+		<!--> PrepRel.pm: PrepRel<-->
+	<Error>didn&apos;t find any platforms</Error>
+		<!--> MrpData.pm: GetPlatforms<-->
+	<Error>Problem generating makefile for .* in .*</Error>
+		<!--> MrpData.pm: CallMakMake<-->
+	<Error>No path data found in reldata.ini. Cannot return which project a component belongs to.</Error>
+		<!--> pathdata.pm: ComponentProjects<-->
+	<Error>Unable to create environment successfully, archive might be corrupted.</Error>
+		<!--> MakeRel.pm: MakeReleases<-->
+	<Error>Couldn&apos;t make .* read only: .*</Error>
+		<!--> Utils.pm: SetFileReadOnly<-->
+	<Error>Problem calling bldmake in .*</Error>
+		<!--> MrpData.pm: CallBldMake<-->
+	<Error>Couldn&apos;t change working directory to .*: .*</Error>
+		<!--> MrpData.pm: ExportMakeFile, ExportMakeFile, ReadMrp, CallBldMake Utils.pm: ZipList<-->
+	<Error>Failed to read ipr category for directory .*: .*</Error>
+		<!--> Utils.pm: ClassifyDir<-->
+	<Error>Unzip reported an out-of-memory error</Error>
+		<!--> Utils.pm: CheckUnzipError<-->
+	<Error>Mrp name not specified for .*</Error>
+		<!--> PrepRel.pm: PrepRel, EnvDb.pm: CheckComp<-->
+	<Error>.* has unknown origin</Error>
+		<!--> MakeEnv: CheckEnvironment<-->
+	<Error>Invalid arguments</Error>
+		<!--> MakeEnv: ProcessCommandLine LatestVer: ProcessCommandLine BinInfo: ProcessCommandLine<-->
+	<Error>EPOCROOT must end with a backslash</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>Network share .* does not exist</Error>
+		<!--> Utils.pm: MakeDir<-->
+	<Error>EPOCROOT must be an absolute path without a drive letter</Error>
+		<!--> Utils.pm: EpocRoot<-->
+	<Error>Unzip reported a problem with the zip file</Error>
+		<!--> Utils.pm: CheckUnzipError<-->
+	<Error>Notes source not found in mrp for .*</Error>
+		<!--> MrpData.pm: NotesSource<-->
+	<Error>New version not specified</Error>
+		<!--> PrepRel.pm: PrepRel<-->
+	<Error>Couldn&apos;t execute _zip.exe - .*</Error>
+		<!--> Utils.pm: ZipList<-->
+	<Error>Invalid number of arguments</Error>
+		<!--> RemoveRel: ProcessCommandLine ValidateRel: ProcessCommandLine ValidateEnv: ProcessCommandLine<-->
+	<Error>Unable to create new zip.</Error>
+		<!--> Utils.pm: ZipSourceList<-->
+	<Error>Line .* in .* has duplicate key .*</Error>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Error>.* is not a valid internal version number</Error>
+		<!--> PrepRel.pm: PrepRel<-->
+	<Error>MD5 info incomplete</Error>
+		<!--> Manifest.pm: Compare<-->
+	<Error>File is neither an MRP file nor a manifest file.</Error>
+		<!--> Manifest.pm: new<-->
+	<Error>Directory path does not exist : .*</Error>
+		<!--> Manifest.pm: Save<-->	 
+	<Error>Can&apos;t write manifest file:.*</Error>
+		<!--> Manifest.pm: Save<-->
+	<Error>Component names does not match between manifest versions</Error>
+		<!--> Manifest.pm: Compare<-->	 				 
+	<Error>Can&apos;t read manifest file &apos;.*&apos;:.*</Error>
+		<!--> Manifest.pm: LoadManifestFile<-->
+	<Error>Component name undefined.*</Error>
+		<!--> PathData::ProjectBased.pm: multiple<-->
+	<Error>Version number undefined.*</Error>
+		<!--> PathData::ProjectBased.pm: multiple<-->
+	<Error>Unexpected entry in .* could be corrupt or tampered with</Error>
+		<!--> EnvDb.pm: GenerateSignature<-->
+	<Error>No project paths are defined</Error>
+		<!--> PathData/ProjectBased.pm: BasicChecks<-->	
+	<Error>Project .* unknown</Error>
+		<!--> PathData/ProjectBased.pm: CheckProject<-->		
+	<Error>.* failed check</Error>
+		<!--> CBR Patch<-->
+	<Error>IPR category .* is invalid</Error>
+		<!--> Symbian/IPR.pm: SetIPR<-->
+	<Error>Notes source .* does not exist</Error>
+		<!--> Symbian/CBR/MRP.pm: SetNotesSource<-->
+	<Error>Source .* does not exist</Error>
+		<!--> Symbian/CBR/MRP.pm: SetSource<-->
+	<Error>&apos;exports&apos; entry for .* defined more than once in .*</Error>
+		<!--> Symbian/CBR/MRP.pm: SetExports<-->
+	<Error>Exports path .* does not exist</Error>
+		<!--> Symbian/CBR/MRP.pm: SetExports<-->
+	<Error>Incorrect syntax to &apos;export_file&apos; keyword in .*</Error>
+		<!--> Symbian/CBR/MRP.pm: SetExportFile<-->
+	<Error>Export file .* does not exist</Error>
+		<!--> Symbian/CBR/MRP.pm: SetExportFile<-->
+	<Error>&apos;component&apos; keyword used more than once in .*</Error>
+		<!--> Symbian/CBR/MRP/Reader: ReadFile<-->
+	<Error>Invalid number of arguments to .* keyword in .*</Error>
+		<!--> Symbian/CBR/MRP/Reader: ReadFile<-->
+	<Error>&apos;notes_source&apos; keyword used more than once in .*</Error>
+		<!--> Symbian/CBR/MRP/Reader: ReadFile<-->
+	<Error>&apos;source&apos; entry for .* defined more than once in .*</Error>
+		<!--> Symbian/CBR/MRP/Reader: ReadFile<-->
+	<Error>IPR information for .* specified more than once in .*</Error>
+		<!--> Symbian/CBR/MRP/Reader: ReadFile<-->
+	<Warning>Exported file .* is not within EPOCROOT</Warning>
+		<!--> MrpData.pm: HandleExports<-->
+	<Warning>(.*) -export_file: could not remove .*, as it hadn&apos;t been added. Perhaps the lines in your MRP are in the wrong order, or you meant -binary\?</Warning>
+		<!--> MrpData.pm: HandleExportFile<-->
+	<Warning>Using .* version found in .*</Warning>
+		<!--> IniData.pm: ReadIni<-->
+	<Warning>could not examine .* .* because .*</Warning>
+		<!--> RelData.pm: OpenSet<-->
+	<Warning>.* not found in .*, using version found in .*</Warning>
+		<!--> IniData.pm: ReadIni<-->
+	<Warning>Installed component does not match existing signature; updating signature</Warning>
+		<!--> EnvDb.pm: RefreshComponent<-->
+	<Warning>(.*) The MRP line .* does not .* any files. Therefore is this line necessary?</Warning>
+		<!--> MrpData.pm: WarnRedundantMRPLine<-->
+	<Warning>Not checking for new binaries; .*</Warning>
+		<!--> EnvDb.pm: ValidateCompOld<-->
+	<Warning>skipping the check for added files, for the component .* All other source code validation checks passed. The reason is: .*</Warning>
+		<!--> EnvDb.pm: ValidateCompOld<-->
+	<Warning>Line .* in .* has duplicate value entry .* in key .*</Warning>
+		<!--> IniData.pm: ReadTargetAliasFile<-->
+	<Warning>could not convert path .* to an absolute path because: .*</Warning>
+		<!--> MrpData.pm: GatherAbldOutput<-->
+	<Warning>Couldn&apos;t delete .*: .*</Warning>
+		<!--> EnvDb.pm: DeleteSignature<-->
+	<Warning>.* requires Release Tools version .* or later. You have .*</Warning>
+		<!--> RelData.pm: WarnIfReleaseTooNew<-->
+	<Warning>Not checking for new binaries; MRP file not present</Warning>
+		<!--> EnvDb.pm: ValidateCompOld, ValidateComp<-->
+	<Warning>.* not found.</Warning>
+		<!--> IniData.pm: CheckAliasWarning<-->
+	<Warning>Couldn&apos;t run abld .*</Warning>
+		<!--> MrpData.pm: GatherAbldOutput<-->
+	<Warning>IPR information for .* defined more than once in MRP files and differs and so will be ignored</Warning>
+		<!--> Symbian/CBR/IPR/MRP.pm: AddToTree<-->
+	<Warning>.* contains an export .* which is not included as source for this component, and does not contain dependencies on another component</Warning>
+		<!--> MrpData.pm: ProcessExports<-->
+	<Warning>IPR information for .* could not be obtained from either MRP files or distribution policy files</Warning>
+		<!--> Symbian/IPR.pm: GetRequestedInformation<-->
+	<Warning>The default IPR entry does not apply to any source statements in .*</Warning>
+		<!--> Symbian/CBR/MRP.pm: ValidateParsing, MrpData.pm: validateparsing<-->
+	<Warning>The IPR entry for .* does not apply to any source statements in .*</Warning>
+		<!--> Symbian/CBR/MRP.pm: ValidateParsing, MrpData.pm: validateparsing<-->
+	<Remark>Evalid is not available (.*)</Remark>
+		<!--> Symbian/CBR/Component/Manifest.pm: PopulateDataFromMRP, RefreshMetaData<-->
+	<Remark>Evalid is not available (.*)</Remark>
+		<!--> Symbian/CBR/Component/Manifest.pm: PopulateDataFromMRP, RefreshMetaData<-->											     
+	<Remark>Incompatible evalid versions</Remark>
+		<!--> Symbian/CBR/Component/Manifest.pm: Compare<-->	 					 
+</cbrmessages>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/CConfig.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,541 @@
+#!\bin\perl -w
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CConfig
+# 
+
+package CConfig;
+
+use strict;
+use IO::File;
+use COutputHandler;
+
+# Added for scanlog compatibility
+use Time::localtime;
+
+# CConfig New(scalar aFilename) : constructor
+sub New($)
+	{
+	my $proto = shift;
+	my ($aFilename) = @_;
+
+	my $class = ref($proto) || $proto;
+
+	my $self = { RELTOOLS_REQUIRED => "",
+                     outputHandler => COutputHandler->new()};
+	bless($self, $class);
+  # undef the logfile here so that the folowing warning goes to stdout
+  $self->{iLOGFILE} = undef;
+	# Load in options
+	if (defined($aFilename))
+		{
+		if (!$self->Reload($aFilename))
+			{
+			$self->Warning("Option file could not be loaded.\n");
+			}
+		}
+	
+  # Added support for scanlog and Die() control.
+  $self->{iPhaseErrorCount} = 0;
+	$self->{iPhase} = undef;
+        
+	return $self;
+	}
+
+# boolean Set(scalar aOptionName, scalar aValue)
+sub Set($$)
+	{
+	my $self = shift;
+	my ($aOptionName, $aValue) = @_;
+
+	if (!defined($aOptionName))
+		{
+		$self->Warning("Cannot set undefined option");
+		
+		return 0;
+		}
+		
+	if (!defined($aValue))
+		{
+		$self->Warning("Cannot set option '$aOptionName' to undefined value.");
+		return 0;
+		}
+	
+	if ((ref($aValue) ne "") && (ref($aValue) ne "ARRAY"))
+		{
+		$self->Warning("Value of '$aOptionName' must be either a string or list.");
+		return 0;
+		}
+
+	$self->{iOptions}->{lc($aOptionName)} = [$aOptionName, $aValue];
+	return 1;
+	}
+
+# scalar Get(scalar aOptionName)
+sub Get($)
+	{
+	my $self = shift;
+	my ($aOptionName) = @_;
+
+	if (defined($self->{iOptions}->{lc($aOptionName)}))
+		{
+		return ($self->{iOptions}->{lc($aOptionName)})->[1];
+		}
+	else
+		{
+		return undef;
+		}
+	}
+
+# boolean Reload(scalar aFilename)
+sub Reload($)
+	{
+	my $self = shift;
+	my ($aFilename) = @_;
+	my $okay = 1;
+
+	$self->{iOptions}={}; # Blank existing options
+
+	if (!open(FILE, $aFilename))
+		{
+		$self->Warning("Option file '$aFilename' could not be opened.");
+		$okay = 0;
+		}
+	else
+		{
+		foreach my $line (<FILE>)
+			{
+			chomp ($line);
+
+			# Split on colon
+			my $parms = $line;
+			$parms =~ s/([^\\]):/$1\x08/g; # Turn unescaped colons into 0x08 chars
+			$parms =~ s/\\:/:/g; # Unescape escaped colons
+			my @parms = split(/\x08/,$parms); # Split on 0x08
+
+			if (scalar(@parms) != 0)
+				{
+				if (scalar(@parms) == 2)
+					{
+					my $key = $parms[0];
+					$key =~ s/^\s+//; # Remove preceding spaces
+					$key =~ s/([^\\])\s$/$1/g; # Remove unescaped trailing spaces
+					$key =~ s/\\(\s)/$1/g; # Unescape space characters
+
+					my $value = $parms[1];
+					if ($value =~ /\s*\[.*\]\s*$/)
+						{
+						# Value is a [list]
+
+						# Remove square brackets
+						$value =~ s/^\s*\[//;
+						$value =~ s/\]\s*$//;
+
+						# Split on comma
+						$value =~ s/([^\\]),/$1\x08/g; # Turn unescaped commas into 0x08 chars
+						$value =~ s/\\,/,/g; # Unescape escaped commas
+						my @values = split(/\x08/,$value); # Split on 0x08
+
+						map(s/^\s+//, @values); # Remove preceding spaces
+						map(s/([^\\])\s$/$1/g, @values); # Remove unescaped trailing spaces
+						map(s/\\(\s)/$1/g, @values); # Unescape space characters
+
+						$value = [@values];
+						}
+					else
+						{
+						# Value is a scalar
+
+						$value =~ s/^\s+//; # Remove preceding spaces
+						$value =~ s/([^\\])\s$/$1/g; # Remove unescaped trailing spaces
+						$value =~ s/\\(\s)/$1/g; # Unescape space characters
+						}
+
+					if (!($self->Set($key, $value)))
+						{
+						$okay = 0;
+						}
+					}
+				else
+					{
+					$self->Warning("In file '$aFilename', ".scalar(@parms)." parameters found on a line.\nOnly two parameters, colon separated, are supported.\nLine: '$line'");
+					$okay = 0;
+					}
+				}
+			}
+		close(FILE);
+		}
+
+	return ($okay);
+	}
+
+# boolean Save(scalar aFilename)
+sub Save($)
+	{
+	my $self = shift;
+	my ($aFilename) = @_;
+	my $okay = 1;
+
+	if (!open(FILE, ">$aFilename"))
+		{
+		$self->Warning("Could not open option file '$aFilename' to save to.");
+		$okay = 0;
+		}
+	else
+		{
+		foreach my $pair (values(%{$self->{iOptions}}))
+			{
+			my $key = $pair->[0];
+			my $value = $pair->[1];
+			
+			if (!defined($value))
+				{
+				$self->Error("Cannot write undefined value for key '$key' when saving options.");
+				$okay = 0;
+				}
+			else
+				{
+
+				if (ref($value))
+					{
+					if (ref($value) ne "ARRAY")
+						{
+						$self->Error("Cannot write ".ref($value)." for key '$key' when saving options.");
+						$okay = 0;
+						}
+					else
+						{
+						# It's a list: [value,value,value] and escape any commas or opening spaces
+						my @values = @{$value};
+						map(s/^(\s)/\\$1/,@values);
+						map(s/,/\\,/g,@values);
+						$value = "[".join(",",@values)."]";
+						}
+					}
+				else
+					{
+					# It's a scalar string
+					# Escape opening space
+					$key =~ s/^(\s)/\\$1/;
+					# Escape square brackets;
+					}
+					
+				# Escape colons
+				$key =~ s/:/\\:/g;
+				$value =~ s/:/\\:/g;
+				
+				print FILE $key.":".$value."\n";
+				}
+			}
+		close (FILE)
+		}
+	return $okay;
+	}
+
+# boolean SetLog(scalar aFilename)
+sub SetLog($)
+	{
+	my $self = shift;
+	my ($aLogFile) = @_;
+
+	if (defined($self->{iLOGFILE}))
+		{
+		$self->{iLOGFILE}->close();
+    # This forces any subsequent error message to go to stdout
+    $self->{iLOGFILE} = undef;
+		}
+	
+	if (-e $aLogFile)
+		{
+		if (-e $aLogFile."~")
+			{
+			if (!unlink $aLogFile."~")
+				{
+				$self->Error("Couldn't delete backup log file\n");
+				return 0;
+				}
+			}
+
+		if (system("copy $aLogFile $aLogFile~ > nul 2>&1"))
+			{
+			$self->Error("Couldn't back-up existing log file\n");
+			return 0;
+			}
+		}
+		
+	$self->{iLOGFILE}=new IO::File("> $aLogFile");
+
+	if (defined($self->{iLOGFILE}))
+		{
+		return 1;
+		}
+	else
+		{
+		$self->Error("Couldn't open logfile $aLogFile\n");
+		return 0;
+		}
+	}
+
+# void Print(scalar aLogLine)
+sub Print($)
+	{
+	my $self = shift;
+	my ($aLogLine) = @_;
+
+	my $logfile = $self->{iLOGFILE};
+
+	if ($aLogLine !~ /\n$/)
+		{
+		$aLogLine = $aLogLine."\n";
+		}
+                
+        $aLogLine = $self->{outputHandler}->CheckOutput($aLogLine);      
+
+	if (!defined($logfile))
+		{
+		print $aLogLine;
+		}
+	else
+		{
+		print $logfile $aLogLine;
+		}
+	}
+
+# void Die(scalar aError)
+sub Die($)
+	{
+	my $self = shift;
+	my ($aError) = @_;
+
+	my $logfile = $self->{iLOGFILE};
+
+	if ($aError !~ /\n$/)
+		{
+		$aError = $aError."\n";
+		}
+
+	if (!defined($logfile))
+		{
+		die $aError;
+		}
+	else
+		{
+		print $logfile $aError;
+		die "ERROR: System experienced a fatal error; check the log file.\n";
+		}
+	}
+
+# void Status(scalar aMessage)
+sub Status($)
+	{
+	my $self = shift;
+	my ($aMessage) = @_;
+
+	if (defined($self->{iLOGFILE}))
+		{
+		print STDOUT $aMessage."\n"; # Only display status (to STDOUT) if everything else is going to the logfile
+		}
+	}
+
+# Returns the number of errors encountered in a phase
+sub GetErrorCount()
+  {
+  my $self = shift;
+  return $self->{iPhaseErrorCount};
+  }
+
+###########################################
+# Utility functions
+###########################################
+
+# boolean CheckRelTools()
+
+sub CheckRelTools()
+	{
+	# Search for reldata API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\reldata\.pm")
+			{
+			$found = 1;
+			last;
+			}
+		}
+	
+	return $found
+	}
+
+# void RequireRelTools() - Requires RelData and IniData. Dies if tools can't be located, or die when being required.
+
+sub RequireRelTools()
+	{
+	my $self = shift;
+
+	if ($self->{RELTOOLS_REQUIRED} ne "required")
+		{
+		# Locate reldata API
+		my $found = 0;
+		foreach my $path (split(/;/,$ENV{PATH}))
+			{
+			if (-e $path."\\reldata\.pm")
+				{
+				push @INC, $path;
+				$found = 1;
+				last;
+				}
+			}
+
+		if (!$found)
+			{
+			$self->Error("Couldn't find release tools in path");
+			}
+
+		# Require core modules
+		require RelData;
+		require IniData;
+		$self->{RELTOOLS_REQUIRED}="required";
+		}
+	}
+
+###########################################
+# Handling Commands, Phases and components.
+###########################################
+
+# void Command(scalar aMessage)
+# Prints out a command in scanlog format to the log file or stdout
+sub Command($)
+  {
+  my $self = shift;
+	my ($aCommand) = @_;
+  my $message = "===-------------------------------------------------\n=== Stage=$self->{stageNumber}.$aCommand\n===-------------------------------------------------\n";	my $logfile = $self->{iLOGFILE};
+  $self->Print($message);
+	}
+
+# void PhaseStart(scalar aPhaseName)
+# If a current phase is active then this is closed, if when doing so a
+# non-zero error count is returned by PhaseEnd() then Die is called. This
+# is regarded as a logic error as the stage runner should normally call PhaseEnd()
+# itself and decide what to do about any errors that occured in that phase.
+sub PhaseStart($)
+  {
+  my $self = shift;
+  my $phase = shift;
+  if (defined $self->{iPhase})
+    {
+    my $numErrs = $self->PhaseEnd();
+    # If there are errors returned by PhaseEnd then Die()
+    if ($numErrs != 0)
+      {
+        $self->Die("Fatal logic error detected, CConfig::PhaseStart() called without PhaseEnd() when phase has $numErrs errors.\n");
+      }
+    }
+    
+    $self->{stageNumber}++; # For scanlog compatibility
+    
+    
+    $self->Command($phase);
+    $self->{iPhase} = $phase;
+
+    my $localTime = ctime(); 
+    my $message = "=== Stage=$self->{stageNumber}.$self->{iPhase} started $localTime\n";
+    $message .= "=== Stage=$self->{stageNumber}.$self->{iPhase} == $self->{iPhase}\n"; # For Scanlog compatibility
+    $message .= "+++ HiRes Start " . time() . "\n"; # For Scanlog compatibility
+    $message .= "--  $self->{iPhase}: Miscellaneous\n"; # For Scanlog compatibility
+    $self->Print($message);
+    $self->{iPhaseErrorCount} = 0;
+  }
+  
+# scalar PhaseEnd(void)
+# Closes the current phase and returns a count of the number of errors encountered.
+# This will die if a PhaseStart() has not been declared.
+sub PhaseEnd()
+  {
+  my $self = shift;
+  my $localTime = ctime();
+  if (defined $self->{iPhase})
+    {   
+    my $message = "+++ HiRes End " . time() . "\n"; # For Scanlog compatibility
+    $message .= "=== Stage=$self->{stageNumber}.$self->{iPhase} finished $localTime\n";
+    $self->Print($message);
+    }
+  else
+    {
+    $self->Die("Error: CConfig::PhaseEnd() called without corresponding PhaseStart()\n");
+    }
+	$self->{iPhase} = undef;
+  return $self->{iPhaseErrorCount};
+  }
+  
+# void Component(scalar aComponent)
+# Prints out a component for this phase in scanlog format to the log file or stdout
+sub Component($)
+  {
+  my $self = shift;
+	my ($aComponent) = @_;
+  if (!defined $self->{iPhase})
+    {
+    $self->Die("Logger: Undefined phase for component \"$aComponent\"\n");
+    }
+  else
+    {
+    my $message = "+++ HiRes End " . time() . "\n-- $aComponent\n+++ HiRes Start " . time();
+    $self->Print($message);
+    }
+  }
+
+###############################
+# Handling errors and warnings.
+###############################
+
+# void Error(scalar aMessage)
+# Writes an error message to the logfile (if defined) or stdout
+# and will increment the error count for this phase.
+sub Error($)
+  {
+	my $self = shift;
+	my ($aMessage) = @_;
+  $self->{iPhaseErrorCount} += 1;
+  my $message = "ERROR: $aMessage";
+  $self->Print($message);
+  }
+
+# void Warning(scalar aMessage)
+# Writes an warning message to the logfile (if defined) or stdout
+sub Warning($)
+  {
+	my $self = shift;
+	my ($aMessage) = @_;
+  my $message = "WARNING: $aMessage";
+  $self->Print($message);
+  }
+
+sub DESTROY
+	{
+	my $self = shift;
+
+	# Avoid "unreferenced scalar" error in Perl 5.6 by not calling
+	# PhaseEnd method for each object in multi-threaded CDelta.pm
+
+   if ((defined $self->{iPhase}) && ($self->{iPhase} !~ /CDelta/)) {
+      $self->PhaseEnd;
+   }
+
+	if (defined($self->{iLOGFILE}))
+		{
+		$self->{iLOGFILE}->close();
+		$self->{iLOGFILE} = undef;
+		}
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/COutputHandler.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,119 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# COutputHandler
+# 
+#
+
+package COutputHandler;
+
+use strict;
+use XML::Simple;
+use File::Basename;
+use File::Spec;
+
+use constant CBROUTPUTFILE => File::Spec->catdir(File::Basename::dirname("$INC{'COutputHandler.pm'}"), 'CBROutputFile.xml');
+
+sub new {
+    my $pkg = shift;
+    my $self = {};
+    bless $self, $pkg;
+    
+    $self->ParseOutputFile();
+    
+    return $self;
+}
+
+
+sub CheckOutput {
+    my $self = shift;
+    my $line = shift;
+    
+    chomp $line;
+    
+    my $amendedLine = $line;
+    $amendedLine =~ s/^-?\s?(error|warning|remark|fatal error):?\s+//i;
+
+    foreach my $type ('Error', 'Remark', 'Warning') {
+        foreach my $toMatch (@{$self->{file}->{$type}}) {           
+            if ($amendedLine =~ /^$toMatch$/) {
+                return uc($type) . ": $amendedLine\n";
+            }           
+        }
+    }
+
+    # did not match, return original line
+    return "$line\n";
+}
+
+
+sub ParseOutputFile {
+    my $self = shift;
+    $self->{file} = XMLin(CBROUTPUTFILE);
+    
+    # Compile the regular expressions
+    foreach my $type ('Error', 'Remark', 'Warning') {
+       @{$self->{file}->{$type}} = map { qr/$_/i } @{$self->{file}->{$type}}
+    }
+}
+
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+COutputHandler.pm
+
+=head1 DESCRIPTION
+
+A module that checks output from the CBR Tools and promotes requested errors, warnings and remarks to scanlog compatible versions.
+
+=head1 SYNOPSIS
+
+ use strict;
+ use COutputHandler;
+ 
+ # Instantiate implementation of COutputHandler
+ my $outputHandler = COutputHandler->new();
+
+ # Pass the string through CheckOutput before printing it to the log
+ $aLine = $outputHandler->CheckOutput($aLine);
+ 
+ print $aLine;
+
+=head1 INTERFACE
+
+=head2 Object Management
+
+=head3 new
+
+To be called without any arguments.  Will parse the XML file containing error, warning and remark messages.
+
+=head2 Data Management
+
+=head3 CheckOuput
+
+To be passed a string.  The string is checked to see if it needs to be made scanlog compatible, and if so it is modified and returned.  If not then the original string is returned.
+
+=head3 ParseOutputFile
+
+Parses the XML file.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2007 Symbian Software Ltd. All rights reserved.
+
+=cut
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/CProcessStage.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,153 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CProcessStage
+# 
+#
+
+package CProcessStage;
+
+use strict;
+
+# CProcessStage New(CConfig aOptions) : constructor
+sub New($)
+	{
+	my $proto = shift;
+	my ($aOptions) = @_;
+
+	my $class = ref($proto) || $proto;
+
+	my $self = {};
+	bless($self, $class);
+
+	# Save class name
+	$self->iName($class);
+
+	# Store options
+	$self->iOptions($aOptions);
+
+	# Validate options
+	$self->CheckOpts();
+
+	return $self;
+	}
+
+# Getter/setters
+sub iOptions
+	{
+	my $self = shift;
+	if (@_) { $self->{iOPTIONS} = shift; }
+	return $self->{iOPTIONS};
+	}
+sub iName
+	{
+	my $self = shift;
+	if (@_) { $self->{iNAME} = shift; }
+	return $self->{iNAME};
+	}
+
+# void CheckOpts()
+# Panics if options invalid
+sub CheckOpts()
+	{
+	}
+
+# boolean PreCheck()
+sub PreCheck()
+	{
+	return 1; # Nothing to check - check passed
+	}
+
+# boolean Run()
+sub Run()
+	{
+	return 1; # Nothing run - nothing failed
+	}
+
+# Convenience functions...
+
+# void CheckOpt()
+# Dies if option not defined, or is a list
+sub CheckOpt($)
+	{
+	my $self = shift;
+	my ($option) = @_;
+	my $options = $self->iOptions();
+
+	my $val = $options->Get($option);
+	if (!defined($val))
+		{
+		$options->Die("ERROR: Option '$option' not defined.");
+		}
+	elsif (ref($val))
+		{
+		$options->Die("ERROR: Option '$option' must not be a list.");
+		}
+	}
+
+# void CheckListOpt()
+# Dies if option is not a listref, or is not defined
+sub CheckListOpt($)
+	{
+	my $self = shift;
+	my ($option) = @_;
+	my $options = $self->iOptions();
+
+	my $val = $options->Get($option);
+	if (!defined($val))
+		{
+		$options->Die("ERROR: Option '$option' not defined.");
+		}
+	elsif (ref($val) ne "ARRAY")
+		{
+		$options->Die("ERROR: Option '$option' must be a list.");
+		}
+	}
+
+# void PreCheckOpt()
+# Returns false if option is not defined or is a list
+sub PreCheckOpt($)
+	{
+	my $self = shift;
+	my ($option) = @_;
+
+	my $val = $self->iOptions()->Get($option);
+	if ( (!defined($val)) || (ref($val)) )
+		{
+		return 0;
+		}
+	else
+		{
+		return 1;
+		}
+	}
+	
+# void PreCheckListOpt()
+# Returns false if option is not a listref, or is not defined
+sub PreCheckListOpt($)
+	{
+	my $self = shift;
+	my ($option) = @_;
+
+	my $val = $self->iOptions()->Get($option);
+	if ( (!defined($val)) || (ref($val) ne "ARRAY") )
+		{
+		return 0;
+		}
+	else
+		{
+		return 1;
+		}
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/CStageRunner.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,162 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CStageRunner
+# 
+#
+
+package CStageRunner;
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\stages";
+
+# CStageRunner New(listref aStageNames, CConfig aOptions) : constructor
+sub New($$)
+	{
+	my $proto = shift;
+	my ($aStageNames, $aOptions) = @_;
+
+	my $class = ref($proto) || $proto;
+
+	my $self = {};
+	bless($self, $class);
+
+	if (!defined($aOptions))
+		{
+		$aOptions->Die("ERROR: CStageRunner takes an CConfig object as its second parameter.");
+		}
+
+	# Instantiate stages
+	$self->{iStages} = [];
+	my $stage;
+	my $okay = 1;
+
+  # Added scanlog compatibility
+  $aOptions->PhaseStart("Initialising CStageRunner");
+	foreach my $stageName (@$aStageNames)
+		{
+		my $found = 0;
+		foreach my $path (@INC)
+			{
+			if (-e $path."\\$stageName.pm")
+				{
+				$found = 1;
+				}
+			}
+			
+		if (!$found)
+			{
+			$aOptions->Error("Stage $stageName does not exist.");
+			$okay = 0;
+			}
+		elsif (eval("require $stageName"))
+			{
+			$stage = New $stageName($aOptions);
+
+			if (!defined($stage))
+				{
+				$aOptions->Error("Stage $stageName could not be started.");
+				$okay = 0;
+				}
+			else
+				{
+				push @{$self->{iStages}}, $stage;
+				}
+			}
+		else
+			{
+			$aOptions->Error("Stage $stageName could not be loaded:\n$@");
+			$okay = 0;
+			}
+		}
+
+	if (!$okay)
+		{
+		$aOptions->Die("");
+		}
+	else
+		{
+		$aOptions->Print("All stages loaded and options checked.");
+		}
+  # This flag triggers an error message if any stage produces errors
+  # but does not die. The flag is used to emit a warning, once only,
+  # that subsequent stages may be polluted buy the errors in previous stages.
+  $self->{iWarnOnStageEerror} = 1;
+	$self->iOptions($aOptions);
+  
+  # Scanlog compatibility, we ignore the return value as that is covered by $okay
+	$aOptions->PhaseEnd();
+  return $self;
+	}
+
+# Getters/setters
+sub iOptions()
+	{
+	my $self = shift;
+	if (@_) { $self->{iOPTIONS} = shift; }
+	return $self->{iOPTIONS};
+	}
+
+# boolean Run()
+sub Run()
+	{
+	my $self = shift;
+
+	my $okay = 1;
+  my $options;
+	
+	foreach my $stage (@{$self->{iStages}})
+		{
+    $options = $self->iOptions();
+    $options->PhaseStart($stage->iName());
+		if ($stage->PreCheck())
+			{
+			$options->Status("Running ".$stage->iName());
+			if ($stage->Run())
+				{
+        # Passed stage i.e. no fatal errors but check for 'normal' errors
+        my $errors = $options->GetErrorCount();
+        # Check if the stage had errors and write a precautionary
+        # error message if this has not been done so already
+        if ($errors > 0 && $self->{iWarnOnStageEerror} != 0)
+          {
+          $options->Error("Stage errors mean that subsequent stages might be unreliable.");
+          # It is a write once error message so clear the internal flag
+          $self->{iWarnOnStageEerror} = 0;
+          }
+				}
+      else
+        {
+        # Stage signalled a fatal error by returning non-zero so bail out
+        $options->Error("Fatal error received from ".$stage->iName()."::Run().");
+        $options->PhaseEnd();
+				$okay = 0;
+        last;
+        }
+			}
+		else
+			{
+      $options->Error("Stage failed PreCheck()");
+			$okay = 0;
+      $options->PhaseEnd();
+      last;
+			}
+    $options->PhaseEnd();
+		}
+		
+	return ($okay == 1);
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/MakeCBR.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,153 @@
+#!/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Automated Component Based Releasing system front end
+# 
+#
+
+use strict;
+use Getopt::Long;
+use Cwd;
+use FindBin;
+
+use lib $FindBin::Bin;
+
+use CStageRunner;
+use CConfig;
+
+my @GTTechViewPrepareStages=("CCreateDrive","CGetPrevRel","CCheckMrpUpdates","CDelta", "CCheckEnv");
+my @GTTechViewReleaseStages=("CReleaseEnv","CStoreMrpState");
+my @GTstages=("CRemoveNonGT", "CInstallGTConflicts", "CPrepGTRelease", "CCheckEnv", "CReleaseEnv");
+my @finishStages=("CCleanUp");
+
+my $help = q/
+  makecbr.pl -b build_id -c config_file -v release_version [-j max_processes]
+    [-i int_version] [-p prev_version] [-l log_file] [-d debug_output] [-repair]
+   * where:
+  build_id is a unique build identifier
+  config_file is the filename of the configuration file
+  release_version is the version to be assigned to any updated components
+   * Optionally:
+  max_processes is the maximum number of parallel processes allowed
+  int_version is the internal version string to use for publishing components
+  prev_version is the version to assume as the previous baseline, to override
+    automatic determination
+  log_file is a file to log all output to
+  debug_output is a file to write intermediate stage output to in case of an
+    error
+   * -repair assumes a failure in GT_TechView and resumes from the MakeEnv step.
+/;
+
+my($build_id, $config_file, $log_file, $parallel, $release_ver, $debug_file, $help_flag, $prev_ver, $repair, $int_ver);
+
+GetOptions (
+   'b=s'    => \$build_id,
+   'c=s'    => \$config_file,
+   'l=s'    => \$log_file,
+   'v=s'    => \$release_ver,
+   'p=s'    => \$prev_ver,
+   'd=s'    => \$debug_file,
+   '+h'     => \$help_flag,
+   'repair' => \$repair,
+   'i=s'    => \$int_ver,
+   'j=i'    => \$parallel
+);
+
+if (defined($help_flag))
+	{
+	print $help;
+	exit;
+	}
+
+if (!defined($config_file))
+	{
+	die "A configuration file must be specified (using the -c option)\n";
+	}
+
+if (!defined($parallel)) {
+   $parallel = 0;
+}
+
+my $options = New CConfig();
+if (defined($log_file))
+	{
+	$options->SetLog($log_file) or exit;
+	}
+
+if (defined($debug_file))
+	{
+	# Ensure path isn't relative
+
+	if ($debug_file !~ /^[A-Za-z]:/)
+		{
+		if ($debug_file =~ /^[^\/\\]/)
+			{
+			# Path is relative
+			$debug_file = getcwd()."\\".$debug_file;
+			}
+		else
+			{
+			# Path is only missing drive letter
+			my $drive = getcwd();
+			$drive =~ s/^([A-Za-z]):.*$/$1/ or $options->Die("ERROR: getcwd() did not return drive letter, rather '$drive'");
+			$debug_file = $drive.":".$debug_file;
+			}
+		}
+	$debug_file =~ s/\//\\/g; # Make all slashes backslashes
+	}
+
+$options->Reload($config_file) or $options->Die("ERROR: Couldn't load config file '$config_file'");
+
+$options->Set("Build identifier",$build_id) or $options->Die("ERROR: Build identifier '$build_id' is invalid");
+$options->Set("Release version",$release_ver) or $options->Die("ERROR: Release version '$release_ver' is invalid");
+
+if (defined($int_ver))
+    {
+    $options->Set("Internal version",$int_ver) or $options->Die("ERROR: Internal version '$int_ver' is invalid");
+    }
+else
+    {
+    $options->Set("Internal version",$release_ver);
+    }
+
+if (defined($prev_ver))
+	{
+	$options->Set("Last baseline version",$prev_ver) or $options->Die("ERROR: Previous baseline version '$prev_ver' is invalid");
+	}
+
+if (defined($parallel)) {
+   $options->Set('Max Parallel Tasks', $parallel) or $options->Die("ERROR: Max parallel processes '$parallel' is invalid");
+}
+
+my @stages = ();
+if (defined($repair))
+	{
+	push @stages, "CConfigureRepair";
+	}
+else
+	{
+	push @stages, @GTTechViewPrepareStages;
+	}
+    
+push @stages, (@GTTechViewReleaseStages, @GTstages, @finishStages);
+
+my $stageRunner = New CStageRunner(\@stages, $options);
+if (!$stageRunner->Run())
+	{
+	if (defined($debug_file))
+		{
+		$options->Save($debug_file);
+		}
+	$options->Die("");
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/Parallel/ForkManager.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,422 @@
+# Copyright (c) 2000 Szab? Balázs (dLux)
+#
+# All right reserved. This program is free software; you can redistribute it 
+# and/or modify it under the same terms as Perl itself.
+#
+
+=head1 NAME
+
+Parallel::ForkManager - A simple parallel processing fork manager
+
+=head1 SYNOPSIS
+
+  use Parallel::ForkManager;
+
+  $pm = new Parallel::ForkManager($MAX_PROCESSES);
+
+  foreach $data (@all_data) {
+    # Forks and returns the pid for the child:
+    my $pid = $pm->start and next; 
+
+    ... do some work with $data in the child process ...
+
+    $pm->finish; # Terminates the child process
+  }
+
+=head1 DESCRIPTION
+
+This module is intended for use in operations that can be done in parallel 
+where the number of processes to be forked off should be limited. Typical 
+use is a downloader which will be retrieving hundreds/thousands of files.
+
+The code for a downloader would look something like this:
+
+  use LWP::Simple;
+  use Parallel::ForkManager;
+
+  ...
+  
+  @links=( 
+    ["http://www.foo.bar/rulez.data","rulez_data.txt"], 
+    ["http://new.host/more_data.doc","more_data.doc"],
+    ...
+  );
+
+  ...
+
+  # Max 30 processes for parallel download
+  my $pm = new Parallel::ForkManager(30); 
+
+  foreach my $linkarray (@links) {
+    $pm->start and next; # do the fork
+
+    my ($link,$fn) = @$linkarray;
+    warn "Cannot get $fn from $link"
+      if getstore($link,$fn) != RC_OK;
+
+    $pm->finish; # do the exit in the child process
+  }
+  $pm->wait_all_children;
+
+First you need to instantiate the ForkManager with the "new" constructor. 
+You must specify the maximum number of processes to be created. If you 
+specify 0, then NO fork will be done; this is good for debugging purposes.
+
+Next, use $pm->start to do the fork. $pm returns 0 for the child process, 
+and child pid for the parent process (see also L<perlfunc(1p)/fork()>). 
+The "and next" skips the internal loop in the parent process. NOTE: 
+$pm->start dies if the fork fails.
+
+$pm->finish terminates the child process (assuming a fork was done in the 
+"start").
+
+NOTE: You cannot use $pm->start if you are already in the child process. 
+If you want to manage another set of subprocesses in the child process, 
+you must instantiate another Parallel::ForkManager object!
+
+=head1 METHODS
+
+=over 5
+
+=item new $processes
+
+Instantiate a new Parallel::ForkManager object. You must specify the maximum 
+number of children to fork off. If you specify 0 (zero), then no children 
+will be forked. This is intended for debugging purposes.
+
+=item start [ $process_identifier ]
+
+This method does the fork. It returns the pid of the child process for 
+the parent, and 0 for the child process. If the $processes parameter 
+for the constructor is 0 then, assuming you're in the child process, 
+$pm->start simply returns 0.
+
+An optional $process_identifier can be provided to this method... It is used by 
+the "run_on_finish" callback (see CALLBACKS) for identifying the finished
+process.
+
+=item finish [ $exit_code ]
+
+Closes the child process by exiting and accepts an optional exit code 
+(default exit code is 0) which can be retrieved in the parent via callback. 
+If you use the program in debug mode ($processes == 0), this method doesn't 
+do anything.
+
+=item set_max_procs $processes
+
+Allows you to set a new maximum number of children to maintain. Returns 
+the previous setting.
+
+=item wait_all_children
+
+You can call this method to wait for all the processes which have been 
+forked. This is a blocking wait.
+
+=back
+
+=head1 CALLBACKS
+
+You can define callbacks in the code, which are called on events like starting 
+a process or upon finish.
+
+The callbacks can be defined with the following methods:
+
+=over 4
+
+=item run_on_finish $code [, $pid ]
+
+You can define a subroutine which is called when a child is terminated. It is
+called in the parent process.
+
+The paremeters of the $code are the following:
+
+  - pid of the process, which is terminated
+  - exit code of the program
+  - identification of the process (if provided in the "start" method)
+  - exit signal (0-127: signal name)
+  - core dump (1 if there was core dump at exit)
+
+=item run_on_start $code
+
+You can define a subroutine which is called when a child is started. It called
+after the successful startup of a child in the parent process.
+
+The parameters of the $code are the following:
+
+  - pid of the process which has been started
+  - identification of the process (if provided in the "start" method)
+
+=item run_on_wait $code, [$period]
+
+You can define a subroutine which is called when the child process needs to wait
+for the startup. If $period is not defined, then one call is done per
+child. If $period is defined, then $code is called periodically and the
+module waits for $period seconds betwen the two calls. Note, $period can be
+fractional number also. The exact "$period seconds" is not guarranteed,
+signals can shorten and the process scheduler can make it longer (on busy
+systems).
+
+The $code called in the "start" and the "wait_all_children" method also.
+
+No parameters are passed to the $code on the call.
+
+=back
+
+=head1 EXAMPLE
+
+=head2 Parallel get
+
+This small example can be used to get URLs in parallel.
+
+  use Parallel::ForkManager;
+  use LWP::Simple;
+  my $pm=new Parallel::ForkManager(10);
+  for my $link (@ARGV) {
+    $pm->start and next;
+    my ($fn)= $link =~ /^.*\/(.*?)$/;
+    if (!$fn) {
+      warn "Cannot determine filename from $fn\n";
+    } else {
+      $0.=" ".$fn;
+      print "Getting $fn from $link\n";
+      my $rc=getstore($link,$fn);
+      print "$link downloaded. response code: $rc\n";
+    };
+    $pm->finish;
+  };
+
+=head2 Callbacks
+
+Example of a program using callbacks to get child exit codes:
+
+  use strict;
+  use Parallel::ForkManager;
+
+  my $max_procs = 5;
+  my @names = qw( Fred Jim Lily Steve Jessica Bob Dave Christine Rico Sara );
+  # hash to resolve PID's back to child specific information
+
+  my $pm =  new Parallel::ForkManager($max_procs);
+
+  # Setup a callback for when a child finishes up so we can
+  # get it's exit code
+  $pm->run_on_finish(
+    sub { my ($pid, $exit_code, $ident) = @_;
+      print "** $ident just got out of the pool ".
+        "with PID $pid and exit code: $exit_code\n";
+    }
+  );
+
+  $pm->run_on_start(
+    sub { my ($pid,$ident)=@_;
+      print "** $ident started, pid: $pid\n";
+    }
+  );
+
+  $pm->run_on_wait(
+    sub {
+      print "** Have to wait for one children ...\n"
+    },
+    0.5
+  );
+
+  foreach my $child ( 0 .. $#names ) {
+    my $pid = $pm->start($names[$child]) and next;
+
+    # This code is the child process
+    print "This is $names[$child], Child number $child\n";
+    sleep ( 2 * $child );
+    print "$names[$child], Child $child is about to get out...\n";
+    sleep 1;
+    $pm->finish($child); # pass an exit code to finish
+  }
+
+  print "Waiting for Children...\n";
+  $pm->wait_all_children;
+  print "Everybody is out of the pool!\n";
+
+=head1 BUGS AND LIMITATIONS
+
+Do not use Parallel::ForkManager in an environment, where other child
+processes can affect the run of the main program, so using this module
+is not recommended in an environment where fork() / wait() is already used.
+
+If you want to use more than one copies of the Parallel::ForkManager, then
+you have to make sure that all children processes are terminated, before you
+use the second object in the main program.
+
+You are free to use a new copy of Parallel::ForkManager in the child
+processes, although I don't think it makes sense.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2000 Szabó, Balázs (dLux)
+
+All right reserved. This program is free software; you can redistribute it 
+and/or modify it under the same terms as Perl itself.
+
+=head1 AUTHOR
+
+  dLux (Szabó, Balázs) <dlux@kapu.hu>
+
+=head1 CREDITS
+
+  Noah Robin <sitz@onastick.net> (documentation tweaks)
+  Chuck Hirstius <chirstius@megapathdsl.net> (callback exit status, example)
+  Grant Hopwood <hopwoodg@valero.com> (win32 port)
+  Mark Southern <mark_southern@merck.com> (bugfix)
+
+=cut
+
+package Parallel::ForkManager;
+use POSIX ":sys_wait_h";
+use strict;
+use vars qw($VERSION);
+$VERSION='0.7.5';
+
+sub new { my ($c,$processes)=@_;
+  my $h={
+    max_proc   => $processes,
+    processes  => {},
+    in_child   => 0,
+  };
+  return bless($h,ref($c)||$c);
+};
+
+sub start { my ($s,$identification)=@_;
+  die "Cannot start another process while you are in the child process"
+    if $s->{in_child};
+  while ($s->{max_proc} && ( keys %{ $s->{processes} } ) >= $s->{max_proc}) {
+    $s->on_wait;
+    $s->wait_one_child(defined $s->{on_wait_period} ? &WNOHANG : undef);
+  };
+  $s->wait_children;
+  if ($s->{max_proc}) {
+    my $pid=fork();
+    die "Cannot fork: $!" if !defined $pid;
+    if ($pid) {
+      $s->{processes}->{$pid}=$identification;
+      $s->on_start($pid,$identification);
+    } else {
+      $s->{in_child}=1 if !$pid;
+    }
+    return $pid;
+  } else {
+    $s->{processes}->{$$}=$identification;
+    $s->on_start($$,$identification);
+    return 0; # Simulating the child which returns 0
+  }
+}
+
+sub finish { my ($s, $x)=@_;
+  if ( $s->{in_child} ) {
+    exit ($x || 0);
+  }
+  if ($s->{max_proc} == 0) { # max_proc == 0
+    $s->on_finish($$, $x ,$s->{processes}->{$$}, 0, 0);
+    delete $s->{processes}->{$$};
+  }
+  return 0;
+}
+
+sub wait_children { my ($s)=@_;
+  return if !keys %{$s->{processes}};
+  my $kid;
+  do {
+    $kid = $s->wait_one_child(&WNOHANG);
+  } while $kid > 0 || $kid < -1; # AS 5.6/Win32 returns negative PIDs
+};
+
+*wait_childs=*wait_children; # compatibility
+
+sub wait_one_child { my ($s,$par)=@_;
+  my $kid;
+  while (1) {
+    $kid = $s->_waitpid(-1,$par||=0);
+    last if $kid == 0 || $kid == -1; # AS 5.6/Win32 returns negative PIDs
+    redo if !exists $s->{processes}->{$kid};
+    my $id = delete $s->{processes}->{$kid};
+    $s->on_finish( $kid, $? >> 8 , $id, $? & 0x7f, $? & 0x80 ? 1 : 0);
+    last;
+  }
+  $kid;
+};
+
+sub wait_all_children { my ($s)=@_;
+  while (keys %{ $s->{processes} }) {
+    $s->on_wait;
+    $s->wait_one_child(defined $s->{on_wait_period} ? &WNOHANG : undef);
+  };
+}
+
+*wait_all_childs=*wait_all_children; # compatibility;
+
+sub run_on_finish { my ($s,$code,$pid)=@_;
+  $s->{on_finish}->{$pid || 0}=$code;
+}
+
+sub on_finish { my ($s,$pid,@par)=@_;
+  my $code=$s->{on_finish}->{$pid} || $s->{on_finish}->{0} or return 0;
+  $code->($pid,@par); 
+};
+
+sub run_on_wait { my ($s,$code, $period)=@_;
+  $s->{on_wait}=$code;
+  $s->{on_wait_period} = $period;
+}
+
+sub on_wait { my ($s)=@_;
+  if(ref($s->{on_wait}) eq 'CODE') {
+    $s->{on_wait}->();
+    if (defined $s->{on_wait_period}) {
+        local $SIG{CHLD} = sub { } if ! defined $SIG{CHLD};
+        select undef, undef, undef, $s->{on_wait_period}
+    };
+  };
+};
+
+sub run_on_start { my ($s,$code)=@_;
+  $s->{on_start}=$code;
+}
+
+sub on_start { my ($s,@par)=@_;
+  $s->{on_start}->(@par) if ref($s->{on_start}) eq 'CODE';
+};
+
+sub set_max_procs { my ($s, $mp)=@_;
+  $s->{max_proc} = $mp;
+}
+
+# OS dependant code follows...
+
+sub _waitpid { # Call waitpid() in the standard Unix fashion.
+  return waitpid($_[1],$_[2]);
+}
+
+# On ActiveState Perl 5.6/Win32 build 625, waitpid(-1, &WNOHANG) always
+# blocks unless an actual PID other than -1 is given.
+sub _NT_waitpid { my ($s, $pid, $par) = @_;
+  if ($par == &WNOHANG) { # Need to nonblock on each of our PIDs in the pool.
+    my @pids = keys %{ $s->{processes} };
+    # Simulate -1 (no processes awaiting cleanup.)
+    return -1 unless scalar(@pids);
+    # Check each PID in the pool.
+    my $kid;
+    foreach $pid (@pids) {
+      $kid = waitpid($pid, $par);
+      return $kid if $kid != 0; # AS 5.6/Win32 returns negative PIDs.
+    }
+    return $kid;
+  } else { # Normal waitpid() call.
+    return waitpid($pid, $par);
+  }
+}
+
+{
+  local $^W = 0;
+  if ($^O eq 'NT' or $^O eq 'MSWin32') {
+    *_waitpid = \&_NT_waitpid;
+  }
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/Win32/Pipe.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,414 @@
+package Win32::Pipe;
+
+$VERSION = '0.024';
+
+# Win32::Pipe.pm
+#       +==========================================================+
+#       |                                                          |
+#       |                     PIPE.PM package                      |
+#       |                     ---------------                      |
+#       |                    Release v96.05.11                     |
+#       |                                                          |
+#       |    Copyright (c) 1996 Dave Roth. All rights reserved.    |
+#       |   This program is free software; you can redistribute    |
+#       | it and/or modify it under the same terms as Perl itself. |
+#       |                                                          |
+#       +==========================================================+
+#
+#
+#	Use under GNU General Public License or Larry Wall's "Artistic License"
+#
+#	Check the README.TXT file that comes with this package for details about
+#	it's history.
+#
+
+require Exporter;
+require DynaLoader;
+
+@ISA= qw( Exporter DynaLoader );
+    # Items to export into callers namespace by default. Note: do not export
+    # names by default without a very good reason. Use EXPORT_OK instead.
+    # Do not simply export all your public functions/methods/constants.
+@EXPORT = qw();
+
+$ErrorNum = 0;
+$ErrorText = "";
+
+sub new
+{
+    my ($self, $Pipe);
+    my ($Type, $Name, $Time) = @_;
+
+    if (! $Time){
+        $Time = DEFAULT_WAIT_TIME();
+    }
+    $Pipe = PipeCreate($Name, $Time);
+    if ($Pipe){
+        $self = bless {};
+        $self->{'Pipe'} = $Pipe;
+    }else{
+        ($ErrorNum, $ErrorText) = PipeError();
+        return undef;
+    }
+    $self;
+}
+
+sub Write{
+    my($self, $Data) = @_;
+    $Data = PipeWrite($self->{'Pipe'}, $Data);
+    return $Data;
+}
+
+sub Read{
+    my($self) = @_;
+    my($Data);
+    $Data = PipeRead($self->{'Pipe'});
+    return $Data;
+}
+
+sub Error{
+    my($self) = @_;
+    my($MyError, $MyErrorText, $Temp);
+    if (! ref($self)){
+        undef $Temp;
+    }else{
+        $Temp = $self->{'Pipe'};
+    }
+    ($MyError, $MyErrorText) = PipeError($Temp);
+    return wantarray? ($MyError, $MyErrorText):"[$MyError] \"$MyErrorText\"";
+}
+
+
+sub Close{
+    my ($self) = shift;
+    PipeClose($self->{'Pipe'});
+    $self->{'Pipe'} = 0;
+}
+
+sub Connect{
+    my ($self) = @_;
+    my ($Result);
+    $Result = PipeConnect($self->{'Pipe'});
+    return $Result;
+}
+
+sub Disconnect{
+    my ($self, $iPurge) = @_;
+    my ($Result);
+    if (! $iPurge){
+        $iPurge = 1;
+    }
+    $Result = PipeDisconnect($self->{'Pipe'}, $iPurge);
+    return $Result;
+}
+
+sub BufferSize{
+    my($self) = @_;
+    my($Result) =  PipeBufferSize($self->{'Pipe'});
+    return $Result;
+}
+
+sub ResizeBuffer{
+    my($self, $Size) = @_;
+    my($Result) = PipeResizeBuffer($self->{'Pipe'}, $Size);
+    return $Result;
+}
+
+
+####
+#   Auto-Kill an instance of this module
+####
+sub DESTROY
+{
+    my ($self) = shift;
+    Close($self);
+}
+
+
+sub Credit{
+    my($Name, $Version, $Date, $Author, $CompileDate, $CompileTime, $Credits) = Win32::Pipe::Info();
+    my($Out, $iWidth);
+    $iWidth = 60;
+    $Out .=  "\n";
+    $Out .=  "  +". "=" x ($iWidth). "+\n";
+    $Out .=  "  |". Center("", $iWidth). "|\n";
+    $Out .=  "  |" . Center("", $iWidth). "|\n";
+    $Out .=  "  |". Center("$Name", $iWidth). "|\n";
+    $Out .=  "  |". Center("-" x length("$Name"), $iWidth). "|\n";
+    $Out .=  "  |". Center("", $iWidth). "|\n";
+
+    $Out .=  "  |". Center("Version $Version ($Date)", $iWidth). "|\n";
+    $Out .=  "  |". Center("by $Author", $iWidth). "|\n";
+    $Out .=  "  |". Center("Compiled on $CompileDate at $CompileTime.", $iWidth). "|\n";
+    $Out .=  "  |". Center("", $iWidth). "|\n";
+    $Out .=  "  |". Center("Credits:", $iWidth). "|\n";
+    $Out .=  "  |". Center(("-" x length("Credits:")), $iWidth). "|\n";
+    foreach $Temp (split("\n", $Credits)){
+        $Out .=  "  |". Center("$Temp", $iWidth). "|\n";
+    }
+    $Out .=  "  |". Center("", $iWidth). "|\n";
+    $Out .=  "  +". "=" x ($iWidth). "+\n";
+    return $Out;
+}
+
+sub Center{
+    local($Temp, $Width) = @_;
+    local($Len) = ($Width - length($Temp)) / 2;
+    return " " x int($Len) . $Temp . " " x (int($Len) + (($Len != int($Len))? 1:0));
+}
+
+# ------------------ A U T O L O A D   F U N C T I O N ---------------------
+
+sub AUTOLOAD {
+    # This AUTOLOAD is used to 'autoload' constants from the constant()
+    # XS function.  If a constant is not found then control is passed
+    # to the AUTOLOAD in AutoLoader.
+
+    my($constname);
+    ($constname = $AUTOLOAD) =~ s/.*:://;
+    #reset $! to zero to reset any current errors.
+    local $! = 0;
+    $val = constant($constname, @_ ? $_[0] : 0);
+
+    if ($! != 0) {
+    if ($! =~ /Invalid/) {
+        $AutoLoader::AUTOLOAD = $AUTOLOAD;
+        goto &AutoLoader::AUTOLOAD;
+    }
+    else {
+
+            # Added by JOC 06-APR-96
+            # $pack = 0;
+        $pack = 0;
+        ($pack,$file,$line) = caller;
+            print "Your vendor has not defined Win32::Pipe macro $constname, used in $file at line $line.";
+    }
+    }
+    eval "sub $AUTOLOAD { $val }";
+    goto &$AUTOLOAD;
+}
+
+bootstrap Win32::Pipe;
+
+1;
+__END__
+
+=head1 NAME
+
+Win32::Pipe - Win32 Named Pipe
+
+=head1 SYNOPSIS
+
+To use this extension, follow these basic steps. First, you need to
+'use' the pipe extension:
+
+    use Win32::Pipe;
+
+Then you need to create a server side of a named pipe:
+
+    $Pipe = new Win32::Pipe("My Pipe Name");
+
+or if you are going to connect to pipe that has already been created:
+
+    $Pipe = new Win32::Pipe("\\\\server\\pipe\\My Pipe Name");
+
+    NOTE: The "\\\\server\\pipe\\" is necessary when connecting
+          to an existing pipe! If you are accessing the same
+          machine you could use "\\\\.\\pipe\\" but either way
+          works fine.
+
+You should check to see if C<$Pipe> is indeed defined otherwise there
+has been an error.
+
+Whichever end is the server, it must now wait for a connection...
+
+    $Result = $Pipe->Connect();
+
+    NOTE: The client end does not do this! When the client creates
+          the pipe it has already connected!
+
+Now you can read and write data from either end of the pipe:
+
+    $Data = $Pipe->Read();
+
+    $Result = $Pipe->Write("Howdy! This is cool!");
+
+When the server is finished it must disconnect:
+
+    $Pipe->Disconnect();
+
+Now the server could C<Connect> again (and wait for another client) or
+it could destroy the named pipe...
+
+    $Data->Close();
+
+The client should C<Close> in order to properly end the session.
+
+=head1 DESCRIPTION
+
+=head2 General Use
+
+This extension gives Win32 Perl the ability to use Named Pipes. Why?
+Well considering that Win32 Perl does not (yet) have the ability to
+C<fork> I could not see what good the C<pipe(X,Y)> was. Besides, where
+I am as an admin I must have several perl daemons running on several
+NT Servers. It dawned on me one day that if I could pipe all these
+daemons' output to my workstation (across the net) then it would be
+much easier to monitor. This was the impetus for an extension using
+Named Pipes. I think that it is kinda cool. :)
+
+=head2 Benefits
+
+And what are the benefits of this module?
+
+=over
+
+=item *
+
+You may create as many named pipes as you want (uh, well, as many as
+your resources will allow).
+
+=item *
+
+Currently there is a limit of 256 instances of a named pipe (once a
+pipe is created you can have 256 client/server connections to that
+name).
+
+=item *
+
+The default buffer size is 512 bytes; this can be altered by the
+C<ResizeBuffer> method.
+
+=item *
+
+All named pipes are byte streams. There is currently no way to alter a
+pipe to be message based.
+
+=item *
+
+Other things that I cannot think of right now... :)
+
+=back
+
+=head1 CONSTRUCTOR
+
+=over
+
+=item new ( NAME )
+
+Creates a named pipe if used in server context or a connection to the
+specified named pipe if used in client context. Client context is
+determined by prepending $Name with "\\\\".
+
+Returns I<true> on success, I<false> on failure.
+
+=back
+
+=head1 METHODS
+
+=over
+
+=item BufferSize ()
+
+Returns the size of the instance of the buffer of the named pipe.
+
+=item Connect ()
+
+Tells the named pipe to create an instance of the named pipe and wait
+until a client connects. Returns I<true> on success, I<false> on
+failure.
+
+=item Close ()
+
+Closes the named pipe.
+
+=item Disconnect ()
+
+Disconnects (and destroys) the instance of the named pipe from the
+client. Returns I<true> on success, I<false> on failure.
+
+=item Error ()
+
+Returns the last error messages pertaining to the named pipe. If used
+in context to the package. Returns a list containing C<ERROR_NUMBER>
+and C<ERROR_TEXT>.
+
+=item Read ()
+
+Reads from the named pipe. Returns data read from the pipe on success,
+undef on failure.
+
+=item ResizeBuffer ( SIZE )
+
+Sets the size of the buffer of the instance of the named pipe to
+C<SIZE>. Returns the size of the buffer on success, I<false> on
+failure.
+
+=item Write ( DATA )
+
+Writes C<DATA> to the named pipe. Returns I<true> on success, I<false>
+on failure.
+
+=back
+
+=head1 LIMITATIONS
+
+What known problems does this thing have?
+
+=over
+
+=item *
+
+If someone is waiting on a C<Read> and the other end terminates then
+you will wait for one B<REALLY> long time! (If anyone has an idea on
+how I can detect the termination of the other end let me know!)
+
+=item *
+
+All pipes are blocking. I am considering using threads and callbacks
+into Perl to perform async IO but this may be too much for my time
+stress. ;)
+
+=item *
+
+There is no security placed on these pipes.
+
+=item *
+
+This module has neither been optimized for speed nor optimized for
+memory consumption. This may run into memory bloat.
+
+=back
+
+=head1 INSTALLATION NOTES
+
+If you wish to use this module with a build of Perl other than
+ActivePerl, you may wish to fetch the source distribution for this
+module. The source is included as part of the C<libwin32> bundle,
+which you can find in any CPAN mirror here:
+
+  modules/by-authors/Gurusamy_Sarathy/libwin32-0.151.tar.gz
+
+The source distribution also contains a pair of sample client/server
+test scripts. For the latest information on this module, consult the
+following web site:
+
+  http://www.roth.net/perl
+
+=head1 AUTHOR
+
+Dave Roth <rothd@roth.net>
+
+=head1 DISCLAIMER
+
+I do not guarantee B<ANYTHING> with this package. If you use it you
+are doing so B<AT YOUR OWN RISK>! I may or may not support this
+depending on my time schedule.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1996 Dave Roth. All rights reserved.
+This program is free software; you can redistribute
+it and/or modify it under the same terms as Perl itself.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/doc/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
Binary file releasing/makecbr/doc/SGL.PR0080.150_Rev1.4_Automatic_Component_Based_Releasing_Design_Spec.doc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/files/release.src	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+NOTESRC_RELEASER
+Productisation (kits.notify@symbian.com)
+
+NOTESRC_RELEASE_REASON
+New release based on build %build identifier%
+
+NOTESRC_GENERAL_COMMENTS
+Built automatically from an release build, not via an OCK or CustKit.
+See Appendix_to_Release_Notes.rtf for details on prohibited export or use.
+
+NOTESRC_KNOWN_DEVIATIONS
+See General Comments above.
+
+NOTESRC_BUGS_FIXED
+See General Comments above.
+
+NOTESRC_BUGS_REMAINING
+See General Comments above.
+
+NOTESRC_OTHER_CHANGES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,50 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+//
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../CBROutputFile.xml							/tools/makecbr/CBROutputFile.xml
+../CConfig.pm											/tools/makecbr/CConfig.pm
+../COutputHandler.pm							/tools/makecbr/COutputHandler.pm
+../CProcessStage.pm								/tools/makecbr/CProcessStage.pm
+../CStageRunner.pm								/tools/makecbr/CStageRunner.pm
+../MakeCBR.pl											/tools/makecbr/MakeCBR.pl
+../Win32/Pipe.pm									/tools/makecbr/Win32/Pipe.pm
+../test/CExampleStage.pm					/tools/makecbr/test/CExampleStage.pm
+../test/CTestScore.pm							/tools/makecbr/test/CTestScore.pm
+../test/runtests.pl								/tools/makecbr/test/runtests.pl
+../test/unit_CConfig.pm						/tools/makecbr/test/unit_CConfig.pm
+../test/unit_CProcessStage.pm			/tools/makecbr/test/unit_CProcessStage.pm
+../test/unit_CStageRunner.pm			/tools/makecbr/test/unit_CStageRunner.pm
+../test/unit_stage_CDelta.pm			/tools/makecbr/test/unit_stage_CDelta.pm
+../stages/CCheckEnv.pm						/tools/makecbr/stages/CCheckEnv.pm
+../stages/CCheckMrpUpdates.pm			/tools/makecbr/stages/CCheckMrpUpdates.pm
+../stages/CCleanUp.pm							/tools/makecbr/stages/CCleanUp.pm
+../stages/CConfigureRepair.pm			/tools/makecbr/stages/CConfigureRepair.pm
+../stages/CCreateDrive.pm					/tools/makecbr/stages/CCreateDrive.pm
+../stages/CDelta.pm								/tools/makecbr/stages/CDelta.pm
+../stages/CGetPrevRel.pm					/tools/makecbr/stages/CGetPrevRel.pm
+../stages/CInstallGTConflicts.pm	/tools/makecbr/stages/CInstallGTConflicts.pm
+../stages/CPrepGTRelease.pm				/tools/makecbr/stages/CPrepGTRelease.pm
+../stages/CReleaseEnv.pm					/tools/makecbr/stages/CReleaseEnv.pm
+../stages/CRemoveNonGT.pm					/tools/makecbr/stages/CRemoveNonGT.pm
+../stages/CStoreMrpState.pm				/tools/makecbr/stages/CStoreMrpState.pm
+../stages/CBRRepair/cbrfix.pm			/tools/makecbr/stages/CBRRepair/cbrfix.pm
+../stages/CBRRepair/CBRPatch.pm		/tools/makecbr/stages/CBRRepair/CBRPatch.pm
+../stages/CBRRepair/cbrproblem.pm	/tools/makecbr/CBRRepair/cbrproblem.pm
+../Parallel/ForkManager.pm				/tools/makecbr/Parallel/ForkManager.pm
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/group/makecbr.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_releasing_makecbr
+
+source \src\tools\build\releasing\makecbr
+
+ipr T
+
+exports \src\tools\build\releasing\makecbr\group
+
+notes_source \src\tools\build\releasing\makecbr\files\release.src
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CBRRepair/CBRPatch.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,547 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CBRPatch
+# Contains code to patch a CBR to hopefully allow a CBR to be published
+# but this version appended with '_PATCHED' (or whatever you choose) for the
+# bad components.
+# 
+#
+
+package CBRPatch;
+use strict;
+use File::Basename;
+use File::Path;
+
+use CBRFix;
+use CBRProblem;
+
+#
+# new
+#
+# Create a new CBRPatch object.
+#
+sub new
+    {
+    my($arg, $options, $inidat, $envdb, $version, $iversion, $patcharea,
+       $unrescomp, $patchver_suffix, $attempts ) = @_;
+    my $class = ref($arg) ? ref($arg) : $arg;
+
+    my $self = {  
+                     options => $options,
+                      inidat => $inidat,
+                       envdb => $envdb,
+                     version => $version,
+                    iversion => $iversion,
+                   patcharea => $patcharea,
+                   unrescomp => $unrescomp,
+             patchver_suffix => $patchver_suffix,
+                    attempts => $attempts,
+
+                 cbrproblems => undef,
+                ncbrproblems => undef,
+                    cbrfixes => undef,
+               envinfooutput => undef,
+                 baseversion => undef,
+              };
+
+    bless $self, $class;
+
+    return $self;
+    }
+
+sub IniData
+    {
+    my $self = shift;
+    my $newinidat = shift;
+    $self->{inidat} = $newinidat if( defined($newinidat) );
+    return $self->{inidat} if( defined($self->{inidat}) );
+    $self->{inidat} = IniData->New();
+    return $self->{inidat};
+    }
+sub EnvDb
+    {
+    my $self = shift;
+    my $newenvdb = shift;
+    $self->{envdb} = $newenvdb if( defined($newenvdb) );
+    return $self->{envdb} if( defined($self->{envdb}) );
+    $self->{envdb} = EnvDb->Open($self->IniData);
+    return $self->{envdb};
+    }
+sub Version
+    {
+    my $self = shift;
+    my $newversion = shift;
+    $self->{version} = $newversion if( defined($newversion) );
+    return $self->{version} if( defined($self->{version}) );
+    $self->{baseversion} = $self->EnvDb->Version("gt_techview_baseline")
+        unless(defined($self->{baseversion}));
+    $self->{version} = $self->{baseversion} .  $self->PatchVerSuffix;
+    return $self->{version};
+    }
+sub Iversion
+    {
+    my $self = shift;
+    my $newiversion = shift;
+    $self->{iversion} = $newiversion if( defined($newiversion) );
+    return $self->{iversion} if( defined($self->{iversion}) );
+    $self->{iversion} = $self->EnvDb->InternalVersion("gt_techview_baseline") .
+                            $self->PatchVerSuffix;
+    return $self->{iversion};
+    }
+sub PatchArea
+    {
+    my $self = shift;
+    my $newpatcharea = shift;
+    $self->{patcharea} = lc($newpatcharea) if( defined($newpatcharea) );
+    $self->{patcharea} = "\\component_defs\\patches"
+                                 unless( defined($self->{patcharea}) );
+    File::Path::mkpath($self->{patcharea}) unless( -d $self->{patcharea} );
+    my $dpol = $self->{patcharea} . "/distribution.policy";
+    unless( -f $dpol )
+        {
+        open DP, "> $dpol";
+        print DP "Category E\nOSD:	Test/Reference	Tools\n";
+        close DP;
+        }
+    return $self->{patcharea};
+    }
+sub UnresComp
+    {
+    my $self = shift;
+    my $newunrescomp = shift;
+    $self->{unrescomp} = $newunrescomp if( defined($newunrescomp) );
+    return $self->{unrescomp} if( defined($self->{unrescomp}) );
+    $self->{unrescomp} = "unresolved";
+    return $self->{unrescomp};
+    }
+sub PatchVerSuffix
+    {
+    my $self = shift;
+    my $newpvs = shift;
+    $self->{patchver_suffix} = $newpvs if( defined($newpvs) );
+    return $self->{patchver_suffix} if( defined($self->{patchver_suffix}) );
+    $self->{patchver_suffix} = "_PATCHED";
+    return $self->{patchver_suffix};
+    }
+sub Attempts
+    {
+    my $self = shift;
+    my $newattempts = shift;
+    $self->{attempts} = $newattempts if( defined($newattempts) );
+    return $self->{attempts} if( defined($self->{attempts}) );
+    $self->{attempts} = 3;
+    return $self->{attempts};
+    }
+
+#
+# Runs envinfo if there is an argument or if it hasn't been run inside
+# this object before.
+# Always uses the '-ffv' options. This is fixed because other code depends
+# on the format of the output. Returns a reference to an array containing
+# the output.
+#
+sub EnvinfoOutput
+    {
+    my $self = shift;
+    my $arg = shift;
+    return $self->{envinfooutput}
+          if( !defined($arg) && defined($self->{envinfooutput}) );
+
+    $self->Print("INFO: Running 'envinfo -ffv'....\n");
+    my @arr;
+    unless(open ENVINFO, "envinfo -ffv 2>&1 |")
+        {
+        # Don't to a $self->Error here, CCheckEnv knows what to do with this..
+        push @arr, "ERROR: Failed to run envinfo.\n";
+        return \@arr;
+        }
+    @arr = <ENVINFO>;
+    $self->{envinfooutput} = \@arr;
+
+    undef($self->{cbrproblems}); # We've rerun envinfo, so any old results
+    undef($self->{cbrfixes});    # here are garbage.
+    return $self->{envinfooutput};
+    }
+sub ProvideEnvinfoOutput
+    {
+    my $self = shift;
+    my $arg = shift;                # MUST be a reference to an array!
+    $self->{envinfooutput} = $arg;
+    undef($self->{cbrproblems}); # New envinfo data, so any old results
+    undef($self->{cbrfixes});    # here are garbage.
+    return $self->{envinfooutput};
+    }
+    
+#
+# CBRProblems
+#
+# Re-determines problems if there is an argument. Does
+# NOT trigger re-run of envinfo. If its been run before this would
+# just use the old data.
+#
+sub CBRProblems
+    {
+    my $self = shift;
+    my $arg = shift;
+    my @missinglist;
+    return $self->{cbrproblems}
+          if( !defined($arg) && defined($self->{cbrproblems}) );
+
+    # Rats. We have to work out what the problems are.
+    undef($self->{cbrproblems});
+    undef($self->{cbrfixes});
+    $self->{ncbrproblems} = 0;
+    for my $ev (@{$self->EnvinfoOutput})
+        {
+        #
+        # Check for files that have no known origin. We'll call
+        # these 'orphans'.
+        #
+        if( $ev =~ m/^(\S+): (.+) has unknown origin/)
+            {
+            my $path = $2;
+            my $prob = CBRProblem->new($path, "orphan");
+            push @{$self->{cbrproblems}}, $prob;
+            $self->{ncbrproblems}++;
+            $self->Error("CBRPatch: Orphan file '$path' detected.\n");
+            next;
+            }
+
+        #
+        # Now check for files that are multiply owned.
+        #
+        if( $ev =~ m/^(\S+):\s+(\S+) attempting to release (\S+) which has already been released by (\S+)/)
+            {
+            my $comp1 = $2;
+            my $path = $3;
+            my $comp2 = $4;
+            my %hsh = ( $comp1 => 1,   # Hash of components with problem.
+                        $comp2 => 1, );
+
+            my $prob = CBRProblem->new($path, "multi", \%hsh );
+            push @{$self->{cbrproblems}}, $prob;
+            $self->{ncbrproblems}++;
+            $self->{options}->Component($comp1);
+            $self->Error("CBRPatch: Multi-owned file '$path' detected, owned by $comp1 and $comp2.\n");
+            next;
+            }
+
+        #
+        # Now look for files that are absent, i.e referenced by
+        # component(s) but don't exist.
+        #
+        if( $ev =~ m/^(\S+)\s+(\S+)\s+(\S+)\s+missing$/ )  #
+            {
+            my $comp = $1;
+            my $path = $3;
+            my %hsh = ( $comp => 1 );
+            my $prob = CBRProblem->new($path, "absent", \%hsh );
+            push @{$self->{cbrproblems}}, $prob;
+            $self->{ncbrproblems}++;
+            $self->{options}->Component($comp);
+            $self->Error("CBRPatch: Absent file '$path' detected, owned by $comp. (missing)\n");
+            next;
+            }
+        if( $ev =~ m/^(\S+): Error: \"?(.*?)\"? does not exist/ )
+            {
+            my $comp = $1;
+            my $path = $2;
+            my %hsh = ( $comp => 1 );
+            my $prob = CBRProblem->new($path, "absent", \%hsh );
+            push @{$self->{cbrproblems}}, $prob;
+            $self->{ncbrproblems}++;
+            $self->{options}->Component($comp);
+            $self->Error("CBRPatch: Absent file '$path' detected, owned by $comp.(does not exist)\n");
+            next;
+            }
+        if( $ev =~ m/^Error: \"?(.*?)\"? does not exist/ )
+            {
+            # One of these ghastly cases where we get a bunch of 'does not
+            # exist' errors followed by a 'Multiple errors' warning. We must
+            # stack up the missing paths until we hit a 'multiple errors'.
+            my $path = $1;
+            push @missinglist, $path;
+            next;
+            }
+        if( $ev =~ m/^(\S+): Multiple errors \(first - Error: .*? does not exist\)/ )
+            {
+            # We've got the multiple errors line. Now create all of the problem
+            # objects for this component.
+            my $comp = $1;
+            for my $path (@missinglist)
+                {
+                my %hsh = ( $comp => 1 );
+                my $prob = CBRProblem->new($path, "absent", \%hsh );
+                push @{$self->{cbrproblems}}, $prob;
+                $self->{ncbrproblems}++;
+                }
+            $self->{options}->Component($comp);    
+            $self->Error("CBRPatch: Multiple files (" . scalar(@missinglist) . ") owned by $comp do not exist.\n");
+            @missinglist = ();
+            next;
+            }
+
+        #
+        # Last, check for failures where a component is dirty for some other
+        # reason. This will just trigger a preprel on this component, nothing
+        # more.
+        #
+        if( $ev =~ m/^(\S+)\s+(\S+)\s+(.+)\s+failed\scheck$/ )
+            {
+            my $comp1 = $1;
+            my $ver = $2;
+            my $path = $3;
+            my %hsh = ( $comp1 => 1 );  # Hash of components with problem.
+            $self->{options}->Component($comp1);
+            $self->{options}->Print($ev);
+            my $prob = CBRProblem->new($path, "dirty", \%hsh );
+            push @{$self->{cbrproblems}}, $prob;
+            $self->{ncbrproblems}++;
+            next;
+            }
+
+        }
+
+    return $self->{cbrproblems}
+    }
+
+#
+# CBRFixes
+#
+# Works out what fixes are required (and places them in the internal
+# array 'cbrfixes') to fix the problems in the internal array 'cbrproblems'.
+# This uses the accessor 'CBRProblems', so this can indirectly trigger
+# a run of the CBRProblems code, which itself can trigger a run of
+# envinfo.
+#
+# Currently self->{cbrfixes} is a reference to an array. It occurs to
+# me that if I made this a reference to a hash with keys being component
+# names, and content being arrays of cbrfix's some processing could be simpler.
+#
+sub CBRFixes
+    {
+    my $self = shift;
+    my $arg = shift;
+
+    # If no argument is passed and the fixes have already been worked
+    # out, just return them.
+    return($self->{cbrfixes}) if( defined($self->{cbrfixes}) &&
+                                  !defined($arg) );
+
+    my $probref = $self->CBRProblems; # Get the list of problems.
+    if( $self->{ncbrproblems} == 0 )
+        {
+        $self->Print("INFO: There are no detected problems in the CBR.\n");
+        undef($self->{cbrfixes});
+        return $self->{cbrfixes};
+        }
+    #
+    # There are some problems. 
+    # For each problem, generate the fixes and stick them in our
+    # array of fixes.
+    #
+    for my $cbrprob (@$probref)
+        {
+        my @thesefixes = @{$cbrprob->GetFixes($self->IniData,
+                                              $self->EnvDb,
+                                              $self->PatchArea,
+                                              $self->UnresComp)};
+        push @{$self->{cbrfixes}}, @thesefixes;
+        }
+    # If there are any fixes then we will also need to preprel the baseline.
+    # The baseline name should probably not be hardwired, but this was a late
+    # change.
+    if($self->{cbrfixes})
+        {
+        my $baselinefix = CBRFix->new( "gt_techview_baseline", undef,
+                                        undef, undef );
+        push @{$self->{cbrfixes}}, $baselinefix;
+        }
+
+    
+    return $self->{cbrfixes};
+    }
+
+#
+# ImplementFixes
+#
+# Get whatever fixes are required and implement them, including the preprel.
+# Only do one iteration though. Re-run the envinfo/problem/fix generation
+# cycle when complete, 'cos we're going to need to know if there is more
+# trouble.
+#
+sub ImplementFixes
+    {
+    my $self = shift;
+
+    my %comps;
+    # Define the fixes that need doing.
+    my $fixes = $self->CBRFixes;
+    my $nfixes = scalar(@$fixes);
+    # Return immediately if there is nothing to fix.
+    return 0 unless($nfixes);
+
+    # Make sure that no old copies of mrp files are lying around in the
+    # patcharea. Basically this deletes ANYTHING that isn't an mrp file
+    # owned by a component in the current environment. Too brutal?
+    $self->CleanPatchArea;
+    
+    $self->Print("REMARK: There are " . scalar(@$fixes) . " fixes.\n");
+    for my $fix (@$fixes)
+        {
+        $self->Print("REMARK: Patching component '" . $fix->Component . "'\n")
+            unless( defined($comps{$fix->Component}) );
+        $fix->WriteFix;
+
+        # Only preprel the component if it hasn't been preprel'd to the
+        # location this fix wants. NewMrpFile won't be defined if this is
+        # a 'preprel' only fix (which comes up if a component is dirty
+        # but doesn't have multiply owned or missing files).
+        my $mrp = $fix->NewMrpFile;
+        $mrp = $fix->MrpFile unless(defined($mrp));
+        if( !defined($comps{$fix->Component}) or
+                                ($mrp ne $comps{$fix->Component}) )
+            {
+            $comps{$fix->Component} = $mrp; # Record the current location.
+            my $prepline = "preprel ";
+            # The mrp file may be unchanged. Only use -m if necessary.
+            $prepline .= "-m " . $fix->NewMrpFile
+                if( defined($fix->NewMrpFile) );
+            my $vver = $self->Version;
+	    $vver = $self->{baseversion}
+                if(lc($fix->Component) eq "gt_techview_baseline" );
+            $prepline .= " " .
+                    $fix->Component . " " .
+                    $vver  . " " .
+                    $self->Iversion;
+            $self->Print("REMARK: Running '$prepline'\n");
+            system($prepline);
+            }
+        }
+    # There could well be further problems. For example, some components
+    # generate temporary files when e.g abld export -what is run, so
+    # another patch cycle may be required. The following lines re-run
+    # envinfo and regenerate the problem and fixes arrays.
+    $self->EnvinfoOutput(1);
+    $self->CBRFixes; # Above trashes problem and fix arrays, this regens them
+
+    # How many fixes did we write?
+    return $nfixes;
+    }
+
+#
+# Run 'ImplementFixes' a maximum of attempts times. Returns the number of
+# problems that remain.
+#
+sub FixCBR
+    {
+    my $self=shift;
+
+    for(1..$self->Attempts)
+        {
+        $self->Print("REMARK: Running CBR Patch code. Iteration number $_.\n");
+        my $nfixes = $self->ImplementFixes;
+        if( $nfixes == 0 )
+            {
+            $self->Print("REMARK: No CBR Patches were required.\n");
+            last;
+            }
+
+        # Get the problems. We didn't have to do this here, the
+        # ImplementFixes on the next iteration would trigger it anyway
+        # if there are more problems, but nice to exit here if we're fixed.
+        my $probref = $self->CBRProblems;
+        
+        $self->{options}->Component('CBRPatch: Miscellaneous');
+        
+        unless($self->{ncbrproblems})
+            {
+            $self->Print("REMARK: No further problems with CBR detected. Patch complete.\n");
+            last;
+            }
+
+        }
+    if( $self->{ncbrproblems} != 0 )
+        {
+        $self->Print("REMARK: " . $self->{ncbrproblems} .  " CBR problems remain!\n");
+        }
+    return( $self->{ncbrproblems} );
+    }
+
+#
+# CleanPatchArea
+#
+# Delete all mrp files in the patch area that are not in the current
+# environment.
+#
+sub CleanPatchArea
+    {
+    my $self = shift;
+    my $versinfo = $self->EnvDb->VersionInfo;
+    my %mrps;
+    # Build a list of mrp files in the current environment.
+    for(keys %$versinfo)
+        {
+        my $comp = $_;
+        my $mrp = lc($self->EnvDb->MrpName($comp));
+        $mrp = "\\" . $mrp unless( $mrp =~ m/^\\/ );
+        $mrps{$mrp} = 1;
+        }
+
+    for my $file (glob($self->PatchArea . "\\*.mrp") )
+        {
+        $file = lc($file);
+        $file =~ s!\/!\\!g;
+        $file = "\\" . $file unless( $file =~ m/^\\/ );
+        unless( defined($mrps{$file} ) )
+            {
+            $self->Print("REMARK: Deleting file '$file' from patcharea.\n");
+            unlink $file;
+            }
+        }
+    }
+sub Print # Should we concatenate multiple args? With a list only first prints
+    {
+    my $self = shift;
+    return unless ref($self);
+
+    if( ref($self->{options} ) )
+        {
+        $self->{options}->Print(@_) 
+        }
+        else
+        {
+        print @_, "\n";
+        }
+    return;
+    }
+sub Error # Should we concatenate multiple args? With a list only first prints
+    {
+    my $self = shift;
+    return unless ref($self);
+    if( ref( $self->{options} ) )
+        {
+        $self->{options}->Error(@_);
+        }
+    else
+        {
+        print @_, "\n";
+        }
+    return;
+    }
+
+1;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CBRRepair/cbrfix.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,287 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# cbrfix
+# Support for the CBRPatch code, here we record potential fixes for a
+# damaged CBR environment.
+# 
+#
+
+package CBRFix;
+
+use strict;
+
+#
+# new
+# 
+# Create a new CBRFix object.
+#
+sub new
+    {
+    my($arg, $component, $mrpfixtext, 
+       $mrpfile, $newmrpfile, $notesrcline) = @_;
+    my $class = ref($arg) ? ref($arg) : $arg;
+
+    my $self = { component => undef,
+                mrpfixtext => [],
+                   mrpfile => undef,
+              notessrcline => undef,
+                newmrpfile => undef };
+    bless $self, $class;
+
+    $self->Component($component)   if( $component );
+    $self->MrpFixText($mrpfixtext) if( $mrpfixtext );
+#    $self->CbrProb($cbrprobref)    if( $cbrprobref );
+    $self->MrpFile($mrpfile)       if( $mrpfile );
+    $self->NewMrpFile($newmrpfile) if( $newmrpfile );
+    $self->NotesSrcLine($notesrcline) if( $notesrcline );
+
+    return $self;
+    }
+
+#
+# Component
+#
+# Setter/getter for component member of this CBRFix object. Component is
+# just scalar text. If no component is passed to this, keep the old. In any
+# case return the current value of component.
+# If the component is provided, the mrpfile will become undefined. We
+# *could* trigger finding that out, but that could be really inefficient..
+#
+sub Component
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $newcomp = lc(shift);
+    return $self->{component} unless $newcomp;
+    $self->{component} = $newcomp;
+    undef($self->{mrpfile});
+    return $self->{component};
+    }
+
+#
+# MrpFile
+#
+# Setter/getter for the mrpfile for the CBRFix object. Takes what it is
+# given on trust if it's there. If nothing is given, return the mrpfile
+# name, which we may have to work out.
+#
+sub MrpFile
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $mrpfile = lc(shift);
+
+    # We're provided with the mrpfile. Set it.
+    $self->{mrpfile} = $mrpfile if($mrpfile);
+
+    # Make sure it has backslashes, not forward slashes.
+    $self->{mrpfile} =~ s^\/^\\^g;
+    
+    # We're already know the mrpfile. Return it.
+    return $self->{mrpfile} if( defined($self->{mrpfile}) );
+
+    # We're provided with nothing and don't yet know our mrpfile. Find it
+    # out, store it and return it.
+    my $comp = $self->{component};
+    my $inidata = IniData->New();
+    my $envdb = EnvDb->Open($inidata);
+    my $mrpname = $envdb->MrpName($comp);
+    $self->{mrpfile} = $mrpname if( $mrpname );
+    $self->{mrpfile} =~ s^\/^\\^g;
+    return $self->{mrpfile};
+    }
+
+#
+# Setter/getter for the 'newmrpfile' member, this is used when a component
+# to be fixed must have a 'new' mrp location (usually /component_defs..)
+#
+sub NewMrpFile
+    {
+    my $self = shift;
+
+    return unless( ref($self) );
+    my $newmrpfile = shift;
+    return $self->{newmrpfile} unless defined($newmrpfile);
+    $newmrpfile =~ s^\/^\\^g;
+    $self->{newmrpfile} = lc($newmrpfile);
+    return $self->{newmrpfile};
+    }
+
+#
+# MrpFixText
+#
+# Setter/getter for mrpfixtext member of this CBRFix object. Mrpfixtext is
+# a reference to an array containing blocks (probably lines) of scalar text.
+# If no value is passed to this do nothing. In any case return the current
+# value of mrpfixtext, a reference to an array holding all of the lines.
+#
+sub MrpFixText
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $newtext = shift;
+    push @{$self->{mrpfixtext}}, $newtext if( defined($newtext));
+    return $self->{mrpfixtext};
+    }
+
+# Setter/getter for notes_source line. This is only ever used if the component
+# did not previously exist in the environment before the fix is written.
+# Should only happen for the 'unresolved' component.
+sub NotesSrcLine
+    {
+    my $self = shift;
+    my $newnsl = shift;
+    $self->{notessrcline} = $newnsl if( defined($newnsl) );
+    return $self->{notessrcline} if( defined($self->{notessrcline}) );
+    $self->{notessrcline} = "notes_source \\component_defs\\release.src\n";
+    return $self->{notessrcline};
+    }
+#
+# CbrProb
+#
+# Records a reference to the CBRProblem object that triggered this fix.
+# Possibly not needed.
+#
+#sub CbrProb
+#    {
+#    my $self = shift;
+#    return unless( ref($self) );
+#    my $newprob = shift;
+#    return $self->{cbrprob} unless $newprob;
+#    $self->{cbrprob} = $newprob;
+#    return $self->{cbrprob};
+#    }
+
+#
+# WriteFix
+#
+# Copy over the original mrp file for the component that this problem
+# occurs in to the patcharea, unless that has already been done.
+# If the copy doesn't happen, create a new mrp file and add a component and
+# notes_src line.
+# Add the fix text to the new mrp file. In the case of '-source' which isn't
+# supported, try to find the line with the source to be removed and comment
+# it out.
+#
+sub WriteFix
+    {
+    my $self = shift;
+    return unless( ref($self) );
+
+    # Get component name.
+    my $comp = $self->Component;
+
+    # Mrpfile name. If new name is not defined, we just have a dirty component
+    # that will be preprel'd only.
+    my $oldmrp = $self->MrpFile;
+    my $newmrp = $self->NewMrpFile;
+    return unless( defined($newmrp) );
+
+    # Do we have the nasty source missing case?
+    my $source_missing=undef;
+    if( defined($self->MrpFixText) )
+        {
+        my $firstfix = ${$self->MrpFixText}[0];
+        if( $firstfix =~ m/-source\s+(.*)$/i )
+            {
+            shift @{$self->MrpFixText};
+            $source_missing=$1;
+            }
+        }
+
+    # Copy the old mrp over to the new location unless the new one already
+    # exists, in which case this component actually lives here (e.g for
+    # the binbag) or another fix object has already copied it.
+    if ( (-f $oldmrp) && ($oldmrp ne $newmrp ) && (! (-f $newmrp)) )
+        {
+        File::Copy::copy( $oldmrp, $newmrp ) or print "CBRFIX COPY FAILED! Dollar bang is ", $!, "\n";
+        my $mode = 0644; chmod $mode, $newmrp;
+        open NEWMRP, ">> $newmrp" or print "Cannot append to $newmrp, dollar bang is '$!'\n";
+        print NEWMRP "\n# Automatic CBR patches follow.\n" or print "Couldn't write to NEWMRP!\n";
+        close NEWMRP;
+        }
+
+    # If this fix is to remove a superfluous source line, then read in the
+    # file as it is and rewrite it. Perhaps one day '-source' might be
+    # implemented.
+    if($source_missing)
+        {
+        open MRP, $newmrp;
+        my @oldmrparr = <MRP>;
+        close MRP;
+        open MRP, "> $newmrp";
+        my @removedsource;
+        for my $line (@oldmrparr)
+            {
+            if( $line =~ m/^\s*source\s+\Q$source_missing\E\s*$/i )
+                {
+                push @removedsource, "# AutoFIX CBR code removed the following line, the source seems to be missing.\n";
+                push @removedsource, "# $line\n";
+                next;
+                }
+            print MRP $line;
+            }
+        for my $line (@removedsource) { print MRP $line; }
+        close MRP;
+        }
+       
+    # The new mrp file should now exist. If it doesn't then add a
+    # component and notes_src line to it. Should only happen for
+    # the 'binbag' unresolved component.
+    unless( -f $newmrp )
+        {
+        open NEWMRP, "> $newmrp";
+        print NEWMRP "# Automatic CBR patching code generated this file..\n";
+        print NEWMRP "component    $comp\n";
+        print NEWMRP $self->NotesSrcLine;
+        close NEWMRP;
+        }
+
+    #
+    # Dirty the old MRP file so that next time a (hopefully good) build
+    # happens the difference is spotted and the component is re-issued.
+    #
+    if( -f $oldmrp and ($oldmrp ne $newmrp) )
+        {
+        my $oldmrpmessage = "# AutoCBR repair code: This component has problems and has been patched.\n";
+        open OLDMRP, $oldmrp;
+        my @oldmrp = <OLDMRP>; close OLDMRP;
+        unless( grep( /$oldmrpmessage/, @oldmrp ) )
+            {
+            open OLDMRP, ">> $oldmrp";
+            print OLDMRP $oldmrpmessage;
+            close OLDMRP;
+            }
+        }
+    
+    # Now add the extra 'fix' lines onto the new mrp file.
+    if(ref($self->MrpFixText))
+        {
+        open NEWMRP, ">> $newmrp" or print "Couldn't open $newmrp\n";;
+        for my $fixline (@ { $self->MrpFixText } )
+            {
+            print NEWMRP $fixline;
+            }
+        close NEWMRP;
+        }
+    else
+        {
+#            print "MrpFixText not a reference!!\n";
+        }
+    return;
+    }
+1;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CBRRepair/cbrproblem.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,289 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# cbrproblem
+# Support for the CBRPatch code, here we record problems within
+# damaged CBR environment
+# 
+#
+
+use strict;
+package CBRProblem;
+
+use File::Basename;
+use CBRFix;
+
+#
+# new
+# 
+# Create a new CBRProblem object.
+#
+sub new
+    {
+    my($arg, $path, $type, $components) = @_;
+    my $class = ref($arg) ? ref($arg) : $arg;
+
+    my $self = {};
+    bless $self, $class;
+
+    $components = {} if !ref($components);
+
+    $self->Path($path)     if( $path );
+    $self->Type($type)     if( $type );
+    $self->Components($components) if( $components );
+
+    return $self;
+    }
+
+#
+# Path
+#
+# Setter/getter for path member of this CBRProblem object. Path is
+# just scalar text. If no path is passed to this, keep the old. In any
+# case return the current value of path.
+#
+sub Path
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $newpath = shift;
+    return $self->{path} unless $newpath;
+    $newpath = "\\" . $newpath unless( $newpath =~ m/^\\/ );
+    $newpath = lc($newpath);
+    $self->{path} = $newpath;
+    return $self->{path};
+    }
+#
+# Type  (orphan/multi/absent/dirty)
+#
+# Setter/getter for type member of this CBRProblem object. Type is
+# just scalar text. If no value is passed to this, keep the old. In any
+# case return the current value of type.
+#
+sub Type
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $newtype = shift;
+    return $self->{type} unless $newtype;
+
+    $self->{type} = "orphan"  if( $newtype =~ m/orphan/i );
+    $self->{type} = "multi"   if( $newtype =~ m/multi/i );
+    $self->{type} = "absent"  if( $newtype =~ m/absent/i );
+    $self->{type} = "dirty"   if( $newtype =~ m/dirty/i );
+
+    return $self->{type};
+    }
+#
+# Components
+#
+# Setter/getter for components member of this CBRProblem object. Owner arg
+# is a reference to a hash. If no value is passed to this, keep the old. In
+# any case return the current value of components (which is a REFERENCE).
+# The hash contains a list of components that this problem affects.
+# Naturally the hash should contain one component owner, but we are talking
+# about problems here..
+#
+sub Components  # Takes a reference to a hash if setting..
+    {
+    my $self = shift;
+    return unless( ref($self) );
+    my $ownref = shift;
+
+    if( ref($ownref) )  # Reference to a hash, keys of which are components
+        {               # claiming to own this file..
+        for(keys %$ownref)
+            {
+            my $component = $_;
+            $self->{components}->{$component} = 1;
+            }
+        }
+    return $self->{components};
+    }
+
+#
+# Return the fix(es) that are required to address this problem.
+# We are passed inidata, the envdb, patcharea and 'binbag'
+# component name.
+#
+sub GetFixes
+    {
+    my $self = shift;
+    my($inidata, $envdb, $patcharea, $binbagcomp) = @_;
+    return undef unless( ref($self) ); # Must be an object, not a class.
+
+    #
+    # First check if we have an easy fix - that is, a component is dirty
+    # and therefore must be preprel'd, but nothing else like mrp file editing
+    # needs doing.
+    #
+    if( $self->Type eq "dirty" )
+        {
+        my $ezfix = CBRFix->new( (keys %{$self->Components})[0], # Component
+                                  undef,                # Text for mrp file.
+                                  undef,                # Original Mrp file.
+                                  undef );              # New mrp file.
+        my @fixarray;
+        push @fixarray, $ezfix;
+        return \@fixarray;
+        }
+
+    # Make sure everything we need has been passed across.
+    return undef unless( defined($inidata) and defined($envdb) and
+                         defined($patcharea) and defined($binbagcomp));
+
+    # Work out the 'binbag' mrpfile name.
+    my $binbagmrp = "$patcharea\\$binbagcomp.mrp";
+
+    # The binbag constitutes one CBRFix, we may need other fixes to be
+    # done to the existing components.
+    my $binbag = CBRFix->new($binbagcomp,  # The component this fix is for.
+                             undef,        # The text to add to the mrpfile.
+                             $binbagmrp,   # Original Mrp file.
+                             $binbagmrp);  # Mrpfile to add the fix to.
+
+    my @fixes; # An array of fixes. We'll return this at the end.
+
+    if(defined($self->Components())) # No components for orphans.
+        {
+        for my $comp (keys %{$self->Components}) # For each concerned component
+            {
+            my $mrpfile = $envdb->MrpName($comp);
+            unless( $mrpfile =~ m/^\\/ )
+            {
+                $mrpfile = "\\" . $mrpfile;   # EPOCROOT?
+            }
+            my $fxmrpdat=undef;
+            my $newmrp = "$patcharea\\" . File::Basename::basename($mrpfile);
+            my $errormsg = undef;
+            unless( defined($fxmrpdat) )
+                {
+                undef $@;
+                eval
+                    {
+                    $fxmrpdat = $envdb->GetMrpData($comp);
+                    };
+                $errormsg = $@;
+                };
+
+            # The above object creation fails utterly if we have a missing
+            # source file. In that case we specify '-source'. Unfortunately
+            # this situation also hides other faults with the component,
+            # so another iteration might be required to fix everything.
+            if( !defined($fxmrpdat) && ($errormsg =~ m/Error: .*?does not exist/) )
+                {
+                my $fix = CBRFix->new( $comp,            # Component
+                                  undef,                 # Text for mrp file.
+                                  $mrpfile,              # Original Mrp file.
+                                  $newmrp);              # New mrp file.
+                # Yes I know '-source' doesn't exist, but it might one
+                # day, and for the moment we can intercept this before it
+                # actually gets written.
+                $fix->MrpFixText("-source " . $self->Path);
+                my @fixarray;
+                push @fixarray, $fix;
+                return \@fixarray;
+                }
+            # Create the fix for this component.
+            my $compfix = CBRFix->new( $comp,     # Component
+                                       undef,     # Text to add to mrpfile.
+                                       $mrpfile,  # Original mrp file.
+                                       $newmrp ); # New mrp file.
+
+            # We now need to determine whether our file that is causing us
+            # all of this grief has been exported or is just a binary.
+            # This block sets up two variables, 'comp_remove' which
+            # is text to be added to the component to exclude the file,
+            # and 'binbag_addition' which is text to be added to our
+            # 'binbag' component..
+            my($comp_remove, $binbag_addition);
+            # Trigger ExportCategories, to get the export info cached.
+            $fxmrpdat->ExportCategories();
+
+            # The exportinfo structure is new to version 2.76.2 of the release
+            # tools, it was introduced to fix DEF047062. It's kind of private
+            # but right now this is the only way to associate an exported
+            # file with its source.
+            for my $class (keys %{$fxmrpdat->{exportinfo}})
+                {
+                for my $exl (keys %{$fxmrpdat->{exportinfo}->{$class} })
+                    {
+                    my $exfile = lc($exl);
+                    my $srcfile = lc($fxmrpdat->{exportinfo}->{$class}->{$exl});
+
+                    $exfile = "\\" . $exfile unless( $exfile =~ m/^\\/ );
+                    $srcfile = "\\" . $srcfile unless( $srcfile =~ m/^\\/ );
+                    if( $exfile eq lc($self->Path))
+                        {
+                        $srcfile = "\"$srcfile\"" if( $srcfile =~ m/\s/ );
+                        $exfile = "\"$exfile\"" if( $exfile =~ m/\s/ );
+                        $comp_remove = "-export_file    $srcfile $exfile\n";
+                        $binbag_addition = "export_file    $srcfile $exfile\n";
+                        last;
+                        }
+                    }
+                }
+            unless( $comp_remove )  # Not an export? Try binary.
+                {
+                for my $bil ( @{$fxmrpdat->Binaries()} )
+                    {
+                    my $bifile = lc($bil);
+                    $bifile = "\\" . $bifile unless( $bifile =~ m/^\\/ );
+                    if( $bifile eq lc($self->Path) )
+                        {
+                        my $lpth = lc($bifile);
+                        $lpth = "\"$bifile\"" if( $bifile =~ m/\s/ );
+                        $comp_remove = "-binary    $lpth\n";
+                        $binbag_addition = "binary    $lpth\n";
+                        last;
+                        }
+                    }
+                }
+            # Remove the file from the component it lives in.
+            $compfix->MrpFixText($comp_remove);
+            push @fixes, $compfix;
+
+            # Add the file to the binbag, unless its already there and only
+            # if we have a multiply owned file. Given where we are in the
+            # code it can only be a multi-owned or absent file - and if its
+            # absent we don't want to reference it, that was the original
+            # problem.
+            $binbag->MrpFixText($binbag_addition)
+                   if(($self->Type eq "multi") and 
+                    not(grep $binbag_addition, @{$binbag->MrpFixText}));
+            }
+        }
+    else   # No component owns this file, must be an orphan.
+        {
+        if( $self->Type eq "orphan" )  # Check anyway. Should always be true.
+            {
+            my $lpth = $self->Path;
+            $lpth = "\"$lpth\"" if( $lpth =~ m/\s/ );
+            my $fixtext = "binary    $lpth\n";
+            $binbag->MrpFixText($fixtext) 
+                unless( grep $fixtext, @{$binbag->MrpFixText});    
+            }
+            
+        }
+        # Add binbag contents to the array of fixes generated by this problem
+        # IF it contains anything.
+        push @fixes, $binbag if( ref($binbag->MrpFixText) and
+                                 (scalar @{$binbag->MrpFixText}) );
+
+        # Return a reference to the fixes for this problem.
+        return \@fixes;
+    }
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CCheckEnv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,348 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CCheckEnv
+# Uses the checkenv command to ensure all files are accounted for
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+use lib $FindBin::Bin."\\Stages\\CBRRepair";
+
+# Load base class
+use CProcessStage;
+
+# Load the error recovery code.
+use CBRPatch;
+
+package CCheckEnv;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+use constant CONFIG_PREINSTALLED_COMPONENTS => 'Preinstalled components';
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+#
+# Dies if options invalid
+sub CheckOpts()
+    {
+    my $self = shift;
+    # Nothing to check
+    }
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+    {
+    my $self = shift;
+    my $options = $self->iOptions();
+
+    if (!$self->PreCheckListOpt(CONFIG_PREINSTALLED_COMPONENTS)) {
+        $options->Error("Preinstalled components list not available (did CDelta run OK?)");
+        return 0;
+    }
+
+    return 1;
+    }
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+    {
+    my $self = shift;
+    my $passed = 1; # True, so far
+    my $options = $self->iOptions();
+
+    # First things first. We are going to need EnvDb and IniData. Make sure
+    # they are loaded.
+    # This copied from CPrepEnv, really ought to happen at a higher level.
+    my $found = 0;
+    for my $path (split(/;/,$ENV{PATH}))
+        {
+        if (-e $path."\\envdb\.pm")
+            {
+            push @INC, $path;
+            $found = 1;
+            last;
+            }
+        }
+    if (!$found)
+        {
+        $options->Error("Couldn't find release tools in path");
+        }
+    require EnvDb;
+    require IniData;
+    require MrpData;
+
+    # Create a new CBRPatch object. This won't do anything quite yet..
+    # Pass in the options object so it can generate reports.
+    my $cbrpatch = CBRPatch->new($options);
+
+    # get the list of preinstalled components (really a hash)
+    my %preinstalled = @{$options->Get(CONFIG_PREINSTALLED_COMPONENTS)};
+
+    # Check the output of envinfo, if its broken the patching code
+    # attempts to fix things x times (defaults to 3).
+    $options->Component('CBRPatch: Miscellaneous');
+    for my $att (1..$cbrpatch->Attempts)
+        {
+        my $evcomment = "Patch $att> " unless($att == 1);
+        # Detemine the fixes required to sort out the CBR. Might be none..
+        my $nfixes = $cbrpatch->CBRFixes;
+
+        # Get envinfo output. We get a reference to an array which is the
+        # output from 'envinfo -ffv'. Envinfo will already have been triggered
+        # by the above call to CBRFixes, we'll just get the envinfo output
+        # generated there. If we wanted envinfo run again we'd pass an argument.
+        my $evop = $cbrpatch->EnvinfoOutput;
+
+        $passed &= $self->EnvInfoErrorReport( $evop, $evcomment );
+
+        if ( $nfixes )
+            {
+            # get a list of component names to be fixed
+            my @components = grep defined, map $_->Component(), @$nfixes;
+
+            # do not attempt to fix preinstalled components (e.g. ISCs)
+            my @wontfix = grep exists $preinstalled{$_}, @components;
+
+            # if any are on the list of components to fix then this is a fatal error
+            if (@wontfix) {
+                $options->Error("Not going to patch preinstalled component(s): @wontfix");
+                return 0;
+            }
+
+            # Implement the fixes required. This will also trigger
+            # rerun of envinfo, + recalc problems and fixes.
+            my $fixesdone = $cbrpatch->ImplementFixes;
+#           $options->Print("$fixesdone patches applied to CBR.\n");
+
+            # Make sure we get an error report if this is the last
+            # iteration. If it isn't, it'll get done on the next.
+            $passed &= $self->EnvInfoErrorReport( $evop, "Patch FINAL> ")
+                if( $att == $cbrpatch->Attempts );
+            if( $cbrpatch->{ncbrproblems} )  # Are there further problems?
+                {
+                $options->Error( $cbrpatch->{ncbrproblems} . " CBR problems remain.\n" );
+
+                }
+            else
+                {
+                $passed = 1; # Problems fixed. Make sure we continue.
+                last;
+                }
+            }
+        else
+            {
+            last; # There are no fixes, though there may be trouble..
+            }
+        }
+    $options->Component('CCheckEnv: Miscellaneous');
+    return $passed;
+    }
+
+sub EnvInfoErrorReport
+    {
+    my $self = shift;
+    my $evop = shift;
+    my $opcomment = shift;
+    my $passed=1;
+
+    my $options = $self->iOptions();
+
+    if( ref($evop) )
+        {
+        my @output = ();
+        my $status;
+
+        foreach my $line (@$evop)
+            {
+            chomp $line;
+
+            if ($line =~ /^ERROR: Failed to run envinfo(.*)$/)
+                {
+                $options->Error($opcomment . "Couldn't spawn child process to run envinfo -f");
+                $passed = 0;
+                return $passed;
+                }
+
+            if ($line =~ /^Overall status: (.*)$/)
+                {
+                if (defined($status))
+                    {
+                    $passed = 0;
+                    last;
+                    }
+                else
+                    {
+                    $status = $1;
+                    }
+                }
+
+            push @output, $line;
+            }
+
+        if (!$passed)
+            {
+            $options->Error($opcomment . "Found multiple instances of 'Overall status' lines when parsing envinfo -ffv output.");
+            $status = undef;
+            }
+
+        if (!defined($status))
+            {
+            $options->Error($opcomment . "Envinfo overall status was not found:");
+            $passed = 0;
+            }
+        elsif ($status ne "pending release")
+            {
+            $options->Error($opcomment . "Envinfo status was '$status'. Expected 'pending release':");
+            $passed = 0;
+            }
+
+        if (!$passed)
+            {
+            $self->ExtractFromErrorArray(@output);
+            # Now dump out the entire envinfo output in non-scanlog format
+            $options->Print($opcomment . "Complete envinfo output:\n");
+            foreach my $error (@output)
+                {
+                $options->Print($opcomment . "- ".$error);
+                }
+            }
+        }
+    else
+        {
+        # Envinfo output not a reference to an array. Something is broken.
+        $passed = 0;
+        }
+        return $passed;
+    }
+
+# This parses the envinfo -f output and extracts specific error
+# and warning messages and dumps them out in scanlog format.
+sub ExtractFromErrorArray($)
+  {
+  my $self = shift;
+  my @logErrorLines = @_;
+
+  my $options = $self->iOptions();
+  $options->Print("Specific errors and warnings extracted from envinfo output:\n");
+  $options->Print("Component name is shown thus; [component] before the message\n");
+  my $component = "";
+  my @errorList = ();
+  my @warningList = ();
+  foreach my $line (@logErrorLines) {
+    # Remove line feed, white space
+    chomp $line;
+    # Strip all leading '.' that are envinfo's way of showing progress
+    $line =~ s/^(Scanning environment)*\.*//;
+
+    if ($line =~ m/^(\S+): Error: (.*)/) {
+      $component = $1;
+      my $err = $2;
+
+      # Print out any unknown errors with [???] which are cached
+      if(scalar(@errorList) != 0) {
+        foreach my $unknownErr (@errorList){
+          $options->Error("[???] $unknownErr");
+        }
+        @errorList = ();
+      }
+
+      $options->Error("[$component] $err");
+      $component = "";
+    }
+    # Search for ": Multiple errors (first" and grab the first word, that is the component
+    elsif ($line =~ m/^(\S+): Multiple errors \(first/) {
+      # Dump the array of errors previously logged then clear the error array and the component
+      $component = $1;
+      foreach my $err (@errorList) {
+        $options->Error("[$component] $err");
+      }
+      @errorList = ();
+      $component = "";
+    # Special case warnings or errors:
+    # The next three regexs are a bit fragile:
+    # EnvDb::Duplicates() will return a message "attempting to release.."
+    # but EnvInfo::CheckEnv() prepends "Warning: "
+    # Defensively this regex ignores the EnvInfo::CheckEnv() prefix but if
+    # the EnvDb::Duplicates() should change this regex may fail.
+    # Note that we are explicitly converting a EnvInfo::CheckEnv() warnings
+    # to an error message by putting it on the error list
+    } elsif ($line =~ m/^(\S+):\s+(\S+) attempting to release (\S+) which has already been released by (\S+)/) {
+      push @errorList, "$2 attempting to release $3 which has already been released by $4";
+      #push @errorList, $line;
+    } elsif ($line =~ m/^(\S+): Component name in MRP file is "(\S+)" whilst the name of this component in the environment database is "(\S+)"/) {
+      push @errorList, "Component name in MRP file is \"$2\" whilst the name of this component in the environment database is \"$3\"";
+      #push @errorList, $line;
+    } elsif ($line =~ m/^(\S+): (.+) has unknown origin/) {
+      push @errorList, $2." has unknown origin";
+      #push @errorList, $line;
+    # Treatment of general warnings or errors
+    } elsif ($line =~ m/^(Error): (.+)/i || $line =~ m/^(Warning): (.+)/i) {
+      if (uc $1 eq "ERROR") {
+        my $error = $2;
+        # Strip spurious CR
+        $error =~ s/\r//;
+        push @errorList, $error;
+      } else {
+        # Process a warning
+        # MAINTANANCE NOTE: The lines up to "END MAINTANANCE NOTE" can be removed
+        # once the missing '\n' is added in in MrpData::HandleBinFile() line 594
+        #
+        # First a precautionary check to see if this is a single line with multiple
+        # warnings. This is specific to MrpData::HandleBinFile()
+        # that emits a warning with this particlular pattern.
+        if ($line =~ m/^Warning: \((\S+?)\)(.+?)\?/) {
+          # In this case we can include the component that is in (...)
+          while ($line =~ m/^Warning: \((\S+?)\)(.+?)\?(.*)/i) {
+            push @warningList, "[$1]".$2."?";
+            $line = $3;
+            $line =~ s/^\.*//;
+          }
+          # Pick up an error that might be at the end of this line
+          if ($line =~ m/^(Error): (.+)/i) {
+            my $error = $2;
+            # Strip spurious CR
+            $error =~ s/\r//;
+            push @errorList, $error;
+          }
+        } else {
+          # END MAINTENANCE NOTE
+          # Treat as a single warning line
+          # NOTE: No component addded
+          push @warningList, $2
+        }
+      }
+    }
+  }
+  # Residual errors (these do not have an identifiiable component)
+  foreach my $err (@errorList) {
+    $options->Error("$err");
+  }
+  foreach my $warn (@warningList) {
+    $options->Warning("$warn");
+  }
+}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CCheckMrpUpdates.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,339 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CCheckMrpUpdates
+# Compare MRP checksums against the last release to spot any changes
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CCheckMrpUpdates;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+#
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	my $options = $self->iOptions();
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('GT+Techview baseline component name');
+	$self->CheckOpt('Techview component list');
+	$self->CheckOpt('GT component list');
+
+	# Check options are sensible
+	my $techviewcomplist = $options->Get("Techview component list");
+	my $GTcomplist = $options->Get("GT component list");
+
+	if (!-e $techviewcomplist)
+		{
+		$options->Die("ERROR: File '".$techviewcomplist."' (Techview component list) could not be found");
+		}
+	if (!-e $GTcomplist)
+		{
+		$options->Die("ERROR: File '".$GTcomplist."' (GT component list) could not be found");
+		}
+
+	# Load in list of components and corresponding .mrp files
+	my %components;
+
+	if (!open(TECHVIEWCOMPLIST, $techviewcomplist))
+		{
+		$options->Die("ERROR: Could not open '$techviewcomplist' (Techview component list)");
+		}
+	elsif (!open(GTCOMPLIST, $GTcomplist))
+		{
+		$options->Die("ERROR: Could not open '$GTcomplist' (GT component list)");
+		}
+	else
+		{
+		foreach my $line (<TECHVIEWCOMPLIST>)
+			{
+			chomp $line;
+			$line =~ s/^\s*//; # Remove extraneous spaces
+			$line =~ s/\s*$//;
+
+			if ($line!~/^#/)
+				{
+				my @parms = split(/\s+/, $line);
+
+				if (scalar(@parms) != 2)
+					{
+					$options->Die("ERROR: Entries in Techview component list should be of the form 'name mrp_location'. Problem in line:\n$line");
+					}
+				else
+					{
+					$components{lc($parms[0])} = $parms[1];
+					}
+				}
+			}
+		foreach my $line (<GTCOMPLIST>)
+			{
+			chomp $line;
+			$line =~ s/^\s*//; # Remove extraneous spaces
+			$line =~ s/\s*$//;
+
+			if ($line!~/^#/)
+				{
+				my @parms = split(/\s+/, $line);
+
+				if (scalar(@parms) != 2)
+					{
+					$options->Die("ERROR: Entries in GT component list should be of the form 'name mrp_location'. Problem in line:\n$line");
+					}
+				else
+					{
+					$components{lc($parms[0])} = $parms[1];
+					}
+				}
+			}
+
+		close(TECHVIEWCOMPLIST);
+		close(GTCOMPLIST);
+		}
+
+	$self->iComponents(\%components);
+
+	# Search for inidata API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\inidata\.pm")
+			{
+			$found = 1;
+			last;
+			}
+		}
+
+	if (!$found)
+		{
+		$options->Die("ERROR: Couldn't find release tools in path");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	foreach my $component (keys(%{$self->iComponents()}))
+		{
+		my $mrpfile = $self->iComponents()->{$component};
+
+		next if ($mrpfile eq '*nosource*');
+
+		if (!-e $mrpfile)
+			{
+			$options->Error("CCheckMrpUpdates::PreCheck() MRP file '".$mrpfile."' for component '".$component."' does not exist, ignoring it.");
+      # Knock this component out and keep going
+      delete ($self->{iCOMPONENTS}{$component});
+			}
+		}
+
+	if (!$self->PreCheckOpt("Last baseline version"))
+	 	{
+		$options->Error("Last baseline version has not been defined.");
+	 	$passed = 0;
+	 	}
+
+	return $passed;
+	}
+
+# Getter/setters
+sub iComponents
+	{
+	my $self = shift;
+	if (@_) { $self->{iCOMPONENTS} = shift; }
+	return $self->{iCOMPONENTS};
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	my $base = $options->Get("GT+Techview baseline component name");
+	my $lastver = $options->Get("Last baseline version");
+
+	# Load and initalise MD5 hash creator
+	my $md5;
+
+	if (eval "require Digest::MD5")
+		{ # Prefer Digest::MD5, if available.
+		$md5 = Digest::MD5->new();
+		}
+	elsif (eval "require MD5")
+		{ # Try old version of MD5, if available.
+		$md5 = new MD5;
+		}
+	elsif (eval "require Digest::Perl::MD5")
+		{ # Try Perl (Slow) version of MD5, if available.
+		$md5 = Digest::Perl::MD5->new();
+		}
+	else
+		{
+		$options->Error("Cannot load any MD5 Modules");
+		$passed = 0;
+		}
+
+	# Load in hashes for previous release
+
+	# - Install inidata API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\inidata\.pm")
+			{
+			push @INC, $path;
+			$found = 1;
+			last;
+			}
+		}
+
+	if (!$found)
+		{
+		$options->Error("Couldn't find release tools in path");
+		}
+
+	require IniData;
+
+	# - Read previous hashes
+
+	my %oldmrps;
+
+	if ($lastver =~ /^__initial/i)
+	    {
+	    # special - no previous release
+	    }
+	elsif (!(my $inidata = IniData->New()))
+		{
+		$options->Error("Couldn't read reltools.ini");
+		$passed = 0;
+		}
+	elsif (!(my $path = $inidata->PathData->LocalArchivePathForExistingComponent($base, $lastver)))
+		{
+		$options->Error("Couldn't locate '$base' component at version '$lastver'");
+		$passed = 0;
+		}
+	else
+		{
+		if (open(HASHFILE,$path."\\mrphash.lis"))
+			{
+			foreach my $line (<HASHFILE>)
+				{
+				my @args = split(/\s+/,$line);
+				if (scalar(@args) != 3)
+					{
+					$options->Error("Failed to parse line '$line' from file '$path\\mrphash.lis");
+					$passed = 0;
+					last;
+					}
+				my ($comp, $mrppath, $hash) = @args;
+
+				$oldmrps{lc($comp)} = [$mrppath, $hash];
+				}
+
+			close(HASHFILE);
+			}
+		}
+
+	my @differing=();
+
+	if ($passed)
+		{
+		foreach my $component (keys(%{$self->iComponents()}))
+			{
+			# Don't need to check ISC components, they have no mrp file    
+			next if ($self->iComponents()->{lc($component)} eq '*nosource*');    
+                            
+			# Support for scanlog phase component
+			$options->Component($component);
+			
+			# Compare filenames
+			if (!defined( $oldmrps{lc($component)} ))
+				{
+				$options->Print("Not comparing $component - new component");
+				}
+			else
+				{
+				my ($oldpath, $oldhash) = @{$oldmrps{lc($component)}};
+				my $newpath = $self->iComponents()->{lc($component)};
+				if (lc($oldpath) ne lc($newpath))
+					{
+					$options->Print("Component ".$component."'s mrp file has moved from '$oldpath' to '$newpath'");
+					push @differing, $component;
+					}
+				else
+					{
+					# Create hash for current mrp file
+					$md5->reset();
+					my $file;
+
+					if (!($file = IO::File->new($newpath)))
+						{
+						$options->Error("Could not open \"$newpath\" for reading: $!");
+						$passed = 0;
+						last;
+						}
+
+					$md5->addfile($file);
+					$file->close();
+					my $newhash = $md5->hexdigest();
+
+					# Compare
+					if (lc($oldhash) ne lc($newhash))
+						{
+						$options->Print("Component ".$component."'s mrp file has been updated");
+						push @differing, $component;
+						}
+					}
+				}
+			}
+
+		if ($passed)
+			{
+			if (!($options->Set("Updated components", \@differing)))
+				{
+				$options->Error("Couldn't store updated mrp files list");
+				$passed = 0;
+				}
+			}
+		}
+
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CCleanUp.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,81 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CCleanUp
+# Returns the machine configuration to its initial state
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CCleanUp;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('Spare drive letter');
+	
+	# Checks list options are defined and set to lists; dies otherwise
+	# $self->CheckListOpt('List option name');
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing to check
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+
+	my $options = $self->iOptions();
+
+	my $drive = $options->Get("Spare drive letter");
+	$drive =~ s/:$//;
+	$drive = $drive.":"; # Ensure there is a single colon on the end
+	
+	if (system("subst /D $drive"))
+		{
+		$options->Warning("Couldn't clean up $drive drive");
+		}
+	
+	return 1; # This stage has no fatal errors
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CConfigureRepair.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,173 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CConfigureRepair
+# Create release drive and configure the release tools
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CConfigureRepair;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+use Cwd;
+use Cwd 'chdir';
+use File::Path;
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	my $options = $self->iOptions();
+	
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt("Spare drive letter");
+	$self->CheckOpt("Release notes template location");
+	$self->CheckOpt("Release notes location");
+	$self->CheckOpt("Reltools.ini location");
+	$self->CheckOpt("Techview directory");
+
+	# Checks options are sensible
+	my $passed = 1;
+
+	my $drive = $options->Get("Spare drive letter");
+	if ($drive !~ /^[A-Z]:?$/i)
+		{
+		if ($drive !~ /\*/i)
+			{
+			$options->Error("'$drive' is not a valid drive letter.");
+			}
+		else
+			{
+			$options->Error("Cannot repair on drive '$drive' - an explicit drive letter must be given in the config file.");
+			}
+		$passed = 0;
+		}
+	
+	my $reltoolsini = $options->Get("Reltools.ini location");
+	if (!-e $reltoolsini)
+		{
+		$options->Print("ERROR: Reltools file '$reltoolsini' does not exist");
+	   	$passed = 0;	
+		}
+	
+	my $releasenotestemplate = $options->Get("Release notes template location");
+	if (!-e $releasenotestemplate)
+		{
+		$options->Print("ERROR: Release notes template '$releasenotestemplate' does not exist");
+		$passed = 0;
+		}
+	
+	my $techviewdir = $options->Get("Techview directory");
+	$techviewdir =~ s/[\/\\]+$//; # Remove trailing slashes for consistency
+	if (!-d $techviewdir)
+		{
+		$options->Print("ERROR: Techview directory '$techviewdir' does not exist");
+		$passed = 0;
+		}
+	
+	if (!$passed)
+		{
+		$options->Die("");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing from previous stages to check
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	my $techviewdir = $options->Get("Techview directory");
+	$techviewdir =~ s/[\/\\]+$//; # Remove any slashes from the end which can break subst
+	
+	# Store existing drive letter
+	my $olddrive = Cwd::getcwd();
+	
+	if ($olddrive !~ /^[A-Za-z]:/)
+	       	{
+		$options->Print("ERROR: getcwd() did not return drive letter, rather '$olddrive'");
+		$passed = 0;
+		}
+	else
+		{
+		$olddrive = substr($olddrive,0,1);
+
+		($options->Set("Original drive", $olddrive)) or ($passed = 0);
+		}
+
+	my $drive = $options->Get("Spare drive letter");
+	if ($drive !~ /:$/)
+		{
+		$drive = $drive.":";
+		}
+
+	if ($techviewdir !~ /^[A-Za-z]:/)
+		{
+		$techviewdir = $olddrive.":".$techviewdir;
+		}
+	
+	if (!-d ($drive."\\"))
+		{
+		# Drive doesn't exist, subst it
+		my $output = `subst $drive $techviewdir 2>&1`;
+		if ($? >> 8)
+			{
+			$options->Error("Couldn't subst to '$techviewdir' to $drive : $output");
+			$passed = 0;
+			}
+		}
+	
+	if ($passed && (!chdir($drive)))
+		{
+		$options->Print("ERROR: Couldn't change to drive $drive : $!");
+		$passed = 0;
+		}
+
+	# Set path
+
+	$ENV{PATH} = $ENV{PATH}.";$drive\\epoc32\\tools;$drive\\epoc32\\gcc\\bin;";
+	$ENV{EPOCROOT} = "\\";
+
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CCreateDrive.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,337 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CCreateDrive
+# Create release drive and configure the release tools
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CCreateDrive;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+use Cwd;
+use Cwd 'chdir';
+use File::Path;
+use File::Basename;
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+#
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	my $options = $self->iOptions();
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt("Spare drive letter");
+	$self->CheckOpt("Release notes template location");
+	$self->CheckOpt("Release notes location");
+	$self->CheckOpt("Reltools.ini location");
+	$self->CheckOpt("Techview directory");
+
+	# Checks options are sensible
+	my $passed = 1;
+
+	my $drive = $options->Get("Spare drive letter");
+	if (($drive !~ /^[A-Z]:?$/i) and ($drive !~ /^[A-Z]?\*:?$/i))
+		{
+		$options->Error("'$drive' is not a valid drive letter.");
+		$passed = 0;
+		}
+
+	my $reltoolsini = $options->Get("Reltools.ini location");
+	if (!-e $reltoolsini)
+		{
+		$options->Error("Reltools file '$reltoolsini' does not exist");
+	   	$passed = 0;
+		}
+
+	my $releasenotestemplate = $options->Get("Release notes template location");
+	if (!-e $releasenotestemplate)
+		{
+		$options->Error("Release notes template '$releasenotestemplate' does not exist");
+		$passed = 0;
+		}
+
+	my $techviewdir = $options->Get("Techview directory");
+	$techviewdir =~ s/[\/\\]+$//; # Remove trailing slashes for consistency
+	if (!-d $techviewdir)
+		{
+		$options->Error("Techview directory '$techviewdir' does not exist");
+		$passed = 0;
+		}
+
+	if (!$passed)
+		{
+		$options->Die("");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing from previous stages to check
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	# Store existing drive letter
+	my $olddrive = Cwd::getcwd();
+
+	STOP:
+		{
+		do
+			{
+			if ($olddrive !~ /^[A-Za-z]:/)
+				{
+				$options->Error("getcwd() did not return drive letter, rather '$olddrive'");
+				$passed = 0;
+				last STOP;
+				}
+
+			$olddrive = substr($olddrive,0,1);
+
+			($options->Set("Original drive", $olddrive)) or ($passed = 0);
+
+			my $reltools = $options->Get("Reltools.ini location");
+			if ($reltools !~ /^[A-Za-z]:/)
+				{
+				# Add the original drive letter if it has been omitted
+				$reltools = $olddrive.":".$reltools;
+				}
+
+			my $techviewdir = $options->Get("Techview directory");
+			if ($techviewdir !~ /^[A-Za-z]:/)
+				{
+				$techviewdir = $olddrive.":".$techviewdir;
+				}
+			$techviewdir =~ s/[\/\\]+$//; # Remove any slashes from the end which can break subst
+
+			my $releasenotestemplate = $options->Get("Release notes template location");
+			if ($releasenotestemplate !~ /^[A-Za-z]:/)
+				{
+				$releasenotestemplate = $olddrive.":".$releasenotestemplate;
+				}
+			my $dpfile = File::Basename::dirname($releasenotestemplate) . '/distribution.policy';
+			$dpfile =~ s/\//\\/g;
+
+			my $releasenotes = $options->Get("Release notes location");
+			my $dptarget =  File::Basename::dirname($releasenotes) . '/distribution.policy';
+			$dptarget =~ s/\//\\/g;
+
+			my $drive = $options->Get("Spare drive letter");
+
+			if ($drive !~ /:$/)
+				{
+				$drive = $drive.":";
+				}
+
+			if ($drive =~ /\*:$/)
+				{
+				# Search for available drive
+				$drive =~ s/\*:$//;
+				$drive = uc($drive);
+
+				if (length($drive) == 0)
+					{
+					# Start drive not specified
+					$drive = 'A';
+					}
+				elsif (length($drive) > 1)
+					{
+					# Assert: This /should/ have already been checked.
+					$options->Error("$drive is not a valid drive letter to search from");
+					$passed = 0;
+					last STOP;
+					}
+
+				while (ord($drive) <= ord('Z'))
+					{
+					system("subst $drive: ".$techviewdir." > nul 2>&1") or last;
+					$drive = chr(ord($drive)+1);
+					}
+
+				if (ord($drive) <= ord('Z'))
+					{
+					if ($options->Set("Spare drive letter", "$drive:"))
+						{
+						$options->Print("Using drive $drive: as spare drive");
+						$drive = $drive.":";
+						}
+					else
+						{
+						$options->Error("Couldn't store found drive letter ($drive:)");
+						$passed = 0;
+						last STOP;
+						}
+					}
+				else
+					{
+					$options->Error("Couldn't find a spare drive to use");
+					$passed = 0;
+					last STOP;
+					}
+				}
+			else
+				{
+				# Subst drive directly
+				my $output = `subst $drive $techviewdir 2>&1`;
+				if ($? >> 8)
+					{
+					$options->Error("Couldn't subst to '$techviewdir' to $drive : $output");
+					$passed = 0;
+					last STOP;
+					}
+				}
+
+			if (!chdir($drive))
+				{
+				$options->Error("Couldn't change to drive $drive : $!");
+				$passed = 0;
+				last STOP;
+				}
+
+			# Install reltools.ini
+
+			if (!-d "\\epoc32\\relinfo")
+				{
+				my $output = `mkdir \\epoc32\\relinfo 2>&1`;
+				if ($? >> 8)
+					{
+					$options->Error("Couldn't create \\epoc32\\relinfo directory: $output");
+					$passed = 0;
+					last STOP;
+					}
+				}
+
+            my $ini = '\epoc32\relinfo\reltools.ini';
+
+            unlink($ini) if -e $ini; # delete if it's already there
+
+			my $output = `copy $reltools $ini 2>&1`;
+			if ($? >> 8)
+				{
+				$options->Error("Couldn't install reltools.ini file from $reltools: $output");
+				$passed = 0;
+				last STOP;
+				}
+
+			# Set path
+
+			$ENV{PATH} = $ENV{PATH}.";$drive\\epoc32\\tools;$drive\\epoc32\\gcc\\bin;";
+			$ENV{EPOCROOT} = "\\";
+
+			# Create release note
+			if (!open(TEMPLATE, $releasenotestemplate))
+				{
+				$options->Error("Could not read from release notes template '$releasenotestemplate': $!");
+				$passed = 0;
+				last STOP;
+				}
+
+			my $releasenotesdir = $releasenotes;
+			$releasenotesdir =~ s/[\/\\][^\/\\]*$//;
+			if (!-d $releasenotesdir)
+				{
+				if (!mkpath($releasenotesdir))
+					{
+					$options->Error("Could not create directory '$releasenotesdir' for release notes: $!");
+					$passed = 0;
+					close(TEMPLATE);
+					last STOP;
+					}
+				}
+			system("copy $dpfile $dptarget > nul 2>&1");
+
+			if (!open(NOTES, ">".$releasenotes))
+				{
+				$options->Error("Could not write release notes to '$releasenotes': $!");
+				$passed = 0;
+				close(TEMPLATE);
+				last STOP;
+				}
+
+			foreach my $line (<TEMPLATE>)
+				{
+				chomp($line);
+
+				# Replace macros
+				my $found;
+				do
+					{
+					$found = 0;
+					my $opening = index($line, "%");
+					if ($opening != -1)
+						{
+						my $closing = index($line, "%", $opening+1);
+
+						if ($closing != -1)
+							{
+							$found = 1;
+							my $len = $closing-$opening+1;
+							my $key = substr($line, $opening+1, $len-2);
+							my $value = $options->Get($key);
+							if (defined($value))
+								{
+								substr($line, $opening, $len, $value);
+								}
+							else
+								{
+								$options->Error("No value for '$key' defined, as found in release notes template");
+								$passed = 0;
+								close(NOTES);
+								close(TEMPLATE);
+								last STOP;
+								}
+							}
+						}
+					} while ($found);
+
+				print NOTES $line."\n";
+				}
+
+			close(TEMPLATE);
+			close(NOTES);
+			}
+		# 'last STOP' jumps here
+		}
+
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CDelta.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,688 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package CDelta;
+
+use strict;
+use Carp;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+use Cwd;
+use File::Spec;
+use IO::Handle;
+use Time::Local;
+use Parallel::ForkManager;
+use base qw(CProcessStage);
+
+# use constants for config directive names
+use constant CONFIG_BASELINE_NAME           => 'GT+Techview baseline component name';
+use constant CONFIG_BASELINE_VERSION        => 'Last baseline version';
+use constant CONFIG_GT_COMPONENTS_LIST      => 'GT component list';
+use constant CONFIG_TV_COMPONENTS_LIST      => 'Techview component list';
+use constant CONFIG_RELEASE_VERSION         => 'Release version';
+use constant CONFIG_INTERNAL_VERSION        => 'Internal version';
+use constant CONFIG_MRP_UPDATED_COMPONENTS  => 'Updated components';
+use constant CONFIG_PREINSTALLED_COMPONENTS => 'Preinstalled components';
+use constant CONFIG_MAX_PARALLEL_TASKS      => 'Max Parallel Tasks';
+
+my $keeptemp;
+
+$| = 1;                       # autoflush output
+
+sub AUTOLOAD {
+
+    my $self = shift;
+    my $method = (split '::', $CDelta::AUTOLOAD)[-1];
+
+    return if $method eq 'iOptions'; # prevent recursion...
+    my $config = $self->iOptions(); # ...on this call
+
+    # delegate to our CConfig if possible (e.g. Get, Set, Print, Error, etc.)
+    return $config->$method(@_) if UNIVERSAL::can($config, $method);
+
+    carp "$CDelta::AUTOLOAD not implemented";
+    return undef;
+}
+
+sub DESTROY {} # required - prevents AUTOLOAD destroying the CConfig
+
+sub CheckOpts {
+
+    my $self = shift;
+
+    my @required = (
+        CONFIG_BASELINE_NAME,
+        CONFIG_BASELINE_VERSION,
+        CONFIG_GT_COMPONENTS_LIST,
+        CONFIG_TV_COMPONENTS_LIST,
+        CONFIG_RELEASE_VERSION,
+        CONFIG_INTERNAL_VERSION);
+
+    $self->CheckOpt($_) for @required;
+
+    my @files = map $self->Get($_), (CONFIG_GT_COMPONENTS_LIST, CONFIG_TV_COMPONENTS_LIST);
+
+    $self->Die("Required file missing: $_") for grep !-e, @files;
+}
+
+sub Run {
+
+    my $self = shift;
+
+    # get list of components in this release
+    my $release = $self->ListReleaseComponents();
+
+    $self->Print("\t$_ $release->{$_}")
+        for sort { lc($a) cmp lc($b) } keys %$release;
+
+    # get previous release component info
+    my $previous = $self->ListPreviousComponents(
+        $self->Get(CONFIG_BASELINE_NAME),
+        $self->Get(CONFIG_BASELINE_VERSION)) or return;
+
+    $self->Print("\t$_ $previous->{$_}")
+        for sort { lc($a) cmp lc($b) } keys %$previous;
+
+    # get preinstalled component info
+    my $preinstalled = $self->ListPreinstalledComponents();
+
+    $self->Print("\t$_ $preinstalled->{$_}")
+        for sort { lc($a) cmp lc($b) } keys %$preinstalled;
+
+    # Need to check that required preinstalled components are present
+    my @noSource = grep $release->{$_} eq '*nosource*', keys %$release;
+  
+    if (my @missingComponents = grep !exists $preinstalled->{$_}, @noSource) {
+        foreach my $component (@missingComponents) {
+           $self->Error("Required pre-installed component $component does not exist in the environment");     
+        }
+        return 0;
+    }  
+
+    # Need to check that there are not preinstalled components which have not been specified in
+    # techviewcomponents.txt or gt_components.txt
+    if (my @extraComponents = grep !exists $release->{$_}, keys %$preinstalled) {
+        foreach my $extraComponent (@extraComponents) {
+            $self->Error("Pre-installed component $extraComponent is not specified in " . $self->Get(CONFIG_GT_COMPONENTS_LIST) . " or  " . $self->Get(CONFIG_TV_COMPONENTS_LIST)); 
+        }
+        return 0;
+    }
+
+    # add information to the environment database about MRP's that will be included in the environment
+    foreach my $component (keys %$release) {
+        next if ($release->{$component} eq '*nosource*');
+        next if (exists $preinstalled->{$component});
+        
+        my $cmd = "envdata $component -m " . $release->{$component};
+        $self->_runcmd($cmd); 
+    }
+
+    # store preinstalled list for use by CCheckEnv
+    $self->Set(CONFIG_PREINSTALLED_COMPONENTS, [ %$preinstalled ]);
+
+    # get updated components (i.e. MRP file changed)
+    my $updated = $self->Get(CONFIG_MRP_UPDATED_COMPONENTS);
+
+    # determine components to validate starting with the previous release
+    my $validate = { %$previous };
+
+    # ignore removed components
+    delete $validate->{$_} for grep !exists $release->{$_}, keys %$validate;
+
+    # ignore preinstalled components
+    delete $validate->{$_} for keys %$preinstalled;
+    
+    # ignore updated components
+    delete $validate->{$_} for @$updated;
+
+    # do validation - get list of dirty components
+    my $dirty = $self->ListDirtyComponents($validate);
+
+    # list added components
+    my @added = grep !exists $previous->{$_}, keys %$release;
+
+    # list all components for publishing
+    my $prepare = [grep !exists $preinstalled->{$_}, (@$dirty, @added, @$updated, $self->Get(CONFIG_BASELINE_NAME))];
+
+    # do prep and return result as stage completion status
+    return $self->PrepComponents($prepare, $release);
+}
+
+sub ListReleaseComponents {
+
+    my $self = shift;
+    my $components = {};
+    my @files = map $self->Get($_), (CONFIG_GT_COMPONENTS_LIST, CONFIG_TV_COMPONENTS_LIST);
+
+    $self->Print("Determining this release content");
+
+    for my $file (@files) {
+
+        if (!open(LIST, $file)) {
+            $self->Error("Couldn't open file: $file ($!)");
+            return;
+        }
+
+        while (<LIST>) {
+
+            next if /^\s*#/; # skip comments
+
+            # line format: component_name mrp_file
+            if (/^\s*(\S+)\s+(\S+)\s*$/) {
+                $components->{lc($1)} = $2;
+            } else {
+                $self->Warning("Badly formed data in $file at line $. ($_)");
+            }
+        }
+
+        close(LIST);
+    }
+
+    return $components;
+}
+
+sub ListPreviousComponents {
+
+    my $self = shift;
+    my $baseline = shift;
+    my $version = shift;
+
+    return {} if $version =~ /^__initial/i; # special - no previous release
+
+    $self->Print("Determining previous release content ($baseline $version)");
+
+    # load or locate a module from a CBR tools installation *ugh*
+    if (!eval { require IniData }) {
+
+        my $found = 0;
+
+        # search PATH for the module and add the location to @INC if found
+        for my $dir (split ';', $ENV{PATH}) {
+            next unless -e File::Spec->catfile($dir, 'IniData.pm');
+            push @INC, $dir;
+            $found++;
+        }
+
+        if (!$found) {
+            $self->Error("Couldn't find a CBR tools installation");
+            return;
+        }
+    }
+
+    # load required modules and create objects
+    require IniData;
+    require RelData;
+
+    my $ini = eval { IniData->New() };
+
+    if (!defined $ini or length $@) {
+        $self->Error("Error occurred while attempting to read reltools.ini ($@)");
+        return;
+    }
+
+    my $component = eval { RelData->Open($ini, $baseline, $version) };
+
+    if (!defined $component or length $@) {
+        $self->Error("Couldn't open component $baseline version $version ($@)");
+        return;
+    }
+
+    my $environment = $component->Environment();
+
+    return { map { (lc($_), $environment->{$_}) } keys %$environment };
+}
+
+sub ListPreinstalledComponents {
+
+    my $self = shift;
+    my $components = {};
+
+    $self->Print("Determining preinstalled components");
+
+    $self->Component("CDelta: envinfo"); # For Scanlog compatibility
+
+    $self->_runcmd('envinfo -n', sub {
+
+        # skip 3 line header (blank line, Component       Version, blank line)
+        return if $. < 4;
+
+        # check output conforms to expected format
+        if (!/^\s*(\S+)\s+(\S+)\s*$/) {
+            $self->Error("EnvInfo output format is different to that expected");
+        }
+
+        # break line on whitespace
+        my($component, $version) = split(/\s+/, $_);
+
+        # add component and version to list of preinstalled components
+        $components->{lc($component)} = $version;
+
+    });
+
+    return $components;
+}
+
+sub ListDirtyComponents {
+   #
+   # This method has been modified in response to REQ9701. It now calls the external 'validaterel'
+   # process in a separate, forked process (one for each component being validated) and all these
+   # processes run in parallel (if the Max Parallel Tasks runtime option is greater than zero). It
+   # is possible to optimize parallelization for the machine on which MakeCBR is running by means
+   # of Max Parallel Tasks.
+   #
+
+   my $self = shift;
+   my $components = shift;
+   my $child = "";
+   my $output = "";
+   my %child_output;
+   my $indecision = 0;
+   my $dirty_list = {};
+   my ($start_time, $elapsed) = 0;
+   my ($pid, $comp, $status, $started);
+   my $max_tasks = $self->iOptions()->Get(CONFIG_MAX_PARALLEL_TASKS);
+   my $parallel = new Parallel::ForkManager($max_tasks); 
+
+   $| = 1;                       # autoflush output
+
+   $self->iOptions()->Print("\nMaximum number of parallel processes is ${max_tasks}\n");
+
+   #
+   # Define callback routine to run when each child process starts up
+   #
+
+   $parallel->run_on_start (
+      sub {
+         ($pid, $comp) = @_;
+
+#        if ($comp ne "1") {
+#            print("-- validation started for ${comp}\n");                      # (DEBUG)
+#        }
+
+         #
+         # Perl 5.6.1 on a laptop sometimes hangs if too many processes are
+         # forked at once, but a brief nap seems to cure this behaviour (it
+         # may not be necessary in production)
+         #
+
+         if ($comp ne "1") {
+#             print "before to wait 0.2 secs\n";
+             select(undef, undef, undef, 2); # sleep for 1/5th of a second
+             #select(undef, undef, undef, 4); # sleep for 1/5th of a second
+         }
+
+#         print "-- leaving run_on_start for ${comp}\n";
+      }
+   );
+
+   #
+   # Define callback routine to capture exit codes from child processes
+   #
+
+   $parallel->run_on_finish (
+      sub {
+         ($pid, $status, $comp) = @_;
+         my $verdict;
+
+         if ($comp ne "1") {
+            if ($status == 1) {
+               $verdict = "clean";
+            }
+            elsif ($status == 0) {
+               $verdict = "dirty";
+               $dirty_list->{$comp}++;
+            }
+            else {
+               $verdict = "undecided";
+               $indecision = 1;
+            }
+
+#           print("-- validation finished for ${comp} (${verdict})\n");        # (DEBUG)
+         }
+      }
+   );
+
+   #
+   # Define callback routine to run when maximum processes reached
+   #
+
+   $parallel->run_on_wait (
+      sub {
+         print("-- maximum (${max_tasks}) parallel processes reached\n");      # (DEBUG)
+      }
+#     }, 0.5   # optional repeat interval
+   );
+
+   #
+   # Store the time (in seconds) immediately before going parallel
+   #
+
+   $start_time = &get_seconds();
+
+   $self->iOptions()->Print("\nValidating all installed components\n");
+
+   print("\nSeparate output from each validation task follows:-\n");
+   print("================================================================\n");
+
+   #
+   # Loop through the list of components passed into this method
+   #
+
+   for my $component (sort { lc($a) cmp lc($b) } keys %$components) {
+      #
+      # Spawn a parallel (child) process
+      #
+
+      $parallel->start($component) and next;
+
+      ##########################################
+      # This is the start of the child process #
+      ##########################################
+
+      my $line = "";
+      my $message = "";
+      my $clean = 1;
+      my $decision = 0;
+      my $child_pid = $$;
+      my $version = $components->{$component};
+      my ($text, $childname, $childtalk);
+      my $child_start;
+      my $child_finish;
+      my $child_lifetime;
+
+      $| = 1;                       # autoflush output
+
+      $child_pid =~ s/-//;
+
+      #
+      # Store the time (in seconds) when the child was born
+      #
+
+#     $child_start = &get_seconds();                                        # (DEBUG)
+
+      #
+      # Construct the validaterel command
+      #
+
+      my $command = qq(validaterel -sf $component "$version");
+
+      $message = "Validating ${component} against version ${version}\n";
+      $message .= "Executing ${command}\n";
+
+      #
+      # Execute the validaterel command re-directing STDERR
+      # stream to STDOUT; scan each output line for "dirty"
+      # or "clean" status; capture all validaterel's output
+      #
+
+      $command .= " 2>&1";
+
+      if (open (COMMAND, "$command|")) {
+         foreach my $line (<COMMAND>) {
+            if (($line =~/Status dirty/) ||
+                ($line =~/Status binaries clean, source dirty/)) {
+               $clean = 0;
+            }
+
+            if (($line =~/Status clean/) ||
+                ($line =~/Status dirty/) ||
+                ($line =~/Status pending release/) ||
+                ($line =~/Status binaries clean, source dirty/)) {
+               $decision = 1;
+            }
+
+            $message .= $line;
+         }
+
+         close(COMMAND);
+      }
+      else {
+         die "Could not execute command \"${command}\". ${!}\n";
+      }
+
+      #
+      # Print the output in distinct, ordered blocks (goes into a separate
+      # file on the server if ordinary Perl 'print' is used instead of the
+      # Component object method but calling that method in children causes
+      # "attempt to access an unreferenced scalar" errors)
+      #
+
+      $self->iOptions()->Print("${message}");
+      $self->iOptions()->Print("================================================================\n");
+
+      #
+      # Calculate the child's total lifetime
+      #
+
+#     $child_finish = &get_seconds();                                    # (DEBUG)
+#     $child_lifetime = $child_finish - $child_start;                    # (DEBUG)
+#     print("[times: start ${child_start}, finish ${child_finish}, total ${child_lifetime}]\n"); # (DEBUG)
+
+      #
+      # Return special value if decision has not been made
+      #
+
+      if (!$decision) {
+         $clean = -1;
+      }
+     
+      ########################################
+      # This is the end of the child process #
+      ########################################
+
+      $parallel->finish($clean);
+   }
+
+   #
+   # The parent process must wait for all its children to finish
+   #
+
+   $parallel->wait_all_children;
+
+   if ($indecision) {
+      $self->iOptions()->Error("One or more components could not be validated");
+   }
+
+   #
+   # Calculate the total time it took to run all parallel processes
+   #
+
+   $elapsed = &get_seconds() - $start_time;
+
+   $self->iOptions()->Print("Validation of installed components complete (" . &convert_seconds($elapsed) . ")\n");
+
+   return [ keys %$dirty_list ];
+}
+
+sub PrepComponents {
+
+    my $self = shift;
+    my $components = shift;
+    my $release = shift;
+    my $version = $self->Get(CONFIG_RELEASE_VERSION);
+    my $internal = $self->Get(CONFIG_INTERNAL_VERSION);
+    my $last = '';
+
+    for my $component (sort { lc($a) cmp lc($b) } @$components) {
+
+        next if $component eq $last; # prevent reprocessing (in case of duplicates)
+
+        $self->Component($component);
+        $self->Print("Preparing component $component");
+
+        if (!exists $release->{$component}) { # should never happen
+            $self->Error("Component $component is not supposed to be in this release");
+            return 0;
+        }
+
+        my $command = qq(preprel -v $component $version $internal -m $release->{$component});
+      
+        $self->Component($component); # For Scanlog compatibility
+
+        if ($self->_runcmd($command)) {
+            $self->Error("Preprel failed for component: $component");
+            return 0;
+        }
+
+        $last = $component;
+    }
+
+    return 1;
+}
+
+sub _runcmd {
+
+    my $self = shift;
+    my $cmd = shift;
+    my $lineproc = shift || sub {};
+
+    $self->Print("Executing $cmd");
+
+    if (!open(OUTPUT, "$cmd 2>&1 |")) {
+        $self->Error("Couldn't execute: $cmd ($!)");
+        return -1;
+    }
+
+    while (<OUTPUT>) {
+        chomp;
+        $self->Print($_);
+        $lineproc->($_); # call callback with line data
+    }
+
+    close(OUTPUT);
+
+    my $exit = $? >> 8;
+
+    if ($exit) {
+        $self->Error("Command completed with nonzero exit code: $exit");
+    } else {
+        $self->Print("Command completed successfully");
+    }
+
+    return $exit;
+}
+
+sub get_seconds {
+   my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time());
+
+   my $epoch_secs = timelocal($sec, $min, $hour, $mday, $mon, $year);
+
+   return $epoch_secs;
+}
+
+sub convert_seconds {
+   my $time_secs = shift;
+   my $time_str;
+   my $seconds;
+   my $minutes;
+   my $hours;
+
+   $seconds   =  $time_secs % 60;
+   $time_secs = ($time_secs - $seconds) / 60;
+   $minutes   =  $time_secs % 60;
+   $time_secs = ($time_secs - $minutes) / 60;
+   $hours     =  $time_secs % 24;
+
+   $time_str = sprintf("%02d:%02d:%02d", $hours, $minutes, $seconds);
+
+   return $time_str;
+}
+
+1;
+
+=pod
+
+=head1 NAME
+
+CDelta - determines environment differences and prepares for release.
+
+=head1 SYNOPSIS
+
+This class runs as a stage of makeCBR. No alternate usage is supported.
+
+An instance is created using the inherited constructor and processing is
+invoked using the overloaded Run() method.
+
+=head1 DESCRIPTION
+
+The CDelta stage replaces the CValidate and CPrepEnv stages and provides
+the functionality required to determine which components need to be re-
+published to make the new baseline. This process now takes account of the
+fact that there may be preinstalled components (e.g. ISCs) which should
+not be republished (ever).
+
+=head1 METHODS
+
+=head2 New($config)
+
+Inherited constructor - see L<CProcessStage>.
+
+=head2 AUTOLOAD($method)
+
+Attempts to delegate unknown method calls to the CConfig object provided to
+the constructor at instantiation. The CConfig object does configuration
+handling and logging and this AUTOLOAD arrangement allows the CConfig methods
+to be called directly on $self, rather than having to assign to a variable
+or use the not-so-pretty $self->iOptions()->Foo() notation.
+
+=head2 CheckOpts()
+
+Checks required configuration directives are present and sensible prior to
+using them.
+
+=head2 Run()
+
+Main control method - contains the business logic for the stage.
+
+=head2 ListReleaseComponents()
+
+Reads the GT and Techview component list files to get the full list of
+components to be published in this release. Returns a hashref where the
+keys are the component names and the values are their MRP file paths.
+
+=head2 ListPreviousComponents($baseline, $version)
+
+Returns a hashref of component name => version for a given baseline
+component name and version. This is determined by interrogating the reldata
+file of the specified component (making use of CBR tools libraries which
+are dynamically loaded).
+
+=head2 ListPreinstalledComponents()
+
+Returns a hashref of component name => version currently installed in the
+environment. This is determined by running envinfo.
+
+=head2 ListDirtyComponents(\%components)
+
+Returns an arrayref of component names for those components differing to
+their version in the previous release (as provided in %components). This is
+determined by running validaterel on each component.
+
+=head2 PrepComponents(\@components, \%release)
+
+Prepares the given list of component names for later publishing. This is
+achieved by calling preprel for each component specified, using the MRP file
+location provided in %release (the return value of ListReleaseComponents()).
+
+=head1 SEE ALSO
+
+L<CProcessStage> (base class) and L<CConfig> (configuration and logging).
+
+=head1 COPYRIGHT
+
+Copyright (c) 2005-2007 Symbian Software Ltd. All rights reserved.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CGetPrevRel.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,178 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CGetPrevRel
+# Identify the last release version
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CGetPrevRel;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+#
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('GT+Techview baseline component name');
+
+	if (!$self->iOptions()->CheckRelTools())
+		{
+		$self->iOptions()->Die("ERROR: Couldn't find release tools in path");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing to check from any previous stage
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	my $basecomp = $options->Get('GT+Techview baseline component name');
+	my $lastrel = $options->Get('Last baseline version');
+
+	if (defined($lastrel))
+		{
+		$options->Print("Last baseline version manually defined as: $lastrel");
+
+        return 1 if $lastrel =~ /^__initial/i; # special - no previous release
+
+		# Check specified version exists
+
+		$options->RequireRelTools();
+
+		# Get list of components in previous release
+
+		my $basecomp = $options->Get("GT+Techview baseline component name");
+		my $lastver = $options->Get("Last baseline version");
+
+		if (!(my $inidata = IniData->New()))
+			{
+			$options->Error("Couldn't read reltools.ini");
+			$passed = 0;
+			}
+		else
+			{
+			my $reldata;
+			eval
+				{
+				$reldata = RelData->Open($inidata, $basecomp, $lastver, 0);
+				};
+			unless( defined($reldata) )
+				{
+				$options->Print("REMARK: Couldn't open version $lastver of $basecomp");
+				$lastrel = undef; # Revert to determining latest version
+				}
+			}
+		}
+
+	if (!defined($lastrel))
+		{
+		# Use latestver to determine last baseline version
+
+		if (!defined($basecomp))
+			{
+			$options->Error("GT+Techview baseline component not set for latestver");
+			$passed = 0;
+			}
+		elsif (!open (LATESTVER, "latestver $basecomp 2>&1 |"))
+			{
+			$options->Error("Couldn't spawn child process for latestver");
+			$passed = 0;
+			}
+		else
+			{
+			my @output = ();
+			my $version = undef;
+
+			foreach my $line (<LATESTVER>)
+				{
+				chomp $line;
+				push @output, $line;
+
+				if ($line !~ /^\s*$/)
+					{
+					if (defined($version))
+						{
+						$options->Error("Latestver output had too many lines:");
+						$passed = 0;
+						last;
+						}
+					else
+						{
+						$version = $line;
+						}
+					}
+				}
+
+			if (!close (LATESTVER))
+				{
+				$options->Error("Latestver command failed:");
+				$passed = 0;
+				}
+
+			if ($passed == 0)
+				{
+				foreach my $error (@output)
+					{
+					$options->Print($error);
+					}
+				}
+			else
+				{
+				if ($options->Set("Last baseline version", $version))
+					{
+					$options->Print("Last baseline version determined as: $version");
+					}
+				else
+					{
+					$passed = 0;
+					}
+				}
+			}
+		}
+
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CInstallGTConflicts.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,225 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CInstallGTConflicts
+# Installs GT versions of any files (as listed in the techview_dups log)
+# and writes an mrp file to ship those files in the GT only release
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CInstallGTConflicts;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+use File::Path;
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+  my $options = $self->iOptions();
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('Conflicting files log');
+	$self->CheckOpt('GT directory');
+	$self->CheckOpt('GT conflicts mrp location');
+	$self->CheckOpt('GT conflicts component name');
+	$self->CheckOpt('Release notes location');
+
+	# Checks and loads conflicting files log
+	my $gtConflicts = $options->Get('Conflicting files log');
+
+	if (!-e $gtConflicts)
+		{
+		$options->Die("ERROR: Conflicting files log '$gtConflicts' does not exist");
+		}
+	elsif (open(GTCONFLICTS, $options->Get('Conflicting files log')))
+		{
+		my @conflicts;
+		
+		foreach my $line (<GTCONFLICTS>)
+			{
+			chomp($line);
+			push @conflicts, $line;
+			}
+		close (GTCONFLICTS);
+
+		$self->iConflicts(\@conflicts);
+		}
+	else
+		{
+		$options->Die("ERROR: Couldn't open conflicting files log: $!");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+
+	if (!$self->PreCheckOpt("Original drive"))
+	 	{
+		$self->iOptions()->Error("Original starting drive has not been recorded");
+	 	$passed = 0;
+	 	}
+
+	return $passed;
+	}
+
+# Getter/setters
+sub iConflicts
+	{
+	my $self = shift;
+	if (@_) { $self->{iCONFLICTS} = shift; }
+	return $self->{iCONFLICTS};
+	}
+	
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+
+	my $passed = 1; # True, so far
+
+	my @conflicts = @{$self->iConflicts()};
+	my $options = $self->iOptions();
+  
+	my $GTdir = $options->Get('GT directory');
+	my $olddrive = $options->Get('Original drive');
+	if ($GTdir !~ /^[A-Za-z]:/)
+		{
+		# Add the original drive letter if it has been omitted
+		$GTdir = $olddrive.":".$GTdir;
+		}
+	my $mrppath = $options->Get('GT conflicts mrp location');
+	my $mrpname = $options->Get('GT conflicts component name');
+	my $relnotes = $options->Get('Release notes location');
+	my $mrpdir = $mrppath;
+	$mrpdir =~ s/[\/\\][^\/\\]*$//; # Remove leafname
+
+	if (!-d $mrpdir)
+		{
+		if (!mkpath($mrpdir))
+			{
+			$options->Error("Couldn't make directory '$mrpdir'");
+			$passed = 0;
+			}
+		}
+	elsif (!open(MRP, ">$mrppath"))
+		{
+		$options->Error("Couldn't open '$mrppath' for writing: $!");
+		$passed = 0;
+		}
+	else
+		{
+		print MRP "component\t$mrpname\n\n";
+		
+		foreach my $file (@conflicts)
+			{
+			$options->Print($file);
+			my $dir = $file;
+			$dir =~ s/[\/\\][^\/\\]*$//; # Remove leafname
+
+			if (!-d $dir)
+				{
+				if (!mkpath($dir))
+					{
+					$options->Error("Couldn't make directory '$dir' for file '$file'");
+					$passed = 0;
+					next;
+					}
+				}
+			
+			if ($file !~ /^[\\\/]/)
+				{
+				# If path is not absolute, make it absolute
+				$file = "\\".$file;
+				}
+			if (($file =~ /epoc32[\/\\].*\.sym$/) || ($file =~ /epoc32[\/\\].*\.bsc$/))
+				{
+				# These files are excluded from the environment deliberately
+				}
+			elsif (-e $file)
+				{
+				if ( ($file !~ /epoc32[\/\\]localisation[\/\\].*\.rpp$/i)
+				  && ($file !~ /epoc32[\/\\]build[\/\\]/i) )
+					{
+					# File should not already be there. Try to determine the problem
+					my @bininfo = `bininfo $file 2>&1`;
+			
+					if ($? >> 8)
+						{
+						$options->Warning("File '$file' from conflicting files log is present when non GT components have been removed. May be a source file?");
+						}
+					else
+						{
+						$options->Warning("File '$file' from conflicting files log is present in a GT component:");
+						}
+					
+					foreach my $line (@bininfo)
+						{
+						if ($line =~ /^Usage:/)
+							{
+							last;
+							}
+						$options->Print($line);
+						}
+					}
+				}
+			elsif (system("copy $GTdir\\$file $file >nul 2>&1"))
+				{
+				# Build files are excluded, but might be regenerated. Worth trying
+				# to copy if present, but no issue if not present.
+				if ($file !~ /epoc32[\/\\]build[\/\\]/i)
+					{
+					$options->Error("Couldn't copy file '$file' from $GTdir: $!");
+					$passed = 0;
+					}
+				}
+			else
+				{
+				# Have copied $file from GT directory to working drive
+					
+				# Record the new file in the MRP file
+				print MRP "binary\t$file\n";
+				}
+			}
+
+		print MRP "notes_source\t$relnotes\n";
+		close(MRP);
+		}
+	
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CPrepGTRelease.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,94 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CPrepGTRelease
+# Prepare GT only baseline and GT conflicts components for release
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CPrepGTRelease;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('GT only baseline component name');
+	$self->CheckOpt('GT only baseline mrp location');
+	$self->CheckOpt('GT conflicts component name');
+	$self->CheckOpt('GT conflicts mrp location');
+	$self->CheckOpt('Release version');
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing to check; always passes
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+
+	my $options=$self->iOptions();
+
+	my $baselinemrp = $options->Get('GT only baseline mrp location');
+	my $baselinename = $options->Get('GT only baseline component name');
+	my $conflictsmrp = $options->Get('GT conflicts mrp location');
+	my $conflictsname = $options->Get('GT conflicts component name');
+	my $version = $options->Get('Release version');
+
+	my $output = `preprel -v $baselinename $version $version -m $baselinemrp 2>&1`;
+	if ($? >> 8)
+		{
+		$options->Error("Preprel failed for $baselinename: $output");
+		$passed = 0;
+		}
+	
+	$output = `preprel -v $conflictsname $version $version -m $conflictsmrp 2>&1`;
+	if ($? >> 8)
+		{
+		$options->Error("Preprel failed for $conflictsname: $output");
+		$passed = 0;
+		}
+	
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CReleaseEnv.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,97 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Publishes a prepared release to the archive
+# 
+#
+
+package CReleaseEnv;
+use base qw(CProcessStage);
+use strict;
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+#
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+
+	$self->CheckOpt('Release archive'); # Ensures option named 'Release archive' was set. Dies if not
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing to check here
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+
+	my $archive = $self->iOptions()->Get("Release archive");
+
+	my $logger = $self->iOptions();
+	
+	$logger->Component("CReleaseEnv: makeenv"); # For Scanlog compatibility
+
+	return !$self->_runcmd("makeenv -v --useCachedManifest -w $archive"); # invert return code 0=pass, 1=fail
+	}
+
+sub _runcmd {
+
+    my $self = shift;
+    my $cmd = shift;
+    my $lineproc = shift || sub {};
+    my $logger = $self->iOptions();
+
+    $logger->Print("Executing $cmd");
+    
+    if (!open(OUTPUT, "$cmd 2>&1 |")) {
+        $logger->Error("Couldn't execute: $cmd ($!)");
+        return -1;
+    }
+
+    while (<OUTPUT>) {
+	chomp;
+	
+	$logger->Print($_);
+	$lineproc->($_); # call callback with line data
+    }
+
+    close(OUTPUT);
+
+    my $exit = $? >> 8;
+
+    if ($exit) {
+        $logger->Error("Command completed with nonzero exit code: $exit");
+    } else {
+        $logger->Print("Command completed successfully");
+    }
+
+    return $exit;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CRemoveNonGT.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,190 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CRemoveNonGT
+# Removes any components not belonging to the GT release from the environment including their installed binaries
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CRemoveNonGT;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	my $options=$self->iOptions();
+
+	# Checks option is defined; dies otherwise
+	$self->CheckOpt('GT component list'); # Ensures option named 'GT component List' is defined
+	
+	# Checks option is set correctly
+	if (!-e $options->Get("GT component list"))
+		{
+		$options->Die("ERROR: File '".$options->Get("Component list")."' (component list) could not be found");
+		}
+		
+	# Load in list of components and corresponding .mrp files
+	my $complist = $options->Get("GT component list");
+	my @components;
+
+	if (!open(COMPLIST, $complist))
+		{
+		$options->Die("ERROR: Could not open '$complist' (GT component list)");
+		}
+	else
+		{
+		foreach my $line (<COMPLIST>)
+			{
+			chomp $line;
+			$line =~ s/^\s*//; # Remove extraneous spaces
+			$line =~ s/\s*$//;
+
+			if ($line!~/^#/)
+				{
+				my @parms = split(/\s+/, $line);
+
+				if (scalar(@parms) != 2)
+					{
+					$options->Die("ERROR: Entries in GT component list should be of the form 'name mrp_location'. Problem in line:\n$line");
+					}
+				else
+					{
+					push @components, lc($parms[0]);
+					}
+				}
+			}
+			
+		close(COMPLIST);
+		}
+
+	# Search for envdb API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\envdb\.pm")
+			{
+			$found = 1;
+			last;
+			}
+		}
+	
+	if (!$found)
+		{
+		$options->Die("ERROR: Couldn't find release tools in path");
+		}
+		
+	$self->iComponents(\@components);
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+
+	return 1; # Nothing to check - always passes
+	}
+
+# Getter/setters
+sub iComponents
+	{
+	my $self = shift;
+	if (@_) { $self->{iCOMPONENTS} = shift; }
+	return $self->{iCOMPONENTS};
+	}
+	
+# boolean Run()
+# Performs the body of work for the stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options=$self->iOptions();
+
+	# Install envdb API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\envdb\.pm")
+			{
+			push @INC, $path;
+			$found = 1;
+			last;
+			}
+		}
+	
+	if (!$found)
+		{
+		$options->Error("Couldn't find release tools in path");
+		}
+		
+	require EnvDb;
+	require IniData;
+
+	my $envdb;
+
+	if (!(my $inidata = IniData->New()))
+		{
+		$options->Error("Couldn't read reltools.ini");
+		$passed = 0;
+		}
+	elsif (!($envdb = EnvDb->Open($inidata, 0)))
+		{
+		$options->Error("Couldn't open environment database");
+		$passed = 0;
+		}
+	
+	# Determine currently installed components
+	my @envComps;
+	
+	if ($envdb)
+		{
+		@envComps = keys(%{$envdb->VersionInfo()});
+		}
+	
+	# Remove any components not in the GT component list
+	my @listComps = @{$self->iComponents()};
+	foreach my $component (@envComps)
+		{
+    # Support for scanlog phase component
+    $options->Component($component);
+		my @found = grep( (lc($_) eq lc($component)), @listComps );
+		if (scalar(@found)==0)
+			{
+			$envdb->RemoveComponent($component);
+			}
+		}
+
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/stages/CStoreMrpState.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,273 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CStoreMrpState
+# Records checksums for all mrp files used, for comparison in the next build
+# 
+#
+
+use strict;
+
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CStoreMrpState;
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	my $options = $self->iOptions();
+
+	# Checks options are defined; dies otherwise
+	$self->CheckOpt('GT+Techview baseline component name');
+	$self->CheckOpt('Release version');
+	$self->CheckOpt('Techview component list');
+	$self->CheckOpt('GT component list');
+
+	# Check options are sensible
+	my $techviewcomplist = $options->Get("Techview component list");
+	my $GTcomplist = $options->Get("GT component list");
+	
+	if (!-e $techviewcomplist)
+		{
+		$options->Die("ERROR: File '".$techviewcomplist."' (Techview component list) could not be found");
+		}
+	if (!-e $GTcomplist)
+		{
+		$options->Die("ERROR: File '".$GTcomplist."' (GT component list) could not be found");
+		}
+		
+	# Load in list of components and corresponding .mrp files
+	my %components;
+
+	if (!open(TECHVIEWCOMPLIST, $techviewcomplist))
+		{
+		$options->Die("ERROR: Could not open '$techviewcomplist' (Techview component list)");
+		}
+	elsif (!open(GTCOMPLIST, $GTcomplist))
+		{
+		$options->Die("ERROR: Could not open '$GTcomplist' (GT component list)");
+		}
+	else
+		{
+		foreach my $line (<TECHVIEWCOMPLIST>)
+			{
+			chomp $line;
+			$line =~ s/^\s*//; # Remove extraneous spaces
+			$line =~ s/\s*$//;
+      next if ($line =~ /\*nosource\*/);
+			if ($line!~/^#/)
+				{
+				my @parms = split(/\s+/, $line);
+
+				if (scalar(@parms) != 2)
+					{
+					$options->Die("ERROR: Entries in Techview component list should be of the form 'name mrp_location'. Problem in line:\n$line");
+					}
+				else
+					{
+          $components{lc($parms[0])} = $parms[1];
+					}
+				}
+			}
+		foreach my $line (<GTCOMPLIST>)
+			{
+			chomp $line;
+			$line =~ s/^\s*//; # Remove extraneous spaces
+			$line =~ s/\s*$//;
+      next if ($line =~ /\*nosource\*/);
+			if ($line!~/^#/)
+				{
+				my @parms = split(/\s+/, $line);
+
+				if (scalar(@parms) != 2)
+					{
+					$options->Die("ERROR: Entries in GT component list should be of the form 'name mrp_location'. Problem in line:\n$line");
+					}
+				else
+					{
+          $components{lc($parms[0])} = $parms[1];
+          }
+				}
+			}
+			
+		close(TECHVIEWCOMPLIST);
+		close(GTCOMPLIST);
+		}
+	
+	$self->iComponents(\%components);
+
+	# Search for inidata API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\inidata\.pm")
+			{
+			$found = 1;
+			last;
+			}
+		}
+	
+	if (!$found)
+		{
+		$options->Die("ERROR: Couldn't find release tools in path");
+		}
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	foreach my $component (keys(%{$self->iComponents()}))
+		{
+		my $mrpfile = $self->iComponents()->{$component};
+		
+		if (!-e $mrpfile)
+			{
+			$options->Error("MRP file '".$mrpfile."' for component '".$component."' does not exist, ignoring it.");
+      # Knock this component out and keep going
+      delete ($self->{iCOMPONENTS}{$component});
+			}
+		}	
+
+	return $passed;
+	}
+
+# Getter/setters
+sub iComponents
+	{
+	my $self = shift;
+	if (@_) { $self->{iCOMPONENTS} = shift; }
+	return $self->{iCOMPONENTS};
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+	my $options = $self->iOptions();
+
+	my $base = $options->Get("GT+Techview baseline component name");
+	my $ver = $options->Get("Release version");
+
+	# Load and initalise MD5 hash creator
+	my $md5;
+	
+	if (eval "require Digest::MD5")
+		{ # Prefer Digest::MD5, if available.
+		$md5 = Digest::MD5->new();
+		}
+	elsif (eval "require MD5")
+		{ # Try old version of MD5, if available.
+		$md5 = new MD5;
+		}
+	elsif (eval "require Digest::Perl::MD5")
+		{ # Try Perl (Slow) version of MD5, if available.
+		$md5 = Digest::Perl::MD5->new();
+		}
+	else
+		{
+		$options->Error("Cannot load any MD5 Modules");
+		$passed = 0;
+		}
+	
+	# Install inidata API
+	my $found = 0;
+	foreach my $path (split(/;/,$ENV{PATH}))
+		{
+		if (-e $path."\\inidata\.pm")
+			{
+			push @INC, $path;
+			$found = 1;
+			last;
+			}
+		}
+	
+	if (!$found)
+		{
+		$options->Error("Couldn't find release tools in path");
+		}
+	
+	require IniData;
+
+	# Write file
+	
+	my %oldmrps = ();
+	
+	if (!(my $inidata = IniData->New()))
+		{
+		$options->Error("Couldn't read reltools.ini");
+		$passed = 0;
+		}
+	elsif (!(my $path = $inidata->PathData->LocalArchivePathForExistingComponent($base, $ver)))
+		{
+		$options->Error("'$base' component at version '$ver' does seem to have been released");
+		$passed = 0;
+		}
+	else
+		{
+		open(HASHFILE,">".$path."\\mrphash.lis");
+		
+		foreach my $component (keys(%{$self->iComponents()}))
+			{
+      # Support for scanlog phase component
+      $options->Component($component);
+
+			# Create hash for current mrp file
+			my $mrppath = $self->iComponents()->{$component};
+			
+			$md5->reset();
+		
+			my $file;	
+			if (!($file = IO::File->new($mrppath)))
+				{
+				$options->Error("Could not open \"$mrppath\" for reading: $!");
+				$passed = 0;
+				last;
+				}
+			
+			$md5->addfile($file);
+			$file->close();
+			my $hash = $md5->hexdigest();
+			
+			print HASHFILE "$component $mrppath $hash\n";
+			}
+
+		close(HASHFILE);
+		}
+    
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/CExampleStage.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,83 @@
+#!\bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# CExampleStage - TODO - Change this when using this stage as a template
+# <Insert description of this stage here>
+# 
+#
+
+use strict;
+
+use lib qw(../);
+use lib qw(../stages);
+use FindBin;
+use lib $FindBin::Bin."\\..";
+
+# Load base class
+use CProcessStage;
+
+package CExampleStage; # TODO - Change this when using this stage as a template
+use vars ('@ISA');
+@ISA = qw( CProcessStage );
+
+# void CheckOpts()
+# Ensures that all required (user) options are set to reasonable values at the
+# start of execution
+# 
+# Dies if options invalid
+sub CheckOpts()
+	{
+	my $self = shift;
+	print "Subclass checking options.\n";
+
+	# Checks options are defined; dies otherwise
+	# $self->CheckOpt('Option name');
+	
+	# Checks list options are defined and set to lists; dies otherwise
+	# $self->CheckListOpt('List option name');
+	}
+
+# boolean PreCheck()
+# Ensures that all required results from previous stages are set to reasonable
+# values before this stage is run
+#
+# Returns false if result options are invalid
+sub PreCheck()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+
+	print "Subclass pre-stage check.\n";
+	# if (!$self->PreCheckOpt("key"))
+	# 	{
+	# 	$passed = 0;
+	# 	}
+
+	return $passed;
+	}
+
+# boolean Run()
+# Performs the body of work for this stage
+#
+# Returns false if it encounters problems
+sub Run()
+	{
+	my $self = shift;
+	my $passed = 1; # True, so far
+
+	print "Subclass stage running.\n";
+	
+	return $passed;
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/CTestScore.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,88 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# \bin\perl
+# CTestScore
+# 
+#
+
+package CTestScore;
+
+use lib qw(../);
+use lib qw(../stages);
+
+use strict;
+
+sub New()
+	{
+	my $proto = shift;
+	my $class = ref($proto) || $proto;
+
+	my $self = {};
+	bless($self, $class);
+
+	$self->Reset();
+
+	return $self;
+	}
+
+sub Reset()
+	{
+	my $self = shift;
+
+	$self->{tested} = 0;
+	$self->{passed} = 0;
+	}
+
+sub Test($$)
+	{
+	my $self = shift;
+	my ($passed, $testname) = @_;
+
+	if ($passed < 0)
+		{
+		$passed = 1;
+		}
+
+	$self->{tested} = $self->{tested}+1;
+	$self->{passed} = $self->{passed}+$passed;
+
+	if ($passed > 0)
+		{
+		print "-- $testname...OK\n";
+		}
+	else
+		{
+		print "*#*#* $testname...FAILED\n";
+		}
+	}
+
+sub Print()
+	{
+	my $self = shift;
+
+	my $tested = $self->{tested};
+	my $passed = $self->{passed};
+	my $score;
+	if ($tested == 0)
+		{
+		$score = "undefined";
+		}
+	else
+		{
+		$score = int($passed/$tested*100);
+		}
+
+	print $score."% pass rate; of $tested tests run, $passed passed, ".($tested-$passed)." failed.\n";
+	}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/runtests.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# \bin\perl
+# Test harness
+# 
+#
+
+use lib qw(../);
+use lib qw(../stages);
+
+use unit_CConfig;
+use unit_CProcessStage;
+use unit_CStageRunner;
+use unit_stage_CDelta;
+
+use CTestScore;
+
+my $score = New CTestScore();
+
+if (!defined($score))
+	{
+	exit(1);
+	}
+
+$score = unit_CConfig::RunTest($score);
+$score = unit_CProcessStage::RunTest($score);
+$score = unit_CStageRunner::RunTest($score);
+$score = unit_stage_CDelta::RunTest($score);
+
+$score->Print();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/unit_CConfig.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,236 @@
+#!bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Unit test for CConfig
+# 
+#
+
+package unit_CConfig;
+
+use lib qw(../);
+use lib qw(../stages);
+use FindBin;
+use Cwd;
+use lib $FindBin::Bin."\\..";
+use CConfig;
+use CTestScore;
+
+sub RunTest($)
+	{
+	my ($testscore) = @_;
+
+	print "> *** Testing CConfig ***\n";
+
+	if (!defined($testscore))
+		{
+		$testscore = New CTestScore();
+		}
+	
+	if (!defined($ENV{TEMP}))
+		{
+		print STDOUT "TEMP environment variable must be defined before testing of CConfig is run.\n";
+		return $testscore;
+		}
+		
+	my $testFilename = $ENV{TEMP}."\\CConfig.tst";
+	
+	if (-e $testFilename)
+		{
+		print STDOUT "File '$testFilename' already exists.\nPlease delete this file to enable testing of CConfig.\n";
+		return $testscore;
+		}
+		
+	open(TESTFILE,">$testFilename");
+	print TESTFILE "Key:value\n";
+	close(TESTFILE);
+
+	my $testConfig=New CConfig($testFilename);
+	
+	$testscore->Test($testConfig->Get("Key") eq "value", "Loaded in file");
+	$testscore->Test($testConfig->Get("kEy") eq "value", "Tested key case insensitivity");
+	$testscore->Test($testConfig->Set("key:2", "value2"), "Set extra key");
+	$testscore->Test( ($testConfig->Get("Key") eq "value") && ($testConfig->Get("key:2") eq "value2"), "Returned all key values");
+	$testscore->Test(!defined($testConfig->Get("nokey")), "Getting invalid key is undefined");
+	$testscore->Test($testConfig->Set("key3", ["value3","value4"]), "Set list value");
+	my $listref=$testConfig->Get("key3");
+	$testscore->Test( (ref($listref) eq "ARRAY") && (($listref->[0]) eq "value3") && (($listref->[1]) eq "value4"), "Returned list value");
+	$testscore->Test($testConfig->Save($testFilename), "Saved file");
+	$testConfig->Set("key4", "value5");
+	$testscore->Test($testConfig->Reload($testFilename), "Loaded file");
+	$listref=$testConfig->Get("key3");
+	$testscore->Test( ($testConfig->Get("Key") eq "value") && ($testConfig->Get("key:2") eq "value2") && (ref($listref) eq "ARRAY") && (($listref->[0]) eq "value3") && (($listref->[1]) eq "value4") && (!defined( $testConfig->Get("key4") )), "Returned all key values");
+	$testscore->Test(!($testConfig->Set(undef, "val")), "Can't set undefined key");
+	$testscore->Test(!($testConfig->Set("key5", undef)), "Can't set undefined value");
+	$testscore->Test($testConfig->Set("key6", ""), "Can set empty value");
+	$testscore->Test($testConfig->Set("", "val"), "Can set empty key");
+	$testscore->Test(!($testConfig->Set("key7", {"hashkey"=>"hashval"})), "Can't set hash value");
+  
+  # Support for additional behaviour to handle Error message, scanlog format etc.
+	my $logFilename = "CConfig_scanlog.log";
+  TestConfigStatus($testConfig, $testscore);
+  TestLogFile($testFilename, $logFilename, $testscore);
+  ValidateLogFile($logFilename, $testscore);
+	unlink $logFilename;
+  TestDieConditions($testFilename, $testscore);
+	unlink $testFilename;
+  
+	return $testscore;
+	} 
+
+sub TestConfigStatus($$)
+  {
+  my $testConfig = shift;
+  my $testScore = shift;
+  # First check the initial internal state of CConfig
+  $testScore->Test($testConfig->{iPhaseErrorCount} == 0, "Initial error count is zero");
+  $testScore->Test(!defined ($testConfig->{iPhase}), "Initial undefined initial phase");
+  }
+
+# This writes out a log file
+sub TestLogFile($$)
+	{
+  my $testFilename = shift;
+  my $logFilename = shift;
+  my $testScore = shift;
+  my $testConfig = New CConfig($testFilename);
+  # This puts a logfile in the current working directory
+  # i.e. test/CConfig.log
+	#my $logFilename = "CConfig_scanlog.log";
+  $testConfig->SetLog($logFilename);
+  #$testConfig->Command("Command");
+  $testConfig->PhaseStart("Phase_1");
+  $testScore->Test($testConfig->{iPhase} eq "Phase_1", "Phase_1 defined");
+  $testConfig->Component("Component_1");
+  $testConfig->Error("Phase_1 error message");
+  $testConfig->Warning("Phase_1 warning message");
+  my $phaseErrors = $testConfig->PhaseEnd();
+  $testScore->Test($phaseErrors == 1, "Phase_1 reported 1 error");
+  $testConfig->PhaseStart("Phase_2");
+  $testConfig->Warning("Phase_2 warning message");
+  $testConfig->Print("Opening Phase_3 should finish Phase_2");  
+  $testConfig->PhaseStart("Phase_3");
+  $testScore->Test(1, "Phase switching didn't die");
+  $phaseErrors = $testConfig->PhaseEnd();
+  $testScore->Test($phaseErrors == 0, "Phase_3 reported no errors");
+  #my $logPath = cwd()."/".$logFilename;
+  #print "> *** Please check CConfig log file at $logPath ***\n";
+  $testScore->Test(1, "Logfile \"$logFilename\" written");
+  }
+
+sub ValidateLogFile($$)
+  {
+  # This is the expected log file output - without the date/time stamp
+  my $logFilename = shift;
+  my $testScore = shift;
+  my $logFileExpected = "===-------------------------------------------------
+=== Phase_1
+===-------------------------------------------------
+=== Phase_1 started 
+=== Phase_1 == Component_1
+ERROR: Phase_1 error message
+WARNING: Phase_1 warning message
+=== Phase_1 finished 
+===-------------------------------------------------
+=== Phase_2
+===-------------------------------------------------
+=== Phase_2 started 
+WARNING: Phase_2 warning message
+Opening Phase_3 should finish Phase_2
+=== Phase_2 finished 
+===-------------------------------------------------
+=== Phase_3
+===-------------------------------------------------
+=== Phase_3 started 
+=== Phase_3 finished 
+";
+  $testScore->Test($logFileExpected eq ReadTimelessLogFile($logFilename), "Logfile \"$logFilename\" matches");
+  }
+
+# Read a scanlog file and strip the time/date stamp
+sub ReadTimelessLogFile($)
+  {
+    my $filename = shift;
+    my $retVal;
+  	open(LOGFILE,"$filename");
+    while (defined (my $line = <LOGFILE>))
+      {
+      if ($line =~ m/.+started .+/)
+        {
+        $line =~ s/(.+started ).+/$1/;
+        }
+      elsif ($line =~ m/.+finished .+/)
+        {
+        $line =~ s/(.+finished ).+/$1/;
+        }
+      $retVal .= $line;
+      }
+    #print "\nParsed:\n";
+    #print $retVal;
+    return $retVal;
+  }
+
+sub TestDieConditions($$)
+  {
+    my $testFilename = shift;
+    my $testScore = shift;
+    my $testConfig;
+    my $logFilename = "CConfig_scrap.log";
+    # Try a direct Die() call
+    $testConfig = New CConfig($testFilename);
+    eval
+      {
+      $testConfig->Die("Die message.");
+      };
+    if ($@) {
+      $testScore->Test(1, "Died on Die() command");
+    } else {
+      $testScore->Test(0, "Failed to die on Die() command");
+    }
+    # Try setting SetErrorDie() then calling Error()
+    $testConfig = New CConfig($testFilename);
+    $testConfig->SetLog($logFilename);
+    # Try PhaseEnd() before any PhaseStart() has been called
+    $testConfig = New CConfig($testFilename);
+    $testConfig->SetLog($logFilename);
+    eval
+      {
+      # No PhaseStart() has been made so a PhaseEnd() should fail
+      $testConfig->PhaseEnd();
+      };
+    if ($@) {
+      $testScore->Test(1, "Died on PhaseEnd() command when there was no prior PhaseStart()");
+    } else {
+      $testScore->Test(0, "Failed to die on PhaseEnd() command");
+    }
+    # Try setting provoking PhaseEnd() when phase has errors
+    $testConfig = New CConfig($testFilename);
+    $testConfig->SetLog($logFilename);
+    $testConfig->PhaseStart("Error_Phase_1");
+    $testConfig->Error("Error message.");
+    eval
+      {
+      # Here is the killer line that should cause it to fail.
+      # Phase 1 has an error but the phase has not been collected
+      # before starting False_Phase_2
+      $testConfig->PhaseStart("False_phase_2");
+      };
+    if ($@) {
+      $testScore->Test(1, "Died on PhaseStart() command when previous phase had Error() calls");
+    } else {
+      $testScore->Test(0, "Failed to die on Error() command");
+    }
+  	unlink $logFilename;
+  }
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/unit_CProcessStage.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,68 @@
+#!bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Unit test for CProcessStage (Stage base class)
+# 
+#
+
+package unit_CProcessStage;
+
+use lib qw(../);
+use lib qw(../stages);
+use FindBin;
+use lib $FindBin::Bin."\\..";
+use CProcessStage;
+use CTestScore;
+
+sub RunTest($)
+	{
+	my ($testscore) = @_;
+
+	print "> *** Testing CProcessStage ***\n";
+
+	if (!defined($testscore))
+		{
+		$testscore = New CTestScore();
+		}
+	
+	if (!defined($ENV{TEMP}))
+		{
+		print STDOUT "TEMP environment variable must be defined before testing of CProcessStage is run.\n";
+		return $testscore;
+		}
+		
+	my $testFilename = $ENV{TEMP}."\\CConfig.tst";
+	
+	if (-e $testFilename)
+		{
+		print STDOUT "File '$testFilename' already exists.\nPlease delete this file to enable testing of CProcessStage.\n";
+		return $testscore;
+		}
+		
+	open(TESTFILE,">$testFilename");
+	print TESTFILE "key:value\n";
+	close(TESTFILE);
+
+	my $testConfig=New CConfig($testFilename);
+	my $testStage=New CProcessStage($testConfig);
+	unlink $testFilename;
+	
+	$testscore->Test($testStage->iOptions()->Get("key") eq "value", "Created stage with expected options");
+	$testscore->Test($testStage->PreCheck(), "Base implementation of PreCheck returns true (OK)");
+	$testscore->Test($testStage->Run(), "Base implementation of Run returns true (OK)");
+
+	return $testscore;
+	} 
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/unit_CStageRunner.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,70 @@
+#!bin\perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Unit test for CStageRunner
+# 
+#
+
+package unit_CStageRunner;
+
+use lib qw(../);
+use lib qw(../stages);
+use FindBin;
+use lib $FindBin::Bin."\\..";
+use CStageRunner;
+use CTestScore;
+
+sub RunTest($)
+	{
+	my ($testscore) = @_;
+
+	print "> *** Testing CStageRunner ***\n";
+
+	if (!defined($testscore))
+		{
+		$testscore = New CTestScore();
+		}
+	
+	if (!defined($ENV{TEMP}))
+		{
+		print STDOUT "TEMP environment variable must be defined before testing of CStageRunner is run.\n";
+		return $testscore;
+		}
+		
+	my $testFilename = $ENV{TEMP}."\\CConfig.tst";
+	
+	if (-e $testFilename)
+		{
+		print STDOUT "File '$testFilename' already exists.\nPlease delete this file to enable testing of CStageRunner.\n";
+		return $testscore;
+		}
+		
+	open(TESTFILE,">$testFilename");
+	print TESTFILE "key:value\n";
+	close(TESTFILE);
+
+	my $testConfig=New CConfig($testFilename);
+	unlink $testFilename;
+
+	my $testStageRunner = eval("New CStageRunner([\"CExampleStage\"], \$testConfig);");
+	$testscore->Test(defined($testStageRunner), "Instantiated example stage runner");
+	$testscore->Test($testStageRunner->Run(), "Run example stage runner");
+
+	$testStageRunner = eval("New CStageRunner([\"CNonexistantStage\"], \$testConfig);");
+	$testscore->Test(!defined($testStageRunner), "Didn't instantiate bad stage");
+
+	return $testscore;
+	} 
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/makecbr/test/unit_stage_CDelta.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,365 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package unit_stage_CDelta;
+use strict;
+
+use lib qw(../);
+use lib qw(../stages);
+use Archive::Zip qw(:ERROR_CODES);
+use CConfig;
+use CDelta;
+use Cwd;
+use Data::Dumper;
+use Fcntl;
+use File::Basename;
+use File::Path;
+use File::Spec;
+use File::Temp qw(tempfile tempdir);
+
+# constructor
+
+sub RunTest {
+
+    my $score = shift;
+
+	print "> *** Testing CDelta ***\n";
+
+    my $self = bless { score => $score };
+
+    # initial set-up
+    $self->init();
+
+    # N.B. the order of the following tests is important
+    #      as each progressively sets up the environment
+    #      for the next.
+
+    # test methods of CDelta
+    $self->t_ListReleaseComponents();
+    $self->t_ListPreviousComponents();
+    $self->t_ListPreinstalledComponents();
+    $self->t_ListDirtyComponents();
+    $self->t_PrepComponents();
+
+    # clean up
+    $self->exit();
+
+	return $score;
+}
+
+# init() and exit() methods
+
+sub init { # sets up CDelta object and dummy environment
+
+    my $self = shift;
+
+    # create GT components list
+    $self->{gtlist} = {
+        foo    => 'src/foo/group/foo.mrp',
+        qux    => 'src/qux/group/qux.mrp',
+        quux   => 'src/quux/group/quux.mrp',
+        corge  => 'src/corge/group/corge.mrp',
+        grault => 'src/grault/group/grault.mrp',
+        garply => 'src/garply/group/garply.mrp',
+        waldo  => 'src/waldo/group/waldo.mrp',
+        fred   => 'src/fred/group/fred.mrp',
+        plugh  => 'src/plugh/group/plugh.mrp',
+        xyzzy  => 'src/xyzzy/group/xyzzy.mrp',
+        thud   => 'src/thud/group/thud.mrp',
+        mos    => 'src/mos/group/mos.mrp',
+        henk   => 'src/henk/group/henk.mrp',
+        def    => 'src/def/group/def.mrp',
+        bar    => 'src/bar/group/bar.mrp' };
+
+    my $gtlist = $self->TempFile($self->Stringify($self->{gtlist}));
+
+    # create TV components list
+    $self->{tvlist} = {
+        baz                  => 'src/baz/group/baz.mrp',
+        mighty               => 'src/mighty/group/mighty.mrp',
+        boosh                => 'src/boosh/group/boosh.mrp',
+        gt_techview_baseline => 'src/gt_techview_baseline/group/gt_techview_baseline.mrp' };
+
+    my $tvlist = $self->TempFile($self->Stringify($self->{tvlist}));
+
+    # escape colons in paths so CConfig won't (irrationally) complain
+    $gtlist =~ s/:/\\:/g;
+    $tvlist =~ s/:/\\:/g;
+
+    # create config file including paths generated above
+    my $config = $self->TempFile(<<CONFIG);
+
+GT+Techview baseline component name : gt_techview_baseline
+Last baseline version : 1.0
+Max Parallel Tasks : 4
+GT component list : $gtlist
+Techview component list : $tvlist
+Release version : 1.1
+Internal version : 1.1
+
+CONFIG
+
+    # create CConfig object
+    $self->{config} = CConfig->New($config);
+
+    # create CDelta object
+    $self->{cdelta} = eval { CDelta->New($self->{config}) };
+
+    # show the error if any
+    print $@ if defined $@;
+
+    # did it work?
+    $self->Test(!$@, 'Create CDelta object (implicit config validation)');
+
+    # move to a temporary directory so we can set up environment
+    $self->{tempdir} = tempdir(CLEANUP => 0);
+
+    # remember current settings
+    $self->{old} = {
+        cwd      => cwd(),
+        EPOCROOT => $ENV{EPOCROOT},
+        SRCROOT  => $ENV{SRCROOT} };
+
+    # chdir to the temp directory
+    chdir($self->{tempdir}) or die "Can't chdir to temporary directory\n";
+
+    # set EPOC/SRCROOT to the temporary directory (substr trims drive letter)
+    $ENV{EPOCROOT} = $ENV{SRCROOT} = substr($self->{tempdir}, 2).'\\';
+
+    # create reltools.ini pointing to the current directory as the local archive
+    $self->TempFile(
+        "archive_path test $self->{tempdir} /archive\ndisable_win32_extensions",
+        File::Spec->catfile(qw(epoc32 relinfo reltools.ini)));
+
+    # determine baseline
+    $self->{baseline} = {
+        name    => $self->{config}->Get('GT+Techview baseline component name'),
+        version => $self->{config}->Get('Last baseline version')};
+
+    # create dummy reldata
+    $self->{reldata} = {
+        toolName => "$0 (${\__PACKAGE__})",
+        env      => {
+            $self->{baseline}{name} => $self->{baseline}{version},
+            foo                     => '1.0',
+            qux                     => '1.0',
+            quux                    => '1.0',
+            corge                   => '1.0',
+            grault                  => '1.0',
+            garply                  => '1.0',
+            waldo                   => '1.0',
+            fred                    => '1.0',
+            plugh                   => '1.0',
+            xyzzy                   => '1.0',
+            thud                    => '1.0',
+            mos                     => '1.0',
+            henk                    => '1.0',
+            def                     => '1.0',
+            boosh                   => '1.0',
+            baz                     => '1.0',
+            mighty                  => '1.0',
+            bar                     => '1.0' } };
+
+    # create dummy archive components
+    for my $component (keys %{$self->{reldata}{env}}) {
+
+        my $version = $self->{reldata}{env}{$component};
+
+        # create dummy reldata
+        $self->TempFile(
+            Data::Dumper->Dump([$self->{reldata}], ['self->{data}']),
+            File::Spec->catfile($component, $version, 'reldata'));
+
+        # create source zip file
+        my $zip = Archive::Zip->new();
+
+        $zip->addString('/* dummy */', "src/$component/$component.cpp");
+        $zip->addString(<<EOMRP, "src/$component/group/$component.mrp");
+
+component $component
+source \\src\\$component
+notes_source \\src\\$component\\readme.txt
+
+EOMRP
+
+        # write to sourceE.zip
+        my $file = File::Spec->catfile($component, $version, 'sourceE.zip');
+        $zip->writeToFileNamed($file) == AZ_OK or die "Couldn't create $file: $!\n";
+
+    }
+
+    # use CDelta to run getenv (_prefix means private but we're testing!)
+    my $command = qq(getenv -sov -i $self->{tempdir} $self->{baseline}{name} $self->{baseline}{version});
+
+    $self->{cdelta}->_runcmd($command) == 0 or die "Couldn't prepare test environment\n";
+
+    # dirty the foo component
+    unlink(File::Spec->catfile(qw(src foo foo.cpp)));
+
+    # start CConfig phase - CDelta logging expects a phase to be active
+    $self->{config}->PhaseStart('Testing CDelta');
+}
+
+sub exit { # cleans up temp files and restores original environment
+    my $self = shift;
+
+    # delete temp files
+    unlink for grep -e, @{$self->{tempfiles}};
+
+    # chdir back to original working directory
+    if (!chdir($self->{old}{cwd})) {
+       die("Can't chdir back to original working directory ($self->{old}{cwd})\n");
+    }
+
+    # return EPOC/SRCROOT to previous settings
+    $ENV{EPOCROOT} = $self->{old}{EPOCROOT};
+    $ENV{SRCROOT} = $self->{old}{SRCROOT};
+
+    # complete phase
+    $self->{cdelta}->PhaseEnd();
+}
+
+# utility methods
+
+sub Stringify { # creates a consistent string representation of a ref
+
+    my $self = shift;
+    my $ref = shift;
+
+    if (UNIVERSAL::isa($ref, 'HASH')) {
+
+        # sorted_key[space]value\n...
+        return join("\n", map { join(' ', $_, $ref->{$_}) } sort keys %$ref);
+
+    } elsif (UNIVERSAL::isa($ref, 'ARRAY')) {
+
+        # sorted space separated
+        return join(' ', sort @$ref);
+    }
+
+    return '';
+}
+
+sub TempFile { # writes data to a tempfile (optionally anonymous) and returns its path
+
+    my $self = shift;
+    my $data = shift;
+    my $file = shift;
+
+    # create anonymous tempfile or open specified file for writing
+    my($fh, $filename) = !defined $file ? tempfile(UNLINK => 0, DIR => $self->{tempdir}) : do {
+        my $dir = dirname($file);
+        mkpath($dir) if !-d $dir;
+        open(FH, ">$file") or die "Couldn't open $file: $!\n";
+        (\*FH, $file);
+    };
+
+    # add to list of tempfiles (for later deletion)
+    push @{$self->{tempfiles}}, $filename;
+    print $fh $data;
+    close($fh);
+
+    return $filename;
+}
+
+sub Test { # delegator method - calls the supplied CTestScore->Test
+
+    my $self = shift;
+
+    # run test using CTestScore object
+    return $self->{score}->Test(@_);
+}
+
+# test methods
+
+sub t_ListReleaseComponents { # tests CDelta::ListReleaseComponents
+
+    my $self = shift;
+
+    # call ListReleaseComponents
+    my $components = $self->{cdelta}->ListReleaseComponents();
+
+    # make expected result by combining the two component lists
+    my $expected = { %{$self->{gtlist}}, %{$self->{tvlist}} };
+
+    # compare string representations of both lists
+    $self->Test(
+        $self->Stringify($components) eq $self->Stringify($expected),
+        'Check ListReleaseComponents output');
+}
+
+sub t_ListPreviousComponents { # tests CDelta::ListPreviousComponents
+
+    my $self = shift;
+
+    # call ListPreviousComponents
+    my $components = $self->{cdelta}->ListPreviousComponents(
+        $self->{baseline}{name}, $self->{baseline}{version});
+
+    # expected test result is the dummy environment
+    my $expected = $self->{reldata}{env};
+
+    # test ListPreviousComponents return value
+    $self->Test(
+        $self->Stringify($components) eq $self->Stringify($expected),
+        'Check ListPreviousComponents output');
+}
+
+sub t_ListPreinstalledComponents { # tests CDelta::ListPreinstalledComponents
+
+    my $self = shift;
+
+    # call ListPreinstalledComponents
+    my $components = $self->{cdelta}->ListPreinstalledComponents();
+
+    # make expected test result from the dummy environment
+    my $expected = { map { ($_, $self->{reldata}{env}{$_}) } keys %{$self->{reldata}{env}} };
+
+    # test ListPreinstalledComponents return value
+    $self->Test(
+        $self->Stringify($components) eq $self->Stringify($expected),
+        'Check ListPreinstalledComponents output');
+}
+
+sub t_ListDirtyComponents { # tests CDelta::ListDirtyComponents
+
+    my $self = shift;
+
+    # call ListDirtyComponents
+    my $components = $self->{cdelta}->ListDirtyComponents($self->{reldata}{env});
+
+    # make expected result
+    my $expected = ['foo'];
+
+    # test ListDirtyComponents return value
+    $self->Test(
+        $self->Stringify($components) eq $self->Stringify($expected),
+        'Check ListDirtyComponents output');
+}
+
+sub t_PrepComponents { # tests CDelta::PrepComponents
+
+    my $self = shift;
+
+    # call PrepComponents
+    my $status = $self->{cdelta}->PrepComponents(
+        ['foo', $self->{baseline}{name}],
+        { %{$self->{gtlist}}, %{$self->{tvlist}} });
+
+    # test PrepComponents return value
+    $self->Test($status == 1, 'Check PrepComponents output');
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/zdelta-2.1/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+// 
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+// 
+// Contributors:
+// 
+// Description:
+// 
+
+PRJ_PLATFORMS
+
+PRJ_EXPORTS
+
+../zdc.exe	   /tools/zdelta-2.1/zdc.exe
+../zdu.exe	   /tools/zdelta-2.1/zdu.exe
+
+PRJ_MMPFILES
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/zdelta-2.1/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOTESRC_RELEASER
+Symbian Software Ltd.
+
+NOTESRC_RELEASE_REASON
+Zdelta tools.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/releasing/zdelta-2.1/group/zdelta-2.1.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+# 
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+# 
+# Description:
+# 
+
+component dev_build_releasing_zdelta-2.1
+
+source \src\tools\build\releasing\zdelta-2.1
+exports \src\tools\build\releasing\zdelta-2.1\group
+
+notes_source \src\tools\build\releasing\zdelta-2.1\group\release.txt
+
+ipr T
\ No newline at end of file
Binary file releasing/zdelta-2.1/zdc.exe has changed
Binary file releasing/zdelta-2.1/zdu.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/abld.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1107 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+
+use lib $PerlLibPath;
+use E32env;
+use CheckSource;
+use FCLoggerUTL;
+use featurevariantparser;
+
+if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		
+			$ENV{MAKE} = 'make' unless defined $ENV{MAKE};
+}
+
+# command data structure
+my %Commands=(
+	BUILD=>{
+		build=>1,
+		program=>1,
+		what=>1,
+		function=>'Combines commands EXPORT,MAKEFILE,LIBRARY,RESOURCE,TARGET,FINAL',
+		subcommands=>['EXPORT','MAKEFILE', 'LIBRARY', 'RESOURCE', 'TARGET', 'FINAL'],
+		savespace=>1,
+        instructionset=>1,
+		debug=>1,
+		no_debug=>1,
+		logfc=>1,
+		checksource=>1,
+		wrap=>1, #To support Compiler wrapper option along with BUILD command
+	},
+	CLEAN=>{
+		build=>1,
+		program=>1,
+		function=>'Removes everything built with ABLD TARGET',
+		what=>1,
+	},
+	CLEANALL=>{
+		program=>1,
+		function=>'Removes everything built with ABLD TARGET',
+		what=>1,
+	},
+	CLEANEXPORT=>{
+		function=>'Removes files created by ABLD EXPORT',
+		what=>1,
+		noplatform=>1,
+	},
+	CLEANMAKEFILE=>{
+		program=>1,
+		function=>'Removes files generated by ABLD MAKEFILE',
+		what=>1,
+		hidden=>1,
+	},
+	EXPORT=>{
+		noplatform=>1,
+		what=>1,
+		function=>'Copies the exported files to their destinations',
+	},
+	FINAL=>{
+		build=>1,
+		program=>1,
+		function=>'Allows extension makefiles to execute final commands',
+	},
+	FREEZE=>{
+		program=>1,
+		remove=>1,
+		function=>'Freezes exported functions in a .DEF file',
+	},
+	HELP=>{
+		noplatform=>1,
+		function=>'Displays commands, options or help about a particular command',
+		notest=>1,
+	},
+	LIBRARY=>{
+		program=>1,
+		function=>'Creates import libraries from the frozen .DEF files',
+	},
+	LISTING=>{
+		build=>1,
+		program=>1,
+		function=>'Creates assembler listing file for corresponding source file',
+		source=>1,	
+	},
+	MAKEFILE=>{
+		program=>1,
+		function=>'Creates makefiles or IDE workspaces',
+		what=>1,
+		savespace=>1,
+		instructionset=>1,
+		debug=>1,
+		no_debug=>1,
+		logfc=>1,
+		wrap=>1, #To support Compiler wrapper option along with MAKEFILE command
+        },
+	REALLYCLEAN=>{
+		build=>1,
+		program=>1,
+		function=>'As CLEAN, but also removes exported files and makefiles',
+		what=>1,
+		subcommands=>['CLEANEXPORT', 'CLEAN', 'CLEANALL'],
+	},
+	RESOURCE=>{
+		build=>1,
+		program=>1,
+		function=>'Creates resource files, bitmaps and AIFs',
+	},
+#	ROMFILE=>{
+#		function=>'Under development - syntax not finalised',
+#		noverbose=>1,
+#		nokeepgoing=>1,
+#		hidden=>1,
+#	},
+	ROMFILE=>{
+		noverbose=>1,
+		build=>1,
+		program=>1,
+		function=>'generates an IBY file to include in a ROM'
+	},
+	SAVESPACE=>{
+		build=>1,
+		program=>1,
+		what=>1,
+		function=>'As TARGET, but deletes intermediate files on success',
+		hidden=>1, # hidden because only used internally from savespace flag
+	},
+	TARGET=>{
+		build=>1,
+		program=>1,
+		what=>1,
+		function=>'Creates the main executable and also the resources',
+		savespace=>1,
+		checksource=>1,
+		wrap=>1, #To support Compiler wrapper option along with TARGET command
+	},
+	TIDY=>{
+		build=>1,
+		program=>1,
+		function=>'Removes executables which need not be released',
+	}
+);
+
+# get the path to the bldmake-generated files
+# we can perhaps work this out from the current working directory in later versions
+my $BldInfDir;
+my $PrjBldDir;
+BEGIN {
+	$BldInfDir=shift @ARGV;
+	$PrjBldDir=$E32env::Data{BldPath};
+	$PrjBldDir=~s-^(.*)\\-$1-o;
+	$PrjBldDir.=$BldInfDir;
+	$PrjBldDir=~m-(.*)\\-o; # remove backslash because some old versions of perl can't cope
+	unless (-d $1) {
+		die "ABLD ERROR: Project Bldmake directory \"$PrjBldDir\" does not exist\n";
+	}
+}
+
+# check the platform module exists and then load it
+BEGIN {
+	unless (-e "${PrjBldDir}Platform.pm") {
+		die "ABLD ERROR: \"${PrjBldDir}Platform.pm\" not yet created\n";
+	}
+}
+use lib $PrjBldDir;
+use Platform;
+
+# change directory to the BLD.INF directory - we might begin to do
+# things with relative paths in the future.
+chdir($BldInfDir) or die "ABLD ERROR: Can't CD to \"$BldInfDir\"\n";
+
+# MAIN PROGRAM SECTION
+{
+
+#	PROCESS THE COMMAND LINE
+	my %Options=();
+	unless (@ARGV) {
+		&Usage();
+	}
+
+#	Process options and check that all are recognised
+# modified start: added functionality checkwhat
+	unless (GetOptions(\%Options, 'checkwhat|cw','check|c', 'keepgoing|k', 'savespace|s', 'verbose|v',
+						'what|w', 'remove|r', 'instructionset|i=s',
+						'checksource|cs', 'debug','no_debug', 'logfc|fc','wrap:s')) { 
+		exit 1;
+	}
+# modified end: added functionality checkwhat
+
+#	check the option combinations
+# modified start: added functionality checkwhat
+	if ($Options{checkwhat} ) { 
+		$Options{check}=1;
+	}
+# modified end: added functionality checkwhat
+	if (($Options{check} and $Options{what})) {
+		&Options;
+	}
+	if (($Options{check} or $Options{what}) and ($Options{keepgoing} or $Options{savespace} or $Options{verbose})) {
+		&Options();
+	}
+	if ($Options{checksource} and $Options{what}) {
+		&Options();
+	}
+
+
+#	take the test parameter out of the command-line if it's there
+	my $Test='';
+	if (@ARGV && $ARGV[0]=~/^test$/io) {
+		$Test='test';
+		shift @ARGV;
+	}
+
+#	if there's only the test parameter there, display usage
+	unless (@ARGV) {
+		&Usage();
+	}
+
+#	get the command parameter out of the command line
+	my $Command=uc shift @ARGV;
+	unless (defined $Commands{$Command}) {
+		&Commands();
+	}
+	my %CommandHash=%{$Commands{$Command}};
+
+#	check the test parameter is not specified where it shouldn't be
+	if ($Test and $CommandHash{notest}) {
+		&Help($Command);
+	}
+
+#	check the options are suitable for the commands
+#	-verbose and -keepgoing have no effect in certain cases
+	if ($Options{what} or $Options{check}) {
+		unless ($CommandHash{what}) {
+			&Help($Command);
+		}
+	}
+	#Function Call Logger
+	if ($Options{logfc}) {
+		unless ($CommandHash{logfc}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{savespace}) {
+		unless ($CommandHash{savespace}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{instructionset}) {
+		unless ($CommandHash{instructionset}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{debug}) {
+		unless ($CommandHash{debug}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{no_debug}) {
+		unless ($CommandHash{no_debug}) {
+			&Help($Command);
+		}
+	}
+
+	if ($Options{keepgoing}) {
+		if ($CommandHash{nokeepgoing}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{verbose}) {
+		if ($CommandHash{noverbose}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{remove}) {
+		unless ($CommandHash{remove}) {
+			&Help($Command);
+		}
+	}
+	if ($Options{checksource}) {
+		unless ($CommandHash{checksource}) {
+			&Help($Command);
+		}
+	}
+	#Compiler Wrapper support 
+	if (exists $Options{wrap}) {
+		unless ($CommandHash{wrap}) {
+			&Help($Command);
+		}
+	}
+
+#	process help command if necessary
+	if ($Command eq 'HELP') {
+		if (@ARGV) {
+			my $Tmp=uc shift @ARGV;
+			if (defined $Commands{$Tmp}) {
+				&Help($Tmp);
+			}
+			elsif ($Tmp eq 'OPTIONS') {
+				&Options();
+			}
+			elsif ($Tmp eq 'COMMANDS') {
+				&Commands();
+			}
+		}
+		&Usage();
+	}
+
+#	process parameters
+	my ($Plat, $Bld, $Program, $Source)=('','','','');
+	my %MakefileVariations;
+	my $FeatureVariantArg;
+        
+#	platform parameter first
+	unless ($CommandHash{noplatform}) {
+		unless ($Plat=uc shift @ARGV) {
+			$Plat='ALL'; # default
+		}
+		else {
+			# Explicit feature variant platforms take the form <base platform>.<variant name>
+			# e.g. armv5.variant1.
+			# If valid, we actually create and invoke a distinct variation of the "base" makefile
+			if ($Plat =~ /^(\S+)\.(\S+)$/)
+				{
+				$Plat = $1;
+				$FeatureVariantArg = uc($2);
+
+				if (!$Platform::FeatureVariantSupportingPlats{$Plat})
+					{
+					die "This project does not support platform \"$Plat\.$FeatureVariantArg\"\n";
+					}
+				else
+					{						
+					$MakefileVariations{$Plat} = &GetMakefileVariations($Plat, $FeatureVariantArg);
+					}
+				}
+
+			COMPARAM1 : {
+				if (grep(/^$Plat$/, ('ALL', @Platform::Plats))) {
+					last COMPARAM1;
+				}
+				if ($Plat =~ /(.*)EDG$/) {
+				    my $SubPlat = $1;
+				    if (grep(/^$SubPlat$/, ('ALL', @Platform::Plats))) {
+					last COMPARAM1;
+				    }
+				}
+#				check whether the platform might in fact be a build, and
+#				set the platform and build accordingly if it is
+				if ($CommandHash{build}) {
+					if ($Plat=~/^(UDEB|UREL|DEB|REL)$/o) {
+						$Bld=$Plat;
+						$Plat='ALL';
+						last COMPARAM1;
+					}
+				}
+#				check whether the platform might in fact be a program, and
+#				set the platform, build and program accordingly if it is
+				if ($CommandHash{program}) {
+					if  (((not $Test) and grep /^$Plat$/, @{$Platform::Programs{ALL}})
+							or ($Test and grep /^$Plat$/, @{$Platform::TestPrograms{ALL}})) {
+						$Program=$Plat;
+						$Plat='ALL';
+						$Bld='ALL';
+						last COMPARAM1;
+					}
+				}
+#				report the error
+				if ($CommandHash{build} and $CommandHash{program}) {
+					die "This project does not support platform, build or $Test program \"$Plat\"\n";
+				}
+				if ($CommandHash{build} and not $CommandHash{program}) {
+					die "This project does not support platform or build \"$Plat\"\n";
+				}
+				if ($CommandHash{program} and not $CommandHash{build}) {
+					die "This project does not support platform or $Test program \"$Plat\"\n";
+				}
+				if (not ($CommandHash{build} or $CommandHash{program})) {
+					die "This project does not support platform \"$Plat\"\n";
+				}
+			}
+		}
+	}
+
+	#Compiler Wrapper support 
+	my $CompilerWrapperFlagMacro = "";
+	if(exists $Options{wrap})
+	{
+		my $error = "Environment variable 'ABLD_COMPWRAP' is not set\n";
+		# If tool name for wrapping compiler is set in environment variable
+		if($ENV{ABLD_COMPWRAP})
+		{
+			$CompilerWrapperFlagMacro =" ABLD_COMPWRAP_FLAG=-wrap" .  ($Options{wrap} ? "=$Options{wrap}":"");
+		}
+		elsif($Options{keepgoing})  
+		{
+		    # If Tool name is not set and keepgoing option is specified then ignore -wrap option and continue processing
+		    print $error;
+		    delete $Options{wrap};
+		}
+		else
+		{
+		    # Issue error and exit if neither keepgoing option nor tool name is specified		
+		    die $error;
+		}
+	}
+
+#	process the build parameter for those commands which require it
+	if ($CommandHash{build}) {
+		unless ($Bld) {
+			unless ($Bld=uc shift @ARGV) {
+				$Bld='ALL'; # default
+			}
+			else {
+				COMPARAM2 : {
+					if ($Bld=~/^(ALL|UDEB|UREL|DEB|REL)$/o) {
+#						Change for TOOLS, TOOLS2 and VC6TOOLS platforms
+						if ($Plat ne 'ALL') {
+							if (($Plat!~/TOOLS2?$/o and $Bld=~/^(DEB|REL)$/o) or ($Plat=~/TOOLS2?$/o and $Bld=~/^(UDEB|UREL)$/o)) {
+								die  "Platform \"$Plat\" does not support build \"$Bld\"\n";
+							}
+						}
+						last COMPARAM2;
+					}
+#					check whether the build might in fact be a program, and
+#					set the build and program if it is
+					if ($CommandHash{program}) {
+						if  (((not $Test) and grep /^$Bld$/, @{$Platform::Programs{$Plat}})
+								or ($Test and grep /^$Bld$/, @{$Platform::TestPrograms{$Plat}})) {
+							$Program=$Bld;
+							$Bld='ALL';
+							last COMPARAM2;
+						}
+						my $Error="This project does not support build or $Test program \"$Bld\"";
+						if ($Plat eq 'ALL') {
+							$Error.=" for any platform\n";
+						}
+						else {
+							$Error.=" for platform \"$Plat\"\n";
+						}
+						die $Error;
+					}
+					my $Error="This project does not support build \"$Bld\"";
+					if ($Plat eq 'ALL') {
+						$Error.=" for any platform\n";
+					}
+					else {
+						$Error.=" for platform \"$Plat\"\n";
+					}
+					die $Error;
+				}
+			}
+		}
+	}
+
+#	get the program parameter for those commands which require it
+	if ($CommandHash{program}) {
+		unless ($Program) {
+			unless ($Program=uc shift @ARGV) {
+				$Program=''; #default - means ALL
+			}
+			else {
+#				check that the program is supported
+				unless (((not $Test) and grep /^$Program$/, @{$Platform::Programs{$Plat}})
+						or ($Test and grep /^$Program$/, @{$Platform::TestPrograms{$Plat}})) {
+					my $Error="This project does not support $Test program \"$Program\"";
+					if ($Plat eq 'ALL') {
+						$Error.=" for any platform\n";
+					}
+					else {
+						$Error.=" for platform \"$Plat\"\n";
+					}
+					die $Error;
+				}
+			}
+		}
+	}
+
+#	get the source file parameter for those commands which require it
+	if ($CommandHash{source}) {
+		unless ($Source=uc shift @ARGV) {
+			$Source=''; #default - means ALL
+		}
+		else {
+			$Source=" SOURCE=$Source";
+		}
+	}
+
+#	check for too many arguments
+	if (@ARGV) {
+		&Help($Command);
+	}
+
+	if ( $Options{instructionset} )
+	{	# we have a -i option.
+		if ($Plat eq 'ARMV5')
+		{
+			if  ( !( ( uc( $Options{instructionset} ) eq "ARM") || ( uc( $Options{instructionset} ) eq "THUMB" ) ) ) {		
+				# Only ARM and THUMB options are valid. 
+				&Options();
+			}
+		}
+		else
+		{ # Can only use -i for armv5 builds. 
+			&Options();
+		}
+	}
+
+#	process CHECKSOURCE_OVERRIDE
+	if ($ENV{CHECKSOURCE_OVERRIDE} && (($Plat =~ /^ARMV5/) || ($Plat eq 'WINSCW')) && ($Command eq 'TARGET')  && !$Options{what})
+		{
+		$Options{checksource} = 1;
+		}
+	
+	my $checksourceMakeVariables = " ";	
+	if ($Options{checksource}) {
+		$checksourceMakeVariables .= "CHECKSOURCE_VERBOSE=1 " if ($Options{verbose});
+	}
+
+#	expand the platform list
+	my @Plats;
+	unless ($CommandHash{noplatform}) {
+		if ($Plat eq 'ALL') {
+			@Plats=@Platform::RealPlats;
+#			Adjust the "ALL" list according to the availability of compilers
+			@Plats=grep !/WINSCW$/o, @Plats unless (defined $ENV{MWSym2Libraries});
+			@Plats=grep !/WINS$/o, @Plats unless (defined $ENV{MSDevDir});
+			@Plats=grep !/X86$/o, @Plats unless (defined $ENV{MSDevDir});
+			@Plats=grep !/X86SMP$/o, @Plats unless (defined $ENV{MSDevDir});
+			@Plats=grep !/X86GCC$/o, @Plats unless (defined $ENV{MSDevDir});
+			@Plats=grep !/X86GMP$/o, @Plats unless (defined $ENV{MSDevDir});
+			if ($CommandHash{build}) {
+#				remove unnecessary platforms if just building for tools, or building everything but tools
+#				so that the makefiles for other platforms aren't created with abld build
+				if ($Bld=~/^(UDEB|UREL)$/o) {
+					@Plats=grep !/TOOLS2?$/o, @Plats;
+				}
+				elsif ($Bld=~/^(DEB|REL)$/o) {
+					@Plats=grep /TOOLS2?$/o, @Plats;
+				}
+			}
+		}
+        else
+        {
+			@Plats=($Plat);
+		}
+
+		foreach $Plat (@Plats)
+			{
+			# Skip platforms resolved above
+			next if $MakefileVariations{$Plat};
+				
+			# Implicit feature variant platforms apply when a default feature variant exists and the platform supports it
+			# If valid, we actually create and invoke a distinct variation of the "base" makefile
+			if ($Platform::FeatureVariantSupportingPlats{$Plat} && featurevariantparser->DefaultExists())
+				{
+				if($Command eq "REALLYCLEAN")
+					{
+					my @myfeature = featurevariantparser->GetBuildableFeatureVariants();
+					push @{$MakefileVariations{$Plat}}, ".".$_ foreach(@myfeature);
+					}
+					else
+					{
+					$MakefileVariations{$Plat} = &GetMakefileVariations($Plat, "DEFAULT");
+					}
+				}
+			else
+				{
+				# For non-feature variant platforms we always store a single makefile variation of nothing i.e.
+				# we use the "normal" makefile generated for the platform
+				$MakefileVariations{$Plat} = &GetMakefileVariations($Plat, "");
+				}
+				
+			}
+
+		foreach $Plat (@Plats) {
+			foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) {
+				unless (-e "$PrjBldDir$Plat$makefileVariation$Test.make") {
+					die "ABLD ERROR: \"$PrjBldDir$Plat$makefileVariation$Test.make\" not yet created\n";
+				}
+			}
+		}
+		undef $Plat;
+	}
+
+#	set up a list of commands where there are sub-commands
+	my @Commands=($Command);
+	if ($CommandHash{subcommands}) {
+		@Commands=@{$CommandHash{subcommands}};
+		if ($Command eq 'BUILD') { # avoid makefile listings here
+			if ($Options{what} or $Options{check}) {
+				@Commands=grep !/^MAKEFILE$/o, @{$CommandHash{subcommands}};
+			}
+		}
+	}
+#	implement savespace if necessary
+	if ($Options{savespace}) {
+		foreach $Command (@Commands) {
+			if ($Command eq 'TARGET') {
+				$Command='SAVESPACE';
+			}
+		}
+	}
+
+#	set up makefile call flags and macros from the options
+	my $KeepgoingFlag='';
+	my $KeepgoingMacro='';
+        my $NoDependencyMacro='';
+	my $VerboseMacro=' VERBOSE=-s';
+	if ($Options{keepgoing}) {
+		$KeepgoingFlag=' -k';
+		$KeepgoingMacro=' KEEPGOING=-k';
+	}
+	if ($Options{verbose}) {
+		$VerboseMacro='';
+	}
+	my $RemoveMacro='';
+	if ($Options{remove}) {
+		$RemoveMacro=' EFREEZE_ALLOW_REMOVE=1';
+	}
+	if ( ($Options{savespace}) and ($Options{keepgoing}) ){
+		$NoDependencyMacro=' NO_DEPENDENCIES=-nd';
+	}
+
+    my $AbldFlagsMacro="";
+	$AbldFlagsMacro = "-iarm " if (uc $Options{instructionset} eq "ARM");
+	$AbldFlagsMacro = "-ithumb " if (uc $Options{instructionset} eq "THUMB");
+
+	if ($Options{debug}) {
+		$AbldFlagsMacro .= "-debug ";
+	}
+	elsif($Options{no_debug}) {
+		$AbldFlagsMacro .= "-no_debug ";
+	}
+    
+	#Function call logging flag for makmake
+	if ($Options{logfc}) {
+		#Check the availability and version of logger
+		if (&FCLoggerUTL::PMCheckFCLoggerVersion()) {
+			$AbldFlagsMacro .= "-logfc ";
+		}
+	}
+
+	if(!($AbldFlagsMacro eq "") ){
+		$AbldFlagsMacro =" ABLD_FLAGS=\"$AbldFlagsMacro\"";
+	}
+
+#	set up a list of make calls
+	my @Calls;
+
+#	handle the exports related calls first
+	if (($Command)=grep /^(.*EXPORT)$/o, @Commands) { # EXPORT, CLEANEXPORT
+		unless (-e "${PrjBldDir}EXPORT$Test.make") {
+			die "ABLD ERROR: \"${PrjBldDir}EXPORT$Test.make\" not yet created\n";
+		}
+		unless ($Options {checksource}) {
+			if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+				unless ($Options{what} or $Options{check}) {
+					push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"${PrjBldDir}EXPORT$Test.make\" $Command$VerboseMacro$KeepgoingMacro";
+				}
+				else {
+					push @Calls, "$ENV{MAKE} -r -f \"${PrjBldDir}EXPORT$Test.make\" WHAT";
+				}
+			}
+			else {
+			
+				unless ($Options{what} or $Options{check}) {
+					push @Calls, "make -r $KeepgoingFlag -f \"${PrjBldDir}EXPORT$Test.make\" $Command$VerboseMacro$KeepgoingMacro";
+				}
+				else {
+					push @Calls, "make -r -f \"${PrjBldDir}EXPORT$Test.make\" WHAT";
+				}
+			}
+		}
+		@Commands=grep !/EXPORT$/o, @Commands;
+	}
+
+#	then do the rest of the calls
+
+	COMMAND: foreach $Command (@Commands) {
+
+		if ($Options {checksource} && ($Command eq "TARGET" || $Command eq "SAVESPACE")) {
+			if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+				push @Calls, "$ENV{MAKE} -r -f \"".$PrjBldDir."EXPORT.make\"".$checksourceMakeVariables."CHECKSOURCE";
+			}
+			else {
+				push @Calls, "make -r -f \"".$PrjBldDir."EXPORT.make\"".$checksourceMakeVariables."CHECKSOURCE";
+			}
+		}
+
+		my $Plat;
+		PLATFORM: foreach $Plat (@Plats) {
+
+#			set up a list of builds to carry out commands for if appropriate
+			my @Blds=($Bld);
+			if (${$Commands{$Command}}{build}) {
+				if ($Bld eq 'ALL') {
+					unless ($Plat=~/TOOLS2?$/o) { # change for platforms TOOLS, TOOLS2 and VC6TOOLS
+						@Blds=('UDEB', 'UREL');
+					}
+					else {
+						@Blds=('DEB', 'REL');
+					}
+				}
+				else {
+#					check the build is suitable for the platform - TOOLS, TOOLS2 and VC6TOOLS are annoyingly atypical
+					unless (($Plat!~/TOOLS2?$/o and $Bld=~/^(UDEB|UREL)$/o) or ($Plat=~/TOOLS2?$/o and $Bld=~/^(DEB|REL)$/o)) {
+						next;
+					}
+				}
+			}
+			else {
+				@Blds=('IRRELEVANT');
+			}
+
+			# You get CHECKSOURCE_GENERIC "for free" if no component is specified in the call
+			if ($Options {checksource} && ($Command eq "TARGET" || $Command eq "SAVESPACE") && $Program) {
+				foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) {
+					if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+						push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE_GENERIC";
+					}
+					else {
+						push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE_GENERIC";
+					}
+				}
+			}
+
+			my $LoopBld;
+			foreach $LoopBld (@Blds) {
+				my $CFG='';
+				if ($LoopBld ne 'IRRELEVANT') {
+					$CFG=" CFG=$LoopBld";
+				}
+				if ($Options {checksource}) {
+					if ($Command eq "TARGET" || $Command eq "SAVESPACE") {
+						foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) {
+							if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+								push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE$Program$CFG";	  
+							}
+							else {	
+								push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\"".$checksourceMakeVariables."CHECKSOURCE$Program$CFG";
+							}
+						}
+					}
+					next;
+				}
+				
+				unless ($Options{what} or $Options{check}) {
+					if ($Program) { # skip programs if they're not supported for a platform
+						unless ($Test) {
+							unless (grep /^$Program$/, @{$Platform::Programs{$Plat}}) {
+								next PLATFORM;
+							}
+						}
+						else {
+							unless (grep /^$Program$/, @{$Platform::TestPrograms{$Plat}}) {
+								next PLATFORM;
+							}
+						}
+					}
+   					my $AbldFlagsMacroTmp="";
+					my $CompilerWrapperFlagMacroTemp="";
+					if ($Command eq "MAKEFILE")
+					{	# Only want ABLD_FLAGS for Makefile
+                        $AbldFlagsMacroTmp=$AbldFlagsMacro;
+						if(exists ($Options{wrap}))
+						{
+							# Require ABLD_COMPWRAP_FLAG when --wrap option is specified
+							$CompilerWrapperFlagMacroTemp = $CompilerWrapperFlagMacro;
+						}
+					}
+					foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) {
+							if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+
+								if ( ($Command eq "TARGET") && (-e $PerlLibPath . "tracecompiler.pl") )
+								{
+									not scalar grep(/tracecompiler\.pl $Plat/,@Calls) and push @Calls, "perl " . $PerlLibPath . "tracecompiler.pl $Plat $Program";
+								}
+								push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""
+								." $Command$Program$CFG$Source$VerboseMacro" .
+								"$KeepgoingMacro$RemoveMacro$NoDependencyMacro" .
+								"$AbldFlagsMacroTmp$CompilerWrapperFlagMacroTemp";
+
+								#Compiler Wrapper support
+								if ( exists($Options{wrap}) && ($Options{wrap} eq "") && ($Command eq "TARGET") )
+								{
+									my $CFGCOMPWRAP='';
+									if ($LoopBld ne 'IRRELEVANT')
+									{
+										$CFGCOMPWRAP =" CFG=COMPWRAP".$LoopBld;	
+									}
+									push @Calls, "$ENV{MAKE} -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""." TARGET$Program$CFGCOMPWRAP";
+								}
+							}
+							else {	
+								push @Calls, "make -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""
+								." $Command$Program$CFG$Source$VerboseMacro" .
+								"$KeepgoingMacro$RemoveMacro$NoDependencyMacro" .
+								"$AbldFlagsMacroTmp$CompilerWrapperFlagMacroTemp";
+              
+								#Compiler Wrapper support
+								if ( exists($Options{wrap}) && ($Options{wrap} eq "") && ($Command eq "TARGET") )
+								{
+									my $CFGCOMPWRAP='';
+									if ($LoopBld ne 'IRRELEVANT')
+									{
+										$CFGCOMPWRAP =" CFG=COMPWRAP".$LoopBld;	
+									}
+									push @Calls, "make -r $KeepgoingFlag -f \"$PrjBldDir$Plat$makefileVariation$Test.make\""." TARGET$Program$CFGCOMPWRAP";
+								}
+							}
+						}
+						next;
+				}
+
+				unless (${$Commands{$Command}}{what}) {
+					next COMMAND;
+				}
+				if ($Program) { # skip programs if they're not supported for a platform
+					unless ($Test) {
+						unless (grep /^$Program$/, @{$Platform::Programs{$Plat}}) {
+							next PLATFORM;
+						}
+					}
+					else {
+						unless (grep /^$Program$/, @{$Platform::TestPrograms{$Plat}}) {
+							next PLATFORM;
+						}
+					}
+				}
+				my $Makefile='';
+				if ($Command=~/MAKEFILE$/o) {
+					$Makefile='MAKEFILE';
+				}
+
+				foreach my $makefileVariation (@{$MakefileVariations{$Plat}}) {
+					if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+					push @Calls, "$ENV{MAKE} -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\" WHAT$Makefile$Program $CFG";
+					}
+					else {
+					push @Calls, "make -r -f \"$PrjBldDir$Plat$makefileVariation$Test.make\" WHAT$Makefile$Program $CFG";
+				    }
+				}
+			}
+		}
+	}
+
+
+#	make the required calls
+
+	my $Call;
+	my %checkSourceUniqueOutput;
+	unless ($Options{what} or $Options{check}) {
+		foreach $Call (@Calls) {
+			print "  $Call\n" unless ($Options{checksource} && !$Options {verbose});
+			open PIPE, "$Call |";
+			$|=1; # bufferring is disabled
+			while (<PIPE>) {
+				if ($Options {checksource})
+					{
+					if ($Options{verbose})
+						{
+						print $_;
+						}
+					else
+						{
+						$checkSourceUniqueOutput{$_} = 1;
+						}
+					}
+				else
+					{
+					print;
+					}
+			}
+			close PIPE;
+		}
+
+		print $_ foreach (sort keys %checkSourceUniqueOutput);
+	}
+	else {
+		my %WhatCheck; # check for duplicates
+		foreach $Call (@Calls) {
+			open PIPE, "$Call |";
+			while (<PIPE>) {
+				next if (/(Nothing to be done for|Entering directory|Leaving directory) \S+\.?$/o);
+#				releasables split on whitespace - quotes possible -stripped out
+				while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) {
+					my $Releasable=($2 ? $2 : $3);
+					$Releasable =~ s/\//\\/g;	# convert forward slash into backslash
+					unless ($WhatCheck{$Releasable}) {
+						$WhatCheck{$Releasable}=1;
+						if ($Options{what}) {
+							print "$Releasable\n";
+						}
+						else {
+							if (!-e $Releasable) {
+								print STDERR "MISSING: $Releasable\n";
+							} 
+							# modified start: added functionality checkwhat
+							elsif ($Options{checkwhat}) {						 
+								print "$Releasable\n";
+							}
+							# modified end: added functionality checkwhat
+						}
+					}
+				}
+			}
+			close PIPE;
+		}
+	}
+}
+
+sub Usage () {
+	print <<ENDHERESTRING;
+Common usage : abld [test] command [options] [platform[.Feature Variant]] [build] [program]
+  where command is build, target, etc.
+    (type \"abld help commands\" for a list of commands)
+  where options are -c, -k, etc.
+    (type \"abld help options\" for a list of options)
+  where parameters depend upon the command
+    (type \"abld help <command>\" for command-specific help)
+  where parameters default to 'ALL' if unspecified
+ENDHERESTRING
+
+	print
+		"project platforms:\n",
+		"   @Platform::Plats\n"
+	;
+
+	if (%Platform::FeatureVariantSupportingPlats)
+		{
+		my @featureVariants;
+			
+		foreach my $featureVariantSupportingPlat (keys %Platform::FeatureVariantSupportingPlats)
+			{
+			push @featureVariants, $featureVariantSupportingPlat.".".$_ foreach (featurevariantparser->GetValidVariants());
+			}
+
+		if (@featureVariants)
+			{
+			@featureVariants = map{uc($_)} @featureVariants;
+			print
+				"feature variant platforms:\n",
+				"   @featureVariants\n";		
+			}
+		}
+	exit 1;
+}
+
+# modified start: added functionality checkwhat
+sub Options () {
+	print <<ENDHERESTRING;
+Options (case-insensitive) :
+  -c or -check          check the releasables are present
+  -cw or -checkwhat     combined check and what
+  -k or -keepgoing      build unrelated targets on error
+  -s or -savespace      delete intermediate files on success
+  -v or -verbose        display tools calls as they happen
+  -w or -what           list the releasables
+  -r or -remove         allow FREEZE to remove exports
+  -i thumb or -i arm    override for build ARMV5 platform options
+  -cs or -checksource   checks source conformance to Symbian's filename policy
+  -debug or -no_debug   enable/disable generation of symbolic debug information for ARM ABI compliant platforms
+  -fc or -logfc	        enable function call logging
+  -wrap[=proxy]         enable invocation of external wrapper tool
+
+ possible combinations :
+	(([-check]|[-what]|[-checkwhat])|([-k][-s][-v][-i [thumb|arm]][-cs][-debug|-no_debug][-fc][-wrap[=proxy]]))
+ENDHERESTRING
+
+	exit;
+	
+}
+# modified end: added functionality checkwhat
+
+sub Help ($) {
+	my ($Command)=@_;
+
+	my %CommandHash=%{$Commands{$Command}};
+
+	print 'ABLD';
+	unless ($CommandHash{notest}) {
+		print ' [test]';
+	}
+	print " $Command ";
+	if ($Command eq 'HELP') {
+		print '([OPTIONS|COMMANDS]|[<command>])';
+	}
+	else {
+		if ($CommandHash{what}) {
+			print '(([-c]|[-w])|';
+		}
+		if ($CommandHash{savespace}) {
+			print '[-s]';
+		}
+		if ($CommandHash{instructionset}) {
+			print '[-i thumb|arm]';
+		}
+        if ($CommandHash{remove}) {
+			print '[-r]';
+		}
+        if ($CommandHash{checksource}) {
+			print '[-cs]';
+		}
+		unless ($CommandHash{nokeepgoing}) {
+			print '[-k]';
+		}
+		unless ($CommandHash{noverbose}) {
+			print '[-v]';
+		}
+		if ($CommandHash{debug}) {
+			print '[-debug|-no_debug]';
+		}
+		if ($CommandHash{logfc}) {
+			print '[-logfc]|[-fc]';
+		}
+		if ($CommandHash{what}) {
+			print '))';
+		}
+		unless ($CommandHash{noplatform}) {
+			print ' [<platform>]';
+		}
+		if ($CommandHash{build}) {
+			print ' [<build>]';
+		}
+		if ($CommandHash{program}) {
+			print ' [<program>]';
+		}
+		if ($CommandHash{source}) {
+			print ' [<source>]';
+		}
+		if ($CommandHash{wrap}) {
+			print '[-wrap[=proxy]]';
+		}
+	}
+
+	print
+		"\n",
+		"\n",
+		"$CommandHash{function}\n"
+	;
+	exit;
+}
+
+sub Commands () {
+
+	print "Commands (case-insensitive):\n";
+	foreach (sort keys %Commands) {
+		next if ${$Commands{$_}}{hidden};
+		my $Tmp=$_;
+		while (length($Tmp) < 12) {
+			$Tmp.=' ';
+		}
+		print "  $Tmp ${$Commands{$_}}{function}\n";
+	}
+
+	exit;
+}
+
+sub GetMakefileVariations ($$)
+	{
+	my ($plat, $featureVariantArg) = @_;
+	my @variations = ();
+
+	if (!$featureVariantArg)
+		{
+		push @variations, "";
+		}
+	else
+		{
+		my @resolvedVariants = featurevariantparser->ResolveFeatureVariant($featureVariantArg);
+# modified start: makefile improvement
+		my %temp_hash =("default" => "");
+		foreach (@resolvedVariants){
+			$temp_hash{$_}="";
+		}
+			push @variations, ".".$_ foreach (keys %temp_hash);
+		}
+# modified end: makefile improvement
+	return \@variations;
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/bldmake.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+
+perl -S bldmake.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/bldmake.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2325 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# all variables called *Path* are set up to end with a backslash
+# all variables called *Path or *File are stored as absolute (file)paths within makmake
+# all variables called UpPath* are stored as relative paths within makmake
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+sub ExportDirs ($);
+
+use lib $PerlLibPath;
+use E32env;
+use E32Plat;
+use Modload;
+use Output;
+use Pathutl;
+use E32Variant;
+use RVCT_plat2set;
+use BPABIutl;
+use wrappermakefile;
+use CheckSource;
+use File::Path; # for rmtree
+use featurevariantparser;
+
+my $BldInfName = 'BLD.INF';
+my %Options;
+my %KeepGoing;
+my @DefaultPlats=('WINSCW', 'GCCXML', 'EDG', 'X86GCC');
+my @BaseUserDefaultPlats=('ARM4', 'ARM4T', 'WINSCW', 'GCCXML', 'EDG', 'X86GCC');
+my @OptionalPlats=('VS6', 'VS2003');
+my @PlatsReq;
+
+my %CheckSourceEXPORTSMetaData;
+my %CheckSourceEXPORTSIncludes;
+my %CheckSourceMMPFILESMetaData;
+my %CheckSourceEXTENSIONSMetaData;
+my %CheckSourceBldInfIncludes;
+
+for ('ARMV4', 'ARMV5')
+{
+	push @BaseUserDefaultPlats, $_ if RVCT_plat2set::compiler_exists($_);
+}
+
+# Add ARMV5_ABIV1 platform if ENABLE_ABIV2_MODE is set in variant.cfg
+my $variantABIV2Keyword = &Variant_GetMacro();
+# Add ARMV5_ABIV1 platform only after determining the presence of RVCT compiler.
+if ($variantABIV2Keyword && RVCT_plat2set::compiler_exists('ARMV5_ABIV1') ) {
+	push @OptionalPlats, 'ARMV5_ABIV1';
+}
+
+# bldmake -k shouldn't die if Extension Makefile is missing
+our $IgnoreMissingExtensionMakefile = 0;
+
+# Add the BPABI Platforms to be added 
+my @BPABIPlats = &BPABIutl_Plat_List;
+foreach my $BPABIPlat (@BPABIPlats) 
+{
+	# BPABI platform related with ARMV5(eg.ARMV5_ABIV2) is added to the platform list after 
+	# determining the presence of RVCT compiler	
+	if(($BPABIPlat =~/^ARMV5/i))
+		{
+			if(!($BPABIPlat =~/^ARMV5$/i) && RVCT_plat2set::compiler_exists('ARMV5'))
+			{
+			push @OptionalPlats, $BPABIPlat;
+			}
+		}
+	# All other BPABI platforms(eg. gcce) are added to the platform list.
+	else
+		{
+			push @OptionalPlats, $BPABIPlat;
+		}
+}
+
+if ( RVCT_plat2set::compiler_exists('ARMV5') ) {
+	#determine the presence of ARVCT compiler
+	push @DefaultPlats, 'ARMV5';
+}
+	
+# Need to add WINS and X86 if MSDEV compiler is present
+# Use MSDevDir to determine the presence of the compiler
+push @BaseUserDefaultPlats, 'WINS', 'X86' if (exists($ENV{'MSDevDir'}));
+
+my @BaseDefaultPlats = @BaseUserDefaultPlats;
+push @BaseDefaultPlats, 'X86SMP' if (grep /^X86$/, @BaseUserDefaultPlats);
+push @BaseDefaultPlats, 'ARM4SMP' if (grep /^ARM4$/, @BaseUserDefaultPlats);
+push @BaseDefaultPlats, 'ARMV4SMP' if (grep /^ARMV4$/, @BaseUserDefaultPlats);
+push @BaseDefaultPlats, 'ARMV5SMP' if (grep /^ARMV5$/, @BaseUserDefaultPlats);
+push @BaseDefaultPlats, 'X86GMP' if (grep /^X86GCC$/, @BaseUserDefaultPlats);
+
+my $variantMacroHRHFile = Variant_GetMacroHRHFile();
+sub ExportDirs ($);
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+# Load default feature variant info - for the hrh file
+my %DefaultFeatureVariant = featurevariantparser->GetVariant('DEFAULT') if (featurevariantparser->DefaultExists());
+my @FeatureVariants = featurevariantparser->GetBuildableFeatureVariants();
+	
+{
+	Load_SetModulePath($PerlLibPath);
+	Plat_Init($PerlLibPath);
+
+	{
+		my @PlatList = &Plat_List();
+		
+		if (RVCT_plat2set::compiler_exists('ARMV6')){
+			foreach my $ARMV6Target ("ARMV6", "ARMV6_ABIV1", "ARMV6_ABIV2"){
+				if (grep /^$ARMV6Target$/, @PlatList) {
+					push @BaseUserDefaultPlats, "$ARMV6Target" if (!grep /^$ARMV6Target$/, @BaseUserDefaultPlats);
+					push @BaseDefaultPlats, "$ARMV6Target" if (!grep /^$ARMV6Target$/, @BaseDefaultPlats);
+				}
+			}
+		}
+	
+		if (RVCT_plat2set::compiler_exists('ARMV7')){
+ 			my $rvct_ver = RVCT_plat2set::get_version_string('ARMV7');
+ 			if ((defined $rvct_ver) and ($rvct_ver ge "3.1.674")) {
+ 				if (grep /^ARMV7$/, @PlatList ) {
+					push @DefaultPlats, 'ARMV7' if (!grep /^ARMV7$/, @DefaultPlats);
+					push @BaseUserDefaultPlats, "ARMV7" if (!grep /^ARMV7$/, @BaseUserDefaultPlats);
+					push @BaseDefaultPlats, "ARMV7" if (!grep /^ARMV7$/, @BaseDefaultPlats);
+ 				}
+ 			}
+ 		}
+	}
+	
+#	process the commmand-line
+	unless (GetOptions(\%Options, 'v', "k|keepgoing", "notest", "file|f=s")) {
+		exit 1;
+	}
+	unless (@ARGV>=1) {
+		&Usage();
+	}
+	my $Command=uc shift @ARGV;
+	unless ($Command=~/^(BLDFILES|CLEAN|INF|PLAT)$/o) {
+		&Usage();
+	}
+	my $CLPlat=uc shift @ARGV;
+
+	unless ($CLPlat) {
+		$CLPlat='ALL';
+	}
+
+	if ($Command eq 'INF') {
+		&ShowBldInfSyntax();
+		exit;
+	}
+
+	if ($Command eq 'PLAT') {
+		my @PlatList = ($CLPlat);
+		my $PlatName;
+		# Variable introduced to check if the bldmake plat command is called, To be
+		# passed as an argument in Plat_GetL function call.
+		my $platcommand=1;
+		if ($CLPlat eq "ALL") {
+			@PlatList = &Plat_List();
+			print(
+				"Supported Platforms:\n",
+				"  @PlatList\n\n"
+			);
+		}
+		print(
+			"Macros defined for BLD.INF preprocessing of MMPFILE sections:\n"
+		);
+		foreach $PlatName (@PlatList) {
+			my %Plat;
+			eval { &Plat_GetL($PlatName, \%Plat,{},$platcommand); };
+			die $@ if $@;
+			print(
+				"\nPlatform $PlatName:\n",
+				"  @{$Plat{MmpMacros}}\n"
+			);
+		}
+		exit;
+	}
+	if ($Options{file}) {
+		$BldInfName = $Options{file};
+	}
+
+#	check that the BLD.INF file exists
+#	maybe BLDMAKE should allow a path to be specified leading to the BLD.INF file
+	my $BldInfPath=&Path_WorkPath;
+	unless (-e "${BldInfPath}$BldInfName") {
+		&FatalError("Can't find \"${BldInfPath}$BldInfName\"");
+	}
+
+	if (!-d $E32env::Data{EPOCPath}){
+		&FatalError("Directory \"$E32env::Data{EPOCPath}\" does not exist");
+	}
+
+#	decide the output directory
+	my $OutDir=&Path_Chop($E32env::Data{BldPath}).$BldInfPath;
+
+#	Work out the path for the IBY files
+	my $RomDir=&Path_Chop($E32env::Data{RomPath}).$BldInfPath;
+
+#	Work out the name for the BLD.INF module
+	my @Dirs=&Path_Dirs($BldInfPath);
+	my $Module = pop @Dirs;
+	if (lc($Module) eq 'group') {
+		$Module = pop @Dirs;
+	}
+
+	if ($Command eq 'CLEAN') {
+		unlink "${BldInfPath}ABLD.BAT";
+		$OutDir=~m-(.*)\\-o;
+		if (-d $1) { # remove backslash for test because some old versions of perl can't cope
+			opendir DIR, $1;
+			my @Files=grep s/^([^\.].*)$/$OutDir$1/, readdir DIR;
+			closedir DIR;
+			unlink @Files;
+		}
+		rmtree <$OutDir\\wrappermakefiles>;
+# modified start: makefile improvement 
+		rmtree <$OutDir\\FeatureVariantInfo>;
+# modified end: makefile improvement 
+		exit;
+	}
+
+#	parse BLD.INF - to get the platforms and the export files
+	eval { &Load_ModuleL('PREPFILE'); };
+	&FatalError($@) if $@;
+
+	my @RealPlats=();
+	my @Exports=();
+	my @TestExports=();
+	if ($Options{v}) {
+		print "Reading \"${BldInfPath}$BldInfName\" for platforms and exports\n";
+	}
+	&ParseBldInf(\@RealPlats, \@Exports, \@TestExports, $BldInfPath, 
+		$E32env::Data{EPOCIncPath}, $E32env::Data{EPOCPath}, $E32env::Data{EPOCDataPath});
+
+#       Add Customizations
+	my @additions;
+	foreach my $plat (@RealPlats) {
+	        my @customizations = Plat_Customizations($plat);
+	        foreach my $custom (@customizations) {
+	                push @additions, $custom 
+			        unless grep /$custom/, @additions;
+		}
+        }
+	unless ($CLPlat eq 'ALL') {
+		push @RealPlats, @additions;
+	}
+
+ #	Force GCCXML support for anything that compiles as ARMV5
+	if ( (grep /^ARMV5$/, @RealPlats) and not (grep /^GCCXML$/,@RealPlats) ) 
+			{
+			push @RealPlats, 'GCCXML';
+			}
+
+ #	Force EDG support for anything that compiles as ARMV5
+	if ( (grep /^ARMV5$/, @RealPlats) and not (grep /^EDG$/,@RealPlats) ) 
+			{
+			push @RealPlats, 'EDG';
+			}
+
+if (0) {
+#	Add ARMV5 to the platforms if ARM4 is defined
+	if (grep /^ARM4$/, @RealPlats) {
+		unless ( (grep /^ARMV4$/, @RealPlats) or (grep /^ARMV5$/, @RealPlats) ){
+		push @RealPlats, 'ARMV5';
+		push @RealPlats, 'ARMV4';
+		}
+	}
+}
+	
+#	get any IDE platforms required into a new platforms list, and
+#	Create a hash to contain the 'real' names of the platforms, i.e. WINS rather than VC6
+	my @Plats=@RealPlats;
+	my %Real;
+	foreach (@RealPlats) { # change to get VC6 batch files
+		$Real{$_}=$_;
+		my $AssocIDE;
+		my @AssocIDEs;
+
+#		Get the IDEs associated with a real platform. A real plat like,
+#		WINSCW may have multiple associated IDEs like VC6 .NET2003 or CW IDE.
+		&Plat_AssocIDE($_, \@AssocIDEs);
+		next unless @AssocIDEs;
+		
+		push @Plats, @AssocIDEs;
+		foreach $AssocIDE (@AssocIDEs)
+		{
+			$Real{$AssocIDE}=$Real{$_};
+		}
+		
+	}
+	if ($Options{v}) {
+		print "Platforms: \"@Plats\"\n";
+	}
+
+#	check that the platform specified on the command-line is acceptable
+#	and sort out a list of platforms to process
+	my @DoRealPlats=@RealPlats;
+	my @DoPlats=@Plats;
+
+	unless (@Plats) { 
+#	include the optional platform list if no platform is specified
+		my $OptionalPlat;
+		foreach $OptionalPlat (@OptionalPlats) {
+			unless (grep /^$OptionalPlat$/i, @DoPlats) {
+				push @DoPlats, $OptionalPlat;
+			}
+		}
+	}
+
+	unless ($CLPlat eq 'ALL') {
+		unless (grep /^$CLPlat$/, @Plats) {
+			&FatalError("Platform $CLPlat not supported by \"${BldInfPath}$BldInfName\"\n");
+		}
+		@DoPlats=($CLPlat);
+		@DoRealPlats=$Real{$CLPlat};
+	}
+			
+#	sort out the export directories we might need to make
+	my @ExportDirs=ExportDirs(\@Exports);
+	my @TestExportDirs=ExportDirs(\@TestExports);
+
+#	parse the BLD.INF file again for each platform supported by the project
+#	storing the information in a big data structure
+	my %AllPlatData;
+	my %AllPlatTestData;
+	my $Plat;
+	
+	if ($Options{v} and $CLPlat ne 'ALL'){
+		print "Reading \"${BldInfPath}$BldInfName\" for $CLPlat \n";
+	}
+
+	foreach $Plat (@RealPlats) {
+		if ($Options{v}) {
+			if ($CLPlat eq 'ALL') {
+				print "Reading \"${BldInfPath}$BldInfName\" for $Plat\n";
+			}
+		}
+		my (@PlatData, @PlatTestData);
+		if ($CLPlat eq 'ALL') {
+			&ParseBldInfPlat(\@PlatData, \@PlatTestData, $Plat, $BldInfPath, ($DefaultFeatureVariant{VALID} && &Plat_SupportsFeatureVariants($Plat) ? \%DefaultFeatureVariant : undef));
+		}
+		else {
+			&ParseBldInfPlat(\@PlatData, \@PlatTestData, $CLPlat, $BldInfPath, ($DefaultFeatureVariant{VALID} && &Plat_SupportsFeatureVariants($CLPlat) ? \%DefaultFeatureVariant : undef));
+		}
+		$AllPlatData{$Plat}=\@PlatData;
+		$AllPlatTestData{$Plat}=\@PlatTestData;
+	}
+	undef $Plat;
+
+	undef $CLPlat;
+	if ($Command eq 'BLDFILES') {
+
+#		create the perl file, PLATFORM.PM, listing the platforms
+		if ($Options{v}) {
+			print "Creating \"${OutDir}PLATFORM.PM\"\n";
+		}
+		&CreatePlatformPm($OutDir, \@Plats, \@RealPlats, \%Real, \%AllPlatData, \%AllPlatTestData);
+
+#		create the .BAT files required to call ABLD.PL
+		if ($Options{v}) {
+			print "Creating \"${BldInfPath}ABLD.BAT\"\n";
+		}
+		&CreatePerlBat($BldInfPath);
+
+#		create the makefile for exporting files
+		if ($Options{v}) {
+			print "Creating \"${OutDir}EXPORT.MAKE\"\n";
+		}
+		&CreateExportMak("${OutDir}EXPORT.MAKE", \@Exports, \@ExportDirs);
+
+#		create the makefile for exporting test files
+		if ($Options{v}) {
+			print "Creating \"${OutDir}EXPORTTEST.MAKE\"\n";
+		}
+		&CreateExportMak("${OutDir}EXPORTTEST.MAKE", \@TestExports, \@TestExportDirs);
+
+# modified start: makefile improvement 
+		#create the feature variant infor file
+		foreach my $copyofPlat (@DoPlats)
+		{
+			my $realplat = $Real{$copyofPlat};
+			if(&Plat_SupportsFeatureVariants($copyofPlat))
+			{
+				my $variant_info = &Path_Chop($E32env::Data{BldPath}).$BldInfPath."\\FeatureVariantInfo\\".$realplat."\\";	
+				eval { &Path_MakePathL($variant_info); };
+				die $@ if $@;
+				if ($Options{v}) {
+					print "Creating: \"$variant_info\"\n";
+				}
+				foreach my $featureVariant (@FeatureVariants)
+				{
+					my $variant_file = $variant_info."$realplat.$featureVariant.info";
+# modified by SV start: makefile improvement 
+					my $refdata = $AllPlatData{$realplat};
+					my $testrefdata = $AllPlatTestData{$realplat};
+					if ( @$refdata ) {
+						foreach my $RefPro (@$refdata)
+						{
+							$variant_file = $variant_info."$realplat.$featureVariant.$$RefPro{Base}.info";
+							my $ref_basedir = $variant_file;
+							$ref_basedir=~s/(.*[\\\/]).*/$1/;
+							if ( ! -d $ref_basedir ){
+								eval { &Path_MakePathL($ref_basedir); };
+								die $@ if $@;
+							}
+							open VARIANTINFOR,">$variant_file" or die "ERROR: Can't open or create file \"$variant_file\"\n";
+							print VARIANTINFOR "VARIANT_PLAT_NAME_$$RefPro{Base}:=default \n";
+							close VARIANTINFOR or die "ERROR: Can't close file \"$variant_file\"\n";
+						}
+					}
+					else {
+						open VARIANTINFOR,">$variant_file" or die "ERROR: Can't open or create file \"$variant_file\"\n";
+						print VARIANTINFOR "VARIANT_PLAT_NAME:=$featureVariant \n";
+						close VARIANTINFOR or die "ERROR: Can't close file \"$variant_file\"\n";
+						print "file \"$variant_file\"\n"
+					}
+					if ($testrefdata){
+						foreach my $RefPro (@$testrefdata)
+						{
+							$variant_file = $variant_info."$realplat.$featureVariant.$$RefPro{Base}.info";
+							my $ref_basedir = $variant_file;
+							$ref_basedir=~s/(.*[\\\/]).*/$1/;
+							if ( ! -d $ref_basedir ){
+								eval { &Path_MakePathL($ref_basedir); };
+								die $@ if $@;
+							}
+							open VARIANTINFOR,">$variant_file" or die "ERROR: Can't open or create file \"$variant_file\"\n";
+							print VARIANTINFOR "VARIANT_PLAT_NAME_$$RefPro{Base}:=default \n";
+							close VARIANTINFOR or die "ERROR: Can't close file \"$variant_file\"\n";
+						}
+						
+					}
+# modified by SV end: makefile improvement 
+					# Close and cleanup
+					if ($Options{v}) {
+						print "Variant info file has been successfully created\n";
+					}
+				}				
+			}
+		}
+# modified end: makefile improvement 
+#		create the platform meta-makefiles
+		foreach my $copyofPlat (@DoPlats) {  # Do not use $_ here !!
+			if ($Options{v}) {
+				print "Creating \"$OutDir$copyofPlat.MAKE\"\n";
+			}
+			my $realplat = $Real{$copyofPlat};
+			&CreatePlatMak($OutDir, $E32env::Data{BldPath}, $AllPlatData{$realplat}, $copyofPlat, $realplat, $RomDir, $Module, $BldInfPath, \@Exports, '');
+
+			if (&Plat_SupportsFeatureVariants($copyofPlat))
+				{
+				foreach my $featureVariant (@FeatureVariants)
+					{
+					print "Creating \"$OutDir$copyofPlat.$featureVariant.MAKE\"\n" if ($Options{v});
+					&CreatePlatMak($OutDir, $E32env::Data{BldPath}, $AllPlatData{$realplat}, $copyofPlat, $realplat, $RomDir, $Module, $BldInfPath, \@Exports, '', ".$featureVariant");
+					}
+				}
+		}
+		foreach (@DoPlats) {
+			if ($Options{v}) {
+				print "Creating \"$OutDir${_}TEST.MAKE\"\n";
+			}
+			&CreatePlatMak($OutDir, $E32env::Data{BldPath}, $AllPlatTestData{$Real{$_}}, $_, $Real{$_}, $RomDir, $Module, $BldInfPath, \@TestExports, 'TEST');
+
+			if (&Plat_SupportsFeatureVariants($_))
+				{
+				foreach my $featureVariant (@FeatureVariants)
+					{
+					print "Creating \"$OutDir${_}.".$featureVariant."TEST.MAKE\"\n" if ($Options{v});
+					&CreatePlatMak($OutDir, $E32env::Data{BldPath}, $AllPlatTestData{$Real{$_}}, $_, $Real{$_}, $RomDir, $Module, $BldInfPath, \@TestExports, 'TEST', ".$featureVariant");
+					}
+				}
+		}
+
+#		create the platform test batch files
+		foreach (@DoRealPlats) {
+			if ($Options{v}) {
+				print "Creating test batch files in \"$OutDir\" for $_\n";
+			}
+			&CreatePlatBatches($OutDir, $AllPlatTestData{$_}, $_);
+		}
+
+# modified by SV start: makefile improvement 
+# create all sub directories
+	foreach my $refplat (@DoRealPlats) {
+		my $tmp = $AllPlatData{$refplat};
+		foreach my $dref (@$tmp){
+			my $builddir = $OutDir . $$dref{Base} ."\\" . $refplat . "\\";
+				if (!-d $builddir){
+					if ($Options{v}) {
+						print "Creating directory \"$builddir\" \n";
+					}
+					eval { &Path_MakePathL($builddir); };
+					&FatalError($@) if $@;
+				}
+			}
+	}
+# modified by SV end: makefile improvement 
+
+#		report any near-fatal errors
+		if (scalar keys %KeepGoing) {
+		    print STDERR
+			    "\n${BldInfPath}$BldInfName WARNING(S):\n",
+			    sort keys %KeepGoing
+			    ;
+		}
+
+		exit;
+	}
+}
+
+
+################ END OF MAIN PROGRAM SECTION #################
+#------------------------------------------------------------#
+##############################################################
+
+
+# SUBROUTINE SECTION
+####################
+
+sub Usage () {
+
+	eval { &Load_ModuleL('E32TPVER'); };
+	&FatalError($@) if $@;
+
+	print
+		"\n",
+		"BLDMAKE - Project building Utility (Build ",&E32tpver,")\n",
+		"\n",
+		"BLDMAKE {options} [<command>] [<platform>]\n",
+		"\n",
+		"<command>: (case insensitive)\n",
+		" BLDFILES - create build batch files\n",
+		" CLEAN    - remove all files bldmake creates\n",
+		" INF      - display basic BLD.INF syntax\n",
+		" PLAT     - display platform macros\n",
+		"\n",
+		"<platform>: (case insensitive)\n",
+		"  if not specified, defaults to \"ALL\"\n",
+		"\n",
+		"Options: (case insensitive)\n",
+		" -v   ->  verbose mode\n",
+		" -k   ->  keep going even if files are missing\n"
+	;
+	exit 1;
+}
+
+sub ShowBldInfSyntax () {
+
+	print <<ENDHERE1;
+
+BLD.INF - Syntax
+
+/* Use C++ comments if required */
+// (Curly braces denote optional arguments)
+
+PRJ_PLATFORMS
+{DEFAULT} {-<platform> ...} {<list of platforms>}
+// list platforms your project supports here if not default
+ENDHERE1
+
+	print "// default = ".join(" ",@DefaultPlats)."\n";
+
+	print <<ENDHERE;
+	
+PRJ_EXPORTS
+[<source path>\<source file>]	{<destination>}
+// list each file exported from source on a separate line
+// {<destination>} defaults to \\EPOC32\\Include\\<source file>
+
+PRJ_TESTEXPORTS
+[<source path>\<source file>]	{<destination>}
+// list each file exported from source on a separate line
+// {<destination>} defaults to BLD.INF dir
+
+PRJ_MMPFILES
+[<mmp path>\<mmp file>] {<qualifiers>}
+{MAKEFILE|NMAKEFILE} [<path>\<makefile>] {build_as_arm}
+// <qualifiers> are tidy, ignore, build_as_arm
+
+#if defined(<platform>)
+// .MMP statements restricted to <platform>
+#endif
+
+PRJ_TESTMMPFILES
+[<mmp path>\<mmp file>] {<qualifiers>}
+{MAKEFILE|NMAKEFILE} [<path>\<makefile>] {<qualifiers>}
+// <qualifiers> are {tidy} {ignore} {manual} {support} {build_as_arm}
+
+#if defined(<platform>)
+// .MMP statements restricted to <platform>
+#endif
+
+ENDHERE
+
+}
+
+sub WarnOrDie ($$) {
+	my ($dieref, $message) = @_;
+	if ($Options{k}) {
+		$KeepGoing{$message} = 1;
+	} else {
+		push @{$dieref}, $message;
+	}
+}
+
+sub ExtensionMakefileMissing($)
+{
+	$IgnoreMissingExtensionMakefile = @_;
+}
+
+sub ParseBldInf ($$$$$) {
+	my ($PlatsRef, $ExportsRef, $TestExportsRef, $BldInfPath, $EPOCIncPath, $EPOCPath, $EPOCDataPath)=@_;
+
+	my @Prj2D;
+	eval { &Prepfile_ProcessL(\@Prj2D, "${BldInfPath}$BldInfName",$variantMacroHRHFile); };
+	&FatalError($@) if $@;
+	
+	my @SupportedPlats=&Plat_List();
+
+	my @Plats;
+	my %RemovePlats;
+
+	my $DefaultPlatsUsed=0;
+	my %PlatformCheck;
+
+	my %ExportCheck;
+	my $Section=0;
+	our @PrjFileDie;
+	my $Line;
+	my $CurFile="${BldInfPath}$BldInfName";
+	LINE: foreach $Line (@Prj2D) {
+		my $LineNum=shift @$Line;
+		$_=shift @$Line;
+		if ($LineNum eq '#') {
+			$CurFile=$_;
+			next LINE;
+		}
+
+		$CurFile = &Path_Norm ($CurFile); 
+		
+		if (/^PRJ_(\w*)$/io) {
+			$Section=uc $1;
+			if ($Section=~/^(PLATFORMS|EXPORTS|TESTEXPORTS|MMPFILES|TESTMMPFILES|EXTENSIONS|TESTEXTENSIONS)$/o) {
+				if (@$Line) {
+					push @PrjFileDie, "$CurFile($LineNum) : Can't specify anything on the same line as a section header\n";
+				}
+				next LINE;
+			}
+			push @PrjFileDie, "$CurFile($LineNum) : Unknown section header - $_\n";
+			$Section=0;
+			next LINE;
+		}
+		if ($Section eq 'PLATFORMS') {
+#			platforms are gathered up into a big list that contains no duplicates.  "DEFAULT" is
+#			expanded to the list of default platforms.  Platforms specified with a "-" prefix
+#			are scheduled for removal from the list.  After processing platforms specified
+#			with the "-" prefix are removed from the list.
+
+			unshift @$Line, $_;
+			my $Candidate;
+			CANDLOOP: foreach $Candidate (@$Line) {
+				$Candidate=uc $Candidate;
+#				ignore old WINC target
+				if ($Candidate eq 'WINC') {
+					next CANDLOOP;
+				}
+#				expand DEFAULT
+				if ($Candidate eq 'DEFAULT') {
+					$DefaultPlatsUsed=1;
+					my $Default;
+					foreach $Default (@DefaultPlats) {
+						unless ($PlatformCheck{$Default}) {
+							push @Plats, $Default;
+							$PlatformCheck{$Default}="$CurFile: $LineNum";
+						}
+					}
+					next CANDLOOP;
+				}
+#				expand BASEDEFAULT
+				if ($Candidate eq 'BASEDEFAULT') {
+					$DefaultPlatsUsed=1;
+					my $Default;
+					foreach $Default (@BaseDefaultPlats) {
+						unless ($PlatformCheck{$Default}) {
+							push @Plats, $Default;
+							$PlatformCheck{$Default}="$CurFile: $LineNum";
+						}
+					}
+					next CANDLOOP;
+				}
+#				expand BASEUSERDEFAULT
+				if ($Candidate eq 'BASEUSERDEFAULT') {
+					$DefaultPlatsUsed=1;
+					my $Default;
+					foreach $Default (@BaseUserDefaultPlats) {
+						unless ($PlatformCheck{$Default}) {
+							push @Plats, $Default;
+							$PlatformCheck{$Default}="$CurFile: $LineNum";
+						}
+					}
+					next CANDLOOP;
+				}
+#				check for removals
+				if ($Candidate=~/^-(.*)$/o) {
+					$Candidate=$1;
+#					check default is specified
+					unless ($DefaultPlatsUsed) {
+						push @PrjFileDie, "$CurFile($LineNum) : \"DEFAULT\" must be specified before platform to be removed\n";
+						next CANDLOOP;
+					}
+					$RemovePlats{$Candidate}=1;
+					next CANDLOOP;
+				}
+# 				If tools platform is specified in bld.inf file then component is built for cwtools as well 
+				if ($Candidate =~ /^tools/i)
+						{
+						push @Plats, 'CWTOOLS';
+						}
+#				check platform is supported
+				unless (grep /^$Candidate$/, @SupportedPlats) {
+					WarnOrDie(\@PrjFileDie, "$CurFile($LineNum) : Unsupported platform $Candidate specified\n");
+					next CANDLOOP;
+				}
+#				check platform is not an IDE
+				if ($Candidate=~/^VC/o) {
+					push @PrjFileDie, "$CurFile($LineNum) : No need to specify platform $Candidate here\n";
+					next CANDLOOP;
+				}
+#				add the platform
+				unless ($PlatformCheck{$Candidate}) {
+					push @Plats, $Candidate;
+					my $SubPlat = sprintf("%sEDG", $Candidate);
+					push @Plats, $SubPlat 
+					    if (grep /^$SubPlat$/, @SupportedPlats);
+					$PlatformCheck{$Candidate}="$CurFile: $LineNum";
+				}
+			}
+			next LINE;
+		}
+
+		# Skip PRJ_TESTEXPORT section if -notest flag		
+		next LINE if ($Options{notest} && ($Section=~/^(TESTEXPORTS)$/o)); 
+		
+		if ($Section=~/^(EXPORTS|TESTEXPORTS)$/o) {
+
+#			make path absolute - assume relative to group directory
+			my $Type = 'file';
+			if (/^\:(\w+)/) {
+				# Export an archive
+				$Type = lc $1;
+				unless ($Type eq 'zip') {
+					push @PrjFileDie, "$CurFile($LineNum) : Unknown archive type - $Type\n";
+					next LINE;
+				}
+				$_ = shift @$Line;
+			}
+
+			my $loggedSourceExport = $_;
+			$_ = &Path_Norm ($_);
+			
+			my $Source=&Path_MakeAbs($CurFile, $_);
+			my $Releasable='';
+			my $emReleasable='';
+			my $unzip_option ='';
+			if (@$Line) {
+#				get the destination file if it's specified
+				$Releasable=shift @$Line;
+				CheckSource_MetaData(%CheckSourceEXPORTSMetaData, $CurFile, "PRJ_".$Section, $Releasable, $LineNum);
+				$Releasable = &Path_Norm ($Releasable);
+				$emReleasable=ucfirst $Releasable;
+				if ($emReleasable=~/^([A-Z]):(\\.*)$/)  {
+				  	$emReleasable=~s/://;
+					$Releasable=$EPOCDataPath.$emReleasable;
+				}
+			}
+
+			my $sourceExportTypeSuffix = "";
+			$sourceExportTypeSuffix .= " (NO DESTINATION)" if (!$Releasable && $Section =~ /^EXPORTS$/);		
+			CheckSource_MetaData(%CheckSourceEXPORTSMetaData, $CurFile, "PRJ_".$Section.$sourceExportTypeSuffix, $loggedSourceExport, $LineNum, $CheckSource_PhysicalCheck);
+			
+			if (@$Line) {
+				$unzip_option = shift @$Line;
+				unless ($unzip_option=~ /overwrite/i) {
+					push @PrjFileDie, "$CurFile($LineNum) : Too many arguments in exports section line\n";
+					next LINE;
+				}
+			}
+			unless ($Type eq 'zip' or &Path_Split('File', $Releasable)) {
+#				use the source filename if no filename is specified in the destination
+#				no filename for archives
+				$Releasable.=&Path_Split('File', $Source);
+			}
+			my $defpath;
+			if ($Type eq 'zip') {
+#				archives relative to EPOCROOT
+				$defpath = $ENV{EPOCROOT};
+			}
+			elsif (($Section =~ /EXPORTS$/) && ($Releasable =~ s/^\|[\/|\\]?//)) {
+#			'|' prefix forces "relative to bld.inf file" in PRJ_[TEST]EXPORTS destinations
+				$defpath = $CurFile;
+			}
+			elsif ($Section eq 'EXPORTS') {
+#				assume the destination is relative to $EPOCIncPath
+				$defpath = $EPOCIncPath;
+			}
+			else {
+				$defpath = $CurFile;
+			}
+			$Releasable=&Path_MakeEAbs($EPOCPath, $defpath, $Releasable);
+
+#			sanity checks!
+			if ($Type eq 'file' && $ExportCheck{uc $Releasable}) {
+				push @PrjFileDie, "$CurFile($LineNum) : Duplicate export $Releasable (from line $ExportCheck{uc $Releasable})\n";
+				next LINE;
+			}
+			$ExportCheck{uc $Releasable}="$CurFile: $LineNum";
+			if (! -e $Source) {
+				WarnOrDie(\@PrjFileDie, "$CurFile($LineNum) : Exported source file $Source not found\n");
+			}
+			elsif ($Type ne 'zip' && -d $Releasable) {
+				push @PrjFileDie, "$CurFile($LineNum) : Export target $Releasable must be a file.\n";
+			}
+			else {
+				if ($Section eq 'EXPORTS') {
+					push @$ExportsRef, {
+						'Source'=>$Source,
+						'Releasable'=>$Releasable,
+						'emReleasable'=>$emReleasable,
+						'Type'=>$Type,
+						'UnzipOption'=>$unzip_option
+					};
+				}
+				else {
+					push @$TestExportsRef, {
+						'Source'=>$Source,
+						'Releasable'=>$Releasable,
+						'emReleasable'=>$emReleasable,
+						'Type'=>$Type,
+						'UnzipOption'=>$unzip_option
+					};
+				}
+			}
+			next LINE;
+		}
+	}
+	if (@PrjFileDie) {
+		print STDERR
+			"\n${BldInfPath}$BldInfName FATAL ERROR(S):\n",
+			@PrjFileDie
+		;
+		exit 1;
+	}
+
+#	set the list of platforms to the default if there aren't any platforms specified,
+#	else add platforms to the global list unless they're scheduled for removal,
+	unless (@Plats) {
+		@$PlatsRef=@DefaultPlats;
+		# Include the list of BPABI Platforms in a default build.
+		my $OptionalPlat;
+		foreach $OptionalPlat (@OptionalPlats) {
+			#	VS6 and VS2003 are not real platforms and hence are not included in a default build
+			unless ( $OptionalPlat eq 'VS6' || $OptionalPlat eq 'VS2003') {
+				if (not grep /^$OptionalPlat$/i, @$PlatsRef) {
+					push @$PlatsRef, $OptionalPlat;
+				}
+			}
+		}		
+	}
+	else {
+		my $Plat;
+		foreach $Plat (@Plats) {
+			unless ($RemovePlats{$Plat}) {
+				push @$PlatsRef, $Plat;
+			}
+		}
+		push @PlatsReq , @$PlatsRef;
+	}
+}
+
+sub ExportDirs ($) {
+	my ($ExportsRef)=@_;
+
+	my %ExportDirHash;
+	foreach (@$ExportsRef) {
+		my $dir = ($$_{Type} eq 'zip') ? $$_{Releasable} : &Path_Split('Path',$$_{Releasable});
+		if ($dir) {
+			$dir=&Path_Chop($dir);
+			$ExportDirHash{uc $dir}=$dir;
+		}
+	}
+	my @ExportDirs;
+	foreach (keys %ExportDirHash) {
+		push @ExportDirs, $ExportDirHash{$_};
+	}
+	@ExportDirs;
+}
+
+
+sub ParseBldInfPlat ($$$$) {
+	my ($DataRef, $TestDataRef, $Plat, $BldInfPath, $FeatureVar)=@_;
+		
+#	get the platform .MMP macros
+	my %Plat;
+	eval { &Plat_GetL($Plat,\%Plat); };
+	&FatalError($@) if $@;
+
+#	get the raw data from the BLD.INF file
+	my @Prj2D;
+	eval { &Prepfile_ProcessL(\@Prj2D, "${BldInfPath}$BldInfName", ($FeatureVar ? $FeatureVar->{VARIANT_HRH} : $variantMacroHRHFile), @{$Plat{MmpMacros}}); };
+	&FatalError($@) if $@;
+
+	my %dummy;
+	my @userIncludes = ('.');
+	my @systemIncludes = ();
+	$CheckSourceBldInfIncludes{$Plat} = CheckSource_Includes("${BldInfPath}$BldInfName", %dummy, $variantMacroHRHFile, @{$Plat{MmpMacros}}, @userIncludes, @systemIncludes, $CheckSource_NoUserSystemDistinction);
+	
+#	process the raw data
+	my $IsExtensionBlock =0;
+	my (@ExtensionBlockData, $ErrorString);
+	my %Check;
+	my $Section=0;
+	my @PrjFileDie;
+	my $Line;
+	my $CurFile="${BldInfPath}$BldInfName";
+	LINE: foreach $Line (@Prj2D) {
+
+		my %Data;
+		my %Temp;
+
+		my $LineNum=shift @$Line;
+		if ($LineNum eq '#') {
+			$CurFile=shift @$Line;
+			next LINE;
+		}
+
+		$CurFile = &Path_Norm ($CurFile);
+		
+#		upper-case all the data here, but record original source case
+#		in a hash so that it can be recalled for CheckSource purposes
+
+		my %originalSourceCase;
+   		foreach (@$Line) {
+ 			$originalSourceCase{uc $_} = $_;  # needed for extension template makefile MACROs 
+   			$_=uc $_;
+   		}
+
+		$_=shift @$Line;
+
+#		check for section headers - don't test for the right ones here
+#		because we do that in the first parse function
+
+		if (/^PRJ_(\w*)$/o) {
+			$Section=$1;
+			next LINE;
+		}
+
+#		Skip section if PRJ_TESTMMPFILES and -notest option
+		next LINE if ($Options{notest} && ($Section=~/^(TESTMMPFILES)$/o)); 
+
+#		check for EXTENSION sections
+		if ($Section=~/^(EXTENSIONS|TESTEXTENSIONS)$/o) {
+
+#			We have an extension block
+			if (/^start(\w*)$/io) {
+				if ($IsExtensionBlock) {
+					&FatalError("$CurFile($LineNum) : Cannot embed Extension Template 'start' sections\n");
+				}
+				$IsExtensionBlock =1;
+				$ErrorString = "$CurFile($LineNum)";
+				foreach (@$Line)
+				{
+				if (/^EXTENSION$/)
+					{
+					my $extensionTemplate = @$Line[scalar(@$Line)-1];
+					CheckSource_MetaData(%CheckSourceEXTENSIONSMetaData, $CurFile, "PRJ_".$Section, $originalSourceCase{$extensionTemplate}.".mk", $LineNum, $CheckSource_PhysicalCheck) if ($extensionTemplate);
+					}
+				}
+
+				push @ExtensionBlockData, $Line; 			
+				next LINE;
+			}		
+			
+			if (($IsExtensionBlock) & (! (/^end(\w*)$/io))) {
+				if (($_ ne "TOOL") & ($_ ne "OPTION") & ($_ ne "TARGET") & ($_ ne "SOURCES") & ($_ ne "DEPENDENCIES")) {
+							&FatalError("$CurFile($LineNum) : Unrecognised keyword: $_.  Is there an 'end' corresponding to the 'start' for the Extension Template?\n"); 
+				}
+				if ($_ ne "OPTION") {
+					unshift(@$Line, $_);					
+				}
+#				Need to revert MACROs back to their original case
+				foreach (@$Line) {
+					$_=$originalSourceCase{$_};
+				}
+				push @ExtensionBlockData, $Line; 
+				next LINE;
+			}
+			
+			if (/^end(\w*)$/io) {
+				if (! $IsExtensionBlock) {
+					&FatalError("$CurFile($LineNum) : No 'start' corresponding to this 'end' in Extension Template section\n"); 
+				}
+				$IsExtensionBlock =0;
+				my $OutDir=Path_Chop($E32env::Data{BldPath}).$BldInfPath;
+#				Generate wrapper makefile for this platform.
+				eval { &Load_ModuleL('WrapperMakefile'); };
+					&FatalError($@) if $@;
+				$OutDir=~ s/\\/\//g;  # convert to unix slashes for wrappermakefile.pm
+				%Data = GenerateWrapper($Plat, $OutDir, $ErrorString, \@PrjFileDie, @ExtensionBlockData);
+				if (!$IgnoreMissingExtensionMakefile)
+				{
+					$Data{ExtensionRoot}=&Path_Split('Path', $CurFile);
+					$Data{Path}=~ s/\//\\/g;  # convert unix slashes back to win32 
+					$Data{Base}=~ s/\//\\/g;
+				}
+				@ExtensionBlockData = ();  # clear array
+			}
+		}
+
+#		check for MMP sections and get the .MMP file details
+		if ($Section=~/^(MMPFILES|TESTMMPFILES)$/o) {
+			$Data{Ext}='.MMP';
+#			check for MAKEFILE statements for custom building
+			my $SubSection = "MMP";
+			if (/^MAKEFILE$/o) {
+				$SubSection = $_;
+				$Data{Makefile}=2;  # treat MAKEFILE=>NMAKEFILE   =1;
+				$_=shift @$Line;
+				$Data{Ext}=&Path_Split('Ext', $_);
+			}
+			if (/^NMAKEFILE$/o) {
+				$SubSection = $_;
+				$Data{Makefile}=2;
+				$_=shift @$Line;
+				$Data{Ext}=&Path_Split('Ext', $_);
+			}
+			if (/^GNUMAKEFILE$/o) {
+				$SubSection = $_;
+				$Data{Makefile}=1;
+				$_=shift @$Line;
+				$Data{Ext}=&Path_Split('Ext', $_);
+			}
+			CheckSource_MetaData(%CheckSourceMMPFILESMetaData, $CurFile, "PRJ_$Section $SubSection", $originalSourceCase{$_}, $LineNum, $CheckSource_PhysicalCheck);
+			$_ = &Path_Norm ($_);
+			
+#			path considered relative to the current file
+			$Data{Path}=&Path_Split('Path', &Path_MakeAbs($CurFile, $_));
+
+#			this function doesn't care whether the .MMPs are listed with their extensions or not
+			$Data{Base}=&Path_Split('Base', $_);
+			my $MmpFile= $Data{Path}.$Data{Base};
+   
+#			check the file isn't already specified
+  			if ($Check{$MmpFile}) {
+  				push @PrjFileDie, "$CurFile($LineNum) : duplicate $Data{Base} (from line $Check{$MmpFile})\n";
+   				next;
+   			}
+  			$Check{$MmpFile}="$CurFile: $LineNum";
+
+#			check the file exists
+			unless (-e "$Data{Path}$Data{Base}$Data{Ext}") {
+				WarnOrDie(\@PrjFileDie, "$CurFile($LineNum) : $Data{Path}$Data{Base}$Data{Ext} does not exist\n");
+				next LINE;
+			}
+			
+
+#			process the file's attributes
+			if ($Section eq 'MMPFILES') {
+				foreach (@$Line) {
+					if (/^TIDY$/o) {
+						$Data{Tidy}=1;
+						next;
+					}
+					if (/^IGNORE$/o) {
+						next LINE;
+					}
+					if (/^BUILD_AS_ARM$/o) {
+					  $Data{BuildAsARM}="-arm";
+					  next;
+					}
+
+					push @PrjFileDie, "$CurFile($LineNum) : Don't understand .MMP file argument \"$_\"\n";
+				}
+			}
+
+#			process the test .MMP file's attributes
+			elsif ($Section eq 'TESTMMPFILES') {
+				foreach (@$Line) {
+					if (/^TIDY$/o) {
+						$Data{Tidy}=1;
+						next;
+					}
+					if (/^IGNORE$/o) {
+						next LINE;
+					}
+					if (/^BUILD_AS_ARM$/o) {
+					  $Data{BuildAsARM}="-arm";
+					  next;
+					}
+					if (/^MANUAL$/o) {
+						$Data{Manual}=1;
+						next;
+					}
+					if (/^SUPPORT$/o) {
+						$Data{Support}=1;
+						next;
+					}
+					push @PrjFileDie, "$CurFile($LineNum) : Don't understand test .MMP file argument \"$_\"\n";
+				}
+			}
+		}		
+
+#		store the data
+		if (($Section eq 'MMPFILES') or ($Section eq 'EXTENSIONS')) {
+			if ($IgnoreMissingExtensionMakefile and $Section eq 'EXTENSIONS')
+			{
+				# More than more ext makefile can be missing so reset indicator
+				$IgnoreMissingExtensionMakefile = 0;
+			}
+			else
+			{
+				push @$DataRef, \%Data;
+			}
+			next LINE;
+		}
+		if (($Section eq 'TESTMMPFILES') or ($Section eq 'TESTEXTENSIONS')) {
+			if ($IgnoreMissingExtensionMakefile and $Section eq 'TESTEXTENSIONS')
+			{
+				# More than more ext makefile can be missing so reset indicator
+				$IgnoreMissingExtensionMakefile = 0;
+			}
+			else
+			{
+				push @$TestDataRef, \%Data;
+			}
+			next LINE;
+		}
+		
+	}
+#	line loop end
+
+#	exit if there are errors
+	if (@PrjFileDie) {
+		print STDERR
+			"\n\"${BldInfPath}$BldInfName\" FATAL ERROR(S):\n",
+			@PrjFileDie
+		;
+		exit 1;
+	}
+}
+
+
+sub FatalError (@) {
+
+	print STDERR "BLDMAKE ERROR: @_\n";
+	exit 1;
+}
+
+sub CreatePlatformPm ($$$$$$) {
+	my ($BatchPath, $PlatsRef, $RealPlatsRef, $RealHRef, $AllPlatDataHRef, $AllPlatTestDataHRef)=@_;
+
+
+# 	exclude GCCXML, EDG and CWTOOLS  from list of RealPlats
+	my @RealPlats;
+	foreach my $Plat (@$RealPlatsRef){
+	unless (($Plat =~ /^gccxml/i)  or  ($Plat =~ /^edg/i) or  ($Plat =~ /^cwtools/i) or ($Plat =~ /^x86gcc/i) or ($Plat =~ /^x86gmp/i)) {
+# 	exclude BPABI targets from list of RealPlats provided they are not specified in the platform list
+				if (grep /^$Plat$/i, @OptionalPlats) {
+					if (grep /^$Plat$/, @PlatsReq) {
+						push @RealPlats, $Plat;
+					}
+					next;
+				}
+				push @RealPlats, $Plat;
+			}
+	}
+
+
+	&Output(
+		"# Bldmake-generated perl file - PLATFORM.PM\n",
+		"\n",
+		"# use a perl integrity checker\n",
+		"use strict;\n",
+		"\n",
+		"package Platform;\n",
+		"\n",
+		"use vars qw(\@Plats \@RealPlats %Programs %TestPrograms %FeatureVariantSupportingPlats);\n",
+		"\n",
+		"\@Plats=(\'",join('\',\'',@$PlatsRef),"\');\n",
+		"\n",
+		"\@RealPlats=(\'", join('\',\'',@RealPlats),"\');\n",
+		"\n",
+		"%Programs=(\n"
+	);
+	my %All; # all programs for all platforms
+	my $TmpStr;
+	my $Plat;
+	foreach $Plat (@$PlatsRef) {
+		$TmpStr="	\'$Plat\'=>[";
+		if (@{${$AllPlatDataHRef}{$$RealHRef{$Plat}}}) {
+			my $ProgRef;
+			foreach $ProgRef (@{${$AllPlatDataHRef}{$$RealHRef{$Plat}}}) {
+				$TmpStr.="'$$ProgRef{Base}',";
+				$All{$$ProgRef{Base}}=1;
+			}
+			chop $TmpStr;
+			}
+		&Output(
+			"$TmpStr],\n"
+		);
+		}
+	$TmpStr="	ALL=>[";
+	if (keys %All) {
+		my $Prog;
+		foreach $Prog (keys %All) {
+			$TmpStr.="'$Prog',";
+		}
+		chop $TmpStr;
+	}
+	&Output(
+		"$TmpStr]\n",
+		");\n",
+		"\n",
+		"%TestPrograms=(\n"
+	);
+	%All=();
+	foreach $Plat (@$PlatsRef) {
+		$TmpStr="	\'$Plat\'=>[";
+		if (@{${$AllPlatTestDataHRef}{$$RealHRef{$Plat}}}) {
+			my $ProgRef;
+			foreach $ProgRef (@{${$AllPlatTestDataHRef}{$$RealHRef{$Plat}}}) {
+				$TmpStr.="'$$ProgRef{Base}',";
+				$All{$$ProgRef{Base}}=1;
+			}
+			chop $TmpStr;
+		}
+		&Output("$TmpStr],\n");
+	}
+	$TmpStr="	ALL=>[";
+	if (keys %All) {
+		my $Prog;
+		foreach $Prog (keys %All) {
+			$TmpStr.="'$Prog',";
+		}
+		chop $TmpStr;
+	}
+	&Output(
+		"$TmpStr]\n",
+		");\n",
+		"\n"
+	);
+
+	&Output(
+		"\n",
+		"%FeatureVariantSupportingPlats=("
+	);
+
+	$TmpStr = "";
+	foreach $Plat (@$PlatsRef)
+		{
+		$TmpStr .= "\n\t$Plat=>1," if (&Plat_SupportsFeatureVariants($Plat));
+		}
+
+	chop $TmpStr;
+
+	&Output(
+		"$TmpStr\n",
+		");\n",
+		"\n",
+		"1;\n"
+	);
+
+#	write the PLATFORM.PM file
+	&WriteOutFileL($BatchPath."PLATFORM.PM");
+}
+
+sub CreatePerlBat ($) {
+	my ($BldInfPath)=@_;
+
+#	create ABLD.BAT, which will call ABLD.PL
+#   NB. must quote $BldInfPath because it may contain spaces, but we know it definitely
+#       ends with \ so we need to generate "\foo\bar\\" to avoid quoting the close double quote
+	&Output(
+		"\@ECHO OFF\n",
+		"\n", 
+		"REM Bldmake-generated batch file - ABLD.BAT\n",
+		"REM ** DO NOT EDIT **", 
+		"\n",
+		"\n",
+		"perl -S ABLD.PL \"${BldInfPath}\\\" %1 %2 %3 %4 %5 %6 %7 %8 %9\n",
+		"if errorlevel==1 goto CheckPerl\n",
+		"goto End\n",
+		"\n",
+		":CheckPerl\n",
+		"perl -v >NUL\n",
+		"if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?\n",
+		"goto End\n",
+		"\n",
+		":End\n"
+	);
+
+#	check that the .BAT file does not already exist and is read-only
+	if ((-e "${BldInfPath}ABLD.BAT")  && !(-w "${BldInfPath}ABLD.BAT")) {
+		warn "BLDMAKE WARNING: read-only ABLD.BAT will be overwritten\n";
+		chmod 0222, "${BldInfPath}ABLD.BAT";
+	}
+
+#	create the .BAT file in the group directory
+	&WriteOutFileL($BldInfPath."ABLD.BAT",1);
+
+}
+
+sub GetArchiveExportList($) {
+	my ($ExportRef) = @_;
+	my $Type = $ExportRef->{Type};
+	my $Src = $ExportRef->{Source};
+	my $Dest = $ExportRef->{Releasable};
+	$Dest = '' if (!defined($Dest));
+	my @list = ();
+	if ($Type eq 'zip') {
+		unless (open PIPE, "unzip -l $Src | ") {
+			warn "Can't unzip $Src\n";
+		}
+		while (<PIPE>) {
+			if (/^\s*\d+\s+\S+\s+\S+\s+(.*?)\s*$/) {
+#				ignore empty lines and anything that finishes with / 
+				unless(($1=~/\/\s*$/) || ($1=~/^$/)) {
+
+					my $member = $1;
+					$member =~ s/\$/\$\$/g;
+					if (!$Dest){
+						push @list, "$ENV{EPOCROOT}$member";
+					}
+					else{
+						push @list, "$Dest\\$member";
+					}
+				}
+			}
+		}
+		close PIPE;
+	}
+	return @list;
+}
+
+sub CreateExportMak ($$$) {
+	my ($Makefile, $ExportsRef, $ExpDirsRef)=@_;
+
+#	create EXPORT.MAKE
+
+	my $erasedefn = "\@erase";
+	$erasedefn = "\@erase 2>>nul" if ($ENV{OS} eq "Windows_NT");
+	&Output(
+		"ERASE = $erasedefn\n",
+		"\n",
+		"\n",
+		"EXPORT : EXPORTDIRS"
+	);
+	my $ref;
+	if (@$ExportsRef) {
+		foreach $ref (@$ExportsRef) {
+			if ($$ref{Type} eq 'zip') {
+				my @list = &GetArchiveExportList($ref);
+				foreach (@list) {
+					my $dst=$_;
+					&Output(
+						" \\\n",
+						"\t$dst"
+					);
+				}
+			} else {
+				my $name=&Path_Quote($$ref{Releasable});
+				&Output(
+					" \\\n",
+					"\t$name"
+				);
+			}
+		}
+	}
+	else {
+		&Output(
+			" \n",
+			"\t\@echo Nothing to do\n"
+		);
+	}
+	&Output(
+		"\n",
+		"\n",
+		"\n",
+		"EXPORTDIRS :"
+	);
+	my $dir;
+	foreach $dir (@$ExpDirsRef) {
+		$dir=&Path_Quote($dir);
+		&Output(
+			" $dir"
+		);
+	}
+	&Output(
+		"\n",
+		"\n"
+	);
+	foreach $dir (@$ExpDirsRef) {
+		&Output(
+			"$dir :\n",
+			    "\t\@perl -S emkdir.pl \"\$\@\"\n",
+			"\n"
+		);
+	}
+	&Output(
+		"\n",
+		"\n"
+	);
+	foreach $ref (@$ExportsRef) {
+		my $unzipoption = $$ref{UnzipOption};
+		CheckSource_ExportedIncludes($$ref{Source}, $$ref{Releasable}, %CheckSourceEXPORTSIncludes);
+		
+		if ($$ref{Type} eq 'zip') {
+			my $src = &Path_Quote($$ref{Source});
+			my $destdir = &Path_Quote($$ref{Releasable});
+			$destdir=$ENV{EPOCROOT} if (!defined($destdir) or ($destdir eq ''));
+			my @list = &GetArchiveExportList($ref);
+  			foreach (@list) {  				
+  				my $dst=$_;
+  				&Output(
+ 					"$dst : $src\n",
+  				);
+  			}
+			if ($unzipoption =~ /overwrite/i){
+				&Output(
+				"\t- unzip -o $src -d \"$destdir\"\n",
+				);
+			}
+			else{	
+				&Output(
+				"\t- unzip -u  -o $src -d \"$destdir\"\n",
+				);
+			}
+		} else {
+			my $dst=&Path_Quote($$ref{Releasable});
+			my $src=&Path_Quote($$ref{Source});
+			&Output(
+				"$dst : $src\n",
+					"\tcopy \"\$?\" \"\$\@\"\n",
+				"\n"
+			);
+		}
+	}
+	&Output(
+		"\n",
+		"\n"
+	);
+	if (@$ExportsRef) {
+		&Output(
+			"CLEANEXPORT :\n"
+		);
+		foreach $ref (@$ExportsRef) {
+			if ($$ref{Type} eq 'zip') {
+				my @list = &GetArchiveExportList($ref);
+				foreach (@list) {
+					my $dst=$_;
+					$dst =~ s/\//\\/go;
+					&Output(
+						"\t-\$(ERASE) \"$dst\"\n"
+					);
+				}
+			} else {
+				my $dst = $$ref{Releasable};
+				$dst =~ s/\//\\/go;
+				&Output(
+					"\t-\$(ERASE) \"$dst\"\n"
+				);
+			}
+		}
+		&Output(
+			"\n",
+			"WHAT :\n"
+		);
+		foreach $ref (@$ExportsRef) {
+			if ($$ref{Type} eq 'zip') {
+				my @list = &GetArchiveExportList($ref);
+				foreach (@list) {
+					my $dst=$_;
+					$dst =~ s/\//\\/go;
+					&Output(
+						"\t\@echo \"$dst\"\n"
+					);
+				}
+			} else {
+				my $dst = $$ref{Releasable};
+				$dst =~ s/\//\\/go;
+				&Output(
+					"\t\@echo \"$dst\"\n"
+				);
+			}
+		}
+	}
+	else {
+		&Output(
+			"CLEANEXPORT :\n",
+			"\t\@echo Nothing to do\n",
+			"WHAT :\n",
+			"\t\@rem do nothing\n"
+		);
+	}
+
+	&Output(
+		"\nCHECKSOURCE :\n"
+	);
+	
+	&Output (CheckSource_MakefileOutput(%CheckSourceEXPORTSMetaData));
+	&Output (CheckSource_MakefileOutput(%CheckSourceEXPORTSIncludes));
+
+	&Output("\n");
+	
+#	write EXPORT.MAKE
+	&WriteOutFileL($Makefile);
+}
+
+sub CreatePlatExports ($$) {
+	my ($RealPlat,$Exports)=@_;
+	my $Ref;
+	&Output(
+ 	"\n# Rules which handle the case when \$(CFG) is not defined\n\n" ,
+ 	"EXPORT:		\tEXPORTUREL EXPORTUDEB\n", 
+ 	"EXPORTCLEAN:	\tEXPORTCLEANUREL EXPORTCLEANUDEB\n",
+ 	"EXPORTWHAT:	\tEXPORTWHATUREL EXPORTWHATUDEB\n",
+  
+ 	"\n# definitions \n",
+ 	"DATAx = $ENV{EPOCROOT}epoc32\\data\n",
+ 	"EMULx = $ENV{EPOCROOT}epoc32\\$RealPlat\n",
+ 	"URELx = $ENV{EPOCROOT}epoc32\\release\\$RealPlat\\urel\n",
+ 	"UDEBx = $ENV{EPOCROOT}epoc32\\release\\$RealPlat\\udeb\n",
+ 	"\n"
+	);
+	
+	&Output( 
+	"# Exports to emulated drive A: to Y \n\n",
+	"EXPORTGENERIC : EXPORTDIRSGENERIC",
+	);
+	 
+	my @dirs;
+	my @expgen;
+	my %dirsg;
+	foreach $Ref (@$Exports) {
+	 	if ($$Ref{emReleasable}=~/^([A-Y])(\\.*)$/){
+		   my $exp="\\$$Ref{emReleasable}";
+	 	   if ($$Ref{Type} eq 'zip') {	
+			 my @list = &GetArchiveExportList($Ref);	
+			  foreach (@list) {
+				my $dst=&Path_Quote($_);
+				if ($dst=~/([^\\]*)$/o){
+					$dst=$1;
+				}
+				my $zipdest=$dst;
+				$zipdest =~ s/\//\\/g;
+			    push  @expgen, "$exp\\$zipdest";
+			    my $zippath= &Path_Chop(&Path_Split('Path', $zipdest));
+				if(!$zippath){
+					$dirsg{$exp}=$exp;
+				}
+				else{
+					 $dirsg{"$exp\\$zippath"}="$exp\\$zippath";
+				}
+				&Output(" \\\n","\t\$(EMULx)$exp\\$zipdest");
+			 }      
+		 }
+		 else { 
+		     my $dir =  &Path_Chop(&Path_Split('Path', $exp));  
+			 push @expgen,  $exp;	
+			 $dirsg{$dir}=$dir;
+			 &Output(" \\\n", "\t\$(EMULx)$exp "); 
+		 }
+	   }
+	}
+	&Output("\n\nEXPORTDIRSGENERIC : ");
+	foreach (keys %dirsg){
+			 push @dirs, "\$(EMULx)$dirsg{$_}";
+			 &Output(" \\\n", "\t\$(EMULx)$_"); 
+	} 
+	&Output("\n\n");
+	foreach (@expgen){	 
+			&Output( 
+			"\$(EMULx)$_ : \t\$(DATAx)$_ \n",
+			"\tcopy \"\$?\" \"\$@\" \n"
+			);
+	}	
+	&Output("\nEXPORTCLEANGENERIC :\n");		
+	foreach (@expgen){	 
+			&Output("\t-@\$(ERASE) \$(EMULx)$_ \n");
+	} 			
+	&Output("\nEXPORTWHATGENERIC :\n");			
+	foreach (@expgen){	   
+			&Output("\t\@echo \$(EMULx)$_ \n");
+	}
+		
+	&Output( 
+	 		"\n\n# Exports to emulated drive Z: - UREL version \n\n",
+	 		"EXPORTUREL : EXPORTDIRSUREL",
+	 	   );
+	
+	my @expurel; 
+	my %dirsurel;
+	foreach $Ref (@$Exports) {
+		if ($$Ref{emReleasable}=~/^(Z)(\\.*)$/){
+			my $exp="\\$$Ref{emReleasable}";
+	 	    if ($$Ref{Type} eq 'zip') {
+			  my @list = &GetArchiveExportList($Ref);
+			  foreach (@list) {
+				my $dst=&Path_Quote($_);
+				if ($dst=~/([^\\]*)$/o){
+					$dst=$1;
+				}
+				my $zipdest=$dst;
+				$zipdest=~ s/\//\\/g;
+				push  @expurel, "$exp\\$zipdest"; 
+				my $zippath= &Path_Chop(&Path_Split('Path', $zipdest)); 
+				if(!$zippath){
+				   $dirsurel{$exp}=$exp;
+				}
+				else{
+					$dirsurel{"$exp\\$zippath"}="$exp\\$zippath";
+				}
+				&Output(" \\\n","\t\$(URELx)$exp\\$zipdest");
+			}  
+		}
+		else {
+			  my $dir =  &Path_Chop(&Path_Split('Path', $exp));  
+			  push @expurel,  $exp; 
+			  $dirsurel{$dir}=$dir;
+			  &Output(" \\\n", "\t\$(URELx)$exp "); 
+		}
+	  }
+	} 
+	&Output("\n\nEXPORTDIRSUREL : ");
+	foreach (keys %dirsurel){
+			push @dirs, "\$(URELx)$dirsurel{$_}";
+   			&Output(" \\\n", "\t\$(URELx)$_ "); 
+	}
+	&Output("\n\n");	
+	foreach (@expurel){
+			 &Output( 
+					"\$(URELx)$_ : \t\$(DATAx)$_ \n",
+					"\tcopy \"\$?\" \"\$@\" \n"
+			 );
+	}		
+	&Output("\nEXPORTCLEANUREL :\n"); 		
+	foreach (@expurel){	
+			 &Output("\t-@\$(ERASE) \$(URELx)$_ \n"); 
+	}  
+	&Output("\nEXPORTWHATUREL :\n");	
+	foreach (@expurel){	
+			 &Output( "\t\@echo \$(URELx)$_ \n"); 	
+	}
+	   
+	&Output( 
+	 		"\n\n# Exports to emulated drive Z: - UDEB version \n\n",
+	 		"EXPORTUDEB : EXPORTDIRSUDEB",
+	);  
+	 	   
+	my %dirsudeb=%dirsurel;          
+	my @expudeb=@expurel;
+	foreach (@expudeb){
+	         &Output(" \\\n", "\t\$(UDEBx)$_ ");		  
+	}
+	&Output("\n\nEXPORTDIRSUDEB : ");
+	foreach(keys %dirsudeb){
+	  		push @dirs, "\$(UDEBx)$dirsudeb{$_}";
+	  		&Output(" \\\n", "\t\$(UDEBx)$_ "); 
+	  	
+	}
+	&Output("\n\n");
+	foreach (@expudeb){
+	 		 &Output( 
+					"\$(UDEBx)$_ : \t\$(DATAx)$_ \n",
+					"\tcopy \"\$?\" \"\$@\" \n"
+			 );
+	}			
+	&Output("\nEXPORTCLEANUDEB :\n");
+	foreach (@expudeb){	
+			 &Output("\t-@\$(ERASE) \$(UDEBx)$_ \n"); 
+	}  
+	&Output("\nEXPORTWHATUDEB :\n");	
+	foreach (@expudeb){	
+			 &Output("\t\@echo \$(UDEBx)$_ \n"); 	
+	}
+	
+    &Output("\n# Directories \n\n");  
+	&Output(join (" \\\n", @dirs)." :")       
+	&Output("\n\t\@perl -S emkdir.pl \$@\n\n");			
+		   		
+}
+
+sub CreatePlatMak ($$$$$$$$$;$) {
+	my ($BatchPath, $E32MakePath, $DataRef, $Plat, $RealPlat, $RomDir, $Module, $BldInfPath, $Exports, $Test, $FeatureVariant)=@_;
+	$FeatureVariant = "" if (!$FeatureVariant);
+
+	unless ($Test) {
+		$Test='';
+	}
+	else {
+		$Test='TEST';
+	}
+
+	my $Ref;
+	my $eDrive=0;
+	if ($RealPlat =~ /^WINS/) {
+	    foreach $Ref (@$Exports) {
+			if ($$Ref{emReleasable}=~/^([A-Z])(\\.*)$/) {
+				$eDrive=1;
+				last;
+			}
+		}
+	} 
+
+
+	my $OutRomFile="$RomDir$RealPlat$Test.IBY";
+	my $GCCDir="gcc\$(PBUILDPID)\\bin";
+	
+	my $erasedefn = "\@erase";
+	$erasedefn = "\@erase 2>>nul" if ($ENV{OS} eq "Windows_NT");
+
+# Get the root platform name to support hierarchy of customizations	
+	my $root = Plat_Root($Plat);
+
+	my $config_file = "";
+
+	if (grep /^$root$/i, @BPABIPlats) {
+		$config_file = BPABIutl_Config_Path($root);
+	}
+
+	my $rvct_path = "";
+
+	if ( $config_file ) {
+
+		if ($root =~ /^ARMV\d/) {
+
+			unless ( RVCT_plat2set::compiler_exists($Plat) )
+			{
+				FatalError("Can't find any RVCT installation.");
+			}
+
+			my $rvct_ver = RVCT_plat2set::get_version_string($Plat);
+
+			if ($Plat =~ "^ARMV5" && $rvct_ver lt "2.2.559")
+			{
+				warn "BLDMAKE WARNING: ARMV5 requires at least RVCT 2.2.559.";
+				OutText();
+				return;
+			}
+
+			if ($Plat =~ "^ARMV6" && $rvct_ver lt "2.2.559")
+			{
+				warn "BLDMAKE WARNING: ARMV6 requires at least RVCT 2.2.559.";
+				OutText();
+				return;
+			}
+
+			if ($Plat =~ "^ARMV7" && $rvct_ver lt "3.1.674")
+			{
+				warn "BLDMAKE WARNING: ARMV7 requires at least RVCT 3.1.674.";
+				OutText();
+				return;
+			}
+
+			my $rvct_bin_name = RVCT_plat2set::get_bin_name($Plat);
+			my $rvct_bin_path = RVCT_plat2set::get_bin_path($Plat);
+			my $rvct_inc_name = RVCT_plat2set::get_inc_name($Plat);
+			my $rvct_inc_path = RVCT_plat2set::get_inc_path($Plat);
+			my $rvct_lib_name = RVCT_plat2set::get_lib_name($Plat);
+			my $rvct_lib_path = RVCT_plat2set::get_lib_path($Plat);
+
+			main::Output("export $rvct_bin_name:=$rvct_bin_path\n");
+			main::Output("export $rvct_inc_name:=$rvct_inc_path\n");
+			main::Output("export $rvct_lib_name:=$rvct_lib_path\n");
+
+			my ($rvct_M, $rvct_m, $rvct_b) = RVCT_plat2set::get_version_list($Plat);
+
+			Output( "\n" );
+			Output( "export RVCT_VER_MAJOR:=$rvct_M\n" );
+			Output( "export RVCT_VER_MINOR:=$rvct_m\n" );
+			Output( "export RVCT_VER_BUILD:=$rvct_b\n" );
+
+			$rvct_path = "\$($rvct_bin_name);"; # Example: '$(RVCT22BIN);'.
+		}
+
+		&Output(
+			"\n",
+			"export PLAT:=${Plat}\n\n",
+			"include $config_file\n\n"
+		);
+	}
+# modified start: makefile improvement 
+	unless($FeatureVariant eq "")
+	{
+# modified by SV start: makefile improvement 
+		foreach $Ref (@$DataRef) {
+			&Output(
+			"include $BatchPath"."FeatureVariantInfo\\".uc($Plat)."\\"."$Plat$FeatureVariant.$$Ref{Base}.info\n\n",
+			);
+		}
+# modified by SV end: makefile improvement 
+	}
+# modified end: makefile improvement 
+	# Don't hardcode the rvct path if rvct auto switch feature is not enabled.
+	if ($ENV{ABLD_PLAT_INI}) 
+	{
+		&Output(
+		'export Path:=',&main::Path_Drive,$E32env::Data{EPOCPath},$GCCDir,";", $rvct_path,"\$(Path)\n",
+		"export PATH:=\$(Path)\n"
+		);
+	}
+	else
+	{
+		&Output(
+		'export Path:=',&main::Path_Drive,$E32env::Data{EPOCPath},$GCCDir,";", "\$(Path)\n",
+		"export PATH:=\$(Path)\n"
+		);
+	}
+
+	&Output(		
+		"\n",
+		"# prevent MAKEFLAGS variable from upsetting calls to NMAKE\n",
+		"unexport MAKEFLAGS\n",
+		"\n",
+		"ERASE = $erasedefn\n",
+		"\n",
+		"\n",
+		"ifdef EFREEZE_ALLOW_REMOVE\n",
+		"REMOVEMACRO := EFREEZE_ALLOW_REMOVE=-remove\n",
+		"endif\n",
+		"\n",
+		"\n"
+	);
+
+	if ($eDrive) {
+		# Generate exports into emulated drives
+		&CreatePlatExports($RealPlat,$Exports);
+	}
+	my $Command;
+	foreach $Command (qw(CLEAN CLEANMAKEFILE CLEANALL FINAL FREEZE LIBRARY MAKEFILE RESOURCE SAVESPACE TARGET LISTING WHATMAKEFILE)) {
+		&Output(
+			"$Command :"
+		);
+
+			 if ($eDrive and $Command eq 'CLEAN'){
+				 &Output(" EXPORTCLEANGENERIC EXPORTCLEAN\$(CFG) ");
+				 foreach $Ref (@$DataRef) {
+					 &Output(" $Command$$Ref{Base}");
+				 }
+			 }	    	 
+			 elsif ($eDrive and $Command eq 'RESOURCE'){
+				 &Output(" EXPORTGENERIC EXPORT\$(CFG) ");
+			   	 foreach $Ref (@$DataRef) {
+					 &Output(" $Command$$Ref{Base}");
+				 }
+				 
+				 foreach $Ref (@$DataRef) {
+					 &Output("\n\nRESOURCE$$Ref{Base} : EXPORTGENERIC EXPORT\$(CFG)");
+				 }
+			  }
+			  else {
+			        if(@$DataRef){
+			        	foreach $Ref (@$DataRef) {
+			        		&Output(" $Command$$Ref{Base}");
+			           }
+			          } 		
+			         else {
+			         	&Output("\n","\t\@echo Nothing to do\n");
+			         }
+			  }  
+		&Output("\n","\n");
+	}
+	
+	&Output(
+		"WHAT :"
+	);
+	if($eDrive){
+	  &Output(" EXPORTWHATGENERIC EXPORTWHAT\$(CFG) ");
+	}
+	my $whatcount=0;
+	foreach $Ref (@$DataRef) {
+		unless ($$Ref{Tidy}) {
+			$whatcount++;
+			&Output(
+				" WHAT$$Ref{Base}"
+			);
+		}
+	}
+	if ($whatcount==0 and !$eDrive) {
+		&Output(
+			"\n",
+			"\t\@rem do nothing\n" 
+		);
+	}
+
+	&Output(
+		"\n",
+		"\n",
+		"CHECKSOURCE :"
+	);
+	my $CheckSource=' CHECKSOURCE_GENERIC';
+	foreach $Ref (@$DataRef) {
+		$CheckSource.=" CHECKSOURCE$$Ref{Base}" if ($$Ref{Ext} eq ".MMP");
+	}
+	&Output(
+		"$CheckSource\n"
+	);
+
+	&Output(
+		"\n",
+		"CHECKSOURCE_GENERIC :\n"
+	);
+
+	if ($CheckSourceBldInfIncludes{$Plat})
+		{
+		my %dummy;
+		$dummy{$CheckSourceBldInfIncludes{$Plat}} = 1;
+		&Output (CheckSource_MakefileOutput(%dummy));		
+		}
+
+	&Output (CheckSource_MakefileOutput(%CheckSourceMMPFILESMetaData));
+	&Output (CheckSource_MakefileOutput(%CheckSourceEXTENSIONSMetaData));
+	
+	&Output(
+		"\n",
+		"\n",
+		"TIDY :"
+	);
+	my $Tidy='';
+	foreach $Ref (@$DataRef) {
+		if ($$Ref{Tidy}) {
+			$Tidy.=" TIDY$$Ref{Base}";
+		}
+	}
+	if ($Tidy) {
+		&Output(
+			"$Tidy\n"
+		);
+	}
+	else {
+		&Output(
+			"\n",
+			"\t\@echo Nothing to do\n"
+		);
+	}
+	&Output(
+		"\n",
+		"\n"
+	);
+#	change for non-EPOC platforms
+	if ($RealPlat=~/^(WINS|WINSCW|WINC|TOOLS|TOOLS2)$/o) {
+		&Output(
+			"ROMFILE :\n"
+		);
+	}
+	else {
+		&Output(
+			'ROMFILE : STARTROMFILE'
+		);
+		foreach $Ref (@$DataRef) {
+			&Output(
+				" ROMFILE$$Ref{Base}"
+			);
+		}
+		&Output(
+			"\n",
+			"\n",
+			"STARTROMFILE :\n",
+			    "\t\@perl -S emkdir.pl \"", &Path_Chop($RomDir), "\"\n",
+			    "\t\@echo // $OutRomFile > $OutRomFile\n",
+			    "\t\@echo // >> $OutRomFile\n"
+		);
+		if ($Test) {
+			my ($Auto, $Manual);
+			foreach $Ref (@$DataRef) {
+				++$Auto unless ($$Ref{Manual} or $$Ref{Support});
+				++$Manual if ($$Ref{Manual});
+			}
+			if ($Auto) {
+				my $IbyTextFrom="data=$BatchPath$Plat.AUTO.BAT";
+				my $IbyTextTo="Test\\$Module.AUTO.BAT";
+				my $Spaces= 60>length($IbyTextFrom) ? 60-length($IbyTextFrom) : 1; 
+				&Output("\t\@echo ", $IbyTextFrom, ' 'x$Spaces, $IbyTextTo, ">> $OutRomFile\n");
+			}
+			if ($Manual) {
+				my $IbyTextFrom="data=$BatchPath$Plat.MANUAL.BAT";
+				my $IbyTextTo="Test\\$Module.MANUAL.BAT";
+				my $Spaces= 60>length($IbyTextFrom) ? 60-length($IbyTextFrom) : 1; 
+				&Output("\t\@echo ", $IbyTextFrom, ' 'x$Spaces, $IbyTextTo, ">> $OutRomFile\n");
+			}
+		}
+	}
+	&Output(
+		"\n",
+		"\n"
+	);
+	my $CallNmake='nmake -nologo -x - $(VERBOSE) $(KEEPGOING)';
+	my $CallGNUmake='$(MAKE) $(VERBOSE) $(KEEPGOING)';
+
+	my %PlatHash;
+	&Plat_GetL($RealPlat, \%PlatHash);
+	my $CallMake=$CallNmake;
+	if ($PlatHash{MakeCmd} eq "make") {
+		$CallMake="$CallGNUmake -r";
+	}
+	&Plat_GetL($Plat, \%PlatHash);
+	
+	foreach $Ref (@$DataRef) {
+
+#		standard commands
+		unless ($$Ref{Makefile}) {
+			my $MakefilePath=join('', &Path_Chop($E32MakePath), $BldInfPath, $$Ref{Base}, "\\", $RealPlat, "\\");
+# modified start: makefile improvement 
+			my $RealMakefile;
+			if($FeatureVariant eq "")
+			{
+				$RealMakefile="-f \"$MakefilePath$$Ref{Base}.$RealPlat$FeatureVariant\"";
+			}
+			else{
+				$RealMakefile="-f \"$MakefilePath$$Ref{Base}.$RealPlat.\$(VARIANT_PLAT_NAME_$$Ref{Base})\"";
+			}
+# modified end: makefile improvement 
+			my $MakefileBase="$MakefilePath$$Ref{Base}";		
+
+			if($Plat eq 'VS6' || $Plat eq 'VS2003')
+			{
+				$CallMake .= "-f ";
+				$RealMakefile = "$MakefileBase$PlatHash{Ext}";
+			}
+			&Output(
+				"MAKEFILE$$Ref{Base}_FILES= \\\n",
+					"\t\"$MakefileBase$PlatHash{Ext}$FeatureVariant\"",
+			);
+#			changes for WINS/WINSCW/WINC and VC6
+			if ($Plat =~ /^VC6/) {
+				&Output(
+					" \\\n\t\"$MakefileBase.DSW\"",
+					" \\\n\t\"$MakefileBase.SUP.MAKE\""
+				);
+			}
+			if ($Plat eq 'CW_IDE') {
+				&Output(
+					" \\\n\t\"$MakefileBase.pref\""		# Defect: actually uses $BaseTrg, not mmp file name
+				);
+			}
+			if ($RealPlat=~/^(WINS|WINSCW|WINC)$/o) {
+				&Output(
+					" \\\n\t\"$MakefileBase.UID.CPP\""	# Defect: actually uses $BaseTrg, not mmp file name
+				);
+			}
+			
+  			my $bld_flags="";
+			$bld_flags="\$(ABLD_FLAGS)" if (($Plat =~ /^ARMV5(_ABIV1)?$/ || grep /$Plat/i, @BPABIPlats) || (Plat_Root($Plat) =~ /^ARMV5(_ABIV1)?$/ || grep /$Plat/i, @BPABIPlats));
+			
+			
+			my $build_as_arm_arg="";
+			$build_as_arm_arg = $$Ref{BuildAsARM} if ($$Ref{BuildAsARM});
+
+			# Compiler Wrapper option Support  
+			# Generate the flag to keep the Compiler Wrapper option information
+			my $cmp_wrap_flag="";
+			if (($Plat =~ /^ARMV5(_ABIV1)?$/ || grep /$Plat/i, @BPABIPlats) || ($Plat=~/^WINSCW$/) || (Plat_Root($Plat) =~ /^ARMV5(_ABIV1)?$/ || grep /$Plat/i, @BPABIPlats))
+			{
+				# for armv5 , armv5_abiv1, winscw and all bpabi plaforms
+				$cmp_wrap_flag="\$(ABLD_COMPWRAP_FLAG)" ;
+			}
+
+			&Output(
+				"\n",
+				"\n",
+				"MAKEFILE$$Ref{Base} :\n",
+				    "\tperl -S makmake.pl \$(NO_DEPENDENCIES) -D $$Ref{Path}$$Ref{Base} $Plat$FeatureVariant $build_as_arm_arg $bld_flags $cmp_wrap_flag\n",
+
+				"\n",
+				"CLEANMAKEFILE$$Ref{Base} :\n",
+				    "\t-\$(ERASE) \$(MAKEFILE$$Ref{Base}_FILES)\n",
+				"\n",
+				"WHATMAKEFILE$$Ref{Base} :\n",
+				    "\t\@echo \$(MAKEFILE$$Ref{Base}_FILES)\n",
+				"\n",
+				"TARGET$$Ref{Base} :\n",
+				    "\t$CallMake $RealMakefile \$(CFG)\n",
+				"\n",
+				"SAVESPACE$$Ref{Base} :\n",
+				    "\t$CallMake $RealMakefile \$(CFG) CLEANBUILD\$(CFG)\n",
+				"\n",
+				"LISTING$$Ref{Base} :\n",
+				    "\t$CallMake $RealMakefile MAKEWORK\$(CFG) LISTING\$(CFG)\$(SOURCE)\n",
+				"\n",
+				"FINAL$$Ref{Base} :\n",
+				    "\t\@rem do nothing\n",
+				"\n",
+			);
+			foreach $Command (qw(CLEANALL)) {
+				&Output(
+					"CLEANALL$$Ref{Base} :\n",
+					"\tperl -S ermdir.pl $MakefilePath\n",
+					"\n",
+				);
+			}
+			foreach $Command (qw(CLEAN RESOURCE)) {
+				&Output(
+					"$Command$$Ref{Base} :\n",
+					    "\t$CallMake $RealMakefile $Command\$(CFG)\n",
+					"\n"
+				);
+			}
+			foreach $Command (qw(LIBRARY)) {
+				&Output(
+					"$Command$$Ref{Base} :\n",
+					    "\t$CallMake $RealMakefile $Command\n",
+					"\n"
+				);
+			}
+			foreach $Command (qw(FREEZE)) {
+				&Output(
+					"$Command$$Ref{Base} :\n",
+					    "\t$CallMake $RealMakefile $Command \$(REMOVEMACRO)\n",
+					"\n"
+				);
+			}
+			unless ($$Ref{Tidy}) {
+				&Output(
+					"WHAT$$Ref{Base} :\n",
+					    "\t\@$CallMake -s $RealMakefile WHAT\$(CFG)\n",
+					"\n"
+				);
+			}
+			else {
+				&Output(
+					"TIDY$$Ref{Base} :\n",
+					    "\t$CallMake $RealMakefile CLEANRELEASE CLEANLIBRARY\n",
+					"\n"
+				);
+			}
+			
+			&Output(
+				"CHECKSOURCE$$Ref{Base} :\n",
+					"\t\@$CallMake -s $RealMakefile CHECKSOURCE\n",
+					"\t\@$CallMake -s $RealMakefile CHECKSOURCE\$(CFG)\n",
+				"\n"
+				);
+			&Output(
+				"ROMFILE$$Ref{Base} :\n",
+				    "\t\@$CallMake $RealMakefile ROMFILE >> $OutRomFile\n",
+				"\n",
+				"\n"
+			);
+		}
+
+#		calls to custom makefiles
+		else {
+			my $ChopRefPath=&Path_Chop($$Ref{Path});
+			my $ChopBldInfPath=&Path_Chop($BldInfPath);
+			my $MakefileCall;
+			if ($$Ref{Makefile}==2) {
+				$MakefileCall="cd $ChopRefPath;$CallNmake";
+			} else {
+				$MakefileCall="$CallGNUmake -C $ChopRefPath";
+			}
+			$MakefileCall.=" -f \"$$Ref{Base}$$Ref{Ext}\" TO_ROOT=";
+			$MakefileCall.=&Path_Chop(&Path_UpToRoot($$Ref{Path}));
+			$MakefileCall.=" EPOCBLD=";
+			$MakefileCall.=join('', &Path_Chop(&Path_UpToRoot($$Ref{Path})), &Path_Chop($E32MakePath), $BldInfPath, $$Ref{Base}, "\\", $RealPlat);
+			$MakefileCall.=" TO_BLDINF=";
+			$MakefileCall.=join('', &Path_Chop(&Path_UpToRoot($$Ref{Path})), $ChopBldInfPath);
+			if ($$Ref{ExtensionRoot}) {
+				$MakefileCall.=" EXTENSION_ROOT=".&Path_Chop($$Ref{ExtensionRoot});
+			}
+			if ($$Ref{BuildAsARM}) {
+			  $MakefileCall.=" BUILD_AS_ARM=1";
+			}			  
+			&Output(
+# should change to MAKEFILE
+				"MAKEFILE$$Ref{Base} :\n",
+				    "\t$MakefileCall PLATFORM=$Plat MAKMAKE\n",
+				"\n",
+# should call in custom makefiles maybe
+				"CLEANMAKEFILE$$Ref{Base} :\n",
+				"#	$MakefileCall PLATFORM=$Plat CLEANMAKEFILE\n",
+				"\n",
+				"WHATMAKEFILE$$Ref{Base} :\n",
+				"#	\@$MakefileCall -s PLATFORM=$Plat WHATMAKEFILE\n",
+				"\n",
+# should change to TARGET
+				"TARGET$$Ref{Base} :\n",
+				    "\t$MakefileCall PLATFORM=$RealPlat CFG=\$(CFG) BLD\n",
+				"\n",
+# should ignore this target and just call the TARGET target instead?
+				"SAVESPACE$$Ref{Base} :\n",
+				    "\t$MakefileCall PLATFORM=$RealPlat CFG=\$(CFG) SAVESPACE\n",
+				"\n",
+				"LISTING$$Ref{Base} :\n",
+				"\n",
+				"\n",
+# should change to LIBRARY
+				"LIBRARY$$Ref{Base} :\n",
+				    "\t$MakefileCall PLATFORM=$RealPlat LIB\n",
+				"\n",
+				"FREEZE$$Ref{Base} :\n",
+					"\t$MakefileCall PLATFORM=$RealPlat FREEZE \$(REMOVEMACRO)\n",
+				"\n",
+			);
+
+			foreach $Command (qw(CLEANALL)) {
+				&Output(
+					"$Command$$Ref{Base} :\n",
+					"\t$MakefileCall PLATFORM=$RealPlat CFG=\$(CFG) CLEAN\n",
+					"\n"
+				);
+			}
+
+			foreach $Command (qw(CLEAN RESOURCE FINAL)) {
+				&Output(
+					"$Command$$Ref{Base} :\n",
+					    "\t$MakefileCall PLATFORM=$RealPlat CFG=\$(CFG) $Command\n",
+					"\n"
+				);
+			}
+			unless ($$Ref{Tidy}) {
+# should change to WHAT
+				&Output(
+					"WHAT$$Ref{Base} :\n",
+					    "\t\@$MakefileCall -s PLATFORM=$RealPlat CFG=\$(CFG) RELEASABLES\n",
+					"\n"
+				);
+			}
+			else {
+				&Output(
+					"TIDY$$Ref{Base} :\n",
+					    "\t$MakefileCall PLATFORM=$RealPlat TIDY\n",
+# should change to CLEANLIBRARY
+					    "\t$MakefileCall CLEANLIB\n",
+					"\n"
+				);
+			}
+			&Output(
+				"ROMFILE$$Ref{Base} :\n",
+				    "\t\@$MakefileCall PLATFORM=$RealPlat ROMFILE >> $OutRomFile\n",
+				"\n",
+				"\n"
+			);
+		}
+
+	}
+	
+	&WriteOutFileL("$BatchPath$Plat$FeatureVariant$Test.MAKE");
+}
+
+sub CreatePlatBatches ($$$) {
+	my ($OutDir, $DataRef, $Plat)=@_;
+
+#	create the test batch files
+#	this function won't work properly if the target basename is different from the .MMP basename
+#	so perhaps it should call makmake on the .mmp file to check
+
+	my $AutoText;
+	my $ManualText;
+
+	my $Ref;
+	foreach $Ref (@$DataRef) {
+		if ($$Ref{Manual}) {
+			$ManualText.="$$Ref{Base}\n";
+			next;
+		}
+		if ($$Ref{Ext} eq ".MK") {
+			next;
+		}
+		if ($$Ref{Support}) {
+			next;
+		}
+		else {
+			$AutoText.="$$Ref{Base}\n";
+		}
+	}
+
+	if ($AutoText) {
+		&Output($AutoText);
+		&WriteOutFileL("$OutDir$Plat.AUTO.BAT");
+	}
+
+	if ($ManualText) {
+		&Output($ManualText);
+		&WriteOutFileL("$OutDir$Plat.MANUAL.BAT");
+	}
+}
+
+sub WriteOutFileL ($$) { # takes batch file and boolean read-only flag
+	my ($BATFILE, $ReadOnly)=@_;
+
+	$BATFILE=~ s/\//\\/g;  # convert unix slashes from wrappermakefile.pm
+
+	eval { &Path_MakePathL($BATFILE); };
+	&FatalError($@) if $@;
+
+	open BATFILE,">$BATFILE" or &FatalError("Can't open or create Batch File \"$BATFILE\"");
+	print BATFILE &OutText or &FatalError("Can't write output to Batch File \"$BATFILE\"");
+	close BATFILE or &FatalError("Can't close Batch File \"$BATFILE\"");
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/egmak.fil	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,79 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# A template custom-build extension makefile - for carrying out build activities
+# not handled by MAKMAKE-generated makefiles.
+# List this file in the PRJ_MMPFILES or PRJ_TESTMMPFILES of your BLD.INF file with the
+# keyword MAKEFILE, e.g. MAKEFILE EGMAK.FIL.
+# All the targets below should be provided, even if they do nothing, or else errors may
+# be generated.
+# Extension makefiles and makefiles generated from .MMP files are called in the order
+# in which they are specified in the BLD.INF file.
+# You can use defines
+# !IF "$(PLATFORM)" == "[<platform>]"
+# !ENDIF
+# or
+# !IF "$(CFG)" == "[UDEB|UREL]"
+# !ENDIF
+# to carry out different activities for different platforms and build configurations.
+#
+
+
+# This target is called by ABLD CLEAN ...
+CLEAN :
+#	add commands here to clean your component.
+
+
+# This target is called by ABLD FINAL ...
+FINAL :
+#	add commands here to execute any required final activities to complete the building
+#	of your component.
+
+
+# This target is called by ABLD FREEZE ...
+FREEZE :
+#	add commands here to be carried out when exports are frozen.
+
+
+# This target is called by ABLD LIBRARY ...
+LIB :
+#	add commands here to be carried out when import libraries are created.
+
+
+# This target is called by ABLD MAKEFILE ...
+MAKMAKE :
+#	add commands here to be carried out when makefiles are created.
+
+
+# This target is called by ABLD RESOURCE ...
+RESOURCE :
+#	add commands here to be carried out when resources, bitmaps and aifs are created.
+
+
+# This target is called by ABLD TARGET ...
+BLD : 
+#	add commands here to be carried out when main executables are created.
+
+
+# This target is called by ABLD -savepace TARGET ...
+SAVESPACE :
+#	add commands here to be carried out when main executables are created and
+#	intermediate files are removed.
+
+
+# This target is called by ABLD -what TARGET ...  and ABLD -check TARGET ...
+RELEASABLES :
+#	add commands here to list the releasables this makefile will create.
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/linkdeps.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,210 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Generate a link-dependency graph
+# Given a baseline list of components, look through the BLDMAKE
+# generated files to find the individual DLL and EXE makefiles.
+# Scan those makefile to find out which .LIB files are generated,
+# and which .LIB files are required, thereby deducing the 
+# component dependency graph.
+# 
+#
+
+my @components;
+my %component_releases;
+my %components_by_lib;
+my %libs_needed;
+my %component_deps;
+my $errors = 0;
+my @platforms = ("WINS", "ARMI", "MAWD");
+my $makefile_count=0;
+
+while (<>)
+	{
+	s/\s*#.*$//;
+	if ($_ =~ /^$/)
+		{
+		next;
+		}
+
+	if ($_ =~ /<option (\w+)(.*)>/)
+		{
+		# placeholder
+		next;	
+		}
+
+	push @components, lc $_;
+	}
+
+scan_bldmakes();
+
+if ($makefile_count==0)
+	{
+	error("No makefiles scanned!??");
+	}
+
+if (%libs_needed==0)
+	{
+	error("No libraries needed!??");
+	}
+
+foreach $lib (sort keys %libs_needed)
+	{
+	if ($components_by_lib{$lib} eq "")
+		{
+		error("library $lib is not produced by any component!");
+		$components_by_lib{$lib} = "($lib)";
+		}
+	}
+
+if ($errors > 0)
+	{
+	print "\n";
+	}
+
+foreach $component (sort keys %component_deps)
+	{
+	my %dependencies;
+
+	foreach $lib (split /\s+/, $component_deps{$component})
+		{
+		next if ($lib eq "");
+		my $dependent = $components_by_lib{$lib};
+		$dependencies{$dependent} = 1;
+		}
+
+	print "$component $component_releases{$component}:";
+	foreach $dependent (sort keys %dependencies)
+		{
+		next if ($dependent eq $component);
+		print " $dependent";
+		}
+	print "\n";
+	}
+
+sub scan_bldmakes
+	{
+	foreach $line (@components)
+		{
+		next if ($line =~ /<special (\w+)(.*)>/);
+		my ($name, $groupdir, $subdir, $release) = split /\s+/,$line;
+		$component_releases{$name} = $release;
+		my $bldmake = "\\epoc32\\build\\$groupdir";
+		if (! -d $bldmake)
+			{
+			error("bldmake failed for $name $release");
+			next;
+			}
+		foreach $platform (@platforms)
+			{
+			scan_bldmake_makefile($name,"$bldmake\\$platform.make");
+			}
+		}
+	}
+
+exit ($errors > 0);
+
+sub error
+	{
+	my ($text) = @_;
+	print "# ERROR: $text\n";
+	$errors+=1;
+	}
+
+# In \epoc32\build\<place>\wins.make
+#
+# SAVESPACEAPPARC :
+#	nmake -nologo $(VERBOSE) -f "\EPOC32\BUILD\APPARC\GROUP\WINS\APPARC.WINS" $(CFG) CLEANBUILD$(CFG)
+#
+# repeated N times
+
+sub scan_bldmake_makefile
+	{
+	my ($component, $makefile) = @_;
+	if (! -e $makefile) 
+		{
+		return;
+		}
+	open FILE, "<$makefile" or error("Can't open $makefile") and return;
+	while ($line = <FILE>)
+		{
+		if ($line =~ /^SAVESPACE/)
+			{
+			$line = <FILE>;
+			if ($line =~ /-f "(\S+)"\s/i)
+				{
+				scan_mmp_makefile($component,$1);
+				}
+			}
+		}
+	close FILE;
+	}
+
+# In \EPOC32\MAKE\LEXICON\WINS\INSO.WINS
+#
+# # MMPFile \LEXICON\GROUP\INSO.MMP
+# # Target INSO.LIB
+# # TargetType LIB
+# # GeneralTargetType LIB
+#
+
+# In \EPOC32\BUILD\APPARC\GROUP\WINS\APPARC.WINS
+#
+# LIBRARY : "$(EPOCLIB)UDEB\APPARC.LIB"
+#
+# LIBS= \
+#	"$(EPOCLINKDEB)\EUSER.LIB" \
+#	"$(EPOCLINKDEB)\EFSRV.LIB" \
+#	"$(EPOCLINKDEB)\GDI.LIB" \
+#	"$(EPOCLINKDEB)\ESTOR.LIB"
+#
+sub scan_mmp_makefile
+	{
+	my ($component, $makefile) = @_;
+	open SUBFILE, "<$makefile" or error("Can't open mmp $makefile for $component") and return;
+	$makefile_count++;
+	while ($line = <SUBFILE>)
+		{
+		if ($line =~ /^LIBRARY : .*\\(\S+)"/ || 
+			$line =~ /^# Target (\S+\.LIB)/)
+			{
+			my $built_lib = $1;
+			my $previous = $components_by_lib{$built_lib};
+			if ($previous && $previous ne $component)
+				{
+				error("$built_lib is generated by $component and $previous");
+				next;
+				}
+			$components_by_lib{$built_lib} = $component;
+			next
+			}
+		if ($line =~ /^LIBS= \\/)
+			{
+			while ($line = <SUBFILE>)
+				{
+				if ($line =~ /\\(\S+)"/)
+					{
+					$component_deps{$component} .= " $1";
+					$libs_needed{$1} = 1;
+					}
+				if ($line !~ /\\$/)
+					{
+					last;
+					}
+				}
+			}
+		}
+	close SUBFILE;
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/metabld.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+@REM Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM
+@REM Contributors:
+@REM
+@REM Description:
+@REM
+
+@echo off
+
+
+perl -S metabld.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/metabld.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,367 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# all variables called *Path* are set up to end with a backslash
+# all variables called *Path or *File are stored as absolute (file)paths within makmake
+# all variables called UpPath* are stored as relative paths within makmake
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use File::Find;
+use Cwd;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+
+use lib $PerlLibPath;
+use E32env;
+use Prepfile;
+use Pathutl;
+
+# autoflush prevents our ouptut from getting jumbled up
+use FileHandle;
+autoflush STDOUT 1;
+autoflush STDERR 1;
+
+my (@Commands, @BldInfDirs);
+# should end in .mbc where .mbc means for "MetaBld Configuration file"
+# must end in .mbc if passed on command-line
+my $ConfigFile;
+
+my $StartDir=&cwd();
+my $relative;
+	{
+	# Process command-line
+	
+  	unless (@ARGV)
+		{
+		&Usage();
+		}
+	else
+		{
+		# check to see if we are using a relative path 
+	  	if ($ARGV[0] eq "-r")
+			{
+			$relative = 1;
+			shift @ARGV;
+			}
+
+		# check for a root from a config file in EPOCROOT dir as first argument
+	  	if (-e "$ENV{EPOCROOT}$ARGV[0].mbc")
+			{
+		  	$ConfigFile="$ENV{EPOCROOT}$ARGV[0].mbc";
+		  	shift @ARGV;
+			}
+		# check for a config file as the first argument
+	  	elsif ($ARGV[0]=~/.mbc$/io)
+			{
+			$ConfigFile=shift @ARGV;
+			if ($ConfigFile=~/^.:/o)
+				{
+				&Error("Config file can't be specified with a drive letter, as \"$ConfigFile\" is");
+				}
+			unless (-e $ConfigFile)
+				{
+				&Error("Can't find file $ConfigFile");
+				}
+			}
+		if (@ARGV)
+			{
+			# pass any other arguments as commands
+			@Commands=("@ARGV");
+			}
+		}
+	}
+
+	{
+	# scan config file if necessary
+	
+	if ($ConfigFile)
+		{
+		# make config file path absolute
+		$ConfigFile=&Path_AbsToWork($ConfigFile);
+		
+		my @Config2D;
+		eval { &Prepfile_ProcessL(\@Config2D, $ConfigFile); };
+		&Error($@) if $@;
+		
+		my %CheckDir;
+		
+		my @ConfigCommands;
+		my $Section='';
+		my @Death;
+		my $Line;
+		my $CurFile=$ConfigFile;
+	  LINE: foreach $Line (@Config2D)
+			{
+			my $LineNum=shift @$Line;
+			$_=shift @$Line;
+			if ($LineNum eq '#')
+				{
+				$CurFile=$_;
+				next;
+				}
+			if (/^SECTION_(\w*)$/io)
+				{
+				$Section=uc $1;
+				if ($Section=~/^(COMMANDS|DIRS|OPTIONALDIRS)$/o)
+					{
+					if (@$Line)
+						{
+						push @Death, "$CurFile($LineNum) : Can't specify anything on the same line as a section header\n";
+						}
+					next LINE;
+					}
+				push @Death, "$CurFile($LineNum) : Unknown section header - $_\n";
+				$Section=0;
+				next LINE;
+				}
+			unshift @$Line, $_;
+			if ($Section eq 'COMMANDS')
+				{
+				if ($$Line[0]=~/^ONEOFF$/io)
+					{
+					# check syntax for oneoff commands
+					unless (@$Line>=3)
+						{
+						push @Death, "$CurFile($LineNum) : Too few arguments for oneoff command\n";
+						}
+					# resolve oneoff dir relative to .mb file location
+					$$Line[1]=~s-^.*[^\\]$-$&\\-o; # add trailing backslash if necessary
+					$$Line[1]=&Path_MakeAbs($CurFile, $$Line[1]);
+					unless (-d $$Line[1])
+						{
+						warn "$CurFile($LineNum) : Can't find dir $$Line[1]\n";
+						}
+					}
+				push @ConfigCommands, "@$Line";
+				next LINE;
+				}
+			if ($Section eq 'DIRS' || $Section eq 'OPTIONALDIRS')
+				{
+				my $Dir;
+				foreach $Dir (@$Line)
+					{
+					if ($Dir=~/^.:/o)
+						{
+						push @Death, "$CurFile($LineNum) : directory $Dir is specified with a drive letter\n";
+						next;
+						}
+					$Dir=~s-^.*[^\\]$-$&\\-o;
+					$Dir=&Path_MakeAbs($CurFile, $Dir); # dirs must be the same for check
+					if ($CheckDir{uc $Dir})
+						{
+						# Silently ignore duplicate directories - #including of several .mbc files
+						# will often cause directory duplication.
+						# We can't do the same for duplicate commands because the order in which
+						# the commands are executed might be significant.
+						# push @Death, "$CurFile($LineNum) : Directory $Dir already specified\n";
+						next;
+						}
+					print "$Dir\n";
+					
+					unless (-d $Dir)
+						{
+						if ($Section ne 'OPTIONALDIRS')
+							{
+							push @Death, "$CurFile($LineNum) : Can't find directory $Dir\n";
+							}
+						next;
+						}
+					push @BldInfDirs, $Dir;
+					$CheckDir{uc $Dir}=$LineNum;
+					}
+				next LINE;
+				}
+			else
+				{
+				push @Death, "$CurFile($LineNum) : No section specified\n";
+				}
+			}
+		
+		if (@Death)
+			{
+			chomp $Death[$#Death];
+			&Error(@Death);
+			}
+		
+		# apply the commands unless already collected
+		unless (@Commands)
+			{
+			&Error("$ConfigFile : No Commands specified") unless @ConfigCommands;
+			@Commands=@ConfigCommands;
+			}
+		}
+	
+	# Should have commands now
+	&Usage() unless @Commands;
+	}
+
+	{
+	# Search for the BLD.INF files if necessary
+
+	my $mystartdir;
+	if ($relative)
+	{
+		$mystartdir = substr($StartDir, 2);
+	}
+
+	$mystartdir=~s:\/:\\:g;
+
+	if ($mystartdir ne "\\")
+		{
+		$mystartdir=$mystartdir."\\";
+		}
+
+	unless (@BldInfDirs)
+		{
+		# find the files in the source directories - skip the EPOCROOT directory
+		
+		my $EPOCROOTDir=$E32env::Data{EPOCPath};
+		$EPOCROOTDir=~s/^\\([^\\]*).*$/$1/o;
+		
+		opendir DIR, $mystartdir or &Error("Can't open dir: $!");
+		# remove ., .. and EPOCROOT dir
+		my @SrcDirs=grep !/^(\.\.?|$EPOCROOTDir|RECYCLER|System Volume Information)$/i, readdir DIR; 
+		foreach (@SrcDirs)
+			{
+			# prepend with current path
+			$_=$mystartdir.$_;
+			}
+		@SrcDirs=grep -d, @SrcDirs;
+		find(\&BldInfDirs, @SrcDirs);
+		@BldInfDirs=sort @BldInfDirs;
+
+		# if we are doing it relative to current location, need to include current dir
+		# if it contains a bld.inf
+		if (-f "BLD.INF" && $relative)
+			{
+			push @BldInfDirs, $mystartdir;
+			}
+
+		}
+	}
+
+	{
+	# Execute the commands
+	
+	my $Time=localtime;
+	print "=== metabld started $Time.\n";
+	my $Command;
+	foreach $Command (@Commands)
+		{
+		
+		$Time=localtime;
+		# Check if we should execute this command just the once
+		if ($Command=~s/^\s*ONEOFF\s+(\S+)\s+(.*)$/$2/io)
+			{
+			my $OneOffDir=$1;
+			# execute the command once rather than for each BLD.INF directory
+			chdir $OneOffDir or &Error("Can't change dir to $OneOffDir: $!");
+			print
+			(
+			 "===-------------------------------------------------\n",
+			 "=== $Command\n",
+			 "===-------------------------------------------------\n",
+			 "=== $Command started $Time.\n",
+			 "=== $Command == $OneOffDir\n"
+			);
+			system( "$Command");
+			}
+		else
+			{
+			# execute the command for each BLD.INF directory
+			print
+			(
+			 "===-------------------------------------------------\n",
+			 "=== $Command\n",
+			 "===-------------------------------------------------\n",
+			 "=== $Command started $Time.\n",
+			);
+			my $Dir;
+			foreach $Dir (@BldInfDirs)
+				{
+				chdir $Dir or &Error("Can't change dir to $Dir: $!");
+				print "=== $Command == $Dir\n";
+				system( "$Command");
+				}
+			}
+		chdir $StartDir or &Error("Can't change dir to $StartDir: $!");
+		$Time=localtime;
+		print "=== $Command finished $Time.\n";
+		}
+	}
+
+
+#################################################
+#	SUBROUTINES
+#################################################
+
+sub Usage
+	{
+	print <<ENDHERESTRING;
+usage: metabld [EPOCROOT .mbc file basename|.mbc config file] [command]
+MetaBld is a tool for carrying out build commands across several components.
+A .mbc config file contains directories and commands, eg:
+
+SECTION_COMMANDS
+bldmake bldfiles
+abld target wins udeb
+// "oneoff" means carry out command just once, not for each directory.
+// First arg after "oneoff" must be a start dir, and can be "."
+oneoff \\e32\\rombuild rom xxx
+oneoff . \\e32test\\group\\abld test build wins urel
+SECTION_DIRS
+\\e32
+\\f32\\group
+
+It's possible to #include lists of dirs from other files if necessary,
+and may be useful for carrying out different sets of commands on the same set
+of directories via different .mbc files.
+If a command is specified on the command-line, it will be executed instead
+of any commands specified in a .mbc file.
+If no directories are specified in a .mbc file, then all the directories
+containing a bld.inf file on the current drive will be searched for instead.
+ENDHERESTRING
+exit 1;
+}
+
+sub Error (@)
+	{
+	
+	die
+	@_, "\n",
+	"Error executing metabld.bat\n"
+	;
+	}
+
+sub BldInfDirs
+	{
+	s-\/-\\-go;
+	if (/^BLD.INF$/io)
+		{
+		$File::Find::dir=~s-\/-\\-go;
+		push @BldInfDirs, $File::Find::dir;
+		}
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/bldmake/wrappermakefile.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package		wrappermakefile;
+require Exporter;
+@wrappermakefile::ISA=qw(Exporter);
+@wrappermakefile::EXPORT=qw(
+	GenerateWrapper
+);
+
+use Output;
+
+my (@ExtensionUsedBefore);
+my $ExtTemplatesPath="$ENV{EPOCROOT}epoc32/tools/makefile_templates/";
+$ExtTemplatesPath=~ s/\\/\//g;  # convert win32 slashes to unix slashes
+my $DieRef;
+our $ExtMakefileMissing = 0;
+
+# Add prototyes to avoid -w warnings
+sub GenerateWrapper($$$$@);  
+sub ReadMetaFile($$$$);
+
+
+sub GenerateWrapper($$$$@) {	
+	my ($Plat,$OutDir, $ErrorString, $dieRef, @ExtensionBlockData) = @_;
+	$DieRef = $dieRef;
+	
+#	Generates a makefile which contains the settings for each invocation of an extension and calls
+#	through to the extension template makefile in /epoc32/tools/makefile_templates.
+#	@ExtensionBlockData holds the settings (makefile MACROs) defined within the start..end block in the bld.inf.
+
+	my $ExtHeader = shift(@ExtensionBlockData);
+
+	if (uc $ExtHeader->[0] ne "EXTENSION") {
+		&main::FatalError("$ErrorString : Extension Template blocks must contain the 'extension' keyword.\n");
+	}
+	if ($ExtHeader->[1] eq "") {
+		&main::FatalError("$ErrorString : The 'extension' does not have a name, the correct format is: 'start extension <name>'.\n");
+	}
+	my $ExtName = $ExtHeader->[1];
+
+#	Ensure that each extension invocation is uniquely identified by means of the global array 
+#	ExtensionUsedBefore.
+	my $Count=0;
+	push @ExtensionUsedBefore, $ExtName.$Plat;
+	foreach my $item(@ExtensionUsedBefore) {
+		if ($item eq $ExtName.$Plat) {
+			$Count = $Count + 1;
+		}
+	}
+
+#	Process the meta information for this extension template.
+	my %Data;
+	my %WrapperMakefileData = ReadMetaFile($ExtName, $ErrorString, \$Data{Makefile},$dieRef);
+	if ($ExtMakefileMissing)
+	{
+		main::ExtensionMakefileMissing($ExtMakefileMissing);
+		return;
+	}
+	$Data{Ext}='.MK';
+	$Data{Base}=$ExtName."_".$Plat."_".$Count;
+	$Data{Path}=$OutDir."wrappermakefiles/";
+
+#	Process ExtensionBlockData
+	foreach my $ExtBlockStatement (@ExtensionBlockData) {
+		my $Key = shift(@$ExtBlockStatement);
+		$WrapperMakefileData{$Key}=$ExtBlockStatement;
+	}
+
+#	CreateWrapperMakefile
+	&Output("# Bldmake generated wrapper makefile\n\n");
+	foreach my $Key (keys (%WrapperMakefileData))
+	{
+			&Output("$Key = "); 
+			foreach my $item(@{$WrapperMakefileData{$Key}}) {
+				&Output(" $item");
+			}
+			&Output("\n");
+	}
+	my $Filename = lc("$ExtName$Data{Ext}");
+	&Output("\ninclude $ExtTemplatesPath$Filename"); 
+	my $Path = lc("$Data{Path}");
+	&main::WriteOutFileL(lc ($Path.$ExtName."_".$Plat."_".$Count.$Data{Ext}));
+	%WrapperMakefileData = ();
+	return %Data;  
+}
+
+#  Read extension meta file data
+sub ReadMetaFile($$$$) {
+	my ($ExtName, $ErrorString, $Makefile,$dieRef) = @_;
+
+#	Parse the .meta file (found via $ExtName) for this extension template and return a hash 
+#	containing the default values (makefile MACROs) for this template.
+#	$Makefile is updated to indicate whether this a gnumake or nmake makefile.
+
+	my %MetaData;
+	my $Filename = lc("$ExtName");
+	$ExtMakefileMissing=0;
+	if (!open(METAFILE,"$ExtTemplatesPath$Filename.meta"))
+	{
+		&main::WarnOrDie($dieRef, "$ErrorString : Extension: $ExtName - cannot open META file: $ExtTemplatesPath$Filename.meta\n");
+		$ExtMakefileMissing = 1;
+		return;
+	}
+	LINE: while (<METAFILE>) {
+		chomp;		
+		my @Elements = split(/\s*\s\s*/);		
+		my $Keyword = uc shift(@Elements);
+
+		if ((! $Keyword) or ($Keyword =~ m/^#/)) {
+			next LINE;
+		}
+
+		if ($Keyword eq "MAKEFILE") {	
+			my $Makefiletype = uc shift(@Elements);		
+			if ($Makefiletype eq "GNUMAKE") {
+				$$Makefile=1;
+			}
+			if ($Makefiletype eq "NMAKE") {
+				$$Makefile=2;
+			}
+		}
+		elsif ($Keyword eq "OPTION") {
+			my $Key = shift(@Elements);
+			if ((! $Key) or (! $Elements[0])) {
+					&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - the correct format for default options is: 'option <key> <value>'");
+				}
+			my @Values = @Elements;
+			$MetaData{$Key}=\@Values;
+		} 
+		elsif (($Keyword eq "TECHSTREAM") or ($Keyword eq "PLATFORM")) {
+			# not used
+		}
+		else {
+			&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - unrecognised keyword:$Keyword");	
+		}
+	}
+	if (! $$Makefile) {
+		&main::FatalError("$ErrorString : There is a syntax error in the META file ($ExtTemplatesPath$Filename.meta) for this extension ($ExtName) - makefile type not specified [gnumake|nmake]");
+	}
+	close(METAFILE) or &main::FatalError("$ErrorString : Extension: $ExtName - cannot close Meta File:$ExtTemplatesPath$ExtName.meta\n");
+	return %MetaData;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/abld.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,520 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff0\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2052{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial{\*\falt  arial};}
+{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}{\f36\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}
+{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}
+{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}{\f43\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f48\fswiss\fcharset238\fprq2 Arial CE{\*\falt  arial};}{\f49\fswiss\fcharset204\fprq2 Arial Cyr{\*\falt  arial};}{\f51\fswiss\fcharset161\fprq2 Arial Greek{\*\falt  arial};}
+{\f52\fswiss\fcharset162\fprq2 Arial Tur{\*\falt  arial};}{\f53\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew){\*\falt  arial};}{\f54\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic){\*\falt  arial};}
+{\f55\fswiss\fcharset186\fprq2 Arial Baltic{\*\falt  arial};}{\f56\fswiss\fcharset163\fprq2 Arial (Vietnamese){\*\falt  arial};}{\f170\fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f398\fmodern\fcharset238\fprq1 Lucida Console CE;}
+{\f399\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f401\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f402\fmodern\fcharset162\fprq1 Lucida Console Tur;}{\f410\fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}}{\colortbl;\red0\green0\blue0;
+\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
+\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\upr{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \snext0 \styrsid2102810 Normal;}{\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 \b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 \b\fs34\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 2;}{\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 4;}{\s5\ql \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 5;}{\s6\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 
+\i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 7;}{
+\s8\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 8;}{\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs18\alang1025 \ltrch\fcs0 
+\i\fs18\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden \styrsid2102810 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\lang2057\langfe0\langnp2057 \sbasedon10 Code;}{\*\cs17 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Emphasis;}{\*\cs18 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Warning;}{\s19\ql \li567\ri0\keep\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang1024\langfe1024\loch\f36\hich\af36\dbch\af13\cgrid\noproof\langnp1033\langfenp2052 \sbasedon0 \snext19 Indented Code;}{\s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang 
+{\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin567\lin568\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext20 List Bullet;}{
+\s21\ql \fi-284\li851\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin851\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext21 
+List;}{\s22\ql \li567\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext22 
+List Continue;}{\s23\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang {\pntxta \hich .}}\aspalpha\aspnum\faauto\ls2047\ilvl11\adjustright\rin567\lin568\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext23 List Number;}{\s24\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext24 Picture;}{\s25\qc \li0\ri0\sb240\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs72\alang1025 \ltrch\fcs0 \b\fs72\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext25 Title;}{
+\s26\ql \li0\ri0\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext26 Logo;}{\s27\ql \li0\ri0\sb1440\sa1200\sl-460\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs40\alang1025 \ltrch\fcs0 \b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext27 Subtitle;}{\s28\ql \li0\ri0\sl-200\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext28 Version;}{
+\s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext29 Date Published;}{
+\s30\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext30 
+Copyright Header;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext31 Copyright Notice;}{\s32\ql \li0\ri0\sa1440\sl-960\slmult0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext32 TOC Header;}{\s33\ql \li0\ri0\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 1;}{
+\s34\ql \li221\ri0\sb120\keepn\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin221\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 toc 2;}{\s35\ql \li442\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin442\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 3;}{\s36\ql \li658\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin658\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 4;}{\*\cs37 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\ql \li0\ri0\widctlpar\brdrr
+\brdrdb\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext38 
+Constant Definition;}{\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext39 header;}{\s40\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext40 
+Even Footer Paragraph;}{\s41\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext41 Even Header Paragraph;}{\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon39 \snext42 footer;}
+{\*\cs43 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 page number;}{\s44\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext44 Odd Footer Paragraph;}{\s45\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext45 
+Odd Header Paragraph;}{\s46\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Glossary Reference;}{
+\s48\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext48 Compact;}{\*
+\cs49 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 App Text;}{\s50\ql \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 Filename;}{
+\s52\ql \fi-284\li1135\ri1134\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin1134\lin1135\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext52 List Bullet 2;}{\*\cs53 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Glossary Definition;}{\*\cs54 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Document Name;}{\s55\ql \li0\ri0\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Prototype;}{\*\cs56 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \scaps \sbasedon10 Key Name;}{\s57\ql \li0\ri0\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext57 Reduced Code;}{\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Syntax;}{
+\s59\qc \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext59 Picture Title;}{\s60\ql \fi-3119\li3119\ri0\widctlpar\tx3119\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3119\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Syntax Element;}{\*\cs62 \additive \rtlch\fcs1 \ab\af36 \ltrch\fcs0 
+\b\f36 \sbasedon10 Syntax Literal;}{\s63\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext63 annotation text;}{\*\cs64 \additive \rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs36\alang1025 \ltrch\fcs0 \b\fs36\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\cf2\lang2057\langfe0\langnp2057 \sbasedon16 
+Resource Code;}{\s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\cf6\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext67 Converter Directive;}{\s68\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af36\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\uldb\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive \rtlch\fcs1 \ai\af0 
+\ltrch\fcs0 \i\cf14 \sbasedon10 URL Reference;}{\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Hypertext Anchor;}{\s72\ql \li0\ri0\widctlpar\brdrr\brdrs\brdrw45\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext72 Member Definition;}{\s73\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext73 Figure Picture;}{
+\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\cf5\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon46 \snext74 Comment;}{\s75\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext75 Figure Caption;}{\s76\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext76 Figure Description;}{
+\s77\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf6\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext77 Figure Status;}{\s78\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext78 Figure Anchor;}{\*
+\cs79 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 
+\rtlch\fcs1 \ai\af0\afs24\alang1025 \ltrch\fcs0 \i\fs24\cf10\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext80 Figure Directive;}{
+\s81\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext81 Body Text;}{
+\s82\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \cbpat9 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\f13\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext82 \ssemihidden \styrsid2102810 Document Map;}}{\*\ud\uc0{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \snext0 \styrsid2102810 Normal;}{\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 \b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 \b\fs34\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 2;}{\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 4;}{\s5\ql \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 5;}{\s6\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 
+\i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 7;}{
+\s8\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 8;}{\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs18\alang1025 \ltrch\fcs0 
+\i\fs18\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden \styrsid2102810 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\trcbpat1\trcfpat1\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\lang2057\langfe0\langnp2057 \sbasedon10 Code;}{\*\cs17 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Emphasis;}{\*\cs18 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Warning;}{\s19\ql \li567\ri0\keep\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang1024\langfe1024\loch\f36\hich\af36\dbch\af13\cgrid\noproof\langnp1033\langfenp2052 \sbasedon0 \snext19 Indented Code;}{\s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang 
+{\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin567\lin568\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext20 List Bullet;}{
+\s21\ql \fi-284\li851\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin851\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext21 
+List;}{\s22\ql \li567\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext22 
+List Continue;}{\s23\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang {\pntxta \hich .}}\aspalpha\aspnum\faauto\ls2047\ilvl11\adjustright\rin567\lin568\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext23 List Number;}{\s24\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext24 Picture;}{\s25\qc \li0\ri0\sb240\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs72\alang1025 \ltrch\fcs0 \b\fs72\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext25 Title;}{
+\s26\ql \li0\ri0\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext26 Logo;}{\s27\ql \li0\ri0\sb1440\sa1200\sl-460\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs40\alang1025 \ltrch\fcs0 \b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext27 Subtitle;}{\s28\ql \li0\ri0\sl-200\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext28 Version;}{
+\s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext29 Date Published;}{
+\s30\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext30 
+Copyright Header;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext31 Copyright Notice;}{\s32\ql \li0\ri0\sa1440\sl-960\slmult0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext32 TOC Header;}{\s33\ql \li0\ri0\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 1;}{
+\s34\ql \li221\ri0\sb120\keepn\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin221\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 toc 2;}{\s35\ql \li442\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin442\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 3;}{\s36\ql \li658\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin658\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 4;}{\*\cs37 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\ql \li0\ri0\widctlpar\brdrr
+\brdrdb\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext38 
+Constant Definition;}{\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext39 header;}{\s40\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext40 
+Even Footer Paragraph;}{\s41\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext41 Even Header Paragraph;}{\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon39 \snext42 footer;}
+{\*\cs43 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 page number;}{\s44\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext44 Odd Footer Paragraph;}{\s45\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext45 
+Odd Header Paragraph;}{\s46\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Glossary Reference;}{
+\s48\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext48 Compact;}{\*
+\cs49 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 App Text;}{\s50\ql \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 Filename;}{
+\s52\ql \fi-284\li1135\ri1134\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin1134\lin1135\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext52 List Bullet 2;}{\*\cs53 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Glossary Definition;}{\*\cs54 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Document Name;}{\s55\ql \li0\ri0\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Prototype;}{\*\cs56 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \scaps \sbasedon10 Key Name;}{\s57\ql \li0\ri0\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext57 Reduced Code;}{\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Syntax;}{
+\s59\qc \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext59 Picture Title;}{\s60\ql \fi-3119\li3119\ri0\widctlpar\tx3119\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3119\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Syntax Element;}{\*\cs62 \additive \rtlch\fcs1 \ab\af36 \ltrch\fcs0 
+\b\f36 \sbasedon10 Syntax Literal;}{\s63\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext63 annotation text;}{\*\cs64 \additive \rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs36\alang1025 \ltrch\fcs0 \b\fs36\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\cf2\lang2057\langfe0\langnp2057 \sbasedon16 
+Resource Code;}{\s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\cf6\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext67 Converter Directive;}{\s68\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af36\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\uldb\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive \rtlch\fcs1 \ai\af0 
+\ltrch\fcs0 \i\cf14 \sbasedon10 URL Reference;}{\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Hypertext Anchor;}{\s72\ql \li0\ri0\widctlpar\brdrr\brdrs\brdrw45\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext72 Member Definition;}{\s73\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext73 Figure Picture;}{
+\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\cf5\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon46 \snext74 Comment;}{\s75\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext75 Figure Caption;}{\s76\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext76 Figure Description;}{
+\s77\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf6\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext77 Figure Status;}{\s78\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext78 Figure Anchor;}{\*
+\cs79 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 
+\rtlch\fcs1 \ai\af0\afs24\alang1025 \ltrch\fcs0 \i\fs24\cf10\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext80 Figure Directive;}{
+\s81\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext81 Body Text;}{
+\s82\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \cbpat9 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\f13\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext82 \ssemihidden \styrsid2102810 Document Map;}}}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid-1961856626\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s52\fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-125}{\list\listtemplateid1666757442\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \s23\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-120}{\list\listtemplateid650118748\listsimple{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s20\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-119}}{\*\listoverridetable
+{\listoverride\listid-119\listoverridecount0\ls1}{\listoverride\listid-120\listoverridecount0\ls2}{\listoverride\listid-125\listoverridecount0\ls3}}{\*\rsidtbl \rsid2102810}{\*\generator Microsoft Word 11.0.0000;}{\info{\title Tools}
+{\subject Specifying projects with makmake}{\author Preferred Customer}{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator rossqin}{\creatim\yr1996\mo3\dy6\hr13\min48}
+{\revtim\yr2009\mo4\dy27\hr13\min54}{\printim\yr1997\mo4\dy18\hr15\min6}{\version3}{\edmins1}{\nofpages4}{\nofwords1532}{\nofchars8738}{\*\company Dell Computer Corporation}{\nofcharsws10250}{\vern24613}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://
+schemas.microsoft.com/office/word/2003/wordml}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134\ltrsect 
+\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\linkstyles\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984
+\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot2102810 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \chftnsep 
+\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \chftnsepc 
+\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \chftnsep 
+\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \chftnsepc 
+\par }}\ltrpar \sectd \ltrsect\binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\headerr \ltrpar \pard\plain \ltrpar\s39\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\field{\*\fldinst {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  TITLE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 Tools}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0             }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 Company Confidential\tab \hich\f0 EON SDK, Copyright \'a9\loch\f0  1999}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810\charrsid2102810 \hich\af0\dbch\af13\loch\f0 2009 Nokia Corporation and/or its subsidiary(-ies).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810\charrsid2102810 
+\par }}{\footerr \ltrpar \pard\plain \ltrpar\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  SUBJECT  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0 Specifying projects with makmake}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \tab \hich\af0\dbch\af13\loch\f0 Page }{\field{\*\fldinst {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  PAGE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid2102810 \hich\af0\dbch\af13\loch\f0 1}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 
+\af0 \ltrch\fcs0 \insrsid2102810 \tab \hich\af0\dbch\af13\loch\f0 Last saved }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  SAVEDATE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\lang1024\langfe1024\noproof\insrsid2102810 \hich\af0\dbch\af13\loch\f0 15/03/2000\hich\af0\dbch\af13\loch\f0  \hich\af0\dbch\af13\loch\f0 11:47:00}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang 
+{\pntxta \hich )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}
+{\pntxta \hich )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar
+\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1  SUBJECT  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af1 
+\ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Building components with abld}}}\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {
+\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 tools.abld
+\par }\pard\plain \ltrpar\s46\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 this chapter documents }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 
+\hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  to e32toolp release 210 level.
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 
+\b\fs34\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Overview
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ tool can be used to control the building of components which have been defined\hich\af0\dbch\af13\loch\f0  by a }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  component description file.  Once the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 bldmake bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ command has been executed for your component, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ can be used to carry out the various stages involved in building the component. 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld Invocation syntax
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ]  }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 command  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 [ option\hich\af0\dbch\af13\loch\f0 s ]  [ }{\rtlch\fcs1 \ai\af0 
+\ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0   [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build  }{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+] ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 
+\hich\af36\dbch\af13\loch\f36 build
+\par }\pard \ltrpar\s58\ql \fi589\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 {\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 
+\hich\af36\dbch\af13\loch\f36 clean
+\par \hich\af36\dbch\af13\loch\f36 export
+\par \hich\af36\dbch\af13\loch\f36 final
+\par \hich\af36\dbch\af13\loch\f36 freeze
+\par \hich\af36\dbch\af13\loch\f36 help
+\par \hich\af36\dbch\af13\loch\f36 library
+\par \hich\af36\dbch\af13\loch\f36 listing
+\par \hich\af36\dbch\af13\loch\f36 makefile
+\par \hich\af36\dbch\af13\loch\f36 reallyclean
+\par \hich\af36\dbch\af13\loch\f36 resource
+\par \hich\af36\dbch\af13\loch\f36 target
+\par \hich\af36\dbch\af13\loch\f36 tidy}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\par }\pard \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 options}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 -check}{\rtlch\fcs1 \af36 \ltrch\fcs0 
+\cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 |}{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 -c\line \tab -keepgoing}{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 
+\hich\af36\dbch\af13\loch\f36 |}{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 -k\line \tab -savespace}{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 |}{\rtlch\fcs1 
+\ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 -s\line \tab -verbose}{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 |}{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 
+\hich\af36\dbch\af13\loch\f36 -v\line \tab -what}{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 |}{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 -w
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 
+\ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 bldmake bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  creates a file called }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 
+\loch\af1\dbch\af13\hich\f1 \'94\loch\f1 \hich\f1 Abld.bat\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  in the current directory.  When invoked, this file runs }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 
+\hich\af1\dbch\af13\loch\f1 Perl}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  on the script }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \\\hich\af1\dbch\af13\loch\f1 EPOC32\\Tools\\Abld.pl}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 , passing the location of the files that }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 bldmake bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  has generated for use with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 . }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  processes it\hich\f0 \rquote \loch\f0 s command line an\hich\af0\dbch\af13\loch\f0 
+d constructs a corresponding list of NMAKE.EXE calls to be made to the makefiles which }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ has generated for the component. }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ then makes each of the NMAKE.EXE calls in turn, having changed directory to that containing the relevant bld.inf file.
+\par \hich\af0\dbch\af13\loch\f0 Where }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \loch\af1\dbch\af13\hich\f1 \'93\loch\f1 \hich\f1 test\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  is specified before }{\rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 , the command will operate on all the projects defined by }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  files listed in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 prj_testmmpfiles}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  section of the component description file, rather than those projects defined by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 
+\af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  files listed in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 prj_mmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ section.  Note that the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \loch\af1\dbch\af13\hich\f1 \'93\loch\f1 \hich\f1 test\'94}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ parameter is irrelevant for some commands and, in those cases, cannot be specified.
+\par \hich\af0\dbch\af13\loch\f0 If }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 \hich\f0  is not specified, or is specified as \'93\loch\f0 
+\hich\f0 ALL\'94\loch\f0 , then }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ will carry out the specified command for all the platforms specified in th\hich\af0\dbch\af13\loch\f0 e component description file.  Where }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 \hich\f0  can be specified as a parameter to a particular command, if it is unspecified or specified as \'93\loch\f0 \hich\f0 ALL\'94\loch\f0 , }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 
+\hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 \hich\f0  will carry out the specified command for builds \'93\loch\f0 \hich\f0 UDEB\'94\loch\f0 \hich\f0  then \'93\loch\f0 \hich\f0 UREL\'94
+\loch\f0 .  Specify the basename of the relevant }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 m\hich\af1\dbch\af13\loch\f1 mp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ file or extension makefile for the }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ parameter to limit the command to a single project within a component.  Where }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+is unspecified, the specified command will be carried out for all projects within the component.
+\par \hich\af0\dbch\af13\loch\f0 Note that, for certain }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  commands, not all the parameters - }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 , }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  and }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  - apply.
+
+\par \hich\af0\dbch\af13\loch\f0 Note also that not all the options apply for all the commands, and that, where they do apply, they can be specified in either their long or abbreviated forms.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld build
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command \hich\af0\dbch\af13\loch\f0 combines the effects of several }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0  commands in one, and will probably be all you\hich\f0 \rquote \loch\f0 ll need to invoke to build your component.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 build}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-s] [-k] [-v] ) )  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  commands that this comma
+\hich\af0\dbch\af13\loch\f0 nd combines are EXPORT, MAKEFILE, LIBRARY, RESOURCE, TARGET and FINAL, which are carried out in turn.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld clean
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command will erase all the files created by the corresponding }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld target}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0  command.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 clean}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-k] [-v] ) )\hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 
+\ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld clean}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  makes use of the CLEAN targets provided in makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+.  The files that are removed by this command include all the intermediate files created during compilation and all the executables and \hich\af0\dbch\af13\loch\f0 import libraries created by the linker.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld export
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command copies all the files to be exported from source to their destinations, as defined in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 prj_exports}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  or }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 prj_testexports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ section of the component description file depending upon whether the }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 te\hich\af0\dbch\af13\loch\f0 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 t parameter is specified or not.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 export}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-k] [-v] ) ) }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 Each destination file is only created if it does not exist or has an earlier datestamp than the corresponding source file.  The directories which will contain the d\hich\af0\dbch\af13\loch\f0 
+estination files will be created automatically if they do not exist.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld final
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command allows extension makefiles to be used to carry out any commands required to complete the build.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 final}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] [-v] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The command has no effect for makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 , only for extension makefiles.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld freeze
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command freezes new DLL exports in frozen }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 .def}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  files using the FREEZE target provided in makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 freeze}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] \hich\af0\dbch\af13\loch\f0 [-v] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The frozen }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 def}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ files should be considered part of source for your component.
+\par \hich\af0\dbch\af13\loch\f0 To freeze your component for the first time, having built the component, call this command.  Next, regenerate the makefiles so that import libraries\hich\af0\dbch\af13\loch\f0  can be created from the frozen }{\rtlch\fcs1 \af1 
+\ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 def}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  files.  The import libraries can be created explicitly using the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 
+\hich\af1\dbch\af13\loch\f1 abld library}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  command, or they can be built implicitly via }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld build}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  or }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld target}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+\par \hich\af0\dbch\af13\loch\f0 To add new exports to a project within your component, having built th\hich\af0\dbch\af13\loch\f0 e component, call this command.  Next, rebuild the import libraries so that they incorporate the new exports.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld help
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command provides a brief guide to }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ command-line syntax.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{
+\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 help}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ( ( [ options ] | [ commands ] ) | ( }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ) )}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 
+\ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld help options}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  lists the options available with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 
+\hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 , while }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld help commands}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0  lists the available commands.
+\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld help }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ displays the syntax for a particular command and also a brief description of what the command is for.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld library
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This comman\hich\af0\dbch\af13\loch\f0 d creates the import libraries for the DLLs in your component by calling the LIBRARY target provided in makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 library}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] [-v] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 Import libraries are generated directly from frozen }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 def}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  files,\hich\af0\dbch\af13\loch\f0  so exported functions will not be incorporated into import libraries until these functions are frozen with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 
+abld freeze.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par \hich\af0\dbch\af13\loch\f0 The import libraries are created implicitly as part of the build activity carried out by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld target}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  (and thus }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 ), so it isn\hich\f0 \rquote \loch\f0 t
+\hich\af0\dbch\af13\loch\f0 
+ generally necessary to call this command separately if projects are listed in the component description file in order of dependency - dependent projects appearing after those projects they depend upon.  If ther are mutual imports between projects within 
+\hich\af0\dbch\af13\loch\f0 y\hich\af0\dbch\af13\loch\f0 our component then }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld library}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ can be called explicitly, though mutual imports are often a sign of poor software design.
+\par \hich\af0\dbch\af13\loch\f0 An import library will not be regenerated if it has a later datestamp than the corresponding frozen }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 def}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0  file.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld listing
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This comman\hich\af0\dbch\af13\loch\f0 d creates an assembler listing file for a particular source file.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 library}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] [-v] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 source_basename}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ]}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The listing file has same basename as the source code file with the extension }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 .lis}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0 .  The listing file i\hich\af0\dbch\af13\loch\f0 s created in the build directory and then copied to the directory containing the source file.  This command is only currently supported for ARM platforms}{
+\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 .}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld makefile
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command creates the makefiles for each project within your component, via }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 makefile}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-k] [-v] ) ) [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 To generate the makefiles, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ is invoked with the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 -d}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ switch, which causes the makefiles to be created in a subdirectory of directory}{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1  \\EPOC32\\Make}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \\\hich\af0\dbch\af13\loch\f0 
+.  The makefiles ar\hich\af0\dbch\af13\loch\f0 e always created with this command, regardless of whether the corresponding }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0  files have been changed or not.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld reallyclean
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command does what }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld clean}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ does, and also removes files exported by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld export}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  and the makefiles generated by }{\rtlch\fcs1 
+\af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld make\hich\af1\dbch\af13\loch\f1 file}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 reallyclean}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-k] [-v] ) ) [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ]] }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld resource
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command builds the resource files, bitmaps and application information files for a component by calling the RESOURCE targets in makefi\hich\af0\dbch\af13\loch\f0 les generated by }{\rtlch\fcs1 
+\af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 .
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 resource}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] [-v]  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 \hich\f0 These \'93\loch\f0 \hich\f0 resources\'94\loch\f0  are created implicitly when }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld target}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0  (and thus, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+) is called.  The resources will not be regenerated if they have later datestamps \hich\af0\dbch\af13\loch\f0 than their source dependencies.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld target
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command builds the executables for your component.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 target}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 ( ( [-c] | [-w] ) | ( [-s] [-k] [-v] ) )  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{
+\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 program}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+Since, in the makefiles generated by makmake, the main target is dependent upon the RESOURCE and LIBRARY targets, resources and import libraries will also be created when the main target is built. .  Executables will not be regenerated where they have lat
+\hich\af0\dbch\af13\loch\f0 e\hich\af0\dbch\af13\loch\f0 r datestamps than the source files they depend upon.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Abld tidy
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This command removes releasables defined by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 .mmp files}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 \hich\f0  which are listed with the \'93\loch\f0 \hich\f0 tidy\'94\loch\f0  attribute in your component\hich\f0 \rquote \loch\f0 s description file.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 Abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+ [ test ] }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs62\f36\insrsid2102810 \hich\af36\dbch\af13\loch\f36 final}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 [-k] [-v] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 platform }{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0 ] [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid2102810 \hich\af0\dbch\af13\loch\f0 prog
+\hich\af0\dbch\af13\loch\f0 ram}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid2102810 \hich\af0\dbch\af13\loch\f0  ] ]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 The command can be run following a build to remove any releasables which are no longer required now that the build has completed.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Option: abld -check
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This option is for checking that the required files have been created during a particular build st\hich\af0\dbch\af13\loch\f0 
+ep.  The option creates a list of files that should have been created and then checks that each one exists in turn.  If a file is missing the full name of the file is piped to STDERR.
+\par \hich\af0\dbch\af13\loch\f0 Note that if this option is specified with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld build}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 , makefiles will no
+\hich\af0\dbch\af13\loch\f0 t be included in the list of files to be checked.  If the option is specified with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 abld reallyclean}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid2102810 
+\hich\af0\dbch\af13\loch\f0 , however, the makefiles will be included in the list.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Option: abld -keepgoing
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 \hich\f0 This option tells a particular abld command to \'93\loch\f0 \hich\f0 keep going\'94\loch\f0  even if unrelated \hich\af0\dbch\af13\loch\f0 build steps report errors.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Option: abld -savespace
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 
+This option removes intermediate files created during the building of a project if the build is eventually successful.  If the build fails, the intermediate files remain so that errors can be corrected and\hich\af0\dbch\af13\loch\f0 
+ an incremental rebuild of the project version that failed to build can take place.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Option: abld -verbose
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This option pipes to STDOUT the calls to tools that a particular build step is making, and can be useful in determining exactly where an error occurs \hich\af0\dbch\af13\loch\f0 
+during the build process.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid2102810 \hich\af1\dbch\af13\loch\f1 Option: abld -what
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid2102810 \hich\af0\dbch\af13\loch\f0 This option creates a list of files in exactly the same way as option }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid2102810 \hich\af1\dbch\af13\loch\f1 -check}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid2102810 \hich\af0\dbch\af13\loch\f0 .  The list of files is then piped to STDOUT.
+\par \hich\af0\dbch\af13\loch\f0 The option could be useful to find out where a particular build step is creating files, o\hich\af0\dbch\af13\loch\f0 
+r for creating a zip file containing the releasables for a component by piping the list of files to a file and then having a zip utility process this file.
+\par }}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/armv5_cpu_spec_example.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,46 @@
+#<bsf>#
+
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Example build specialization file 
+# 
+# NB currently specialization only applies to ARMV5 build using RVCT.
+
+# This file customizes the default ARMV5. It specifies a build that
+# always uses optimization level O1 rather than the default O2.
+customizes ARMV5
+
+# The following options that can be overridden by MMP files
+
+# Use these options when compiling user-side THUMB code
+thumb_options	-thumb -O1 
+
+# Use these options when compiling user-side ARM code
+arm_options	-arm -O1 
+
+# Use these options when compiling Kernel code
+kernel_options	-arm -O1 
+
+# This just factors out common (contingent) options from the above.
+# These options can also be overridden by MMP files.
+common_options	--diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+invariant_options	-cpu 5T -fy -Ono_known_library -fpu softvfp --dll_vtbl -apcs /inter
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/bld_changes_er5toer5u.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,83 @@
+{\rtf1\ansi \deff4\deflang1033{\fonttbl{\f1\froman\fcharset2\fprq2 Symbol;}{\f4\froman\fcharset0\fprq2 Times New Roman;}{\f5\fswiss\fcharset0\fprq2 Arial{\*\falt  arial};}{\f37\fmodern\fcharset0\fprq1 Lucida Console;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\widctlpar \f4\fs20\lang2057 \snext0 Normal;}{\s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 
+\sbasedon0\snext0 heading 1;}{\s2\sb120\keepn\widctlpar\brdrt\brdrth\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34\lang2057 \sbasedon0\snext0 heading 2;}{\s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 \sbasedon0\snext0 
+heading 3;}{\s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 \sbasedon0\snext0 heading 4;}{\s5\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext0 heading 5;}{\s6\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 
+heading 6;}{\s7\sb240\sa60\widctlpar \f5\fs20\lang2057 \sbasedon0\snext0 heading 7;}{\s8\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 heading 8;}{\s9\sb240\sa60\widctlpar \i\f5\fs18\lang2057 \sbasedon0\snext0 heading 9;}{\*\cs10 \additive 
+Default Paragraph Font;}{\s15\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext15 Code Paragraph;}{\*\cs16 \additive\f37\lang2057 \sbasedon10 Code;}{\*\cs17 \additive\i \sbasedon10 
+Emphasis;}{\*\cs18 \additive\b \sbasedon10 Warning;}{\s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 \sbasedon0\snext19 Indented Code;}{\s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl11
+\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon21\snext20 List Bullet;}{\s21\fi-284\li851\ri567\widctlpar \f4\fs20\lang2057 \sbasedon0\snext21 List;}{\s22\li567\ri567\widctlpar \f4\fs20\lang2057 \sbasedon0\snext22 
+List Continue;}{\s23\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl10\pndec\ulth\pnstart1\pnindent283\pnhang{\pntxta .}}\f4\fs20\lang2057 \sbasedon21\snext23 List Number;}{\s24\qc\widctlpar \f4\fs20\lang2057 \sbasedon0\snext24 Picture;}{
+\s25\qc\sb240\sa240\widctlpar \b\f5\fs72\lang2057 \sbasedon0\snext25 Title;}{\s26\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0 \f4\fs20\lang2057 \sbasedon0\snext26 Logo;}{\s27\sb1440\sa1200\sl-460\slmult0\widctlpar 
+\b\scaps\f5\fs40\lang2057 \sbasedon0\snext27 Subtitle;}{\s28\sl-200\slmult0\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext28 Version;}{\s29\widctlpar \f4\fs20\lang2057 \sbasedon0\snext29 Date Published;}{\s30\widctlpar \b\f4\fs20\lang2057 
+\sbasedon0\snext30 Copyright Header;}{\s31\widctlpar \f4\fs20\lang2057 \sbasedon0\snext31 Copyright Notice;}{\s32\sa1440\sl-960\slmult0\keepn\widctlpar \b\scaps\f5\fs40\lang2057 \sbasedon0\snext32 TOC Header;}{\s33\sb480\sa160\keepn\widctlpar\brdrt
+\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f4\fs20\lang2057 \sbasedon0\snext0 toc 1;}{\s34\li221\sb120\keepn\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 2;}{\s35\li442\widctlpar\tqr\tx9072 \f5\fs20\lang2057 \sbasedon0\snext0 toc 3;}{
+\s36\li658\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 4;}{\*\cs37 \additive\f5\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\widctlpar\brdrr\brdrdb\brdrw15\brsp20 \f37\fs20\lang2057 \sbasedon0\snext38 Constant Definition;}{
+\s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon0\snext39 header;}{\s40\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext40 Even Footer Paragraph;}{\s41\widctlpar\tqc\tx4536\tqr\tx9072 
+\caps\f4\fs18\lang2057 \sbasedon0\snext41 Even Header Paragraph;}{\s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon39\snext42 footer;}{\*\cs43 \additive\b \sbasedon10 page number;}{\s44\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext44 Odd Footer Paragraph;}{\s45\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18\lang2057 \sbasedon0\snext45 Odd Header Paragraph;}{\s46\widctlpar\brdrl\brdrth\brdrw30\brsp80 
+\f4\fs20\lang2057 \sbasedon0\snext46 Status;}{\*\cs47 \additive\i \sbasedon10 Glossary Reference;}{\s48\widctlpar \f4\fs20\lang2057 \sbasedon0\snext48 Compact;}{\*\cs49 \additive\f5 \sbasedon10 App Text;}{\s50\sb240\sa240\keepn\widctlpar 
+\b\f5\fs40\lang2057\kerning28 \sbasedon1\snext50 Heading 1 NoSection;}{\*\cs51 \additive\f5 \sbasedon10 Filename;}{\s52\fi-284\li1135\ri1134\widctlpar{\*\pn \pnlvl11\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon0\snext52 
+List Bullet 2;}{\*\cs53 \additive\b \sbasedon10 Glossary Definition;}{\*\cs54 \additive\i \sbasedon10 Document Name;}{\s55\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs20\lang2057 \sbasedon0\snext0 
+Prototype;}{\*\cs56 \additive\scaps \sbasedon10 Key Name;}{\s57\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext57 Reduced Code;}{\s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext0 Syntax;}{\s59\qc\sb240\sa240\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext59 Picture Title;}{\s60\fi-3119\li3119\widctlpar\tx3119 \f4\fs20\lang2057 \sbasedon0\snext60 Member List;}{\*
+\cs61 \additive\i \sbasedon10 Syntax Element;}{\*\cs62 \additive\b\f37 \sbasedon10 Syntax Literal;}{\s63\widctlpar \f4\fs20\lang2057 \sbasedon0\snext63 annotation text;}{\*\cs64 \additive\b\f5\uld\cf11 \sbasedon10 Example Link;}{\s65\widctlpar 
+\b\f5\fs36\lang2057 \sbasedon0\snext65 TOC 0;}{\*\cs66 \additive\f37\cf2\lang2057 \sbasedon16 Resource Code;}{\s67\widctlpar \f5\fs20\cf6\lang2057 \sbasedon0\snext67 Converter Directive;}{\s68\widctlpar \b\f37\fs20\uldb\lang2057 \sbasedon0\snext0 
+Platform Dependency;}{\*\cs69 \additive\b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive\i\cf14 \sbasedon10 URL Reference;}{\s71\widctlpar \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext0 Hypertext Anchor;}{\s72\widctlpar\brdrr\brdrs\brdrw45\brsp20 
+\f4\fs20\lang2057 \sbasedon0\snext72 Member Definition;}{\s73\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext73 Figure Picture;}{\s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 
+\f4\fs20\cf5\lang2057 \sbasedon46\snext74 Comment;}{\s75\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \b\f4\fs20\lang2057 \sbasedon0\snext75 Figure Caption;}{\s76\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb
+\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext76 Figure Description;}{\s77\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\cf6\lang2057 \sbasedon73\snext77 Figure Status;}{\s78\li567\ri567\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext78 Figure Anchor;}{\*\cs79 \additive\f5\uld\cf12 \sbasedon37 Figure Link;}{\s80\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\i\f4\fs20\cf10\lang2057 \sbasedon73\snext80 Figure Directive;}{\s81\widctlpar \f4\fs20\lang2057 \sbasedon0\snext81 Body Text;}}{\info{\title Tools}{\subject Specifying projects with makmake}{\author Preferred Customer}
+{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator Preferred Customer}{\creatim\yr1996\mo3\dy6\hr13\min48}{\revtim\yr1999\mo9\dy6\hr16\min27}{\printim\yr1997\mo4\dy18\hr15\min6}{\version2}
+{\edmins1}{\nofpages2}{\nofwords529}{\nofchars3018}{\*\company Dell Computer Corporation}{\vern57443}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 \widowctrl\ftnbj\aenddoc\linkstyles\hyphcaps0\formshade \fet0\sectd 
+\binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere {\header \pard\plain \s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  TITLE  \\* MERGEFORMAT }{\fldrslt Tools}}\tab Company Confidential\tab 
+EON SDK, Copyright \'a9 1999, Symbian Ltd
+\par }{\footer \pard\plain \s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt Specifying projects with makmake}}\tab Page {\field{\*\fldinst  PAGE  \\* MERGEFORMAT 
+}{\fldrslt {\lang1024 1}}}\tab Last saved {\field{\*\fldinst  SAVEDATE  \\* MERGEFORMAT }{\fldrslt {\lang1024 06/09/99 12:42}}}
+\par }{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 {\field\fldedit{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt 
+Makmake changes between ER5 and ER5u}}
+\par \pard\plain \s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 this chapter summarizes changes to {\cs51\f5 makmake} between e32toolp release 100 and e32toolp release 127.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 -clean and -makework options
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for these command-line options has been removed.  Targets are provided instead in the makefiles that {\cs51\f5 makmake}
+ generates for erasing files created during a build, and all the necessary work directories are created automatically.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 -d option
+\par \pard\plain \widctlpar \f4\fs20\lang2057 This option now causes makefiles to be generated into {\cs51\f5 \\EPOC32\\Make\\}{\cs51\i\f5 project}{\cs51\f5 \\}{\cs61\i platform} rather than {\cs51\f5 \\EPOC32\\Make\\}{\cs61\i platform}.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 VC4 and VC5 IDE workspaces
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for creating workspaces for these IDEs is no longer provided.  Only workspaces for VC6 can be created.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Bitmaps and Application Information files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for building bitmaps and application information files is now supported in command-line makefiles.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Static Libraries
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for building and linking to static libraries has been added, via the new {\f5 .mmp} target type {\f5 \ldblquote lib\rdblquote } and the new .mmp keyword {\f5 \ldblquote staticlibrary\rdblquote }.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 #Defines
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for specifying #defines for preprocessing source files can now be done via the new {\f5 .mmp} keyword {\f5 \ldblquote macro\rdblquote }.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 LongBldPath and NoBrowseInfo mmp keywords
+\par \pard\plain \widctlpar \f4\fs20\lang2057 These keywords have now been removed - they are no longer necessary since the path to the directory for containing intermediate files now incorporates an extra directory level.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Object mmp keyword
+\par \pard\plain \widctlpar \f4\fs20\lang2057 This keyword has been removed.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 VC4 and VC5 IDE workspaces
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Support for creating workspaces for these IDEs is no longer provided.  Only workspaces for VC6 can be created.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 New Target types for polymorphic DLLs
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Several new target types have been added so that certain polymorphic DLLs commonly used within EPOC needn\rquote t specify a {\f5 def} file.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Narrow Builds are no longer supported
+\par \pard\plain \widctlpar \f4\fs20\lang2057 All EPOC builds are now wide (UNICODE) builds, debug (UDEB) or release (UREL).  The {\f5 mmp} keyword UID is therefore no longer supported, there is just the UNICODEUID keyword for specifying UIDs for a project.
+
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 New ARM platform targets
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Makefiles can now be built for ARMI, ARM4 and THUMB rather than MARM.  When a project is built for any of these three platforms, import libraries for compatible platforms are also created.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 def files and import libraries
+\par \pard\plain \widctlpar \f4\fs20\lang2057 
+Import libraries are now created directly from frozen export definition files rather than as a side-effect of linking.  This change means that until an export is frozen, it does not appear in the import library and cannot be referenced by another project,
+ unless the new {\f5 mmp} keyword, {\f5 \rdblquote exportunfrozen\rdblquote }, is specified, in which case the import library is created as a side-effect of linking.  The {\f5 \rdblquote deffile\rdblquote } statement now has a reduced rol
+e - that of overriding the default {\f37 def} filename, rather than also dictating whether or not the project\rquote s exports are frozen.
+\par By default, WINC {\f5 def} files are now frozen in {\f5 \\<project>\\bwins} rather than {\f5 \\<project>\\bwinc} since there is no need for a separate directory.
+\par The two-stage link applied by command-line makefiles is now also applied within the MSVC IDE.
+\par Comments are now listed in frozen {\f5 def }files, alongside the mangled function names, containing the un-mangled C++ name of the function.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Device Drivers
+\par \pard\plain \widctlpar \f4\fs20\lang2057 EPOC projects that link to the EPOC kernel now need to list {\f5 ekern.lib} with the keyword {\f5 \ldblquote assplibrary\rdblquote } rather than {\f5 \ldblquote library\rdblquote }
+ because kernel-side import libraries are now created in a different directory according to which hardware platform a particular version of the kernel has been built for.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 __PSISOFT__ #define
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The __PSISOFT__ #define is no longer defined for the preprocessing of source files.  __SYMBIAN32__ alone is defined for use in distinguishing code to be run on EPOC from code to be run on other operating systems.
+
+\par }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/bld_changes_er5utov6.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,84 @@
+{\rtf1\ansi \deff4\deflang1033{\fonttbl{\f1\froman\fcharset2\fprq2 Symbol;}{\f4\froman\fcharset0\fprq2 Times New Roman;}{\f5\fswiss\fcharset0\fprq2 Arial{\*\falt  arial};}{\f37\fmodern\fcharset0\fprq1 Lucida Console;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\widctlpar \f4\fs20\lang2057 \snext0 Normal;}{\s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 
+\sbasedon0\snext0 heading 1;}{\s2\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34\lang2057 \sbasedon0\snext0 heading 2;}{\s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 \sbasedon0\snext0 
+heading 3;}{\s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 \sbasedon0\snext0 heading 4;}{\s5\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext0 heading 5;}{\s6\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 
+heading 6;}{\s7\sb240\sa60\widctlpar \f5\fs20\lang2057 \sbasedon0\snext0 heading 7;}{\s8\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 heading 8;}{\s9\sb240\sa60\widctlpar \i\f5\fs18\lang2057 \sbasedon0\snext0 heading 9;}{\*\cs10 \additive 
+Default Paragraph Font;}{\s15\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext15 Code Paragraph;}{\*\cs16 \additive\f37\lang2057 \sbasedon10 Code;}{\*\cs17 \additive\i \sbasedon10 
+Emphasis;}{\*\cs18 \additive\b \sbasedon10 Warning;}{\s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 \sbasedon0\snext19 Indented Code;}{\s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl11
+\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon21\snext20 List Bullet;}{\s21\fi-284\li851\ri567\widctlpar \f4\fs20\lang2057 \sbasedon0\snext21 List;}{\s22\li567\ri567\widctlpar \f4\fs20\lang2057 \sbasedon0\snext22 
+List Continue;}{\s23\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl10\pndec\ulth\pnstart1\pnindent283\pnhang{\pntxta ?}}\f4\fs20\lang2057 \sbasedon21\snext23 List Number;}{\s24\qc\widctlpar \f4\fs20\lang2057 \sbasedon0\snext24 Picture;}{
+\s25\qc\sb240\sa240\widctlpar \b\f5\fs72\lang2057 \sbasedon0\snext25 Title;}{\s26\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0 \f4\fs20\lang2057 \sbasedon0\snext26 Logo;}{\s27\sb1440\sa1200\sl-460\slmult0\widctlpar 
+\b\scaps\f5\fs40\lang2057 \sbasedon0\snext27 Subtitle;}{\s28\sl-200\slmult0\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext28 Version;}{\s29\widctlpar \f4\fs20\lang2057 \sbasedon0\snext29 Date Published;}{\s30\widctlpar \b\f4\fs20\lang2057 
+\sbasedon0\snext30 Copyright Header;}{\s31\widctlpar \f4\fs20\lang2057 \sbasedon0\snext31 Copyright Notice;}{\s32\sa1440\sl-960\slmult0\keepn\widctlpar \b\scaps\f5\fs40\lang2057 \sbasedon0\snext32 TOC Header;}{\s33\sb480\sa160\keepn\widctlpar\brdrt
+\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f4\fs20\lang2057 \sbasedon0\snext0 toc 1;}{\s34\li221\sb120\keepn\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 2;}{\s35\li442\widctlpar\tqr\tx9072 \f5\fs20\lang2057 \sbasedon0\snext0 toc 3;}{
+\s36\li658\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 4;}{\*\cs37 \additive\f5\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\widctlpar\brdrr\brdrdb\brdrw15\brsp20 \f37\fs20\lang2057 \sbasedon0\snext38 Constant Definition;}{
+\s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon0\snext39 header;}{\s40\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext40 Even Footer Paragraph;}{\s41\widctlpar\tqc\tx4536\tqr\tx9072 
+\caps\f4\fs18\lang2057 \sbasedon0\snext41 Even Header Paragraph;}{\s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon39\snext42 footer;}{\*\cs43 \additive\b \sbasedon10 page number;}{\s44\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext44 Odd Footer Paragraph;}{\s45\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18\lang2057 \sbasedon0\snext45 Odd Header Paragraph;}{\s46\widctlpar\brdrl\brdrs\brdrw30\brsp80 
+\f4\fs20\lang2057 \sbasedon0\snext46 Status;}{\*\cs47 \additive\i \sbasedon10 Glossary Reference;}{\s48\widctlpar \f4\fs20\lang2057 \sbasedon0\snext48 Compact;}{\*\cs49 \additive\f5 \sbasedon10 App Text;}{\s50\sb240\sa240\keepn\widctlpar 
+\b\f5\fs40\lang2057\kerning28 \sbasedon1\snext50 Heading 1 NoSection;}{\*\cs51 \additive\f5 \sbasedon10 Filename;}{\s52\fi-284\li1135\ri1134\widctlpar{\*\pn \pnlvl11\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon0\snext52 
+List Bullet 2;}{\*\cs53 \additive\b \sbasedon10 Glossary Definition;}{\*\cs54 \additive\i \sbasedon10 Document Name;}{\s55\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs20\lang2057 \sbasedon0\snext0 
+Prototype;}{\*\cs56 \additive\scaps \sbasedon10 Key Name;}{\s57\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext57 Reduced Code;}{\s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext0 Syntax;}{\s59\qc\sb240\sa240\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext59 Picture Title;}{\s60\fi-3119\li3119\widctlpar\tx3119 \f4\fs20\lang2057 \sbasedon0\snext60 Member List;}{\*
+\cs61 \additive\i \sbasedon10 Syntax Element;}{\*\cs62 \additive\b\f37 \sbasedon10 Syntax Literal;}{\s63\widctlpar \f4\fs20\lang2057 \sbasedon0\snext63 annotation text;}{\*\cs64 \additive\b\f5\uld\cf11 \sbasedon10 Example Link;}{\s65\widctlpar 
+\b\f5\fs36\lang2057 \sbasedon0\snext65 TOC 0;}{\*\cs66 \additive\f37\cf2\lang2057 \sbasedon16 Resource Code;}{\s67\widctlpar \f5\fs20\cf6\lang2057 \sbasedon0\snext67 Converter Directive;}{\s68\widctlpar \b\f37\fs20\uldb\lang2057 \sbasedon0\snext0 
+Platform Dependency;}{\*\cs69 \additive\b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive\i\cf14 \sbasedon10 URL Reference;}{\s71\widctlpar \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext0 Hypertext Anchor;}{\s72\widctlpar\brdrr\brdrs\brdrw45\brsp20 
+\f4\fs20\lang2057 \sbasedon0\snext72 Member Definition;}{\s73\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext73 Figure Picture;}{\s74\widctlpar\brdrl\brdrs\brdrw30\brsp80 
+\f4\fs20\cf5\lang2057 \sbasedon46\snext74 Comment;}{\s75\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \b\f4\fs20\lang2057 \sbasedon0\snext75 Figure Caption;}{\s76\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb
+\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext76 Figure Description;}{\s77\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\cf6\lang2057 \sbasedon73\snext77 Figure Status;}{\s78\li567\ri567\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext78 Figure Anchor;}{\*\cs79 \additive\f5\uld\cf12 \sbasedon37 Figure Link;}{\s80\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\i\f4\fs20\cf10\lang2057 \sbasedon73\snext80 Figure Directive;}{\s81\widctlpar \f4\fs20\lang2057 \sbasedon0\snext81 Body Text;}}{\info{\title Tools}{\subject Specifying projects with makmake}{\author Preferred Customer}
+{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator Preferred Customer}{\creatim\yr1996\mo3\dy6\hr13\min48}{\revtim\yr2000\mo3\dy15\hr11\min47}{\printim\yr2000\mo2\dy23\hr18\min39}{\version2}
+{\edmins10}{\nofpages2}{\nofwords436}{\nofchars2487}{\*\company Dell Computer Corporation}{\vern57395}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 \widowctrl\ftnbj\aenddoc\linkstyles\hyphcaps0\formshade \fet0\sectd 
+\binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere {\header \pard\plain \s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  TITLE  \\* MERGEFORMAT }{\fldrslt Tools}}\tab Company Confidential\tab 
+EON SDK, Copyright \'a9 2000, Symbian Ltd
+\par }{\footer \pard\plain \s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt Specifying projects with makmake}}\tab Page {\field{\*\fldinst  PAGE  \\* MERGEFORMAT 
+}{\fldrslt {\lang1024 1}}}\tab Last saved {\field{\*\fldinst  SAVEDATE  \\* MERGEFORMAT }{\fldrslt {\lang1024 10/03/00 13:37}}}
+\par }{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}\pard\plain \s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 {\field\fldedit{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt Build Tools
+ changes between ER5u and V6}}
+\par \pard\plain \s74\widctlpar\brdrl\brdrs\brdrw30\brsp80 \f4\fs20\cf5\lang2057 this chapter summarizes major changes to the build system between e32toolp release 127 and e32toolp release 210.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 UNICODEUID .mmp keyword no longer supported - use the UID keyword instead.
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The UNICODEUID keyword is no longer supported by Makmake.  UIDs specified with the UID keyword now apply to UNICODE builds of the source rather than NARROW builds.  This is possible because NARROW 
+builds are no longer supported.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 PROJECT and SUBPROJECT keywords no longer supported - use New SOURCEPATH .mmp keyword instead.
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The SOURCEPATH keyword is intended to replace the PROJECT and SUBPROJECT keywords in {\f5 .mmp} files and thus remove the build tools\rquote 
+ affiliation with a two-level source code tree.  Either relative or absolute paths can be specified with the new keyword - relative paths will be considered relative to the directory containing the {\f5 .mmp} file, rather than the project\rquote 
+s top-level directory as paths specified with the SUBPROJECT keyword were.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Default .def file location
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If the location for a {\f5 .def} file is not explicitly specified in a particular {\f5 .mmp} file with the DEFFILE keyword, then traditionally the location for this file has been {\cs51\f5 \\}{\cs51\i\f5 project\\}
+{\cs51\f5 B}{\cs51\i\f5 <platform>}{\cs51\f5 .  }Now that the PROJECT keyword is redundant in {\f5 .mmp} files the default location for {\f5 .def} files is ..{\cs51\i\f5 \\}{\cs51\f5 B}{\cs51\i\f5 <platform>}{\cs51\f5 , }relative
+ to the directory containing the {\f5 .mmp} file{\cs51\f5 .}
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Build directory structure
+\par \pard\plain \widctlpar \f4\fs20\lang2057 This has changed from
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Build\\}{\cs51\i\f5 project\\executable_basename\\platform\\build\\
+\par }\pard \widctlpar to
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Build\\}{\cs51\i\f5 absolute_path_to_mmp_file\\mmp_basename\\platform\\build}{\cs51\f5 \\
+\par }\pard \widctlpar This change again relates to the redundancy of the PROJECT keyword and the build tree now better reflects the structure of the source code tree.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 \\EPOC\\Make directory structure
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Makefiles generated via ABLD are now generated into the Build directory.
+\par The old location was
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Make\\}{\cs51\i\f5 project\\platform\\}{\cs51\f5 
+\par }\pard \widctlpar and now it\rquote s
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Build\\}{\cs51\i\f5 absolute_path_to_mmp_file\\mmp_basename\\platform\\}{\cs51\f5 
+\par }\pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 \\EPOC\\Bldmake directory structure
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The files generated by BLDMAKE are now generated into the Build directory.
+\par The old location was
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Bldmake\\}{\cs51\i\f5 project\\}{\cs51\f5 
+\par }\pard \widctlpar and now it\rquote s
+\par \pard \fi720\widctlpar {\cs51\f5 \\EPOC32\\Build\\}{\cs51\i\f5 absolute_path_to_bld.inf_file\\}{\cs51\f5 
+\par }\pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Documentation
+\par \pard\plain \fi720\widctlpar \f4\fs20\lang2057 Documentation for the build system is now exported to directory {\cs51\f5 \\EPOC32\\EngDoc}{\cs51\i\f5 \\}{\cs51\f5 
+\par }\pard \widctlpar 
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Test Exports
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A new section has been added to BLD.INF files which allows for the exporting of files from source for use with test code with command ABLD TEST EXPORT.  This section is demarcated with the PRJ_TESTEXPORTS keyword.
+
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 ABLD LISTING
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The new ABLD LISTING command replaces the LISTASM utility for generating assembler code listings for source code files due to the difficulty in LISTASM coping with the new BUILD directory structure.
+\par Type ABLD HELP LISTING for the syntax of this command.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 GetOpt
+\par \pard\plain \widctlpar \f4\fs20\lang2057 All the build system PERL scripts from E32toolp now use the GetOpt command-line parsing module from the PERL standard library.  
+This means that options on command-lines for all these tools must be flagged with a hyphen (-) rather than a forward slash (/).
+\par }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/bld_changes_forv6.1.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,50 @@
+{\rtf1\ansi \deff4\deflang1033{\fonttbl{\f1\froman\fcharset2\fprq2 Symbol;}{\f4\froman\fcharset0\fprq2 Times New Roman;}{\f5\fswiss\fcharset0\fprq2 Arial;}{\f45\fmodern\fcharset0\fprq1 Lucida Console;}}
+{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;
+\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\widctlpar \f4\fs20 \snext0 Normal;}{\s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\kerning28 \sbasedon0\snext0 
+heading 1;}{\s2\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34 \sbasedon0\snext0 heading 2;}{\s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28 \sbasedon0\snext0 heading 3;}{\s4\sb120\keepn\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5 \sbasedon0\snext0 heading 4;}{\s5\keepn\widctlpar \b\f5\fs20 \sbasedon0\snext0 heading 5;}{\s6\sb240\sa60\widctlpar \i\f5\fs20 \sbasedon0\snext0 heading 6;}{\s7\sb240\sa60\widctlpar \f5\fs20 \sbasedon0\snext0 
+heading 7;}{\s8\sb240\sa60\widctlpar \i\f5\fs20 \sbasedon0\snext0 heading 8;}{\s9\sb240\sa60\widctlpar \i\f5\fs18 \sbasedon0\snext0 heading 9;}{\*\cs10 \additive Default Paragraph Font;}{
+\s15\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f45\fs16 \sbasedon0\snext15 Code Paragraph;}{\*\cs16 \additive\f45\lang2057 \sbasedon10 Code;}{\*\cs17 \additive\i \sbasedon10 Emphasis;}{\*\cs18 \additive\b \sbasedon10 
+Warning;}{\s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f45\fs20\lang1024 \sbasedon0\snext19 Indented Code;}{\s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl11\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20 
+\sbasedon21\snext20 List Bullet;}{\s21\fi-284\li851\ri567\widctlpar \f4\fs20 \sbasedon0\snext21 List;}{\s22\li567\ri567\widctlpar \f4\fs20 \sbasedon0\snext22 List Continue;}{\s23\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl10
+\pndec\ulth\pnstart1\pnindent283\pnhang{\pntxta ?}}\f4\fs20 \sbasedon21\snext23 List Number;}{\s24\qc\widctlpar \f4\fs20 \sbasedon0\snext24 Picture;}{\s25\qc\sb240\sa240\widctlpar \b\f5\fs72 \sbasedon0\snext25 Title;}{
+\s26\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0 \f4\fs20 \sbasedon0\snext26 Logo;}{\s27\sb1440\sa1200\sl-460\slmult0\widctlpar \b\scaps\f5\fs40 \sbasedon0\snext27 Subtitle;}{\s28\sl-200\slmult0\widctlpar \b\f5\fs20 \sbasedon0\snext28 
+Version;}{\s29\widctlpar \f4\fs20 \sbasedon0\snext29 Date Published;}{\s30\widctlpar \b\f4\fs20 \sbasedon0\snext30 Copyright Header;}{\s31\widctlpar \f4\fs20 \sbasedon0\snext31 Copyright Notice;}{\s32\sa1440\sl-960\slmult0\keepn\widctlpar 
+\b\scaps\f5\fs40 \sbasedon0\snext32 TOC Header;}{\s33\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f4\fs20 \sbasedon0\snext0 toc 1;}{\s34\li221\sb120\keepn\widctlpar\tqr\tx9072 \f4\fs20 \sbasedon0\snext0 toc 2;}{
+\s35\li442\widctlpar\tqr\tx9072 \f5\fs20 \sbasedon0\snext0 toc 3;}{\s36\li658\widctlpar\tqr\tx9072 \f4\fs20 \sbasedon0\snext0 toc 4;}{\*\cs37 \additive\f5\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\widctlpar\brdrr\brdrdb\brdrw15\brsp20 \f45\fs20 
+\sbasedon0\snext38 Constant Definition;}{\s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18 \sbasedon0\snext39 header;}{\s40\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20 \sbasedon0\snext40 Even Footer Paragraph;}{
+\s41\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18 \sbasedon0\snext41 Even Header Paragraph;}{\s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18 \sbasedon39\snext42 footer;}{\*\cs43 \additive\b \sbasedon10 page number;}{
+\s44\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20 \sbasedon0\snext44 Odd Footer Paragraph;}{\s45\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18 \sbasedon0\snext45 Odd Header Paragraph;}{\s46\widctlpar\brdrl\brdrs\brdrw30\brsp80 
+\f4\fs20 \sbasedon0\snext46 Status;}{\*\cs47 \additive\i \sbasedon10 Glossary Reference;}{\s48\widctlpar \f4\fs20 \sbasedon0\snext48 Compact;}{\*\cs49 \additive\f5 \sbasedon10 App Text;}{\s50\sb240\sa240\keepn\widctlpar \b\f5\fs40\kerning28 
+\sbasedon1\snext50 Heading 1 NoSection;}{\*\cs51 \additive\f5 \sbasedon10 Filename;}{\s52\fi-284\li1135\ri1134\widctlpar{\*\pn \pnlvl11\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20 \sbasedon0\snext52 List Bullet 2;}{\*\cs53 \additive\b 
+\sbasedon10 Glossary Definition;}{\*\cs54 \additive\i \sbasedon10 Document Name;}{\s55\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f45\fs20 \sbasedon0\snext0 Prototype;}{\*\cs56 \additive\scaps \sbasedon10 
+Key Name;}{\s57\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f45\fs16 \sbasedon0\snext57 Reduced Code;}{\s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20 \sbasedon0\snext0 
+Syntax;}{\s59\qc\sb240\sa240\keepn\widctlpar \b\f5\fs20 \sbasedon0\snext59 Picture Title;}{\s60\fi-3119\li3119\widctlpar\tx3119 \f4\fs20 \sbasedon0\snext60 Member List;}{\*\cs61 \additive\i \sbasedon10 Syntax Element;}{\*\cs62 \additive\b\f45 \sbasedon10 
+Syntax Literal;}{\s63\widctlpar \f4\fs20 \sbasedon0\snext63 annotation text;}{\*\cs64 \additive\b\f5\uld\cf11 \sbasedon10 Example Link;}{\s65\widctlpar \b\f5\fs36 \sbasedon0\snext65 TOC 0;}{\*\cs66 \additive\f45\cf2\lang2057 \sbasedon16 Resource Code;}{
+\s67\widctlpar \f5\fs20\cf6 \sbasedon0\snext67 Converter Directive;}{\s68\widctlpar \b\f45\fs20\uldb \sbasedon0\snext0 Platform Dependency;}{\*\cs69 \additive\b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive\i\cf14 \sbasedon10 URL Reference;}{
+\s71\widctlpar \f5\fs20\ul\cf13 \sbasedon0\snext0 Hypertext Anchor;}{\s72\widctlpar\brdrr\brdrs\brdrw45\brsp20 \f4\fs20 \sbasedon0\snext72 Member Definition;}{\s73\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20 
+\sbasedon0\snext73 Figure Picture;}{\s74\widctlpar\brdrl\brdrs\brdrw30\brsp80 \f4\fs20\cf5 \sbasedon46\snext74 Comment;}{\s75\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \b\f4\fs20 \sbasedon0\snext75 Figure Caption;}{
+\s76\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20 \sbasedon0\snext76 Figure Description;}{\s77\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\cf6 \sbasedon73\snext77 
+Figure Status;}{\s78\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f5\fs20\ul\cf13 \sbasedon0\snext78 Figure Anchor;}{\*\cs79 \additive\f5\uld\cf12 \sbasedon37 Figure Link;}{\s80\li567\ri567\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \i\f4\fs20\cf10 \sbasedon73\snext80 Figure Directive;}{\s81\widctlpar \f4\fs20 \sbasedon0\snext81 Body Text;}}{\info{\title Tools}{\subject Specifying projects with makmake}{\author Preferred Customer}
+{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator William Roberts}{\creatim\yr1996\mo3\dy6\hr13\min48}{\revtim\yr2001\mo1\dy4\hr12\min13}{\printim\yr2000\mo2\dy23\hr18\min39}{\version2}
+{\edmins13}{\nofpages1}{\nofwords133}{\nofchars760}{\*\company Dell Computer Corporation}{\vern57395}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 \widowctrl\ftnbj\aenddoc\linkstyles\hyphcaps0\formshade \fet0\sectd 
+\binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere {\header \pard\plain \s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18 {\field{\*\fldinst  TITLE  \\* MERGEFORMAT }{\fldrslt Tools}}\tab Company Confidential\tab EON SDK, Copyright \'a9
+ 2000, Symbian Ltd
+\par }{\footer \pard\plain \s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18 {\field{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt Specifying projects with makmake}}\tab Page {\field{\*\fldinst  PAGE  \\* MERGEFORMAT }{\fldrslt {
+\lang1024 1}}}\tab Last saved {\field{\*\fldinst  SAVEDATE  \\* MERGEFORMAT }{\fldrslt {\lang1024 10/03/00 13:37}}}
+\par }{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}\pard\plain \s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\kerning28 {\field\fldedit{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt 
+Build Tools changes between V6.0 and V6}}.1
+\par \pard\plain \s74\widctlpar\brdrl\brdrs\brdrw30\brsp80 \f4\fs20\cf5 this chapter summarizes major changes to the build system since e32toolp release 210.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28 SRCDBG keyword added
+\par \pard\plain \widctlpar \f4\fs20 The SRCDBG keyword disables the use of optimisation in debug builds, which makes it significantly easier to step through the execution of the code with a source-level debugger.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28 DEBUGLIBRARY keyword added
+\par \pard\plain \widctlpar \f4\fs20 
+The DEBUGLIBRARY keyword indicates libraries which are only required in debug builds: this situation can arise when complex functions are called from __ASSERT_DEBUG() macros, for example in the TSwizzleCBase constructor whic
+h calls a function in ESTOR.LIB.
+\par MAKMAKE constructs two lists of libraries: one for debug builds and the other for release builds. The LIBRARY keyword contributes to both lists, but the DEBUGLIBRARY keyword only contributes to the debug list.
+ There is no support for libraries which are only used in release builds.
+\par 
+\par }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/bldmake.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,449 @@
+{\rtf1\adeflang1025\ansi\ansicpg1252\uc2\adeff0\deff0\stshfdbch13\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2052{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial{\*\falt  arial};}
+{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f13\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}\'cb\'ce\'cc\'e5{\*\falt SimSun};}{\f36\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}
+{\f37\fnil\fcharset134\fprq2{\*\panose 02010600030101010101}@\'cb\'ce\'cc\'e5;}{\f38\froman\fcharset238\fprq2 Times New Roman CE;}{\f39\froman\fcharset204\fprq2 Times New Roman Cyr;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}
+{\f42\froman\fcharset162\fprq2 Times New Roman Tur;}{\f43\fbidi \froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f44\fbidi \froman\fcharset178\fprq2 Times New Roman (Arabic);}{\f45\froman\fcharset186\fprq2 Times New Roman Baltic;}
+{\f46\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f48\fswiss\fcharset238\fprq2 Arial CE{\*\falt  arial};}{\f49\fswiss\fcharset204\fprq2 Arial Cyr{\*\falt  arial};}{\f51\fswiss\fcharset161\fprq2 Arial Greek{\*\falt  arial};}
+{\f52\fswiss\fcharset162\fprq2 Arial Tur{\*\falt  arial};}{\f53\fbidi \fswiss\fcharset177\fprq2 Arial (Hebrew){\*\falt  arial};}{\f54\fbidi \fswiss\fcharset178\fprq2 Arial (Arabic){\*\falt  arial};}
+{\f55\fswiss\fcharset186\fprq2 Arial Baltic{\*\falt  arial};}{\f56\fswiss\fcharset163\fprq2 Arial (Vietnamese){\*\falt  arial};}{\f170\fnil\fcharset0\fprq2 SimSun Western{\*\falt SimSun};}{\f398\fmodern\fcharset238\fprq1 Lucida Console CE;}
+{\f399\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f401\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f402\fmodern\fcharset162\fprq1 Lucida Console Tur;}{\f410\fnil\fcharset0\fprq2 @\'cb\'ce\'cc\'e5 Western;}}{\colortbl;\red0\green0\blue0;
+\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
+\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red255\green255\blue255;}{\upr{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \snext0 \styrsid8535436 Normal;}{
+\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 \b\fs34\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 2;}{\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 4;}{\s5\ql \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 5;}{\s6\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 
+\i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 7;}{
+\s8\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 8;}{\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs18\alang1025 \ltrch\fcs0 
+\i\fs18\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden \styrsid8535436 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\lang2057\langfe0\langnp2057 \sbasedon10 Code;}{\*\cs17 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Emphasis;}{\*\cs18 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Warning;}{\s19\ql \li567\ri0\keep\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang1024\langfe1024\loch\f36\hich\af36\dbch\af13\cgrid\noproof\langnp1033\langfenp2052 \sbasedon0 \snext19 Indented Code;}{\s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang 
+{\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin567\lin568\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext20 List Bullet;}{
+\s21\ql \fi-284\li851\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin851\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext21 
+List;}{\s22\ql \li567\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext22 
+List Continue;}{\s23\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang {\pntxta \hich .}}\aspalpha\aspnum\faauto\ls2047\ilvl11\adjustright\rin567\lin568\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext23 List Number;}{\s24\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext24 Picture;}{\s25\qc \li0\ri0\sb240\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs72\alang1025 \ltrch\fcs0 \b\fs72\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext25 Title;}{
+\s26\ql \li0\ri0\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext26 Logo;}{\s27\ql \li0\ri0\sb1440\sa1200\sl-460\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs40\alang1025 \ltrch\fcs0 \b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext27 Subtitle;}{\s28\ql \li0\ri0\sl-200\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext28 Version;}{
+\s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext29 Date Published;}{
+\s30\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext30 
+Copyright Header;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext31 Copyright Notice;}{\s32\ql \li0\ri0\sa1440\sl-960\slmult0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext32 TOC Header;}{\s33\ql \li0\ri0\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 1;}{
+\s34\ql \li221\ri0\sb120\keepn\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin221\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 toc 2;}{\s35\ql \li442\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin442\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 3;}{\s36\ql \li658\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin658\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 4;}{\*\cs37 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\ql \li0\ri0\widctlpar\brdrr
+\brdrdb\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext38 
+Constant Definition;}{\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext39 header;}{\s40\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext40 
+Even Footer Paragraph;}{\s41\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext41 Even Header Paragraph;}{\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon39 \snext42 footer;}
+{\*\cs43 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 page number;}{\s44\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext44 Odd Footer Paragraph;}{\s45\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext45 
+Odd Header Paragraph;}{\s46\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Glossary Reference;}{
+\s48\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext48 Compact;}{\*
+\cs49 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 App Text;}{\s50\ql \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 Filename;}{
+\s52\ql \fi-284\li1135\ri1134\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin1134\lin1135\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext52 List Bullet 2;}{\*\cs53 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Glossary Definition;}{\*\cs54 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Document Name;}{\s55\ql \li0\ri0\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Prototype;}{\*\cs56 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \scaps \sbasedon10 Key Name;}{\s57\ql \li0\ri0\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext57 Reduced Code;}{\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Syntax;}{
+\s59\qc \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext59 Picture Title;}{\s60\ql \fi-3119\li3119\ri0\widctlpar\tx3119\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3119\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Syntax Element;}{\*\cs62 \additive \rtlch\fcs1 \ab\af36 \ltrch\fcs0 
+\b\f36 \sbasedon10 Syntax Literal;}{\s63\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext63 annotation text;}{\*\cs64 \additive \rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs36\alang1025 \ltrch\fcs0 \b\fs36\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\cf2\lang2057\langfe0\langnp2057 \sbasedon16 
+Resource Code;}{\s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\cf6\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext67 Converter Directive;}{\s68\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af36\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\uldb\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive \rtlch\fcs1 \ai\af0 
+\ltrch\fcs0 \i\cf14 \sbasedon10 URL Reference;}{\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Hypertext Anchor;}{\s72\ql \li0\ri0\widctlpar\brdrr\brdrs\brdrw45\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext72 Member Definition;}{\s73\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext73 Figure Picture;}{
+\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\cf5\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon46 \snext74 Comment;}{\s75\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext75 Figure Caption;}{\s76\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext76 Figure Description;}{
+\s77\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf6\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext77 Figure Status;}{\s78\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext78 Figure Anchor;}{\*
+\cs79 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 
+\rtlch\fcs1 \ai\af0\afs24\alang1025 \ltrch\fcs0 \i\fs24\cf10\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext80 Figure Directive;}{
+\s81\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext81 Body Text;}{
+\s82\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \cbpat9 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\f13\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext82 \ssemihidden \styrsid8535436 Document Map;}}{\*\ud\uc0{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \snext0 \styrsid8535436 Normal;}{\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 \b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 1;}{\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 \b\fs34\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 2;}{\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 3;}{\s4\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 
+heading 4;}{\s5\ql \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 5;}{\s6\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 
+\i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 6;}{\s7\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af1\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 7;}{
+\s8\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs24\alang1025 \ltrch\fcs0 \i\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 heading 8;}{\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ai\af1\afs18\alang1025 \ltrch\fcs0 
+\i\fs18\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden \styrsid8535436 Default Paragraph Font;}{\*
+\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs20 \ltrch\fcs0 \fs20\lang1024\langfe1024\loch\f0\hich\af0\dbch\af13\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden Normal Table;}{
+\s15\ql \li0\ri0\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\lang2057\langfe0\langnp2057 \sbasedon10 Code;}{\*\cs17 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Emphasis;}{\*\cs18 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Warning;}{\s19\ql \li567\ri0\keep\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang1024\langfe1024\loch\f36\hich\af36\dbch\af13\cgrid\noproof\langnp1033\langfenp2052 \sbasedon0 \snext19 Indented Code;}{\s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang 
+{\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin567\lin568\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext20 List Bullet;}{
+\s21\ql \fi-284\li851\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin851\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext21 
+List;}{\s22\ql \li567\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext22 
+List Continue;}{\s23\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang {\pntxta \hich .}}\aspalpha\aspnum\faauto\ls2047\ilvl11\adjustright\rin567\lin568\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon21 \snext23 List Number;}{\s24\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext24 Picture;}{\s25\qc \li0\ri0\sb240\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \ab\af1\afs72\alang1025 \ltrch\fcs0 \b\fs72\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext25 Title;}{
+\s26\ql \li0\ri0\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext26 Logo;}{\s27\ql \li0\ri0\sb1440\sa1200\sl-460\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs40\alang1025 \ltrch\fcs0 \b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext27 Subtitle;}{\s28\ql \li0\ri0\sl-200\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext28 Version;}{
+\s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext29 Date Published;}{
+\s30\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext30 
+Copyright Header;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext31 Copyright Notice;}{\s32\ql \li0\ri0\sa1440\sl-960\slmult0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\scaps\fs40\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext32 TOC Header;}{\s33\ql \li0\ri0\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 1;}{
+\s34\ql \li221\ri0\sb120\keepn\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin221\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext0 toc 2;}{\s35\ql \li442\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin442\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 3;}{\s36\ql \li658\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin658\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 toc 4;}{\*\cs37 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\ql \li0\ri0\widctlpar\brdrr
+\brdrdb\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext38 
+Constant Definition;}{\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext39 header;}{\s40\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext40 
+Even Footer Paragraph;}{\s41\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext41 Even Header Paragraph;}{\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon39 \snext42 footer;}
+{\*\cs43 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 page number;}{\s44\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext44 Odd Footer Paragraph;}{\s45\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \caps\fs18\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext45 
+Odd Header Paragraph;}{\s46\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Glossary Reference;}{
+\s48\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext48 Compact;}{\*
+\cs49 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 App Text;}{\s50\ql \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1 \sbasedon10 Filename;}{
+\s52\ql \fi-284\li1135\ri1134\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \hich \'b7}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin1134\lin1135\itap0 \rtlch\fcs1 \af0\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext52 List Bullet 2;}{\*\cs53 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b \sbasedon10 Glossary Definition;}{\*\cs54 \additive \rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i \sbasedon10 Document Name;}{\s55\ql \li0\ri0\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs24\alang1025 
+\ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Prototype;}{\*\cs56 \additive \rtlch\fcs1 \af0 \ltrch\fcs0 \scaps \sbasedon10 Key Name;}{\s57\ql \li0\ri0\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af36\afs16\alang1025 \ltrch\fcs0 
+\fs16\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext57 Reduced Code;}{\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Syntax;}{
+\s59\qc \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs24\alang1025 \ltrch\fcs0 \b\fs24\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext59 Picture Title;}{\s60\ql \fi-3119\li3119\ri0\widctlpar\tx3119\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3119\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive \rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i \sbasedon10 Syntax Element;}{\*\cs62 \additive \rtlch\fcs1 \ab\af36 \ltrch\fcs0 
+\b\f36 \sbasedon10 Syntax Literal;}{\s63\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext63 annotation text;}{\*\cs64 \additive \rtlch\fcs1 \ab\af1 \ltrch\fcs0 \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\ab\af1\afs36\alang1025 \ltrch\fcs0 \b\fs36\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \rtlch\fcs1 \af36 \ltrch\fcs0 \f36\cf2\lang2057\langfe0\langnp2057 \sbasedon16 
+Resource Code;}{\s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\cf6\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext67 Converter Directive;}{\s68\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af36\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\uldb\lang2057\langfe2052\loch\f36\hich\af36\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 \additive \rtlch\fcs1 \ai\af0 
+\ltrch\fcs0 \i\cf14 \sbasedon10 URL Reference;}{\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 
+\fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext0 Hypertext Anchor;}{\s72\ql \li0\ri0\widctlpar\brdrr\brdrs\brdrw45\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext72 Member Definition;}{\s73\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext73 Figure Picture;}{
+\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\cf5\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon46 \snext74 Comment;}{\s75\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \ab\af0\afs24\alang1025 \ltrch\fcs0 
+\b\fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext75 Figure Caption;}{\s76\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext76 Figure Description;}{
+\s77\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf6\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext77 Figure Status;}{\s78\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 
+\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\f1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext78 Figure Anchor;}{\*
+\cs79 \additive \rtlch\fcs1 \af1 \ltrch\fcs0 \f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 
+\rtlch\fcs1 \ai\af0\afs24\alang1025 \ltrch\fcs0 \i\fs24\cf10\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon73 \snext80 Figure Directive;}{
+\s81\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\f0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 \sbasedon0 \snext81 Body Text;}{
+\s82\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \cbpat9 \rtlch\fcs1 \af0\afs20\alang1025 \ltrch\fcs0 \fs20\lang2057\langfe2052\loch\f13\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 
+\sbasedon0 \snext82 \ssemihidden \styrsid8535436 Document Map;}}}}{\*\latentstyles\lsdstimax156\lsdlockeddef0}{\*\listtable{\list\listtemplateid-10297062\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1
+\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s52\fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-125}{\list\listtemplateid367955130\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0
+\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'02\'00.;}{\levelnumbers\'01;}\rtlch\fcs1 \af0 \ltrch\fcs0 \s23\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-120}{\list\listtemplateid-576033570\listsimple{\listlevel\levelnfc23
+\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01{\uc1\u-3913 ?};}{\levelnumbers;}\f3\fbias0 \s20\fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-119}}{\*\listoverridetable
+{\listoverride\listid-119\listoverridecount0\ls1}{\listoverride\listid-120\listoverridecount0\ls2}{\listoverride\listid-125\listoverridecount0\ls3}}{\*\rsidtbl \rsid8535436}{\*\generator Microsoft Word 11.0.0000;}{\info{\title Tools}
+{\subject Specifying projects with makmake}{\author Preferred Customer}{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator rossqin}{\creatim\yr1996\mo3\dy6\hr13\min48}
+{\revtim\yr2009\mo4\dy27\hr13\min54}{\printim\yr1997\mo4\dy18\hr15\min6}{\version3}{\edmins0}{\nofpages4}{\nofwords1369}{\nofchars7807}{\*\company Dell Computer Corporation}{\nofcharsws9158}{\vern24613}{\*\password 00000000}}{\*\xmlnstbl {\xmlns1 http://s
+chemas.microsoft.com/office/word/2003/wordml}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134\ltrsect 
+\widowctrl\ftnbj\aenddoc\donotembedsysfont0\donotembedlingdata1\grfdocevents0\validatexml0\showplaceholdtext0\ignoremixedcontent0\saveinvalidxml0\showxmlerrors0\linkstyles\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701\dgvorigin1984
+\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\rsidroot8535436 \fet0{\*\wgrffmtfilter 013f}\ilfomacatclnup0{\*\ftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 
+\af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \chftnsep 
+\par }}{\*\ftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \chftnsepc 
+\par }}{\*\aftnsep \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \chftnsep 
+\par }}{\*\aftnsepc \ltrpar \pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \chftnsepc 
+\par }}\ltrpar \sectd \ltrsect\binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\headerr \ltrpar \pard\plain \ltrpar\s39\ql \li0\ri0\widctlpar
+\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 \fs18\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\field{\*\fldinst {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  TITLE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Tools}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Company Confidential\tab }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0            }{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0 EON SDK, Copyright \'a9\loch\f0  1999}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 -}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436\charrsid8535436 
+\hich\af0\dbch\af13\loch\f0 2009 Nokia Corporation and/or its subsidiary(-ies).}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436\charrsid8535436 
+\par }}{\footerr \ltrpar \pard\plain \ltrpar\s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \af0\afs18\alang1025 \ltrch\fcs0 
+\fs18\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  SUBJECT  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0 Specifying projects with makmake}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab \hich\af0\dbch\af13\loch\f0 Page }{\field{\*\fldinst {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  PAGE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 \lang1024\langfe1024\noproof\insrsid8535436 \hich\af0\dbch\af13\loch\f0 1}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 
+\af0 \ltrch\fcs0 \insrsid8535436 \tab \hich\af0\dbch\af13\loch\f0 Last saved }{\field{\*\fldinst {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  SAVEDATE  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af0 \ltrch\fcs0 
+\lang1024\langfe1024\noproof\insrsid8535436 \hich\af0\dbch\af13\loch\f0 15/03/2000\hich\af0\dbch\af13\loch\f0  \hich\af0\dbch\af13\loch\f0 11:26:00}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta \hich .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang 
+{\pntxta \hich )}}{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}
+{\pntxta \hich )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb \hich (}{\pntxta \hich )}}\pard\plain \ltrpar
+\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \ab\af1\afs40\alang1025 \ltrch\fcs0 
+\b\fs40\lang2057\langfe2052\kerning28\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\field\fldedit{\*\fldinst {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1  SUBJECT  \\* MERGEFORMAT }}{\fldrslt {\rtlch\fcs1 \af1 
+\ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying components with bldmake}}}\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af1\afs24\alang1025 \ltrch\fcs0 \fs24\ul\cf13\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {
+\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 tools.bldmake
+\par }\pard\plain \ltrpar\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf5\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 this chapter documents }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 
+\hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  to e32toolp release 210 level.
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 
+\b\fs34\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Overview
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 The }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ tool can be used in conjunction with }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 makmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  and }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  to control\hich\af0\dbch\af13\loch\f0 
+ the building of a component, where a component is a set of executables each of which is defined by an }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  file. }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  processes a component description file - }{
+\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  - and generates several makefiles which are used by }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  to carry out the various stag\hich\af0\dbch\af13\loch\f0 es of building the component. 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Bldmake Invocation syntax
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  [ }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 options}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  ] }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid8535436 \hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 
+\hich\af36\dbch\af13\loch\f36 bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid8535436 \hich\af0\dbch\af13\loch\f0  | }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 clean}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\cs61\insrsid8535436 \hich\af0\dbch\af13\loch\f0  | }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid8535436 \hich\af0\dbch\af13\loch\f0  | }{\rtlch\fcs1 \ab\af36 
+\ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 plat}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid8535436 
+\par }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 options}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 
+\hich\af36\dbch\af13\loch\f36 -v
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 
+\par \hich\af0\dbch\af13\loch\f0 where
+\par \ltrrow}\trowd \irow0\irowband0\ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
+\cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil \cellx2268\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\pard \ltrpar
+\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 command}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \cell 
+\hich\af0\dbch\af13\loch\f0 is the command to be carried out by bldmake\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \trowd \irow0\irowband0\ltrrow
+\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil \cellx2268\clvertalt
+\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\row \ltrrow}\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 
+\ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 -v}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \cell }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 indicates verbose operation
+\par \hich\af0\dbch\af13\loch\f0 When this flag is specified, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ prints progress messages.  The default is to give error messages only.\cell }\pard \ltrpar\ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\trowd \irow1\irowband1\lastrow \ltrrow\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone 
+\cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil \cellx2268\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\row }\pard \ltrpar
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ searches for the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ component description file in the current directory and processes it.  If the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ command is specified, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldma\hich\af1\dbch\af13\loch\f1 ke}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  creates the directory }{\rtlch\fcs1 
+\af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \\\hich\af1\dbch\af13\loch\f1 EPOC32\\Build\\[absolute_path_to_bld.inf_file}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 ]\\
+ and generates makefiles for the component into this directory, also }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ produces a file called }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld.bat}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  in the current directory. }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld.bat}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  invokes }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 Perl}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  on script }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \\\hich\af1\dbch\af13\loch\f1 EPOC32\\Tools\\\hich\af1\dbch\af13\loch\f1 abld.pl}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0 , passing the directory where }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ has created its makefiles as a parameter to the script.
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 
+\b\fs34\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Structure of component definition files
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 A }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  component description file - }{
+\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  - has the form
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 wholefile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  :
+\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 section-header\line \tab \tab section-data\line sections}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  :\line 
+\hich\af0\dbch\af13\loch\f0 |\tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_platforms}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \line \hich\af0\dbch\af13\loch\f0 |\tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_exports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \line \hich\af0\dbch\af13\loch\f0 |\tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_testexports}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \line \hich\af0\dbch\af13\loch\f0 |\tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_mmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \line 
+\hich\af0\dbch\af13\loch\f0 |\tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_testmmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \line 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Each section header can appear any number of times in the file.  The section headers and their data are case-insensitive.
+\par }{\rtlch\fcs1 \ab\af0 \ltrch\fcs0 \b\insrsid8535436 \hich\af0\dbch\af13\loch\f0 Note:}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  a trailing backslash is used to indicate a l\hich\af0\dbch\af13\loch\f0 ine continuation.
+
+\par \hich\af0\dbch\af13\loch\f0 Use the C++ style comment syntax for comments. 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying the platforms
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 In the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 prj_platforms}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ section, list the platforms that the components supports.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_platforms}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <list_of_platforms>}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 If the platforms section is not found, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  s\hich\af0\dbch\af13\loch\f0 \hich\f0 upplies platforms WINS, ARMI, ARM4 and THUMB by default.  Specifying pseudo-platform \'93\loch\f0 \hich\f0 DEFAULT\'94\loch\f0 
+ at the start of the list will cause any subsequent platforms to be added to the default list, unless these platforms are prefixed with a hyphen (-), in which ca\hich\af0\dbch\af13\loch\f0 s\hich\af0\dbch\af13\loch\f0 
+e these platforms will be removed from the list.  Platforms can be listed on several separate lines if required.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying the files to be exported
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 In the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 prj_exports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ section, list the files to be copied from the source directories to the releasables\hich\f0 \rquote \loch\f0  dir\hich\af0\dbch\af13\loch\f0 ectories during the building of a component.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_exports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_1>\tab \tab [<destination_file>]\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_2>\tab \tab [<destination_file>]
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  \'85\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_n>\tab \tab [<destination_file>]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 This section is intended mainly for specifying C++ header files to be cop\hich\af0\dbch\af13\loch\f0 ied to directory }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \\
+\hich\af1\dbch\af13\loch\f1 EPOC32\\Include\\}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+.  Specify each file on a separate line.  If the source file is listed with a relative path, the path will be considered relative to the directory containing the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file.  If a destination file is not specified, the so\hich\af0\dbch\af13\loch\f0 urce file will be copied to }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \\
+\hich\af1\dbch\af13\loch\f1 EPOC32\\Include\\}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 .  If a relative path is specified with the destination file, the path will be considered relative to directory  }{\rtlch\fcs1 \af1 
+\ltrch\fcs0 \cs51\f1\insrsid8535436 \\\hich\af1\dbch\af13\loch\f1 EPOC32\\Include\\.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying the test files to be exported
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 In the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 prj_testexports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ section, list the\hich\af0\dbch\af13\loch\f0  files to be copied from the source directories to the releasables\hich\f0 \rquote \loch\f0  directories for use with test programs.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_exports}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_1>\tab \tab [<destination_file>]\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_2>\tab \tab [<destination_file>]
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  \'85\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <source_file_n>\tab \tab [<destination_file>]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Specify each file on a separate line.  If the source file is listed with a relative path, the path will be considered relative to the directory containing the }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file.  If a destination file is not specified, the source file will be copied to the dire\hich\af0\dbch\af13\loch\f0 
+ctory containing the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ file.  If a relative path is specified with the destination file, the path will be considered relative to directory  containing the}{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1  bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  file.
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying the mmp files
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 In the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 prj_mmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ section, list the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  files containe\hich\af0\dbch\af13\loch\f0 d in your component.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_mmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <mmp_file_1>\tab \tab [tidy]\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  <mmp_file_2>\tab \tab [tidy]
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  \'85\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <.mmp_file_n>\tab \tab [tidy]
+\par \tab \hich\af0\dbch\af13\loch\f0 makefile\tab \tab <makefile_1>\tab \tab [tidy]\line \tab makefile\tab \tab <makefile_2>\tab \tab [tidy]\line \tab \hich\f0 \'85\line \tab \loch\f0 makefile\tab \tab <makefile_n>\tab \tab [tidy]}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Specify each }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 .mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ file on a separate line.  If \hich\af0\dbch\af13\loch\f0 a relative path is specified with an }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  file the path will be considered relative to the directory containing the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0 \hich\f0  file.  Specify the \'93\loch\f0 \hich\f0 tidy\'94\loch\f0  attribute if the releasable that an }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  file defines is purely internal to your component and not required either by other components or for your component to execute.
+\par \hich\af0\dbch\af13\loch\f0 Use keyword }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 makefile}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ to specify an extension makefile for your component.  Extension makefiles can be used where build activiti\hich\af0\dbch\af13\loch\f0 es need to be carried out which are not catered for by makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 
+\cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 makmake.}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0   
+\par }\pard\plain \ltrpar\s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\cf5\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Need link to format for extension makefiles here.
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Build activities relating to particular }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 .mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  files or extension makefiles are carried out in the order in which the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 m\hich\af1\dbch\af13\loch\f1 mp}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  files and extension makefiles are listed in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  file.  Extension makefiles can be interspersed among the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  files.
+
+\par \hich\af0\dbch\af13\loch\f0 If an }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ file or extension makefile applies only to a particular platform place the item within }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs16\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 #ifdef}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 
+\hich\af0\dbch\af13\loch\f0 s}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 .  The }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 prj_mmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  secti\hich\af0\dbch\af13\loch\f0 on is preprocessed for each platform listed in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 prj_platforms}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  section.  If, for example, an }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ file relates only to the WINS platform, specify the file as follows:
+\par 
+\par }{\rtlch\fcs1 \af36 \ltrch\fcs0 \cs16\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 #if defined(WINS)
+\par \hich\af36\dbch\af13\loch\f36 <mmp_file>
+\par \hich\af36\dbch\af13\loch\f36 #endif}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs28\alang1025 \ltrch\fcs0 
+\b\fs28\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Specifying the test mmp files
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 In the }{\rtlch\fcs1 \ab\af36 \ltrch\fcs0 \cs62\b\f36\insrsid8535436 \hich\af36\dbch\af13\loch\f36 prj_testmmpfil\hich\af36\dbch\af13\loch\f36 es}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  section, list the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ files contained in your component which define test programs.
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 prj_testmmpfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <.mmp_file_1>\tab \tab [tidy]  [manual]  [support]\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <.mmp_file_2>\tab \tab [tidy] [manual]  [support]
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  \'85\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 
+\cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  <.mmp_file_n>\tab \tab [tidy] [manual]  [support]
+\par \tab \hich\af0\dbch\af13\loch\f0 makefile\tab \tab <m\hich\af0\dbch\af13\loch\f0 akefile_1>\tab \tab [tidy]  [manual]  [support]\line \tab makefile\tab \tab <makefile_2>\tab \tab [tidy]  [manual]  [support]\line \tab \hich\f0 \'85\line \tab \loch\f0 
+makefile\tab \tab <makefile_n>\tab \tab [tidy]  [manual]  [support]}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 The section for test }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ files has the same syntax as the section for standard }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  files, except that two e
+\hich\af0\dbch\af13\loch\f0 xtra }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file attributes are provided. }{\rtlch\fcs1 \af1 
+\ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake bldfiles}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0 
+ creates batch files for running the test programs for your component.  For each platform, a batch file for running \'93\loch\f0 \hich\f0 automatic\'94\loch\f0 \hich\f0  tests and a batch file for running \'93\loch\f0 \hich\f0 manual\'94\loch\f0 
+ tests are created in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldm\hich\af1\dbch\af13\loch\f1 ake }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+output directory for your component, if any such tests are listed.  The batch files are called }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 platform-name}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0 .auto.bat and }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 platform-name}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0 .manual.bat respectively.  \'93
+\loch\f0 \hich\f0 automatic\'94\loch\f0 \hich\f0  tests are those tests which can be run without any user-intervention, while \'93\loch\f0 m\hich\af0\dbch\af13\loch\f0 \hich\f0 anual\'94\loch\f0 
+ tests require user-input in order for them to complete successfully.  By default, for each }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+\hich\f0  file or extension makefile listed an entry is created in the \'93\loch\f0 \hich\f0 automatic\'94\loch\f0  batch file which is the basename of the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{
+\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file or extension makefile (note that\hich\af0\dbch\af13\loch\f0  this means that the basename of the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 
+\hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file must be the same as the basename of the releasable specified with the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 
+\hich\af1\dbch\af13\loch\f1 target}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  statement in the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  file if the releasable test that it defines is to be invoked successfully).  Specify the \'93\loch\f0 \hich\f0 manual\'94\loch\f0  attribute if t\hich\af0\dbch\af13\loch\f0 he test that the }{
+\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 mmp}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 \hich\f0  file or extension makefile defines is to be included in the \'93\loch\f0 \hich\f0 
+manual\'94\loch\f0 \hich\f0  batch file rather than the \'93\loch\f0 \hich\f0 automatic\'94\loch\f0 \hich\f0  batch file, and specify the \'93\loch\f0 \hich\f0 support\'94\loch\f0  attribute if the test is not to be included in either batch file.
+\par }\pard\plain \ltrpar\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \rtlch\fcs1 \ab\af1\afs34\alang1025 \ltrch\fcs0 
+\b\fs34\lang2057\langfe2052\loch\af1\hich\af1\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af1 \ltrch\fcs0 \insrsid8535436 \hich\af1\dbch\af13\loch\f1 Structure of extension \hich\af1\dbch\af13\loch\f1 makefiles
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 A }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bldmake}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  extension makefile has the form
+
+\par }\pard\plain \ltrpar\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 
+\fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \cs61\i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 target}{\rtlch\fcs1 \af0 \ltrch\fcs0 \cs61\insrsid8535436 \hich\af0\dbch\af13\loch\f0  
+}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 :\line \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 target_command_1\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 
+\ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 target_command_2\line \tab \hich\f0 \'85\line }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \tab }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+target_command_n}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\par }\pard\plain \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \rtlch\fcs1 \af0\afs24\alang1025 \ltrch\fcs0 \fs24\lang2057\langfe2052\loch\af0\hich\af0\dbch\af13\cgrid\langnp2057\langfenp2052 {\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Extension makefiles can be used where certain build steps are required which are not catered for by makefiles generated by }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 
+\hich\af1\dbch\af13\loch\f1 makmake.}{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 \hich\af0\dbch\af13\loch\f0  }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 A }{\rtlch\fcs1 \ai\af0 \ltrch\fcs0 \i\insrsid8535436 
+\hich\af0\dbch\af13\loch\f0 targ\hich\af0\dbch\af13\loch\f0 et}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 
+ in the extension makefile is an NMAKE.EXE target, and should be followed by a colon to denote it as such.  During build activities, }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 
+\insrsid8535436 \hich\af0\dbch\af13\loch\f0  will call the target in the extension makefile corresponding to the build activity that is being carried out, and th\hich\af0\dbch\af13\loch\f0 
+us the commands listed with the target in the extension makefile will be executed.  Possible targets (corresponding }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 
+\hich\af0\dbch\af13\loch\f0  commands appear in brackets where they differ from the target) are :
+\par 
+\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 CLEAN, FINAL, FREEZE, LIBRARY, MAKMAKE (makefile), RESOURCE, BLD 
+\hich\af0\dbch\af13\loch\f0 (target), SAVESPACE (target -savespace), and RELEASABLES (target [-what | -check]).
+\par 
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 All these targets should be provided in an extensio\hich\af0\dbch\af13\loch\f0 
+n makefile, even if no commands are listed with a particular target, since the target will be called during the build whether commands are listed or not and NMAKE.EXE will generate an error if the target cannot be found. Commands listed with each target c
+\hich\af0\dbch\af13\loch\f0 a\hich\af0\dbch\af13\loch\f0 n be calls to any tools or system commands which will be available at build-time.
+\par \hich\af0\dbch\af13\loch\f0 If different commands are required for the same target for different platforms, special NMAKE.EXE syntax can be used in conjunction with the $(PLATFORM and $(CFG) macros whic\hich\af0\dbch\af13\loch\f0 h }{\rtlch\fcs1 \af1 
+\ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 abld}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  defines to carry out the different commands.  $(CFG) is defined as UDEB or UREL.  For example
+\par 
+\par }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 \hich\f1 !IF \'93\loch\f1 \hich\f1 $(PLATFORM)\'94\loch\f1 \hich\f1  == \'93\loch\f1 \hich\f1 WINS\'94
+\par \hich\af1\dbch\af13\loch\f1 CLEAN :
+\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 <wins_clean_command>
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 !ELSE
+\par \hich\af1\dbch\af13\loch\f1 CLEAN :
+\par }\pard \ltrpar\ql \fi720\li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 <other_clean_command>
+\par }\pard \ltrpar\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 !ENDIF
+\par }{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0 Note that ABLD changes directory to the directory containing the }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 
+\ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file before calling NMAKE.EXE on extension makefile targets, so if relative paths are present in the extension makefiles they will be considered relative to the directory containing t
+\hich\af0\dbch\af13\loch\f0 he }{\rtlch\fcs1 \af1 \ltrch\fcs0 \cs51\f1\insrsid8535436 \hich\af1\dbch\af13\loch\f1 bld.inf}{\rtlch\fcs1 \af0 \ltrch\fcs0 \insrsid8535436 \hich\af0\dbch\af13\loch\f0  file.
+\par }}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/building_variants.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+Product Build Variants
+======================
+
+In order to create a build variant two files are required. A "Product Variant" HRH file
+containing the variant-specific macros.  And a configuration file (variant.cfg) that points
+to it.
+
+
+1. The Product Variant (.HRH) File
+==================================
+
+This file contains the macros to be defined for this product variant as #define statements.
+eg,
+	#define EKA2
+	#define NEW_CRYPTO
+	#undef DONT_USE_ME
+
+This file is a C++ header file, so comments are allowed.
+
+The product variant can go anywhere on the same drive as the epoc32 directory.
+Suggested location is somewhere under %EPOCROOT%\epoc32.
+e.g.:
+	\epoc32\include\variant\buildvariant.hrh
+	\epoc32\include\variant\cedar.hrh
+
+
+
+2. The Configuration File (variant.cfg)
+=======================
+
+The variant.cfg file must be called
+
+	%EPOCROOT%\epoc32\tools\variant\variant.cfg
+
+The variant folder doesn't exist by default and has to be created manually.
+This file should contain the name and path of the product variant (.HRH) file.
+The file can be specified as
+	a) a path relative to %EPOCROOT%
+	b) an absolute path
+A path starting with "\EPOC32" will be adjusted for EPOCROOT.
+
+Perl-type comments (#) are allowed.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/cedar-mostly-thumb.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,61 @@
+Intro.
+
+A new GCC98r2 platform/build target has been added to Cedar. This
+platform is called ARM4T and implements the 'mostly thumb' build
+policy. Under this policy user-side code is built in THUMB (ARMv4)
+mode by default and kernel side code is built in ARM (ARMv4) mode with
+no interworking support. These defaults can be overridden by various
+means (see below). When the default is overridden both user and
+kernel-side code is built in ARM (ARMv4) mode with interworking
+support.
+
+Overriding the default.
+
+The default can be overridden at project (MMP)and compontent (BLD.INF)
+level and also interactively via a commandline argument to MAKMAKE.
+
+i) MMP 
+
+A new keyword ALWAYS_BUILD_AS_ARM is introduced to the supported MMP
+file syntax. This keyword takes no arguments. It applies only to
+platforms that implement the 'mostly thumb' policy. In other words it
+is ignored by other platforms (e.g. ARM4). 
+
+ii. BLD.INF
+
+A new qualifier, BUILD_AS_ARM, is introduced for MMP file statements
+in the BLD.INF syntax. The syntax for such statements thus becomes:
+
+PRJ_MMPFILES
+[<mmp path>\<mmp file>] {<qualifiers>}
+{MAKEFILE|NMAKEFILE} [<path>\<makefile>] {build_as_arm}
+// <qualifiers> are tidy, ignore, build_as_arm
+
+iii. MAKMAKE
+
+MAKMAKE has been extended to accept the option -ARM. Supplying this
+option has the same effect as if ALWAYS_BUILD_AS_ARM is supplied in
+the MMP file.
+
+Build/Release Directory Structure.
+
+Build artefacts are placed in either UREL or UDEB beneath ARM4T in
+both build and release trees whatever ISA is targeted. The exception
+is import libraries. Because ARM4T only supports version 4 of the ARM
+architecture different import stubs implementations are required for
+each of the possible modes that clients can be compiled in (e.g. ARM
+without-interworking vs ARM with-interworking vs THUMB). Therefore
+import libraries are placed in the UREL sub-directory of ARM4, ARMI or
+THUMB respectively within the release tree.
+
+Static Libraries.  
+
+Static libraries are always built in ARM mode with interworking. A
+consequence of this is that the linker (LD) will introduce veneers
+into executables built in THUMB mode. The veneers are responsible for
+switching mode (as appropriate). However the introduction of a veneer
+has a small impact on code size. These two factors (i.e. static libs
+being ARM and veneers) mean that an ARM4T THUMB executable will always
+be slightly larger than if it had been built using the old THUMB build
+target.
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/cpu_specific_builds.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,83 @@
+
+Intro.
+The ARMV5 build supports the notion of customization. This allows a
+programmer to define a new build target that is derived from the ARMV5
+build. A new build target is defined via a .BSF file. The build system
+becomes aware of a customized build by the presence of its .BSF file
+in $(EPOCROOT)\epoc32\tools. Such customizations are referred to by
+the name of their .BSF file e.g. the file XScale.bsf defines the build
+target XScale. This name can be used in exactly the same way as
+built-in names such as ARMV5.
+
+BSF Syntax It is intended that the syntax of a .BSF file be toolchain
+specific with the exception of the obligatory header:
+
+#<BSF>#					: token to identify this as a BSF file must appear at start of first line.
+CUSTOMIZES 	build			: identitifies which build is customized by this spec  e.g. ARMV5.
+
+Currently only ARMV5 can be customized which is the only supported
+RVCT toolchain build. ARMV5 implements the 'mostly thumb' policy. The
+ARMV5 specific .BSF syntax is as follows:
+
+
+THUMB_OPTIONS	opt1 opt2 ...	: compiler options used by default for user side code (expected to be THUMB mode)
+ARM_OPTIONS	opt1 opt2 ...	: compiler options used when BUILD_AS_ARM etc are specified (expected to be ARM mode)
+KERNEL_OPTIONS	opt1 opt2 ...	: compiler options used to compile kernel side code
+COMMON_OPTIONS	opt1 opt2 ...	: compiler options that are added to all the above
+
+The above four keywords specify compiler options that can be overriden
+in an MMP file via OPTION: e.g.
+
+OPTION ARMCC -Ospace.
+
+A final keyword specifies the system-wide options that cannot be
+overridden in an MMP file via OPTION. Typically these specify options
+within the EABI e.g. the SOFTVFP calling convention. They are called
+invariant since code compiled with different settings will not be
+binary compatible.
+
+INVARIANT_OPTIONS	opt opt2 ...	: these options are appended to all compiler command lines
+
+The following is the contents of the example file
+armv5_cpu_spec_example.bsf which is exported to
+$(EPOCROOT)\epoc32\tools from e32toolp\platform. It is intended that
+users can use this a the basis for their own customizations.
+
+--------------------------------EXAMPLE-----------------------------------
+
+#<bsf>#
+
+# Example build specialization file 
+# 
+# NB currently specialization only applies to ARMV5 build using RVCT.
+
+# This file customizes the default ARMV5. It specifies a build that
+# always uses optimization level O1 rather than the default O2.
+customizes ARMV5
+
+# The following options that can be overridden by MMP files
+
+# Use these options when compiling user-side THUMB code
+thumb_options	-thumb -O1 
+
+# Use these options when compiling user-side ARM code
+arm_options	-arm -O1 
+
+# Use these options when compiling Kernel code
+kernel_options	-arm -O1 
+
+# This just factors out common (contingent) options from the above.
+# These options can also be overridden by MMP files.
+common_options	--diag_suppress 1,161,654,1135,1152,1300 --diag_error 1267
+
+# Fixed options for this build. These options should only be changed with great care since
+# they have the potential to introduce incompatible ABI (or machine) level effects.
+# -cpu 5T - this build just targets a generic 5T
+# -Ono_known_library - we use our own library so tell the compiler not to make assumptions about its implementation
+# -fpu softvfp - some system code explicitly assumes this variant of the EABI (softvfp+vfp could be used on say XScale)
+# --dll_vtbl - this switches on class exporting and is needed to support Symbian OS DLL model
+# -apcs /inter - redundant on 5T, but worth saying anyway
+invariant_options	-cpu 5T -fy -Ono_known_library -fpu softvfp --dll_vtbl -apcs /inter
+
+------------------------------------------END EXAMPLE-----------------------------------------
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/epocrc.config.sample	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,51 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# epocrc.config
+# Configuration data which is read by epocrc.pl, the data in this file allows 
+# the method of localisation to be specified.
+# check_rls_items can take the values 0 or 1, setting this variable to 1
+# will check for the presence of localisation comment tags before rls items
+# and the use of correct syntax within these comments. If there are no
+# localisation tags within the file then it is assumed that localisation is 
+# not required for this file. To emit a remark about files of this type adjust
+# the value of strict_checking below.
+#
+
+check_rls_items = 0;
+
+
+# strict_checking can take the values 0 or 1, setting this variable to 1
+# will cause rcomp to emit a warning if the rpp file contains rls items but
+# no localisation comments. check_rls_items must also be set to 1 to enable
+# this functionality.
+
+strict_checking = 0;
+
+# Any files and directories which need to be passed to cpp (the c pre-processor) 
+# should be specified here. File names and directory names should be relative to 
+# EPOCROOT and should be proceeded by 'include: ' (without the quotes). 
+#
+# The data added to the cpp command in each case will be:
+# -I "<path-relative to EPOCROOT>" -include "<path-and-filename-relative to EPOCROOT>"
+# if a file name is specified and 
+# -I "<path-relative to EPOCROOT>"
+# if a directory is specified.
+#
+# If a file included here #include-s another file do not specify the 
+# #include-d file here as cpp will then include the file twice.
+# It is however, necessary to specify the directory that any #include-d 
+# files are in if this directory will not be searched by cpp through the
+# files/directories which are included here. 
+
+include: epoc32\include\SymbianTags.rh
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/genshimsrc.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,79 @@
+GENSHIMSRC
+15/08/03
+
+Here is the user documentation that GENSHIMSRC.BAT itself produces:
+
+genshimsrc
+
+	Generate source for a shim DLL and its associated deffile from a supplied deffile
+
+Usage:
+	genshimsrc [options] deffile
+
+Where:
+	[deffile]     The source deffile
+
+Options:
+	--srcpath         the path for the output source file (defaults to CWD)
+	--defpath         the path for the output DEF file (defaults to srcpath)
+	--name            the name to use for the output files (defaults to shim)
+	--version         the version to use for the output DEF file (defaults to 0.0)
+	--alignstack      use shims which align the stack to an 8 byte boundary
+
+The following invocation
+
+    genshimsrc.bat --name=xuser-7_0 xuseru.def
+
+would produce two files: xuser-7_0.cia and xuser-7_0{00000000}.def (in CWD). 
+
+The version encoded in the DEF file name can be changed by supplying
+the --version option. e.g.
+
+    genshimsrc.bat --name=xuser-7_0 --version=1.0 xuseru.def
+
+would produce two files: xuser-7_0.cia and xuser-7_0{00010000}.def (in CWD). 
+
+The primary purpose of GENSHIMSRC is to allow 'DLL ordinal skew' to be
+repaired. It achieves this by generating 'trampoline' functions at the
+old ordinal which get linked against import stubs which will be
+resolved by the loader at the new ordinal. However the generated files
+make it easy for the programmer to inject code into the trampoline if
+the need arises by identifying each trampoline with the function it is
+derived from. The generated .DEF file also permits a usable IMPORT lib
+to be produced for the shim DLL if it is necessary.
+
+As alluded to above, for each entry in the supplied .DEF file
+GENSHIMSRC generates an exported (trampoline) function in the .CIA
+file and a corresponding entry in the associated .DEF file. Assume the
+following entry appears in the supplied .DEF file
+
+AddL__9CObjectIxP7CObject @ 11 NONAME ; CObjectIx::AddL(CObject *)xxxxx
+
+This results in the following source code being generated in the .CIA file
+
+EXPORT_C __NAKED__ int export_at_ordinal_11()
+//
+// CObjectIx::AddL(CObject *)
+//
+	{
+	asm("B AddL__9CObjectIxP7CObject");
+	}
+
+and the following entry being generated in the generated .DEF file
+
+AddL__9CObjectIxP7CObject=export_at_ordinal_11__Fv @ 11 NONAME ; CObjectIx::AddL(CObject *)
+
+These can be incorporated into a buildable project by providing a MMP file which contains:
+
+
+version			0.0		explicit
+target			xuser.dll
+targettype		dll
+sourcepath		.
+source			xuser-7_0.cia
+library			xuser{1.0}.lib
+systeminclude	..\..\include
+deffile			..\..\~\xuser-7_0.def
+
+
+N.B. There is nothing special about the MMP file.
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/gt0063.changes	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,32 @@
+GT 0063 Emulation Enhancements
+
+1. EPOCROOT check in E32env.PM
+
+Changed from static data to an active BEGIN{} section which tests the EPOCROOT
+environment variable and constructs the rest of the E32env::Data hash accordingly.
+
+EPOCROOT checking is:
+
+ - environment variable must exist
+ - EPOCROOT must begin with \
+ - EPOCROOT must specify an existing directory
+
+Most clients are expected to use $E32Env::Data{EPOCPath} as the raw "epoc32" directory.
+
+
+2. Path_MakeEAbs in PATHUTL.PM
+
+Variant of Path_MakeAbs.
+Path_MakeEAbs takes (EPOCPath, BasePath, ...) and makes the list of directories into 
+absolute paths relative to BasePath. The extra functionality is that paths beginning
+
+	+\...
+
+are treated as paths relative to EPOCPath rather than BasePath. 
+
+As a regression change, this change also extends to paths which begin \epoc32\, which 
+copes with the large number of existing absolute \epoc32 paths (e.g. SYSTEMINCLUDE 
+statements in MMP files). 
+
+Path_MakeEAbs is used in MMP.PM to handle SYSTEMINCLUDE, DEFFILE and USERINCLUDE
+statements, and in BLDMAKE.PL to handle PRJ_EXPORTS and PRJ_TESTEXPORTS.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/makmake.mdl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2075 @@
+
+(object Petal
+    version    	37)
+
+(object Design "<Top Level>"
+    is_unit    	TRUE
+    is_loaded  	TRUE
+    defaults   	(object defaults
+	rightMargin 	0.250000
+	leftMargin 	0.250000
+	topMargin  	0.250000
+	bottomMargin 	0.500000
+	pageOverlap 	0.250000
+	clipIconLabels 	TRUE
+	autoResize 	FALSE
+	snapToGrid 	TRUE
+	gridX      	0
+	gridY      	0
+	defaultFont 	(object Font
+	    size       	12
+	    face       	"Arial"
+	    bold       	FALSE
+	    italics    	FALSE
+	    underline  	FALSE
+	    strike     	FALSE
+	    color      	0
+	    default_color 	TRUE)
+	showMessageNum 	3
+	showClassOfObject 	TRUE
+	notation   	"Booch")
+    root_category 	(object Class_Category "<Top Level>"
+	exportControl 	"Public"
+	global     	TRUE
+	subsystem  	"<Top Level>"
+	logical_models 	(list unit_reference_list
+	    (object Class "MAKMAKE"
+		statemachine 	(object State_Machine
+		    states     	(list States
+			(object State "$UNNAMED$0"
+			    type       	"EndState")
+			(object State "$UNNAMED$1"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Load PERL Platform Module"
+				    Event      	(object Event "Buil")
+				    sendEvent  	(object sendEvent)))
+			    type       	"StartState")
+			(object State "Call PMGetBldList"
+			    documentation 	"Returns array of build types"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartMakefile"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartMakefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjDoc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"if not defined PMStartBldSPrjSrc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"if not defined PMStartBldSPrjSrc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"if defined PMStartBldSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMBld"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Setup the next build"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMBld"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMBldSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Read MMP file"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Open Makefile"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Setup Globals"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Setup Globals"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartMakefile"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMGetBldList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrjSrcList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSource"
+			    type       	"Normal")
+			(object State "Call PMBldSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartMakefile"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"CallPMStartBldList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMGetBldList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrjList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMBldSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjSrcList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjSrc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrjSrcList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjDoc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrjDocList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrj"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrjList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBld"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMEndBldList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Load PERL Platform Module"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartPlatform"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartPlatform"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Read MMP file"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Open Makefile"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Setup Globals"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Write text to makefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "CallPMStartBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "if not defined PMStartBldSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMEndBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "if defined PMStartBldSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMBldSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMBldSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMBldSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrjSrcList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjDocList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrjDocList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndBldSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartBldSPrjDocList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartBldSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldSPrjList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"if not defined PMSPrjSrc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"if not defined PMSPrjSrc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"if defined PMSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "if not defined PMSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndMakefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "if defined PMSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjSrcList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMSPrjSrcList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjSrcList"
+			    type       	"Normal")
+			(object State "Call PMStartSPrjSrcBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcBldList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjSrcBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjSrcBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMSPrjSrcBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjSrcBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjSrcBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjSrcBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjSrcBldList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjSrcBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"CallPMEndSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "CallPMEndSPrjSrc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"CallPMEndSPrjSrcList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "CallPMEndSPrjSrcList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDocList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjDocList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjDocBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDocBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrjDocBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMSPrjDocBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjDocBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjDocBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjDocBldList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjDocList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDoc"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjDocList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjList"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndMakefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndMakefile"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndPlatform"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndPlatform"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Open Makefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMStartSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDoc"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMSPrj"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrjDoc"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDocBldList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMSPrj"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjSrcList"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Call PMEndSPrjDocBld"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Call PMEndSPrjDocBldList"
+				    sendEvent  	(object sendEvent))
+				(object State_Transition
+				    supplier   	"Call PMStartSPrjDocBld"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Write text to makefile"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"Close Makefile"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")
+			(object State "Close Makefile"
+			    transitions 	(list transition_list
+				(object State_Transition
+				    supplier   	"$UNNAMED$0"
+				    sendEvent  	(object sendEvent)))
+			    type       	"Normal")))
+		statediagram 	(object State_Diagram ""
+		    title      	""
+		    zoom       	60
+		    max_height 	28350
+		    max_width  	21600
+		    origin_x   	0
+		    origin_y   	0
+		    items      	(list diagram_item_list
+			(object StateView "EndState" "$UNNAMED$0" @1
+			    location   	(322, 11086))
+			(object StateView "StartState" "$UNNAMED$1" @2
+			    location   	(112, 78))
+			(object StateView "Normal" "Call PMGetBldList" @3
+			    location   	(330, 1319)
+			    label      	(object ItemLabel
+				Parent_View 	@3
+				location   	(330, 1293)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	534
+				justify    	0
+				label      	"Call PMGetBldList")
+			    width      	546
+			    height     	142)
+			(object StateView "Normal" "Call PMBld" @4
+			    location   	(827, 2557)
+			    label      	(object ItemLabel
+				Parent_View 	@4
+				location   	(827, 2536)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	380
+				justify    	0
+				label      	"Call PMBld")
+			    width      	392
+			    height     	133)
+			(object StateView "Normal" "Call PMStartBld" @5
+			    location   	(328, 2281)
+			    label      	(object ItemLabel
+				Parent_View 	@5
+				location   	(328, 2239)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	496
+				justify    	0
+				label      	"Call PMStartBld")
+			    width      	508
+			    height     	175)
+			(object TransView "" @6
+			    client     	@5
+			    supplier   	@4
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartBldSPrjDoc" @7
+			    location   	(3957, 4721)
+			    label      	(object ItemLabel
+				Parent_View 	@7
+				location   	(3957, 4699)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	710
+				justify    	0
+				label      	"Call PMStartBldSPrjDoc")
+			    width      	722
+			    height     	134)
+			(object NoteView @8
+			    location   	(1187, 1929)
+			    label      	(object ItemLabel
+				Parent_View 	@8
+				location   	(759, 1818)
+				nlines     	3
+				max_width  	881
+				label      	
+|main::TargetDir $(path)\<build>
+|main::BuildDir $(path)\<build>
+|main::Build build
+				)
+			    width      	941
+			    height     	234)
+			(object StateView "Normal" "Read MMP file" @9
+			    location   	(346, 780)
+			    label      	(object ItemLabel
+				Parent_View 	@9
+				location   	(346, 757)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	507
+				justify    	0
+				label      	"Read MMP file")
+			    width      	519
+			    height     	137)
+			(object StateView "Normal" "Setup Globals" @10
+			    location   	(330, 1023)
+			    label      	(object ItemLabel
+				Parent_View 	@10
+				location   	(330, 1003)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	600
+				justify    	0
+				label      	"Setup Globals")
+			    width      	612
+			    height     	131)
+			(object NoteView @11
+			    location   	(2463, 908)
+			    label      	(object ItemLabel
+				Parent_View 	@11
+				location   	(1793, 56)
+				nlines     	27
+				max_width  	1365
+				label      	
+|main::Path_MakeToRoot	path from makefile to top directory
+|main::Project	project
+|main::PlainTarget	plaintarget . def-> mmp file - no ext.
+|main::TargetType	targettype. def-> "EXE"
+|main::Target	target. def-> plaintarget.targettype
+|main::UserIncludeList	user include list
+|main::SystemIncludeList	system include list
+|main::LibraryList	list of libraries
+|main::PlatformText  platform text block from mmp file
+|main::SubProject	null
+|main::Source	null
+|main::PlainSource	null
+|main::SourceDir	null
+|main::SourceList	list of all source files
+|main::PlainSourceList    list of all source files - no exts.
+|main::DependencyList    null
+|main::DocumentList	     list of all document files
+|main::Document	null
+|main::BuildList	null
+|main::Build	null
+|main::TargetDir	\epoc32\release\<platform>
+|main::BuildDir	\epoc32\build\project(?D)\<platform>
+|main::MacroList	current macrolist
+|main::AddMacro	list of added macros
+|main::RemoveMacro list of removed macros if successful
+|main::Output	1 if successful else die
+				)
+			    width      	1425
+			    height     	1716)
+			(object StateView "Normal" "Call PMStartBldSPrjSrcList" @12
+			    location   	(3004, 3681)
+			    label      	(object ItemLabel
+				Parent_View 	@12
+				location   	(3004, 3658)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	796
+				justify    	0
+				label      	"Call PMStartBldSPrjSrcList")
+			    width      	808
+			    height     	136)
+			(object StateView "Normal" "Call PMBldSPrjDoc" @13
+			    location   	(4572, 4914)
+			    label      	(object ItemLabel
+				Parent_View 	@13
+				location   	(4572, 4897)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	566
+				justify    	0
+				label      	"Call PMBldSPrjDoc")
+			    width      	578
+			    height     	124)
+			(object NoteView @14
+			    location   	(3268, 821)
+			    label      	(object ItemLabel
+				Parent_View 	@14
+				location   	(2906, 690)
+				nlines     	4
+				max_width  	748
+				label      	"All Main:: functions return default text or the null string If called prematurely.")
+			    width      	808
+			    height     	275)
+			(object AttachView "" @15
+			    client     	@11
+			    supplier   	@10
+			    line_style 	0)
+			(object AttachView "" @16
+			    client     	@8
+			    supplier   	@5
+			    line_style 	0)
+			(object NoteView @17
+			    location   	(1057, 1426)
+			    label      	(object ItemLabel
+				Parent_View 	@17
+				location   	(792, 1370)
+				nlines     	2
+				max_width  	555
+				label      	"main::BuildList buildlist")
+			    width      	615
+			    height     	125)
+			(object NoteView @18
+			    location   	(3749, 3450)
+			    label      	(object ItemLabel
+				Parent_View 	@18
+				location   	(3397, 3374)
+				nlines     	2
+				max_width  	729
+				label      	
+|main::Source	source
+|main::PlainSource	plainsource
+				)
+			    width      	789
+			    height     	164)
+			(object NoteView @19
+			    location   	(3787, 4544)
+			    label      	(object ItemLabel
+				Parent_View 	@19
+				location   	(3459, 4488)
+				nlines     	1
+				max_width  	680
+				label      	
+|main::Document	Document
+				)
+			    width      	740
+			    height     	124)
+			(object StateView "Normal" "Call PMStartBldSPrjList" @20
+			    location   	(1806, 3112)
+			    label      	(object ItemLabel
+				Parent_View 	@20
+				location   	(1806, 3091)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	696
+				justify    	0
+				label      	"Call PMStartBldSPrjList")
+			    width      	708
+			    height     	132)
+			(object StateView "Normal" "Call PMBldSPrj" @21
+			    location   	(3007, 3345)
+			    label      	(object ItemLabel
+				Parent_View 	@21
+				location   	(3007, 3315)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	463
+				justify    	0
+				label      	"Call PMBldSPrj")
+			    width      	475
+			    height     	150)
+			(object NoteView @22
+			    location   	(1669, 3467)
+			    label      	(object ItemLabel
+				Parent_View 	@22
+				location   	(1118, 3312)
+				nlines     	5
+				max_width  	1127
+				label      	
+|main::SubProject	 subproject
+|main::SourceDir	source directory
+|main::SourceList	subproj relative src list
+|main::PlainSourceList  subproj relative plain src list
+|main::DocumentList  subproj relative document list
+				)
+			    width      	1187
+			    height     	323)
+			(object TransView "" @23
+			    client     	@21
+			    supplier   	@12
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndBldSPrjSrc" @24
+			    location   	(3928, 4034)
+			    label      	(object ItemLabel
+				Parent_View 	@24
+				location   	(3928, 4011)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	668
+				justify    	0
+				label      	"Call PMEndBldSPrjSrc")
+			    width      	680
+			    height     	136)
+			(object StateView "Normal" "Call PMEndBldSPrjDoc" @25
+			    location   	(3957, 5117)
+			    label      	(object ItemLabel
+				Parent_View 	@25
+				location   	(3957, 5087)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	686
+				justify    	0
+				label      	"Call PMEndBldSPrjDoc")
+			    width      	698
+			    height     	150)
+			(object TransView "" @26
+			    client     	@13
+			    supplier   	@25
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndBldSPrj" @27
+			    location   	(2554, 5371)
+			    label      	(object ItemLabel
+				Parent_View 	@27
+				location   	(2554, 5349)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	566
+				justify    	0
+				label      	"Call PMEndBldSPrj")
+			    width      	578
+			    height     	134)
+			(object StateView "Normal" "Call PMEndBld" @28
+			    location   	(328, 5369)
+			    label      	(object ItemLabel
+				Parent_View 	@28
+				location   	(328, 5339)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	480
+				justify    	0
+				label      	"Call PMEndBld")
+			    width      	492
+			    height     	150)
+			(object StateView "Normal" "Load PERL Platform Module" @29
+			    location   	(338, 307)
+			    label      	(object ItemLabel
+				Parent_View 	@29
+				location   	(338, 264)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	665
+				justify    	0
+				label      	"Load PERL Platform Module")
+			    width      	677
+			    height     	177)
+			(object TransView "" @30
+			    client     	@2
+			    supplier   	@29
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object NoteView @31
+			    location   	(1192, 343)
+			    label      	(object ItemLabel
+				Parent_View 	@31
+				location   	(807, 271)
+				nlines     	2
+				max_width  	794
+				label      	
+|main::Platform	platform
+|main::ResetPlatform   newplatform
+				)
+			    width      	854
+			    height     	156)
+			(object StateView "Normal" "Call PMStartPlatform" @32
+			    location   	(341, 549)
+			    label      	(object ItemLabel
+				Parent_View 	@32
+				location   	(341, 527)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	618
+				justify    	0
+				label      	"Call PMStartPlatform")
+			    width      	630
+			    height     	134)
+			(object TransView "" @33
+			    client     	@29
+			    supplier   	@32
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @34
+			    client     	@32
+			    supplier   	@9
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartMakefile" @35
+			    location   	(328, 1631)
+			    label      	(object ItemLabel
+				Parent_View 	@35
+				location   	(328, 1597)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	616
+				justify    	0
+				label      	"Call PMStartMakefile")
+			    width      	628
+			    height     	158)
+			(object TransView "" @36
+			    client     	@3
+			    supplier   	@35
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @37
+			    client     	@10
+			    supplier   	@3
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "CallPMStartBldList" @38
+			    location   	(330, 2007)
+			    label      	(object ItemLabel
+				Parent_View 	@38
+				location   	(330, 1985)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	550
+				justify    	0
+				label      	"CallPMStartBldList")
+			    width      	562
+			    height     	134)
+			(object TransView "" @39
+			    client     	@35
+			    supplier   	@38
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @40
+			    client     	@38
+			    supplier   	@5
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "if not defined PMStartBldSPrjSrc" @41
+			    location   	(781, 2839)
+			    label      	(object ItemLabel
+				Parent_View 	@41
+				location   	(781, 2817)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	758
+				justify    	0
+				label      	"if not defined PMStartBldSPrjSrc")
+			    width      	770)
+			(object StateView "Normal" "if defined PMStartBldSPrjSrc" @42
+			    location   	(1815, 2845)
+			    label      	(object ItemLabel
+				Parent_View 	@42
+				location   	(1815, 2823)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	850
+				justify    	0
+				label      	"if defined PMStartBldSPrjSrc")
+			    width      	862
+			    height     	134)
+			(object TransView "" @43
+			    client     	@42
+			    supplier   	@20
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartBldSPrj" @44
+			    location   	(2557, 3110)
+			    label      	(object ItemLabel
+				Parent_View 	@44
+				location   	(2557, 3088)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	590
+				justify    	0
+				label      	"Call PMStartBldSPrj")
+			    width      	602
+			    height     	134)
+			(object TransView "" @45
+			    client     	@20
+			    supplier   	@44
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @46
+			    client     	@44
+			    supplier   	@21
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartBldSPrjSrc" @47
+			    location   	(3928, 3680)
+			    label      	(object ItemLabel
+				Parent_View 	@47
+				location   	(3928, 3652)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	692
+				justify    	0
+				label      	"Call PMStartBldSPrjSrc")
+			    width      	704
+			    height     	146)
+			(object TransView "" @48
+			    client     	@12
+			    supplier   	@47
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object AttachView "" @49
+			    client     	@18
+			    supplier   	@47
+			    line_style 	0)
+			(object NoteView @50
+			    location   	(5064, 3611)
+			    label      	(object ItemLabel
+				Parent_View 	@50
+				location   	(4622, 3544)
+				nlines     	2
+				max_width  	909
+				label      	"main::DependencyList dependency list")
+			    width      	969
+			    height     	146)
+			(object AttachView "" @51
+			    client     	@31
+			    supplier   	@32
+			    line_style 	0)
+			(object AttachView "" @52
+			    client     	@22
+			    supplier   	@44
+			    line_style 	0)
+			(object StateView "Normal" "Call PMBldSPrjSrc" @53
+			    location   	(4654, 3843)
+			    label      	(object ItemLabel
+				Parent_View 	@53
+				location   	(4654, 3821)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	722
+				justify    	0
+				label      	"Call PMBldSPrjSrc")
+			    width      	734
+			    height     	134)
+			(object TransView "" @54
+			    client     	@47
+			    supplier   	@53
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @55
+			    client     	@53
+			    supplier   	@24
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object AttachView "" @56
+			    client     	@50
+			    supplier   	@53
+			    line_style 	0)
+			(object StateView "Normal" "Call PMEndBldSPrjSrcList" @57
+			    location   	(3020, 4027)
+			    label      	(object ItemLabel
+				Parent_View 	@57
+				location   	(3020, 4005)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	772
+				justify    	0
+				label      	"Call PMEndBldSPrjSrcList")
+			    width      	784
+			    height     	134)
+			(object StateView "Normal" "Call PMEndBldSPrjDocList" @58
+			    location   	(3043, 5113)
+			    label      	(object ItemLabel
+				Parent_View 	@58
+				location   	(3043, 5092)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	790
+				justify    	0
+				label      	"Call PMEndBldSPrjDocList")
+			    width      	802
+			    height     	132)
+			(object StateView "Normal" "Call PMStartBldSPrjDocList" @59
+			    location   	(3019, 4719)
+			    label      	(object ItemLabel
+				Parent_View 	@59
+				location   	(3019, 4698)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	814
+				justify    	0
+				label      	"Call PMStartBldSPrjDocList")
+			    width      	826
+			    height     	132)
+			(object TransView "" @60
+			    client     	@57
+			    supplier   	@59
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @61
+			    client     	@59
+			    supplier   	@7
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @62
+			    client     	@7
+			    supplier   	@13
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndBldSPrjList" @63
+			    location   	(1733, 5368)
+			    label      	(object ItemLabel
+				Parent_View 	@63
+				location   	(1733, 5346)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	672
+				justify    	0
+				label      	"Call PMEndBldSPrjList")
+			    width      	684
+			    height     	134)
+			(object TransView "" @64
+			    client     	@63
+			    supplier   	@28
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @65
+			    client     	@41
+			    supplier   	@28
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object AttachView "" @66
+			    client     	@19
+			    supplier   	@7
+			    line_style 	0)
+			(object TransView "" @67
+			    client     	@4
+			    supplier   	@41
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @68
+			    client     	@4
+			    supplier   	@42
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object AttachView "" @69
+			    client     	@17
+			    supplier   	@35
+			    line_style 	0)
+			(object NoteView @70
+			    location   	(3775, 4284)
+			    label      	(object ItemLabel
+				Parent_View 	@70
+				location   	(3494, 4217)
+				nlines     	2
+				max_width  	586
+				label      	
+|main::Source	null
+|main::PlainSource	null
+				)
+			    width      	646
+			    height     	146)
+			(object AttachView "" @71
+			    client     	@57
+			    supplier   	@70
+			    line_style 	0)
+			(object NoteView @72
+			    location   	(3790, 5334)
+			    label      	(object ItemLabel
+				Parent_View 	@72
+				location   	(3556, 5278)
+				nlines     	1
+				max_width  	492
+				label      	"main::Document null")
+			    width      	552
+			    height     	125)
+			(object NoteView @73
+			    location   	(1651, 4969)
+			    label      	(object ItemLabel
+				Parent_View 	@73
+				location   	(1220, 4819)
+				nlines     	4
+				max_width  	887
+				label      	
+|main::SubProject	null
+|main::SourceDir	null
+|main::SourceList	all sources
+|main::PlainSourceList  all plain sources
+|main::DocumentList all documents
+				)
+			    width      	947
+			    height     	312)
+			(object AttachView "" @74
+			    client     	@73
+			    supplier   	@63
+			    line_style 	0)
+			(object StateView "Normal" "Call PMEndBldList" @75
+			    location   	(328, 5679)
+			    label      	(object ItemLabel
+				Parent_View 	@75
+				location   	(328, 5657)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	540
+				justify    	0
+				label      	"Call PMEndBldList")
+			    width      	552)
+			(object NoteView @76
+			    location   	(4883, 4113)
+			    label      	(object ItemLabel
+				Parent_View 	@76
+				location   	(4582, 4057)
+				nlines     	1
+				max_width  	627
+				label      	"main::DependencyList  null")
+			    width      	687
+			    height     	125)
+			(object AttachView "" @77
+			    client     	@24
+			    supplier   	@76
+			    line_style 	0)
+			(object NoteView @78
+			    location   	(1390, 5594)
+			    label      	(object ItemLabel
+				Parent_View 	@78
+				location   	(740, 5491)
+				nlines     	3
+				max_width  	1325
+				label      	
+|main::TargetDir	\EPOC32\RELEASE\<platform>
+|main::BuildDir	\EPOC32\BUILD\PROJECT\<platform>
+|main::Build	null
+				)
+			    width      	1385
+			    height     	219)
+			(object AttachView "" @79
+			    client     	@75
+			    supplier   	@78
+			    line_style 	0)
+			(object StateView "Normal" "if not defined PMSPrjSrc" @80
+			    location   	(328, 6002)
+			    label      	(object ItemLabel
+				Parent_View 	@80
+				location   	(328, 5974)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	571
+				justify    	0
+				label      	"if not defined PMSPrjSrc")
+			    width      	583
+			    height     	146)
+			(object TransView "" @81
+			    client     	@75
+			    supplier   	@80
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "if defined PMSPrjSrc" @82
+			    location   	(1107, 6001)
+			    label      	(object ItemLabel
+				Parent_View 	@82
+				location   	(1107, 5978)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	610
+				justify    	0
+				label      	"if defined PMSPrjSrc")
+			    width      	622
+			    height     	136)
+			(object TransView "" @83
+			    client     	@75
+			    supplier   	@82
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjList" @84
+			    location   	(1091, 6235)
+			    label      	(object ItemLabel
+				Parent_View 	@84
+				location   	(1091, 6212)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	598
+				justify    	0
+				label      	"Call PMStartSPrjList")
+			    width      	610
+			    height     	136)
+			(object TransView "" @85
+			    client     	@82
+			    supplier   	@84
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjSrcList" @86
+			    location   	(2416, 6646)
+			    label      	(object ItemLabel
+				Parent_View 	@86
+				location   	(2416, 6624)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	700
+				justify    	0
+				label      	"Call PMStartSPrjSrcList")
+			    width      	712
+			    height     	134)
+			(object StateView "Normal" "Call PMStartSPrjSrcBldList" @87
+			    location   	(3700, 7174)
+			    label      	(object ItemLabel
+				Parent_View 	@87
+				location   	(3700, 7151)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	796
+				justify    	0
+				label      	"Call PMStartSPrjSrcBldList")
+			    width      	808
+			    height     	136)
+			(object StateView "Normal" "Call PMSPrjSrc" @88
+			    location   	(3703, 6898)
+			    label      	(object ItemLabel
+				Parent_View 	@88
+				location   	(3703, 6875)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	478
+				justify    	0
+				label      	"Call PMSPrjSrc")
+			    width      	490
+			    height     	136)
+			(object StateView "Normal" "Call PMStartSPrjSrc" @89
+			    location   	(3248, 6642)
+			    label      	(object ItemLabel
+				Parent_View 	@89
+				location   	(3248, 6614)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	596
+				justify    	0
+				label      	"Call PMStartSPrjSrc")
+			    width      	608
+			    height     	146)
+			(object TransView "" @90
+			    client     	@89
+			    supplier   	@88
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @91
+			    client     	@88
+			    supplier   	@87
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjSrcBld" @92
+			    location   	(4636, 7193)
+			    label      	(object ItemLabel
+				Parent_View 	@92
+				location   	(4636, 7171)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	692
+				justify    	0
+				label      	"Call PMStartSPrjSrcBld")
+			    width      	704
+			    height     	134)
+			(object StateView "Normal" "Call PMSPrjSrcBld" @93
+			    location   	(5183, 7399)
+			    label      	(object ItemLabel
+				Parent_View 	@93
+				location   	(5183, 7376)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	550
+				justify    	0
+				label      	"Call PMSPrjSrcBld")
+			    width      	562
+			    height     	136)
+			(object StateView "Normal" "Call PMEndSPrjSrcBld" @94
+			    location   	(4636, 7605)
+			    label      	(object ItemLabel
+				Parent_View 	@94
+				location   	(4636, 7583)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	668
+				justify    	0
+				label      	"Call PMEndSPrjSrcBld")
+			    width      	680
+			    height     	134)
+			(object StateView "Normal" "Call PMEndSPrjSrcBldList" @95
+			    location   	(3775, 7598)
+			    label      	(object ItemLabel
+				Parent_View 	@95
+				location   	(3775, 7575)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	772
+				justify    	0
+				label      	"Call PMEndSPrjSrcBldList")
+			    width      	784
+			    height     	136)
+			(object StateView "Normal" "CallPMEndSPrjSrc" @96
+			    location   	(3248, 7855)
+			    label      	(object ItemLabel
+				Parent_View 	@96
+				location   	(3248, 7827)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	552
+				justify    	0
+				label      	"CallPMEndSPrjSrc")
+			    width      	564
+			    height     	146)
+			(object StateView "Normal" "CallPMEndSPrjSrcList" @97
+			    location   	(2445, 7848)
+			    label      	(object ItemLabel
+				Parent_View 	@97
+				location   	(2445, 7826)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	656
+				justify    	0
+				label      	"CallPMEndSPrjSrcList")
+			    width      	668
+			    height     	134)
+			(object TransView "" @98
+			    client     	@92
+			    supplier   	@93
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @99
+			    client     	@93
+			    supplier   	@94
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @100
+			    client     	@94
+			    supplier   	@95
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @101
+			    client     	@95
+			    supplier   	@96
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @102
+			    client     	@96
+			    supplier   	@97
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjDocList" @103
+			    location   	(2445, 8167)
+			    label      	(object ItemLabel
+				Parent_View 	@103
+				location   	(2445, 8144)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	718
+				justify    	0
+				label      	"Call PMStartSPrjDocList")
+			    width      	730
+			    height     	136)
+			(object TransView "" @104
+			    client     	@97
+			    supplier   	@103
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjDoc" @105
+			    location   	(3269, 8136)
+			    label      	(object ItemLabel
+				Parent_View 	@105
+				location   	(3269, 8114)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	614
+				justify    	0
+				label      	"Call PMStartSPrjDoc")
+			    width      	626
+			    height     	134)
+			(object TransView "" @106
+			    client     	@86
+			    supplier   	@89
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @107
+			    client     	@87
+			    supplier   	@92
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @108
+			    client     	@103
+			    supplier   	@105
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrjDocBldList" @109
+			    location   	(3785, 8653)
+			    label      	(object ItemLabel
+				Parent_View 	@109
+				location   	(3785, 8631)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	814
+				justify    	0
+				label      	"Call PMStartSPrjDocBldList")
+			    width      	826
+			    height     	134)
+			(object StateView "Normal" "Call PMStartSPrjDocBld" @110
+			    location   	(4708, 8682)
+			    label      	(object ItemLabel
+				Parent_View 	@110
+				location   	(4708, 8659)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	710
+				justify    	0
+				label      	"Call PMStartSPrjDocBld")
+			    width      	722
+			    height     	136)
+			(object TransView "" @111
+			    client     	@109
+			    supplier   	@110
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMSPrjDocBld" @112
+			    location   	(5234, 8906)
+			    label      	(object ItemLabel
+				Parent_View 	@112
+				location   	(5234, 8884)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	566
+				justify    	0
+				label      	"Call PMSPrjDocBld")
+			    width      	578
+			    height     	134)
+			(object TransView "" @113
+			    client     	@110
+			    supplier   	@112
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndSPrjDocBldList" @114
+			    location   	(3816, 9060)
+			    label      	(object ItemLabel
+				Parent_View 	@114
+				location   	(3816, 9038)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	790
+				justify    	0
+				label      	"Call PMEndSPrjDocBldList")
+			    width      	802
+			    height     	134)
+			(object StateView "Normal" "Call PMEndSPrjDoc" @115
+			    location   	(3269, 9318)
+			    label      	(object ItemLabel
+				Parent_View 	@115
+				location   	(3269, 9295)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	590
+				justify    	0
+				label      	"Call PMEndSPrjDoc")
+			    width      	602
+			    height     	136)
+			(object TransView "" @116
+			    client     	@114
+			    supplier   	@115
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndSPrjDocList" @117
+			    location   	(2474, 9317)
+			    label      	(object ItemLabel
+				Parent_View 	@117
+				location   	(2474, 9294)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	694
+				justify    	0
+				label      	"Call PMEndSPrjDocList")
+			    width      	706
+			    height     	136)
+			(object TransView "" @118
+			    client     	@115
+			    supplier   	@117
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndSPrj" @119
+			    location   	(1778, 9305)
+			    label      	(object ItemLabel
+				Parent_View 	@119
+				location   	(1778, 9283)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	470
+				justify    	0
+				label      	"Call PMEndSPrj")
+			    width      	482
+			    height     	134)
+			(object TransView "" @120
+			    client     	@117
+			    supplier   	@119
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndSPrjList" @121
+			    location   	(1002, 9303)
+			    label      	(object ItemLabel
+				Parent_View 	@121
+				location   	(1002, 9286)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	574
+				justify    	0
+				label      	"Call PMEndSPrjList")
+			    width      	586
+			    height     	124)
+			(object TransView "" @122
+			    client     	@119
+			    supplier   	@121
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndMakefile" @123
+			    location   	(328, 9657)
+			    label      	(object ItemLabel
+				Parent_View 	@123
+				location   	(328, 9635)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	592
+				justify    	0
+				label      	"Call PMEndMakefile")
+			    width      	604
+			    height     	134)
+			(object StateView "Normal" "Call PMEndPlatform" @124
+			    location   	(328, 9933)
+			    label      	(object ItemLabel
+				Parent_View 	@124
+				location   	(328, 9911)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	594
+				justify    	0
+				label      	"Call PMEndPlatform")
+			    width      	606
+			    height     	134)
+			(object TransView "" @125
+			    client     	@121
+			    supplier   	@123
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @126
+			    client     	@123
+			    supplier   	@124
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @127
+			    client     	@58
+			    supplier   	@27
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @128
+			    client     	@25
+			    supplier   	@7
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @129
+			    client     	@25
+			    supplier   	@58
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @130
+			    client     	@24
+			    supplier   	@47
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @131
+			    client     	@24
+			    supplier   	@57
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMStartSPrj" @132
+			    location   	(1778, 6229)
+			    label      	(object ItemLabel
+				Parent_View 	@132
+				location   	(1778, 6207)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	494
+				justify    	0
+				label      	"Call PMStartSPrj")
+			    width      	506
+			    height     	134)
+			(object TransView "" @133
+			    client     	@84
+			    supplier   	@132
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMSPrjDoc" @134
+			    location   	(3786, 8418)
+			    label      	(object ItemLabel
+				Parent_View 	@134
+				location   	(3786, 8395)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	470
+				justify    	0
+				label      	"Call PMSPrjDoc")
+			    width      	482
+			    height     	136)
+			(object TransView "" @135
+			    client     	@105
+			    supplier   	@134
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @136
+			    client     	@134
+			    supplier   	@109
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @137
+			    client     	@119
+			    supplier   	@132
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMSPrj" @138
+			    location   	(2411, 6234)
+			    label      	(object ItemLabel
+				Parent_View 	@138
+				location   	(2411, 6212)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	352
+				justify    	0
+				label      	"Call PMSPrj")
+			    width      	364
+			    height     	134)
+			(object TransView "" @139
+			    client     	@132
+			    supplier   	@138
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @140
+			    client     	@138
+			    supplier   	@86
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @141
+			    client     	@94
+			    supplier   	@92
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @142
+			    client     	@96
+			    supplier   	@89
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Call PMEndSPrjDocBld" @143
+			    location   	(4708, 9093)
+			    label      	(object ItemLabel
+				Parent_View 	@143
+				location   	(4708, 9071)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	686
+				justify    	0
+				label      	"Call PMEndSPrjDocBld")
+			    width      	698
+			    height     	134)
+			(object TransView "" @144
+			    client     	@112
+			    supplier   	@143
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @145
+			    client     	@143
+			    supplier   	@114
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @146
+			    client     	@143
+			    supplier   	@110
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @147
+			    client     	@115
+			    supplier   	@105
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @148
+			    client     	@80
+			    supplier   	@123
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @149
+			    client     	@28
+			    supplier   	@5
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @150
+			    client     	@28
+			    supplier   	@75
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object NoteView @151
+			    location   	(2214, 5928)
+			    label      	(object ItemLabel
+				Parent_View 	@151
+				location   	(1663, 5773)
+				nlines     	5
+				max_width  	1127
+				label      	
+|main::SubProject	 subproject
+|main::SourceDir	source directory
+|main::SourceList	subproj relative src list
+|main::PlainSourceList  subproj relative plain src list
+|main::DocumentList  subproj relative document list
+				)
+			    width      	1187
+			    height     	323)
+			(object AttachView "" @152
+			    client     	@151
+			    supplier   	@132
+			    line_style 	0)
+			(object NoteView @153
+			    location   	(2790, 6885)
+			    label      	(object ItemLabel
+				Parent_View 	@153
+				location   	(2438, 6809)
+				nlines     	2
+				max_width  	729
+				label      	
+|main::Source	source
+|main::PlainSource	plainsource
+				)
+			    width      	789
+			    height     	164)
+			(object AttachView "" @154
+			    client     	@153
+			    supplier   	@89
+			    line_style 	0)
+			(object NoteView @155
+			    location   	(4281, 6696)
+			    label      	(object ItemLabel
+				Parent_View 	@155
+				location   	(3839, 6629)
+				nlines     	2
+				max_width  	909
+				label      	"main::DependencyList dependency list")
+			    width      	969
+			    height     	146)
+			(object AttachView "" @156
+			    client     	@155
+			    supplier   	@88
+			    line_style 	0)
+			(object NoteView @157
+			    location   	(5162, 6966)
+			    label      	(object ItemLabel
+				Parent_View 	@157
+				location   	(4734, 6855)
+				nlines     	3
+				max_width  	881
+				label      	
+|main::TargetDir $(path)\<build>
+|main::BuildDir $(path)\<build>
+|main::Build build
+				)
+			    width      	941
+			    height     	234)
+			(object AttachView "" @158
+			    client     	@157
+			    supplier   	@92
+			    line_style 	0)
+			(object NoteView @159
+			    location   	(5188, 8376)
+			    label      	(object ItemLabel
+				Parent_View 	@159
+				location   	(4760, 8265)
+				nlines     	3
+				max_width  	881
+				label      	
+|main::TargetDir $(path)\<build>
+|main::BuildDir $(path)\<build>
+|main::Build build
+				)
+			    width      	941
+			    height     	234)
+			(object AttachView "" @160
+			    client     	@159
+			    supplier   	@110
+			    line_style 	0)
+			(object NoteView @161
+			    location   	(4198, 8110)
+			    label      	(object ItemLabel
+				Parent_View 	@161
+				location   	(3897, 8054)
+				nlines     	1
+				max_width  	627
+				label      	"main::DependencyList  null")
+			    width      	687
+			    height     	125)
+			(object AttachView "" @162
+			    client     	@96
+			    supplier   	@161
+			    line_style 	0)
+			(object NoteView @163
+			    location   	(2826, 7562)
+			    label      	(object ItemLabel
+				Parent_View 	@163
+				location   	(2545, 7495)
+				nlines     	2
+				max_width  	586
+				label      	
+|main::Source	null
+|main::PlainSource	null
+				)
+			    width      	646
+			    height     	146)
+			(object AttachView "" @164
+			    client     	@163
+			    supplier   	@97
+			    line_style 	0)
+			(object NoteView @165
+			    location   	(2832, 9009)
+			    label      	(object ItemLabel
+				Parent_View 	@165
+				location   	(2598, 8953)
+				nlines     	1
+				max_width  	492
+				label      	"main::Document null")
+			    width      	552
+			    height     	125)
+			(object NoteView @166
+			    location   	(5157, 7883)
+			    label      	(object ItemLabel
+				Parent_View 	@166
+				location   	(4506, 7785)
+				nlines     	3
+				max_width  	1326
+				label      	
+|main::TargetDir	\EPOC32\RELEASE\<platform>
+|main::BuildDir	\EPOC32\BUILD\PROJECT\<platform>
+|main::Build	null
+				)
+			    width      	1386
+			    height     	208)
+			(object AttachView "" @167
+			    client     	@95
+			    supplier   	@166
+			    line_style 	0)
+			(object NoteView @168
+			    location   	(5125, 9414)
+			    label      	(object ItemLabel
+				Parent_View 	@168
+				location   	(4474, 9316)
+				nlines     	3
+				max_width  	1326
+				label      	
+|main::TargetDir	\EPOC32\RELEASE\<platform>
+|main::BuildDir	\EPOC32\BUILD\PROJECT\<platform>
+|main::Build	null
+				)
+			    width      	1386
+			    height     	208)
+			(object AttachView "" @169
+			    client     	@114
+			    supplier   	@168
+			    line_style 	0)
+			(object AttachView "" @170
+			    client     	@117
+			    supplier   	@165
+			    line_style 	0)
+			(object NoteView @171
+			    location   	(1907, 9751)
+			    label      	(object ItemLabel
+				Parent_View 	@171
+				location   	(1476, 9601)
+				nlines     	4
+				max_width  	887
+				label      	
+|main::SubProject	null
+|main::SourceDir	null
+|main::SourceList	all sources
+|main::PlainSourceList  all plain sources
+|main::DocumentList all documents
+				)
+			    width      	947
+			    height     	312)
+			(object AttachView "" @172
+			    client     	@121
+			    supplier   	@171
+			    line_style 	0)
+			(object NoteView @173
+			    location   	(2800, 8421)
+			    label      	(object ItemLabel
+				Parent_View 	@173
+				location   	(2472, 8365)
+				nlines     	1
+				max_width  	680
+				label      	
+|main::Document	Document
+				)
+			    width      	740
+			    height     	124)
+			(object AttachView "" @174
+			    client     	@105
+			    supplier   	@173
+			    line_style 	0)
+			(object AttachView "" @175
+			    client     	@58
+			    supplier   	@72
+			    line_style 	0)
+			(object TransView "" @176
+			    client     	@27
+			    supplier   	@44
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @177
+			    client     	@27
+			    supplier   	@63
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @178
+			    client     	@9
+			    supplier   	@10
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Open Makefile" @179
+			    location   	(333, 10240)
+			    label      	(object ItemLabel
+				Parent_View 	@179
+				location   	(333, 10218)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	519
+				justify    	0
+				label      	"Open Makefile")
+			    width      	531)
+			(object TransView "" @180
+			    client     	@124
+			    supplier   	@179
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object StateView "Normal" "Write text to makefile" @181
+			    location   	(333, 10545)
+			    label      	(object ItemLabel
+				Parent_View 	@181
+				location   	(333, 10518)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	519
+				justify    	0
+				label      	"Write text to makefile")
+			    width      	531
+			    height     	145)
+			(object StateView "Normal" "Close Makefile" @182
+			    location   	(323, 10816)
+			    label      	(object ItemLabel
+				Parent_View 	@182
+				location   	(323, 10794)
+				anchor_loc 	1
+				nlines     	1
+				max_width  	405
+				justify    	0
+				label      	"Close Makefile")
+			    width      	417)
+			(object TransView "" @183
+			    client     	@179
+			    supplier   	@181
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @184
+			    client     	@181
+			    supplier   	@182
+			    line_style 	0
+			    x_offset   	FALSE)
+			(object TransView "" @185
+			    client     	@182
+			    supplier   	@1
+			    line_style 	0
+			    x_offset   	FALSE)))))
+	logical_presentations 	(list unit_reference_list
+	    (object ClassDiagram "Main"
+		title      	"Main"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list
+		    (object ClassView "Class" "MAKMAKE" @186
+			location   	(1569, 909)
+			label      	(object ItemLabel
+			    Parent_View 	@186
+			    location   	(1465, 825)
+			    nlines     	2
+			    max_width  	240
+			    justify    	0
+			    label      	"MAKMAKE"))))))
+    root_subsystem 	(object SubSystem "<Top Level>"
+	physical_models 	(list unit_reference_list)
+	physical_presentations 	(list unit_reference_list
+	    (object Module_Diagram "Main"
+		title      	"Main"
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list))))
+    process_structure 	(object Processes
+	ProcsNDevs 	(list
+	    (object Process_Diagram ""
+		title      	""
+		zoom       	100
+		max_height 	28350
+		max_width  	21600
+		origin_x   	0
+		origin_y   	0
+		items      	(list diagram_item_list))))
+    properties 	(object Properties))
Binary file sbsv1/abld/doc/makmake.ppt has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/makmake.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,485 @@
+{\rtf1\ansi \deff4\deflang1033{\fonttbl{\f0\froman\fcharset0\fprq2 Tms Rmn{\*\falt Times New Roman};}{\f1\froman\fcharset2\fprq2 Symbol;}{\f2\fswiss\fcharset0\fprq2 Helv{\*\falt Arial};}{\f3\fmodern\fcharset0\fprq1 Courier;}
+{\f4\froman\fcharset0\fprq2 Times New Roman;}{\f5\fswiss\fcharset0\fprq2 Arial{\*\falt  arial};}{\f6\froman\fcharset0\fprq2 MS Serif;}{\f7\fswiss\fcharset0\fprq2 MS Sans Serif;}{\f8\froman\fcharset0\fprq2 Times;}
+{\f9\fswiss\fcharset0\fprq2 Helvetica{\*\falt Arial};}{\f10\fswiss\fcharset0\fprq2 System;}{\f11\fmodern\fcharset0\fprq1 Courier New;}{\f12\froman\fcharset0\fprq2 New York;}{\f13\fswiss\fcharset0\fprq2 Geneva;}{\f14\fmodern\fcharset0\fprq1 LinePrinter;}
+{\f15\froman\fcharset0\fprq2 CG Times;}{\f16\fswiss\fcharset0\fprq2 Univers;}{\f17\fswiss\fcharset0\fprq2 Univers Condensed;}{\f18\fswiss\fcharset0\fprq2 Antique Olive;}{\f19\froman\fcharset0\fprq2 Garamond;}{\f20\fswiss\fcharset0\fprq2 CG Omega;}
+{\f21\fswiss\fcharset0\fprq2 Albertus Medium;}{\f22\fswiss\fcharset0\fprq2 Albertus Extra Bold;}{\f23\froman\fcharset0\fprq2 Clarendon Condensed;}{\f24\fscript\fcharset0\fprq2 Coronet;}{\f25\fmodern\fcharset0\fprq1 Letter Gothic;}
+{\f26\fscript\fcharset0\fprq2 Marigold;}{\f27\fnil\fcharset2\fprq2 Wingdings;}{\f28\fnil\fcharset2\fprq2 Marlett;}{\f29\fswiss\fcharset238\fprq2 Arial CE{\*\falt  arial};}{\f30\fswiss\fcharset204\fprq2 Arial CYR{\*\falt  arial};}
+{\f31\fswiss\fcharset161\fprq2 Arial Greek{\*\falt  arial};}{\f32\fswiss\fcharset162\fprq2 Arial TUR{\*\falt  arial};}{\f33\fmodern\fcharset238\fprq1 Courier New CE;}{\f34\fmodern\fcharset204\fprq1 Courier New CYR;}
+{\f35\fmodern\fcharset161\fprq1 Courier New Greek;}{\f36\fmodern\fcharset162\fprq1 Courier New TUR;}{\f37\fmodern\fcharset0\fprq1 Lucida Console;}{\f38\fswiss\fcharset0\fprq2 Lucida Sans Unicode;}{\f39\froman\fcharset238\fprq2 Times New Roman CE;}
+{\f40\froman\fcharset204\fprq2 Times New Roman CYR;}{\f41\froman\fcharset161\fprq2 Times New Roman Greek;}{\f42\froman\fcharset162\fprq2 Times New Roman TUR;}{\f43\froman\fcharset0\fprq2 Century Schoolbook;}{\f44\fswiss\fcharset0\fprq2 Arial Narrow;}
+{\f45\froman\fcharset0\fprq2 Map Symbols;}{\f46\fdecor\fcharset0\fprq2 Algerian;}{\f47\froman\fcharset0\fprq2 Footlight MT Light;}{\f48\froman\fcharset0\fprq2 Book Antiqua;}{\f49\fdecor\fcharset0\fprq2 Colonna MT;}
+{\f50\fnil\fcharset2\fprq2 Monotype Sorts;}{\f51\froman\fcharset2\fprq2 MT Extra;}{\f52\froman\fcharset0\fprq2 Bookman Old Style;}{\f53\fdecor\fcharset0\fprq2 Playbill;}{\f54\fscript\fcharset0\fprq2 Brush Script MT;}
+{\f55\fswiss\fcharset0\fprq2 Arial Rounded MT Bold;}{\f56\fswiss\fcharset0\fprq2 Haettenschweiler;}{\f57\fdecor\fcharset0\fprq2 Desdemona;}{\f58\fmodern\fcharset2\fprq1 MS LineDraw;}{\f59\froman\fcharset0\fprq2 Wide Latin;}
+{\f60\fswiss\fcharset0\fprq2 Century Gothic;}{\f61\fswiss\fcharset0\fprq2 Britannic Bold;}{\f62\fdecor\fcharset0\fprq2 Braggadocio;}{\f63\fscript\fcharset0\fprq2 Matura MT Script Capitals;}{\f64\fdecor\fcharset0\fprq2 Kino MT;}
+{\f65\fswiss\fcharset0\fprq2 Arial Black;}{\f66\fscript\fcharset0\fprq2 Comic Sans MS;}{\f67\fswiss\fcharset0\fprq2 Impact;}{\f68\fswiss\fcharset0\fprq2 Verdana;}{\f69\froman\fcharset2\fprq2 Webdings;}{\f70\fmodern\fcharset128\fprq1 MS Gothic;}
+{\f71\froman\fcharset255\fprq2 Roman;}{\f72\fscript\fcharset255\fprq2 Script;}{\f73\fmodern\fcharset255\fprq2 Modern;}{\f74\fswiss\fcharset0\fprq1 MS Dialog;}{\f75\fswiss\fcharset0\fprq2 Tahoma;}{\f76\froman\fcharset0\fprq2 Georgia;}
+{\f77\fmodern\fcharset0\fprq1 Andale Mono;}{\f78\fscript\fcharset0\fprq2 Monotype Corsiva;}{\f79\froman\fcharset0\fprq2 CG Times (W1){\*\falt Times New Roman};}{\f80\froman\fcharset0\fprq0 Bookman{\*\falt Bookman Old Style};}
+{\f81\fnil\fcharset0\fprq2 Prestige;}{\f82\fswiss\fcharset2\fprq2 Sign Language;}{\f83\fswiss\fcharset2\fprq2 Animals;}{\f84\fswiss\fcharset2\fprq2 Charting;}{\f85\fswiss\fcharset2\fprq2 Clocks;}{\f86\fswiss\fcharset2\fprq2 CommonBullets;}
+{\f87\fswiss\fcharset2\fprq2 HomePlanning;}{\f88\fswiss\fcharset2\fprq2 Kidnap;}{\f89\fswiss\fcharset2\fprq2 LandscapePlanning;}{\f90\fswiss\fcharset2\fprq2 HomePlanning2;}{\f91\fswiss\fcharset2\fprq2 MorseCode;}{\f92\fswiss\fcharset2\fprq2 Music;}
+{\f93\fswiss\fcharset2\fprq2 OfficePlanning;}{\f94\fswiss\fcharset2\fprq2 Semaphore;}{\f95\fswiss\fcharset2\fprq2 Signs;}{\f96\froman\fcharset2\fprq2 ZapfDingbats BT;}{\f97\froman\fcharset2\fprq2 SymbolProp BT;}{\f98\fswiss\fcharset0\fprq2 Futura Md BT;}
+{\f99\fswiss\fcharset0\fprq2 CopprplGoth BT;}{\f100\fscript\fcharset0\fprq2 ShelleyAllegro BT;}{\f101\fswiss\fcharset0\fprq2 Bedrock;}{\f102\fswiss\fcharset0\fprq2 Humanst521 BT;}{\f103\fscript\fcharset0\fprq2 Nuptial BT;}
+{\f104\fswiss\fcharset0\fprq2 Harpoon;}{\f105\fdecor\fcharset0\fprq2 Shotgun BT;}{\f106\fswiss\fcharset0\fprq2 Futura Bk BT;}{\f107\fswiss\fcharset0\fprq2 Amerigo BT;}{\f108\fswiss\fcharset0\fprq2 BankGothic Md BT;}
+{\f109\fdecor\fcharset0\fprq2 BernhardFashion BT;}{\f110\froman\fcharset0\fprq2 ChelthmITC Bk BT;}{\f111\fswiss\fcharset0\fprq2 CopprplGoth Hv BT;}{\f112\fswiss\fcharset0\fprq2 Futura XBlk BT;}{\f113\froman\fcharset0\fprq2 Galliard BT;}
+{\f114\froman\fcharset0\fprq2 GeoSlab703 Md BT;}{\f115\froman\fcharset0\fprq2 GeoSlab703 XBd BT;}{\f116\froman\fcharset0\fprq2 GeoSlab703 MdCn BT;}{\f117\fswiss\fcharset0\fprq2 Geometr231 Lt BT;}{\f118\fswiss\fcharset0\fprq2 Geometr231 BT;}
+{\f119\fswiss\fcharset0\fprq2 Geometr231 Hv BT;}{\f120\froman\fcharset0\fprq2 Souvenir Lt BT;}{\f121\fswiss\fcharset0\fprq2 ZapfHumnst BT;}{\f122\fswiss\fcharset0\fprq2 Dauphin;}{\f123\fswiss\fcharset2\fprq2 Czar;}
+{\f124\fscript\fcharset0\fprq2 Lydian Csv BT;}{\f125\fswiss\fcharset0\fprq2 AvantGarde Bk BT;}{\f126\fswiss\fcharset0\fprq2 AvantGarde Md BT;}{\f127\fnil\fcharset2\fprq2 Linedraw;}{\f128\fmodern\fcharset0\fprq1 Dixonms8;}
+{\f129\fmodern\fcharset2\fprq1 HPPCCOB;}{\f130\fmodern\fcharset2\fprq1 HPPCCOBB;}{\f131\fmodern\fcharset2\fprq1 HPPCCOBI;}{\f132\fmodern\fcharset2\fprq1 HPPCCOB2;}{\f133\fnil\fcharset2\fprq2 HPPCDIX;}{\f134\fnil\fcharset2\fprq2 HPPCDIXB;}
+{\f135\fnil\fcharset2\fprq2 HPPCDIXI;}{\f136\fnil\fcharset2\fprq2 HPPCDIX2;}{\f137\fnil\fcharset2\fprq2 HPPCDIX HO;}{\f138\fnil\fcharset2\fprq2 HPPCMAR;}{\f139\fnil\fcharset2\fprq2 HPPCMARB;}
+{\f140\fnil\fcharset2\fprq2 HPPCMARI{\*\falt Bookman Old Style};}{\f141\fnil\fcharset2\fprq2 HPPCMAR2;}{\f142\fnil\fcharset2\fprq2 Dixon-Tax;}{\f143\fnil\fcharset2\fprq2 Dixon-Tax10;}{\f144\fnil\fcharset2\fprq2 Dixon-Tax-BO;}
+{\f145\fnil\fcharset2\fprq2 Dixon-Tax-HO Ho;}{\f146\fmodern\fcharset255\fprq1 Terminal;}{\f147\fmodern\fcharset0\fprq1 Fixedsys;}{\f148\fswiss\fcharset0\fprq2 Small Fonts;}{\f149\fswiss\fcharset0\fprq2 MS Dialog Light;}
+{\f150\fswiss\fcharset0\fprq2 MS SystemEx;}{\f151\fswiss\fcharset0\fprq2 PalmSprings;}{\f152\fnil\fcharset0\fprq2 Microsoft Logo;}{\f153\fswiss\fcharset0\fprq2 Helvetica-Narrow;}{\f154\fswiss\fcharset0\fprq2 Univers (W1){\*\falt Arial};}
+{\f155\fswiss\fcharset0\fprq0  ;}{\f156\fnil\fcharset0\fprq0 B Helvetica Bold;}{\f157\fmodern\fcharset0\fprq1 Lucida Sans Typewriter;}{\f158\froman\fcharset0\fprq2 CG Times Bold;}{\f159\froman\fcharset0\fprq2 CG Times Italic;}
+{\f160\froman\fcharset0\fprq0 (normal text);}{\f161\froman\fcharset0\fprq0 f;}{\f162\froman\fcharset0\fprq2 MicrosoftLogo95;}{\f163\fnil\fcharset2\fprq2 MSIcons;}{\f164\fnil\fcharset0\fprq0 Swis721 BT;}{\f165\fmodern\fcharset0\fprq1 Roman 10cpi;}
+{\f166\fnil\fcharset0\fprq0 TmsRmn;}{\f167\froman\fcharset0\fprq2 Palatino{\*\falt Book Antiqua};}{\f168\froman\fcharset0\fprq2 Garamond Antiqua;}{\f169\fnil\fcharset0\fprq0 Courier (W1);}{\f170\fnil\fcharset0\fprq2 McGrawHill;}
+{\f171\fnil\fcharset2\fprq2 MS Reference 1;}{\f172\fnil\fcharset2\fprq2 MS Reference 2;}{\f173\fswiss\fcharset0\fprq2 Albertus (W1);}{\f174\fswiss\fcharset0\fprq2 Albertus Xb (W1);}{\f175\fswiss\fcharset0\fprq2 Antique Olv (W1);}
+{\f176\fscript\fcharset0\fprq2 Coronet (W1);}{\f177\fmodern\fcharset0\fprq1 Letter Gothic (W1);}{\f178\fswiss\fcharset0\fprq2 Univers Cd (W1);}{\f179\fswiss\fcharset0\fprq2 CG Omega (W1);}{\f180\froman\fcharset0\fprq2 Clarendon Cd (W1);}
+{\f181\froman\fcharset0\fprq2 Garmond (W1);}{\f182\fscript\fcharset0\fprq2 Marigold (W1);}{\f183\fswiss\fcharset0\fprq2 Ottawa;}{\f184\fswiss\fcharset2\fprq2 Wingdings (L$);}{\f185\fswiss\fcharset0\fprq2 Arial (W1);}
+{\f186\froman\fcharset2\fprq2 Symbol (AS);}{\f187\froman\fcharset0\fprq2 Times New (W1);}{\f188\froman\fcharset0\fprq0 co;}{\f189\fnil\fcharset2\fprq2 GraecaII;}{\f190\fnil\fcharset2\fprq2 HebraicaII;}{\f191\fnil\fcharset2\fprq2 LRS System 1;}
+{\f192\fnil\fcharset0\fprq2 LRS System 2;}{\f193\fnil\fcharset0\fprq2 LRS System 3;}{\f194\fnil\fcharset0\fprq2 LRS System 4;}{\f195\fnil\fcharset2\fprq2 SemiticaDict;}{\f196\fnil\fcharset2\fprq2 SILDoulosIPA;}
+{\f197\fnil\fcharset2\fprq2 SILManuscriptIPA;}{\f198\fnil\fcharset2\fprq2 SILSophiaIPA;}{\f199\fnil\fcharset2\fprq2 TransRomanAH;}{\f200\fnil\fcharset2\fprq2 TransRomanDict;}{\f201\fswiss\fcharset0\fprq2 Albertus Medium (PCL6);}
+{\f202\fswiss\fcharset0\fprq2 Albertus Extra Bold (PCL6);}{\f203\fswiss\fcharset0\fprq2 Arial (PCL6);}{\f204\fswiss\fcharset0\fprq2 ITC Avant Garde Gothic (PCL6);}{\f205\fswiss\fcharset0\fprq2 ITC Avant Garde Gothic Demi (PC;}
+{\f206\froman\fcharset0\fprq2 ITC Bookman Light (PCL6);}{\f207\froman\fcharset0\fprq2 ITC Bookman Demi (PCL6);}{\f208\fswiss\fcharset0\fprq2 CG Omega (PCL6);}{\f209\froman\fcharset0\fprq2 CG Times (PCL6);}
+{\f210\froman\fcharset0\fprq2 Clarendon Condensed (PCL6);}{\f211\fmodern\fcharset0\fprq1 Courier (PCL6);}{\f212\fmodern\fcharset0\fprq1 CourierPS (PCL6);}{\f213\fmodern\fcharset0\fprq1 Dark Courier (PCL6);}{\f214\froman\fcharset0\fprq2 Garamond (PCL6);}
+{\f215\fswiss\fcharset0\fprq2 Helvetica (PCL6);}{\f216\fswiss\fcharset0\fprq2 Helvetica Narrow (PCL6);}{\f217\fmodern\fcharset0\fprq1 Letter Gothic (PCL6);}{\f218\froman\fcharset0\fprq2 New Century Schoolbook (PCL6);}
+{\f219\fswiss\fcharset0\fprq2 Antique Olive (PCL6);}{\f220\froman\fcharset0\fprq2 Palatino (PCL6);}{\f221\froman\fcharset0\fprq2 Times (PCL6);}{\f222\froman\fcharset0\fprq2 Times New Roman (PCL6);}{\f223\fswiss\fcharset0\fprq2 Univers (PCL6);}
+{\f224\fswiss\fcharset0\fprq2 Univers Condensed (PCL6);}{\f225\fscript\fcharset0\fprq2 Coronet (PCL6);}{\f226\fscript\fcharset0\fprq2 Marigold (PCL6);}{\f227\froman\fcharset2\fprq2 Symbol (PCL6);}{\f228\froman\fcharset2\fprq2 SymbolPS (PCL6);}
+{\f229\fdecor\fcharset2\fprq2 Wingdings (PCL6);}{\f230\fscript\fcharset0\fprq2 ITC Zapf Chancery (PCL6);}{\f231\froman\fcharset0\fprq2 Onyx;}{\f232\froman\fcharset0\fprq2 Rockwell Light;}{\f233\fmodern\fcharset0\fprq0 elite;}
+{\f234\fswiss\fcharset0\fprq0 lettergothic;}{\f235\fmodern\fcharset0\fprq0 gothicPS;}{\f236\fmodern\fcharset0\fprq0 AvantGarde;}{\f237\fmodern\fcharset0\fprq0 metro;}{\f238\fmodern\fcharset0\fprq0 presentation;}{\f239\fmodern\fcharset0\fprq0 APL;}
+{\f240\fmodern\fcharset0\fprq0 OCRA;}{\f241\fmodern\fcharset0\fprq0 OCRB;}{\f242\froman\fcharset0\fprq0 emperorPS;}{\f243\froman\fcharset0\fprq0 madaleine;}{\f244\froman\fcharset0\fprq0 zapf humanist;}{\f245\froman\fcharset0\fprq0 classic;}
+{\f246\froman\fcharset0\fprq0 roman f;}{\f247\froman\fcharset0\fprq0 roman g;}{\f248\froman\fcharset0\fprq0 roman h;}{\f249\froman\fcharset0\fprq0 NewCenturySchlbk;}{\f250\froman\fcharset0\fprq0 souvenir;}{\f251\froman\fcharset0\fprq0 caledonia;}
+{\f252\froman\fcharset0\fprq0 bodini;}{\f253\froman\fcharset0\fprq0 university;}{\f254\fscript\fcharset0\fprq0 scriptPS;}{\f255\fscript\fcharset0\fprq0 script c;}{\f256\fscript\fcharset0\fprq0 script d;}{\f257\fscript\fcharset0\fprq0 commercial script;}
+{\f258\fscript\fcharset0\fprq0 park avenue;}{\f259\fscript\fcharset0\fprq0 script h;}{\f260\fscript\fcharset0\fprq0 greek;}{\f261\froman\fcharset0\fprq0 kana;}{\f262\froman\fcharset0\fprq0 hebrew;}{\f263\froman\fcharset0\fprq0 roman s;}
+{\f264\froman\fcharset0\fprq0 russian;}{\f265\froman\fcharset0\fprq0 roman u;}{\f266\froman\fcharset0\fprq0 roman v;}{\f267\froman\fcharset0\fprq0 roman w;}{\f268\fdecor\fcharset0\fprq0 narrator;}{\f269\fdecor\fcharset0\fprq0 emphasis;}
+{\f270\fdecor\fcharset0\fprq0 ZapfChancery;}{\f271\fdecor\fcharset0\fprq0 decor d;}{\f272\fdecor\fcharset0\fprq0 old english;}{\f273\fdecor\fcharset0\fprq0 decor f;}{\f274\fdecor\fcharset0\fprq0 decor g;}{\f275\fdecor\fcharset0\fprq0 cooper black;}
+{\f276\fnil\fcharset0\fprq0 math7;}{\f277\fnil\fcharset0\fprq0 math8;}{\f278\fdecor\fcharset0\fprq0 ZapfDingbats;}{\f279\fnil\fcharset0\fprq0 EAN;}{\f280\fnil\fcharset0\fprq0 pcline;}{\f281\fnil\fcharset0\fprq0 tech h;}{\f282\froman\fcharset0\fprq0 (;}
+{\f283\fnil\fcharset2\fprq2 MS Outlook;}{\f284\fswiss\fcharset2\fprq2 Bookshelf Symbol 1;}{\f285\fnil\fcharset2\fprq2 Bookshelf Symbol 2;}{\f286\froman\fcharset2\fprq2 Bookshelf Symbol 3;}{\f287\froman\fcharset2\fprq2 Wingdings 2;}
+{\f288\froman\fcharset2\fprq2 Wingdings 3;}{\f289\fswiss\fcharset0\fprq2 Abadi MT Condensed;}{\f290\froman\fcharset0\fprq2 Tiffany Hv BT;}{\f291\fmodern\fcharset134\fprq1 MS Song;}{\f292\froman\fcharset0\fprq2 Surin;}
+{\f293\froman\fcharset0\fprq2 Angsana New;}{\f294\fdecor\fcharset0\fprq2 DAVIC Logo_1;}{\f295\fswiss\fcharset0\fprq2 DAVIC Logo_2;}{\f296\fnil\fcharset0\fprq2 augie;}{\f297\fswiss\fcharset0\fprq2 Trebuchet MS;}
+{\f298\fswiss\fcharset0\fprq2 News Gothic MT;}{\f299\fnil\fcharset0\fprq2 Fraktur Plain;}{\f300\fnil\fcharset0\fprq2 Borzoi;}{\f301\fnil\fcharset0\fprq2 Borzoi Bold;}{\f302\fnil\fcharset0\fprq2 Borzoi Italic;}{\f303\fnil\fcharset0\fprq2 B Surfers;}
+{\f304\fswiss\fcharset0\fprq2 CAITLYN;}{\f305\fswiss\fcharset0\fprq2 Sage MT;}{\f306\froman\fcharset0\fprq2 Tarragon MT;}{\f307\froman\fcharset0\fprq2 GeoSlab703 Lt BT;}{\f308\froman\fcharset0\fprq2 NewTimes;}{\f309\fswiss\fcharset0\fprq2 SwissA;}
+{\f310\froman\fcharset0\fprq2 Dutch801 Rm BT;}{\f311\fnil\fcharset134\fprq2 SwissM;}{\f312\fmodern\fcharset0\fprq1 NewCourier;}{\f313\fmodern\fcharset0\fprq1 Monotype.com;}{\f314\fswiss\fcharset0\fprq2 MetaPlusBold-Roman;}
+{\f315\fswiss\fcharset0\fprq2 MetaPlusNormal-Roman;}{\f316\fswiss\fcharset0\fprq2 MetaPlusNormal-Italic;}{\f317\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f318\fswiss\fcharset186\fprq2 Arial Baltic{\*\falt  arial};}
+{\f319\fmodern\fcharset186\fprq1 Courier New Baltic;}{\f320\fswiss\fcharset238\fprq2 Tahoma CE;}{\f321\fswiss\fcharset204\fprq2 Tahoma Cyr;}{\f322\fswiss\fcharset161\fprq2 Tahoma Greek;}{\f323\fswiss\fcharset162\fprq2 Tahoma Tur;}
+{\f324\fswiss\fcharset186\fprq2 Tahoma Baltic;}{\f325\fmodern\fcharset238\fprq1 Lucida Console CE;}{\f326\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f327\fmodern\fcharset161\fprq1 Lucida Console Greek;}
+{\f328\fmodern\fcharset162\fprq1 Lucida Console Tur;}{\f329\froman\fcharset0\fprq2 Minion Web;}{\f330\froman\fcharset162\fprq0 Times New Roman Turkish;}{\f331\fswiss\fcharset162\fprq0 Arial Turkish;}{\f332\fmodern\fcharset162\fprq0 Courier New Turkish;}
+{\f333\froman\fcharset0\fprq2 LeedsBit EuroEast;}{\f334\froman\fcharset0\fprq2 LeedsBit EuroNorth;}{\f335\froman\fcharset0\fprq2 LeedsBit EuroSouth;}{\f336\fswiss\fcharset0\fprq2 LeedsBit EuroWest;}{\f337\froman\fcharset0\fprq2 LeedsBit ExtraChars1;}
+{\f338\fnil\fcharset0\fprq2 Cupola;}{\f339\froman\fcharset0\fprq2 Bookman SudEuro;}{\f340\fmodern\fcharset0\fprq1 Courier SudEuro;}{\f341\froman\fcharset0\fprq2 Garamond SudEuro;}{\f342\froman\fcharset0\fprq2 Times SudEuro;}
+{\f343\froman\fcharset0\fprq0 +            212  |;}{\f344\fswiss\fcharset0\fprq2 PegasusDialog;}{\f345\froman\fcharset238\fprq2 TIMES CE;}{\f346\froman\fcharset204\fprq2 TIMES Cyr;}{\f347\froman\fcharset161\fprq2 TIMES Greek;}
+{\f348\froman\fcharset162\fprq2 TIMES Tur;}{\f349\froman\fcharset186\fprq2 TIMES Baltic;}{\f350\fswiss\fcharset238\fprq2 HELVETICA CE;}{\f351\fswiss\fcharset204\fprq2 HELVETICA Cyr;}{\f352\fswiss\fcharset161\fprq2 HELVETICA Greek;}
+{\f353\fswiss\fcharset162\fprq2 HELVETICA Tur;}{\f354\fswiss\fcharset186\fprq2 HELVETICA Baltic;}{\f355\fswiss\fcharset238\fprq2 Lucida Sans Unicode CE;}{\f356\fswiss\fcharset204\fprq2 Lucida Sans Unicode Cyr;}
+{\f357\fswiss\fcharset161\fprq2 Lucida Sans Unicode Greek;}{\f358\fswiss\fcharset162\fprq2 Lucida Sans Unicode Tur;}{\f359\fswiss\fcharset238\fprq2 Verdana CE;}{\f360\fswiss\fcharset204\fprq2 Verdana Cyr;}{\f361\fswiss\fcharset161\fprq2 Verdana Greek;}
+{\f362\fswiss\fcharset162\fprq2 Verdana Tur;}{\f363\fswiss\fcharset186\fprq2 Verdana Baltic;}{\f364\froman\fcharset238\fprq2 Garamond CE;}{\f365\froman\fcharset204\fprq2 Garamond Cyr;}{\f366\froman\fcharset161\fprq2 Garamond Greek;}
+{\f367\froman\fcharset162\fprq2 Garamond Tur;}{\f368\froman\fcharset186\fprq2 Garamond Baltic;}{\f369\fswiss\fcharset238\fprq2 Arial Narrow CE{\*\falt Helvetica-Narrow};}{\f370\fswiss\fcharset204\fprq2 Arial Narrow Cyr{\*\falt Helvetica-Narrow};}
+{\f371\fswiss\fcharset161\fprq2 Arial Narrow Greek{\*\falt Helvetica-Narrow};}{\f372\fswiss\fcharset162\fprq2 Arial Narrow Tur{\*\falt Helvetica-Narrow};}{\f373\fswiss\fcharset186\fprq2 Arial Narrow Baltic{\*\falt Helvetica-Narrow};}
+{\f374\fswiss\fcharset238\fprq2 Arial Black CE;}{\f375\fswiss\fcharset204\fprq2 Arial Black Cyr;}{\f376\fswiss\fcharset161\fprq2 Arial Black Greek;}{\f377\fswiss\fcharset162\fprq2 Arial Black Tur;}{\f378\fswiss\fcharset186\fprq2 Arial Black Baltic;}
+{\f379\froman\fcharset238\fprq2 Bookman Old Style CE;}{\f380\froman\fcharset204\fprq2 Bookman Old Style Cyr;}{\f381\froman\fcharset161\fprq2 Bookman Old Style Greek;}{\f382\froman\fcharset162\fprq2 Bookman Old Style Tur;}
+{\f383\froman\fcharset186\fprq2 Bookman Old Style Baltic;}{\f384\fswiss\fcharset238\fprq2 Impact CE;}{\f385\fswiss\fcharset204\fprq2 Impact Cyr;}{\f386\fswiss\fcharset161\fprq2 Impact Greek;}{\f387\fswiss\fcharset162\fprq2 Impact Tur;}
+{\f388\fswiss\fcharset186\fprq2 Impact Baltic;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;
+\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\widctlpar \f4\fs20\lang2057 \snext0 Normal;}{
+\s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 \sbasedon0\snext0 heading 1;}{\s2\sb120\keepn\widctlpar\brdrt\brdrth\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34\lang2057 \sbasedon0\snext0 heading 2;}{\s3\sb120\keepn\widctlpar\brdrt
+\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 \sbasedon0\snext0 heading 3;}{\s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 \sbasedon0\snext0 heading 4;}{\s5\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext0 
+heading 5;}{\s6\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 heading 6;}{\s7\sb240\sa60\widctlpar \f5\fs20\lang2057 \sbasedon0\snext0 heading 7;}{\s8\sb240\sa60\widctlpar \i\f5\fs20\lang2057 \sbasedon0\snext0 heading 8;}{
+\s9\sb240\sa60\widctlpar \i\f5\fs18\lang2057 \sbasedon0\snext0 heading 9;}{\*\cs10 \additive Default Paragraph Font;}{\s15\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext15 
+Code Paragraph;}{\*\cs16 \additive\f37\lang2057 \sbasedon10 Code;}{\*\cs17 \additive\i \sbasedon10 Emphasis;}{\*\cs18 \additive\b \sbasedon10 Warning;}{\s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 
+\sbasedon0\snext19 Indented Code;}{\s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl11\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon21\snext20 List Bullet;}{\s21\fi-284\li851\ri567\widctlpar \f4\fs20\lang2057 
+\sbasedon0\snext21 List;}{\s22\li567\ri567\widctlpar \f4\fs20\lang2057 \sbasedon0\snext22 List Continue;}{\s23\fi-284\li568\ri567\widctlpar{\*\pn \pnlvl10\pndec\ulth\pnstart1\pnindent283\pnhang{\pntxta .}}\f4\fs20\lang2057 \sbasedon21\snext23 
+List Number;}{\s24\qc\widctlpar \f4\fs20\lang2057 \sbasedon0\snext24 Picture;}{\s25\qc\sb240\sa240\widctlpar \b\f5\fs72\lang2057 \sbasedon0\snext25 Title;}{\s26\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0 \f4\fs20\lang2057 
+\sbasedon0\snext26 Logo;}{\s27\sb1440\sa1200\sl-460\slmult0\widctlpar \b\scaps\f5\fs40\lang2057 \sbasedon0\snext27 Subtitle;}{\s28\sl-200\slmult0\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext28 Version;}{\s29\widctlpar \f4\fs20\lang2057 
+\sbasedon0\snext29 Date Published;}{\s30\widctlpar \b\f4\fs20\lang2057 \sbasedon0\snext30 Copyright Header;}{\s31\widctlpar \f4\fs20\lang2057 \sbasedon0\snext31 Copyright Notice;}{\s32\sa1440\sl-960\slmult0\keepn\widctlpar \b\scaps\f5\fs40\lang2057 
+\sbasedon0\snext32 TOC Header;}{\s33\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f4\fs20\lang2057 \sbasedon0\snext0 toc 1;}{\s34\li221\sb120\keepn\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 2;}{
+\s35\li442\widctlpar\tqr\tx9072 \f5\fs20\lang2057 \sbasedon0\snext0 toc 3;}{\s36\li658\widctlpar\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext0 toc 4;}{\*\cs37 \additive\f5\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\widctlpar\brdrr\brdrdb\brdrw15\brsp20 
+\f37\fs20\lang2057 \sbasedon0\snext38 Constant Definition;}{\s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon0\snext39 header;}{\s40\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext40 
+Even Footer Paragraph;}{\s41\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18\lang2057 \sbasedon0\snext41 Even Header Paragraph;}{\s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 \sbasedon39\snext42 footer;}{\*\cs43 
+\additive\b \sbasedon10 page number;}{\s44\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs20\lang2057 \sbasedon0\snext44 Odd Footer Paragraph;}{\s45\widctlpar\tqc\tx4536\tqr\tx9072 \caps\f4\fs18\lang2057 \sbasedon0\snext45 
+Odd Header Paragraph;}{\s46\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\lang2057 \sbasedon0\snext46 Status;}{\*\cs47 \additive\i \sbasedon10 Glossary Reference;}{\s48\widctlpar \f4\fs20\lang2057 \sbasedon0\snext48 Compact;}{\*\cs49 \additive\f5 
+\sbasedon10 App Text;}{\s50\sb240\sa240\keepn\widctlpar \b\f5\fs40\lang2057\kerning28 \sbasedon1\snext50 Heading 1 NoSection;}{\*\cs51 \additive\f5 \sbasedon10 Filename;}{\s52\fi-284\li1135\ri1134\widctlpar{\*\pn \pnlvl11\pnf1\pnstart1\pnindent283\pnhang
+{\pntxtb \'b7}}\f4\fs20\lang2057 \sbasedon0\snext52 List Bullet 2;}{\*\cs53 \additive\b \sbasedon10 Glossary Definition;}{\*\cs54 \additive\i \sbasedon10 Document Name;}{
+\s55\keep\keepn\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs20\lang2057 \sbasedon0\snext0 Prototype;}{\*\cs56 \additive\scaps \sbasedon10 Key Name;}{
+\s57\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670 \f37\fs16\lang2057 \sbasedon0\snext57 Reduced Code;}{\s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 
+\sbasedon0\snext0 Syntax;}{\s59\qc\sb240\sa240\keepn\widctlpar \b\f5\fs20\lang2057 \sbasedon0\snext59 Picture Title;}{\s60\fi-3119\li3119\widctlpar\tx3119 \f4\fs20\lang2057 \sbasedon0\snext60 Member List;}{\*\cs61 \additive\i \sbasedon10 Syntax Element;}
+{\*\cs62 \additive\b\f37 \sbasedon10 Syntax Literal;}{\s63\widctlpar \f4\fs20\lang2057 \sbasedon0\snext63 annotation text;}{\*\cs64 \additive\b\f5\uld\cf11 \sbasedon10 Example Link;}{\s65\widctlpar \b\f5\fs36\lang2057 \sbasedon0\snext65 TOC 0;}{\*\cs66 
+\additive\f37\cf2\lang2057 \sbasedon16 Resource Code;}{\s67\widctlpar \f5\fs20\cf6\lang2057 \sbasedon0\snext67 Converter Directive;}{\s68\widctlpar \b\f37\fs20\uldb\lang2057 \sbasedon0\snext0 Platform Dependency;}{\*\cs69 \additive\b\cf10 \sbasedon10 
+Raw HTML;}{\*\cs70 \additive\i\cf14 \sbasedon10 URL Reference;}{\s71\widctlpar \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext0 Hypertext Anchor;}{\s72\widctlpar\brdrr\brdrs\brdrw45\brsp20 \f4\fs20\lang2057 \sbasedon0\snext72 Member Definition;}{
+\s73\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 \sbasedon0\snext73 Figure Picture;}{\s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 \sbasedon46\snext74 Comment;}{
+\s75\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \b\f4\fs20\lang2057 \sbasedon0\snext75 Figure Caption;}{\s76\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 
+\sbasedon0\snext76 Figure Description;}{\s77\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\cf6\lang2057 \sbasedon73\snext77 Figure Status;}{\s78\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb
+\brdrs\brdrw15\brsp20 \f5\fs20\ul\cf13\lang2057 \sbasedon0\snext78 Figure Anchor;}{\*\cs79 \additive\f5\uld\cf12 \sbasedon37 Figure Link;}{\s80\li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \i\f4\fs20\cf10\lang2057 
+\sbasedon73\snext80 Figure Directive;}{\s81\widctlpar \f4\fs20\lang2057 \sbasedon0\snext81 Body Text;}{\*\cs82 \additive\f5\uld\cf9 \sbasedon37 Hypertext Link Text;}{\*\cs83 \additive\caps\f3\fs24\uld\cf2 \sbasedon10 Feature List;}{\*\cs84 \additive
+\caps\f3\fs24\uld\cf2 \sbasedon10 Feature Level;}}{\info{\title Tools}{\subject Specifying projects with makmake}{\author Preferred Customer}{\operator Preferred Customer}{\creatim\yr1996\mo3\dy6\hr13\min48}{\revtim\yr2000\mo3\dy15\hr11\min26}
+{\printim\yr1999\mo9\dy2\hr16\min51}{\version2}{\edmins3}{\nofpages11}{\nofwords5150}{\nofchars29356}{\*\company Symbian Ltd}{\vern57395}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 
+\widowctrl\ftnbj\aenddoc\linkstyles\hyphcaps0\formshade \fet0\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere {\header \pard\plain \s39\widctlpar\tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  TITLE  \\
+* MERGEFORMAT }{\fldrslt Tools}}\tab Company Confidential\tab EON SDK, Copyright \'a9 1996, Symbian Ltd
+\par }{\footer \pard\plain \s42\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072 \f4\fs18\lang2057 {\field{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt Specifying projects with makmake}}\tab Page {\field{\*\fldinst  PAGE  \\* MERGEFORMAT 
+}{\fldrslt {\lang1024 4}}}\tab Last saved {\field{\*\fldinst  SAVEDATE  \\* MERGEFORMAT }{\fldrslt {\lang1024 25/02/00 12:37}}}
+\par }{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta .}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta )}}{\*\pnseclvl5
+\pndec\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}{\*\pnseclvl8\pnlcltr\pnstart1\pnindent720\pnhang
+{\pntxtb (}{\pntxta )}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb (}{\pntxta )}}\pard\plain \s1\sb360\sa240\keepn\pagebb\widctlpar \b\f5\fs40\lang2057\kerning28 {\field\flddirty{\*\fldinst  SUBJECT  \\* MERGEFORMAT }{\fldrslt 
+Specifying projects with makmake}}
+\par \pard\plain \s71\widctlpar \f5\fs20\ul\cf13\lang2057 tools.makmake
+\par \pard\plain \s67\widctlpar \f5\fs20\cf6\lang2057 doclevel v6
+\par \pard\plain \s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 this chapter documents {\cs51\f5 makmake} to e32toolp release 210 level.
+\par \pard\plain \s2\sb120\keepn\widctlpar\brdrt\brdrth\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34\lang2057 Overview
+\par \pard\plain \widctlpar \f4\fs20\lang2057 EPOC projects are defined by an {\cs51\f5 .mmp} file which specifies the essential components of the project. The {\cs51\f5 makmake}
+ tool is used to build makefiles for use in various environments. These makefiles are then used for project development. Some makefiles are built for use in building the project from the command-line, while others are for use with the MSVC++ IDE. For inst
+ance, starting with {\cs51\f5 euhello.mmp}, you can do:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 makmake euhello wins
+\par \pard\plain \widctlpar \f4\fs20\lang2057 to build the makefile file {\cs51\f5 euhello.wins}.
+\par You can now run:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.wins
+\par \pard\plain \widctlpar \f4\fs20\lang2057 to build the project from the command line.
+\par To build the {\cs51\f5 .dsp} and {\cs51\f5 .dsw} files, designed for the Microsoft Developer Studio (Visual C++ 6.0), you can do:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 makmake euhello vc6
+\par \pard\plain \widctlpar \f4\fs20\lang2057 For the ARM environment, you can do:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 makmake euhello armi\line nmake -f euhello.armi
+\par \pard\plain \widctlpar \f4\fs20\lang2057 to build the project from the command line (there is no IDE for ARM).
+\par A command line makefile produced by {\cs51\f5 makmake} allows the executable (an {\cs51\f5 .exe} or any type of DLL) to be produced in one of two variants:
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 {\cs51\f5 udeb} - wide (UNICODE), debug mode
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}{\cs51\f5 urel} - wide (UNICODE), release mode
+\par \pard\plain \widctlpar \f4\fs20\lang2057 which may be selected by specifying the variant as a target. For instance, to build the {\cs51\f5 udeb} variant of the executable, you can do:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.armi udeb
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The default for ARM is wide, release mode; the default for WINS and WINC is wide, debug mode. These default targets will be built if {\cs51\f5 nmake} is invoked with no target is specified.
+\par If you build the executable using the MSVC++ IDE makefile, you may also need to run tools such as the bitmap and application information compilers, to build other aspects of the project. Command line makefiles will invoke these tools for you.
+\par On the {\cs51\f5 makmake} command line, you may use path specifications to locate the {\cs51\f5 .mmp} file in any directory, eg
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 makmake ..\\..\\epoc32ex\\e32\\euhello armi
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The generated {\cs51\f5 .dsw} and {\cs51\f5 .dsp} files are, however, always written into the current directory.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Invocation syntax
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs62\b\f37 makmake} [ {\cs61\i options} ] [{\cs61\i source-path}]{\cs61\i project} {\cs61\i platform}
+\par {\cs61\i platform}{\cs61  :\line \tab }{\cs62\b\f37 wins}{\cs61  | }{\cs62\b\f37 winc}{\cs61  | }{\cs62\b\f37 armi}{\cs61  | }{\cs62\b\f37 arm4}{\cs61  | }{\cs62\b\f37 thumb}{\cs61  | }{\cs62\b\f37 vc6}{\cs61  | }{\cs62\b\f37 vc6winc}{\cs61   | }{
+\cs62\b\f37 tools}{\cs61  | }{\cs62\b\f37 vc6tools}{\cs61  
+\par 
+\par }{\cs61\i options} :\line \tab {\cs62\b\f37 -d\line }\tab {\cs62\b\f37 -v\line }\tab {\cs62\b\f37 -mmp\line \tab -plat
+\par }\pard\plain \widctlpar \f4\fs20\lang2057 
+\par where
+\par \trowd \trgaph108\trleft-108 \cellx2268\cellx9179 \pard \widctlpar\intbl {\cs61\i project}\cell is the project to be specified\cell \pard \widctlpar\intbl \row \trowd \trgaph108\trleft-108 \cellx2268\cellx9179 \pard \widctlpar\intbl {\cs61\i source-path
+\cell }specifies the path of the source {\cs51\f5 .mmp} file, relative to the current directory.
+\par If omitted, the source {\cs51\f5 .mmp} file is {\cs61\i project}{\cs51\f5 .mmp} in the current directory.
+\par Whether or not the {\cs61\i source-path} is specified, the generated makefile is always written in the current directory.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs61\i Platform}\cell is the target platform\cell \pard \widctlpar\intbl 
+\row \pard \widctlpar\intbl {\cs62\b\f37 -d\cell }indicates that the makefile is to be created in directory {\cs51\f5 \\EPOC32\\Build\\}{\cs51\i\f5 path_to_mmp_file\\mmp_basename\\}{\cs61\i platform} rather than the directory in which {\cs51\f5 makmake}
+ was invoked. Note that relative paths within the created makefile will be relative to the directory in which {\cs51\f5 makmake} was invoked so {\cs51\f5 nmake} should be invoked from that directory too if the project is to build correctly.\cell \pard 
+\widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 -v}{\cs61\i \cell }indicates verbose operation
+\par When this flag is specified, {\cs51\f5 makmake} prints many progress messages.  The default is to give error messages only.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 -mmp
+\par \cell }Provides basic syntax guide to writing {\cs51\f5 .mmp} files instead of making the makefile.\cell \pard \widctlpar\intbl \row \trowd \trgaph108\trleft-108 \cellx2268\cellx9179 \pard \widctlpar\intbl {\cs62\b\f37 -plat }{\cs61\i platform}{
+\cs62\b\f37 
+\par \cell }Provides syntax guide to writing platform-specific sections of {\cs51\f5 .mmp} files, and information about which macros are defined for preprocessing the {\cs51\f5 .mmp} files.\cell \pard \widctlpar\intbl \row \pard \widctlpar 
+\par Normally, {\cs51\f5 makmake} generates a makefile whose extension depends on the platform:
+\par {\pntext\pard\plain\cs51\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 for {\cs62\b\f37 wins}, the extension is {\cs51\f5 .wins}{\cs51 
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}}for {\cs62\b\f37 winc}, the extension is {\cs51\f5 .winc}
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}for {\cs62\b\f37 armi}, the extension is {\cs51\f5 .armi}
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}for {\cs62\b\f37 vc6} and {\cs62\b\f37 vc6winc}, the extension is {\cs51\f5 .dsp}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Generally, the makefile extension is the platform name preceded by a dot.
+\par Projects can be built for ARM platform in three flavours, ARMI, ARM4 and THUMB.  These three flavours are termed \ldblquote Application Binary Interfaces\rdblquote 
+, or ABIs for short.  ARMI is the ARM interworking ABI, ARM4 is the plain ARM ABI and THUMB is the ARM thumb ABI.  Projects built for ARMI
+ can work with projects built in any of the three ABIs, while projects built for ARM4 and THUMB can only work with projects built for the same ABI or ARMI.  Projects built for THUMB use a different mode of ARM4 processing, where the processor handles inst
+ructions of 16 bits rather than 32 bits in length from a separate instruction set.
+\par \pard\plain \s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 really all this needs to be explained in more detail somewhere else - and a link to that section introduced here.
+\par \pard\plain \s2\sb120\keepn\widctlpar\brdrt\brdrth\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs34\lang2057 Structure of project definition files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A {\cs51\f5 makmake} project definition file has extension {\cs51\f5 .mmp} and has the form
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i wholefile} :\line \tab {\cs61\i statement-list}
+\par {\cs61\i statement} :\line |\tab {\cs61\i aif-stmt}\line |\tab {\cs61\i asspabi-stmt}\line |\tab {\cs61\i asspexports-stmt}\line |\tab {\cs61\i assplibrary-stmt}\line |\tab {\cs61\i bitmap-section}\line |\tab {\cs61\i deffile-stmt}\line |\tab {\i document
+}{\cs61\i -stmt}\line |\tab {\i epocalldllentrypoints}{\cs61\i -stmt}\line |\tab {\i epocheapsize}{\cs61\i -stmt}\line |\tab {\i epocprocesspriority}{\cs61\i -stmt}\line |\tab {\i epocstacksize}{\cs61\i -stmt}\line |\tab {\i exportunfrozen}\line |\tab {
+\cs61\i lang-stmt}\line |\tab {\cs61\i library-stmt}\line |\tab {\cs61\i linkas-stmt}\line |\tab {\cs61\i macro-stmt}\line |\tab {\cs61\i nostrictdef-stmt}\line |\tab {\cs61\i resource-stmt}\line |\tab {\cs61\i source-stmt}\line |\tab {\cs61\i 
+sourcepath-stmt}\line |\tab {\cs61\i staticlibrary-stmt}\line |\tab {\cs61\i strictdepend-stmt}\line |\tab {\cs61\i systeminclude-stmt}\line |\tab {\cs61\i systemresource-stmt}\line |\tab {\cs61\i target-stmt}\line |\tab {\cs61\i target-path-stmt}\line |
+\tab {\cs61\i target-type-stmt}\line {\cs61 |}{\cs61\i \tab uid-stmt}\line |\tab {\cs61\i userinclude-stmt}\line |\tab {\cs61\i platform-specific-section}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each statement occupies a single line.
+\par {\b Note:} a trailing backslash is used to indicate a line continuation.  Therefore, specify directories without their trailing backslash, eg {\cs49\f5 systeminclude \\epoc32\\include}, rather than {\cs49\f5 systeminclude \\epoc32\\include\\}.
+\par Use the C++ style comment syntax for comments. 
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying the target
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 target} statement to specify the file generated by the project.
+\par Use the {\cs62\b\f37 targettype} statement to specify the kind of project:
+\par Use the {\cs62\b\f37 targetpath} statement to specify where the project should be released.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i target-stmt} :\line \tab {\cs62\b\f37 target} {\cs61\i filename}{\cs62\b\f37 .}{\cs61\i ext}
+\par {\cs61\i targettype-stmt} :\line \tab {\cs62\b\f37 targettype} {\cs61\i target-type}
+\par {\cs61\i target-type} :\line \tab {\cs62\b\f37 app} | {\cs62\b\f37 dll} |{\cs62\b\f37  exe} | {\cs62\b\f37 exedll }| {\cs62\b\f37 fsy }| {\cs62\b\f37 ldd }| {\cs62\b\f37 pdd }| {\cs62\b\f37 epocexe }| {\cs62\b\f37 lib }| {\cs62\b\f37 ani }| {\cs62\b\f37 
+ctl }| {\cs62\b\f37 fep }| {\cs62\b\f37 mda }| {\cs62\b\f37 mdl }| {\cs62\b\f37 opx }| {\cs62\b\f37 pdl }| {\cs62\b\f37 rdl}
+\par {\cs61\i target-path-stmt} :\line \tab {\cs62\b\f37 targetpath} {\cs61\i target-path}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 For the target, specify only the filename with its extension.  The path for the released target will be chosen depending on the platform, variant, and release path:
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 
+for non-Win32 platforms, or for Win32 platforms when no release path is specified, the target will be released to {\cs51\f5 \\epoc32\\release\\}{\cs61\i platform}{\cs51\f5 \\}{\cs61\i variant}{\cs51\f5 \\}
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}for Win32 platforms, when a target path is specified, that path will be interpreted as a location on the {\cs51\f5 z:} drive, and the release path will therefore be {\cs51\f5 \\epoc32\\release\\}{\cs61\i 
+platform}{\cs51\f5 \\}{\cs61\i variant}{\cs51\f5 \\z\\}{\cs61\i target-path}{\cs51\f5 \\}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 {\cs51\f5 makmake} supports the following target types:
+\par \trowd \trgaph108\trleft-108 \cellx993\cellx6309 \pard \widctlpar\intbl {\cs62\b\f37 exe}\cell an executable program. 
+\par For an example, see {\cs37\f5\uld\cf11 introbld.exe-example.mmp}.\cell \pard \widctlpar\intbl \row \trowd \trgaph108\trleft-108 \cellx993\cellx6309 \pard \widctlpar\intbl {\cs62\b\f37 dll}\cell a DLL\~\emdash 
+ either a shared library, or a polymorphic interface. 
+\par For an example, see {\cs37\f5\uld\cf11 introbld.dll}.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 app\cell }an EIKON application\~\emdash  linked with the {\cs16\f37 NewApplication()}
+ function exported as ordinal 1. For an example, see {\cs37\f5\uld\cf11 introbld.eikon-example}.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 exedll}\cell an executable program for a multi-process platform, a DLL\~
+for a single-process platform.  
+\par For an example, see {\cs37\f5\uld\cf11 introbld.eikon-exedll}.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 ldd}\cell a logical device driver.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 pdd}\cell 
+a physical device driver.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 Epocexe}\cell 
+an EPOC executable that can be launched from the shell.  This is an executable program which exports no functions under a multi-process platform and a DLL which is linked with the {\f37 TInt WinsMain()}
+ function exported as ordinal 1 under a single-process platform.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 lib}\cell a static library.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 ani}\cell 
+an animation DLL.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 ctl}\cell a system control.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 fep}\cell a front-end processor.\cell \pard \widctlpar\intbl \row 
+\pard \widctlpar\intbl {\cs62\b\f37 mda}\cell a media-server plug-in DLL.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 mdl}\cell a mime recognizer.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 opx}\cell 
+an OPL extension.\cell \pard \widctlpar\intbl \row \pard \widctlpar\intbl {\cs62\b\f37 pdl}\cell a printer driver.\cell \pard \widctlpar\intbl \row \trowd \trgaph108\trleft-108 \cellx993\cellx6309 \pard \widctlpar\intbl {\cs62\b\f37 rdl}\cell 
+a recognizer.\cell \pard \widctlpar\intbl \row \pard\plain \s3\fi-9072\li9072\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying UIDs
+\par \pard\plain \s71\widctlpar \f5\fs20\ul\cf13\lang2057 tools.makmake.uids
+\par \pard\plain \s21\fi-284\li851\ri567\widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 uid} statement to specify the UIDs for a project.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i uid-stmt} :\line \tab {\cs62\b\f37 uid} {\cs61\i uid2} [{\cs61\i uid3} ]
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each executable has three UIDs. The first is dictated by the target type of the project (whether a {\cs51\f5 .exe} or DLL). The second and third are optional. You specify only the second and, optio
+nally, the third UID with the {\cs61\i uid-stmt}.
+\par Under WINS, a separate source file is created with the generated makefile containing code to incorporate UIDs into the executable. The name of this file is created by taking the basename of the executable and adding the extension {\cs51\f5 .uid.cpp}
+. UIDs may be specified in either hex or decimal.
+\par The {\cs61\i uid-stmt} applies exclusively to UNICODE builds of source now that NARROW builds are no longer supported by Makmake.
+\par See also {\cs37\f5\uld\cf11 introbld.uids} in Programming EPOC\~ | \~The Build Environment.
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 Static interface DLLs
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A static interface DLL represents an interface which is defined to its clients by one or more headers for use at compile time, and an import library ({\cs51\f5 .lib}
+) for use at link time.  Then, when a client executable is loaded at run-time, the loader notes that it requires the static interface DLL to be available.  The loader either loads the DLL or, if it is loaded already, attaches the new client to it.
+\par Conventionally, the DLL is identified by name only.  In EPOC, all static interface DLLs must have a {\cs61\i uid2} of {\cs16\f37 0x1000008d}.  The particular static interface DLL is then identified by name {\i and by }{\cs61\i uid3}.  If a DLL called {
+\cs51\f5 bossview.dll} is built with {\cs61\i uid3}={\cs16\f37 0x10000252}, then the name used in the import library for non-Win32 builds of EPOC is {\cs51\f5 bossview[10000252]}.  The EPOC loader loads the {\cs51\f5 bossview.dll}
+, and checks that its UID is {\cs16\f37 0x10000252}.  If the {\cs61\i uid3} in the DLL does not match, then the load fails.
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 Polymorphic DLLs
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A polymorphic DLL represents an interface defined with a gate function and an abstract class with at least one virtual function.  The polymorphic DLL exports the gate function at ordinal 1, which ty
+pically constructs a concrete class derived from the abstract interface.  The virtual function is then called, and the functions of the class are available.  Examples of polymorphic DLLs in EPOC include device drivers, EIKON application programs, and many
+ more.
+\par Each type of interface should specify its own UID, which is used as {\cs61\i uid2} for the polymorphic DLL.  The function responsible for loading a polymorphic DLL (for example, the EIKON {\cs51\f5 apprun}
+ program, or the E32 kernel) should check that its {\cs61\i uid2} corresponds with the expected interface type.
+\par For polymorphic DLLs, the interpretation of {\cs61\i uid3} depends on the interface type.  {\cs61\i uid3} may not be required by all interfaces.  The application architecture mandates that {\cs61\i uid3} identify the particular application: the {\cs61\i 
+uid3} is used to relate an application program to its document files.
+\par Since polymorphic DLLs do not produce an import library ({\cs51\f5 .lib}), the name mangling scheme used by static interface libraries is not used by polymorphic DLLs.
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 UIDs and Win32
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The makefiles automa
+tically generate UIDs for ARM executables, as part of the executable format.  For Win32 executables, this is not directly possible.  The source for such executables must contain the UIDs, and they must match with the UIDs specified in the project file.
+
+\par Under WINS, UIDs are specified using syntax such as:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 #pragma data_seg(\ldblquote .E32_UID\rdblquote )\line __WINS_UID(0x10000079,0x1000006c,0x10000253)\line #pragma data_seg()
+\par \pard\plain \widctlpar \f4\fs20\lang2057 This is only necessary for polymorphic DLLs\~\emdash 
+ the Win32 loader does not check the UIDs of static interface DLLs. Source files containing the UID syntax are created automatically for Win32 executables when the makefile is created.
+\par \pard\plain \s3\fi-9072\li9072\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying directories
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 sourcepath} statement to define the location of the project and its workfiles.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i sourcepath-stmt} :\line \tab {\cs62\b\f37 sourcepath} {\cs61\i sourcepath}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The {\cs61\i sourcepath} should correspond to the directory containing the source files for the project specified after the {\i sourcepath} statement. If the {\cs61\i sourcepath} begins with a backslash
+ then this directory will be considered an absolute source path, otherwise the directory will be treated as relative to the directory containing the {\cs51\f5 .mmp} file. Multiple {\i sourcepath }statements may be specified, but note that {\cs51\f5 
+makmake} will expect subsequent source and resource file statements to relate to the last previous {\i sourcepath} statement, or the directory containing the {\cs51\f5 .mmp} file if no {\i sourcepath} statement has yet been specified.
+\par Temporary files will be built into directory {\cs51\f5 \\epoc32\\build\\}{\cs61\i path_to_mmp_file\\mmp_basename\\platform}{\cs51\f5 \\}{\cs61\i variant}{\cs51\f5 \\}.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying source files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 source} statement to specify source files.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i source-stmt} :\line \tab {\cs62\b\f37 source} {\cs61\i source-file-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each {\cs62\b\f37 source} statement may specify an arbitrary number of source files.  Each source file should be specified including its extension, eg {\cs51\f5 euhello.cpp}.  There may be an arbitrary number of {
+\cs62\b\f37 source} statements in the project description file relative to each subproject.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying document files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 document} statement to specify source files.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i document-stmt} :\line \tab {\cs62\b\f37 document} {\cs61\i document-file-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each {\cs62\b\f37 document} statement may specify an arbitrary number of document files.  There may be an arbitrary number of {\cs62\b\f37 document}
+ statements in the project description file relative to each subproject.  This keyword is only used in the creation of IDE makefiles, where it can be useful for specifying files so that they are available for editing within the IDE but do not play a part 
+in building the executable.
+\par The .{\f5 mmp} file is incorporated in the MSVC6 IDE by default, and the MSVC6 workspace can be regenerated using {\f5 makmake} once the .{\f5 mmp}
+ file has been changed without the need to close the workspace first. To create a custom tool to do this in the IDE, Select Tools - Customise \'85 - Tools.  In the dialog, choose an appropriate name for the tool, e.g. \ldblquote recreate workspace
+\rdblquote , and type \ldblquote nmake.exe\rdblquote  as the command and \ldblquote -nologo -f $(WkspDir)\\$(WkspName).sup.make recreateworkspace\rdblquote  as the program arguments.  Leave the \ldblquote initial directory\rdblquote 
+ field blank, and tick the \ldblquote Close window on exiting\rdblquote  checkbox.  Having edited the .MMP file for a project, select the new tool from the tools menu to recreate the workspace.  You will then be prompted to reload the new workspace.
+
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying resource files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If your project has a resource file, specify it using the {\cs62\b\f37 resource} statement.  If it is a system project rather than an application, use the {\cs62\b\f37 systemresource} statement.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i resource-stmt} :\line \tab {\cs62\b\f37 resource} {\cs61\i resource-file-list}
+\par {\cs61\i systemresource-stmt} :\line \tab {\cs62\b\f37 systemresource} {\cs61\i resource-file-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each resource file should be given with its extension, eg {\cs51\f5 golf.rss}
+\par The {\cs62\b\f37 resource} and {\cs62\b\f37 systemresource} statements have almost identical functions.  Use the {\cs62\b\f37 resource} statement for applications: the makefile will build the resource file into the target directory.  Use the {\cs62\b\f37 
+systemresource} statement for system components: the makefile will build the resource file into {\cs51\f5 \\epoc32\\release\\}{\cs61\i platform}{\cs51\f5 \\}{\cs61\i variant}{\cs51\f5 \\z\\system\\data\\}
+ for a WINS or WINC build.  If more than one language is specified with the {\i lang-stmt} then each resource will be compiled multiple times, once for each language specified.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying AIFs
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If your project has an application information file, specify it using the {\cs62\b\f37 aif} statement.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i aif-stmt} :\line \tab {\cs62\b\f37 aif} {\cs61\i target-file source-path resource }{\cs61 [ }{\cs61\i color-depth }{\cs61 ]}{
+\cs61\i  source-bitmap-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The target file to be produced by {\f5 aiftool} should be given with its extension, eg {\cs51\f5 golf.aif.}
+  The source path should contain the source resource file and any bitmaps the target file requires.  If the source path is specified as a relative path it will be considered relative to the directory containing the .{\f5 mmp} file.
+  The source resource file should be given complete with its extension.  Just a single color-depth must be specified for all the source bitmaps, and must be of the form [c]{\i digit}[{\i digit}], where the optional \ldblquote c\rdblquote 
+ denotes whether the bitmap is a color bitmap and the digits represent the color-depth.  All the source bitmaps should be listed together with their extensions.
+\par The target file will be created in the same directory as the application.
+\par Currently, building of application information files within the MSVC IDE is not supported.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying BITMAPs
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If your project has a bitmaps, specify each one using a {\b\f37 bitmap} section.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i bitmap-section} :\line \tab {\cs62\b\f37 start bitmap }{\cs61\i target-file}{\cs62\b\f37 \line }\tab {\cs62\b\f37 targetpath }{
+\cs61\i target-path}{\cs62\b\f37 \line }\tab {\cs62\b\f37 header\line }\tab {\cs62\b\f37 sourcepath }{\cs61\i source-path}{\cs62\b\f37 \line }\tab {\cs62\b\f37 source }{\cs61\i color-depth source-bitmap-list}{\cs62\b\f37 \line }\tab {\cs62\b\f37 end
+
+\par }\pard\plain \widctlpar \f4\fs20\lang2057 
+\par The target file to be produced by {\f5 bmconv} should be given with its extension, eg {\cs51\f5 golf.mbm.}  If a target path is specified, that path will be interpreted as a location on the emulated {\cs51\f5 z:}
+ drive; otherwise, the target file will be built into the same directory as the application.  If the header keyword is supplied in the section, a bitmap header will be generated in directory {\f5 \\EPOC32\\Include}, e.g. {\f5 golf.mbg}.  Multiple {\b\f37 
+sourcepath} and {\b\f37 source} statements can be specified - source bitmaps specified with each {\b\f37 source} statement will be expected to exist in the directory specified with the latest {\b\f37 sourcepath}
+ statement above it, or the directory containing the {\cs51\f5 .mmp} file if no {\b\f37 sourcepath} statement has yet been specified.  Just a single color-depth must be specified for all the source bitmaps within a single {\b\f37 source}
+ statement, and must be of the form [c]{\i digit}[{\i digit}], where the optional \ldblquote c\rdblquote  denotes whether the bitmap is a color bitmap and the digits represent the color-depth.
+\par Currently, building of bitmaps within the MSVC IDE is not supported.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying link definition files
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 deffile} statement to override the default linker definition file for the project, and the {\b\f37 exportunfrozen} statement if unfrozen exports are to appear in the project\rquote 
+s import library.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i deffile-stmt} :\line \tab {\cs62\b\f37 deffile} {\cs61\i filename\line exportunfrozen-stmt }{\cs61 :\line \tab }{\cs61\b\f37 
+exportunfrozen}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A {\cs51\f5 def}
+ file specifies associations between exported function names and their ordinal export number.  It is used by the linker when constructing a DLL and (where applicable) when constructing its associated import library.
+\par Exporting functions by ordinal means that ROMs are significantly more compact, and simplifies the EPOC loader.
+\par The assignment of ordinals must be controlled by a {\cs51\f5 def} file in two situations:
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 
+a polymorphic interface DLL must export a particular function as ordinal 1; in this case, the {\cs51\f5 def} file is used to specify this association, while other exported functions may have a random order
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}a re-released DLL must be used by clients built against the old version; in this case, the {\cs51\f5 def}
+ file is used to ensure that all functions exported by the old version of the DLL are exported with the same ordinal by the new version
+\par \pard\plain \widctlpar \f4\fs20\lang2057 For many polymorphic DLLs within EPOC a special target type is provided so that {\f5 makmake} can ensure that the correct function is exported as ordinal 1.  Where a special target type is provided the {\f5 def}
+ file can be dispensed with.
+\par  {\cs51\f5 def} files are sometimes colloquially referred to as freeze files, because they freeze the association between name and ordinal, for exported functions.
+\par The GNU and Microsoft tool chains use different schemes for mangling the names of exported functions.  This means that {\cs51\f5 def} files of the same name must be differentiated by storing them in separate directories.  Conventionally, {\cs51\f5 ..\\
+bmarm\\} is used for ARM {\cs51\f5 def} files, while {\cs51\f5 ..\\bwins\\} is used for WINS and WINC {\cs51\f5 def} files.  By default, the frozen {\f5 def} file takes its basename from the basename of the target for the project.  
+\par Where the default frozen def file is overridden by the {\b\f37 deffile} statement, a path to the file can be specified as part of the filename. If no path is specified, the file will be expected to be in:
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 directory {\cs51\f5 ..\\bwins\\} for platforms WINS, WINC, VC6 and VC6WINC
+
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}directory {\cs51\f5 ..\\bmarm\\} for the ARM platform.
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If a path is specified, place the {\cs62\b\f37 deffile} statement within {\cs16\f37 #ifdef}{\i s} so that the same file will not be used during both ARM,WINS and WINC builds. For example:
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 #if defined(WINS)\line deffile-stmt\line #else if defined(MARM)\line deffile-stmt\line #endif
+\par \pard\plain \widctlpar \f4\fs20\lang2057 (note that the platform name macros used with #if defs must be in upper-case).
+\par In most cases, the functions exported from a DLL depend on the build variant.  This is common because descriptor class names depend on whether the build is wide or narrow.  For such DLLs, different {\cs51\f5 def} files\~\emdash  differentiated by the {
+\cs51\f5 -u} suffix\~\emdash  are used.  {\cs51\f5 makmake} controls this using the {\cs62\b\f37 nostrictdef} statement.  Although narrow builds are no longer supported the {\cs51\f5 -u} suffix\~
+is still in use to maintain backward compatibility with previous versions of {\f5 makmake}.
+\par Note too that under WINS, when using an {\cs62\b\f37 exedll} target type, the first export is the one which will be called when the DLL is loaded, so you should use a {\cs51\f5 def} file for the WINS variant.
+\par {\f5 Makefiles} generated by {\f5 makmake} now create the import library associated with an executable (where applicable) directly from the frozen {\f5 def}
+ file, so only frozen exported functions will appear in the import library and only these exported functions can be linked against by other components.  For ARM platforms, import libraries for compatible ABIs are also created.  For example, if a project i
+s built for ARMI then ARMI, THUMB and ARM4 import libraries will be created; and if a project is built for THUMB, ARMI and THUMB import libraries will be created.   If the {\b\f37 exportunfrozen}
+ keyword is specified, the import library is not created from the frozen {\f5 def}
+ file; instead, the import library is created as a side-effect of linking so that all exported functions, even unfrozen ones, appear in the import library.  This also means that import libraries for compatible ABIs are not created.  Use of the {\b\f37 
+exportunfrozen} keyword is only recommended for the early stages of project development, when the Application Programming Interface is likely to be subject to change.
+\par The makefiles perform a two-stage link when building the executable:
+\par The first link ignores any {\cs51\f5 def} file; it simply links the executable using the names of exported functions.
+\par A tool is then invoked on the executable created by this first-stage link to produce a new {\cs51\f5 def} file containing the list of associations between exported function names and their ordinal export numbers. If a {\cs51\f5 def}
+ file exists for the project, the tool takes the contained list of associations and ensures that the new {\cs51\f5 def}
+ file contains the same list of associations; any new associations, representing new functions exported by the executable, appear at the end of the list. The new {\cs51\f5 def} file is created in the temporary files directory {\cs51\f5 \\epoc32\\build\\}{
+\cs61\i path_to_mmp_file\\mmp_basename}{\cs61 \\}{\cs61\i platform}{\cs51\f5 \\.}, and has the same base name as the executable with the extension {\cs51\f5 .def}. This is used to perform the second-stage of linking, by exported function number.
+\par In VC6 workspace files building is carried out in t
+he same way as for WINS makefiles, using a supplementary makefile to facilitate the two-stage link.  The supplementary makefile is created whenever the VC6 workspace file is created.  Since the supplementary makefile will not be aware of the addition or r
+emoval of a project\rquote s source files via the menus supplied within the IDE, it is better to carry out such tasks by editing the .{\f5 mmp}
+ file within the IDE and then regenerate the workspace file.  This operation can be carried out without the need to shut down a
+nd restart the IDE, and also has the advantage that the next time that command-line makefiles are created for the project they will be up to date with changes to the project made within the IDE.
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 Freezing export numbers
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the frozen {\f5 def} file to ensure the backward compatibility of new releases of a project. If required, override the frozen {\f5 def} filename using the {\b\f37 deffile}
+ statement.  To freeze exports for the first time, use makmake to build makefiles for your project for the WINS platform and an ARM platfor
+m and then build your project in either UDEB or UREL variants for each of these platforms (the three ARM platforms, ARMI, ARM4 and THUMB, share a common {\f5 def} file.  A warning will be generated to the effect that the frozen {\f5 def}
+ file does not yet exist.  Once the project has been built you can freeze it by calling the FREEZE target in the makefiles, e.g. 
+\par \pard \fi720\widctlpar {\f37 nmake -f <makefile> freeze}
+\par \pard \widctlpar If you\rquote re using the {\f5 abld} tool it\rquote s easier to use the {\f5 abld freeze} command to do the freezing, which will call the FREEZE target in the makefiles for you.  Either method will create the frozen {\f5 def}
+ file containing the project\rquote s exported functions.  Once the project is frozen, regenerate the makefiles so that the import library will be created directly from the frozen {\f5 def} file.  The project can be frozen in this way even if the {\b\f37 
+exportunfrozen} statement is specified, but the import library will be created as a side-effect of linking rather than from the frozen {\f5 def} file, and this import library will be created whether the project is frozen or not.
+\par \pard\plain \s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 Could do with a link to the {\f5 abld} documentation where {\f5 abld} is mentioned above.
+\par \pard\plain \widctlpar \f4\fs20\lang2057 New exports can be added to the frozen {\f5 def} file by calling the FREEZE target in the makefiles once the project has been built with the new exports incorporated.  The FREEZE target calls a tool, {\f5 efreeze}
+, to compare the frozen {\f5 def} file, if it exists, with the one generated by the two-stage link process in directory {\cs51\f5 \\epoc32\\build\\}{\cs61\i path_to_mmp_file}{\cs51\f5 \\}{\cs61\i mmp_basename}{\cs61 \\}{\cs61\i platform}{\cs51\f5 \\
+..  efreeze} checks that the frozen exports are all present and correct in the generated {\f5 def} file, and appends any new exports to the end of the frozen {\f5 def} file.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying strict link definition files
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i strictdef-stmt} :\line \tab {\cs62\b\f37 nostrictdef}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 It is no longer necessary to specify the {\cs62\b\f37 nostrictdef} statement since there is always just one {\f5 def}
+ file for the UDEB and UREL variants of a project for each platform.  If the nostrictdef statement is specified, the {\f5 u} suffix will not be applied to the frozen {\f5 def} file.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying include directories
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 userinclude} and {\cs62\b\f37 systeminclude} statements to define directories to be scanned for files specified in {\cs62\b\f37 #include} statements in source and resource files.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i user-include-stmt} :\line \tab {\cs62\b\f37 userinclude} {\cs61\i directory-list}
+\par {\cs61\i system-include-stmt} :\line \tab {\cs62\b\f37 systeminclude} {\cs61\i directory-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each of these statements may be specified any number of times, and each may have any number of directories.  Each directory is added, in the order specified, to the list of user or system include directories.
+
+\par When a pr
+oject is being built, the pre-processor will be invoked specifying all the system include and user include directories indicated in these statements.  No standard include directories will be searched unless the project links to Win32 libraries under WINS 
+- see {\cs37\f5\uld\cf11 tools.makmake.win32-libraries}.
+\par Files included from source code with a line such as
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 #include "golf.h"
+\par \pard\plain \widctlpar \f4\fs20\lang2057 will first be searched for in the directory containing the source file, then in the user include directories and finally in the system include directories.
+\par Files included from source code with a line such as
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 #include <e32def.h>
+\par \pard\plain \widctlpar \f4\fs20\lang2057 will be searched for in the system include directories.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying strict generation of dependencies
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If your project\rquote s dependencies may differ with the variant, use the {\cs62\b\f37 strictdepend} statement:
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i strictdepend-stmt} :\line \tab {\cs62\b\f37 strictdepend}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Without this statement, dependencies will be evaluated for one variant, and then used for all.  With {\cs62\b\f37 strictdepend}, dependencies are evaluated explicitly\~\emdash  a sometimes lengthy process\~\emdash 
+ for each variant.
+\par Use {\cs62\b\f37 strictdepend} if, for instance, you conditionally include a header file, e.g.
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 #if defined(_DEBUG)\line include <debug.h>\line #endif
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tx630\tqr\tx9072 \b\f5\fs28\lang2057 Specifying import libraries
+\par \pard\plain \s71\widctlpar \f5\fs20\ul\cf13\lang2057 tools.makmake.specifying-libraries
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 library} statement to specify import libraries.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i library-stmt} :\line \tab {\cs62\b\f37 library} {\cs61\i filename-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The {\cs62\b\f37 library} statement may specify any number of files, and there may be many {\cs62\b\f37 library} statements.  Specify the entire filename, e.g. {\cs51\f5 euser.lib}.
+\par If you need to link to Win32 system libraries in a WINS build, use the {\cs62\b\f37 win32_library} statement instead: see {\cs37\f5\uld\cf11 tools.makmake.win32-libraries}.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tx630\tqr\tx9072 \b\f5\fs28\lang2057 Specifying static libraries
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 staticlibrary} statement to specify static libraries.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i library-stmt} :\line \tab {\cs62\b\f37 staticibrary} {\cs61\i filename-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The {\cs62\b\f37 staticibrary} statement may specify any number of files, and there may be many {\cs62\b\f37 library} statements.  Specify the entire filename, e.g. {\cs51\f5 euser.lib}.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying language
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 lang} statement to indicate languages code for the project:
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i lang-stmt} :\line \tab {\cs62\b\f37 lang} {\cs61\i language-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If this statement is not specified, the default language code is {\cs62\b\f37 sc}.  The language codes should be two-digit codes, and are used to complete the extension of generated resource files, as {\cs61\i 
+project}{\cs51\f5 .r}{\cs61\i sc}.  Each resource file specified with the {\i resource-stmt}
+ will be compiled multiple times, once for each language specified, though the specification of several languages will not cause several versions of the bitmaps or application information files in your project to be created.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying #defines
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 macro} statement to specify #defines for the preprocessing of source code:
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i macro-stmt} :\line \tab {\cs62\b\f37 macro} {\cs61\i macro-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Each macro specified will be defined for preprocessing the C++ source code in your project.  Each macro will be upper-cased before being defined, so it\rquote s better to specify them in upper-case in the .{\f5 mmp
+} file.  Macro substitution is not supported - the macros will all be defined with the value \ldblquote 1\rdblquote .
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying a non-default stack size
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 epocstacksize} statement to specify a stack size for your executable other than the default 8KB.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i epocstacksize-stmt} :\line \tab {\cs62\b\f37 epocstacksize} {\cs61\i stacksize}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The size of the stack, in bytes, can be specified in decimal or hexadecimal format.  Use of this statement will have no effect under the WINS platform.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying non-default heap sizes
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 epocheapsize} statement to specify minimum and maximum heap sizes for your executable other than the default 1KB minimum and 1MB maximum.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i epocheapsize-stmt} :\line \tab {\cs62\b\f37 epocheapsize} {\cs61\i minimum maximum}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The sizes can be specified in decimal or hexadecimal format.  Use of this statement will have no effect under Win32 platforms.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying the calling of dll entry points
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 epoccalldllentrypoints}
+ statement to specify that the entry point, E32Dll(),  of your dll, should be called when your dll is loaded.  By default entry points are not called for non-Win32 platforms.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i epoccalldllentrypoints-stmt} :\line \tab {\cs62\b\f37 epoccalldllentrypoints}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use of this statement will have no effect under Win32 platforms, where entry points are always called.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying process priority
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 epocprocesspriority}
+ statement to specify the process priority for your executable EXE. Specify low, background, foreground, high, windowserver, fileserver, realtimeserver or supervisor.  The value specified will be passed on to {\cs51\f5 petran} via its {\cs62\b\f37 
+-priority}{\i  } switch.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i epocprocesspriority-stmt} :\line \tab {\cs62\b\f37 epocprocesspriority} {\cs61\i priority}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use of this statement will have no effect under Win32 platforms.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying a different internal DLL name
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 linkas} statement to give the DLL that your project defines a different internal name.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i linkas-stmt} :\line \tab {\cs62\b\f37 linkas} {\cs61\i priority}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 By default, the internal name of the DLL will be the same as the DLL\rquote s filename.  Under certain rare circumstances it\rquote 
+s useful to be able to give a DLL a different internal name.  For example, a DLL might be built with a certain name and then renamed as part of a ROM, so the internal name must be the same as the DLL\rquote s name in ROM.
+\par Use of this statement will have no effect under Win32 platforms.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Specifying ASSP items
+\par \pard\plain \widctlpar \f4\fs20\lang2057 ASSP stands for \ldblquote Application Specific Standard Product\rdblquote .  
+ASSP statements are for use by projects linking to the EPOC kernel, such as device drivers, so unless you are building such projects you can ignore this section.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i assplibrary-stmt} :\line \tab {\cs62\b\f37 assplibrary} {\cs61\i filename-list}{\cs62\b\f37 \line }{\cs61\i asspexports-stmt} :
+\line \tab {\cs62\b\f37 asspexports}
+\par {\cs61\i asspabi-stmt} :\line \tab {\cs62\b\f37 asspabi}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 
+The import library for the EPOC kernel and associated libraries are created in a directory corresponding to the hardware platform, or ASSP, a particular version of the kernel is built for.  For this reason, projects linking to the kernel must list {\f5 
+ekern.lib} with the {\b\f37 assplibrary} statement, to differentiate it from standard EPOC import libraries.
+\par If the {\b\f37 asspexports}
+ statement is specified, this means that the project exports different functions for different ASSPs; in other words, the API of a particular version of the project will correspond to the hardware platform that version of the project is built for.  The st
+atement has two effects:
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}\pard\plain \s20\fi-284\li568\ri567\widctlpar{\*\pn \pnlvlblt\ulth\pnf1\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\f4\fs20\lang2057 
+the import library for the project will be created in an ASSP-specific directory rather than in the usual directory for containing the ARM import libraries - \\{\f5 EPOC32}\\{\f5 Release}\\{\i assp-name}\\{\i variant}\\ rather than \\{\f5 EPOC32}\\{\f5 
+Release}\\{\i platform-name}\\{\i variant}\\.
+\par {\pntext\pard\plain\f1\fs20\lang2057 \'b7\tab}the frozen def file for the project will, by default, reside in an ASSP-specific directory rather than ..\\{\f5 bmarm}\\.
+\par \pard\plain \widctlpar \f4\fs20\lang2057 If the {\b\f37 asspabi} statement is specified, the ABI that the project will be built for - ARMI, ARM4 or THUMB - will be the same as that of the kernel for a 
+particular ASSP.  Otherwise the ABI for the project will be the default ABI for a particular ASSP.  The {\b\f37 asspabi} statement is implied by the presence of either the {\b\f37 asspexports} or the {\b\f37 assplibrary} statements.
+\par \pard\plain \s74\widctlpar\brdrl\brdrth\brdrw30\brsp80 \f4\fs20\cf5\lang2057 This section is perhaps just going to confuse people, and maybe should just be in the base porting guide or the device driver documentation or somewhere like that.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Platform-specific items
+\par \pard\plain \widctlpar \f4\fs20\lang2057 A platform-specific section is enclosed in {\cs62\b\f37 start} and {\cs62\b\f37 end}:
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs62\b\f37 start }{\cs61\i platform}\line \tab {\cs61\i platform-specific-statement-list}\line {\cs62\b\f37 end}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 The platform-specific statements allowed depend on the platform.  Unlike {\cs62\b\f37 #if defined}
+  blocks, which allow statements to specify different files dependent upon the platform for which the makefile is being created, {\cs62\b\f37 start ... end} platform blocks are used to delimit statements understood only by {\cs51\f5 makmake}
+ when creating a makefile for a particular platform.  The {\cs51\f5 makmake} project definition file is preprocessed every time {\cs51\f5 makmake} is run, with the target platform defined as a macro equal to itself (where WINC is the platfor
+m, WINS is also defined).  This allows, for example, the project definition file to be preprocessed with the macro WINS defined as WINS so preserving the syntax of {\cs62\b\f37 start WINS ... end}
+ blocks.  Where VC5 is the target platform, the macro WINS is defined instead; similarly the macros WINS and WINC are defined where the target platform is VC5WINC.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 WINS-specific statements
+\par \pard\plain \s71\widctlpar \f5\fs20\ul\cf13\lang2057 tools.makmake.wins
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 Specifying a base address
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 baseaddress} statement to specify the address to which a DLL will be built and, if possible, loaded.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i wins-specific-statement} :\line \tab {\cs62\b\f37 baseaddress} {\cs61\i hex-constant}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use {\cs62\b\f37 baseaddress} to specify the base address of a WINS DLL.  Give each DLL a different base address, so that the Windows loader doesn\rquote 
+t have to do any relocation while loading EPOC and its DLLs.  This considerably speeds up the initialisation of EPOC under WINS.
+\par \pard\plain \s4\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072 \b\f5\lang2057 Specifying Win32 system libraries
+\par \pard\plain \s71\widctlpar \f5\fs20\ul\cf13\lang2057 tools.makmake.win32-libraries
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use the {\cs62\b\f37 win32_library} statement to specify any Win32 system libraries needed by the project.
+\par \pard\plain \s58\li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \f4\fs20\lang2057 {\cs61\i wins-specific-statement} :\line \tab {\cs62\b\f37 win32_library} {\cs61\i filename-list}
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Use {\cs62\b\f37 win32_library} to specify Win32 libraries in the same way that other libraries are specified with the {\cs62\b\f37 library}
+ statement.  If any Win32 system libraries are specified, directories specified by the INCLUDE environmental variable will be searched for system-included header files not found in the system include paths specified for the project.
+\par \pard\plain \s3\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072 \b\f5\fs28\lang2057 Command Line Makefile utilities
+\par \pard\plain \widctlpar \f4\fs20\lang2057 Command-line makefiles created by {\cs51\f5 makmake} contain syntax which it is not possible to incorporate into makefil
+es intended for the MSVC IDE.  Command-line makefiles provide extra makefile targets which enable you to use {\cs62\b\f37 nmake}
+ to create work directories and erase non-source files for a particular build variant of a project.  For example, WINS command-line makefiles provide the targets {\cs51\f5 makework, makeworkudeb, makeworkurel, clean, cleanudeb, cleanurel.}
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.wins clean
+\par \pard\plain \widctlpar \f4\fs20\lang2057 will attempt to delete the non-source files created during a build of all variants of the project {\f5 euhello}, while
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.wins cleanudeb
+\par \pard\plain \widctlpar \f4\fs20\lang2057 for example, will attempt only to delete non-source files created by a wide debug build of  the project.
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.wins makework
+\par \pard\plain \widctlpar \f4\fs20\lang2057 will create the work directories for a build of all variants of the project {\f5 euhello}, while
+\par \pard\plain \s19\li567\keep\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536 \f37\fs20\lang1024 nmake -f euhello.wins makeworkurel
+\par \pard\plain \widctlpar \f4\fs20\lang2057 will create the work directories for a wide release build of the project.
+\par The build-specific {\cs51\f5 makework} targets are listed as dependencies of the main build-specific targets in command-line makefiles, so work directories will automatically be creat
+ed when a target is built with a command-line makefile if these directories do not already exist.
+\par }
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/memtrace.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,178 @@
+{\rtf1\ansi\ansicpg1252\uc1\deff0\stshfdbch0\stshfloch0\stshfhich0\stshfbi0\deflang2057\deflangfe2057{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial;}
+{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f4\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Helvetica{\*\falt Arial};}{\f7\fswiss\fcharset0\fprq2{\*\panose 020b0604020202030204}Helv{\*\falt Arial};}
+{\f36\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times;}{\f37\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f55\froman\fcharset238\fprq2 Times New Roman CE;}{\f56\froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f58\froman\fcharset161\fprq2 Times New Roman Greek;}{\f59\froman\fcharset162\fprq2 Times New Roman Tur;}{\f60\froman\fcharset177\fprq2 Times New Roman (Hebrew);}{\f61\froman\fcharset178\fprq2 Times New Roman (Arabic);}
+{\f62\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f63\froman\fcharset163\fprq2 Times New Roman (Vietnamese);}{\f65\fswiss\fcharset238\fprq2 Arial CE;}{\f66\fswiss\fcharset204\fprq2 Arial Cyr;}{\f68\fswiss\fcharset161\fprq2 Arial Greek;}
+{\f69\fswiss\fcharset162\fprq2 Arial Tur;}{\f70\fswiss\fcharset177\fprq2 Arial (Hebrew);}{\f71\fswiss\fcharset178\fprq2 Arial (Arabic);}{\f72\fswiss\fcharset186\fprq2 Arial Baltic;}{\f73\fswiss\fcharset163\fprq2 Arial (Vietnamese);}
+{\f95\fswiss\fcharset238\fprq2 Helvetica CE{\*\falt Arial};}{\f96\fswiss\fcharset204\fprq2 Helvetica Cyr{\*\falt Arial};}{\f98\fswiss\fcharset161\fprq2 Helvetica Greek{\*\falt Arial};}{\f99\fswiss\fcharset162\fprq2 Helvetica Tur{\*\falt Arial};}
+{\f100\fswiss\fcharset177\fprq2 Helvetica (Hebrew){\*\falt Arial};}{\f101\fswiss\fcharset178\fprq2 Helvetica (Arabic){\*\falt Arial};}{\f102\fswiss\fcharset186\fprq2 Helvetica Baltic{\*\falt Arial};}
+{\f103\fswiss\fcharset163\fprq2 Helvetica (Vietnamese){\*\falt Arial};}{\f415\froman\fcharset238\fprq2 Times CE;}{\f416\froman\fcharset204\fprq2 Times Cyr;}{\f418\froman\fcharset161\fprq2 Times Greek;}{\f419\froman\fcharset162\fprq2 Times Tur;}
+{\f420\froman\fcharset177\fprq2 Times (Hebrew);}{\f421\froman\fcharset178\fprq2 Times (Arabic);}{\f422\froman\fcharset186\fprq2 Times Baltic;}{\f423\froman\fcharset163\fprq2 Times (Vietnamese);}{\f425\fmodern\fcharset238\fprq1 Lucida Console CE;}
+{\f426\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f428\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f429\fmodern\fcharset162\fprq1 Lucida Console Tur;}}{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;
+\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;
+\red128\green128\blue128;\red192\green192\blue192;\red255\green255\blue255;}{\stylesheet{\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \snext0 \styrsid4260995 
+Normal;}{\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs40\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 1;}{
+\s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs34\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 2;}
+{\s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 
+heading 3;}{\s4\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel3\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext0 heading 4;}{\s5\ql \li0\ri0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel4\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 5;}{
+\s6\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel5\adjustright\rin0\lin0\itap0 \i\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 6;}{
+\s7\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel6\adjustright\rin0\lin0\itap0 \f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 7;}{
+\s8\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel7\adjustright\rin0\lin0\itap0 \i\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 8;}{
+\s9\ql \li0\ri0\sb240\sa60\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel8\adjustright\rin0\lin0\itap0 \i\f1\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 heading 9;}{\*\cs10 \additive \ssemihidden \styrsid4260995 
+Default Paragraph Font;}{\*\ts11\tsrowd\trftsWidthB3\trpaddl108\trpaddr108\trpaddfl3\trpaddft3\trpaddfb3\trpaddfr3\tblind0\tblindtype3\tscellwidthfts0\tsvertalt\tsbrdrt\tsbrdrl\tsbrdrb\tsbrdrr\tsbrdrdgl\tsbrdrdgr\tsbrdrh\tsbrdrv 
+\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs20\lang1024\langfe1024\cgrid\langnp1024\langfenp1024 \snext11 \ssemihidden \styrsid4260995 Normal Table;}{\s15\ql \li0\ri0\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f37\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive 
+\f37\lang2057\langfe0\langnp2057\langfenp0 \sbasedon10 Code;}{\*\cs17 \additive \i \sbasedon10 Emphasis;}{\*\cs18 \additive \b \sbasedon10 Warning;}{\s19\ql \li567\ri0\keep\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin567\itap0 \f37\fs24\lang1024\langfe1024\cgrid\noproof\langnp1033\langfenp2057 \sbasedon0 \snext19 Indented Code;}{
+\s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf36\pnstart1\pnindent283\pnhang {\pntxtb ?}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin567\lin568\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon21 \snext20 \sautoupd List Bullet;}{\s21\ql \fi-284\li851\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin851\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext21 List;}{\s22\ql \li567\ri567\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext22 List Continue;}{\s23\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang {\pntxta ?}}\aspalpha\aspnum\faauto\ls2047\ilvl11\adjustright\rin567\lin568\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon21 \snext23 List Number;}{\s24\qc \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext24 Picture;}{\s25\qc \li0\ri0\sb240\sa240\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs72\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext25 Title;}{
+\s26\ql \li0\ri0\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext26 Logo;}{
+\s27\ql \li0\ri0\sb1440\sa1200\sl-460\slmult0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\scaps\f1\fs40\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext27 Subtitle;}{\s28\ql \li0\ri0\sl-200\slmult0
+\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext28 Version;}{\s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext29 Date Published;}{\s30\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext30 Copyright Header;}{\s31\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext31 Copyright Notice;}{
+\s32\ql \li0\ri0\sa1440\sl-960\slmult0\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\scaps\f1\fs40\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext32 TOC Header;}{
+\s33\ql \li0\ri0\sb480\sa160\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \b\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext0 \sautoupd \ssemihidden toc 1;}{\s34\ql \li221\ri0\sb120\keepn\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin221\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext0 \sautoupd \ssemihidden toc 2;}{\s35\ql \li442\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin442\itap0 \f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext0 \sautoupd \ssemihidden toc 3;}{\s36\ql \li658\ri0\widctlpar\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin658\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 \sautoupd \ssemihidden 
+toc 4;}{\*\cs37 \additive \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\ql \li0\ri0\widctlpar\brdrr\brdrdb\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f37\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext38 Constant Definition;}{\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext39 header;}{
+\s40\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext40 Even Footer Paragraph;}{
+\s41\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \caps\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext41 Even Header Paragraph;}{\s42\ql \li0\ri0\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon39 \snext42 footer;}{\*\cs43 \additive \b \sbasedon10 page number;}{
+\s44\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext44 Odd Footer Paragraph;}{
+\s45\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \caps\fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext45 Odd Header Paragraph;}{\s46\ql \li0\ri0\widctlpar\brdrl
+\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \i \sbasedon10 Glossary Reference;}{
+\s48\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext48 Compact;}{\*\cs49 \additive \f1 \sbasedon10 App Text;}{
+\s50\ql \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs40\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \f1 \sbasedon10 
+Filename;}{\s52\ql \fi-284\li1135\ri1134\widctlpar\wrapdefault{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf4\pnstart1\pnindent283\pnhang {\pntxtb ?}}\aspalpha\aspnum\faauto\ls2047\ilvl10\adjustright\rin1134\lin1135\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext52 \sautoupd List Bullet 2;}{\*\cs53 \additive \b \sbasedon10 Glossary Definition;}{\*\cs54 \additive \i \sbasedon10 Document Name;}{\s55\ql \li0\ri0\keep\keepn\widctlpar
+\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f37\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 Prototype;}{\*\cs56 \additive \scaps 
+\sbasedon10 Key Name;}{\s57\ql \li0\ri0\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f37\fs16\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext57 Reduced Code;}{\s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 
+\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 Syntax;}{\s59\qc \li0\ri0\sb240\sa240\keepn\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f1\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext59 Picture Title;}{\s60\ql \fi-3119\li3119\ri0\widctlpar\tx3119\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin3119\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive 
+\i \sbasedon10 Syntax Element;}{\*\cs62 \additive \b\f37 \sbasedon10 Syntax Literal;}{\s63\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext63 \ssemihidden annotation text;}{\*\cs64 \additive \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 
+\b\f1\fs36\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \f37\cf2\lang2057\langfe0\langnp2057\langfenp0 \sbasedon16 Resource Code;}{
+\s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs24\cf6\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext67 Converter Directive;}{
+\s68\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \b\f37\fs24\uldb\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \b\cf10 \sbasedon10 Raw HTML;}{\*\cs70 
+\additive \i\cf14 \sbasedon10 URL Reference;}{\s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs24\ul\cf13\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext0 Hypertext Anchor;}{
+\s72\ql \li0\ri0\widctlpar\brdrr\brdrs\brdrw45\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext72 Member Definition;}{\s73\ql \li567\ri567\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext73 Figure Picture;}{\s74\ql \li0\ri0\widctlpar\brdrl
+\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\cf5\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon46 \snext74 Comment;}{\s75\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb
+\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \b\fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext75 Figure Caption;}{\s76\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext76 Figure Description;}{\s77\ql \li567\ri567\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \fs24\cf6\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon73 \snext77 Figure Status;}{\s78\ql \li567\ri567\widctlpar
+\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 \f1\fs24\ul\cf13\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon0 \snext78 Figure Anchor;}{\*\cs79 \additive 
+\f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\ql \li567\ri567\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin567\lin567\rtlgutter\itap0 
+\i\fs24\cf10\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 \sbasedon73 \snext80 Figure Directive;}{\s81\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 
+\sbasedon0 \snext81 Body Text;}}{\*\listtable{\list\listtemplateid-1425013608\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0\hres0\chhres0 \fi-360\li643\jclisttab\tx643\lin643 }{\listname ;}\listid-125}{\list\listtemplateid1252012804\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'00.;}{\levelnumbers\'01;}\hres0\chhres0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-120}{\list\listtemplateid-1450533688\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0
+\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid-119}{\list\listtemplateid-1\listsimple{\listlevel\levelnfc0\levelnfcn0\leveljc0\leveljcn0\levelfollow0\levelstartat0
+\levelspace0\levelindent0{\leveltext\'01*;}{\levelnumbers;}\hres0\chhres0 }{\listname ;}\listid-2}{\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-360\li360\jclisttab\tx360\lin360 }{\listname ;}\listid1325275661}}{\*\listoverridetable{\listoverride\listid-119\listoverridecount0\ls1}{\listoverride\listid-120\listoverridecount0\ls2}
+{\listoverride\listid-125\listoverridecount0\ls3}{\listoverride\listid-119\listoverridecount0\ls4}{\listoverride\listid-120\listoverridecount0\ls5}{\listoverride\listid-125\listoverridecount0\ls6}{\listoverride\listid-119\listoverridecount0\ls7}
+{\listoverride\listid-120\listoverridecount0\ls8}{\listoverride\listid-125\listoverridecount0\ls9}{\listoverride\listid-119\listoverridecount0\ls10}{\listoverride\listid-120\listoverridecount0\ls11}{\listoverride\listid-125\listoverridecount0\ls12}
+{\listoverride\listid-119\listoverridecount0\ls13}{\listoverride\listid-120\listoverridecount0\ls14}{\listoverride\listid-125\listoverridecount0\ls15}{\listoverride\listid-119\listoverridecount0\ls16}{\listoverride\listid-120\listoverridecount0\ls17}
+{\listoverride\listid-125\listoverridecount0\ls18}{\listoverride\listid-119\listoverridecount0\ls19}{\listoverride\listid-120\listoverridecount0\ls20}{\listoverride\listid-125\listoverridecount0\ls21}{\listoverride\listid-119\listoverridecount0\ls22}
+{\listoverride\listid-120\listoverridecount0\ls23}{\listoverride\listid-125\listoverridecount0\ls24}{\listoverride\listid-119\listoverridecount0\ls25}{\listoverride\listid-120\listoverridecount0\ls26}{\listoverride\listid-125\listoverridecount0\ls27}
+{\listoverride\listid1325275661\listoverridecount0\ls28}{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold\levelspace0\levelindent283{\leveltext
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0\hres0\chhres0 \fi-283\li567\lin567 }}\ls29}{\listoverride\listid-2\listoverridecount1{\lfolevel\listoverrideformat{\listlevel\levelnfc23\levelnfcn23\leveljc0\leveljcn0\levelfollow0\levelstartat1\levelold
+\levelspace0\levelindent283{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f36\fbias0\hres0\chhres0 \fi-283\li567\lin567 }}\ls30}}{\*\rsidtbl \rsid928984\rsid4260995\rsid7031965}{\*\generator Microsoft Word 10.0.6829;}{\info{\title Tools}
+{\subject Specifying projects with makmake}{\author Preferred Customer}{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator DuskoJ}{\creatim\yr2000\mo12\dy18\hr20\min9}
+{\revtim\yr2007\mo8\dy14\hr13\min11}{\printim\yr1997\mo4\dy18\hr15\min6}{\version8}{\edmins104}{\nofpages2}{\nofwords710}{\nofchars4048}{\*\company Dell Computer Corporation}{\nofcharsws4749}{\vern16393}{\*\password 00000000}}{\*\xmlnstbl }
+\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 \widowctrl\ftnbj\aenddoc\grfdocevents0\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\linkstyles\hyphcaps0\formshade\horzdoc\dghspace120\dgvspace120\dghorigin1701
+\dgvorigin1984\dghshow0\dgvshow3\jcompress\viewkind1\viewscale100\nolnhtadjtbl\rsidroot928984 \fet0{\*\wgrffmtfilter 013f}\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\headerr \pard\plain 
+\s39\ql \li0\ri0\widctlpar\tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\field{\*\fldinst {\insrsid928984  TITLE  \\* MERGEFORMAT }}{\fldrslt {\insrsid928984 
+Tools}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid928984 \tab Company Confidential\tab EON SDK, Copyright \'a9 1999, Symbian Ltd
+\par }}{\footerr \pard\plain \s42\ql \li0\ri0\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\rtlgutter\itap0 \fs18\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\field{\*\fldinst {
+\insrsid928984  SUBJECT  \\* MERGEFORMAT }}{\fldrslt {\insrsid928984 Specifying projects with makmake}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid928984 \tab Page }{\field{\*\fldinst {\insrsid928984  PAGE  \\* MERGEFORMAT }}{\fldrslt {
+\lang1024\langfe1024\noproof\insrsid4260995 1}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid928984 \tab Last saved }{\field{\*\fldinst {\insrsid928984  SAVEDATE  \\* MERGEFORMAT }}{\fldrslt {\lang1024\langfe1024\noproof\insrsid4260995 18/03/2005
+ 4:12 PM}}}\sectd \linex0\endnhere\sectdefaultcl\sftnbj {\insrsid928984 
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang {\pntxta ?}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang {\pntxta ?}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang {\pntxta ?}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang {\pntxta ?}}
+{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang {\pntxtb ?}{\pntxta ?}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb ?}{\pntxta ?}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb ?}{\pntxta ?}}{\*\pnseclvl8
+\pnlcltr\pnstart1\pnindent720\pnhang {\pntxtb ?}{\pntxta ?}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang {\pntxtb ?}{\pntxta ?}}\pard\plain 
+\s1\ql \li0\ri0\sb360\sa240\keepn\pagebb\widctlpar\wrapdefault\aspalpha\aspnum\faauto\outlinelevel0\adjustright\rin0\lin0\itap0 \b\f1\fs40\lang2057\langfe2057\kerning28\cgrid\langnp2057\langfenp2057 {\field\fldedit{\*\fldinst {\insrsid928984  SUBJECT  \\
+* MERGEFORMAT }}{\fldrslt {\insrsid928984 Investigating memory usage with memtrace}}}\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl\sftnbj {\insrsid928984 
+\par }\pard\plain \s71\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs24\ul\cf13\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 tools.memtrace
+\par }\pard\plain \s67\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \f1\fs24\cf6\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 doclevel v6.1
+\par }\pard\plain \s74\ql \li0\ri0\widctlpar\brdrl\brdrs\brdrw30\brsp80 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\cf5\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 this chapter documents }{\cs51\f1\insrsid928984 
+memtrace}{\insrsid928984  to e32toolp release 223 level.
+\par }\pard\plain \s2\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel1\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs34\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+Overview
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 The }{\cs51\f1\insrsid928984 memtrace}{\insrsid928984 
+ tool can be used to investigate the memory usage of an EPOC system. By default }{\cs51\f1\insrsid928984 memtrace}{\insrsid928984  produces a summary listing showing the high-watermark memory usage of each EPOC process over the course of the run. }{
+\cs51\f1\insrsid928984 memtrace}{\insrsid928984  can also produce a detailed listing showing how memory usage changes over time which can be used to identify transient spikes in the memory usage of an individual process and of the entire EPOC system.
+
+\par }\pard\plain \s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+Invocation syntax
+\par }\pard\plain \s58\ql \li851\ri851\keep\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \wrapdefault\aspalpha\aspnum\faauto\adjustright\rin851\lin851\rtlgutter\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {
+\cs62\b\f37\insrsid928984 memtrace}{\insrsid928984  [}{\cs61\i\insrsid928984 -d}{\insrsid928984 ] }{\cs61\i\insrsid928984 tracefile
+\par options}{\insrsid928984  :\line \tab }{\cs62\b\f37\insrsid928984 -d}{\insrsid928984 
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 where
+\par }\trowd \irow0\irowband0\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil 
+\cellx2268\clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {
+\cs61\i\insrsid928984 Logfile}{\insrsid928984 \cell Memory usage trace file\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid928984 \trowd \irow0\irowband0
+\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil \cellx2268\clvertalt
+\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\row }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\cs62\b\f37\insrsid928984 
+-d}{\cs61\i\insrsid928984 \cell }{\insrsid928984 Indicates that the tool should produce a detailed listing\cell }\pard \ql \li0\ri0\widctlpar\intbl\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0 {\insrsid928984 \trowd \irow1\irowband1\lastrow 
+\ts11\trgaph108\trleft-108\trftsWidth1\trpaddl108\trpaddr108\trpaddfl3\trpaddfr3\tblind0\tblindtype3 \clvertalt\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth2376\clshdrawnil \cellx2268\clvertalt
+\clbrdrt\brdrnone \clbrdrl\brdrnone \clbrdrb\brdrnone \clbrdrr\brdrnone \cltxlrtb\clftsWidth3\clwWidth6911\clshdrawnil \cellx9179\row }\pard \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 {\cs51\f1\insrsid928984 
+
+\par memtrace}{\cs51\insrsid928984  produces output in Comma Separated Variable format on standard output. In normal use one would redirect its output to a }{\cs51\f1\insrsid928984 .csv}{\cs51\insrsid928984  file.
+\par }\pard\plain \s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 \b\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+Obtaining a trace file
+\par }\pard\plain \s29\ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\cs51\f1\insrsid928984 memtrace}{\cs51\insrsid928984 
+ operates on a file containing memory usage trace information. This file is obtained by capturing kernel trace output from a running EPOC system, starting from system boot. The EPOC kernel will only output memory usage trace information if:
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 A debug build of the kernel is used.
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0\pararsid928984 {\insrsid928984 Bit 26 of the kernel trace bitmask is set at boot-time \endash  in practice this means that }{\insrsid928984\charrsid7031965 the statement }{
+\cs16\insrsid928984\charrsid7031965 kerneltrace 0x04000000 0 0 0 0 0 0 0}{\insrsid928984\charrsid7031965  should appear in the rombuild configuration file.}{\insrsid928984 
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+Only a debug kernel will produce memory usage trace information. However in order to obtain representative results all other executables should be release versions.
+\par The kernel trace information appears on 
+a device-specific trace channel. The output of this channel should be logged to a file, starting from system boot. Depending on the device in use this channel may be a serial port, an ARM Embedded Trace Macrocell port or a custom device-specific port. Use
+ 
+of a slow trace channel will impact system performance. In the case where the trace channel is shared with comms protocols then those comms protocols will be unavailable and should be disabled. The kernel trace channel on Symbian reference platforms is th
+e first serial port running at 115200,n,8,1.
+\par }\pard\plain \s29\ql \li0\ri0\widctlpar\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+The EPOC Emulator kernel can also produce memory usage trace information. However information obtained from the Emulator is likely to be less useful since EPOC processes may behave differently between the Emulator and target devices and since }{
+\cs51\f1\insrsid928984 memtrace}{\cs51\insrsid928984  is less able to correctly assign memory usage to processes using trace information obtained on the Emulator. The Emulator kernel will only output memory usage trace information if:
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 A debug build of the kernel is used.
+\par {\pntext\pard\plain\s20 \f3\insrsid4260995 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 {\insrsid4260995 Bit 26}{\insrsid928984  of the kernel trace bitmask is set at boot-time \endash  in practice this means that the statement }{\cs16\f37\insrsid928984 DebugMask 524288}{
+\insrsid928984  should appear in the Emulator configuration file (which by default is }{\cs51\f1\insrsid928984 \\epoc32\\data\\epoc.ini}{\insrsid928984 ).
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 {\insrsid928984 It is recommended that an appropriate value be supplied in the Emulator configuration file for the }{\cs16\f37\insrsid928984 MegabytesOfFreeMemory}{\insrsid928984 
+ parameter for the device being emulated}{\f7\cf1\insrsid928984 .}{\insrsid928984 
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 
+The Emulator kernel produces its trace information using the win32 }{\cs16\f37\insrsid928984 OutputDebugString}{\insrsid928984  API. This output can be captured by starting
+ the emulator from Microsoft Visual C++ and copying and pasting the contents of the \'93Output\'94 window, or by using a dedicated program such as }{\cs49\f1\insrsid928984 DebugView}{\insrsid928984  from }{\cs70\i\cf14\insrsid928984 www.sysinternals.com}{
+\insrsid928984 .
+\par }\pard\plain \s3\ql \li0\ri0\sb120\keepn\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\aspalpha\aspnum\faauto\outlinelevel2\adjustright\rin0\lin0\rtlgutter\itap0 
+\b\f1\fs28\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 Understanding the results
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault{\*\pn \pnlvlcont\ilvl0\ls0\pnrnot0\pndec }\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 The output from }{\cs51\f1\insrsid928984 
+memtrace}{\cs51\insrsid928984  is a Comma Separated Variable format on standard output. In normal use one would redirect the output to a }{\cs51\f1\insrsid928984 .csv}{\cs51\insrsid928984 
+ file which can be read by many spreadsheet programs. The output can be charted using the \'93Chart Wizard\'94 in Microsoft Excel. When charting a detailed listing use these exceptions from the default values:
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard\plain \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\insrsid928984 Choose a \lquote Chart type\rquote  of type \lquote Area\rquote  (and sub-type \lquote Stacked Area\rquote ).
+\par {\pntext\pard\plain\s20 \f3\insrsid928984 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \s20\ql \fi-284\li568\ri567\widctlpar\wrapdefault{\*\pn \pnlvlbody\ilvl0\ls29\pnrnot0\pnf3\pnstart1\pnindent283\pnhang {\pntxtb \'b7}}
+\aspalpha\aspnum\faauto\ls29\adjustright\rin567\lin568\itap0 {\insrsid928984 After applying the wizard change the X-axis format \lquote Number Category\rquote  to \lquote Number\rquote  with 1 decimal place.
+\par }\pard\plain \ql \li0\ri0\widctlpar\wrapdefault\aspalpha\aspnum\faauto\adjustright\rin0\lin0\itap0 \fs24\lang2057\langfe2057\cgrid\langnp2057\langfenp2057 {\cs51\insrsid928984 The detailed listing shows how the memory usage 
+of processes and global chunks change over the course of the run. The summary listing shows the high-watermark memory usage of processes and global chunks over the course of the run.
+\par }{\insrsid928984 The kernel memory usage trace information is output }{\cs51\insrsid928984 at the granularity of a system page (i.e. 4K on ARM devices and on the Emulator) and }{\cs51\f1\insrsid928984 memtrace}{\cs51\insrsid928984 
+ is unable to show memory allocation at a finer granularity than this. }{\cs51\f1\insrsid928984 memtrace}{\cs51\insrsid928984  also groups together the memory allocated by the loader on behalf of a process with memory allocated by 
+different threads within a process. However it lists memory allocated to global chunks (e.g. the font bitmap server shared chunks) separately from the process that created them.
+\par }{\insrsid928984 The results produced for kernel memory usage should not be relied on because the kernel is a debug version and because memory used by the kernel for managing memory is not recorded.
+\par 
+\par }}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/metabld.rtf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,105 @@
+{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\froman\fcharset0\fprq2{\*\panose 02020603050405020304}Times New Roman;}{\f1\fswiss\fcharset0\fprq2{\*\panose 020b0604020202020204}Arial{\*\falt  arial};}
+{\f3\froman\fcharset2\fprq2{\*\panose 05050102010706020507}Symbol;}{\f47\fmodern\fcharset0\fprq1{\*\panose 020b0609040504020204}Lucida Console;}{\f55\froman\fcharset238\fprq2 Times New Roman CE;}{\f56\froman\fcharset204\fprq2 Times New Roman Cyr;}
+{\f58\froman\fcharset161\fprq2 Times New Roman Greek;}{\f59\froman\fcharset162\fprq2 Times New Roman Tur;}{\f60\froman\fcharset186\fprq2 Times New Roman Baltic;}{\f61\fswiss\fcharset238\fprq2 Arial CE{\*\falt  arial};}
+{\f62\fswiss\fcharset204\fprq2 Arial Cyr{\*\falt  arial};}{\f64\fswiss\fcharset161\fprq2 Arial Greek{\*\falt  arial};}{\f65\fswiss\fcharset162\fprq2 Arial Tur{\*\falt  arial};}{\f66\fswiss\fcharset186\fprq2 Arial Baltic{\*\falt  arial};}
+{\f337\fmodern\fcharset238\fprq1 Lucida Console CE;}{\f338\fmodern\fcharset204\fprq1 Lucida Console Cyr;}{\f340\fmodern\fcharset161\fprq1 Lucida Console Greek;}{\f341\fmodern\fcharset162\fprq1 Lucida Console Tur;}}{\colortbl;\red0\green0\blue0;
+\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;
+\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;}{\stylesheet{\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \snext0 Normal;}{\s1\sb360\sa240\keepn\pagebb\nowidctlpar\widctlpar\adjustright 
+\b\f1\fs40\lang2057\kerning28 \sbasedon0 \snext0 heading 1;}{\s2\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\adjustright \b\f1\fs34\lang2057 \sbasedon0 \snext0 heading 2;}{\s3\sb120\keepn\nowidctlpar\widctlpar\brdrt
+\brdrs\brdrw30\brsp20 \tqr\tx9072\adjustright \b\f1\fs28\lang2057 \sbasedon0 \snext0 heading 3;}{\s4\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqr\tx9072\adjustright \b\f1\lang2057 \sbasedon0 \snext0 heading 4;}{
+\s5\keepn\nowidctlpar\widctlpar\adjustright \b\f1\fs20\lang2057 \sbasedon0 \snext0 heading 5;}{\s6\sb240\sa60\nowidctlpar\widctlpar\adjustright \i\f1\fs20\lang2057 \sbasedon0 \snext0 heading 6;}{\s7\sb240\sa60\nowidctlpar\widctlpar\adjustright 
+\f1\fs20\lang2057 \sbasedon0 \snext0 heading 7;}{\s8\sb240\sa60\nowidctlpar\widctlpar\adjustright \i\f1\fs20\lang2057 \sbasedon0 \snext0 heading 8;}{\s9\sb240\sa60\nowidctlpar\widctlpar\adjustright \i\f1\fs18\lang2057 \sbasedon0 \snext0 heading 9;}{\*
+\cs10 \additive Default Paragraph Font;}{\s15\nowidctlpar\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\adjustright \f47\fs16\lang2057 \sbasedon0 \snext15 Code Paragraph;}{\*\cs16 \additive \f47\lang2057 \sbasedon10 Code;}
+{\*\cs17 \additive \i \sbasedon10 Emphasis;}{\*\cs18 \additive \b \sbasedon10 Warning;}{\s19\li567\keep\nowidctlpar\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\adjustright \f47\fs20\lang1024 \sbasedon0 \snext19 Indented Code;}{
+\s20\fi-284\li568\ri567\nowidctlpar\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\ls2047\ilvl10\adjustright \fs20\lang2057 \sbasedon21 \snext20 \sautoupd List Bullet;}{
+\s21\fi-284\li851\ri567\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \sbasedon0 \snext21 List;}{\s22\li567\ri567\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \sbasedon0 \snext22 List Continue;}{
+\s23\fi-284\li568\ri567\nowidctlpar\widctlpar{\*\pn \pnlvlbody\ilvl11\ls2047\pnrnot0\pndec\pnstart1\pnindent283\pnhang{\pntxta ?}}\ls2047\ilvl11\adjustright \fs20\lang2057 \sbasedon21 \snext23 List Number;}{\s24\qc\nowidctlpar\widctlpar\adjustright 
+\fs20\lang2057 \sbasedon0 \snext24 Picture;}{\s25\qc\sb240\sa240\nowidctlpar\widctlpar\adjustright \b\f1\fs72\lang2057 \sbasedon0 \snext25 Title;}{\s26\nowidctlpar\widctlpar\phmrg\posxr\posyt\dxfrtext181\dfrmtxtx181\dfrmtxty0\adjustright \fs20\lang2057 
+\sbasedon0 \snext26 Logo;}{\s27\sb1440\sa1200\sl-460\slmult0\nowidctlpar\widctlpar\adjustright \b\scaps\f1\fs40\lang2057 \sbasedon0 \snext27 Subtitle;}{\s28\sl-200\slmult0\nowidctlpar\widctlpar\adjustright \b\f1\fs20\lang2057 \sbasedon0 \snext28 Version;}
+{\s29\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \sbasedon0 \snext29 Date Published;}{\s30\nowidctlpar\widctlpar\adjustright \b\fs20\lang2057 \sbasedon0 \snext30 Copyright Header;}{\s31\nowidctlpar\widctlpar\adjustright \fs20\lang2057 
+\sbasedon0 \snext31 Copyright Notice;}{\s32\sa1440\sl-960\slmult0\keepn\nowidctlpar\widctlpar\adjustright \b\scaps\f1\fs40\lang2057 \sbasedon0 \snext32 TOC Header;}{\s33\sb480\sa160\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 
+\tqr\tx9072\adjustright \b\fs20\lang2057 \sbasedon0 \snext0 \sautoupd toc 1;}{\s34\li221\sb120\keepn\nowidctlpar\widctlpar\tqr\tx9072\adjustright \fs20\lang2057 \sbasedon0 \snext0 \sautoupd toc 2;}{\s35\li442\nowidctlpar\widctlpar\tqr\tx9072\adjustright 
+\f1\fs20\lang2057 \sbasedon0 \snext0 \sautoupd toc 3;}{\s36\li658\nowidctlpar\widctlpar\tqr\tx9072\adjustright \fs20\lang2057 \sbasedon0 \snext0 \sautoupd toc 4;}{\*\cs37 \additive \f1\uld\cf11 \sbasedon10 Hypertext Link;}{\s38\nowidctlpar\widctlpar\brdrr
+\brdrdb\brdrw15\brsp20 \adjustright \f47\fs20\lang2057 \sbasedon0 \snext38 Constant Definition;}{\s39\nowidctlpar\widctlpar\tqc\tx4536\tqr\tx9072\adjustright \fs18\lang2057 \sbasedon0 \snext39 header;}{\s40\nowidctlpar\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\adjustright \fs20\lang2057 \sbasedon0 \snext40 Even Footer Paragraph;}{\s41\nowidctlpar\widctlpar\tqc\tx4536\tqr\tx9072\adjustright \caps\fs18\lang2057 \sbasedon0 \snext41 Even Header Paragraph;}{
+\s42\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\adjustright \fs18\lang2057 \sbasedon39 \snext42 footer;}{\*\cs43 \additive \b \sbasedon10 page number;}{\s44\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 
+\tqc\tx4536\tqr\tx9072\adjustright \fs20\lang2057 \sbasedon0 \snext44 Odd Footer Paragraph;}{\s45\nowidctlpar\widctlpar\tqc\tx4536\tqr\tx9072\adjustright \caps\fs18\lang2057 \sbasedon0 \snext45 Odd Header Paragraph;}{\s46\nowidctlpar\widctlpar\brdrl
+\brdrs\brdrw30\brsp80 \adjustright \fs20\lang2057 \sbasedon0 \snext46 Status;}{\*\cs47 \additive \i \sbasedon10 Glossary Reference;}{\s48\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \sbasedon0 \snext48 Compact;}{\*\cs49 \additive \f1 \sbasedon10 
+App Text;}{\s50\sb240\sa240\keepn\nowidctlpar\widctlpar\adjustright \b\f1\fs40\lang2057\kerning28 \sbasedon1 \snext50 Heading 1 NoSection;}{\*\cs51 \additive \f1 \sbasedon10 Filename;}{
+\s52\fi-284\li1135\ri1134\nowidctlpar\widctlpar{\*\pn \pnlvlblt\ilvl10\ls2047\pnrnot0\pnf3\pnstart1\pnindent283\pnhang{\pntxtb \'b7}}\ls2047\ilvl10\adjustright \fs20\lang2057 \sbasedon0 \snext52 \sautoupd List Bullet 2;}{\*\cs53 \additive \b \sbasedon10 
+Glossary Definition;}{\*\cs54 \additive \i \sbasedon10 Document Name;}{\s55\keep\keepn\nowidctlpar\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\adjustright \f47\fs20\lang2057 \sbasedon0 \snext0 Prototype;}{\*\cs56 
+\additive \scaps \sbasedon10 Key Name;}{\s57\nowidctlpar\widctlpar\tx567\tx1134\tx1701\tx2268\tx2835\tx3402\tx3969\tx4536\tx5103\tx5670\adjustright \f47\fs16\lang2057 \sbasedon0 \snext57 Reduced Code;}{\s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt
+\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 \sbasedon0 \snext0 Syntax;}{\s59\qc\sb240\sa240\keepn\nowidctlpar\widctlpar\adjustright \b\f1\fs20\lang2057 \sbasedon0 \snext59 Picture Title;}{
+\s60\fi-3119\li3119\nowidctlpar\widctlpar\tx3119\adjustright \fs20\lang2057 \sbasedon0 \snext60 Member List;}{\*\cs61 \additive \i \sbasedon10 Syntax Element;}{\*\cs62 \additive \b\f47 \sbasedon10 Syntax Literal;}{\s63\nowidctlpar\widctlpar\adjustright 
+\fs20\lang2057 \sbasedon0 \snext63 annotation text;}{\*\cs64 \additive \b\f1\uld\cf11 \sbasedon10 Example Link;}{\s65\nowidctlpar\widctlpar\adjustright \b\f1\fs36\lang2057 \sbasedon0 \snext65 TOC 0;}{\*\cs66 \additive \f47\cf2\lang2057 \sbasedon16 
+Resource Code;}{\s67\nowidctlpar\widctlpar\adjustright \f1\fs20\cf6\lang2057 \sbasedon0 \snext67 Converter Directive;}{\s68\nowidctlpar\widctlpar\adjustright \b\f47\fs20\uldb\lang2057 \sbasedon0 \snext0 Platform Dependency;}{\*\cs69 \additive \b\cf10 
+\sbasedon10 Raw HTML;}{\*\cs70 \additive \i\cf14 \sbasedon10 URL Reference;}{\s71\nowidctlpar\widctlpar\adjustright \f1\fs20\ul\cf13\lang2057 \sbasedon0 \snext0 Hypertext Anchor;}{\s72\nowidctlpar\widctlpar\brdrr\brdrs\brdrw45\brsp20 \adjustright 
+\fs20\lang2057 \sbasedon0 \snext72 Member Definition;}{\s73\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 \sbasedon0 \snext73 Figure Picture;}{\s74\nowidctlpar\widctlpar\brdrl
+\brdrs\brdrw30\brsp80 \adjustright \fs20\cf5\lang2057 \sbasedon46 \snext74 Comment;}{\s75\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \b\fs20\lang2057 \sbasedon0 \snext75 Figure Caption;}{
+\s76\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 \sbasedon0 \snext76 Figure Description;}{\s77\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb
+\brdrs\brdrw15\brsp20 \adjustright \fs20\cf6\lang2057 \sbasedon73 \snext77 Figure Status;}{\s78\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \f1\fs20\ul\cf13\lang2057 \sbasedon0 \snext78 
+Figure Anchor;}{\*\cs79 \additive \f1\uld\cf12 \sbasedon37 Figure Link;}{\s80\li567\ri567\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \i\fs20\cf10\lang2057 \sbasedon73 \snext80 Figure Directive;}{
+\s81\nowidctlpar\widctlpar\adjustright \fs20\lang2057 \sbasedon0 \snext81 Body Text;}}{\*\listtable{\list\listtemplateid1552041858\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 \fi-360\li643\jclisttab\tx643 }{\listname ;}\listid-125}{\list\listtemplateid2124740982\listsimple{\listlevel\levelnfc0\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext
+\'02\'00.;}{\levelnumbers\'01;}\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-120}{\list\listtemplateid333883178\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}
+\f3\fbias0 \fi-360\li360\jclisttab\tx360 }{\listname ;}\listid-119}{\list\listtemplateid67698689\listsimple{\listlevel\levelnfc23\leveljc0\levelfollow0\levelstartat1\levelspace0\levelindent0{\leveltext\'01\u-3913 ?;}{\levelnumbers;}\f3\fbias0 
+\fi-360\li360\jclisttab\tx360 }{\listname ;}\listid1325275661}}{\*\listoverridetable{\listoverride\listid-119\listoverridecount0\ls1}{\listoverride\listid-120\listoverridecount0\ls2}{\listoverride\listid-125\listoverridecount0\ls3}
+{\listoverride\listid-119\listoverridecount0\ls4}{\listoverride\listid-120\listoverridecount0\ls5}{\listoverride\listid-125\listoverridecount0\ls6}{\listoverride\listid-119\listoverridecount0\ls7}{\listoverride\listid-120\listoverridecount0\ls8}
+{\listoverride\listid-125\listoverridecount0\ls9}{\listoverride\listid1325275661\listoverridecount0\ls10}}{\info{\title Tools}{\subject Specifying projects with makmake}{\author Preferred Customer}
+{\doccomm The model chapter document.\'0d\'0dHeaders & footers are different for even and odd pages.}{\operator Alastair Bradley}{\creatim\yr2000\mo11\dy8\hr19\min40}{\revtim\yr2000\mo11\dy14\hr14\min25}{\printim\yr1997\mo4\dy18\hr15\min6}{\version6}
+{\edmins72}{\nofpages2}{\nofwords505}{\nofchars2883}{\*\company Dell Computer Corporation}{\nofcharsws0}{\vern71}}\paperw11907\paperh16840\margl851\margr851\margt1134\margb1134\gutter1134 
+\widowctrl\ftnbj\aenddoc\linkstyles\hyphcaps0\formshade\viewkind1\viewscale140 \fet0\sectd \binfsxn1\binsxn1\psz9\linex576\headery709\footery709\colsx709\endnhere\sectdefaultcl {\header \pard\plain \s39\nowidctlpar\widctlpar
+\tqc\tx4536\tqr\tx9072\adjustright \fs18\lang2057 {\field{\*\fldinst { TITLE  \\* MERGEFORMAT }}{\fldrslt {Tools}}}{\tab Company Confidential\tab EON SDK, Copyright \'a9 1999, Symbian Ltd
+\par }}{\footer \pard\plain \s42\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \tqc\tx4536\tqr\tx9072\adjustright \fs18\lang2057 {\field{\*\fldinst { SUBJECT  \\* MERGEFORMAT }}{\fldrslt {Specifying projects with makmake}}}{\tab Page }{\field{\*\fldinst {
+ PAGE  \\* MERGEFORMAT }}{\fldrslt {\lang1024 2}}}{\tab Last saved }{\field{\*\fldinst { SAVEDATE  \\* MERGEFORMAT }}{\fldrslt {\lang1024 14/11/00 13:40}}}{
+\par }}{\*\pnseclvl1\pnucrm\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl2\pnucltr\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl3\pndec\pnstart1\pnindent720\pnhang{\pntxta ?}}{\*\pnseclvl4\pnlcltr\pnstart1\pnindent720\pnhang{\pntxta ?}}
+{\*\pnseclvl5\pndec\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl6\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl7\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl8
+\pnlcltr\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}{\*\pnseclvl9\pnlcrm\pnstart1\pnindent720\pnhang{\pntxtb ?}{\pntxta ?}}\pard\plain \s1\sb360\sa240\keepn\pagebb\nowidctlpar\widctlpar\outlinelevel0\adjustright \b\f1\fs40\lang2057\kerning28 
+{\field\fldedit{\*\fldinst { SUBJECT  \\* MERGEFORMAT }}{\fldrslt {Specifying builds with metabld}}}{
+\par }\pard\plain \s71\nowidctlpar\widctlpar\adjustright \f1\fs20\ul\cf13\lang2057 {tools.metabld
+\par }\pard\plain \s74\nowidctlpar\widctlpar\brdrl\brdrs\brdrw30\brsp80 \adjustright \fs20\cf5\lang2057 {this chapter documents }{\cs51\f1 metabld}{ to e32toolp release 222 level.
+\par }\pard\plain \s2\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\outlinelevel1\adjustright \b\f1\fs34\lang2057 {Overview
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {The }{\cs51\f1 metabld}{ tool can be used to carry out a set of commands, usually }{\cs51\f1 abld}{ commands, across several components. 
+\par }\pard\plain \s3\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\outlinelevel2\adjustright \b\f1\fs28\lang2057 {Metabld Invocation syntax
+\par }\pard\plain \s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 {\cs62\b\f47 metabld}{ [ }{\cs61\i metabld config file }{] [ }{\cs61\i command }{]
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {
+\par where
+\par }\trowd \trgaph108\trleft-108 \clvertalt\cltxlrtb \cellx2268\clvertalt\cltxlrtb \cellx9179\pard \nowidctlpar\widctlpar\intbl\adjustright {\cs61\i metabld config file}{\cell is a file which can optionally be used to control metabld\cell }\pard 
+\nowidctlpar\widctlpar\intbl\adjustright {\row }\trowd \trgaph108\trleft-108 \clvertalt\cltxlrtb \cellx2268\clvertalt\cltxlrtb \cellx9179\pard \nowidctlpar\widctlpar\intbl\adjustright {\cs61\i command\cell }{
+is an optional command which will be passed on to }{\cs51\f1 abld}{ for the relevant directories\cell }\pard \nowidctlpar\widctlpar\intbl\adjustright {\row }\pard \nowidctlpar\widctlpar\adjustright {\cs51 Type }{\cs51\f1 metabld }{\cs51 
+without any parameters for a brief description of its usage.
+\par }{\cs51\f1 metabld}{\cs51  mostly makes use of two inputs: a set of commands, and a set of directories from which to carry out these commands.  Both these inputs can be specified in a }{\cs51\f1 metabld}{\cs51  configuration (.}{\cs51\f1 mbc}{\cs51 ) f
+ile.  If a command is specified on the }{\cs51\f1 metabld}{\cs51  command-line, then this command will be executed instead of any commands specified with a .}{\cs51\f1 mbc}{\cs51  file.  If no directories are specified with a .}{\cs51\f1 mbc}{\cs51 
+ file, then the current drive will be searched for directories containing a }{\cs51\f1 bldmake}{\cs51  configuration (}{\cs51\f1 bld.inf}{\cs51 ) file, and the specified commands will be carried out from the directories found.  For example, the command 
+\ldblquote }{\cs51\f1 metabld abld export}{\cs51 \rdblquote  will carry out the }{\cs51\f1 abld export}{\cs51  command from each of the directories containing a }{\cs51\f1 bld.inf}{\cs51  file on the current drive.
+\par metabld configuration files can be specified on the metabld command-line in one of two ways:
+\par {\pntext\pard\plain\cs51\f3\fs20\lang2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li495\nowidctlpar\widctlpar\jclisttab\tx495{\*\pn \pnlvlblt\ilvl0\ls10\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls10\adjustright {\cs51 
+The base of the filename without a path can be specified when the file is in the directory specified by the EPOCROOT environment variable.  }{\cs51\f1 metabld}{\cs51  always checks whether the first argument in it\rquote 
+s command line is the base-name of a file in the EPOCROOT directory.
+\par {\pntext\pard\plain\cs51\f3\fs20\lang2057 \loch\af3\dbch\af0\hich\f3 \'b7\tab}}\pard \fi-360\li495\nowidctlpar\widctlpar\jclisttab\tx495{\*\pn \pnlvlblt\ilvl0\ls10\pnrnot0\pnf3\pnstart1\pnindent360\pnhang{\pntxtb \'b7}}\ls10\adjustright {\cs51 
+The filename can be specified in full with either an absolute path or a path relative to the current directory (the inclusion of the .}{\cs51\f1 mbc}{\cs51  extension is essential in this case).
+\par }\pard\plain \s2\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\outlinelevel1\adjustright \b\f1\fs34\lang2057 {Structure of metabld configuration files
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {A }{\cs51\f1 metabld }{\cs51 configuration }{\cs51\f1 .mbc}{ }{\cs51 file}{ has the form
+\par }\pard\plain \s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 {\cs61\i wholefile}{ :\line \tab }{\cs61\i section-header\line \tab \tab section-data\line sections}{ :\line |\tab 
+}{\cs61\i section_commands}{\line |\tab }{\cs61\i section_dirs}{\line 
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {Each section header can appear any number of times in the file.  The section headers and their data are case-insensitive.
+\par }{\b Note:}{ a trailing backslash is used to indicate a line continuation.
+\par Use the C++ style comment syntax for comments.  Since the files are preprocessed, they can #include other configuration files.  For this reason duplicate directories in the files are ignored.
+\par }\pard\plain \s3\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\outlinelevel2\adjustright \b\f1\fs28\lang2057 {Specifying commands
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {In the }{\cs62\b\f47 section_commands}{ section, list the commands to be carried out.
+\par }\pard\plain \s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 {\cs61\i section_commands}{ :\line \tab }{\cs61\i <command_1>\line \tab <command_2>\line \tab <command_3>\line 
+\tab \'85\line \tab <command_n>}{
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {Each of the commands specified is carried out in the order specified.  If several directories are specified in the }{\i section_dirs}{
+ section, then each command is carried out from each directory in turn before the next command is carried out.  Commands not to be carried out from each directory in turn can be carried out on a one-off basis by specifying them with the }{\f1 oneoff}{
+ keyword in the section_}{\i commands}{ section:}{\i 
+\par }\pard\plain \s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 {\cs61\f1 oneoff}{\cs61\i  <start_directory> <command>}{
+\par }\pard\plain \s29\nowidctlpar\widctlpar\adjustright \fs20\lang2057 {The start directory can be absolute (begin with a backslash) or relative to the configuration file directory.  It can be just \ldblquote .\rdblquote .
+\par }\pard\plain \s3\sb120\keepn\nowidctlpar\widctlpar\brdrt\brdrs\brdrw30\brsp20 \tqr\tx9072\outlinelevel2\adjustright \b\f1\fs28\lang2057 {Specifying directories
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {In the }{\cs62\b\f47 section_dirs}{ section, list the directories in which to carry out the commands.
+\par }\pard\plain \s58\li851\ri851\keep\nowidctlpar\widctlpar\brdrt\brdrs\brdrw15\brsp20 \brdrb\brdrs\brdrw15\brsp20 \adjustright \fs20\lang2057 {\cs61\i section_dirs}{ :\line \tab }{\cs61\i  <start_directory_1>\line \tab <start_directory_2>\line \tab 
+<start_directory_3>
+\par }{\tab }{\cs61\i  \'85\line }{\tab }{\cs61\i  <start_directory_n>}{
+\par }\pard\plain \nowidctlpar\widctlpar\adjustright \fs20\lang2057 {Directories can be relative to the configuration file or absolute, but they mustn\rquote t begin with a drive letter.  They must not end in a backslash either, as this will b
+e interpreted as a line continuation by the pre-processor.
+\par }\pard\plain \s29\nowidctlpar\widctlpar\adjustright \fs20\lang2057 {
+\par }}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/mmp_notes.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,36 @@
+ResourceRef
+	Source =>	full path to source file
+	Lang =>		language code to use when compiling this resource
+	Uids =>		uids for this resource file (if any)
+	Hdr =>		anything, indicating that a resource header file is required
+	BaseTrg =>	base of target name
+	TrgPath =>	target path in the emulated filesystem
+	
+	Trg =>		target name for this resource, in the form name.Rxx to match LANG
+
+Notes;
+TrgPath is filled in at the end for any resource which lacks one
+If Lang is not specified, copies of this ResourceRef are made for each of the 
+languages specified in the LANG statement.
+Trg is constructed from the TrgPath, BaseTrg and Lang information.
+
+
+BitmapRef
+	Source =>	list of bitmap source references, each of the form
+		Src =>		full path of BMP file
+		ClDepth =>	colour depth as specified in MMP file
+	TrgPath =>	target path in the emulated filesystem
+	Trg =>		target name for this bitmap as specified in the MMP file
+	Hdr =>		anything, indicating that a bitmap header should be generated
+
+AifRef
+	Trg =>		target name as specified in the MMP file. Defect: may include directory
+	Dir =>		source path
+	Resrc =>	resource file name relative to source path
+	ClDepth =>	colour depth to apply to bitmap files (design defect!)
+	BitMaps =>	list of bitmap files
+
+SourceRef
+	SrcPath => full path to source file
+	CurFile => full source file name
+	BaseTrg => base of source file name
Binary file sbsv1/abld/doc/rcomp.doc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/doc/zephyr_buildrom_changes.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+Zephyr/Cedar BUILDROM
+2003/09/03
+
+BUILDROM has been extended to support the building of 'mostly-thumb' ROMs and mixed ROMs.
+
+1. Mostly Thumb ROMs.
+
+In Cedar for Zephyr BUILDROM supports the following macros for
+specifying which build to construct the ROM from:
+	   _ARM4 - The ARM4 build (eventually this will be removed)
+	   _ARM4T - The 'mostly-thumb' ARM4T.
+
+2. Mixed ROMs
+
+Mixed ROMs have a kernel built for a different ABI than that targeted
+by user-side code. In practice this means an EABI kernel and GCC98r2
+user-side code. By default BUILDROM use the same ABI for the kernel as
+specified for user-side code (i.e. one of ARM4 or ARM4T). The default
+kernel ABI can be overriden by supplying the appropriate value for
+_KABI in BUILDROM's commandline e.g. -D_KABI=ARMV5.
+
+The following example builds a 'mostly thumb' techview ROM with an
+EABI kernel compiled specifically for XScale:
+
+     buildrom lubbock -D_ARM4T -D_KABI=XSCALE -o\epoc32\techview.arm4t.xscale.img \epoc32\rom\include\techview
+
+The above example shows that the EABI kernel does not have to be the
+default ARMV5 build. BUILDROM supports customizations of the default
+ARMV5 build. It is also worth noting that the XScale build does not
+have to be complete. If BUILDROM cannot find an XScale file it will
+look for the equivalent file from the build that has been
+customized. Currently this will always be ARMV5, since this is the
+only build that supports customization at this time.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/_secure_E32Env.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,65 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# E32ENV.PM
+# Contains information for makmake and associated e32tools perl programs
+# within the Epoc32 Environment
+# 
+#
+
+package E32env;
+
+
+use vars qw(%Data);
+
+BEGIN {
+	my $epocroot = $ENV{EPOCROOT};
+	die "ERROR: Must set the EPOCROOT environment variable\n" if (!defined($epocroot));
+	$epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+	$epocroot =~ s/^ +//;
+	$epocroot =~ s/ +$//;
+	$ENV{EPOCROOT} = $epocroot;
+	die "ERROR: EPOCROOT must not include a drive letter\n" if ($epocroot =~ /^.:/);
+	die "ERROR: EPOCROOT must be an absolute path without a drive letter\n" if ($epocroot !~ /^\\/);
+	die "ERROR: EPOCROOT must not be a UNC path\n" if ($epocroot =~ /^\\\\/);
+	die "ERROR: EPOCROOT must end with a backslash\n" if ($epocroot !~ /\\$/);
+ 	open PIPE, "set EPOCROOT |";
+ 	my $found=0;
+	while (<PIPE>) {
+		if (/^EPOCROOT=.*/) {
+			$found=1;
+			last;
+		}
+	}
+	close PIPE;
+	die "EPOCROOT environment variable must be capitalised\n" if (!$found);
+	print "WARNING: EPOCROOT does not specify an existing directory\n" if (!-d $epocroot);
+
+	$epocroot=~ s-\\$--;		# chop trailing \\
+
+	$Data{EPOCPath} = $epocroot."\\epoc32\\";
+
+	$Data{EPOCDataPath} = $epocroot."\\epoc32\\data\\";
+	$Data{EPOCIncPath} = $epocroot."\\epoc32\\include\\";
+	$Data{BldPath} = $epocroot."\\EPOC32\\BUILD\\";
+	$Data{LinkPath} = $epocroot."\\epoc32\\release\\";
+	$Data{RelPath} = $epocroot."\\epoc32\\release\\";
+	$Data{EPOCToolsPath} = $epocroot."\\epoc32\\tools\\";
+	$Data{RomPath} = $epocroot."\\epoc32\\rom\\";
+
+	$Data{DataPath} = "z\\system\\data\\";
+	
+	$Data{SecurePlatform} = 1;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/armasm2as.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,453 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# e32toolp\e32util\armasm2as.pl
+# Convert an ARMASM assembler source or include file to AS format
+# Syntax:
+# perl armasm2as.pl <input> <output>
+# 
+#
+
+if (scalar(@ARGV)!=2) {
+	die "perl armasm2as.pl <input> <output>\n";
+}
+my ($infile, $outfile) = @ARGV;
+open IN, $infile or die "Can't open $infile for input\n";
+my $gccfile;
+my @input;
+while (<IN>) {
+	push @input, $_;
+	next if defined($gccfile);
+	next if (/^\s*$/);
+	if (/^\s*\@/) {
+		$gccfile = 1;	# If first non-blank line starts with @, assume already in GCC format
+	} else {
+		$gccfile = 0;
+	}
+}
+close IN;
+my @output;
+my $outref = \@output;
+if ($gccfile) {
+	$outref = \@input;
+} else {
+	process(\@input, \@output);
+}
+open OUT, ">$outfile" or die "Can't open $outfile for write\n";
+print OUT @$outref;
+close OUT;
+
+
+
+sub process($$) {
+	my $level=0;
+	my @block;
+	my ($inref, $outref) = @_;
+	foreach $line (@$inref) {
+		$line=~s/\s*$//;
+		my $comment;
+		if ($line =~ /\;(.*)$/o) {
+			$comment = $1;
+			$line =~ s/\;(.*)$//o;
+			if ($line =~ /^\s*$/o and $level==0) {
+				push @$outref, "$line\@$comment\n";
+				next;
+			}
+			$comment = "\t\@$comment";
+		}
+		if ($line =~ /^\s+PRESERVE8/) {
+			next;
+		}
+		if ($level == 1) {
+			if ($line =~ /^\s+MEND/i) {
+				process_macro(\@block, $outref);
+				$level = 0;
+			} else {
+				push @block, $line;
+			}
+			next;
+		} elsif ($level == 0) {
+			if ($line =~ /^\s+MACRO\s*$/i) {
+				@block = ();
+				$level = 1;
+				next;
+			}
+		}
+		if ($line =~ /^\s+GBLL\s+(\S+)/i) {
+			push @$outref, "\t.set\t$1, 0$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+GBLA\s+(\S+)/i) {
+			push @$outref, "\t.set\t$1, 0$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+INCLUDE\s+(\S+)/i) {
+			my $arg = $1;
+			if ($arg =~ /(\w+)\.inc/io) {
+				$arg = $1.'.ginc';
+			}
+			push @$outref, "\t.include\t\"$arg\"$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+IMPORT\s+(\S+)/i) {
+			push @$outref, "\t.extern\t$1$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+EXPORT\s+(\S+)/i) {
+			push @$outref, "\t.global\t$1$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+ELSE/i or $line =~ /^\s+\|/i ) {
+			push @$outref, "\t.else$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+ENDIF/i or $line =~ /^\s+\]/i) {
+			push @$outref, "\t.endif$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+LTORG/i) {
+			push @$outref, "\t.ltorg$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+END$/i) {
+			next;
+		}
+		if ($line =~ /^\s+\!\s*(\d+)\,\s*(.*?)$/) {
+			my $msg = $2;
+			push @$outref, "\t.print $msg\n\t.err$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+INIT_LOGICAL_SYMBOL\s+(\w+)(.*?)$/) {
+			process_init_logical_symbol($1, $2, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^\s+INIT_NUMERIC_SYMBOL\s+(\w+)\s*\,\s*(.*?)$/) {
+			process_init_numeric_symbol($1, $2, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^\s+AREA\s+(.*?)$/) {
+			process_area($1, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^\s+\%\s+(.*?)$/) {
+			my $expr = process_numeric_expr($1, $outref);
+			push @$outref, "\t.space $expr$comment\n";
+			next;
+		}
+		if ($line =~ /^\s+ALIGN\s*(.*?)$/) {
+			process_align($1, $outref, $comment);
+			next;
+		}
+
+		# Strip label if there is one
+		my $label;
+		if ($line =~ /^(\S+)\s*(.*?)$/) {
+			$label = $1;
+			$line = $2;
+		} else {
+			$line =~ s/^\s*//;
+		}
+		if ($line =~ /^SETL\s+(\S+)/i) {
+			my $val = $1;
+			my $expr = process_logical_expr($val, $outref);
+			push @$outref, "\t.set\t$label,$expr$comment\n";
+			next;
+		}
+		if ($line =~ /^SETA\s+(.*?)$/i) {
+			my $val = $1;
+			my $expr = process_numeric_expr($val, $outref);
+			push @$outref, "\t.set\t$label,$expr$comment\n";
+			next;
+		}
+		if ($line =~ /^(EQU|\*)\s+(.*?)$/i) {
+			my $val = $2;
+			my $expr = process_numeric_expr($val, $outref);
+			push @$outref, "\t.equ\t$label,$expr$comment\n";
+			next;
+		}
+		if ($line =~ /^(if|\[)\s+(.*?)$/i) {
+			my $cond = $2;
+			if ($cond =~ /^\s*(\:LNOT\:)?\s*\:DEF\:\s*(.*?)$/i) {
+				my $n = $1;
+				my $sym = $2;
+				if ($sym =~ /^(\w|\\|\:)+$/) {
+					if (uc($n) eq ':LNOT:') {
+						push @$outref, "\t.ifndef\t$sym$comment\n";
+					} else {
+						push @$outref, "\t.ifdef\t$sym$comment\n";
+					}
+					next;
+				}
+			}
+			my $expr = process_logical_expr($cond, $outref);
+			push @$outref, "\t.if $expr$comment\n";
+			next;
+		}
+		if ($line =~ /^(\=|DCB)\s*(.*?)$/) {
+			process_dcb($label, $2, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^DCW\s*(.*?)$/) {
+			process_dcw($label, $1, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^DCD\s*(.*?)$/) {
+			process_dcd($label, $1, $outref, $comment);
+			next;
+		}
+		if ($line =~ /^ROUT\s*$/) {
+			$line = '';
+		}
+		if ($line =~ /^(\w+)\s+\%(\w+)\s*$/o) {
+			# ARMASM local label reference
+			my $inst = $1;
+			my $llab = $2;
+			if ($llab =~ /F\w?(\d+)/o) {
+				$line = "$inst $1f";
+			} elsif ($llab =~ /B\w?(\d+)/o) {
+				$line = "$inst $1b";
+			} else {
+				die "Can't determine local label direction\n";
+			}
+		}
+		if ($line =~ /^(\w+)\s+(\w+)\s*\,\s*\%(\w+)\s*$/o) {
+			# ARMASM local label reference
+			my $inst = $1;
+			my $op1 = $2;
+			my $llab = $3;
+			if ($llab =~ /F\w?(\d+)/o) {
+				$line = "$inst $op1\, $1f";
+			} elsif ($llab =~ /B\w?(\d+)/o) {
+				$line = "$inst $op1\, $1b";
+			} else {
+				die "Can't determine local label direction\n";
+			}
+		}
+
+		$line = process_numeric_expr($line, $outref);
+		if (defined($label)) {
+			push @$outref, "$label\:\t$line$comment\n";
+		} else {
+			push @$outref, "\t$line$comment\n";
+		}
+	}
+}
+
+
+sub process_macro($$) {
+	my ($inref, $outref) = @_;
+	my $line;
+	while(1) {
+		$line = shift @$inref;
+		last if ($line !~ /^\s*$/);
+	}
+	unless ($line =~ /^\s+(\w+)\s*(.*?)$/) {
+		die "Bad macro - no name\n";
+	}
+	my $macro_name = $1;
+	if ($macro_name eq 'INIT_LOGICAL_SYMBOL' or $macro_name eq 'INIT_NUMERIC_SYMBOL') {
+		return;
+	}
+	$line = $2;
+	my @args = split ( '\s*,\s*', $line );
+	foreach (@args) {
+		die "Bad macro argument name\n" unless (/^\$\w+$/);
+		s/^\$//;
+	}
+	my $ev = '';
+	foreach $arg (@args) {
+		$ev.="s/\\\$$arg(\\W\|\$)/\\\\$arg\$1/go;";
+	}
+	foreach (@$inref) {
+		eval $ev;
+	}
+	push @$outref, "\t.macro $macro_name ".join(',',@args)."\n";
+	process($inref, $outref);
+	push @$outref, "\t.endm\n";
+}
+
+
+sub process_logical_expr($$) {
+	my ($val, $outref) = @_;
+	$val = process_numeric_expr($val, $outref);
+	$val =~ s/\<\=/________LE________/g;	# protect <= and >= during expansion of =
+	$val =~ s/\>\=/________GE________/g;
+	$val =~ s/\=/\=\=/g;					# equality operator is = on ARMASM, == on AS
+	$val =~ s/________LE________/\<\=/g;
+	$val =~ s/________GE________/\>\=/g;
+	$val =~ s/\{TRUE\}/(1)/g;
+	$val =~ s/\{FALSE\}/(0)/g;
+
+	my @lops = split( /(\s*\:LAND\:\s*|\s*\:LOR\:\s*|\s*\:LNOT\:\s*|\s*\:DEF\:\s*)/, $val );
+	foreach (@lops) {
+		s/\s*\:LAND\:\s*/\:LAND\:/go;
+		s/\s*\:LOR\:\s*/\:LOR\:/go;
+		s/\s*\:LNOT\:\s*/\:LNOT\:/go;
+		s/\s*\:DEF\:\s*/\:DEF\:/go;
+	}
+	my @lops2;
+	while (scalar (@lops)) {
+		my $x = shift @lops;
+		if ($x eq ':DEF:') {
+			my $sym = shift @lops;
+			$sym =~ s/^\s*//;
+			$sym =~ s/\s*$//;
+			if ($sym =~ /^(\w|\$|\\)+$/) {
+				push @$outref, "\t.ifdef $sym\n\t.set __defined__$sym, 1\n\t.else\n\t.set __defined__$sym, 0\n\t.endif\n";
+				push @lops2, " __defined__$sym ";
+			} else {
+				die "Bad :DEF: operand\n";
+			}
+		} elsif ($x eq ':LAND:') {
+			push @lops2, ' && ';
+		} elsif ($x eq ':LOR:') {
+			push @lops2, ' || ';
+		} else {
+			push @lops2, $x;
+		}
+	}
+	my @lops3;
+	while (scalar (@lops2)) {
+		my $x = shift @lops2;
+		if ($x eq ':LNOT:') {
+			my $operand;
+			while (1) {
+				$operand = shift @lops2;
+				last if ($operand !~ /^\s*$/);
+			}
+			push @lops3, "(0==($operand))";
+		} else {
+			push @lops3, $x;
+		}
+	}
+	return join('',@lops3);
+}
+
+sub process_numeric_expr($$) {
+	my ($val, $outref) = @_;
+	$val =~ s/\&/0x/g;			# ARMASM accepts hex numbers starting with & or 0x, AS only accepts 0x
+	$val =~ s/(\W|^)2_([0|1]+)(\W|$)/$1 0b$2$3/g;	# Binary numbers start with 2_ on ARMASM, 0b on AS
+	$val =~ s/\:AND\:/\&/g;
+	$val =~ s/\:OR\:/\|/g;
+	$val =~ s/\:SHL\:/\<\</g;
+	$val =~ s/\:SHR\:/\>\>/g;
+	return $val;
+}
+
+sub process_init_logical_symbol($$$$) {
+	my ($name, $rest, $outref, $comment) = @_;
+	my $counter;
+	if ($rest =~ /^\s*\,\s*(\w+)\s*$/) {
+		$counter = $1;
+	} elsif ($rest !~ /^\s*$/) {
+		die "Bad INIT_LOGICAL_SYMBOL\n";
+	}
+	push @$outref, "\t.ifndef $name$comment\n\t.set $name, 0\n\t.else\n\t.set $name, 1\n";
+	if ($counter) {
+		push @$outref, "\t.set $counter, $counter \+ 1\n";
+	}
+	push @$outref, "\t.endif\n";
+}
+
+sub process_init_numeric_symbol($$$$) {
+	my ($name, $value, $outref, $comment) = @_;
+	my $expr = process_numeric_expr($value, $outref);
+	push @$outref, "\t.ifndef $name$comment\n\t.set $name, $expr\n\t.endif\n";
+}
+
+sub process_area($$$) {
+	my ($line, $outref, $comment) = @_;
+	my @args = split(',',$line);
+	my $align = 0;
+	foreach (@args) {
+		if (/^\s*ALIGN\s*\=\s*(\d+)\s*$/) {
+			$align = $1;
+		}
+	}
+	push @$outref, "\t.text$comment\n\t.p2align $align\n";
+}
+
+sub process_align($$$) {
+	my ($line, $outref, $comment) = @_;
+	if ($line =~ /^\s*$/o) {
+		push @$outref, "\t.align$comment\n";
+	} else {
+		push @$outref, "\t.balign $line$comment\n";
+	}
+}
+
+sub process_dcb($$$$) {
+	my ($label, $args, $outref, $comment) = @_;
+	if (defined($label)) {
+		push @$outref, "$label\:";
+	}
+	while ($args !~ /^\s*$/) {
+		my $arg;
+		$args =~ s/^\s*//;
+		if ($args =~ /^\"/) {
+			$args =~ s/\\\"/________ESCAPED_QUOTE________/go;
+			$args =~ /\"(.*?)\"\s*(.*?)$/o or die "Unterminated string literal\n";
+			$arg = $1;
+			$args = $2;
+			$arg =~ s/________ESCAPED_QUOTE________/\\\"/go;
+			push @$outref, "\t.ascii \"$arg\"$comment\n";
+			undef $comment;
+			last if ($args !~ /\s*\,(.*?)$/o);
+			$args = $1;
+		} else {
+			$args =~ /(.*?)\s*(\,|$)(.*?)$/o;
+			$arg = $1;
+			$args = $3;
+			my $expr = process_numeric_expr($arg, $outref);
+			push @$outref, "\t.byte $expr$comment\n";
+			undef $comment;
+		}
+	}
+}
+
+sub process_dcw($$$$) {
+	my ($label, $args, $outref, $comment) = @_;
+	if (defined($label)) {
+		push @$outref, "$label\:";
+	}
+	while ($args !~ /^\s*$/) {
+		my $arg;
+		$args =~ s/^\s*//;
+		$args =~ /(.*?)\s*(\,|$)(.*?)$/o;
+		$arg = $1;
+		$args = $3;
+		my $expr = process_numeric_expr($arg, $outref);
+		push @$outref, "\t.hword $expr$comment\n";
+		undef $comment;
+	}
+}
+
+sub process_dcd($$$$) {
+	my ($label, $args, $outref, $comment) = @_;
+	if (defined($label)) {
+		push @$outref, "$label\:";
+	}
+	while ($args !~ /^\s*$/) {
+		my $arg;
+		$args =~ s/^\s*//;
+		$args =~ /(.*?)\s*(\,|$)(.*?)$/o;
+		$arg = $1;
+		$args = $3;
+		my $expr = process_numeric_expr($arg, $outref);
+		push @$outref, "\t.word $expr$comment\n";
+		undef $comment;
+	}
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/checkgcc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,99 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# module for checking gcc is set up correctly
+# 
+#
+
+package CheckGcc;
+
+use Preprocessor;
+
+
+sub CheckGcc_Default()
+{
+ 	# die if CPP.EXE (or whatever) in a dodgy place in the path
+	my $pbp = $ENV{PBUILDPID};
+	my @Paths=split ';', $ENV{Path};
+	unshift @Paths,'.';	# add the current directory
+	foreach (@Paths) {
+		s-/-\\-go;	# for those working with UNIX shells
+		s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+		if ((-e $_.'CPP.EXE') or (-e $_.'CPP.BAT') or (-e $_.'CPP.CMD')) {
+			unless (/\\GCC(\w\w)?\\BIN\\$/i) {
+				unless (lc($1) eq lc($pbp)) {
+					die
+						"ERROR: First CPP executable found in path is in $_,\n",
+						"but the required CPP.EXE was expected to be found in a directory\n",
+						"with a name ending in \\GCC$pbp\\BIN\\, where the Cygnus tools\n",
+						"this program depends upon are stored.\n",
+						"Is your path set up correctly?\n"
+					;
+				}
+			}
+			return;
+		}
+	}
+	die "ERROR: CPP executable not found in path\n";
+}
+
+sub CheckGcc_Generic()
+{
+	# die if CPP.EXE (or whatever pre processor) in a dodgy place in the path
+
+	my @Paths=split ';', $ENV{Path};
+	unshift @Paths,'.';	# add the current directory
+
+	my $exe = &PreprocessorToUseExe();
+	my $path = &PreprocessorToUsePath();
+	
+	foreach (@Paths) {
+		s-/-\\-go;	# for those working with UNIX shells
+		s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+		s-$-$path-;	# add in the path relative to gcc\bin.
+		if ((-e $_.$exe.'.EXE') or (-e $_.$exe.'.BAT') or (-e $_.$exe.'.CMD')) {
+			unless (/\\EPOC32\\TOOLS\\\Q$path\E$/i) {
+				die
+					"ERROR: First $exe executable found in path is in $_,\n",
+					"but the required $exe.EXE was expected to be found in a directory\n",
+					"with a name ending in \\EPOC32\\TOOLS\\$path, where the tools\n",
+					"this program depends upon are stored.\n",
+					"Is your path set up correctly?\n"
+				;
+			}
+			return;
+		}
+	}
+	die "ERROR: $exe executable not found in path\n";
+
+}
+BEGIN {
+	my $preprocessor_to_use = &PreprocessorToUseId();
+	
+	if ( $preprocessor_to_use eq "DEFAULT" )
+	{
+		&CheckGcc_Default();	# pre processor & cpp same. 
+	}
+	elsif ( $preprocessor_to_use eq "MINGW_NO_CYGWIN" )
+	{
+		&CheckGcc_Generic();	# check for preprocessor.
+	}
+	else
+	{
+		die("CHECKGCC.PM :  error should never happen\n");
+	}
+}
+
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/checksource.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,170 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Front-end to routines checking that source matches filename policy constraints
+# 
+#
+
+use FindBin;
+use Cwd;
+use Getopt::Long qw(:config posix_default);		#permits "+" in arguments, rather than as an option identifier
+use lib $FindBin::Bin;
+use CheckSource;
+use Pathutl;
+
+my $preprocessCall = "cpp.exe -w -undef -nostdinc -+ -dI";
+
+my $verbose = 0;
+
+my $preprocess = 0;
+my $parsefile = 0;
+my $metadata = 0;
+
+GetOptions ('preprocess|pp' => \$preprocess, 'parsefile|pf' => \$parsefile, 'metadata|md' => \$metadata);
+
+my %warnings;
+
+$verbose = 1 if $ENV{CHECKSOURCE_VERBOSE};
+
+
+if (!@ARGV)
+	{
+	print ("\nchecksource.pl --preprocess|--parsefile|--metadata args\n\n");
+	}
+elsif ($preprocess)
+	{
+	my $PREPROCESSPIPE;
+	open PREPROCESSPIPE,"$preprocessCall @ARGV |" or die "ERROR: Can't invoke preprocessor for checksource processing.\n";
+
+	my %processedIncludes;
+	
+	my %homelessInclude;
+	$homelessInclude{REFERENCE} = "";
+
+	my $lineNumber = 0;
+	my $currentFile = "";
+
+	print "Preprocessing file    : ".$ARGV[scalar(@ARGV)-1]."\n" if ($verbose);
+
+	while (<PREPROCESSPIPE>)
+		{
+		if (/^\s*$/o)
+			{
+			$lineNumber++;
+			next;
+			}	
+		elsif (/^# (\d+) "(.*)"( \d+)?/o)
+			{
+			$lineNumber = scalar $1;
+			$currentFile=$2;
+			$currentFile=~s-\\\\-\\-go;
+			$currentFile=~s-\\\/-\\-go;
+			$currentFile=~s-\/\\-\\-go;
+			$currentFile=~s-\/\/-\\-go;
+			$currentFile=~s/\//\\/g;
+			$currentFile=~s/^\w://;
+			}
+
+		if ($homelessInclude{REFERENCE})
+			{
+			# Resolve #include references using "locating" comments in CPP output.  These may either follow the reference directly,
+			# or may have appeared earlier in prior CPP processing
+			if ($currentFile =~ /$homelessInclude{SEARCH}$/i)
+				{
+				CheckSource_Physical (%warnings, $homelessInclude{SOURCEFILE}, "#include", $homelessInclude{REFERENCE}, $homelessInclude{LINENUMBER}, $currentFile, $verbose);
+				$processedIncludes{lc($currentFile)} = 1;
+				}
+			else
+				{
+				my @foundProcessedIncludes;
+				foreach my $processedInclude (keys %processedIncludes)
+					{
+					push @foundProcessedIncludes, $processedInclude if ($processedInclude =~ /$homelessInclude{SEARCH}$/i);
+					}
+		
+				if (@foundProcessedIncludes == 1)
+					{
+					CheckSource_Physical  (%warnings, $homelessInclude{SOURCEFILE}, "#include", $homelessInclude{REFERENCE}, $homelessInclude{LINENUMBER}, $foundProcessedIncludes[0], $verbose);
+					}
+				elsif ((@foundProcessedIncludes > 1) && $verbose)
+					{
+					print ("WARNING: Multiple matches for #include reference $homelessInclude{REFERENCE} : $homelessInclude{SOURCEFILE}($homelessInclude{LINENUMBER})\n");
+					print "\t$_\n" foreach (@foundProcessedIncludes);
+					}
+				elsif ($verbose)
+					{
+					print ("WARNING: Couldn't find #include reference $homelessInclude{REFERENCE} : $homelessInclude{SOURCEFILE}($homelessInclude{LINENUMBER})\n");
+					}
+				}
+			$homelessInclude{REFERENCE} = "";
+			}
+
+		if (/^\s*#include\s*[\"|\<]{1}(.*)[\"|\>]{1}/)
+			{
+			CheckSource_UnixSlash (%warnings, $currentFile, "#include", $1, $lineNumber, $verbose);
+
+			$homelessInclude{SOURCEFILE} = $currentFile;
+			$homelessInclude{REFERENCE} = $1;
+			$homelessInclude{LINENUMBER} = $lineNumber;
+			$homelessInclude{SEARCH} = "\\".$homelessInclude{REFERENCE};
+			$homelessInclude{SEARCH} =~ s/\//\\/g;
+			$homelessInclude{SEARCH} = quotemeta($homelessInclude{SEARCH});
+			}
+
+		$lineNumber++ if (!/^# (\d+) "(.*)"( \d+)?/o);
+		}
+
+	close PREPROCESSPIPE;
+	}
+elsif ($parsefile)
+	{
+	my $SOURCE_FILE = $ARGV[0];		
+	open SOURCE_FILE, "< $SOURCE_FILE" or die "ERROR: Can't open $SOURCE_FILE for \"-checksource\".\n";
+
+	print "Parsing include file  : $SOURCE_FILE\n" if ($verbose);
+
+	my $lineNumber = 0;
+	
+	while (<SOURCE_FILE>)
+		{
+		$lineNumber++;
+
+		if (/^\s*#include\s*[\"|\<]{1}(.*)[\"|\>]{1}/)
+			{
+			CheckSource_UnixSlash (%warnings, $SOURCE_FILE, "#include", $1, $lineNumber, $verbose);
+			CheckSource_Lowercase (%warnings, $SOURCE_FILE, "#include", $1, $lineNumber, $verbose);
+			}		
+		}
+
+	close SOURCE_FILE;
+	}
+elsif ($metadata)
+	{
+	my ($sourcefile, $item, $reference, $linenumber, $physical, $offset) = @ARGV;
+
+	$physical = 0 if (!$physical);
+	$offset = undef if (!$offset);
+
+	CheckSource_UnixSlash (%warnings, $sourcefile, $item, $reference, $linenumber, $verbose);
+
+	if ($physical)
+		{
+		CheckSource_Physical (%warnings, $sourcefile, $item, $reference, $linenumber, $offset, $verbose);
+		}
+	else
+		{
+		CheckSource_Lowercase (%warnings, $sourcefile, $item, $reference, $linenumber, $verbose);
+		}
+	}
+
+print "$_\n" foreach (keys %warnings);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/checksource.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,471 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Routines involved in checking that source matches various filename policy constraints
+# 
+#
+
+
+package CheckSource;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+# Exported for clarity in calling scripts and modules
+our $CheckSource_PhysicalCheck = 1;
+our $CheckSource_NoUserSystemDistinction = 1;
+
+@EXPORT=qw(
+	CheckSource_MetaData
+	CheckSource_Includes
+	CheckSource_ExportedIncludes
+	CheckSource_MakefileOutput
+	CheckSource_UnixSlash
+	CheckSource_Lowercase
+	CheckSource_Physical
+	$CheckSource_PhysicalCheck
+	$CheckSource_NoUserSystemDistinction
+);
+
+use Cwd;
+use Pathutl;
+use Win32;
+
+my $exclusionsFile = $ENV{EPOCROOT}."epoc32\\tools\\filenamepolicyexclusions.txt";
+
+my $makefileWarningPrefix = "\@echo ";
+my $checksourcePrefix = "\@perl -S checksource.pl";
+my $releaseLocationRoot = quotemeta ($ENV{EPOCROOT}."epoc32");
+
+
+sub CheckSource_MetaData (\%$$$$;$;$)
+	{
+	my ($actionHash, $sourceFile, $item, $reference, $lineNumber, $physical, $offset) = @_;
+
+	return if ($reference =~ /^(\.|\.\.)$/);
+
+	my $checksourceCall = "$checksourcePrefix --metadata \"$sourceFile\" \"$item\" \"$reference\" $lineNumber";
+	$checksourceCall .= " $physical" if ($physical);
+	$checksourceCall .= " \"$offset\"" if ($offset);
+	$$actionHash{$checksourceCall} = 1;
+	}
+
+
+sub CheckSource_UnixSlash (\%$$$$;$)
+	{
+	my ($actionHash, $sourceFile, $item, $reference, $lineNumber, $verbose) = @_;
+
+	$sourceFile =~ s/^[a-zA-Z]{1}://;
+	$item =~ s/PRJ_EXPORTS \(NO DESTINATION\)/PRJ_EXPORTS/;
+
+	print "Checking - Unix slash : $sourceFile ($lineNumber) - $item:$reference\n" if ($verbose);
+
+	if ($reference =~/\\/)
+		{	
+		$$actionHash{constructWarning ($sourceFile, $lineNumber, $item, "Incorrect slash in", $reference)} = 1;
+		}
+	}
+
+
+sub CheckSource_Lowercase (\%$$$;$;$)
+	{
+	my ($actionHash, $sourceFile, $item, $reference, $lineNumber, $verbose) = @_;
+
+	return if ($reference =~ /^[\/|\\]epoc32[\/|\\]tools[\/|\\].*$/);
+
+	$sourceFile =~ s/^[a-zA-Z]{1}://;
+
+	print "Checking - lowercase  : $sourceFile ($lineNumber) - $item:$reference\n" if ($verbose);
+
+	my $exclusion = lowercaseExclusionCheck ($reference);
+
+	if ($exclusion eq "UNLISTED")
+		{
+		if ($reference =~ /[A-Z]/)
+			{			
+			$$actionHash{constructWarning ($sourceFile, $lineNumber, $item, "Incorrect case for epoc32 tree in", $reference)} = 1;
+			}
+		}
+	elsif ($exclusion !~ /(OK|ERROR)/)
+		{
+		$$actionHash{constructWarning($sourceFile, $lineNumber, $item, "Incorrect case versus exclusion list in", $reference, " vs. $exclusion")} = 1;		
+		}
+	}
+
+
+sub CheckSource_Physical (\%$$$$;$;$)
+	{
+	my ($actionHash, $sourceFile, $item, $reference, $lineNumber, $path, $verbose) = @_;
+	
+	print "Checking - physical   : $sourceFile ($lineNumber) - $item:$reference:$path\n" if ($verbose);
+
+	my $physicalCheck;
+	my $searchText;
+
+	my $examineDefaultExportDestination = ($item =~ s/PRJ_EXPORTS \(NO DESTINATION\)/PRJ_EXPORTS/) ? 1 : 0;
+
+	if ($item eq "#include")
+		{
+		# In the case of #includes, the path passed in is already the fully pathed physical file
+		# that needs to be checked (as obtained from the parsed output of CPP)
+		$searchText = $reference;
+		$physicalCheck = $path;
+		}
+	else
+		{
+		my $physicalReference;
+		if (($item =~ /^PRJ_(TEST)?MMPFILES MMP/) && ($reference !~ /\.\w+$/i))
+			{
+			$physicalReference = $reference."\.mmp";
+			$searchText = $reference."\.*";
+			}
+		elsif ($item =~ /^DEFFILE/)
+			{
+			# The full path for DEFFILE entries is always passed in, so we just
+			# need to concentrate on sorting out the oddities for the search
+			# text and then just take the final file bit as the physical
+			# reference
+
+			$searchText = $reference;			
+			$searchText .= "?\.*" if ($reference !~ /(\.def|[\\|\/])$/i);
+			$searchText =~ s/(\.def)/\?$1/i if ($item !~ /NOSTRICTDEF/);
+			$searchText =~ s/\~/\*/;			
+			$physicalReference = $searchText;
+			$physicalReference =~ s/\//\\/g;
+			$physicalReference =~ s/\?/u/;
+			$physicalReference =~ s/\.\w+$/\.def/;
+			$physicalReference = &Path_Split ('File', $physicalReference);			
+			}
+		else
+			{
+			$searchText = $reference;
+			$physicalReference = $searchText;
+			}
+
+		my $physicalLocation;
+		if ($path)
+			{
+			$physicalLocation = $path;
+			}
+		elsif ($reference =~ /^(\\|\/)/)
+			{
+			$physicalLocation = $ENV{EPOCROOT};
+			}
+		elsif ($reference =~ /^\+/)
+			{
+			$physicalLocation = $ENV{EPOCROOT}."epoc32\\";
+			}
+		elsif ($item =~ /EXTENSIONS/)
+			{
+			$physicalLocation = $ENV{EPOCROOT}."epoc32\\tools\\makefile_templates\\";
+			}
+		else
+			{
+			$physicalLocation = &Path_Split ('Path', $sourceFile);
+			}
+		$physicalReference =~ s/^[\\|\/]//;
+		$physicalCheck = $physicalLocation.$physicalReference;
+		}
+
+	$physicalCheck =~ s/\//\\/g;
+	$physicalCheck = &Path_Strip ($physicalCheck);
+
+	# If a file reference is actually under \epoc32, we just need to confirm that it's lowercase
+	if ($physicalCheck =~ /^$releaseLocationRoot/i)
+		{
+		CheckSource_Lowercase (%$actionHash, $sourceFile, $item, $reference, $lineNumber, $verbose);
+		return;
+		}
+
+	# Massage search text to provide something we can compare with a physical check on the filesystem
+	$searchText =~ s/\//\\/g;
+	$searchText =~ s/\.\.\\//g;
+	$searchText =~ s/\.\\//g;
+	$searchText =~ s/\\\\/\\/g;
+
+	my $warningSearchText = $searchText;	# Record a more intelligible version of the search text for warning purposes
+	
+	$searchText = quotemeta ($searchText);
+	$searchText =~ s/\\\*/\\w\+/g;			# * -> \w+
+	$searchText =~ s/\\\?/\\w\{1\}/g;		# ? -> \w{1}
+
+	my $physicalReality = getPhysical ($physicalCheck);
+
+	my $warningSuffix = "";
+
+	if (!$physicalReality)
+		{
+		$$actionHash{constructWarning($sourceFile, $lineNumber, $item, "Can\'t find physical file match for", $reference, " on filesystem")} = 1;
+		}
+	elsif ($physicalReality !~ /^.*$searchText$/)
+		{
+		if ($physicalReality !~ /^.*$searchText$/i)
+			{
+			# Doesn't just differ in case...something's gone wrong
+			$$actionHash{constructWarning($sourceFile, $lineNumber, $item, "Can\'t find physical file match for", $reference, " - match was attempted against $physicalReality")} = 1;		
+			}
+		else
+			{
+			if (($item =~ /^DEFFILE/ || $item =~ /^PRJ_(TEST)?MMPFILES MMP/) && ($reference !~ /$searchText$/))
+				{
+				$warningSuffix .= " (actual test \'$warningSearchText\')"
+				}
+
+			$warningSuffix .= " vs. $physicalReality";
+			$$actionHash{constructWarning($sourceFile, $lineNumber, $item, "Incorrect case versus filesystem in", $reference, $warningSuffix)} = 1;
+			}
+		}
+
+	# Special case - PRJ_EXPORTS source lines with no destination must be normalised via a new destination compliant
+	# with the filename policy.  FIXSOURCE will do this, but it needs a warning to work on
+
+	if ($examineDefaultExportDestination)
+		{
+		$physicalReality =~ /^.*($searchText)$/i;
+		my $defaultExportReference = $1;
+		
+		my $exclusion = lowercaseExclusionCheck ($defaultExportReference);
+
+		if ($defaultExportReference =~ /[A-Z]/)
+			{
+			$$actionHash{constructWarning ($sourceFile, $lineNumber, $item, "Incorrect case for epoc32 tree from default export in", $reference, $warningSuffix)} = 1;
+			}
+		}
+
+	}
+	
+
+sub CheckSource_Includes ($\%$\@;\@;\@;$)
+	{
+	# References are used for array arguments only so that they can be distinguished within the subroutine
+	my ($sourceFile, $actionHash, $preInclude, $macros, $userIncludesRef, $systemIncludesRef, $noUserSystemDistinction) = @_;
+	my (@userIncludes, @systemIncludes);
+
+	@userIncludes = @$userIncludesRef if ($userIncludesRef);
+	@systemIncludes = @$systemIncludesRef if ($systemIncludesRef);
+
+	my $call = "$checksourcePrefix --preprocess -- ";
+
+	if (($sourceFile !~ /\.inf$/i) && ($sourceFile !~ /\.mmp/i))
+		{
+		push @$macros, "__SUPPORT_CPP_EXCEPTIONS__";
+		}
+
+	my $platformPreInclude = "";
+
+	foreach my $macro (@$macros)
+		{
+		$call .= "-D$macro ";
+
+		if ($macro =~ /__ARMCC_2_2__/)
+			{
+			$platformPreInclude = $ENV{EPOCROOT}."epoc32\\include\\rvct2_2\\rvct2_2.h";
+
+			if (($sourceFile =~ /BASE\\E32\\compsupp\\/i) && $ENV{RVCT22INC})
+				{					
+				# Need some way to deal with ARMINC from the front-end...
+				my $rvctIncDir = $ENV{RVCT22INC};
+				push @systemIncludes, $rvctIncDir;
+				}
+			}
+		elsif ($macro =~ /__GCCE__/)
+			{
+			$platformPreInclude = $ENV{EPOCROOT}."epoc32\\include\\GCCE\\GCCE.h";
+
+			my $GCCEinstall = Cl_bpabi::getConfigVariable('COMPILER_INSTALL_PATH');
+			
+			push @systemIncludes, "\"\\\"$GCCEinstall\\..\\lib\\gcc\\arm-none-symbianelf\\3.4.3\\include\\\"\"";
+			}
+		}
+
+	if ($preInclude ne "")
+		{
+		$call .= "-include ".getDrive().$preInclude." ";
+		push @systemIncludes, &Path_Split ('Path', getDrive().$preInclude);
+		}		
+
+	if ($platformPreInclude ne "")
+		{
+		$call .= "-include ".getDrive().$platformPreInclude." ";
+		push @systemIncludes, &Path_Split ('Path', getDrive().$platformPreInclude);
+		}	
+
+	# Enforce user and system includes in checksource processing.
+
+	foreach my $include (@userIncludes)
+		{
+		$include =~ s/\\$//;
+		$include = getDrive().$include if (($include !~ /^[a-zA-Z]:/) && ($include !~ /^[\"|\.]/));
+		$call .= "-I $include ";
+		}
+
+	$call .= "-I- " unless $noUserSystemDistinction;
+
+	foreach my $include (@systemIncludes)
+		{
+		$include =~ s/\\$//;
+		$include = getDrive().$include if (($include !~ /^[a-zA-Z]:/) && ($include !~ /^[\"|\.]/));
+		$call .= "-I $include ";
+		}
+
+	$sourceFile =~ s/\//\\/g;
+	$sourceFile = &Path_Strip ($sourceFile);
+	$sourceFile = getDrive().$sourceFile;
+
+	$call .= $sourceFile;
+
+	$$actionHash{$call} = 1;
+
+	return $call;
+	}
+
+
+sub CheckSource_ExportedIncludes ($$\%)
+	{
+	my ($sourceFile, $destinationFile, $actionHash) = @_;
+
+	# Exclude exported files as appropriate
+	if ($destinationFile)
+		{
+		my $epoc32Include = quotemeta ($ENV{EPOCROOT})."epoc32\\\\include";
+		return if ($destinationFile !~ /^$epoc32Include/i);
+		return if ($destinationFile =~ /\.def$/i);
+		}
+
+	$$actionHash{"$checksourcePrefix --parsefile -- $sourceFile"} = 1;
+	}
+
+
+sub CheckSource_MakefileOutput(%)
+	{
+	my (%actionHash) = @_;
+
+	return "\t\@rem\n" if !(keys (%actionHash));
+
+	my $output = "";
+
+	foreach (keys (%actionHash))
+		{
+		$output .= "\t$_\n";
+		}
+
+	return $output;
+	}
+	
+
+sub getDrive
+	{
+    if(cwd =~ /^([a-zA-Z]:)/)
+    	{
+		return $1;
+    	}
+
+	return "";
+	}
+
+
+sub getPhysical ($)
+	{
+	my ($physicalReference) = @_;
+	
+	my $physicalReality = Win32::GetLongPathName($physicalReference);
+
+	if ($physicalReality)
+		{			
+		$physicalReality =~ s/^.*://;
+		$physicalReality = &Path_Strip ($physicalReality);		
+		}
+
+	return $physicalReality;
+	}
+
+
+sub constructWarning ($$$$$;$)
+	{
+	my ($sourceFile, $lineNumber, $item, $warningText, $reference, $suffix) = @_;
+
+	$sourceFile =~ s/\//\\/g;
+	$sourceFile = Win32::GetLongPathName($sourceFile);
+	$sourceFile =~ s/^[a-zA-Z]{1}://;
+	$sourceFile = &Path_Strip ($sourceFile);
+
+	my $warning = "";
+	$warning .= $sourceFile.":".$lineNumber.": ".$warningText." $item - \'".$reference."\'";
+	$warning .= $suffix if ($suffix);
+	$warning .= ".";		
+
+	return $warning;
+	}
+
+
+sub lowercaseExclusionCheck ($)
+	{
+	my ($reference) = @_;
+
+	# An exclusions file isn't mandatory
+	return "UNLISTED" if (! -e $exclusionsFile);
+
+	my $EXCLUSIONS;
+
+	if (!(open EXCLUSIONS, "< $exclusionsFile"))
+			{
+			print ("ERROR: Can't open $exclusionsFile in checksource processing.\n");
+			return "ERROR";
+			}
+
+	my $referenceDOSSlash = $reference;
+	$referenceDOSSlash =~ s/\//\\/g;
+
+	my $exclusionCheck = "UNLISTED";
+
+	while (my $exclusion = <EXCLUSIONS>)
+		{
+		next if ($exclusion =~ /^\s*$/);
+
+		$exclusion =~ s/^\s+//;
+		$exclusion =~ s/\s+$//;
+		$exclusion =~ s/\//\\/g;
+		my $quotemetaExclusion = quotemeta ($exclusion);
+
+		if ($referenceDOSSlash =~ /^$quotemetaExclusion$/i)
+			{				
+			if ($referenceDOSSlash !~ /^$quotemetaExclusion$/)
+				{
+				$exclusionCheck = $exclusion;
+				}
+			else
+				{
+				$exclusionCheck = "OK";
+				}
+			last;
+			}
+			elsif($referenceDOSSlash =~ /\\$quotemetaExclusion$/i)
+			{				
+			if ($referenceDOSSlash !~ /\\$quotemetaExclusion$/)
+				{
+				$exclusionCheck = $exclusion;
+				}
+			else
+				{
+				$exclusionCheck = "OK";
+				}
+			last;
+			}
+		}
+
+	close EXCLUSIONS;
+
+	return $exclusionCheck;
+	}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/copyfeaturevariants.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,85 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# copy A.X.aaa to B.X.bbb for all X (32 chars) when given A.aaa B.bbb
+# 
+#
+
+
+my $source = shift;
+my $target = shift;
+
+my $errs = 0;
+
+# copy invariant
+use File::Copy;
+if (-f $source)
+{
+	if (copy($source, $target))
+	{
+		print "copy $source $target\n";
+	}
+	else
+	{
+		print "ERROR: failed copy $source $target\n";
+		$errs++;
+	}
+}
+
+# now think about variants
+
+use File::Basename;
+my $srcDir = dirname($source);
+my $srcRoot = basename($source);
+my $srcExt = "";
+
+if ($srcRoot =~ /^(.+)\.([^\.]+)$/)
+{
+	$srcRoot = $1;
+	$srcExt = $2;
+}
+
+my $tgtRoot = $target;
+my $tgtExt = "";
+
+if ($tgtRoot =~ /^(.+)\.([^\.]+)$/)
+{
+	$tgtRoot = $1;
+	$tgtExt = $2;
+}
+
+opendir(DIR, $srcDir) or die("ERROR: cannot read directory $srcDir\n");
+
+# copy all variants
+while (my $file = readdir(DIR))
+{
+	if ($file =~ /^$srcRoot\.(\w{32})\.$srcExt$/i)
+	{
+		my $from = "$srcDir/$file";
+		my $into = "$tgtRoot.$1.$tgtExt";
+
+		if (copy($from, $into))
+		{
+			print "copy $from $into\n";
+		}
+		else
+		{
+			print "ERROR: failed copy $from $into\n";
+			$errs++;
+		}
+	}
+}
+
+exit 1 if (!closedir(DIR) || $errs > 0);
+exit 0;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/createrfifile.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,91 @@
+#!/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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use File::Basename;
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+if (@ARGV <2)
+	{
+	print (STDERR "\nCREATERFIFILE resource files combine tool V$MajorVersion.$MinorVersion.$PatchVersion\n");
+	print STDERR << 'END_OF_HELP';
+
+Usage: createrfifile.pl rss_cpp_deps_file.d output_file.rfi [exclude path]
+
+Takes a file containing CPP dependency output from the preprocessing of a .rss file and
+generates a "combined resource" .rfi that can  be consumed by CDB.
+Optionally takes an exclusion path under which "found" dependencies are then ignored.
+
+END_OF_HELP
+	exit(0);
+	}
+
+my ($deps, $rfi, $exclude) = @ARGV;
+
+if ($exclude)
+	{
+	$exclude =~ s/\\/\//g;			# Ensure consistent slashes
+	$exclude =~ s/\/\//\//g;		# Remove double slashes
+	$exclude = quotemeta($exclude);	# Convert for regex match
+	}
+
+print ("RFI : exclude under - \"$exclude\"\n");
+
+my @resources;
+open DEPS, "< $deps" or die "\nCannot read \"$deps\"!\n\n";
+while (<DEPS>)
+	{
+	# .d file format - whitespace at front is key, path format varies depending on platform
+	# the aim is to get a list of the "real" files. Missing files can appear "unpathed", although
+	# this isn't currently dealt with.
+	#
+	#HelloWorld_reg.o:  \
+	# F:/source/personal/misc/filenamepolicy/ported/examples/helloworld/HelloWorld_reg.rss \
+	#  F:/builds/sbs/9.5/epoc32/include/variant/Symbian_OS.hrh \
+	#  F:/builds/sbs/9.5/epoc32/include/appinfo.rh \
+	#  F:/builds/sbs/9.5/epoc32/include/helloworld.rsg
+	#
+	
+	s/^.*\.o\://;
+	s/^\s+//;
+	s/\s*\\$//;
+	s/\/\//\//g;
+	chomp ($_);
+	next if !/\S/;
+
+	print ("WARNING: Could not find dependency \"$_\" in \"$deps\"\n") if !(-e $_);
+	
+	print ("RFI : processing - \"$_\"\n");
+	next if ($exclude && /^$exclude/i);
+	push @resources,$_;	
+	}
+close DEPS;
+
+open RFI, "> $rfi" or die "\nCannot write \"$deps\"!\n\n";
+foreach my $resource (@resources)
+	{
+	print RFI "\n\n/* GXP ***********************\n";
+	print RFI " * ".basename($resource)."\n";
+	print RFI " ****************************/\n\n";
+	
+	open RESOURCE, "< $resource" or die "\nCannot read \"$resource\"!\n\n";
+	print RFI $_ while (<RESOURCE>);
+	close RESOURCE;
+	}
+close RFI;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/defutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,182 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# this module requires Pathutl module to have been 'used' by the main program
+# General Def file utilities
+# 
+#
+
+package Defutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Def_ReadFileL Def_WriteFileL
+);
+
+use File::Path;
+use File::Basename;
+
+sub Def_ReadFileL ($$$$) {
+#	this function reads a .DEF file, putting the export information into a data
+#	structure
+
+	my ($DataStructRef, $FILE, $ExportsOn, $IgnoreSequence)=@_;
+
+#	initialisation
+	@$DataStructRef=();
+
+#	this function expects all statements to appear on separate lines - though MSVC doesn't
+
+	open (FILE, "<$FILE") or die "could not open $FILE: $!";
+
+	my $PreviousOrdinal=0;
+	my $MultiLineStatement='';
+	my $NAMEorLIBRARYallowed=1;
+	my $LineNum=0;
+	while (<FILE>) {
+		$LineNum++;
+
+		my %Data;
+		$Data{Line}=$_;
+		$Data{LineNum}=$LineNum;
+
+#		blank lines and comment lines
+		if (/^\s*(;.*)?$/o) {
+			push @$DataStructRef, \%Data;
+			next;
+		}
+
+		if (/^\s*(EXPORTS|SECTIONS|IMPORTS)\s*(\s+\S+.*)?$/io) {
+#			check for multi-line sections starting
+			$MultiLineStatement=uc $1;
+			$NAMEorLIBRARYallowed=0;
+			unless ($2) {
+				push @$DataStructRef, \%Data;
+				next;
+			}
+			$_=$2;
+		}
+		elsif (/^\s*(NAME|LIBRARY|DESCRIPTION|STACKSIZE|VERSION)\s*(\s+\S+.*)?$/io) {
+#			set MULTI-LINE statement to OFF
+			$MultiLineStatement='';
+#			check single-line statements are specified correctly
+			$_=uc $1;
+#			check NAME or LIBRARY statements aren't supplied incorrectly
+			if (/^(NAME|LIBRARY)$/o) {
+				unless ($NAMEorLIBRARYallowed) {
+					die "$FILE($LineNum) : DEFFILE ERROR: NAME or LIBRARY statements must precede all other statements\n";
+				}
+				push @$DataStructRef, \%Data;
+				next;
+			}
+			$NAMEorLIBRARYallowed=0;
+			push @$DataStructRef, \%Data;
+			next;
+		}
+		else {
+			unless ($MultiLineStatement) {
+				chomp $_;
+				die "$FILE($LineNum) : DEFFILE ERROR: Unrecognised Syntax \"$_\"\n";
+			}
+		}
+
+		if ($MultiLineStatement eq 'EXPORTS') {
+#			get export data
+			if (/^\s*(\S+)\s+\@\s*(\d+)\s*(NONAME)?\s*((DATA)\s*(\d+))?\s*(R3UNUSED)?\s*(ABSENT)?\s*(;\s*(.*))?$/io) {
+				$Data{Name}=$1;
+				$Data{Ordinal}=$2;
+				if ($4) {
+#					Mark the data symbols and retain the size.
+					$Data{Data} = 1;
+					if($6){
+					$Data{Size} = $6;
+					}
+				}
+				if ($7) {
+					$Data{R3Unused} = 1;
+				}
+				if ($8) {
+					$Data{Absent} = 1;
+				}
+				if ($10) {
+					$Data{Comment}=$10;
+				}
+
+				if ($Data{Name} =~ /^(\S+?)=(\S+)$/) {
+# 					rename this export
+					$Data{ExportName}=$1;
+					$Data{Name}=$2;
+					if ($Data{Name} =~ /=/) {
+						die "$FILE($LineNum) : DEFFILE ERROR: $Data{Name} Invalid rename syntax\n";
+					}
+				}
+				else {
+					$Data{ExportName}=$Data{Name};
+				}
+#				test the export - this is probably too slow to bother with
+				my $ExportRef;
+				unless ($IgnoreSequence) {
+#					check ordinal specified in sequence - this check is a style matter
+#					rather the a .DEF file syntax matter, so maybe it shouldn't be applied
+					unless ($Data{Ordinal}==($PreviousOrdinal+1)) {
+						die "$FILE($LineNum) : DEFFILE ERROR: Ordinal not specified in sequence\n";
+					}
+				}
+				$PreviousOrdinal=$Data{Ordinal};
+				push @$DataStructRef, \%Data;
+				next;
+			}
+			if (/^\s*_E32Startup(\s*\=\s*__E32Startup)?\s+(;\s*(.*))?$/io) {
+#				Emulator's special entrypoint ordinal
+				next;
+			}
+			if (/^\s*_E32Dll(\s*\=\s*__E32Dll)?\s+(;\s*(.*))?$/io) {
+#				Emulator's special entrypoint ordinal
+				next;
+			}
+			die "$FILE($LineNum) : DEFFILE ERROR: Incorrect EXPORTS statement syntax\n";
+		}
+
+	}
+
+#	decide whether we've ended up with an EXPORTS section specified
+	if ($MultiLineStatement eq 'EXPORTS') {
+		$_[2]=1; # $ExportsOn
+	}
+	else {
+		$_[2]=0; # $ExportsOn
+	}
+
+	close FILE or die "DEFFILE ERROR: Can't close file $FILE: $!\n";
+}
+
+sub Def_WriteFileL ($$) {
+#	Writes an array of text to a file
+
+	my ($TextArrayRef, $FILE)=@_;
+	
+	# make sure path exists
+	my($filename, $directories, $suffix) = fileparse($FILE);
+	unless (-d $directories) {
+		eval { mkpath[$directories] };
+		die $@ if $@;
+	} 
+
+	open (FILE, ">$FILE") or die "DEFFILE ERROR: Could not open $FILE: $!\n";
+	print FILE @$TextArrayRef or die "DEFFILE ERROR: Can't write output to $FILE: $!\n";
+	close FILE or die "DEFFILE ERROR: Can't close file $FILE: $!\n";
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/deletefeaturevariants.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,47 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# delete A.X.aaa for all X (32 chars) when given A.aaa
+# 
+#
+
+
+my $source = shift;
+
+# delete invariant
+unlink($source) if (-f $source);
+
+# now think about variants
+
+use File::Basename;
+my $srcDir = dirname($source);
+my $srcRoot = basename($source);
+my $srcExt = "";
+
+if ($srcRoot =~ /^(.+)\.([^\.]+)$/)
+{
+	$srcRoot = $1;
+	$srcExt = $2;
+}
+
+opendir(DIR, $srcDir) or die("ERROR: cannot read directory $srcDir\n");
+
+# delete all variants
+while (my $file = readdir(DIR))
+{
+	unlink("$srcDir/$file") if ($file =~ /^$srcRoot\.(\w{32})\.$srcExt$/i);
+}
+
+exit 1 if (!closedir(DIR));
+exit 0;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/e32tpver.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Returns the version number for E32TOOLP - update for each release
+# 
+#
+
+package E32tpver;
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	E32tpver
+);
+
+
+sub E32tpver () {
+	my $Version=679; 
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/efreeze.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+
+perl -S efreeze.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/efreeze.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,337 @@
+#!/usr/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# all variables called *Path* are set up to end with a backslash
+# all variables called *Path or *File are stored as absolute (file)paths
+# all variables called UpPath* are stored as relative paths
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+# do not convert slashes for linux
+	if ($^O eq "MSWin32") {
+		$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+		$PerlLibPath .= "\\";
+	}
+}
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 1;
+
+use lib $PerlLibPath;
+use Defutl;
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+{
+	my %Options;
+
+	# process the command-line
+	unless (GetOptions(\%Options, 'compare', 'remove')) {
+		exit 1;
+	}
+	unless (@ARGV==2) {
+		&Usage;
+	}
+
+	my $FRZFILE;
+	my $GENFILE;
+
+	($FRZFILE,$GENFILE)=(@ARGV);
+	
+#	check the file exists
+	unless (-e $FRZFILE) {
+		warn "WARNING: $FRZFILE: File not found - OK if freezing for first time\n";
+	}
+	unless (-e $GENFILE) {
+		die "EFREEZE ERROR: $GENFILE: File not found\n";
+	}
+
+#	Read the Frozen .DEF file if it exists
+	my @FrzDataStruct;
+	my $FrzExportsOn=0;
+	if (-e $FRZFILE) {
+		eval { &Def_ReadFileL(\@FrzDataStruct, $FRZFILE, $FrzExportsOn); };
+		die $@ if $@;
+	}
+
+#	Read the New .DEF file
+	my @GenDataStruct;
+	my $Dummy;
+	if ($GENFILE) {
+		eval { &Def_ReadFileL(\@GenDataStruct, $GENFILE, $Dummy, ($Options{compare} or $Options{remove})); };
+	}
+	die $@ if $@;
+
+#	Compare the frozen .DEF data with the new .DEF file
+	my (@NewDataStruct, @MissingDataStruct, @BadDataStruct);
+	eval { &CompareFrzGenL (\@NewDataStruct, \@MissingDataStruct, \@BadDataStruct, \@FrzDataStruct, \@GenDataStruct, $Options{remove}); };
+	die $@ if $@;
+
+#	check for errors
+	my $NumRemoved;
+	my $Ref;
+	my @Errors;
+	my $Title='EFREEZE ERROR:';
+	if ($Options{compare}) {
+		$Title='EFREEZE:';
+	}
+	if (@MissingDataStruct and $Options{remove}) {
+#		Mark missing exports as ABSENT in DEF file
+		$NumRemoved=@MissingDataStruct;
+		if ($Options{compare}) {
+			print "EFREEZE: Marking $NumRemoved Export(s) as ABSENT :\n";
+		} else {
+			print "EFREEZE: Marking $NumRemoved Export(s) as ABSENT in $FRZFILE :\n";
+		}
+		foreach (@MissingDataStruct) {
+			$$_{Absent} = 1;
+			my $Comment='';
+			if ($$_{Comment}) {
+				$Comment=" ; $$_{Comment}";
+			}
+			my $r3unused = $$_{R3Unused} ? " R3UNUSED" : "";
+			print "  $$_{Name} \@ $$_{Ordinal} NONAME$r3unused$Comment\n";
+		}
+	}
+	elsif (@MissingDataStruct) {
+		my $Num=@MissingDataStruct;
+		push @Errors, "$Title $FRZFILE: $Num Frozen Export(s) missing from $GENFILE (POSSIBLE COMPATIBILITY BREAK):\n"; 
+		foreach $Ref (@MissingDataStruct) {
+			my $r3unused = $$Ref{R3Unused} ? " R3UNUSED" : "";
+			push @Errors, "  $$Ref{LineNum}: $$Ref{Name} \@ $$Ref{Ordinal} NONAME$r3unused\n";
+		}
+		push @Errors, "\n";
+	}
+	if (@BadDataStruct) {
+		my $Num=@BadDataStruct;
+		push @Errors, "$Title $GENFILE: $Num function(s) exported at wrong ordinal:\n";
+		foreach $Ref (@BadDataStruct) {
+			my $r3unused = $$Ref{R3Unused} ? " R3UNUSED" : "";
+			push @Errors, "  $$Ref{LineNum}: $$Ref{Name} \@ $$Ref{Ordinal} NONAME$r3unused\n";
+		}
+	}
+	if (@Errors) {
+		unless ($Options{compare}) {
+			die @Errors;
+		}
+		else {
+			print @Errors;
+		}
+	}
+
+#	Update the frozen .DEF file
+	eval { &UpdateFrzFileL(\@NewDataStruct, \@FrzDataStruct, $FRZFILE, $FrzExportsOn, $Options{compare}, $NumRemoved); };
+	die $@ if $@;
+	
+
+	exit;
+}
+
+#######################################################################
+# SUBROUTINES
+#######################################################################
+
+sub Usage () {
+
+	print(
+		"\n",
+		"EFREEZE - .DEF file maintenance utility V$MajorVersion.$MinorVersion.$PatchVersion\n",
+		"\n",
+		"EFREEZE {options} [frozen .DEF file] [new .DEF file]\n",
+		"\n",
+		"options:   (case-insensitive)\n",
+		"  -Compare\n",
+		"  -Remove\n",
+		"\n"
+	);
+	exit 1;
+}
+
+sub CompareFrzGenL ($$$$$$) {
+	my ($NewStructRef, $MissingStructRef, $BadStructRef, $FrzStructRef, $GenStructRef, $remove)=@_;
+
+#	compare the input export data with the frozen data
+
+#	take a copy of the frozen .DEF file structure that we can trash
+	my @TmpStruct=@$FrzStructRef;
+
+#	remove any entries not containing export data and get the highest ordinal value used
+	my $LastOrdinal=0;
+	foreach (@TmpStruct) {
+		if ($$_{Name}) {
+			if ($LastOrdinal<$$_{Ordinal}) {
+				$LastOrdinal=$$_{Ordinal};
+			}
+			next;
+		}
+		undef $_;
+	}
+
+	my $GenRef;
+	my $TmpRef;
+	GENLOOP: foreach $GenRef (@$GenStructRef) {
+		next unless $$GenRef{Name};		# ignore lines in the .DEF file not containing an export
+		foreach $TmpRef (@TmpStruct) {
+			next unless defined $TmpRef; # ignore nullified entries in the temporary array
+#			does the function name match?
+			if ($$GenRef{Name} eq $$TmpRef{Name}) {
+#				check the names have the same ordinals
+				if ($remove or $$GenRef{Ordinal}==$$TmpRef{Ordinal}) {
+					undef $TmpRef;
+					next GENLOOP;
+				}
+#				store exports with the wrong ordinals
+				push @$BadStructRef, $GenRef;
+				undef $TmpRef;
+				next GENLOOP;
+			}
+#			Absent export?
+			if ($$TmpRef{Absent} and $$TmpRef{Ordinal}==$$GenRef{Ordinal}) {
+				next GENLOOP;
+			}
+		}
+#		store new exports not found in the frozen .DEF file with the right ordinal value
+		$LastOrdinal++;
+		$$GenRef{Ordinal}=$LastOrdinal;
+		push @$NewStructRef, $GenRef;
+	}
+
+#	all the exports left in the frozen .DEF file weren't found
+	foreach $TmpRef (@TmpStruct) {
+		next unless defined $TmpRef; # ignore nullified entries in the temporary array
+		next if $$TmpRef{Absent};	# skip entries marked as ABSENT in the DEF file
+		push @$MissingStructRef, $TmpRef;
+	}
+}
+
+sub UpdateFrzFileL ($$$$$$) {
+	my ($NewStructRef, $FrzStructRef, $FILE, $ExportsOn, $Compare, $NumRemoved)=@_;
+
+#	add the exports to the frozen .DEF file text
+	unless (@$NewStructRef or $NumRemoved) {
+		print "EFREEZE: DEF file up to date\n";
+		return;
+	}
+
+	my $NumNewExports=@$NewStructRef;
+	unless ($Compare) {
+# 		abort the operation unless the frozen .DEF file is writeable
+		if (-e $FILE and not -w $FILE) {
+			die
+				"EFREEZE ERROR: Can't append $NumNewExports New Export(s) to $FILE\n",
+				"  as file is not writeable.  Check source code control system.\n"
+			;
+		}
+		print "EFREEZE: Appending $NumNewExports New Export(s) to $FILE:\n" if ($NumNewExports);
+	}
+	else {
+		print "EFREEZE: $NumNewExports New Export(s):\n" if ($NumNewExports);
+	}
+
+	my @Text;
+	my $ExportsDeclared;
+
+#	Process the frozen .DEF file
+	if (@$FrzStructRef) { # there is already a frozen .DEF file
+		my $FrzRef;
+
+#		get the lines of text from the frozen .DEF file
+		foreach $FrzRef (@$FrzStructRef) {
+			next if (!$FrzRef);
+			if (!defined($$FrzRef{Ordinal})) {
+				push @Text, $$FrzRef{Line};
+				$ExportsDeclared = 1 if ($$FrzRef{Line} =~ /^\s*EXPORTS\s*(\s+\S+.*)?$/io);
+				next;
+			}
+			my $Comment='';
+			if ($$FrzRef{Comment}) {
+				$Comment=" ; $$FrzRef{Comment}";
+			}
+			my $r3unused = $$FrzRef{R3Unused} ? " R3UNUSED" : "";
+			my $absent = $$FrzRef{Absent} ? " ABSENT" : "";
+
+			my $data = "";
+			if( !($$FrzRef{Name} =~ /^(_ZTI|_ZTV|_ZTT)/))
+			{
+#				A symbol name with the above pattern indicates that it is a Data symbol.
+#				Mark symbols as DATA only when it cannot be found from the name alone (i.e.,
+#				explicitly exported data symbols).
+
+				if(($$FrzRef{Data}) and ($$FrzRef{Size}) ){
+				$data = " DATA $$FrzRef{Size}";
+				}
+			}
+			push @Text, "\t$$FrzRef{Name} \@ $$FrzRef{Ordinal} NONAME$data$r3unused$absent$Comment\n";
+		}
+
+#		strip any blank lines at the end of the frozen .DEF file text
+		foreach (reverse @Text) {
+			if (/^\s*$/o) {
+				$_='';
+				next;
+			}
+			last;
+		}
+
+	}
+
+#	Add an EXPORTS section header if there aren't already exports
+	unshift @Text, "EXPORTS\n" unless ($ExportsDeclared);
+
+	my $NewRef;
+	foreach $NewRef (@$NewStructRef) {
+		my $Comment='';
+		if ($$NewRef{Comment}) {
+			$Comment=" ; $$NewRef{Comment}";
+		}
+		my $r3unused = $$NewRef{R3Unused} ? " R3UNUSED" : "";
+		my $absent = $$NewRef{Absent} ? " ABSENT" : "";
+
+		my $data = "";
+		if( !($$NewRef{Name} =~ /^(_ZTV|_ZTI|_ZTT)/)) {
+#				A symbol name with the above pattern indicates that it is a Data symbol.
+#				Mark symbols as DATA only when it cannot be found from the name alone (i.e.,
+#				explicitly exported data symbols).
+			if(($$NewRef{Data}) and ($$NewRef{Size}) ){
+			$data = " DATA $$NewRef{Size}";
+			}
+		}
+		print "  $$NewRef{Name} \@ $$NewRef{Ordinal} NONAME$r3unused$Comment\n";
+		push @Text, "\t$$NewRef{Name} \@ $$NewRef{Ordinal} NONAME$data$r3unused$absent$Comment\n";
+	}
+
+#	add a terminating newline
+	push @Text, "\n";
+
+	unless ($Compare) {
+#		write the new frozen .DEF file
+		eval { &Def_WriteFileL(\@Text, $FILE); };
+		die $@ if $@;
+	}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/epocaif.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,512 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Wrapper to support the EPOC AIF Compiler
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use File::Copy;		# for copy()
+use Cwd;		# for cwd
+use File::Basename;	# for basename()
+
+my $PerlBinPath;	# fully qualified pathname of the directory containing this script
+my $curdrive="x";	    	# will be initialised when first needed
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;		# check user has a version of perl that will cope
+	$PerlBinPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlBinPath =~ s/\//\\/g;	# X:\epoc32\tools
+}
+use lib $PerlBinPath;
+use E32Variant;         # for variant specific macros
+use Pathutl;
+use Preprocessor;
+
+sub print_usage
+	{
+#........1.........2.........3.........4.........5.........6.........7.....
+	print <<USAGE_EOF;
+
+Usage:
+  epocaif [options] srcfile [-o outputfile] [-t tmpdir] [-b "bmps" | -m mbm] [-l "TargetPath:CWD"]
+
+
+The available options are
+
+   -Ixxx  -- C++ preprocessor arguments
+   -o	  -- output AIF file name including path
+   -t	  -- tempory directory for intermediate files
+   -b	  -- list of bitmaps Eg., "-b/c8\\location\\bmp1 /c8\\location\\bmp2.."
+   -m	  -- compiled MBM file (alternative to -b)
+   -l	  -- if specified, captures all source to \\epoc32\\localisation\\...
+
+The aif resource file is then passed through the C++ preprocessor, using any 
+specified preprocessor arguments, and then compiled with RCOMP.EXE to 
+generate a compiled resource.
+The -m or -b option is used to generate a suitable MBM file, if required.
+The MBM and the compiled resource are then combined to produce an AIF file.
+
+
+USAGE_EOF
+	}
+
+#-------------------------------------------------------
+# Process commandline arguments
+#
+# Can't use the Getopt package because it doesn't like the -D and -I style options
+#
+my $sourcefile="";
+my $opt_o="";
+my $opt_h="";	
+my $tmpdir="";
+my $opt_v=1;
+my $opt_b="";
+my $opt_l="";
+my $opt_m="";
+my $TrgPath;
+my $xipaif=1;
+
+my $exe = &PreprocessorToUseExe();
+my $cpp_spec= "$exe -undef -C ";	    # preserve comments
+
+my $errors = 0;
+while (@ARGV)
+	{
+	my $arg = shift @ARGV;
+
+	if ($arg =~ /^-I-$/)
+		{
+		$cpp_spec .= "-I- ";
+		next;
+		}
+	if ($arg =~ /^-I(.*)$/)
+		{
+		$cpp_spec .= "-I ";
+		if ($1 eq "")
+		    {
+		    $arg = shift @ARGV;
+		    }
+		else
+		    {
+		    $arg = $1;
+		    }
+		$cpp_spec .= quoted_path($arg)." ";
+		next;
+		}
+	if ($arg =~ /^-v$/)
+		{
+		$opt_v =1;
+		next;
+		}
+	if ($arg =~ /^-o(.*)$/)
+		{
+		$opt_o =$1;
+		$TrgPath = $opt_o;
+		next;
+		}
+
+	if ($arg =~ /^-t(.*)\\?$/)
+		{
+		$tmpdir =$1;
+		next;
+		}
+	if ($arg =~ /^-b(.*)$/)
+		{
+		$opt_b =$1;
+		next;
+		}	
+	if ($arg =~ /^-m(.*)$/)
+		{
+		$opt_m =$1;
+		next;
+		}	
+	if ($arg =~ /^-l(.*)$/)
+		{
+		$opt_l =$1;
+		next;
+		}	
+
+	if ($arg =~ /^-/)
+		{
+		print "Unknown arg: $arg\n";
+		$errors++;
+		next;
+		}
+	$sourcefile=$arg;
+	}
+
+if ($opt_m ne "" && $opt_b ne "")
+	{
+	print "Can't specify both -m and -b\n";
+	$errors++;
+	}
+if ($errors || $sourcefile eq "")
+	{
+	print_usage();
+	exit 1;
+	}
+
+my $rss_base = basename($sourcefile);
+my ($rssfile) = split(/\./, $rss_base);	    # remove extension
+my $rpp_name = "$tmpdir\\$rssfile.rpp";
+my $outputfile="$tmpdir\\AIF.RSC";	
+my $headerfile=$opt_h;
+
+if ($opt_v)
+	{
+	print "* Source file:   $sourcefile\n";
+	print "* Resource file: $outputfile\n" if ($outputfile ne "");
+	}
+
+$opt_o = "-o\"$outputfile\"" if ($outputfile ne "");
+$opt_h = "-h\"$headerfile\"" if ($headerfile ne "");
+
+
+#-------------------------------------------------------
+# Run the preprocessor
+#
+
+my $variantMacroHRHFile = Variant_GetMacroHRHFile();
+if($variantMacroHRHFile){
+    my $variantFilePath = Path_Split('Path',$variantMacroHRHFile);
+    chop ( $variantFilePath );
+    $cpp_spec .= " -I \"" . &Path_RltToWork($variantFilePath) . "\" -include " . &Path_RltToWork($variantMacroHRHFile) . " "; 
+}
+
+$cpp_spec .= "-I $PerlBinPath\\..\\include ";	# extra path to support shared tools
+$cpp_spec .= "-D_UNICODE ";
+
+$cpp_spec .= quoted_path($sourcefile) ." -o ". quoted_path($rpp_name);
+
+print "* $cpp_spec\n" if ($opt_v);
+system($cpp_spec);
+
+my $cpp_status = $?;
+die "* cpp failed\n" if ($cpp_status != 0);
+
+
+#-------------------------------------------------------
+# Copy source to epoc32\localisation
+#
+
+if ($opt_l ne "")
+{
+use lockit_info;
+	my ($rssfile, $FileType) = split(/\./, basename($TrgPath));
+	&Lockit_SrcFile($rssfile, $rpp_name, $opt_l, $FileType, $opt_b);
+}
+
+#-------------------------------------------------------
+# Merge rls strings to rpp
+#
+&Merge_rls_string($rpp_name);
+
+#-------------------------------------------------------
+# Run the resource compiler
+#
+
+my $rcomp_spec = "rcomp -u ";
+$rcomp_spec .= "-:$tmpdir\\_dump_of_resource_ "; # causes Rcomp to dump each resource (uncompressed and unpadded) in $tmpdir\\_dump_of_resource_1, $tmpdir\\_dump_of_resource_2, etc
+$rcomp_spec .= "$opt_o $opt_h -s\"$rpp_name\" -i\"$sourcefile\"";
+
+print "* $rcomp_spec\n" if ($opt_v);
+system($rcomp_spec);
+if ($? != 0)
+	{
+	print "* RCOMP failed - deleting output files\n";
+	unlink $outputfile if ($outputfile ne "");
+	unlink $headerfile if ($headerfile ne "");
+	exit 1;
+	}
+print "* deleting $rpp_name\n" if ($opt_v);
+unlink $rpp_name;
+
+#-------------------------------------------------------
+# Run bmconv, if needed
+#
+
+if ($opt_b ne "")
+	{
+	print "* bmconv /q $tmpdir\\AIF.MBM $opt_b\n" if ($opt_v);
+	system("bmconv /q $tmpdir\\AIF.MBM $opt_b");
+	if ($? != 0)
+		{
+		print "* BMCONV failed\n";
+		exit 1;
+		}
+	print "* bmconv /q /s $tmpdir\\AIF_XIP.MBM $opt_b\n" if ($opt_v);
+	system("bmconv /q /s $tmpdir\\AIF_xip.MBM $opt_b");
+	
+	if ($? != 0)
+		{
+		print "* BMCONV failed\n";
+		exit 1;
+		}
+	}
+elsif ($opt_m ne "")
+	{
+	print "* copy $opt_m $tmpdir\\AIF.MBM\n" if ($opt_v); 
+	copy($opt_m, "$tmpdir\\AIF.MBM");
+	# no xip file genarated 
+	$xipaif=0;
+	}
+else
+	{
+	# no bitmap specified - this is legitimate
+	unlink("$tmpdir\\AIF.MBM");
+	unlink("$tmpdir\\AIF_xip.MBM");
+	}
+
+#-------------------------------------------------------
+# Get the from UID from the first four bytes of "$tmpdir\\_dump_of_resource_1"
+#
+
+open(DUMP_OF_RESOURCE_1, "< $tmpdir\\_dump_of_resource_1") or die("* Can't open dump file\n");
+binmode(DUMP_OF_RESOURCE_1);
+my $data;
+my $numberOfBytesRead=read(DUMP_OF_RESOURCE_1, $data, 4);
+defined($numberOfBytesRead) or die("* Can't read from dump file\n");
+($numberOfBytesRead>=4) or die("* Dump file too short\n");
+my $uid=(unpack('V', $data))[0];
+undef($data);
+undef($numberOfBytesRead);
+close(DUMP_OF_RESOURCE_1) or die("* Can't close dump file\n");
+
+#-------------------------------------------------------
+# Produce the AIF file from the RSC and MBM files
+#
+
+my $uidcrc = "uidcrc.exe 0x101fb032 0 ".sprintf('0x%08x', $uid)." $tmpdir\\out.aif";
+my $uidcrc_xip = "uidcrc.exe 0x101fb032 0 ".sprintf('0x%08x', $uid)." $tmpdir\\out_xip.aif";
+
+print "* $uidcrc\n" if ($opt_v);
+system($uidcrc);
+if ($? != 0)
+	{
+	print "* UIDCRC failed\n";
+	exit 1;
+	}
+if ($xipaif ne 0)
+	{	
+	print "* $uidcrc\n" if ($opt_v);
+	system($uidcrc_xip);
+	if ($? != 0)
+		{
+		print "* UIDCRC failed\n";
+		exit 1;
+		}
+	}
+
+
+open(OUT_AIF, ">> $tmpdir\\out.aif") or die("* Can't open temporary file\n");
+binmode(OUT_AIF);
+
+if ($xipaif ne 0)
+	{
+	open(OUTXIP_AIF, ">> $tmpdir\\out_xip.aif") or die("* Can't open temporary file\n");
+	binmode(OUTXIP_AIF);
+	}
+
+print "* Writing length of the RSC-block\n" if ($opt_v);
+my $lengthOfRscBlock=-s("$tmpdir\\aif.rsc");
+my $numberOfPaddingBytes=(4-($lengthOfRscBlock%4))%4;
+print(OUT_AIF pack('V', $lengthOfRscBlock));
+if ($xipaif ne 0)
+	{
+	print(OUTXIP_AIF pack('V', $lengthOfRscBlock));
+	}
+print "* Appending the RSC-block\n" if ($opt_v);
+&appendFile(\*OUT_AIF, "$tmpdir\\aif.rsc");
+if ($xipaif ne 0)
+	{
+	&appendFile(\*OUTXIP_AIF, "$tmpdir\\aif.rsc");
+	}
+# append any necessary padding bytes so that the file-offset of the start of the MBM-block is a multiple of 4-bytes
+print(OUT_AIF ('_' x $numberOfPaddingBytes));
+if ($xipaif ne 0)
+	{
+	print(OUTXIP_AIF ('_' x $numberOfPaddingBytes));
+	}
+if (-e("$tmpdir\\aif.mbm"))
+	{
+	print "* Appending the MBM-block\n" if ($opt_v);
+	&appendFile(\*OUT_AIF, "$tmpdir\\aif.mbm");
+	}
+if (-e("$tmpdir\\aif_xip.mbm"))
+	{
+	print "* Appending the XIPMBM-block\n" if ($opt_v);
+	&appendFile(\*OUTXIP_AIF, "$tmpdir\\aif_xip.mbm");
+	}
+
+close(OUT_AIF) or die("* Can't close temporary file\n");
+if ($xipaif ne 0)
+	{
+	close(OUTXIP_AIF) or die("* Can't close temporary file\n");
+	}
+print "* copy $tmpdir\\out.aif $TrgPath\n" if ($opt_v);
+copy("$tmpdir\\out.aif", "$TrgPath");
+if ($xipaif ne 0)
+	{
+	my $basepath = &Path_Split('Path', $TrgPath);
+	my $ext=&Path_Split('Ext',  $TrgPath);
+	my $basename = basename($TrgPath, $ext);
+	my $xip="_xip";
+	print "* copy $tmpdir\\out_xip.aif $basepath$basename$xip$ext\n" if ($opt_v);
+	copy("$tmpdir\\out_xip.aif", "$basepath$basename$xip$ext");
+	}
+unlink("$tmpdir\\_dump_of_resource_*");
+unlink("$tmpdir\\aif.rsc");
+unlink("$tmpdir\\aif.mbm");
+unlink("$tmpdir\\out.aif");
+unlink("$tmpdir\\aif_xip.mbm");
+unlink("$tmpdir\\out_xip.aif");
+exit 0;
+
+#-------------------------------------------------------
+# Subroutine: convert path into something acceptable to CPP.EXE
+#
+
+sub quoted_path
+    {
+    my ($arg) = @_;
+    return "\"$arg\"" if ($arg !~ /^\\[^\\]/);	# not an absolute path
+    if ($curdrive eq "x")
+		{
+		$curdrive="";
+		$curdrive=$1 if (cwd =~ /^(.:)/);	
+		}
+    return "\"$curdrive$arg\"";
+    }
+
+#-------------------------------------------------------
+# Subroutine: Merge the rls strings in the rpp file specified
+#
+sub Merge_rls_string
+	{
+	my ($rppfile) = @_;
+
+	my $line;
+	my $StringId;
+	my $key;
+	my $value;
+	my $StringToSubstitute;
+	my %ResourceString;
+	
+	print "* merging text strings to $rppfile\n" if ($opt_v);
+	
+	open NEWRPP, ">$rppfile.new" or die "* Can't write to $rppfile.new";
+	open RPP, "$rppfile" or die "* Can't open $rppfile";
+	
+	while ($line = <RPP>) 	{
+		while (($StringId, $StringToSubstitute)=each %ResourceString)
+		{
+			$line=~s/\b$StringId\b/$StringToSubstitute/g if ($line !~ /^rls_string/);
+		}
+	
+		# find quoted "" strings
+		if($line =~ /^rls_string\s+(\S+)\s+(.*$)/)
+		{
+			my $text = $2;
+			$key = $1;
+			$line=~s/(.*)/\/\/$1/;
+			my $substr_count = 0;
+			if(!exists $ResourceString{$key})
+			{
+			SUBSTR:	while (1)
+			{
+				# find quoted "" strings e.g. "hello"
+				if($text =~ /^(\s*\"(.*?\\.)*.*?\")/)		
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find quoted '' strings. e.g. 'world'
+				elsif($text =~ /^(\s*\'(.*?\\.)*.*?\')/)			
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find hex strings e.g. <0x34><0x45><0x65>
+				elsif($text =~ /^(\s*(<.*?>)+)/)		
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find c comment e.g. /*hello world*/ (may exist between strings)
+				elsif($text =~ /^(\s*\/\*.*?\*\/)/)		
+				{
+					$text = $';
+					next SUBSTR; # ignore embedded comment
+				}
+	
+				# find c++ comment e.g. //hello world (may exist after strings)
+				elsif($text =~ /^(\s*\/\/.*$)/)		
+				{
+					$text = $';
+					next SUBSTR; # ignore trailing comment
+				}
+	
+				# exit search
+				else
+				{
+					if ($substr_count == 0)
+					{
+						warn("WARNING: rls_string $key either has incorrect syntax or no value\n");
+					}
+					last SUBSTR;
+				}
+			$ResourceString{$key} .= $value;
+			}
+		  	}
+		}
+		print NEWRPP $line;
+	}
+
+	close RPP;
+	close NEWRPP;
+	copy ("$rppfile.new", "$rppfile");
+	unlink ("$rppfile.new");
+	}
+
+#-------------------------------------------------------
+# Subroutine: Append a file into the open (binary) file already opened
+#
+sub appendFile
+	{
+	my $fileHandleOfTarget=shift;
+	my $fileNameOfSource=shift;
+	open(SOURCE, "< $fileNameOfSource") or die("* Can't open $fileNameOfSource\n");
+	binmode(SOURCE);
+	for (;;)
+		{
+		my $data;
+		my $numberOfBytesRead=read(SOURCE, $data, 1024);
+		defined($numberOfBytesRead) or die("* Can't read from $fileNameOfSource\n");
+		if ($numberOfBytesRead==0)
+			{
+			last;
+			}
+		print($fileHandleOfTarget $data);
+		}
+	close(SOURCE) or die("* Can't close $fileNameOfSource\n");
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/epocmbm.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,129 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use Cwd;		# for cwd
+use File::Basename;	# for basename()
+use FindBin;		# for FindBin::Bin
+my $PerlBinPath;	# fully qualified pathname of the directory containing this script
+
+my $epocroot;
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;		# check user has a version of perl that will cope
+	$PerlBinPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlBinPath =~ s/\//\\/g;	# X:\epoc32\tools
+}
+
+use lib $PerlBinPath;
+use lockit_info;
+
+sub print_usage
+	{
+	print <<USAGE_EOF;
+
+Usage:
+  epocmbm [-h headerfile] [-o outputfile] [-b "bitmaps"] [-l "TargetPath:CWDir"]  
+
+Compile the bitmaps to an EPOC MBM image file.
+   -b	  -- list of bitmaps Eg., "-b/c8\\full path\\bmp1... /c8\\full path\\bmp2.."
+   -l     -- if specified, captures all source to \\epoc32\\localisation\\...
+
+USAGE_EOF
+	}
+
+
+#-----------------------------------------------
+# Process commandline arguments
+#
+
+my $opt_o="";
+my $opt_h="";	
+my $opt_l="";
+my $opt_b="";
+my $opt_v=0;
+
+my $errors = 0;
+while (@ARGV)
+	{
+	my $arg = shift @ARGV;
+	if ($arg =~ /^-o(.*)$/)
+		{
+		$opt_o =$1;
+		next;
+		}
+	if ($arg =~ /^-h(.*)$/)
+		{
+		$opt_h =$1;
+		next;
+		}
+	if ($arg =~ /^-b(.*)$/)
+		{
+		$opt_b =$1;
+		next;
+		}	
+	if ($arg =~ /^-l(.*)$/)
+		{
+		$opt_l =$1;
+		next;
+		}
+
+	if($arg =~ /^-/)
+		{
+		print "Unknown arg: $arg\n";
+		$errors++;
+		next;
+		}
+	}
+
+if ($errors || $opt_b eq "")
+	{
+	print_usage();
+	exit 1;
+	}
+
+my $headerfile=$opt_h;
+
+if ($opt_b ne "")
+	{
+	$opt_h = "\/h\"$headerfile\"" if ($headerfile ne "");
+	print "* bmconv /q $opt_h $opt_o $opt_b\n" if ($opt_v);
+	system("bmconv /q $opt_h $opt_o $opt_b");
+	if ($? != 0)
+		{
+		print "* BMCONV failed\n";
+		exit 1;
+		}
+	}
+
+if ($opt_l ne "")
+	{
+	my ($Resrc, $FileType) = split(/\./, basename($opt_o));
+	&Lockit_SrcFile($Resrc, "", $opt_l, $FileType, $opt_b, $Resrc.".$FileType"); # ""
+		}
+exit 0;
+
+sub Epocroot_Check
+	{
+	$epocroot = $ENV{EPOCROOT};
+	die "ERROR: Must set the EPOCROOT environment variable\n" if (!defined($epocroot));
+	$epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+	die "ERROR: EPOCROOT must not include a drive letter\n" if ($epocroot =~ /^.:/);
+	die "ERROR: EPOCROOT must be an absolute path without a drive letter\n" if ($epocroot !~ /^\\/);
+	die "ERROR: EPOCROOT must not be a UNC path\n" if ($epocroot =~ /^\\\\/);
+	die "ERROR: EPOCROOT must end with a backslash\n" if ($epocroot !~ /\\$/);
+	die "ERROR: EPOCROOT must specify an existing directory\n" if (!-d $epocroot);
+	$epocroot=~ s-\\$--;		# chop trailing \\
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/epocrc.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+
+perl -S epocrc.pl  %*
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/epocrc.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,645 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Wrapper to support the EPOC Resource Compiler
+# 
+#
+
+use warnings;
+use Cwd;		# for cwd
+use FindBin;		# for FindBin::Bin
+use File::Copy;		# for copy()
+
+my $curdrive="x";	    	# will be initialised when first needed
+my $PerlBinPath;	# fully qualified pathname of the directory containing this script
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;		# check user has a version of perl that will cope
+	$PerlBinPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlBinPath =~ s/\//\\/g;	# X:\epoc32\tools
+}
+use lib $PerlBinPath;
+use lockit_info;
+use E32Variant;         # for variant specific macros
+use Pathutl;
+use Preprocessor;
+
+sub print_usage
+	{
+#........1.........2.........3.........4.........5.........6.........7.....
+	print <<USAGE_EOF;
+
+Usage:
+  epocrc [options] srcfile [-ooutputfile] [-hheaderfile] [-l "TargetPath:CWDir"]  
+
+Compile an EPOC resource file, optionally generating a compiled resource 
+file and an associated header file.
+
+The available options are
+
+   -Dxxx, -Ixxx      -- C++ preprocessor arguments
+   -preincludeFILE   -- optional FILE to be used as a preinclude file in all preprocessing
+   -u                -- compile for use with Unicode EPOC
+   -ttmpdir          -- specify a directory for temporary files
+   -nocpp            -- do not call C++ preprocessor
+   -l                -- if specified, capture all source to \\epoc32\\localisation\\... 
+   -uid2 N           -- specifies 2nd UID for output file
+   -uid3 N           -- specifies 3rd UID for output file 
+   -m[nnn](,[nnn])*  -- suppress warning nnn in rcomp, can supply multiple 
+                        comma-separated three digit values
+   -v                -- verbose output
+   -vv               -- more verbose, -v passed to rcomp			
+
+See the file epocrc.config for futher usage options.
+   
+The resource file is first passed through the C++ preprocessor, using any 
+specified preprocessor arguments, and then compiled with RCOMP.EXE to 
+generate a compiled resource and the associated header file. 
+
+All intermediate files are generated into a temporary directory.
+
+Specifying either -uid2 or -uid3 overrides all uids specified in the source file.
+
+If -preinclude FILE is not specified, the preinclude file listed in
+%EPOCROOT%epoc32\\tools\\variant\\variant.cfg is used in all preprocessing.
+
+USAGE_EOF
+	}
+
+#-------------------------------------------------------
+# Process commandline arguments
+#
+# Can't use the Getopt package because it doesn't like the -D and -I style options
+#
+my $opt_uid2='';
+my $opt_uid3='';
+my $sourcefile="";
+my $opt_o="";
+my $opt_m="";
+my $opt_h="";	
+my $opt_l="";
+my $tmpdir="";
+my $unicode=0;
+my $opt_v=0;
+my $opt_vmore=0;
+my $opt_cpp = 1;
+my $check_rls_items = 0;
+my $strict_checking = 0;
+my $test_mode = 0;
+my $warnings_to_enable = 0;
+
+my $variantMacroHRHFile = "";
+my $exe = &PreprocessorToUseExe();
+my $cpp_spec= "$exe -nostdinc -undef -C ";	    # preserve comments
+
+my $errors = 0;
+while (@ARGV)
+	{
+	my $arg = shift @ARGV;
+	if ($arg =~ /^-D(.*)$/)
+		{
+		if ($1 eq "")
+		    {
+		    $arg = shift @ARGV;
+		    $cpp_spec .= "-D \"$arg\" ";
+		    }
+		else
+		    {
+		    $cpp_spec .= "$arg ";
+		    }
+		next;
+		}
+	if ($arg =~ /^-I-$/)
+		{
+		$cpp_spec .= "-I- ";
+		next;
+		}
+	if ($arg =~ /^-I(.*)$/)
+		{
+		$cpp_spec .= "-I ";
+		if ($1 eq "")
+		    {
+		    $arg = shift @ARGV;
+		    }
+		else
+		    {
+		    $arg = $1;
+		    }
+		$cpp_spec .= quoted_path($arg)." ";
+		next;
+		}
+	if ($arg =~ /^-preinclude(.*)$/)
+		{
+		$variantMacroHRHFile = $1;
+		next;
+		}
+	if ($arg =~ /^-v$/)
+		{
+		$opt_v =1;
+		next;
+		}
+	if ($arg =~ /^-vv$/)
+		{
+		$opt_vmore =1;
+		$opt_v =1;
+		next;
+		}
+	if ($arg =~ /^-nocpp$/)
+		{
+		$opt_cpp =0;
+		next;
+		}
+
+	if ($arg =~ /^-uid2$/)
+		{
+		$opt_uid2 = shift @ARGV;
+		next;
+		}
+	
+	if ($arg =~ /^-uid3$/)
+		{
+		$opt_uid3 = shift @ARGV;
+		next;
+		}
+	
+	if ($arg =~ /^-u$/)
+		{
+		$unicode =1;
+		next;
+		}
+	if ($arg =~ /^-o(.*)$/)
+		{
+		$opt_o =$1;
+		next;
+		}
+	if ($arg =~ /^-h(.*)$/)
+		{
+		$opt_h =$1;
+		next;
+		}
+	if ($arg =~ /^-t(.*)\\?$/)
+		{
+		$tmpdir ="$1\\";
+		next;
+		}
+	if ($arg =~ /^-l(.*)$/)
+		{
+		$opt_l =$1;
+		next;
+		}
+	if($arg =~ /^(-m.*)$/)
+		{
+		$opt_m =$1;
+		next;
+		}
+	if ($arg =~ /^-epocrc-test$/)
+		{
+		$test_mode = 1;
+		next;
+		}
+	if ($arg =~ /^-/)
+		{
+		print "Unknown arg: $arg\n";
+		$errors++;
+		next;
+		}
+
+	if (($opt_uid3 ne "*") && ($opt_uid2 eq "0"))
+		{
+    print "\n Error: uid3 specified without uid2 \n";
+	  $errors++;
+	  exit;
+	  }
+	     
+	$sourcefile=$arg;
+	}
+
+if ($errors || $sourcefile eq "")
+	{
+	print_usage();
+	exit 1;
+	}
+
+my @enabled_warnings = ();
+my $file_line;
+my @includes_from_config;
+my $epocrc_config = $ENV{EPOCROOT}. "epoc32\\tools\\epocrc.config";
+
+if(-e $epocrc_config)
+	{
+	print "Opening configuration file " . $ENV{EPOCROOT} . "epoc32\\tools\\epocrc.config.\n" if ($opt_v);
+	open EPOCRC_CONFIG, $ENV{EPOCROOT}. "epoc32\\tools\\epocrc.config" or die $ENV{EPOCROOT} . "epoc32\\tools\\epocrc.config";
+	
+	while ($file_line = <EPOCRC_CONFIG>)
+		{
+		if($file_line=~/^\s*check_rls_items\s*=\s*(\d+)\s*;?\s*(\#.*)?$/)
+			{ # matches check_rls_items = <digits> followed by optional semi-colon followed by optional perl comment
+			$check_rls_items = $1;
+			}
+		elsif($file_line=~/^\s*strict_checking\s*=\s*(\d+)\s*;?\s*(\#.*)?$/)
+			{ # matches strict_checking = <digits> followed by optional semi-colon followed by optional perl comment
+			$strict_checking = $1;
+			}
+		elsif($file_line=~/^\s*\#.*$/)
+			{ # matches perl comment on a line by itself
+			}
+		elsif($file_line=~/^\s*$/)
+			{ # matches empty lines and lines with only whitespace
+			}
+		elsif($file_line=~/^\s*Include\:\s*(.*)\s*$/i)
+			{ # matches Include: followed by a file location
+			push @includes_from_config, $1;
+			}
+		elsif($file_line=~/^\s*warnings_to_enable\s*=\s*(\S+)\s*;?\s*(\#.*)?$/)
+			{ # matches warnings_to_enable = <warnings> where <warnings> is a comma separated list of the warning numbers
+			$warnings_to_enable = $1;
+			# Append 0's to the warning numbers to make them 3 digit
+			@enabled_warnings = map (sprintf("%03d",$_), split(/,/, $warnings_to_enable));
+			}
+		else
+			{
+			print "Error: cannot parse line -- $file_line\n";
+			exit(1);
+			}
+		}
+	}
+else
+	{
+	print "No configuration file found at " . $ENV{EPOCROOT} . "epoc32\\tools\\epocrc.config, using default values.\n" if ($opt_v);
+	}
+
+unless ($check_rls_items==0 || $check_rls_items==1)
+	{
+	print "* Error: \$check_rls_items must take the value 0 or 1\n";
+	exit(1);
+	}
+unless ($strict_checking==0 || $strict_checking==1)
+	{
+	print "* Error: \$strict_checking must take the value 0 or 1\n";
+	exit(1);
+	}
+
+if($check_rls_items==0 && $strict_checking==1)
+	{
+	print "* Error: \$check_rls_items must be set to 1 to allow strict checking of rls comments\n";
+	exit(1);
+	}
+
+print "Values: \$check_rls_items=$check_rls_items ,\$strict_checking=$strict_checking and \$warnings_to_enable=$warnings_to_enable\n" if ($opt_v);
+ 
+# Remove the warnings to be enabled from the warnings to be supressed list
+if(@enabled_warnings) 
+	{
+ 	foreach my $warnings(@enabled_warnings)
+ 		{
+ 		$opt_m =~ s/$warnings,*//g;
+ 		}
+ 	}
+ 
+# Remove the last , character from $opt_m, which could have been left by previous processing
+$opt_m =~ s/,{1}$//;
+	
+# If all warnings are removed, then $opt_m needs to be blanked
+if ($opt_m =~/^-m$/) 
+	{
+	$opt_m = "";
+	}
+use File::Basename;
+my $outputfile=$opt_o;
+my $rss_base = basename($sourcefile);
+my ($rssfile) = split(/\./, $rss_base);	    # remove extension
+my $output_base;
+my $not_used;
+my $lang;
+my $rpp_name;
+
+if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+
+
+$output_base = basename($outputfile);
+($not_used,$lang) = split(/\.r/, $output_base);	    # get current lang from the filename
+
+$rpp_name = $tmpdir . $rssfile . $lang . ".rpp";
+
+}
+else {
+
+$rpp_name = $tmpdir. $rssfile . ".rpp";
+	
+}
+my $headerfile=$opt_h;
+
+if ($opt_v)
+	{
+	print "* Source file:   $sourcefile\n";
+	print "* Resource file: $outputfile\n" if ($outputfile ne "");
+	print "* Header file:   $headerfile\n" if ($headerfile ne "");
+	}
+
+$opt_o = "-o\"$outputfile\"" if ($outputfile ne "");
+$opt_h = "-h\"$headerfile\"" if ($headerfile ne "");
+
+
+#-------------------------------------------------------
+# Run the preprocessor
+#
+
+if($opt_cpp) 
+	{
+	$cpp_spec .= "-D_UNICODE " if ($unicode);
+	
+	$cpp_spec .= quoted_path($sourcefile) ." -o ". quoted_path($rpp_name);
+
+  # get the HRH file containing all the Variant specific Macros, if not specified on the command line
+	$variantMacroHRHFile = Variant_GetMacroHRHFile() if (!$variantMacroHRHFile);
+	if($variantMacroHRHFile)
+		{
+		my $variantFilePath = Path_Split('Path',$variantMacroHRHFile);
+		chop( $variantFilePath );
+		$cpp_spec .= " -I ".quoted_path($variantFilePath)." -include ".quoted_path($variantMacroHRHFile); 
+		}
+	
+	if($check_rls_items)
+		{
+		my $includePath;
+		foreach my $include (@includes_from_config)
+			{
+			my $relInclude = $ENV{EPOCROOT} . $include;
+			$relInclude=~s/^(.*)\\$/$1/;
+			if(-d $relInclude)
+				{				
+				$cpp_spec .= " -I ".quoted_path($relInclude);
+				}
+			elsif(-e $relInclude)
+				{
+				$includePath = Path_Split('Path',$include);
+				$includePath=~s/^(.*)\\$/$1/;
+				$cpp_spec .= " -I ".quoted_path($ENV{EPOCROOT}.$includePath)." -include ".quoted_path($relInclude);			
+				}
+			else
+				{
+				print "Warning; cannot recognise $include as a valid file or directory.\n";
+				}
+			}
+		}
+		
+	print "* $cpp_spec\n" if ($opt_v);
+	system($cpp_spec);
+
+	my $cpp_status = $?;
+	die "* cpp failed\n" if ($cpp_status != 0);
+	}
+
+
+#-------------------------------------------------------
+# Copy rpp files to epoc32\localisation if not checking
+# rls items for localisation tags
+
+if ($opt_l ne "" && $check_rls_items == 0)
+	{
+if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+	&Lockit_SrcFile($rssfile, $rpp_name, $opt_l, "RSC", "", $outputfile, $lang);
+}
+else {
+	&Lockit_SrcFile($rssfile, $rpp_name, $opt_l, "RSC", "", $outputfile);
+}
+	}
+
+#-------------------------------------------------------
+# Merge rls strings to rpp if not checking rls items
+# for localisation tags
+
+if($check_rls_items == 0)
+	{
+	&Merge_rls_string($rpp_name);	
+	}
+
+#-------------------------------------------------------
+# Test stage if -test_mode has been used
+#
+
+my $rcomp_spec = "";
+my $test_number = "";
+my $test_dir = "";
+my $output_redir = "";
+if($test_mode)
+	{
+	my $file_line;	
+	open EPOCRC_TEST, "epocrc.test";
+	while ($file_line = <EPOCRC_TEST>)
+		{
+		if($file_line =~ /^\s*RCOMP:\s*(\S+)\s*$/)
+			{
+			$rcomp_spec = $1;
+			}
+		elsif($file_line =~ /^\s*TEST-NUMBER:\s*(\d+)\s*$/)
+			{
+			$test_number = "$1";
+			}
+		elsif($file_line =~ /^\s*TEST-DIR:\s*(\S+)\s*$/)
+			{
+			$test_dir = $1;
+			}
+		}
+	if($rcomp_spec eq "" || $test_number eq "" || $test_dir eq "")
+		{
+		print "$rcomp_spec\n";
+		print "$test_number\n";
+		print "$test_dir\n";
+		print "Error: could not extract required information from epocrc.test file\n";
+		exit(1);
+		}
+	$output_redir = " 1>" . $test_dir . $rcomp_spec . "\.stdout 2>" . $test_dir . $rcomp_spec . "\.stderr";
+	$rcomp_spec .= " ";
+	}
+		
+#-------------------------------------------------------
+# Run the resource compiler
+#
+if($rcomp_spec eq "")
+	{
+	$rcomp_spec = "rcomp ";
+	}
+$rcomp_spec .= "-u " if ($unicode);
+$rcomp_spec .= "-v " if ($opt_vmore);
+$rcomp_spec .= "$opt_m " if ($opt_m ne "");
+$rcomp_spec .= "-l " if ($check_rls_items);
+$rcomp_spec .= "-force " if($strict_checking); 
+if ($opt_uid2 ne '' || $opt_uid3 ne '')
+	{
+	$opt_uid2 = "0" if ($opt_uid2 eq '');	# defaults to zero
+	$opt_uid3 = "*" if ($opt_uid3 eq '');	# defaults to * = derived from NAME
+	$rcomp_spec .= "-{$opt_uid2,$opt_uid3} ";
+	}
+$rcomp_spec .= "$opt_o $opt_h -s\"$rpp_name\" -i\"$sourcefile\"";
+$rcomp_spec .= "$output_redir";
+print "* $rcomp_spec\n" if ($opt_v);
+system($rcomp_spec);
+if ($? != 0)
+	{
+	print "* RCOMP failed - deleting output files\n";
+	unlink $outputfile if ($outputfile ne "");
+	unlink $headerfile if ($headerfile ne "");
+	exit 1;
+	}
+
+	if (-e $outputfile)
+	{
+		use File::stat; 
+		if (stat($outputfile)->size > 65535)
+		{
+			# Resource file bigger than 64kB are not supported.
+			print "* Compiled resource file bigger than 64kB\n";
+			print "* RCOMP failed - deleting output files\n";
+			unlink $outputfile if ($outputfile ne "");
+			unlink $headerfile if ($headerfile ne "");
+			exit 1;
+		}
+	}
+
+#-------------------------------------------------------
+# Copy rpp files to epoc32\localisation if checked
+# file for localisation tags
+
+if ($opt_l ne "" && $check_rls_items == 1)
+	{
+if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+	&Lockit_SrcFile($rssfile, $rpp_name, $opt_l, "RSC", "", $outputfile, $lang);
+}
+else {
+	&Lockit_SrcFile($rssfile, $rpp_name, $opt_l, "RSC", "", $outputfile);
+}
+}
+
+# exit cleanly
+
+if(!$test_mode)
+	{
+	print "* deleting $rpp_name\n" if ($opt_v);
+	unlink $rpp_name;
+	}
+exit 0;
+
+
+#-------------------------------------------------------
+# Subroutine: convert path into something acceptable to CPP.EXE
+#
+
+sub quoted_path
+    {
+    my ($arg) = @_;
+    return "\"$arg\"" if ($arg !~ /^\\[^\\]/);	# not an absolute path
+    if ($curdrive eq "x")
+		{
+		$curdrive="";
+		$curdrive=$1 if (cwd =~ /^(.:)/);	
+		}
+    return "\"$curdrive$arg\"";
+    }
+
+#-------------------------------------------------------
+# Subroutine: Merge the rls strings in the rpp file specified
+#
+sub Merge_rls_string
+	{
+	my ($rppfile) = @_;
+
+	my $line;
+	my $StringId;
+	my $key;
+	my $value;
+	my $StringToSubstitute;
+	my %ResourceString;
+	
+	print "* merging text strings to $rppfile\n" if ($opt_v);
+	
+	open NEWRPP, ">$rppfile.new" or die "* Can't write to $rppfile.new";
+	open RPP, "$rppfile" or die "* Can't open $rppfile";
+	
+	while ($line = <RPP>) 	{
+		while (($StringId, $StringToSubstitute)=each %ResourceString)
+		{
+			$line=~s/\b$StringId\b/$StringToSubstitute/g if ($line !~ /^rls_string/);
+		}
+	
+		# find quoted "" strings
+		if($line =~ /^rls_string\s+(\S+)\s+(.*$)/)
+		{
+			my $text = $2;
+			$key = $1;
+			$line=~s/(.*)/\/\/$1/;
+			my $substr_count = 0;
+			if(!exists $ResourceString{$key})
+			{
+			SUBSTR:	while (1)
+			{
+				# find quoted "" strings e.g. "hello"
+				if($text =~ /^(\s*\"(.*?\\.)*.*?\")/)		
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find quoted '' strings. e.g. 'world'
+				elsif($text =~ /^(\s*\'(.*?\\.)*.*?\')/)			
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find hex strings e.g. <0x34><0x45><0x65>
+				elsif($text =~ /^(\s*(<.*?>)+)/)		
+				{
+					$value = $1;
+					$text = $';
+					++$substr_count;
+				}
+	
+				# find c comment e.g. /*hello world*/ (may exist between strings)
+				elsif($text =~ /^(\s*\/\*.*?\*\/)/)		
+				{
+					$text = $';
+					next SUBSTR; # ignore embedded comment
+				}
+	
+				# find c++ comment e.g. //hello world (may exist after strings)
+				elsif($text =~ /^(\s*\/\/.*$)/)		
+				{
+					$text = $';
+					next SUBSTR; # ignore trailing comment
+				}
+	
+				# exit search
+				else
+				{
+					if ($substr_count == 0)
+					{
+						warn("WARNING: rls_string $key either has incorrect syntax or no value\n");
+					}
+					last SUBSTR;
+				}
+			$ResourceString{$key} .= $value;
+			}
+		  	}
+		}
+		print NEWRPP $line;
+	}
+
+	close RPP;
+	close NEWRPP;
+	copy ("$rppfile.new", "$rppfile");
+	unlink ("$rppfile.new");
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/featurevariantmap.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,505 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# modified start: makefile improvement 
+use Cwd;
+# modified end: makefile improvement 
+use Digest::MD5;
+use File::Basename;
+
+package featurevariantmap;
+our $verbose = 0;
+
+my $featureListDir = "$ENV{EPOCROOT}epoc32\\include\\variant\\featurelists";
+
+sub LoadFeatureList
+	{
+	my %featurehash;
+	
+	# Try and find the feature master list folder
+	if (!opendir DIR, $featureListDir)
+		{
+		print "\nERROR: Failed to open feature list directory $featureListDir: $!";
+		return \%featurehash;
+		}
+		
+	# Load the list of features from each file
+	foreach my $file ( grep(/\.txt$/i, readdir DIR) )
+		{
+		$file = "$featureListDir\\$file";
+		print "Reading feature list from $file\n" if ($verbose);
+
+		if (!open IN, $file)
+			{
+			print "\nERROR: Failed to read feature list $file: $!";
+			}
+		else
+			{
+			while(my $line = <IN>)
+				{
+				$line =~ s/\/\/.+$//; # Get rid of c++ style comments
+				if ($line =~ /(\S+)/)
+					{
+					$featurehash{$1} = $file;
+					}
+				}
+			close IN;
+			}
+			
+		}
+	closedir DIR;
+	return \%featurehash;
+	}
+	
+sub ValidFeature
+{
+	our $featurelist;
+	my $name = shift;
+	
+	$featurelist = LoadFeatureList() if !$featurelist;
+	return exists $featurelist->{$name};
+# modified start: makefile improvement 
+}
+sub GetVariantListFromVmap
+{
+	my $obj = shift;
+	my $vmapfile = shift;
+	if(open(VMAP, "<$vmapfile"))
+	{
+		my @varlist;
+		while(<VMAP>)
+		{
+			if(/^\w{32}\s+(\w+)/)
+			{
+				push @varlist, $1;
+			}
+
+		}
+		close(VMAP);
+		return @varlist;
+	}
+	close(VMAP);
+	return;
+	
+}
+sub CheckOldVmapFile
+{
+	my $thisObj = shift;
+	my $vmapfile = shift;
+	my $varRef = shift;
+	my $buildincludes = $$varRef{BUILD_INCLUDES};
+	my $parents = $$varRef{PARENTS};
+	my $children = $$varRef{CHILDREN};
+	my $varianthrh = $$varRef{VARIANT_HRH};
+	my %variantMacrolist;
+	my $Options = "-dM -undef -nostdinc -+";
+	my $Drive = $1 if (Cwd->cwd =~ /^(.:)/);
+	if($buildincludes)
+	{
+		foreach (@$buildincludes)
+		{
+			$Options .= " -I \"".$Drive.$_."\"";
+		}
+	}
+	if($varianthrh)
+	{
+		$Options .= " \"".$Drive.$varianthrh."\"";
+	}
+	if(open(CPP, "cpp $Options 2>&1 |"))
+	{
+		while(<CPP>)
+		{
+			my ( $key, $value );
+			if (/^#define (\w+(?:\([^\)]*\))?)(?:\s(\S.*?))?\s*$/)
+			{
+				my $tmpKey = $1;
+				my $tmpValue = $2;
+				$tmpValue =~ s/,/\\,/g;
+				($key, $value ) = ( $tmpKey, $tmpValue ? "\'$tmpValue\'" : 'defined' );
+			}
+			if ($key && ValidFeature($key))
+			{
+				$variantMacrolist{$key} = $value;
+			}
+		}
+		if(!close(CPP))
+		{
+			print "Incomplete pre-precess of $varianthrh \n";
+		}
+	}
+	my $findReusedKey = 1;
+	my %vmapfeatureinfo;
+	my $keyhash;
+	my $macroList;
+	if(open(VMAP, "<$vmapfile"))
+	{
+		while(<VMAP>)
+		{
+			if(/^\w{32}\s+(\w+)/)
+			{
+				$findReusedKey = 1;
+				s/(^\w{32})\s+\w+\s+//;
+				$keyhash = $1;
+				my @feature = split(/(?<=[^\\]),/, $_);
+				foreach my $value (@feature)
+				{
+					if($value =~ /([^\s]*)\s*=\s*(.*)/)
+					{
+						$vmapfeatureinfo{$1} = $2;
+					}
+				}
+				foreach my $key (sort keys %vmapfeatureinfo)
+				{
+					
+					if(($vmapfeatureinfo{$key} eq "undefined") && (not(exists($variantMacrolist{$key}))))
+					{
+						$findReusedKey = 1;
+					}
+					elsif($vmapfeatureinfo{$key} eq $variantMacrolist{$key})
+					{
+						$findReusedKey = 1;
+					}else
+					{
+						$findReusedKey = 0;
+						last;
+					}
+				}
+				if( $findReusedKey == 1)
+				{
+					$macroList = $_;
+					last;
+				}
+				undef(%vmapfeatureinfor);
+				undef($keyhash);
+			}
+		}
+	}
+	if($findReusedKey == 1)
+	{
+    	return ($keyhash, $macroList);
+	}
+	else
+	{
+		return;
+	}
+}
+# modified end: makefile improvement 
+	
+# Usage:	featurevariantmap->Hash(\@sources, \%var)
+#
+# Generate a hash value from the source files for a target using the
+# given feature variant data.
+#
+# \@sources	- list of source files (full path)
+# \%var		- variant data (from featurevariantparser->GetVariant)
+#
+# returns the hash value, or "" if an error occurs.
+	
+sub Hash
+{
+	my $thisObj = shift;
+	my @result = $thisObj->HashAndFeatures(@_);
+	return $result[0];
+}
+
+# Usage:	featurevariantmap->HashAndFeatures(\@sources, \%var)
+#
+# Generate a hash value from the source files for a target using the
+# given feature variant data.
+#
+# \@sources	- list of source files (full path)
+# \%var		- variant data (from featurevariantparser->GetVariant)
+#
+# returns a list of two entries [0] the hash value, or "" if an error occurs [1] A string of macros tested or affecting the code
+
+sub HashAndFeatures
+{
+	my $thisObj = shift;
+	my $srcRef = shift;
+	my $varRef = shift;
+
+	return "" if (!$srcRef || !$varRef);
+	return "" if (!$$varRef{'VALID'});
+
+	# get the pre-processing options
+	my $pre = $$varRef{'PREINCLUDE'};
+	my $inc = $$varRef{'BUILD_INCLUDES'};
+	my $mac = $$varRef{'MACROS'};
+
+	# Pass -dU option to get list of macros affecting the code
+	my $options = "-dU -undef -nostdinc -+";
+
+	if ($pre)	# pre-include file
+	{
+		$options .= " -include \"$pre\"";
+	}
+
+	if ($inc)	# include directories
+	{
+		foreach (@$inc)
+		{
+			$options .= " -I \"$_\"";
+		}
+	}
+
+	if ($mac)	# macro definitions
+	{
+		foreach (@$mac)
+		{
+			$options .= " -D$_";
+		}
+	}
+
+	my %testedMacrosHash;
+	
+	# Macros that affect the mmp file also affect the variant - so add them to the list
+	foreach my $key ( keys %{ $$varRef{MMPTESTED} } )
+		{
+		$testedMacrosHash{$key} = $$varRef{MMPTESTED}->{$key} if (ValidFeature($key));
+		}
+		
+	foreach my $src (@$srcRef)
+	{
+		my $options = "-I " . File::Basename::dirname($src) . " $options";
+
+		print "cpp $options $src\n" if ($verbose);
+
+		if (open(CPP, "cpp $options $src 2>&1 |"))
+		{
+			while (<CPP>)
+			{
+				print $_ if ($verbose && /No such file/);
+
+				# Scan for #define or #undef generated for -dU
+				my ( $key, $value );
+				if (/^#define (\w+(?:\([^\)]*\))?)(?:\s(\S.*?))?\s*$/)
+				{
+# modified start: makefile improvement 
+					my $tmpKey = $1;
+					my $tmpValue = $2;
+					$tmpValue =~ s/,/\\,/g;
+					( $key, $value ) = ( $tmpKey, $tmpValue ? "\'$tmpValue\'" : 'defined' );
+# modified end: makefile improvement 
+				}
+				elsif (/^#undef (.+)$/)
+				{
+					( $key, $value ) = ( $1, 'undefined' );
+				}
+				
+				if ($key && ValidFeature($key))
+				{
+					# Warn the user if a macro appears to have changed value - shouldn't really happen
+					# Feature macros should only be set in platform HRH files and not in the code
+					if (exists $testedMacrosHash{$key} && $testedMacrosHash{$key} ne $value)
+					{
+						print "WARNING: Feature macro $key redefined from $testedMacrosHash{$key} to $value\n";
+					}
+					
+					# Store the macro details
+					$testedMacrosHash{$key} = $value;
+				}
+			}
+			if (!close(CPP))
+			{
+				# this probably means that a rsg file was included
+				# that hasn't been generated yet.
+				print "Incomplete pre-process of $src\n" if ($verbose);
+			}
+		}
+		else
+		{
+			print "ERROR: Could not pre-process $src\n";
+			return "";
+		}
+	}
+
+	# Now generate the tested macros string
+	my $testedMacros = '';
+	foreach my $key ( sort keys %testedMacrosHash )
+	{
+		$testedMacros .= ',' if $testedMacros;
+		$testedMacros .= "$key=$testedMacrosHash{$key}";
+	}
+	
+	print "Tested feature list: $testedMacros\n" if $verbose;
+	return ( Digest::MD5::md5_hex($testedMacros), $testedMacros );
+}
+
+# Usage:	featurevariantmap->Save("my.dll", "1234", "myvar", \@hints)
+#
+# Write a hash value for a target into the target.vmap file along
+# with some optional hints data.
+#
+# "my.dll"	- the target (full path)
+# "1234"	- the hash value (32 character hex number)
+# "myvar"	- the feature variant name
+# \@hints	- optional list of extra strings (eg. "FEATUREVARIANT")
+#
+# returns 0 if OK and non-zero if an error occurs.
+
+sub Save
+{
+	my $thisObj = shift;
+	my $binName = shift;
+	my $keyValue = shift;
+	my $varName = shift;
+	my $features = shift;
+	my $hintRef = shift;
+
+	# read the current data first if the .vmap file already exists
+# modified by SV start: makefile improvement 
+	my $vmapFile = "$binName.$varName.vmap";
+	my @lines;
+	my $tmpinfo = "$keyValue $varName";
+	$tmpinfo .= " $features" if $features;
+	if (open(VMAP, $vmapFile))
+	{
+		my @tmp=<VMAP>;
+		if (grep (/$tmpinfo/, @tmp)){
+			close(VMAP);
+			return 0;
+		}
+		else {
+			foreach  (@tmp)
+			{
+				if (/^\w{32}\s+(\w+)/)
+				{
+					push(@lines, $_) unless (uc($1) eq uc($varName));
+				}
+			}
+			close(VMAP);
+		}
+	}
+# modified by SV end: makefile improvement 
+
+	# write the new data to the .vmap file
+	if (!open(VMAP, ">$vmapFile"))
+	{
+		print "ERROR: Could not write VMAP to $vmapFile\n";
+		return 1;
+	}
+
+	# put the hints at the beginning
+	if ($hintRef)
+	{
+		foreach (@$hintRef)
+		{
+			print VMAP "$_\n";
+		}
+	}
+
+	# then the "key var" pairs
+	foreach (@lines)
+	{
+		print VMAP $_;
+	}
+	print VMAP "$keyValue $varName";
+	print VMAP " $features" if $features;
+	print VMAP "\n";
+	
+	close(VMAP);
+	return 0;
+}
+
+# Usage:    featurevariantmap->Find("my.dll", "myvar")
+#
+# Look for a binary using its "final" name. We will use the feature
+# variant map and the feature variant name to deduce the "variant"
+# binary name and test for its existence.
+#
+# "my.dll"	- the final target (full path)
+# "myvar"	- the feature variant name
+#
+# returns the file name if found, or "" otherwise.
+
+sub Find
+{
+	my $thisObj = shift;
+	my $binName = shift;
+	my $varName = shift;
+
+	# look for the vmap file
+# modified by SV start: makefile improvement 
+	my $vmapFile = "$binName.$varName.vmap";
+# modified by SV end: makefile improvement 
+
+	if (-e $vmapFile)
+	{
+		my $key = $thisObj->GetKeyFromVMAP($varName, $vmapFile);
+
+		if ($key)
+		{
+			$binName =~ /^(.*)\.([^\.]*)$/;
+			$binName = "$1.$key.$2";
+		}
+		else
+		{
+			print "ERROR: No \'$varName\' variant for $binName in $vmapFile\n";
+			return "";	# file not found
+		}
+	}
+
+	# check that the actual binary exists
+	if (-e $binName)
+	{
+		return $binName;
+	}
+	return "";	# file not found
+}
+
+# internal functions
+
+sub GetKeyFromVMAP
+	{
+	my $thisObj = shift;
+	my @res = $thisObj->GetDataFromVMAP(@_);
+	return $res[0];
+	}
+	
+# Usage:    featurevariantmap->GetDataFromVMAP("myvar", "mydll.vmap")
+#
+# Opens the vmap file indicated and returns the data for the requested variant
+#
+# "myvar"	- the feature variant name
+# "my.vmap"	- the final target vmap file (full path)
+#
+# Returns a list ( hash, features ) for the variant in the vmap or undef if not found
+
+sub GetDataFromVMAP
+{
+	my $thisObj = shift;
+	my $varName = shift;
+	my $fileName = shift;
+
+	if (!open(VMAP, $fileName))
+	{
+		print "ERROR: Could not read VMAP from $fileName\n";
+		return "";
+	}
+	while (<VMAP>)
+	{
+		chomp;
+		if (/(\w{32})\s+$varName\s+(.*)$/i or /(\w{32})\s+$varName$/i)
+		{
+			my ( $hash, $features ) = ( $1, $2 ? $2 : '' );
+			close(VMAP);
+			return ( $hash, $features );
+		}
+	}
+	close(VMAP);
+	return;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/featurevariantparser.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,939 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# Module FEATUREVARIANTPARSER. Parses .VAR files and returns key variables.
+
+# The following hashes can be used with this module:
+
+# NAME 				-> Returns the name of the variant file (without the extension)
+
+# FULLPATH 			-> Returns the full path of the variant file (including the extension)
+
+# VALID 			-> Set to 1 if the variant file is valid, otherwise set to 0
+
+# VIRTUAL 			-> Set to 1 if the variant is a grouping node, otherwise set to 0
+
+# ROM_INCLUDES 		-> Returns a pointer to the list of ROM_INCLUDES (including Parent nodes).
+
+# BUILD_INCLUDES 	-> Returns a pointer to the list of BUILD_INCLUDES (including Parent nodes).
+
+# VARIANT_HRH 		-> Returns the full VARIANT_HRH file path used by the VAR file.
+
+# PARENTS			-> Returns a pointer to the list of all the parent nodes, starting with immediate parent
+
+# CHILDREN			-> Returns a pointer to the list of all the children nodes.
+
+# USAGE : The GetVariant method should only be called using featurevariantparser->GetVariant(var_name, directory(optional) );
+# If the directory for the VAR file is not supplied,the default directory will be searched for var_name.var
+
+
+package featurevariantparser;
+use File::Spec;
+
+my @buildinclude;
+my @rominclude;
+my @parents;
+my @childNodes;
+my $virtual;
+my $childNodeStatus;
+my $varianthrh;
+
+my $defaultDir = "$ENV{EPOCROOT}epoc32\\tools\\variant";
+
+my $dir;
+my $fullpath;
+my $fulldir;
+
+my $pathregex = '.+[^\s]'  ;   # Regex to match all characters (including \ or /), excluding whitespaces.
+
+our $verbose = 0;
+
+# Wrapper function to return all the correct variables
+# Arguments : (Variant Name, Variant Directory(optional))
+# Returns a Hash.
+#
+# Note: This has to return a copy of all the data - no references!
+#  There are package globals that are reused on a call to this function
+#  so references would go out of date after repeated calls to GetVariant
+#  This package should have been written using objects - too late now
+
+sub GetVariant
+{
+
+    @buildinclude    = ();
+    @rominclude      = ();
+    @parents         = ();
+    @childNodes      = ();
+    $dir             = "";
+    $fullpath        = "";
+    $varianthrh      = "";
+    $virtual         = 0;
+    $childNodeStatus = 0;
+    
+    my $parnodes = "";
+    my %data;
+    my $children  = "";
+    my $romincs   = "";
+    my $buildincs = "";
+
+    $data{'VALID'} = 0;
+
+    my ( $empty, $varname, $dirname ) = @_;
+
+    my $fullvarpath = ReturnFullVariantPath( $varname, $dirname );
+
+    if ( $dirname )
+    {
+        $fulldir = $dirname;
+    }
+    else
+    {
+        $fulldir = $defaultDir;
+    }
+
+    $data{'FULLPATH'} = "$fullvarpath";
+    $data{'NAME'}     = "$varname";
+
+    # If the variant file exists, check the syntax and setup variables.
+    if ( FileExists($fullvarpath) )
+    {
+
+        if ( CheckVarFileSyntax( $fullvarpath, $varname ) )
+        {
+            $data{'VALID'} = 1;
+        }
+    }
+    else
+    {
+        print "ERROR: $fullpath" . " does not exist\n";
+    }
+
+    my $count = 0;
+
+    # If VAR file is valid, setup all other variables.
+    if ( $data{'VALID'} )
+    {
+
+        $romincs   = FindRomInclude($fullvarpath);
+        $buildincs = FindBuildInclude($fullvarpath);
+        $children  = FindChildNodes($fullvarpath);
+        $parnodes  = FindParentNodes($fullvarpath);
+
+        # Remove empty elements from the BUILD_INCLUDE list     
+        @$buildincs = grep /\S/, @$buildincs;
+
+        # Fix paths for all BUILD_INCLUDES
+        for ( my $i = 0 ; $i < scalar(@$buildincs) ; $i++ )
+        {
+            @$buildincs[$i] = FixPaths( @$buildincs[$i] );
+        }
+
+        # Remove empty elements from the ROM_INCLUDE list
+		@$romincs = grep /\S/, @$romincs;
+
+        # Fix paths for all ROM_INCLUDES
+        for ( my $i = 0 ; $i < scalar(@$romincs) ; $i++ )
+        {
+            @$romincs[$i] = FixPaths( @$romincs[$i] );
+        }
+
+        # Remove empty elements from the CHILDREN list
+		@$children = grep /\S/, @$children;
+		
+        # Remove empty elements from the PARENT list
+		@$parnodes = grep /\S/, @$parnodes;
+
+        $data{'BUILD_INCLUDES'} = CloneList($buildincs);        
+        $data{'ROM_INCLUDES'}   = CloneList($romincs);
+        $data{'PARENTS'}        = CloneList($parnodes);
+        $data{'CHILDREN'}       = CloneList($children);
+        $data{'VARIANT_HRH'}    = $varianthrh;
+        $data{'VIRTUAL'}        = $virtual;
+    }
+
+    # If variant file is not valid, return reference to a blank array
+    else
+    {
+        $data{'BUILD_INCLUDES'} = [];
+        $data{'ROM_INCLUDES'}   = [];
+        $data{'VARIANT_HRH'}    = "";
+        $data{'PARENTS'}        = [];
+        $data{'CHILDREN'}       = [];
+    }
+
+    return %data;
+}
+
+# Helper method that clones a reference to a simple list
+sub CloneList
+    {
+    my $ref = shift;
+    
+    # Check the reference is a list
+    die "Not a list ref" if ref($ref) ne 'ARRAY';
+    
+    # Create a new list object
+    my @list;
+    foreach my $entry ( @$ref )
+        {
+        # Only clone lists of scalars
+        die "Not a scalar" if ref($entry);
+        
+        # Add the entry to the new list
+        push @list, $entry;
+        }
+    
+    # return a reference to the copy    
+    return \@list;
+    }
+    
+# Method to correct all the slashes, and also append EPOCROOT if the path begins with a \ or /
+# If path doesn't start with \ or /, returns an abosulte canonical path
+sub FixPaths
+{
+
+    my $arr = $_[0];
+
+    if ( $arr =~ m/^\// )
+    {
+       $arr =~ s/^\/?//;
+        return File::Spec->canonpath( "$ENV{EPOCROOT}" . "$arr" );
+    }
+
+    elsif ( $arr =~ m/^\\/ )
+    {
+        $arr =~ s/^\\?//;
+        return File::Spec->canonpath( "$ENV{EPOCROOT}" . "$arr" );
+    }
+
+    else
+    {
+        return File::Spec->rel2abs( File::Spec->canonpath("$arr") );
+    }
+
+}
+
+# Method to construct a full variant path from the variant file and directory
+sub ReturnFullVariantPath
+{
+
+    my $vardirectory = $_[1];
+    my $varname      = $_[0];
+
+    # Check if a directory is supplied
+    if ($vardirectory)
+    {
+        $dir = "$vardirectory";
+    }
+
+    else
+    {
+        $dir = $defaultDir;
+    }
+    my $filename = "$varname" . "\.var";
+    $fullpath = File::Spec->catfile( File::Spec->rel2abs($dir), $filename );
+
+    if ( !File::Spec->file_name_is_absolute($fullpath) )
+    {
+        $fullpath = File::Spec->rel2abs($fullpath);
+    }
+
+    return $fullpath;
+}
+
+# Method to find the BUILDINCLUDE values of the VAR file.
+sub FindBuildInclude
+{
+
+    my $filename = $_[0];
+
+    my $parentNodes;
+
+    # Construct a list of parent nodes if node is a child
+    if ($childNodeStatus)
+    {
+        $parentNodes = FindParentNodes("$filename");
+    }
+
+    if ($parentNodes)
+    {
+
+        # Go through and build the list of all parent BUILD_INCLUDES
+        for ( my $i = scalar(@$parentNodes) - 1 ; $i >= 0 ; $i-- )
+        {
+
+            my $tmp = ReturnFullVariantPath( @$parentNodes[$i], $fulldir );
+            open( NEWHANDLE, "<$tmp" );
+            while (<NEWHANDLE>)
+            {
+                if (/BUILD_INCLUDE/)
+                {
+                    ExtractBuildIncludeValue($_);
+                }
+            }
+            close(NEWHANDLE);
+        }
+    }
+
+    # Append the BUILD_INCLUDES of the VAR file in the end
+    open( NEWHANDLE, "<$filename" );
+
+    while (<NEWHANDLE>)
+    {
+        if (/BUILD_INCLUDE/)
+        {
+            ExtractBuildIncludeValue($_);
+        }
+    }
+    close(NEWHANDLE);
+
+    undef(@parents);    # Flush out parent array
+
+    return \@buildinclude;
+
+}
+
+# Method to extract the BUILD_INCLUDE value of a node.
+sub ExtractBuildIncludeValue
+{
+
+# If modifier append is found, push the buildinclude to the end of the array list.
+    if (/^BUILD_INCLUDE\s+append\s+($pathregex)/)
+    {
+        push( @buildinclude, ($1) );
+
+    }
+
+# If modifier prepend is found, push the buildinclude to the beginning of the array list.
+    if (/^BUILD_INCLUDE\s+prepend\s+($pathregex)/)
+    {
+        unshift( @buildinclude, ($1) );
+    }
+
+#If keyword set is found, then empty the buildinclude variable and push the new value
+    if (/^BUILD_INCLUDE\s+set\s+($pathregex)/)
+    {
+        undef(@buildinclude);
+        push( @buildinclude, ($1) );
+    }
+
+}
+
+# Method to find the ROMINCLUDE values of the VAR file.
+sub FindRomInclude
+{
+
+    my $filename = $_[0];
+
+    my $parentNodes;
+
+    # Construct a list of parent nodes if node is a child
+    if ($childNodeStatus)
+    {
+        $parentNodes = FindParentNodes("$filename");
+    }
+
+    if ($parentNodes)
+    {
+
+        # Go through and build the list of all parent ROM_INCLUDES
+        for ( my $i = scalar(@$parentNodes) - 1 ; $i >= 0 ; $i-- )
+        {
+            my $t = ReturnFullVariantPath( @$parentNodes[$i], $fulldir );
+            open( NEWHANDLE, "<$t" );
+
+            while (<NEWHANDLE>)
+            {
+                if (/ROM_INCLUDE/)
+                {
+                    ExtractRomIncludeValue($_);
+                }
+            }
+            close(NEWHANDLE);
+        }
+    }
+
+    # Append the ROM_INCLUDES of the VAR file in the end
+    open( NEWHANDLE, "<$filename" );
+
+    while (<NEWHANDLE>)
+    {
+        if (/ROM_INCLUDE/)
+        {
+            ExtractRomIncludeValue($_);
+        }
+    }
+
+    undef(@parents);    # Flush out parent array;
+    return \@rominclude;
+
+}
+
+# Method to extract the ROM_INCLUDE value of a node.
+sub ExtractRomIncludeValue
+{
+
+# If modifier append is found, push the rominclude to the end of the array list.
+    if (/^ROM_INCLUDE\s+append\s+($pathregex)/)
+    {
+        push( @rominclude, ($1) );
+    }
+
+# If modifier prepend is found, push the rominclude to the beginning of the array list.
+    if (/^ROM_INCLUDE\s+prepend\s+($pathregex)/)
+    {
+        unshift( @rominclude, ($1) );
+    }
+
+# If keyword set is found, then empty the rominclude variable and push the new value
+    if (/^ROM_INCLUDE\s+set\s+($pathregex)/)
+    {
+        undef(@rominclude);
+        push( @rominclude, ($1) );
+    }
+
+}
+
+# Method to find the immediate parent node of a child node
+sub ExtractExtendsValue
+{
+
+    $_[0] =~ m/^EXTENDS\s+(\w+)/;
+    return $1;
+}
+
+# Extract the value of the VARIANT keyword
+sub ExtractVariantValue
+{
+
+    $_[0] =~ m/^VARIANT\s+(\w+)/;
+    return $1;
+}
+
+# Extracts the value of the HRH file from the VARIANT_HRH line supplied
+sub ExtractHrhValue
+{
+
+    $_[0] =~ m/^VARIANT_HRH\s+($pathregex)/;
+    return $1;
+
+}
+
+# Finds if the variant file is a group node
+# Note: This method is only a supplementary method, not actually used during this module
+#       Provides a quick way to check is any VAR file is grouping node or not without loading the entire file.
+sub IsVirtual
+{
+
+    my $filename = $_[0];
+
+    open( READHANDLE, "<$filename" );
+    while (<READHANDLE>)
+    {
+        if (/^VIRTUAL\s*$/)
+        {
+            close(READHANDLE);
+            return 1;
+        }
+    }
+    close(READHANDLE);
+    return 0;
+}
+
+# Constructs a list of Parent nodes for a given Child node.
+sub FindParentNodes
+{
+
+    my $filename   = $_[0];
+    my $hasparents = 0;
+
+    open( READHANDLE, "<$filename" );
+    while (<READHANDLE>)
+    {
+        if (/EXTENDS/)
+        {
+            $hasparents = 1;
+            push( @parents, ExtractExtendsValue($_) );
+
+        }
+    }
+
+    close(READHANDLE);
+
+    if ( $hasparents == 1 )
+    {
+        FindParentNodes(
+            ReturnFullVariantPath( @parents[ scalar(@parents) - 1 ], $fulldir )
+        );
+    }
+    else
+    {
+        return \@parents;
+    }
+
+}
+
+# Constructs a list of Child nodes for a given Parent node (full path or .var path required)
+sub FindChildNodes
+{
+
+    my $var = ReturnNativeVarName("$_[0]");
+
+    my $tmpname    = "";
+    my @childarray = ();
+
+    opendir( DIR, $fulldir );
+
+    while ( defined( my $file = readdir(DIR) ) )
+    {
+
+        if ( $file =~ m/\.var$/ )
+        {
+            $tmpname = $file;
+            $tmpname =~ s/\.var$//;
+
+            open( FILEHANDLE, ReturnFullVariantPath( $tmpname, $fulldir ) );
+
+            while (<FILEHANDLE>)
+            {
+
+                if (/^EXTENDS/)
+                {
+                    if ( lc $var eq lc ExtractExtendsValue($_) )
+                    {
+                        push( @childarray, $tmpname );
+                    }
+                }
+
+            }
+            close(FILEHANDLE);
+        }
+    }
+
+    close(DIR);
+
+    foreach my $child (@childarray)
+    {
+        push( @childNodes, $child );
+    }
+
+    foreach my $child (@childarray)
+    {
+        FindChildNodes( ReturnFullVariantPath( $child, $fulldir ) );
+    }
+
+    return \@childNodes;
+}
+
+# Method to return all the buildable (i.e. No syntax erros and non-virtual) list of
+# variants that can be built in the specified directory. If no directory is specified,
+# the default location is searched.
+
+# Usage: GetBuildableFeatureVariants(<Directory>)
+
+sub GetBuildableFeatureVariants
+{
+
+    my $empty = shift;
+    my $dir   = shift;
+    my @list;
+    my $fulldir;
+
+    if ( $dir )
+    {
+        $fulldir = $dir;
+    }
+    else
+    {
+        $fulldir = $defaultDir;
+    }
+
+    opendir( DIR, $fulldir );
+
+    while ( defined( my $file = readdir(DIR) ) )
+    {
+
+        if ( $file =~ m/\.var$/ )
+        {
+
+            $file =~ s/\.var$//;
+
+            my $fullpath = ReturnFullVariantPath( $file, $fulldir );
+
+            if ( CheckVarFileSyntax( $fullpath, $file )
+                && !IsVirtual($fullpath) )
+            {
+                push( @list, $file );
+
+            }
+        }
+    }
+
+    return sort @list;
+
+}
+
+# Method to return a list of the valid and non-virtual children of a given VAR node, in a given location.
+# If the calling var file is non-virtual, it is returned as the only element of the list If not, then
+# the method parses though and finds all buildable children
+
+# USAGE: ResolveFeatureVariant(<varname>,<dirame>);
+
+sub ResolveFeatureVariant
+{
+
+    my $empty   = shift;
+    my $varfile = shift;
+    my $dir     = shift;
+    my $fulldir;
+    my @list;
+
+    if ( !$dir eq "" )
+    {
+        $fulldir = $dir;
+    }
+    else
+    {
+        $fulldir = $defaultDir;
+    }
+    my $fullpath = ReturnFullVariantPath( $varfile, $fulldir );
+
+    if ( CheckVarFileSyntax( $fullpath, $varfile ) && !IsVirtual($fullpath) )
+    {
+        push( @list, $varfile );
+        return @list;
+    }
+
+    my %variant = GetVariant( 0, $varfile, $fulldir );
+    my $child = $variant{'CHILDREN'};
+
+    foreach my $item (@$child)
+    {
+
+        my $fullpath = ReturnFullVariantPath( $item, $fulldir );
+
+        if ( CheckVarFileSyntax( $fullpath, $item ) && !IsVirtual($fullpath) )
+        {
+            push( @list, $item );
+        }
+    }
+
+    return @list;
+
+}
+
+# Method to return all valid (no syntax errors only) list of variants
+# in the specified directory. If no directory is specified,the default location is searched.
+
+# Usage: GetValidVariants(<Directory>)
+
+sub GetValidVariants
+{
+
+    my $empty = shift;
+    my $dir   = shift;
+    my @list;
+    my $fulldir;
+
+    if ( !$dir eq "" )
+    {
+        $fulldir = $dir;
+    }
+    else
+    {
+        $fulldir = $defaultDir;
+    }
+
+    opendir( DIR, $fulldir );
+
+    while ( defined( my $file = readdir(DIR) ) )
+    {
+
+        if ( $file =~ m/\.var$/ )
+        {
+
+            $file =~ s/\.var$//;
+
+            my $fullpath = ReturnFullVariantPath( $file, $fulldir );
+
+            if ( CheckVarFileSyntax( $fullpath, $file ) )
+            {
+
+                push( @list, $file );
+
+            }
+        }
+    }
+
+    return sort @list;
+}
+
+# Returns the Variant name from a complete path, without the .var extension
+sub ReturnNativeVarName
+{
+
+    my $tmp = "$_[0]";
+    $tmp =~ /^.*[\\|\/](.*)\.var$/i;  
+    return $1;
+
+}
+
+# Checks if a file passed to this function exists.
+sub FileExists
+{
+	return -e $_[0];
+
+}
+
+# Checks if the default variant file (default.var) exists in the directory supplied.
+# If no directory is supplied, looks under the default location.
+# Should only be called directly from the featurevariantparser module reference, not from any methods within the module.
+
+# USAGE: featurevariantparser->DefaultExists(<DirName>);
+# <DirName> : Optional -- Specifies which directory to look under to find the default.var file. Can be relative or absolute.
+
+sub DefaultExists
+{
+
+    my $dirToSearch = "";
+    if ( $_[1] )
+    {
+        $dirToSearch = $_[1];
+    }
+    else
+    {
+        $dirToSearch = $defaultDir;
+    }
+
+    $dirToSearch =
+      File::Spec->canonpath(
+        File::Spec->rel2abs( File::Spec->canonpath("$dirToSearch") ) );
+
+    return ( -e "$dirToSearch/default.var" );
+
+}
+
+# Checks the variant file for the correct syntax and reports any errors
+# Also sets up some variables(VIRTUAL ,VARIANT_HRH and VARIANT) whilst file is being parsed.
+
+# Usage: CheckVarFileSyntaxt(<fullpath>,<varfile>) . Note: <varfile> without .var
+sub CheckVarFileSyntax
+{
+
+    my $fullpath          = $_[0];
+    my $varname           = $_[1];
+    my $varianthrhpresent = 0;
+
+    open( READVAR, "<$fullpath" );
+    my $exp  = "#";
+    my $line = "";
+
+    while (<READVAR>)
+    {
+        $line = $.;
+
+	# Checks for a valid argument supplied to EXTENDS keyword. Checks for one and only one argument supplied.
+        if (/^EXTENDS/)
+        {
+            if ( !m/^EXTENDS\s+./ )
+            {
+                print "\nERROR: Invalid format supplied to argument EXTENDS on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+            my $str = ExtractExtendsValue($_);
+            if ( $str =~ /\s+/ )
+            {
+                print "\nERROR: Cannot extend from two nodes. Error in line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            $childNodeStatus = 1;
+
+        }
+
+        # Checks for the grammar of BUILD_INCLUDE, i.e. KEYWORD MODIFIER VALUE
+        elsif (/^BUILD_INCLUDE/)
+        {
+
+          if (!m/^BUILD_INCLUDE\s+(append|prepend|set)\s+$pathregex/)
+            {
+                print "\nERROR: Invalid syntax supplied to keyword BUILD_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+            
+		 if (m/^BUILD_INCLUDE\s+(append|prepend|set)\s+$pathregex\s+$pathregex/)
+            {
+                print "\nERROR: Too many arguments supplied to keyword BUILD_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+        }
+
+        # Checks for the grammar of ROM_INCLUDE, i.e. KEYWORD MODIFIER VALUE
+        elsif (/^ROM_INCLUDE/)
+        {
+
+		if (!m/^ROM_INCLUDE\s+(append|prepend|set)\s+$pathregex/)
+            {
+                print "\nERROR: Invalid syntax supplied to keyword ROM_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+       if (m/^ROM_INCLUDE\s+(append|prepend|set)\s+$pathregex\s+$pathregex/)
+            {
+                print "\nERROR: Too many arguments supplied to keyword ROM_INCLUDE on line "
+                  . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+        }
+
+        # Checks for a valid VARIANT name
+        elsif (/^VARIANT[^_HRH]/)
+        {
+            if ( !m/^VARIANT\s+\w+/ )
+            {
+                print "\nERROR: VARIANT name not specified on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+            if ( uc("$varname") ne uc( ExtractVariantValue($_) ) )
+            {
+                print "\nERROR: VARIANT filename does not match variant name specified on line "
+                  . "$line"
+                  . " in file "
+                  . "$fullpath"
+                  . "\nVariant value extracted from the VAR file is " . "$_";
+            }
+
+        }
+
+        # Checks that keyword VIRTUAL is declared correctly
+        elsif (/^VIRTUAL/)
+        {
+            if (m/^VIRTUAL\s+\w+/)
+            {
+                print "\nERROR: Invalid declaration of VIRTUAL on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            $virtual = 1;
+        }
+
+        # Checks if VARIANT_HRH is declared correctly.
+        elsif (/^VARIANT_HRH/)
+        {
+            $varianthrhpresent = 1;
+            my $lineno = $.;
+            if ( !m/^VARIANT_HRH\s+./ )
+            {
+                print "\nERROR: Invalid format supplied to argument VARIANT_HRH on line "
+                  . "$lineno"
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            my $str = ExtractHrhValue($_);
+            if ( $str =~ /\s+/ )
+            {
+                print "\nERROR: Cannot have 2 or more hrh files. Error in line "
+                  . "$lineno"
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+
+            if ( !FileExists( FixPaths($str) ) )
+            {
+                print "\nERROR: VARIANT HRH file : "
+                  . FixPaths($str)
+                  . " specified on line "
+                  . "$lineno"
+                  . " does not exist";
+                return 0;
+            }
+
+            $varianthrh = FixPaths( ExtractHrhValue($_) );
+
+        }
+        
+        # If none of the valid keywords are found
+        else
+        {
+
+            # Do nothing if a comment or blank line is found
+            if ( (m/$exp\s+\S/) || (m/$exp\S/) || ( !m/./ ) || (m/^\n/) )
+            {
+            }
+
+            # Unsupported keyword
+            else
+            {
+
+                print "\nERROR: Invalid keyword " . '"' . "$_" . '"'
+                  . " found on line " . "$."
+                  . " in file "
+                  . "$fullpath";
+                return 0;
+            }
+        }
+    }
+
+    close(READVAR);
+
+    # If no HRH file defined, check if the default one exists
+    if ( !$varianthrhpresent )
+    {
+        print "\nINFO: No VARIANT_HRH defined in VAR file, using $ENV{EPOCROOT}epoc32\\include\\variant\\$varname\.hrh" if ($verbose);
+        my $str =
+          ExtractHrhValue(
+            "VARIANT_HRH $ENV{EPOCROOT}epoc32\\include\\variant\\$varname\.hrh"
+          );
+
+        if ( !FileExists($str) )
+        {
+            print "\nERROR: VARIANT HRH file : " . "$str " . "does not exist\n";
+            return 0;
+        }
+        else
+        {
+            $varianthrh = $str;
+        }
+    }
+    return 1;
+}
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/fixsource.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,852 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+goto endofperl
+@rem ';
+#!perl
+#line 14
+
+
+use Getopt::Long;
+use File::Spec;
+use File::Copy;
+use File::Path;
+use File::Basename;
+
+my $toolVersion = "2.1";
+
+# Example warnings:
+#
+# Incorrect slash
+#	\src\common\generic\comms-infras\commsfw\group\bld.inf:10: Incorrect slash in PRJ_EXPORTS - '..\inc\commschan.h'.
+#	\src\cedar\generic\base\f32\group\ecomp.mmp:14: Incorrect slash in SYSTEMINCLUDE - '..\inc'.
+#	\src\common\generic\syncml\framework\TransportProvision\HttpWsp\SmlHttpBase.cpp:13: Incorrect slash in #include - 'http\rhttpheaders.h'.
+#
+# Incorrect case for epoc32 tree
+#	\src\common\generic\syslibs\pwrcli\group\bld.inf:23: Incorrect case for epoc32 tree in PRJ_EXPORTS - '\epoc32\rom\include\PwrCli.IBY'.
+#	\src\common\generic\security\crypto\group\hash.mmp:8: Incorrect case for epoc32 tree in TARGET - 'hash.DLL'.
+#	\src\common\generic\syslibs\ecom\ongoing\Framework\frame\Discoverer.cpp:20: Incorrect case for epoc32 tree in #include - 'BaSPI.h'.
+#
+# Incorrect case versus filesystem
+#	\src\common\generic\comms-infras\commdb\commdbshim\group\BLD.INF:20: Incorrect case versus filesystem in PRJ_EXPORTS - '..\inc\cdblen.h' vs. \src\common\generic\comms-infras\commdb\commdbshim\INC\CDBLEN.H.
+#	\src\common\generic\syslibs\ecom\ongoing\Framework\MMPFiles\EComServer.mmp:45: Incorrect case versus filesystem in USERINCLUDE - '..\..\framework\inc' vs. \src\common\generic\syslibs\ecom\ongoing\Framework\inc.
+#	\src\common\generic\comms-infras\commdb\commdbshim\INC\CDBOVER.H:16: Incorrect case versus filesystem in #include - 'cdbpreftable.h' vs. \src\common\generic\comms-infras\commdb\commdbshim\INC\CDBPREFTABLE.H.
+#
+# Incorrect case for epoc32 tree from default export (i.e. source export case will replicated under \epoc32)
+#	\src\common\generic\application-protocols\http\group\bld.inf:22: Incorrect case for epoc32 tree from default export in PRJ_EXPORTS - '..\inc\HTTPSocketConstants.h'.
+#	\src\common\generic\messaging\email\smtpservermtm\group\bld.inf:11: Incorrect case for epoc32 tree from default export in PRJ_EXPORTS - '..\inc\smts.h' vs. \src\common\generic\messaging\email\smtpservermtm\inc\SMTS.H.
+#
+# Incorrect case versus exclusion list
+#	\src\common\generic\Multimedia\openmax\group\bld.inf:14: Incorrect case versus exclusion list in PRJ_EXPORTS - '\epoc32\include\openmax\il\OMX_Types.h' vs. OMX_TYPES.H.
+#	\src\common\generic\Multimedia\openmax\inc\openmax\il\OMX_Audio.h:41: Incorrect case versus exclusion list in #include - 'OMX_Types.h' vs. OMX_TYPES.H.
+#
+# Can't find physical file match for
+#	\src\common\generic\app-framework\conarc\group\BLD.INF:48: Can't find physical file match for PRJ_TESTMMPFILES MMP - '..\tsrc\tcon3_V2.mpp' on filesystem.
+#
+
+
+# 1. Check arguments, output help etc.
+
+my $analyse = 0;
+my $list = 0;
+my $update = 0;
+my $warnings = "";
+my $verbose = 0;
+my $debug = 0;
+my $debugUpdate = 0;
+GetOptions ('analyse|a' => \$analyse, 'list|l' => \$list, 'update|u' => \$update, 'warnings|w=s' => \$warnings,
+			'verbose|v' => \$verbose, 'debug|d' => \$debug, 'debugupdate|du' => \$debugUpdate);
+
+if (@ARGV == 0)
+	{
+	print (STDERR "\nFIXSOURCE.BAT - Version $toolVersion\n");
+
+	print STDERR << 'END_OF_HELP';
+
+Usage: fixsource.bat -analyse|-list|-update|-warnings buildlog_1.log [buildlog_n.log] 
+
+Parses the output from the specified build logs to locate warnings produced via
+"abld -checksource".  Provides the option to update source automatically to comply
+with Symbian's Filename Policy.
+
+-analyse | -a	             List and describe all warnings that cannot be addressed
+                             by this tool.
+-list    | -l	             List all source files that can be updated by this tool
+                             using "-update".
+-update  | -u	             Update source files, as output by "-list", to comply with
+                             Symbian's Filename Policy.
+-warnings| -w [all|fixable]  Output all unique "-checksource" warnings present in the
+                             specified logs:
+                                all     - every warning, regardless of whether this
+                                          tool can fix them.
+                                fixable - only warnings that this tool can fix.
+-verbose | -v                Additional verbose output for the "-update" option.
+
+NOTES:
+* The tool assumes that the original build source and layout is present on the drive
+  where it is being executed.
+* With the exception of the "-warnings all" output, any warnings for files under the
+  known release and build locations of %EPOCROOT%epoc32\include and
+  %EPOCROOT%epoc32\build are discarded by default.
+
+END_OF_HELP
+
+	}
+
+
+# 2. Parse the logs storing all GNU format warnings and errors
+
+
+my %ActionableFilenamePolicyWarnings;	# Hash Key (filename)
+										#	Hash Key (line number)
+										#		Hash Key (problematic text)
+										#			Hash Key ORIGINAL_WARNINGS
+										#				Hash Key (original warning)
+										#					1
+										#			Hash Key ITEM
+										#				item type that has generated the warning
+										#			Hash Key SEARCH_TEXT
+										#				quotemeta version of problematic text
+										#			Hash Key UNIX_SLASH
+										#				1
+										#			Hash Key LOWERCASE
+										#				1
+										#			Hash Key PHYSICAL
+										#				1
+										#			Hash Key EXCLUSION
+										#				1
+										#			Hash Key PHYSICAL_REALITY
+										#				Hash Key (physical reality)
+										#					1
+										#				fully pathed filesystem reality used in physical checking
+										#			Hash Key EXCLUSION_LISTING
+										#				required format of reference as dictated from an exclusion list
+										#			Hash Key ACTUAL_TEST
+										#				test used for check when this differed from that in actual source
+										#			Hash Key DEFAULT_EXPORT
+										#				special case - a PRJ_EXPORTS line without a destination will break
+										#				the filename policy if the source line is not lowercase
+my %NonActionableFilenamePolicyWarnings;
+my %AllFilenamePolicyWarnings;
+my %OtherWarningsAndErrors;
+
+foreach my $BUILD_LOG (@ARGV)
+	{
+	open BUILD_LOG, "< $BUILD_LOG" or die "\nCannot read \"$BUILD_LOG\"!\n\n";
+
+	while (<BUILD_LOG>)
+		{
+		chomp;
+			
+		if (/^\\\S+:.*: .+$/)
+			{
+			if (!/:\d+: (Incorrect case|Incorrect slash|Can\'t find) /)
+				{
+				$OtherWarningsAndErrors{$_} = 1 if (!/(unresolved api-item|unknown base class|unresolved xref|no image file|xm-replace_text)/);	# Ignore the noise of doc stuff...
+				next;					
+				}
+
+			$AllFilenamePolicyWarnings{$_} = 1;
+			
+			if (/: Can\'t find /)
+				{
+				$NonActionableFilenamePolicyWarnings{$_} = 1;
+				next;
+				}
+
+			my $originalWarning = $_;
+
+			/(^.*):(\d+): Incorrect (case for epoc32 tree|case versus filesystem|case versus exclusion list|slash|case for epoc32 tree from default export) in (.+) - \'(.+?)\'/;
+
+			my $filename = $1;
+			my $lineNumber = $2;
+			my $type = $3;
+			my $item = $4;
+			my $problematicText = $5;
+
+			$type =~ s/case for epoc32 tree from default export/defaultexport/;
+			$type =~ s/case for epoc32 tree/lowercase/;
+			$type =~ s/case versus filesystem/physical/;
+			$type =~ s/case versus exclusion list/exclusion/;
+
+			my $actualTest = "";
+			my $physicalReality = "";
+			my $exclusionListing = "";
+			$actualTest = $1 if (/\(actual test \'(.*)\'\)/);
+
+			if (/ vs\. (.*)\./)
+				{
+				$physicalReality = $1 if ($type eq "physical");
+				$exclusionListing = $1 if ($type eq "exclusion");
+				}
+
+			if ($debug)
+				{
+				print ("ORIGINAL WARNING   : $originalWarning\n");
+				print ("FILENAME           : $filename\n");
+				print ("LINENUMBER         : $lineNumber\n");
+				print ("TYPE               : $type\n");
+				print ("ITEM               : $item\n");
+				print ("PROBLEMATIC TEXT   : $problematicText\n");
+				print ("ACTUAL TEST        : $actualTest\n") if ($actualTest);
+				print ("PHYSICAL REALITY   : $physicalReality\n") if ($physicalReality);
+				print ("EXCLUSION LISTING  : $exclusionListing\n") if ($exclusionListing); 
+				print ("\n");
+				}
+
+			next if ($warnings =~ /all/i);
+
+	# Line Number
+
+			my $lineNumberHashRef;
+			if ($ActionableFilenamePolicyWarnings{$filename})
+				{
+				$lineNumberHashRef = $ActionableFilenamePolicyWarnings{$filename};
+				}
+			else
+				{
+				my %newHash;
+				$lineNumberHashRef = \%newHash;
+				$ActionableFilenamePolicyWarnings{$filename} = $lineNumberHashRef;
+				}
+
+	# Problematic Text
+
+			my $problematicTextHashRef;
+			if ($lineNumberHashRef->{$lineNumber})
+				{
+				$problematicTextHashRef = $lineNumberHashRef->{$lineNumber};
+				}
+			else
+				{
+				my %newHash;
+				$problematicTextHashRef = \%newHash;
+				$lineNumberHashRef->{$lineNumber} = $problematicTextHashRef;
+				}
+
+	# Attributes
+
+			my $attributesHashRef;
+			if ($problematicTextHashRef->{$problematicText})
+				{
+				$attributesHashRef = $problematicTextHashRef->{$problematicText};
+				}
+			else
+				{
+				my %newHash;
+				$attributesHashRef = \%newHash;
+				$problematicTextHashRef->{$problematicText} = $attributesHashRef;
+				}
+
+	# Attributes : Original Warnings
+
+			my $originalWarningsHashRef;
+			if ($attributesHashRef->{ORIGINAL_WARNINGS})
+				{
+				$originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+				}
+			else
+				{
+				my %newHash;
+				$originalWarningsHashRef = \%newHash;			
+				$attributesHashRef->{ORIGINAL_WARNINGS} = $originalWarningsHashRef;
+				}
+			$originalWarningsHashRef->{$originalWarning} = 1;
+
+	# Attributes : Item
+
+			$attributesHashRef->{ITEM} = $item;
+
+	# Attributes : Search Text
+
+			$attributesHashRef->{SEARCH_TEXT} = quotemeta ($problematicText);
+
+	# Attributes : Unix Slash
+
+			$attributesHashRef->{UNIX_SLASH} = 1 if ($type eq "slash");
+
+	# Attributes : Lowercase
+
+			$attributesHashRef->{LOWERCASE} = 1 if ($type eq "lowercase");
+
+	# Attributes : Physical
+
+			$attributesHashRef->{PHYSICAL} = 1 if ($type eq "physical");
+
+	# Attributes : Exclusion
+
+			$attributesHashRef->{EXCLUSION} = 1 if ($type eq "exclusion");
+
+	# Attributes : Physical Reality
+
+			my $physicalRealityHashRef;
+			if ($physicalReality)
+				{
+				if ($attributesHashRef->{PHYSICAL_REALITY})
+					{
+					$physicalRealityHashRef = $attributesHashRef->{PHYSICAL_REALITY};
+					}
+				else
+					{
+					my %newHash;
+					$physicalRealityHashRef = \%newHash;			
+					$attributesHashRef->{PHYSICAL_REALITY} = $physicalRealityHashRef;
+					}
+				$physicalRealityHashRef->{$physicalReality} = 1;
+				}
+
+	# Attributes : Actual Test
+
+			$attributesHashRef->{ACTUAL_TEST} = $actualTest if ($actualTest);
+
+	# Attributes : Exclusion Listing
+
+			$attributesHashRef->{EXCLUSION_LISTING} = $exclusionListing if ($exclusionListing);
+
+	# Attributes : Default Export
+
+			$attributesHashRef->{DEFAULT_EXPORT} = 1 if ($type eq "defaultexport");
+			}
+		}
+
+	close BUILD_LOG;
+	}
+
+
+# 3. Examine source and warnings and compile lists of files and warnings that we can/can't do anything about
+
+my %WarningsNotMatchingSource;
+my %WarningsWithMissingFiles;
+my %WarningsForBothLowercaseAndPhysicalOnSameReference;
+my %WarningsForMultiplePhysicalUpdates;
+
+
+if ($analyse || $list || $update || $debugUpdate || $warnings =~ /^fixable$/i)
+	{
+		
+	foreach my $SOURCE_FILE (sort keys %ActionableFilenamePolicyWarnings)
+		{
+			
+	# Discard anything in known release locations
+
+		if ($SOURCE_FILE =~ /\\epoc32\\(include|build)\\/i)
+			{
+			delete ($ActionableFilenamePolicyWarnings{$SOURCE_FILE});
+			next;
+			}
+
+		my $lineNumbersHashRef = $ActionableFilenamePolicyWarnings{$SOURCE_FILE};
+
+	# Discard warnings where source files cannot be found
+
+		if (!(open SOURCE_FILE, "< $SOURCE_FILE"))
+			{
+			foreach my $lineNumber (sort keys (%$lineNumbersHashRef))
+				{
+				my $problematicTextHashRef = $lineNumbersHashRef->{$lineNumber};
+
+				foreach my $problematicText (sort keys (%$problematicTextHashRef))
+					{
+					my $attributesHashRef = $problematicTextHashRef->{$problematicText};
+					my $originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+					
+					foreach my $originalWarning (keys (%$originalWarningsHashRef))
+						{
+						$WarningsWithMissingFiles{$originalWarning} = 1;
+						}					
+					}
+				}
+			delete ($ActionableFilenamePolicyWarnings{$SOURCE_FILE});
+			next;
+			}
+
+
+	# Identify and discard warnings where, for the same reference:
+	# (a) both lowercase and physical warnings are flagged and
+	# (b) multiple, different, filesystem matches have been found
+	# These will need to be resolved manually
+
+		foreach my $lineNumber (sort keys (%$lineNumbersHashRef))
+			{
+			my $problematicTextHashRef = $lineNumbersHashRef->{$lineNumber};
+
+			foreach my $problematicText (sort keys (%$problematicTextHashRef))
+				{
+				my $attributesHashRef = $problematicTextHashRef->{$problematicText};
+				my $originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+
+				my $skipPhysicalUpdate = 0;
+				my $skipLowercaseUpdate = 0;
+				
+				if ($attributesHashRef->{LOWERCASE} && $attributesHashRef->{PHYSICAL})
+					{
+					$skipPhysicalUpdate = 1;
+					$skipLowercaseUpdate = 1;
+
+					foreach my $originalWarning (keys %{$originalWarningsHashRef})
+						{
+						next if ($originalWarning !~ /Incorrect case/);
+
+						$originalWarning =~ /\:(.*$)/;
+
+						my $lowercaseAndPhysicalWarningsHashRef;	
+						if ($WarningsForBothLowercaseAndPhysicalOnSameReference{$SOURCE_FILE})
+							{
+							$lowercaseAndPhysicalWarningsHashRef = $WarningsForBothLowercaseAndPhysicalOnSameReference{$SOURCE_FILE};
+							}
+						else
+							{
+							my %newHash;
+							$lowercaseAndPhysicalWarningsHashRef = \%newHash;			
+							$WarningsForBothLowercaseAndPhysicalOnSameReference{$SOURCE_FILE} = $lowercaseAndPhysicalWarningsHashRef;
+							}
+						$lowercaseAndPhysicalWarningsHashRef->{$1} = 1;						
+						}
+					}
+
+				my $physicalRealityHashRef = $attributesHashRef->{PHYSICAL_REALITY};
+
+				if ($physicalRealityHashRef && ((keys %{$physicalRealityHashRef}) > 1))
+					{						
+					my $physicalMatchCheck;
+					if ($attributesHashRef->{ACTUAL_TEST})
+						{
+						$physicalMatchCheck = $attributesHashRef->{ACTUAL_TEST};
+						}
+					else
+						{
+						$physicalMatchCheck = $problematicText;
+						$physicalMatchCheck =~ s/\.\.[\\|\/]//g;
+						$physicalMatchCheck =~ s/\.[\\|\/]//g;
+						}
+
+					$physicalMatchCheck =~ s/\\\\/\\/g;		
+					$physicalMatchCheck =~ s/\/\//\//g;
+					$physicalMatchCheck =~ s/\//\\/g;
+					$physicalMatchCheck = quotemeta($physicalMatchCheck);
+					$physicalMatchCheck =~ s/\\\*/\\w\+/g;			# * -> \w+
+					$physicalMatchCheck =~ s/\\\?/\\w\{1\}/g;		# ? -> \w{1}
+
+					my %normalisedPhysicalReferences;
+	
+					foreach my $physicalReality (keys %{$physicalRealityHashRef})
+						{
+						$physicalReality =~ /($physicalMatchCheck)$/i;
+						$normalisedPhysicalReferences{$1} = 1;
+						}
+
+					if ((keys (%normalisedPhysicalReferences)) > 1)
+						{
+						foreach my $originalWarning (keys %{$originalWarningsHashRef})
+							{
+							next if ($originalWarning !~ /Incorrect case versus/);
+
+							$originalWarning =~ /\:(.*$)/;
+
+							my $multiplePhysicalWarningsHashRef;	
+							if ($WarningsForMultiplePhysicalUpdates{$SOURCE_FILE})
+								{
+								$multiplePhysicalWarningsHashRef = $WarningsForMultiplePhysicalUpdates{$SOURCE_FILE};
+								}
+							else
+								{
+								my %newHash;
+								$multiplePhysicalWarningsHashRef = \%newHash;			
+								$WarningsForMultiplePhysicalUpdates{$SOURCE_FILE} = $multiplePhysicalWarningsHashRef;
+								}
+							$multiplePhysicalWarningsHashRef->{$1} = 1;
+							}
+						$skipPhysicalUpdate = 1;
+						}
+					}
+
+				$attributesHashRef->{LOWERCASE} = 0 if ($skipLowercaseUpdate);
+				$attributesHashRef->{PHYSICAL} = 0 if ($skipPhysicalUpdate);
+
+				if (!$attributesHashRef->{LOWERCASE} && !$attributesHashRef->{PHYSICAL} &&
+					!$attributesHashRef->{UNIX_SLASH} && !$attributesHashRef->{DEFAULT_EXPORT} &&
+					!$attributesHashRef->{EXCLUSION})
+					{
+					delete ($problematicTextHashRef->{$problematicText});
+					}
+				}
+
+			delete ($lineNumbersHashRef->{$lineNumber}) if (!scalar (keys %{$problematicTextHashRef}));
+			}
+
+		my $lineNumber = 0;
+
+		while (my $line = <SOURCE_FILE>)
+			{
+			$lineNumber++;
+
+			next if (!($lineNumbersHashRef->{$lineNumber}));
+
+			my $problematicTextHashRef = $lineNumbersHashRef->{$lineNumber};
+
+			foreach my $text (keys %{$problematicTextHashRef})
+				{
+				my $attributesHashRef = $problematicTextHashRef->{$text};				
+
+				chomp ($line);
+
+				if ($line !~ /(\"|\<|^|\s){1}$attributesHashRef->{SEARCH_TEXT}/)
+					{
+					# Put warning(s) onto the failed list, as we can't find the required text
+					# in the source present on the machine
+						
+					my $originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+					foreach my $originalWarning (keys %{$originalWarningsHashRef})
+						{
+						$WarningsNotMatchingSource{$originalWarning} = $line;
+						}
+						
+					delete ($problematicTextHashRef->{$text});
+					}
+				}
+
+			delete ($lineNumbersHashRef->{$lineNumber}) if (!scalar (keys %{$problematicTextHashRef}));
+			}
+
+		delete ($ActionableFilenamePolicyWarnings{$SOURCE_FILE}) if (!scalar (keys %{$lineNumbersHashRef}));
+		close SOURCE_FILE;
+		}
+	}
+
+
+# 4. Provide -warnings [all|fixable] output
+
+if ($warnings =~ /^all$/i)
+	{
+	foreach my $warning (sort keys %AllFilenamePolicyWarnings)
+		{
+		print ("$warning\n");
+		}
+	}
+elsif ($warnings =~ /^fixable$/i)
+	{
+	my %fixableWarnings;
+		
+	foreach my $sourceFile (keys %ActionableFilenamePolicyWarnings)
+		{
+		my $lineNumbersHashRef = $ActionableFilenamePolicyWarnings{$sourceFile};
+		
+		foreach my $lineNumber (keys (%$lineNumbersHashRef))
+			{
+			my $problematicTextHashRef = $lineNumbersHashRef->{$lineNumber};
+
+			foreach my $text (keys %{$problematicTextHashRef})
+				{
+				my $attributesHashRef = $problematicTextHashRef->{$text};				
+				my $originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+
+				foreach my $originalWarning (keys %{$originalWarningsHashRef})
+					{						
+					$fixableWarnings{$originalWarning} = 1;
+					}
+				}
+			}
+		}
+
+	foreach my $fixableWarning (sort keys %fixableWarnings)
+		{
+		print ("$fixableWarning\n");
+		}		
+	}
+
+
+# 5. Provide -list output
+
+if ($list)
+	{
+	foreach my $sourceFile (sort keys %ActionableFilenamePolicyWarnings)
+		{
+		print ("$sourceFile\n");
+		}
+	}
+
+
+# 6. Provide -analyse output
+
+if ($analyse)
+	{
+	print ("\nFilename policy warnings with missing files\n".
+		     "-------------------------------------------\n\n");
+	foreach my $warningWithMissingFile (sort keys %WarningsWithMissingFiles)
+		{
+		print ("$warningWithMissingFile\n");
+		}
+	print ("NONE\n") if (!scalar (keys %WarningsWithMissingFiles));
+
+
+	print ("\n\nFilename policy warnings that don't match source\n".
+		       "------------------------------------------------\n\n");		
+	foreach my $warningNotMatchingSource (sort keys %WarningsNotMatchingSource)
+		{
+		print ("$warningNotMatchingSource\n");
+		print ("\tACTUAL LINE : \'$WarningsNotMatchingSource{$warningNotMatchingSource}\'\n");
+		}
+	print ("NONE\n") if (!scalar (keys %WarningsNotMatchingSource));
+
+	print ("\n\nFilename policy warnings with both lowercase and physical warnings for the same reference\n".
+		       "-----------------------------------------------------------------------------------------\n\n");		
+	foreach my $sourceFile (sort keys %WarningsForBothLowercaseAndPhysicalOnSameReference)
+		{
+		print ("$sourceFile\n");
+		foreach my $warning (sort keys %{$WarningsForBothLowercaseAndPhysicalOnSameReference{$sourceFile}})
+			{
+			print ("\t$warning\n");
+			}
+		}
+	print ("NONE\n") if (!scalar (keys %WarningsForBothLowercaseAndPhysicalOnSameReference));
+
+	print ("\n\nMultiple differing physical filename policy warnings for the same reference\n".
+		       "---------------------------------------------------------------------------\n\n");		
+	foreach my $sourceFile (sort keys %WarningsForMultiplePhysicalUpdates)
+		{
+		print ("$sourceFile\n");
+		foreach my $warning (sort keys %{$WarningsForMultiplePhysicalUpdates{$sourceFile}})
+			{
+			print ("\t$warning\n");
+			}
+		}
+	print ("NONE\n") if (!scalar (keys %WarningsForMultiplePhysicalUpdates));
+
+	print ("\n\nNon-actionable filename policy warnings\n".
+		     "---------------------------------------\n\n");		
+	foreach my $nonActionableWarning (sort keys %NonActionableFilenamePolicyWarnings)
+		{
+		print ("$nonActionableWarning\n");
+		}
+	print ("NONE\n") if (!scalar (keys %NonActionableFilenamePolicyWarnings));
+
+
+	print ("\n\nOther detected warnings unrelated to filename policy\n".
+		     "----------------------------------------------------\n\n");		
+	foreach my $otherWarningOrError (sort keys %OtherWarningsAndErrors)
+		{
+		print ("$otherWarningOrError\n");
+		}
+	print ("NONE\n") if (!scalar (keys %OtherWarningsAndErrors));
+
+	print ("\n\n");
+	}
+
+
+# 7. Perform -update function
+
+if ($update || $debugUpdate)
+	{
+	foreach my $SOURCE_FILE (sort keys %ActionableFilenamePolicyWarnings)
+		{
+		if (!(open SOURCE_FILE, "< $SOURCE_FILE"))
+			{				
+			print ("ERROR: Could not open $SOURCE_FILE to read.\n");
+			next;
+			}
+
+		print ("Updating \'$SOURCE_FILE\'...\n") unless ($debugUpdate);
+
+		my $lineNumbersHashRef = $ActionableFilenamePolicyWarnings{$SOURCE_FILE};
+		my $lineNumber = 0;
+		my @newSourceFile;
+
+		while (my $line = <SOURCE_FILE>)
+			{
+			$lineNumber++;
+
+			if ($lineNumbersHashRef->{$lineNumber})
+				{				
+				print ("\tOriginal : $line") if ($verbose);
+					
+				my $problematicTextHashRef = $lineNumbersHashRef->{$lineNumber};
+
+				# We need to order the updates on a per-line basis so that, for example,
+				# a search and update for 'nkern\arm\' occurs after one for 'include\nkern\arm\nk_plat.h'
+				# We can do this by length, making sure the longest updates are performed first
+				my @problematicTextOrderedHashKeys = sort {length $b <=> length $a} (keys %{$problematicTextHashRef});
+
+				foreach my $problematicText (@problematicTextOrderedHashKeys)
+					{
+					my $attributesHashRef = $problematicTextHashRef->{$problematicText};
+					my $revisedText = $problematicText;
+
+		# Physical
+
+					if ($attributesHashRef->{PHYSICAL})
+						{
+						my $physicalRealityHashRef = $attributesHashRef->{PHYSICAL_REALITY};
+
+						my $physicalReality = (keys %{$physicalRealityHashRef})[0];
+						my $physicalRealityUnixSlash = $physicalReality;
+						$physicalRealityUnixSlash =~ s/\\/\//g;						
+							
+						if ($physicalReality =~ /($attributesHashRef->{SEARCH_TEXT})$/i ||
+							$physicalRealityUnixSlash =~ /($attributesHashRef->{SEARCH_TEXT})$/i)
+							{
+							# Simple case - direct match with just case and slash differences
+							my $replacement = $1;
+							$replacement =~ s/\\/\//g;
+							$revisedText =~ s/$attributesHashRef->{SEARCH_TEXT}/$replacement/;
+							}
+						else
+							{
+							# What we're looking at in the source file doesn't map directly
+							# to what's physically on the file system.
+
+							my $modifiedSearchText = $problematicText;
+							$modifiedSearchText =~ s/\.\.[\\|\/]//g;
+							$modifiedSearchText =~ s/\.[\\|\/]//g;
+
+							my $physicalMatchCheck;
+							if ($attributesHashRef->{ACTUAL_TEST})
+								{
+								$physicalMatchCheck = $attributesHashRef->{ACTUAL_TEST};
+								}
+							else
+								{
+								$physicalMatchCheck = $modifiedSearchText;
+								}
+
+							# The physical match check needs to remove double-slashing...
+							$physicalMatchCheck =~ s/\\\\/\\/g;		
+							$physicalMatchCheck =~ s/\/\//\//g;
+							
+							$modifiedSearchText = quotemeta($modifiedSearchText);
+							$physicalMatchCheck = quotemeta($physicalMatchCheck);
+
+							$physicalMatchCheck =~ s/\\\*/\\w\+/g;			# * -> \w+
+							$physicalMatchCheck =~ s/\\\?/\\w\{1\}/g;		# ? -> \w{1}
+
+							if ($physicalReality =~ /($physicalMatchCheck)$/i ||
+								$physicalRealityUnixSlash =~ /($physicalMatchCheck)$/i )
+								{
+								my $replacement = $1;
+								$replacement =~ s/\\/\//g;
+								
+								if ($attributesHashRef->{ACTUAL_TEST} &&
+									($attributesHashRef->{ITEM} =~ /MMP$/ || $attributesHashRef->{ITEM} =~ /DEFFILE/))
+									{
+									# Both DEFFILE and PRJ_[TEST]MMPFILE entries may be specifed without extension
+									$replacement =~ s/\.\w+$// if ($problematicText !~ /\.\w+$/);
+
+									# DEFFILE entries may have eabi\bwins in the physical match and had a "u" inserted or appended 
+									if ($attributesHashRef->{ITEM} =~ /DEFFILE/ && $replacement !~ /$modifiedSearchText$/i)
+										{
+										$replacement =~ s/(eabi|bwins)\//~\//i if ($problematicText =~ /~[\\|\/]/);
+										$replacement =~ s/u(\.\w+)?$/$1/i if ($attributesHashRef->{ITEM} !~ /NOSTRICTDEF/);
+										}
+									}
+
+								$revisedText =~ s/$modifiedSearchText/$replacement/;
+								}
+							else
+								{
+								print ("ERROR: Can\'t perform physical consistency updates for:");
+								
+								my $originalWarningsHashRef = $attributesHashRef->{ORIGINAL_WARNINGS};
+								foreach my $originalWarning (keys %{$originalWarningsHashRef})
+									{
+									print ("\t$originalWarning") if ($originalWarning =~ /case versus/);
+									}
+
+								print ("\n");
+								}
+							}
+						}
+
+		# Exclusion
+
+					if ($attributesHashRef->{EXCLUSION})
+						{
+						my $exclusionListingSearch = quotemeta($attributesHashRef->{EXCLUSION_LISTING});						
+						$revisedText =~ s/$exclusionListingSearch/$attributesHashRef->{EXCLUSION_LISTING}/i;
+						}						
+
+		# Slash
+					if ($attributesHashRef->{UNIX_SLASH})
+						{
+						$revisedText =~ s/\\/\//g;
+						$revisedText =~ s/\/\//\//g;		# Don't allow replacements that lead to "//" in paths
+						}
+
+		# Lowercase
+
+					if ($attributesHashRef->{LOWERCASE})
+						{
+						$revisedText = lc ($revisedText);
+						}
+
+		# Default Export
+
+					if ($attributesHashRef->{DEFAULT_EXPORT})
+						{
+						my $exportedFilename = lc (basename ($problematicText));							
+						$revisedText .= " \/epoc32\/include\/".$exportedFilename;
+						}
+
+					$line =~ s/(\"|\<|^|\s){1}$attributesHashRef->{SEARCH_TEXT}/$1$revisedText/;
+					}
+
+				print ("\tUpdated  : $line") if ($verbose);
+				}
+				
+			push @newSourceFile, $line;
+			}
+
+		close SOURCE_FILE;
+
+		if ($debugUpdate)
+			{
+			# Don't touch the original source, but create two trees for easy comparison
+				
+			my $baseDir = dirname ($SOURCE_FILE);				
+			mkpath ("\\compare\\orig".$baseDir);
+			mkpath ("\\compare\\updated".$baseDir);
+			print ("Copying  \'\\compare\\orig".$SOURCE_FILE."\'...\n");
+			copy ($SOURCE_FILE, "\\compare\\orig".$SOURCE_FILE);
+			$SOURCE_FILE = "\\compare\\updated".$SOURCE_FILE;
+			print ("Updating \'$SOURCE_FILE\'...\n");
+			}
+
+		if (!(open SOURCE_FILE, "> $SOURCE_FILE"))
+			{				
+			print ("ERROR: Could not open $SOURCE_FILE to write.\n");
+			next;
+			}
+
+		foreach my $line (@newSourceFile)
+			{
+			print (SOURCE_FILE $line);
+			}
+
+		close SOURCE_FILE;
+		}
+
+	print ("\n") if ($verbose);
+	}
+
+__END__
+
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/gendef.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+#!/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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# e32toolp/e32util/gendef.pl
+# 
+#
+
+use FindBin;		# for FindBin::Bin
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+}
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+unless (@ARGV>1)
+{
+	&Usage;
+}
+my @exports = @ARGV;
+my $outfile = shift @exports;
+
+open OUTFILE, ">$outfile" or die "Gendef.pl: Unable to open $outfile for writing";
+
+print OUTFILE "EXPORTS\n";
+my $exportNum = 1;
+foreach (@exports)
+{
+	print OUTFILE "\t$_ @ $exportNum NONAME\n";
+	++$exportNum;
+}
+
+close OUTFILE;
+
+#######################################################################
+# SUBROUTINES
+#######################################################################
+
+sub Usage () {
+
+	print(
+		"\n",
+		"GENDEF - Generate a DEF file from passed exports V$MajorVersion.$MinorVersion.$PatchVersion\n",
+		"\n",
+		"GENDEF.PL [output def file] [1st export name] ([Other export names]...)\n",
+		"\n",
+		"\n",
+		"\n"
+	);
+	exit 1;
+}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/genshimsrc.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,207 @@
+@REM Copyright (c) 2000-2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM
+
+@goto invoke
+
+#!perl
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+use Cwd;
+
+$_ = cwd;
+tr/\//\\/;
+my $Pwd = $_;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;				# check user has a version of perl that will cope
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+use lib $PerlLibPath;
+
+use Defutl;
+use Genutl;
+
+my %opts = ();
+
+my $result = GetOptions(\%opts,
+			"srcpath:s",
+			"defpath:s",
+			"name:s",
+			"version:s",
+			"alignstack",
+			"help",
+		       );
+
+Usage() if(!$result || $opts{'help'} || @ARGV < 1);
+
+my $srcPath = $opts{"srcpath"} || $Pwd;
+my $defPath = $opts{"defpath"} || $srcPath;
+my $outputName = $opts{"name"} || "shim";
+my %Version;
+if ($opts{version}) {
+	%Version = &Genutl_StringToVersion($opts{version}) or die "Bad version number\n";
+} else {
+	$Version{major} = 0;
+	$Version{minor} = 0;
+}
+
+my $infile = pop @ARGV;
+
+my @DefData;
+eval { &Def_ReadFileL(\@DefData, $infile); } ;
+die $@ if $@;
+
+sub WriteFunction($$$) {
+  my ($ordinal, $branchTarget, $comment) = @_;
+  my $fnName = "export_at_ordinal_$ordinal";
+  if ($branchTarget =~ /^\"(.*)\"$/) {
+	  $branchTarget = $1;
+	}
+  if ($comment =~ /(null)/) {
+    $comment = $branchTarget;
+  }
+
+  print CPP <<FUNCTION_DEFINITION;
+
+EXPORT_C __NAKED__ int $fnName()
+//
+// $comment
+//
+	{
+	asm("B $branchTarget ");
+	}
+
+FUNCTION_DEFINITION
+}
+
+sub WriteFunctionAligned($$$) {
+  my ($ordinal, $branchTarget, $comment) = @_;
+  my $fnName = "export_at_ordinal_$ordinal";
+  if ($branchTarget =~ /^\"(.*)\"$/) {
+	  $branchTarget = $1;
+	}
+  if ($comment =~ /(null)/) {
+    $comment = $branchTarget;
+  }
+
+  print CPP <<FUNCTION_DEFINITION2;
+
+EXPORT_C __NAKED__ int $fnName()
+//
+// $comment
+//
+	{
+	asm("stmfd sp!, {r4,lr} ");
+	asm("mov r4, sp ");
+	asm("bic sp, sp, #4 ");
+	asm("bl $branchTarget ");
+	asm("mov sp, r4 ");
+	asm("ldmfd sp!, {r4,pc} ");
+	}
+
+FUNCTION_DEFINITION2
+}
+
+sub WriteCppHeader($) {
+  my ($filename) = @_;
+  print CPP <<FILE_HEADER;
+//
+// $filename - generated by GENSHIMSRC.BAT
+//
+
+#include <e32def.h>
+#include <e32const.h>
+#include <cpudefs.h>
+
+FILE_HEADER
+}
+
+sub WriteExport($$$) {
+  my ($ordinal, $export, $comment) = @_;
+
+  if ($comment =~ /(null)/) {
+    $comment = $export;
+  }
+  printf DEF "\t${export}=export_at_ordinal_${ordinal}__Fv \@ $ordinal NONAME \; $comment\n";
+}
+
+my $cppFile = "$srcPath\\$outputName\.cia";
+die "ERROR: Couldn't open $cppFile\n" unless open CPP, ">$cppFile";
+my $vstring = &Genutl_VersionToFileAugment(%Version);
+my $defFile = "$defPath\\${outputName}$vstring\.def";
+die "ERROR: Couldn't open $defFile\n" unless open DEF, ">$defFile";
+
+WriteCppHeader(uc "${outputName}.cia");
+printf DEF "EXPORTS\n";
+
+foreach my $defData (@DefData){
+  my $ord = $$defData{Ordinal};
+  if ($ord) {
+	my $name = $$defData{Name};
+	my $comment = $$defData{Comment};
+	if ($opts{alignstack}) {
+		WriteFunctionAligned($ord, $name, $comment);
+	} else {
+		WriteFunction($ord, $name, $comment);
+	}
+	WriteExport($ord, $name, $comment);
+  }
+}
+
+close CPP;
+close DEF;
+
+#####################################################################
+sub Usage
+{
+	print <<EOT;
+
+genshimsrc
+
+	Generate source for a shim DLL and its associated deffile from a supplied deffile
+
+Usage:
+	genshimsrc [options] deffile
+
+Where:
+	[deffile]     The source deffile
+
+Options:
+	--srcpath         the path for the output source file (defaults to CWD)
+	--defpath         the path for the output DEF file (defaults to srcpath)
+	--name            the name to use for the output files (defaults to shim)
+	--version         the version to use for the output DEF file (defaults to 0.0)
+	--alignstack      use shims which align the stack to an 8 byte boundary
+EOT
+	exit 1;
+}
+
+1;
+
+__END__
+
+# Tell emacs that this is a perl script even 'though it has a .bat extension
+# Local Variables:
+# mode:perl
+# tab-width:4
+# End:
+
+:invoke
+@perl -x -S genshimsrc.bat %1 %2 %3 %4 %5 %6 %7 %8 %9
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/h2inc.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,956 @@
+#!/usr/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# e32toolp\e32util\h2inc.pl
+# Convert structures in C++ include files to assembler format
+# Syntax:
+# perl h2inc.pl <input.h> <output.inc> <format>
+# where <format>=arm or x86
+# 
+#
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+%basictypes = (
+	TInt8		=>	1,
+	TUint8		=>	1,
+	TInt16		=>	2,
+	TUint16		=>	2,
+	TInt32		=>	4,
+	TUint32		=>	4,
+	TInt		=>	4,
+	TUint		=>	4,
+	TInt64		=>	8,
+	TUint64		=>	8,
+	TLinAddr	=>	4,
+	TVersion	=>	4,
+	TPde		=>	4,
+	TPte		=>	4,
+	TProcessPriority => 4
+);
+
+if (scalar(@ARGV)!=3) {
+	die "H2INC format management tools V$MajorVersion.$MinorVersion.$PatchVersion\nperl h2inc.pl <input.h> <output.inc> <format>\n";
+}
+my ($infile, $outfile, $format) = @ARGV;
+open IN, $infile or die "Can't open $infile for input\n";
+my $in;
+while (<IN>) {
+	$in.=$_;
+}
+close IN;
+$format = uc($format);
+$format_sub = undef();
+$comment_sub = undef();
+$end_sub = undef();
+if ($format eq "ARMASM") {
+	$format_sub = \&armasm_format;
+	$comment_sub = \&armasm_comment;
+	$end_sub = \&armasm_end;
+} elsif ($format eq "AS") {
+	$format_sub = \&as_format;
+	$comment_sub = \&as_comment;
+	$end_sub = \&as_end;
+} elsif ($format eq "TASM") {
+	$format_sub = \&tasm_format;
+	$comment_sub = \&tasm_comment;
+	$end_sub = \&tasm_end;
+} else {
+	die "Format $format unknown\nOnly ARMASM, AS or TASM supported\n";
+}
+
+# First remove any backslash-newline combinations
+$in =~ s/\\\n//gms;
+
+# Change escaped quotes to double quotes
+$in =~ s/\\\"/\"\"/gms;
+$in =~ s/\\\'/\'\'/gms;
+
+# Remove any character constants
+$in =~  s/\'(.?(${0})*?)\'//gms;
+
+# Remove any string literals
+$in =~ s/\"(.*?)\"//gms;
+
+# Strip comments
+$in =~ s/\/\*(.*?)\*\//\n/gms;
+$in =~ s/\/\/(.*?)\n/\n/gms;
+
+# Collapse whitespace into a single space or newline
+$in =~ s/\t/\ /gms;
+$in =~ s/\r/\ /gms;
+$in =~ s/(\ )+/\ /gms;
+$in =~ s/\n(\ )*/\n/gms;
+$in =~ s/(\ )*\n/\n/gms;
+
+# Tokenize on non-identifier characters
+my @tokens0 = split(/(\W)/,$in);
+my @tokens;
+foreach $t (@tokens0) {
+	next if ($t eq " " or $t eq "");
+	push @tokens, $t;
+}
+
+my %macros;
+my %filescope;
+$filescope{file}=1;
+$filescope{name}='*** FILE SCOPE ***';
+my @ftypedefs;
+$filescope{typedefs}=\@ftypedefs;
+my $line=1;
+parse_scope(\%filescope, \@tokens, \$line);
+
+
+my @output;
+push @output, &$comment_sub('*' x 80);
+push @output, &$comment_sub($outfile);
+push @output, &$comment_sub('*' x 80);
+push @output, &$comment_sub("GENERATED FILE - DO NOT EDIT");
+push @output, "";
+
+output_scope(\%filescope, \@output);
+
+push @output, &$end_sub();
+push @output, "";
+
+open OUT, ">$outfile" or die "Can't open $outfile for write\n";
+print OUT join("\n", @output);
+print OUT "\n\n";
+close OUT;
+
+sub get_token($$) {
+	my ($tokenlist,$line) = @_;
+	while (scalar(@$tokenlist)) {
+		my $t = shift @$tokenlist;
+		return $t if (!defined($t));
+		return $t if ($t !~ /^\s*$/);
+		++$$line;
+	}
+}
+
+sub skip_qualifiers($) {
+	my ($tokens) = @_;
+	my $f=0;
+	my %quals = (
+		EXPORT_C => 1,
+		IMPORT_C => 1,
+		inline => 1,
+		const => 0,
+		volatile => 0,
+		static => 0,
+		extern => 0,
+		LOCAL_C => 0,
+		LOCAL_D => 0,
+		GLDEF_C => 0,
+		GLREF_C => 0,
+		GLDEF_D => 0,
+		GLREF_D => 0
+		);
+	for (;;) {
+		my $t = $$tokens[0];
+		my $q = $quals{$t};
+		last unless (defined ($q));
+		$f |= $q;
+		shift @$tokens;
+	}
+	return $f;
+}
+
+sub parse_indirection($) {
+	my ($tokens) = @_;
+	my $level = 0;
+	for (;;) {
+		my $t = $$tokens[0];
+		if ($t eq '*') {
+			++$level;
+			shift @$tokens;
+			next;
+		}
+		last if ($t ne "const" and $t ne "volatile");
+		shift @$tokens;
+	}
+	return $level;
+}
+
+sub parse_scope($$$) {
+	my ($scope, $tokens, $line) = @_;
+	my $state = 0;
+	my %values;
+	my @classes;
+	my @enums;
+	my $curr_offset=0;
+	my $overall_align=0;
+	$scope->{values}=\%values;
+	$scope->{classes}=\@classes;
+	$scope->{enums}=\@enums;
+	while (scalar(@$tokens)) {
+		my $t = shift @$tokens;
+		if ($state>=-1 and $t eq "\n") {
+			++$$line;
+			$state=1;
+			next;
+		} elsif ($state==-1 and $t ne "\n") {
+			next;
+		} elsif ($state==-2 and $t ne ';') {
+			next;
+		}
+		if ($state>0 and $t eq '#') {
+			if ($scope->{scope}) {
+				warn "Preprocessor directive in class/struct at line $$line\n";
+			}
+			$t = shift @$tokens;
+			if ($t eq 'define') {
+				my $ident = shift @$tokens;
+				my $defn = shift @$tokens;
+				if ($defn ne '(') {	# don't do macros with parameters
+					$macros{$ident} = $defn;
+				}
+			}
+			$state=-1;	# skip to next line
+			next;
+		}
+		if ($t eq "struct" or $t eq "class") {
+			next if ($state==0);
+			$state=0;
+			my %cl;
+			$cl{specifier}=$t;
+			$cl{scope}=$scope;
+			my @members;
+			my @typedefs;
+			$cl{members}=\@members;
+			$cl{typedefs}=\@typedefs;
+			my $new_class = \%cl;
+			my $n = get_token($tokens,$line);
+			if ($n !~ /\w+/) {
+				die "Unnamed $t not supported at line $$line\n";
+			}
+			$new_class->{name}=$n;
+			my @class_match = grep {$_->{name} eq $n} @classes;
+			my $exists = scalar(@class_match);
+			my $b = get_token($tokens,$line);
+			if ($b eq ':') {
+				die "Inheritance not supported at line $$line\n";
+			} elsif ($b eq ';') {
+				# forward declaration
+				push @classes, $new_class unless ($exists);
+				next;
+			} elsif ($b ne '{') {
+				die "Syntax error at line $$line\n";
+			}
+			if ($exists) {
+				$new_class = $class_match[0];
+				if ($new_class->{complete}) {
+					die "Duplicate definition of $cl{specifier} $n\n";
+				}
+			}
+			push @classes, $new_class unless ($exists);
+			parse_scope($new_class, $tokens, $line);
+			next;
+		} elsif ($t eq "enum") {
+			$state=0;
+			my $n = get_token($tokens,$line);
+			my $name="";
+			if ($n =~ /\w+/) {
+				$name = $n;
+				$n = get_token($tokens,$line);
+			}
+			push @enums, $name;
+			if ($n ne '{') {
+				die "Syntax error at line $$line\n";
+			}
+			parse_enum($scope, $tokens, $line, $name);
+			next;
+		} elsif ($t eq '}') {
+			$state=0;
+			if ($scope->{scope}) {
+				$t = get_token($tokens,$line);
+				if ($t eq ';') {
+					$scope->{complete}=1;
+					last;
+				}
+			}
+			die "Syntax error at line $$line\n";
+		}
+		$state=0;
+		if ($scope->{scope}) {
+			if ($t eq "public" or $t eq "private" or $t eq "protected") {
+				if (shift (@$tokens) eq ':') {
+					next;	# ignore access specifiers
+				}
+			die "Syntax error at line $$line\n";
+			}
+		}
+		unshift @$tokens, $t;
+		my @currdecl = parse_decl_def($scope, $tokens, $line);
+		if ($t eq 'static') {
+			next;	# skip static members
+		}
+		my $typedef;
+		if ($t eq 'typedef') {
+			$typedef = 1;
+			$t = shift @currdecl;
+			$t = $currdecl[0];
+		} else {
+			$typedef = 0;
+		}
+		next if (scalar(@currdecl)==0);
+		if ($t eq "const") {
+			# check for constant declaration
+			my $ctype = lookup_type($scope, $currdecl[1]);
+			if ($ctype->{basic} and $currdecl[2]=~/^\w+$/ and $currdecl[3] eq '=') {
+				if ($typedef!=0) {
+					die "Syntax error at line $$line\n";
+				}
+				shift @currdecl;
+				shift @currdecl;
+				my $type = $ctype->{name};
+				my $name = shift @currdecl;
+				my $size = $ctype->{size};
+				shift @currdecl;
+				my $value = get_constant_expr($scope,\@currdecl,$line);
+				$values{$name} = {type=>$type, size=>$size, value=>$value};
+				next;
+			}
+		}
+		if (skip_qualifiers(\@currdecl)!=0 or ($scope->{file} and !$typedef)) {
+			next;	# function declaration or stuff at file scope
+		}
+		my $type1 = shift @currdecl;	# type, type pointed to or return type
+		if ($type1 !~ /^\w+$/) {
+			die "Syntax error at line $$line\n";
+		}
+		my $ind1 = parse_indirection(\@currdecl);
+		my $ident;	# identifier being declared
+		my $size = -1;
+		my $array = -1;
+		my $align = 0;
+		my $alias;
+		my $category;
+		if ($currdecl[0] eq '(' and $currdecl[1] eq '*' and $currdecl[2]=~/^\w+$/) {
+			# function pointer
+			$ident = $currdecl[2];
+			$size = 4;
+			$category = 'fptr';
+			shift @currdecl;
+			shift @currdecl;
+			shift @currdecl;
+		} elsif ($currdecl[0]=~/^\w+$/) {
+			$ident = shift @currdecl;
+			if ($currdecl[0] ne '(') {
+				# not function declaration
+				if ($ind1>0) {
+					# pointer
+					$category = 'ptr';
+					$size = 4;
+				} else {
+					my $type2 = lookup_type($scope, $type1);
+					if (!defined($type2)) {
+						die "Unrecognised type $type1 at line $$line\n";
+					}
+					if ($type2->{basic}) {
+						$alias = $type2->{name};
+						$size = $type2->{size};
+						$category = 'basic';
+					} elsif ($type2->{enum}) {
+						$alias = $type2->{name};
+						$category = 'enum';
+						$size = 4;
+					} elsif ($type2->{class}) {
+						$alias = $type2->{name};
+						$size = $type2->{class}->{size};
+						$category = 'class';
+						$align = $type2->{class}->{align};
+					} elsif ($type->{ptr}) {
+						$size = 4;
+						$category = 'ptr';
+						$align = 4;
+					} elsif ($type->{fptr}) {
+						$size = 4;
+						$category = 'ptr';
+						$align = 4;
+					}
+				}
+			}
+		}
+		if ($size>0) {
+			# data member declared
+			# check for array
+			if ($currdecl[0] eq '[') {
+				shift @currdecl;
+				$array = get_constant_expr($scope, \@currdecl, $line);
+				if ($array<=0) {
+					die "Bad array size at line $$line\n";
+				}
+				if ($currdecl[0] ne ']') {
+					die "Syntax error at line $$line\n";
+				}
+			}
+			my $members = $scope->{members};
+			my $typedefs = $scope->{typedefs};
+			if ($align==0) {
+				$align = $size;
+			}
+			my $am = $align-1;
+			unless ($typedef) {
+				my $al = $curr_offset & $am;
+				if ($align==8 and $al!=0) {
+					die "Bad alignment of 64-bit data $ident at line $$line\n";
+				}
+				$curr_offset += ($align-$al) if ($al!=0);
+			}
+			if ($array>0) {
+				$size = ($size + $am) &~ $am;
+				if ($typedef) {
+					push @$typedefs, {name=>$ident, category=>$category, alias=>$alias, size=>$size*$array, spacing=>$size, array=>$array};
+				} else {
+					push @$members, {name=>$ident, size=>$size*$array, offset=>$curr_offset, spacing=>$size};
+				}
+				$size *= $array;
+			} else {
+				if ($typedef) {
+					push @$typedefs, {name=>$ident, category=>$category, alias=>$alias, size=>$size};
+				} else {
+					push @$members, {name=>$ident, size=>$size, offset=>$curr_offset};
+				}
+			}
+			unless ($typedef) {
+				$curr_offset += $size;
+				if ($align > $overall_align) {
+					$overall_align = $align;
+				}
+			}
+		}
+	}
+	if ($scope->{scope}) {
+		if ($state==-2) {
+			die "Missing ; at end of file\n";
+		}
+		if (!$scope->{complete}) {
+			die "Unexpected end of file at line $$line\n";
+		}
+		my $total_size = ($curr_offset + $overall_align - 1) &~ ($overall_align - 1);
+		$scope->{size} = $total_size;
+		$scope->{align} = $overall_align;
+	}
+}
+
+sub get_operand($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $t = get_token($tokens,$line);
+	if ($t eq '-') {
+		my $x = get_operand($scope,$tokens,$line);
+		return -$x;
+	} elsif ($t eq '+') {
+		my $x = get_operand($scope,$tokens,$line);
+		return $x;
+	} elsif ($t eq '~') {
+		my $x = get_operand($scope,$tokens,$line);
+		return ~$x;
+	} elsif ($t eq '!') {
+		my $x = get_operand($scope,$tokens,$line);
+		return $x ? 0 : 1;
+	} elsif ($t eq '(') {
+		my $x = get_constant_expr($scope,$tokens,$line);
+		my $t = get_token($tokens,$line);
+		if ($t ne ')') {
+			die "Missing ) at line $$line\n";
+		}
+		return $x;
+	} elsif ($t eq "sizeof") {
+		my $ident = get_token($tokens,$line);
+		if ($ident eq '(') {
+			$ident = get_token($tokens,$line);
+			my $cb = get_token($tokens,$line);
+			if ($cb ne ')') {
+				die "Bad sizeof() syntax at line $$line\n";
+			}
+		}
+		$ident = look_through_macros($ident);
+		if ($ident !~ /^\w+$/) {
+			die "Bad sizeof() syntax at line $$line\n";
+		}
+		my $type = lookup_type($scope, $ident);
+		if (!defined $type) {
+			die "Unrecognised type $ident at line $$line\n";
+		}
+		if ($type->{basic}) {
+			return $type->{size};
+		} elsif ($type->{enum}) {
+			return 4;
+		} elsif ($type->{ptr}) {
+			return 4;
+		} elsif ($type->{fptr}) {
+			return 4;
+		}
+		my $al = $type->{class}->{align};
+		my $sz = $type->{class}->{size};
+		return ($sz+$al-1)&~($al-1);
+	}
+	$t = look_through_macros($t);
+	if ($t =~ /^0x[0-9a-f]+/i) {
+		return oct($t);
+	} elsif ($t =~ /^\d/) {
+		return $t;
+	} elsif ($t =~ /^\w+$/) {
+		my $x = lookup_value($scope,$t);
+		die "Unrecognised identifier '$t' at line $$line\n" unless defined($x);
+		return $x;
+	} else {
+		die "Syntax error at line $$line\n";
+	}
+}
+
+sub look_through_macros($) {
+	my ($ident) = @_;
+	while ($ident and $macros{$ident}) {
+		$ident = $macros{$ident};
+	}
+	return $ident;
+}
+
+sub lookup_value($$) {
+	my ($scope,$ident) = @_;
+	while ($scope) {
+		my $vl = $scope->{values};
+		if (defined($vl->{$ident})) {
+			return $vl->{$ident}->{value};
+		}
+		$scope = $scope->{scope};
+	}
+	return undef();
+}
+
+sub lookup_type($$) {
+	my ($scope,$ident) = @_;
+	if ($basictypes{$ident}) {
+		return {scope=>$scope, basic=>1, name=>$ident, size=>$basictypes{$ident} };
+	}
+	while ($scope) {
+		if ($basictypes{$ident}) {
+			return {scope=>$scope, basic=>1, name=>$ident, size=>$basictypes{$ident} };
+		}
+		my $el = $scope->{enums};
+		my $cl = $scope->{classes};
+		my $td = $scope->{typedefs};
+		if (grep {$_ eq $ident} @$el) {
+			return {scope=>$scope, enum=>1, name=>$ident, size=>4 };
+		}
+		my @match_class = (grep {$_->{name} eq $ident} @$cl);
+		if (scalar(@match_class)) {
+			return {scope=>$scope, class=>$match_class[0]};
+		}
+		my @match_td = (grep {$_->{name} eq $ident} @$td);
+		if (scalar(@match_td)) {
+			my $tdr = $match_td[0];
+			my $cat = $tdr->{category};
+			if ($cat eq 'basic' or $cat eq 'enum' or $cat eq 'class') {
+				$ident = $tdr->{alias};
+				next;
+			} else {
+				return { scope=>$scope, $cat=>1, $size=>$tdr->{size} };
+			}
+		}
+		$scope = $scope->{scope};
+	}
+	return undef();
+}
+
+sub get_mult_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_operand($scope,$tokens,$line);
+	my $t;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '*') {
+			my $y = get_operand($scope,$tokens,$line);
+			$x = $x * $y;
+		} elsif ($t eq '/') {
+			my $y = get_operand($scope,$tokens,$line);
+			$x = int($x / $y);
+		} elsif ($t eq '%') {
+			my $y = get_operand($scope,$tokens,$line);
+			$x = int($x % $y);
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_add_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_mult_expr($scope,$tokens,$line);
+	my $t;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '+') {
+			my $y = get_mult_expr($scope,$tokens,$line);
+			$x = $x + $y;
+		} elsif ($t eq '-') {
+			my $y = get_mult_expr($scope,$tokens,$line);
+			$x = $x - $y;
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_shift_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_add_expr($scope,$tokens,$line);
+	my $t, $t2;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '<' or $t eq '>') {
+			$t2 = get_token($tokens,$line);
+			if ($t2 ne $t) {
+				unshift @$tokens, $t2;
+				last;
+			}
+		}
+		if ($t eq '<') {
+			my $y = get_add_expr($scope,$tokens,$line);
+			$x = $x << $y;
+		} elsif ($t eq '>') {
+			my $y = get_add_expr($scope,$tokens,$line);
+			$x = $x >> $y;
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_and_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_shift_expr($scope,$tokens,$line);
+	my $t;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '&') {
+			my $y = get_shift_expr($scope,$tokens,$line);
+			$x = $x & $y;
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_xor_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_and_expr($scope,$tokens,$line);
+	my $t;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '^') {
+			my $y = get_and_expr($scope,$tokens,$line);
+			$x = $x ^ $y;
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_ior_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_xor_expr($scope,$tokens,$line);
+	my $t;
+	for (;;) {
+		$t = get_token($tokens,$line);
+		if ($t eq '|') {
+			my $y = get_xor_expr($scope,$tokens,$line);
+			$x = $x | $y;
+		} else {
+			last;
+		}
+	}
+	unshift @$tokens, $t;
+	return $x;
+}
+
+sub get_constant_expr($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $x = get_ior_expr($scope,$tokens,$line);
+	return $x;
+}
+
+sub parse_enum($$$$) {
+	my ($scope,$tokens,$line,$enum_name) = @_;
+	my $vl = $scope->{values};
+	my $x = 0;
+	for (;;) {
+		my $t = get_token($tokens,$line);
+		last if ($t eq '}');
+		if (!defined($t)) {
+			die "Unexpected end of file at line $$line\n";
+		}
+		if ($t !~ /^\w+$/) {
+			die "Syntax error at line $$line\n";
+		}
+		if (defined($vl->{$t})) {
+			die "Duplicate identifier at line $$line\n";
+		}
+		my $t2 = get_token($tokens,$line);
+		if ($t2 eq ',') {
+			$vl->{$t} = {type=>$enum_name, size=>4, value=>$x, enum=>1};
+			++$x;
+		} elsif ($t2 eq '}') {
+			$vl->{$t} = {type=>$enum_name, size=>4, value=>$x, enum=>1};
+			++$x;
+			last;
+		} elsif ($t2 eq '=') {
+			$x = get_constant_expr($scope, $tokens, $line);
+			$vl->{$t} = {type=>$enum_name, size=>4, value=>$x, enum=>1};
+			++$x;
+			$t2 = get_token($tokens,$line);
+			last if ($t2 eq '}');
+			next if ($t2 eq ',');
+			die "Syntax error at line $$line\n";
+		} else {
+			unshift @$tokens, $t2;
+		}
+	}
+	my $t = get_token($tokens,$line);
+	if ($t ne ';') {
+		die "Missing ; at line $$line\n";
+	}
+}
+
+sub parse_decl_def($$$) {
+	my ($scope,$tokens,$line) = @_;
+	my $level=0;
+	my @decl;
+	while ( scalar(@$tokens) ) {
+		my $t = get_token($tokens, $line);
+		if ($t eq ';' and $level==0) {
+			return @decl;
+		}
+		push @decl, $t;
+		if ($t eq '{') {
+			++$level;
+		}
+		if ($t eq '}') {
+			if ($level==0) {
+				die "Syntax error at line $$line\n";
+			}
+			if (--$level==0) {
+				return ();	# end of function definition reached
+			}
+		}
+	}
+	die "Unexpected end of file at line $$line\n";
+}
+
+sub dump_scope($) {
+	my ($scope) = @_;
+	my $el = $scope->{enums};
+	my $cl = $scope->{classes};
+	my $vl = $scope->{values};
+	print "SCOPE: $scope->{name}\n";
+	if (scalar(@$el)) {
+		print "\tenums:\n";
+		foreach (@$el) {
+			print "\t\t$_\n";
+		}
+	}
+	if (scalar(keys(%$vl))) {
+		print "\tvalues:\n";
+		foreach $vname (keys(%$vl)) {
+			my $v = $vl->{$vname};
+			my $x = $v->{value};
+			my $t = $v->{type};
+			my $sz = $v->{size};
+			if ($v->{enum}) {
+				print "\t\t$vname\=$x (enum $t) size=$sz\n";
+			} else {
+				print "\t\t$vname\=$x (type $t) size=$sz\n";
+			}
+		}
+	}
+	if ($scope->{scope}) {
+		my $members = $scope->{members};
+		foreach (@$members) {
+			my $n = $_->{name};
+			my $sz = $_->{size};
+			my $off = $_->{offset};
+			my $spc = $_->{spacing};
+			if (defined $spc) {
+				print "\t$n\[\]\: spacing $spc size $sz offset $off\n";
+			} else {
+				print "\t$n\: size $sz offset $off\n";
+			}
+		}
+		print "\tOverall size : $scope->{size}\n";
+		print "\tOverall align: $scope->{align}\n";
+	}
+	foreach $s (@$cl) {
+		dump_scope($s);
+	}
+}
+
+sub output_scope($$) {
+	my ($scope, $out) = @_;
+	my $el = $scope->{enums};
+	my $cl = $scope->{classes};
+	my $vl = $scope->{values};
+	my $sn = scope_full_name($scope);
+	my $sp = ($scope->{file}) ? "" : $sn."_";
+	if ($scope->{file}) {
+		push @$out, "";
+		push @$out, &$comment_sub("FILE SCOPE");
+		push @$out, "";
+	} else {
+		push @$out, "";
+		push @$out, &$comment_sub($scope->{specifier}." ".$scope->{name});
+		push @$out, "";
+	}
+	if (scalar(keys(%$vl))) {
+		foreach $vname (keys(%$vl)) {
+			my $v = $vl->{$vname};
+			my $x = $v->{value};
+			my $t = $v->{type};
+			my $sz = $v->{size};
+			push @$out, &$format_sub($sp.$vname, $x);
+		}
+	}
+	if ($scope->{scope}) {
+		my $members = $scope->{members};
+		foreach (@$members) {
+			my $n = $_->{name};
+			my $sz = $_->{size};
+			my $off = $_->{offset};
+			my $spc = $_->{spacing};
+			push @$out, &$format_sub($sp.$n, $off);
+			if (defined $spc) {
+				push @$out, &$format_sub($sp.$n."_spc", $spc);
+			}
+		}
+		push @$out, &$format_sub($sp."sz", $scope->{size});
+	}
+	foreach $s (@$cl) {
+		if ($s->{complete})	{
+			output_scope($s, $out);
+		}
+	}
+}
+
+sub scope_full_name($) {
+	my ($scope) = @_;
+	if ($scope->{file}) {
+		return "";
+	}
+	my $parent = $scope->{scope};
+	if ($parent->{file}) {
+		return $scope->{name};
+	}
+	return scope_full_name($parent)."_".$scope->{name};
+}
+
+sub pad($$) {
+	my ($lineref, $n) = @_;
+	my $l = length ($$lineref);
+	if ($l < $n) {
+		$$lineref .= ' 'x($n-$l);
+	}
+}
+
+#
+# Subroutines for ARMASM compatible output
+#
+sub armasm_format($$;$) {
+	my ($name, $value, $comment) = @_;
+	my $r = "$name ";
+	pad(\$r, 40);
+	$r .= sprintf("EQU 0x%08x", $value & 0xFFFFFFFF);
+	if ($comment and $comment!~/^\s*$/) {
+		$r .= " ";
+		pad(\$r, 60);
+		$r .= "; $comment";
+	}
+	return $r;
+}
+
+sub armasm_comment($) {
+	my ($comment) = @_;
+	return "; $comment";
+}
+
+sub armasm_end() {
+	return "\n\tEND\n";
+}
+
+#
+# Subroutines for GNU AS compatible output
+#
+sub as_format($$;$) {
+	my ($name, $value, $comment) = @_;
+	my $r = "    .equ $name, ";
+	pad(\$r, 50);
+	$r .= sprintf("0x%08x", $value & 0xFFFFFFFF);
+	if ($comment and $comment!~/^\s*$/) {
+		$r .= " ";
+		pad(\$r, 65);
+		$r .= "/* $comment */";
+	}
+	return $r;
+}
+
+sub as_comment($) {
+	my ($comment) = @_;
+	if (length ($comment) > 0) {
+		return "/* $comment */";
+	} else {
+		return "";
+	}
+}
+
+sub as_end() {
+	return "";
+}
+
+#
+# Subroutines for Turbo Assembler compatible output
+#
+sub tasm_format($$;$) {
+	my ($name, $value, $comment) = @_;
+	my $r = "$name ";
+	pad(\$r, 40);
+	$r .= sprintf("EQU 0%08xh", $value & 0xFFFFFFFF);
+	if ($comment and $comment!~/^\s*$/) {
+		$r .= " ";
+		pad(\$r, 60);
+		$r .= "; $comment";
+	}
+	return $r;
+}
+
+sub tasm_comment($) {
+	my ($comment) = @_;
+	return "; $comment";
+}
+
+sub tasm_end() {
+	return "";
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/listfeaturevariants.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,47 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# list A.X.aaa for all X (32 chars) when given A.aaa
+# 
+#
+
+
+my $source = shift;
+
+# list invariant
+print "$source\n" if (-f $source);
+
+# now think about variants
+
+use File::Basename;
+my $srcDir = dirname($source);
+my $srcRoot = basename($source);
+my $srcExt = "";
+
+if ($srcRoot =~ /^(.+)\.([^\.]+)$/)
+{
+	$srcRoot = $1;
+	$srcExt = $2;
+}
+
+opendir(DIR, $srcDir) or die("ERROR: cannot read directory $srcDir\n");
+
+# list all variants
+while (my $file = readdir(DIR))
+{
+	print "$srcDir\\$file\n" if ($file =~ /^$srcRoot\.(\w{32})\.$srcExt$/i);
+}
+
+exit 1 if (!closedir(DIR));
+exit 0;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/makedef.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,553 @@
+#!/usr/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# all variables called *Path* are set up to end with a backslash
+# all variables called *Path or *File are stored as absolute (file)paths
+# all variables called UpPath* are stored as relative paths
+# 
+#
+
+use strict   ;
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlBinPath;	# fully qualified pathname of the directory containing this script
+my $EntryPoint;         
+my $InternalEntryPoint;
+
+# establish the path to the Perl binaries
+BEGIN {
+	require 5.005_03;				# check user has a version of perl that will cope
+	$PerlBinPath = $FindBin::Bin;	# X:/epoc32/tools
+
+	if ($^O eq "MSWin32")
+		{	
+		$PerlBinPath =~ s/\//\\/g;		# X:\epoc32\tools
+		}
+}
+use lib $PerlBinPath;
+
+use Defutl;
+use File::Copy;
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 1;
+
+my %Options;	# command line option information
+
+my $NamedSymLkup = 0;			# This flag is used to enable named lookup on emulator
+my $IgnoreUnfrozenExports = 0;	# This flag is used to ignore the 'unfrozen exports' warnings. This is 
+								# required for STDEXEs which export symbols just to enable 'named lookup'
+								# from within the STDEXE (via 'dlsym') and are never exposed outside (via def files or
+								# import libraries.
+my $ExportEntrypointE32Dll = 0;	 # Workaround: To export entry point _E32DLL for target type STDDLL
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+{
+
+	my $INFILE;
+	my $FRZFILE;
+	my $OUTFILE;
+	my @ObjFiles;
+
+	# process the command-line
+	unless (GetOptions(\%Options, '1=s', '2=s', 'deffile=s', 'frzfile=s', 'inffile=s', 'overwrite', 'absent=s', 'ignore_unfrozen_noncallable', 'SystemTargetType', 'sym_name_lkup', 'ignore_unfrozen_exports','export_entrypoint_E32Dll')) {
+		exit 1;
+	}
+	unless (@ARGV==1) {
+		&Usage;
+	}
+
+#	check the flags
+
+	if (($Options{deffile} and $Options{inffile}) or (not ($Options{deffile} or $Options{inffile}))) {
+		die "MAKEDEF ERROR: Must specify either -Deffile [file] or -Inf [file]\n";
+	}
+	if ($Options{2} && !$Options{1}) {
+		die "MAKEDEF ERROR: Can't specify second export name and not first export name\n";
+	}
+
+#	process the flags
+	if ($Options{deffile}) {
+		$INFILE=$Options{deffile};
+		unless (-e $INFILE) {
+			die "MAKEDEF ERROR: $INFILE: Deffile not found\n";
+		}
+	}
+	else {
+		$INFILE=$Options{inffile};
+		unless (-e $INFILE) {
+			die "MAKEDEF ERROR: $INFILE: Inffile not found\n";
+		}
+	}
+	if ($Options{frzfile}) {
+		$FRZFILE=$Options{frzfile};
+#		check the frozen .DEF file exists
+		unless (-e $FRZFILE) {
+			die "MAKEDEF ERROR: $FRZFILE: Frzfile not found\n";
+		}
+	}
+	$OUTFILE=pop @ARGV;
+
+
+	$NamedSymLkup = $Options{sym_name_lkup};
+	$IgnoreUnfrozenExports = $Options{ignore_unfrozen_exports};
+	$ExportEntrypointE32Dll = $Options{export_entrypoint_E32Dll};	# Workaround: To export entry point _E32DLL for target type STDDLL
+
+#	Read the Frozen .DEF file if specified
+	my @FrzDataStruct;
+	if ($FRZFILE) {
+		eval { &Def_ReadFileL(\@FrzDataStruct, $FRZFILE); };
+		die $@ if $@;
+		if ($Options{1}) {
+#			Check that frozen def file matches the -1 and -2 arguments given, if any
+			my $export1="";
+			my $export2="";
+			foreach my $FrzRef (@FrzDataStruct) {
+				next unless $$FrzRef{Name};		# ignore lines not containing an export
+				if ($$FrzRef{Ordinal} == 1) {
+					$export1 = $$FrzRef{Name};
+					next;
+				}
+				if ($$FrzRef{Ordinal} == 2) {
+					$export2 = $$FrzRef{Name};
+					next;
+				}
+				if ($Options{1} && ($Options{1} ne $export1)) {
+					die "MAKEDEF ERROR: $FRZFILE: Frzfile ordinal 1 does not match command line\n";
+				}
+				if ($Options{2} && ($Options{2} ne $export2)) {
+					die "MAKEDEF ERROR: $FRZFILE: Frzfile ordinal 2 does not match command line\n";
+				}
+			}
+		}
+	}
+	elsif ($Options{1}) {
+#		create an export structure for the names passed on the command line
+		push @FrzDataStruct, {
+			Name=>$Options{1},
+			ExportName=>$Options{1},
+			Ordinal=>1
+		};
+		if ($Options{2}) {
+			push @FrzDataStruct, {
+				Name=>$Options{2},
+				ExportName=>$Options{2},
+				Ordinal=>2
+			};
+		}
+	}
+
+#	Read the Input .DEF file
+	my @InDataStruct;
+	if ($Options{deffile}) {
+		eval { &Def_ReadFileL(\@InDataStruct, $INFILE); };
+	}
+	else {
+		eval { &ReadInfFileL(\@InDataStruct, $INFILE); };
+	}
+	die $@ if $@;
+
+#	Compare the frozen .DEF data with the input .DEF or export info file data
+	my (@NewDataStruct, @MissingDataStruct, @MatchedDataStruct);
+	eval { &CompareFrzInL (\@NewDataStruct, \@MissingDataStruct, \@MatchedDataStruct, \@FrzDataStruct, \@InDataStruct); };
+	die $@ if $@;
+
+	# MAKEDEF should generate a warning if the def file has no exports (old or new)
+	# and the associated MMP 'targettype' is not a System Target type.
+	print "MAKEDEF WARNING: $OUTFILE has no EXPORTS\n" unless (@MatchedDataStruct || @NewDataStruct || $Options{SystemTargetType});
+
+#	Create the output .DEF file
+	eval { &CreateDefFileL(\@NewDataStruct, \@MatchedDataStruct, $OUTFILE, $FRZFILE); };
+	die $@ if $@;
+
+#	report missing frozen export errors
+	if (@MissingDataStruct) {
+		my @Errors;
+		my $Num=@MissingDataStruct;
+		my $Ref;
+		if ($FRZFILE) {
+			push @Errors, "MAKEDEF ERROR: $Num Frozen Export(s) missing from object files (POSSIBLE COMPATIBILITY BREAK):\n";
+			foreach $Ref (@MissingDataStruct) {
+				push @Errors, "  $FRZFILE($$Ref{LineNum}) : $$Ref{Name} \@$$Ref{Ordinal}\n";
+			}
+		}
+		else {
+			push @Errors, "MAKEDEF ERROR: command-line: $Num Frozen Export(s) missing from object files (POSSIBLE COMPATIBILITY BREAK):\n";
+			foreach $Ref (@MissingDataStruct) {
+				push @Errors, "  $$Ref{Name} \@$$Ref{Ordinal}\n";
+			}
+		}
+		die "\n", @Errors;
+	}
+	elsif ($Options{overwrite} && -w $FRZFILE) #sag
+		{
+		print "Copying $OUTFILE to $FRZFILE\n";
+		rename $FRZFILE, "$FRZFILE.bak";
+		copy($OUTFILE, $FRZFILE);
+		}
+
+	exit 0;
+}
+
+#######################################################################
+# SUBROUTINES
+#######################################################################
+
+sub Usage () {
+
+	print(
+		"\n",
+		"MAKEDEF - .DEF file generator V$MajorVersion.$MinorVersion.$PatchVersion\n",
+		"\n",
+		"MAKEDEF {options} [Output .DEF file]\n",
+		"\n",
+		"options:   (case-insensitive)\n",
+		"  -Deffile [Input .DEF file]\n",
+		"  -Inffile [Input export information file]\n",
+		"  -Frzfile [Frozen .DEF file]\n",
+		"  -1 [first export name] {-2 [second export name]}\n",
+		"  -Overwrite\n",
+		"  -Absent [symbol to use for absent exports]\n",
+		"  -ignore_unfrozen_noncallable\n",
+		"  -SystemTargetType\n",
+		"  -sym_name_lkup [Enable symbol lookup by name]\n",
+		"  -ignore_unfrozen_exports \n",
+		"\n",
+		"Either specify -Deffile or -Inffile, and\n",
+		"either -Frzfile or -1 {-2} if required.\n"
+	);
+	exit 1;
+}
+
+sub ReadInfFileL ($$$) {
+	my ($DataStructRef, $FILE)=@_;
+
+#	open export information file for reading
+	open (FILE, "<$FILE") or die "could not open $FILE: $!";
+
+#	read the export info. file, and create dummy frozen .DEF file text
+	my $LineNum=0;
+	my $Ordinal=0;
+	my $Comment='';
+	my $Name='';
+	my $InfType=0;	# dumpbin output
+	my %exports;	# MWLD workaround - record mangled names in case we don't see the demangled ones
+	my $Line;
+	while ($Line=<FILE>) {
+	        my $Data=0;
+			my $SymbolSize=0;
+		$LineNum++;
+		if ($InfType == 0) {
+			if ($Line =~ /\*\*\* ARCHIVE SYMBOL TABLE.* \*\*\*/o) {
+				$InfType=1;	# mwld disassembly output
+				next;
+			}
+			if ($Line =~ /^\s+(\?\S+)(\s+\((.*)\))?$/o) {
+#                   ??0TAgnAlarmDefaults@@QAE@XZ (public: __thiscall TAgnAlarmDefaults::TAgnAlarmDefaults(void))
+				$Name=$1;
+				$Comment=$3;
+			} 
+			elsif ($Line =~ /^\s+_(\S+)(\s+\((.*)\))?$/o) {
+# frozen ordinals like "UserNoLongerSupported01" seem to inherit a leading underscore in the dumpbin output
+				$Name=$1;
+				$Comment=$3;
+			}
+			elsif ($Line =~ /^\s+_(\S+) DATA (\d+)(\s+\((.*)\))?$/o) {
+#				Mark the data symbols and retain their sizes
+				$Name=$1;
+				$Data=1;
+				$SymbolSize=$2;
+				$Comment=$4;
+			}
+			else {
+				next;
+			}
+		}
+		else {
+			# The Windows CW linker produces .inf files with a 'something' unmangled comment at the end, the Linux CW linker doesn't
+			if ($Line =~ /^\s*\d+\s+\(.+\)\s+__imp_((.)(\S+))(\s+'__declspec\(dllimport\)\s+(.*)')?$/o) {
+					if ($2 eq "_") {
+							$Name = $3;		# C symbol, so remove leading underscore
+							$Comment = $5 if ($4);	# name isn't mangled anyway
+					} else {
+							$Name = $1;		# C++ mangled name
+							$Comment = $5 if ($4);	# can't unmangle names...
+					}
+
+					# One side-effect of ignoring comments if they're not present is that Windows entry points need to be
+					# specifically ignored.  Previously they were ignored by virture of the fact they had no comment.
+					next if ($Name eq "_E32Dll" || $Name eq "_E32Startup");
+
+					$Comment = $4 ? $5 : $Name;
+					
+					# need to save both the line number and
+					# comment
+					my %entry;
+					$entry{'lineNum'} = $LineNum;
+					$entry{'comment'} = $Comment;
+					$exports{$Name}=\%entry;
+					next;
+			}
+			if ($Line =~ /\*\*\* Unmangled Symbols \*\*\*/o) {
+				# Currently for Linux "Unmangled Symbols" section is blank
+				<FILE>; 
+				$Line = <FILE>; 
+				$LineNum+=2;
+				if ($^O eq "MSWin32") {
+					if ($Line !~ /^\s*\d+:\s+(\S+)$/o) {
+						print STDERR "MAKEDEF WARNING: unknown inf file format\n";
+						next;
+					}
+				}
+				$Name = length $1 ? $1 : '';
+# Workaround: if MWLD can't demangle the name, we will see only the __imp_ version.
+				if ($Name =~ /^__imp_(\S+)$/o) {
+					$Name = $1;
+				}
+				$Line = <FILE>; 
+				$LineNum++;
+				next if ($Line !~ /^\s+(.+)$/o);
+				$Comment = $1;
+			}
+			elsif ($Line =~ /^0x\S{8}\s+__imp__(\S+)$/o) {
+				$Name = $1;	# leading underscore already removed
+				$Comment = '';	# a C symbol, and therefore not mangled
+			}
+			else {
+				next;
+			}
+		}
+# Check for WINS entrypoint symbols
+		if ($Name eq "_E32Dll" || $Name eq "_E32Startup") {
+			$EntryPoint = $Name;
+			# when mwld resolves an exported symbol S coming from
+			# the def file, it looks both for S() and _S() in
+			# every object file but only for _S() in static
+			# libraries.
+			#
+			# As a consequence, we need to distinguish the
+			# internal entry point name from the external one.
+			$InternalEntryPoint = "_$Name" if ($InfType != 0);
+			my $entry = $exports{$Name};
+			$entry->{'lineNum'} = 0; # indicates processed name
+			next;
+		}
+		$Ordinal++;
+		$Comment='' if (!defined $Comment);
+		push @$DataStructRef, {
+			Ordinal=>$Ordinal,
+			Name=>$Name,
+			Data=>$Data,
+			Size=>$SymbolSize,
+			ExportName=>$Name,
+			Comment=>$Comment,
+			LineNum=>$LineNum
+		};
+		my $entry = $exports{$Name};
+		$entry->{'lineNum'} = 0; # indicates processed name
+	}
+	foreach $Name (keys %exports) {
+	    	my $entry = $exports{$Name};
+		$LineNum = $entry->{'lineNum'};
+		if ($LineNum > 0) {
+			$Ordinal++;
+			push @$DataStructRef, {
+				Ordinal=>$Ordinal,
+				Name=>$Name,
+				ExportName=>$Name,
+				Comment=> $entry->{'comment'},
+				LineNum=>$LineNum
+			};
+		}
+	}
+}
+
+sub CompareFrzInL ($$$$$) {
+	my ($NewStructRef, $MissingStructRef, $MatchedStructRef, $FrzStructRef, $InStructRef)=@_;
+	my $AbsentSubst = $Options{absent};
+	my $IgnoreNoncallable = $Options{ignore_unfrozen_noncallable};
+	
+#	compare the input export data with the frozen data
+
+#	this function trashes the frozen .DEF data structure and the new .DEF data structure
+
+#	nullify non-export statements in the structures
+	foreach (@$FrzStructRef,@$InStructRef) {
+		next if $$_{Name};
+		undef $_;
+	}
+
+	my $LastOrdinal=0;
+
+	my $FrzRef;
+	my $InRef;
+	FRZLOOP: foreach $FrzRef (@$FrzStructRef) {
+		next unless $$FrzRef{Name};		# ignore lines in the .DEF file not containing an export
+		if ($LastOrdinal<$$FrzRef{Ordinal}) {
+			$LastOrdinal=$$FrzRef{Ordinal};
+		}
+		foreach $InRef (@$InStructRef) {
+			next unless defined $InRef; # ignore nullified entries in the temporary array
+#			does the function name match?
+			if ($$InRef{Name} eq $$FrzRef{Name}) {
+#				give the generated export the same number as the corresponding frozen one
+				$$InRef{Ordinal}=$$FrzRef{Ordinal};
+				$$InRef{Data}=$$FrzRef{Data};
+				$$InRef{Size}=$$FrzRef{Size};
+#				if the export is marked as absent, redirect it appropriately
+				if ($$FrzRef{Absent}) {
+					if ($AbsentSubst) {
+						$$InRef{Name} = $AbsentSubst;
+						$$InRef{ExportName} = sprintf("\"_._.absent_export_%d\"", $$InRef{Ordinal});
+					}
+				}
+				push @$MatchedStructRef, $InRef;
+				undef $InRef;
+				next FRZLOOP;
+			}
+		}
+#		these frozen exports haven't been found in the object files
+#		first check for ABSENT declarations
+		if ($AbsentSubst and $$FrzRef{Absent}) {
+			$$FrzRef{Name} = $AbsentSubst;
+			$$FrzRef{ExportName} = sprintf("\"_._.absent_export_%d\"", $$FrzRef{Ordinal});
+			push @$MatchedStructRef, $FrzRef;
+			next FRZLOOP;
+		}
+
+#		No - it's really missing
+		push @$MissingStructRef, $FrzRef;
+#		put a comment in the generated .DEF file to that effect
+		$$FrzRef{Missing}=1;
+		push @$MatchedStructRef, $FrzRef;
+	}
+
+#	all the exports left in the new .DEF file aren't frozen - give them the right ordinals
+	foreach $InRef (@$InStructRef) {
+		next unless defined $InRef; # ignore nullified entries
+		if ($$InRef{Name} =~ /^_ZTV|_ZTI/) {
+			# EABI non-callable exports
+			next if ($IgnoreNoncallable);	
+		}
+		$LastOrdinal++;
+		$$InRef{Ordinal}=$LastOrdinal;
+		push @$NewStructRef, $InRef;
+	}
+}
+
+sub CreateDefFileL ($$$$) {
+#	creates a new .DEF file
+	my ($NewStructRef, $MatchedStructRef, $FILE, $FRZFILE)=@_;
+
+	my @Text=("EXPORTS\n");
+	my $LineNum=1;
+
+
+	my $InRef;
+	foreach $InRef (@$MatchedStructRef) {
+		my $Comment='';
+		if ($$InRef{Comment}) {
+			$Comment=" ; $$InRef{Comment}";
+		}
+		if ($$InRef{Missing}) {
+			push @Text, '; MISSING:';
+		}
+		my $Data = "";
+		if( defined $$InRef{Data} && $$InRef{Data} == 1) {
+		$Data = " DATA $$InRef{Size}" ;
+		}
+		my $r3unused = $$InRef{R3Unused} ? " R3UNUSED" : "";
+
+#		A def file entry with the keyword 'NONAME' indicates the MW linker that a named-lookup is not enabled. 
+#		Note that although it may seem, but named lookup is either enabled or disabled on a per-binary basis and not
+#		per-symbol.
+		my $noname = $NamedSymLkup ? "": " NONAME";
+		if ($$InRef{ExportName} and ($$InRef{ExportName} ne $$InRef{Name})) {
+			push @Text, "\t$$InRef{ExportName}=$$InRef{Name} \@ $$InRef{Ordinal} $noname$Data$r3unused$Comment\n";
+		} else {
+			push @Text, "\t$$InRef{Name} \@ $$InRef{Ordinal} $noname$Data$r3unused$Comment\n";
+		}
+		$LineNum++;
+		next;
+	}
+	if (@$NewStructRef) {
+
+#		warn about unfrozen exports and add them to the end of the generated .DEF file
+		my $Num=@$NewStructRef;
+		my @Warnings;
+
+		if(!$IgnoreUnfrozenExports) {
+			my $warning = "MAKEDEF WARNING: $Num export(s) not yet Frozen";
+
+			if ($FRZFILE)
+				{
+				$warning .= " in $FRZFILE";
+				}
+
+			$warning .= ":\n";
+
+			push @Warnings, $warning;
+		}
+
+		push @Text, "; NEW:\n";
+		$LineNum++;
+		foreach $InRef (@$NewStructRef) {
+			my $Comment='';
+			if ($$InRef{Comment}) {
+				$Comment=" ; $$InRef{Comment}";
+			}
+			my $Data = "";
+			if(defined $$InRef{Data} && $$InRef{Data} == 1){
+			$Data = " DATA $$InRef{Size}";
+			}
+			my $r3unused = $$InRef{R3Unused} ? " R3UNUSED" : "";
+			my $noname = $NamedSymLkup ? "": " NONAME";
+			if ($$InRef{ExportName} and ($$InRef{ExportName} ne $$InRef{Name})) {
+				push @Text, "\t$$InRef{ExportName}=$$InRef{Name} \@ $$InRef{Ordinal} $noname$Data$r3unused$Comment\n";
+			} else {
+				push @Text, "\t$$InRef{Name} \@ $$InRef{Ordinal} $noname$Data$r3unused$Comment\n";
+			}
+			$LineNum++;
+			if(!$IgnoreUnfrozenExports) {
+				push @Warnings, "  $FILE($LineNum) : $$InRef{Name} \@$$InRef{Ordinal}\n";
+			}
+			next;
+		}
+		print @Warnings;
+	}
+	if ($EntryPoint) {
+		push @Text, "\t$EntryPoint";
+		push @Text, "=$InternalEntryPoint" if ($InternalEntryPoint);
+		push @Text, "\t; Entry point for emulation\n";
+	}
+	elsif ($ExportEntrypointE32Dll) {		# Workaround: To export entry point _E32DLL for target type STDDLL
+		push @Text, "\t_E32Dll";
+		push @Text, "=__E32Dll" ;
+		push @Text, "\t; Entry point for STDDLL emulation\n";
+	}
+
+#	add a terminating newline
+	push @Text, "\n";
+
+#	write the new .DEF file
+	eval { &Def_WriteFileL(\@Text, $FILE); };
+	die $@ if $@;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/omapsig.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,62 @@
+#!/usr/bin/perl
+# e32toolp\e32util\omapsig.pl
+#
+# Copyright (c) 2008 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+# Prepend OMAP boot signature to miniboot binaries
+#
+# Syntax:
+#	perl omapsig.pl <load address in hex> <input miniboot> <output minboot with sig>
+#
+
+use warnings;
+use IO::Handle;
+use File::Copy;
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+if (scalar(@ARGV)!=3) {
+	die "OMAPSIG signature tool V$MajorVersion.$MinorVersion.$PatchVersion\nperl omapsig.pl <load address in hex> <input miniboot> <output minboot with sig>\n";
+}
+
+my ($load_address, $infile, $outfile) = @ARGV;
+
+$load_address = pack('L', hex($load_address));
+
+my $filesize_in_bytes = -s $infile;
+
+print "miniboot input ", $filesize_in_bytes, " bytes\n";
+
+$filesize_in_bytes = pack('L', $filesize_in_bytes);
+
+open my $in, "< $infile" or die "Can't open $infile for input: $!";
+binmode($in);
+open my $out, "> $outfile" or die "Can't open $outfile for output: $!";
+binmode($out);
+$out->autoflush(1);
+
+print $out $filesize_in_bytes;
+print $out $load_address;
+
+copy($in, $out) or die "Couldn't copy from $infile to $outfile: $!";
+
+close $in;
+close $out;
+
+print "signed miniboot output ", -s $outfile, " bytes\n";
+exit;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/prepdef.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,151 @@
+#!/usr/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# e32toolp/e32util/prepdef.pl
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	if ($^O eq "MSWin32")
+	{
+		$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+		$PerlLibPath .= "\\";
+	}
+}
+
+use lib $PerlLibPath;
+use Defutl;
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 1;
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+{
+	
+
+	# process the command-line
+	unless (@ARGV==2 ||  @ARGV==3 || @ARGV==4) {
+		&Usage;
+	}
+	my ($FRZFILE,$GENFILE,$DATASWITCH,$ABSENTSYM)=@ARGV;
+	
+	
+
+#	Read the Frozen .DEF file
+	my @FrzDataStruct;
+	my $FrzExportsOn=0;
+	eval { &Def_ReadFileL(\@FrzDataStruct, $FRZFILE, $FrzExportsOn); };
+	die $@ if $@;
+
+	eval { &WriteOutputFileL(\@FrzDataStruct, $GENFILE, $DATASWITCH, $ABSENTSYM); };
+	die $@ if $@;
+
+	exit;
+}
+
+#######################################################################
+# SUBROUTINES
+#######################################################################
+
+sub Usage () {
+
+	print(
+		"\n",
+		"PREPDEF - Prepare frozen DEF file for library generation V$MajorVersion.$MinorVersion.$PatchVersion\n",
+		"\n",
+		"PREPDEF [frozen .DEF file] [processed .DEF file] [nodatasizes] [entrypoint_name]\n",
+		"\n",
+		"\n",
+		"\n"
+	);
+	exit 1;
+}
+
+
+
+sub WriteOutputFileL ($$$$) {
+	my ($FrzStructRef, $FILE, $DATASWITCH, $ABSENTSYM)=@_;
+
+	my @Text;
+
+	if ($ABSENTSYM) {
+		$ABSENTSYM = '='.$ABSENTSYM;
+	}
+
+#	Process the frozen .DEF file
+	my $FrzRef;
+	my $ExportsDeclared;
+
+#	get the lines of text from the frozen .DEF file
+	foreach $FrzRef (@$FrzStructRef) {
+		next if (!$FrzRef);
+		if (!defined($$FrzRef{Ordinal})) {
+			push @Text, $$FrzRef{Line};
+			$ExportsDeclared = 1 if ($$FrzRef{Line} =~ /^\s*EXPORTS\s*(\s+\S+.*)?$/io);
+			next;
+		}
+		my $Comment='';
+		if ($$FrzRef{Comment}) {
+			$Comment=" ; $$FrzRef{Comment}";
+		}
+#		Mention if it is a Data symbol along with its size.
+		my $data = "";
+		if(defined $$FrzRef{Data})
+			{			
+			if ($DATASWITCH eq "nodatasizes")
+				{
+				$data = " DATA";
+				}
+			else
+				{
+				$data = " DATA $$FrzRef{Size}";
+				}
+			}
+		my $r3unused = $$FrzRef{R3Unused} ? " R3UNUSED" : "";
+		my $ord = $$FrzRef{Ordinal};
+		if ($$FrzRef{Absent}) {
+			push @Text, "\t\"_._.absent_export_$ord\"$ABSENTSYM \@ $ord NONAME$data$r3unused$Comment\n";
+		} else {
+			my $export = $$FrzRef{ExportName};
+			if ($export ne $$FrzRef{Name})
+				{
+				$export .= "=$$FrzRef{Name}";
+				}
+			push @Text, "\t$export \@ $ord NONAME$data$r3unused$Comment\n";
+		}
+	}
+	unshift @Text, "EXPORTS\n" unless ($ExportsDeclared);
+
+#	add a terminating newline
+	push @Text, "\n";
+
+#	write the new frozen .DEF file
+	eval { &Def_WriteFileL(\@Text, $FILE); };
+	die $@ if $@;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/preprocessor.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,101 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# prepocessor.pm
+# Used to allow us to access and manipulate other pre processors
+# 
+#
+
+package Preprocessor;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	PreprocessorToUseId PreprocessorToUseExe PreprocessorToUsePath 
+);
+
+
+
+#
+# Returns the preprocessor name.
+# (After checking it is valid)
+#
+sub PreprocessorToUseId()
+{
+    $env="0";
+    if (defined $ENV{ALT_PRE})
+    {
+	$env = $ENV{ALT_PRE};
+    }
+    
+    if ( $env eq "1" ) # Only a value of 1 will use alternative preprocessor
+    {
+        return "MINGW_NO_CYGWIN";
+    }
+    else
+    {
+        return "DEFAULT";
+    }
+}
+
+
+
+#
+# Returns the preprocessor exe name.
+# without the exe extension.
+#
+
+
+sub PreprocessorToUseExe()
+{
+    $env = &PreprocessorToUseId();
+    
+    if ( ($env eq "DEFAULT") )
+    {
+        return "cpp";
+    }
+    elsif ( $env eq "MINGW_NO_CYGWIN" )
+    {
+        return "scpp";
+    }
+}
+
+
+
+
+#
+# Returns the full path and exe of the preprocessor relative to the 
+# gcc\bin path.
+#
+sub PreprocessorToUsePath()
+{
+    $env = &PreprocessorToUseId();
+
+    if ( ($env eq "") || ($env eq "DEFAULT") )
+    {
+        return "";
+    }
+    elsif ( $env eq "MINGW_NO_CYGWIN" )
+    {
+        return ""; # Currently same path as default (different name though !)
+    }
+    else
+    { # Nothing really to use.
+        die
+            "Unable to find the correct pre processor\n",
+    }
+}
+
+
+1;
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/selectbootmak.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,40 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Used to select a makefile which matches the installed version of armasm
+# check to see which version of armasm we've got (first on PATH).
+# if its the old one then copy the file specified by $old to $dest
+# else copy $src to $dest
+# 
+#
+
+use File::Copy;
+
+my ($dest, $old, $src) = @ARGV;
+
+my $oldVersionId = "ARM AOF Macro Assembler vsn 2.37 (Advanced RISC Machines SDT 2.11) [Sep  9 1997]";
+
+open ARMASM, "armasm -help|";
+
+my $id = <ARMASM>;
+
+chop $id;
+
+close ARMASM;
+
+$src = $old if ($id eq $oldVersionId);
+
+unlink $dest;
+
+copy("$src", "$dest");
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/e32util/set-rvct.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,149 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S %0 %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+if errorlevel 1 goto script_failed_so_exit_with_non_zero_val 2>nul
+goto endofperl
+@rem ';
+#!perl
+#line 15
+use FindBin;
+
+my $SELF_NAME = "set-rvct";
+
+my $self_path;
+
+BEGIN
+{
+    $self_path = $FindBin::Bin;
+}
+
+use lib $self_path;
+
+use RVCT_ver2set;
+
+
+# Some internal helper functions.
+sub _usage_and_die(@);
+sub _err_and_die(@);
+sub _warning(@);
+sub _fixup_path($$);
+
+
+sub main(@)
+{
+    my @available = RVCT_ver2set::get_versions();
+
+    _err_and_die("no RVCT versions found; check that ABLD_RVCT_INI is set.")
+        unless(@available);
+
+    my ($vers, @junk) = @_;
+
+    _usage_and_die(@available)
+        if ( !$vers || @junk || !RVCT_ver2set::compiler_exists($vers) );
+
+    if ($ENV{ABLD_PLAT_INI})
+    {
+        _warning("ABLD_PLAT_INI is set; the build system might clobber your settings.");
+    }
+
+    my $path = _fixup_path( $ENV{PATH}, RVCT_ver2set::get_bin_path($vers) );
+
+    # Create the batch file.
+    {
+        my $fname = "..__.bat";
+
+        open (my $file,  ">",  $fname)
+            or _err_and_die("couldn't create $fname.");
+
+        print $file "set PATH=$path\n";
+
+        my ($n, $p);
+
+        $n = RVCT_ver2set::get_bin_name($vers);
+        $p = RVCT_ver2set::get_bin_path($vers);
+        print $file "set $n=$p\n";
+
+        $n = RVCT_ver2set::get_inc_name($vers);
+        $p = RVCT_ver2set::get_inc_path($vers);
+        print $file "set $n=$p\n";
+
+        $n = RVCT_ver2set::get_lib_name($vers);
+        $p = RVCT_ver2set::get_lib_path($vers);
+        print $file "set $n=$p\n";
+
+        print $file "echo.\n";
+        print $file "armcc --vsn\n";
+
+        close $file or _err_and_die("couldn't close $fname.");
+    }
+}
+
+sub _usage_and_die(@)
+{
+    for (@_)
+    {
+        print STDERR "    $SELF_NAME $_\n";
+    }
+
+    exit 1;
+}
+
+sub _err_and_die(@)
+{
+    print STDERR "error: @_\n";
+    exit 1;
+}
+
+sub _warning(@)
+{
+    print STDERR "warning: @_\n";
+}
+
+sub _fixup_path($$)
+{
+    my @path = split(/;/, shift);
+    my $bin  = shift;
+
+    my @result = ();
+
+    foreach (@path)
+    {
+        push @result, ($_) unless ($_ eq $bin);
+    }
+
+    return join(";", $bin, @result);
+}
+
+
+main(@ARGV);
+
+
+
+__END__
+:endofperl
+
+if "%errorlevel%" == "0" (if exist ..__.bat call ..__.bat & del ..__.bat)
+
+:: vim:ft=perl
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/conv_khronos_hdr_to_cpp.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,86 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Convert the given header file from Khronos into a stub implementation file
+# 
+#
+
+use File::Basename;
+use File::Path;
+
+my $debug = 0;
+my $prog = "conv_khronos_hdr_to_cpp.pl";
+my $source = shift;
+my $target = shift;
+my $operation_mode = shift;
+my @lines;
+
+if ($debug)
+	{
+	print "$prog: Args $source $target $operation_mode\n";
+	}
+
+if ("$operation_mode" eq "delete")
+	{
+	&cleanup();
+	exit 0;
+	}
+elsif ("$operation_mode" eq "create")
+	{
+	&setupFiles();
+	&generateStubImplementation();
+	exit 0;
+	}
+else
+	{
+	print "Usage error: $prog source target [create|delete]\n";
+	exit 1;
+	}
+
+sub cleanup()
+	{
+	unlink "$target";
+	}
+
+sub setupFiles()
+	{
+	my $dir;
+	$dir = dirname($target);
+	mkpath $dir;
+	
+	open(INFILE,  "$source") or die "Can't open input file $source; $!\n";
+	open(OUTFILE, ">$target") or die "Can't open output file $target; $!\n";
+	print OUTFILE '/* Auto-generated: ' . "$prog" . ' v1.0 */' . "\n";
+	print OUTFILE '/* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).  All rights reserved. */' . "\n";
+	}
+
+sub generateStubImplementation()
+	{
+	@lines = <INFILE>;
+	foreach (@lines)
+		{
+		# Find function prototype lines
+		if (/^GL_APICALL/)
+			{
+			# Convert the function prototype into a stub function definition
+			s/\;$/ { }/;
+			# Record the stub functions.  There will be a stub implementation
+			# file which includes these stub functions.  This ensures we never
+			# accidentally miss a new function added to the header file supplied
+			# as $source.  We expect compiler warnings (missing use of arguments,
+			# absent return value etc.).  The aim is to get something which will
+			# compile so that a DEF file can be generated.
+			print OUTFILE "$_";
+			}
+		}
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/conv_khronos_openvg_hdr_to_cpp.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,84 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Convert the given header file from Khronos into a stub implementation file
+# 
+#
+
+use File::Basename;
+use File::Path;
+
+my $debug = 0;
+my $prog = "conv_khronos_openvg_hdr_to_cpp.pl";
+my $source = shift;
+my $target = shift;
+my $operation_mode = shift;
+my @lines;
+
+if ($debug) {
+  print "$prog: Args $source $target $operation_mode\n";
+}
+
+if ("$operation_mode" eq "delete") {
+  &cleanup();
+  exit 0;
+} elsif ("$operation_mode" eq "create") {
+  &setupFiles();
+  &generateStubImplementation();
+  exit 0;
+} else {
+  print "Usage error: $prog source target [create|delete]\n";
+  exit 1;
+}
+
+sub cleanup()
+  {
+    unlink "$target";
+  }
+
+sub setupFiles()
+  {
+    my $dir;
+    $dir = dirname($target);
+    mkpath $dir;
+	
+    open(INFILE,  "$source") or die "Can't open input file $source; $!\n";
+    open(OUTFILE, ">$target") or die "Can't open output file $target; $!\n";
+    print OUTFILE '/* Auto-generated: ' . "$prog" . ' v1.0 */' . "\n";
+    print OUTFILE '/* Copyright (c) 2008-2009 Nokia Corporation and/or its subsidiary(-ies).  All rights reserved. */' . "\n";
+  }
+
+sub generateStubImplementation()
+  {
+    @lines = <INFILE>;
+    my $s = "";
+    foreach (@lines) {
+      # Find function prototype lines
+      if (/^VG[U]?_API_CALL/ || length($s) != 0) {
+	    $s = $s.$_;
+		if (/;/) {
+		  # Convert the function prototype into a stub function definition
+		  $s =~ s/\;$/ { }/;
+		  # Record the stub functions.  There will be a stub implementation
+		  # file which includes these stub functions.  This ensures we never
+		  # accidentally miss a new function added to the header file supplied
+		  # as $source.  We expect compiler warnings (missing use of arguments,
+		  # absent return value etc.).  The aim is to get something which will
+		  # compile so that a DEF file can be generated.
+		  print OUTFILE "$s";
+		  $s = "";
+		}
+      }       
+    }
+
+  }
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/ecopyfile.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,134 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use File::Copy;
+use File::Basename;
+use File::Path;
+
+
+if (@ARGV!=2)
+	{
+#........1.........2.........3.........4.........5.........6.........7.....
+	print <<USAGE_EOF;
+Usage : perl ecopyfile.pl srcfile dstfile
+
+If dstfile exists and is identical to srcfile then do nothing,
+otherwise copy srcfile to dstfile.
+
+USAGE_EOF
+	exit 1;
+	}
+
+my $srcfile = shift;
+my $dstfile = shift;
+
+# Sanity checking
+#
+
+if (!-e $srcfile)
+	{
+	print STDERR "$srcfile does not exist\n";
+	exit 1;
+	}
+
+if (!-f $srcfile)
+	{
+	print STDERR "$srcfile is not a plain file\n";
+	exit 1;
+	}
+
+my $updating = -e $dstfile;
+
+if ($updating && !-f $dstfile)
+	{
+	print STDERR "$dstfile exists, but is not a plain file\n";
+	exit 1;
+	}
+
+# Can we avoid doing the copy?
+#
+
+if ($updating && !defined($ENV{ECOPYFILE_ALWAYS_COPY}) && (-s $srcfile == -s $dstfile))
+	{
+	# file exists and is the same size - check contents
+
+	open SRC, $srcfile or print STDERR "Cannot open $srcfile\n" and exit 1;
+	open DST, $dstfile or print STDERR "Cannot open $dstfile\n" and exit 1;
+
+	binmode SRC;
+	binmode DST;
+
+	my $srcbuf;
+	my $dstbuf;
+	my $srclen;
+	my $dstlen;
+	my $same = 1;
+
+	while ($same)
+		{
+		$srclen = read SRC, $srcbuf, 4096;
+		$dstlen = read DST, $dstbuf, 4096;
+		if ($srclen == 0 && $dstlen == 0)
+			{
+			last;
+			}
+		$same= $srcbuf eq $dstbuf;
+		}
+
+	close SRC;
+	close DST;
+
+	if ($same)
+		{
+		# Files match - no need to copy
+		exit 0;
+		}
+
+	# files are different
+	}
+
+# Copy srcfile to dstfile
+#
+
+my $action = "create";
+
+if ($updating) {
+	$action = "update";
+}
+else {
+	# see if the destination directory exists to create the file into...
+	my $directory = dirname($dstfile);
+	if (!-e $directory) {
+		# ...and attempt to create it if not.
+		if (!mkpath ($directory)) {
+			print STDERR "Failed to create directory $directory\n";
+			exit 1;
+		}
+	}
+}
+
+
+if (!copy ($srcfile, $dstfile))
+        {
+	print STDERR "Failed to $action file $dstfile\n";
+	unlink $dstfile;
+	exit 1;
+	}
+
+
+printf "%sd %s\n", ucfirst $action, $dstfile;
+exit 0;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/emkdir.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,48 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use File::Path;
+
+
+# THE MAIN PROGRAM SECTION
+{
+	unless (@ARGV) {
+		&Usage();
+	}
+
+	my $originalPath = join (' ',@ARGV);
+	print ("Creating $originalPath\n");
+
+#	temp change for old perl
+	foreach (@ARGV) {
+		s-\\-\/-go;
+	}
+	mkpath([@ARGV]);
+	foreach my $path (@ARGV) {
+	    if (! -e $path) {
+		print ("ERROR: Couldn't create $path\n");
+	    }
+	}
+}
+
+sub Usage () {
+	print <<ENDHERESTRING;
+Usage : perl emkdir.pl list_of_directories
+
+  Creates the directories listed
+ENDHERESTRING
+
+	exit 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/ermdir.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,36 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use File::Path;
+
+
+# THE MAIN PROGRAM SECTION
+{
+	unless (@ARGV) {
+		&Usage();
+	}
+
+	rmtree([@ARGV]);
+}
+
+sub Usage () {
+	print <<ENDHERESTRING;
+Usage : perl ermdir.pl list_of_directories
+
+  Removes the directories listed
+ENDHERESTRING
+
+	exit 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/err_formatter.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,111 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# err_formatter.pm
+# This tool is asked to invoke the Lada compiler and reformat the errors/warnings from CW
+# style to Visual Studio error/warning reporting style.
+# 
+#
+
+
+use FindBin;
+
+my $command = join(' ', @ARGV);
+open PIPE, "$command 2>&1 | ";
+
+
+my $nextLineOfInterest = 0;
+my $new_error_line=();
+my $comp_msg=();
+my $error_token=();
+
+# The error/warning format for CW compiler for the option 
+# -msgstyle parseable is as follows:
+#
+# ToolName|ToolType|MsgType (FileName|Linenumber|digit|digit|digit|digit)
+# = AtToken
+# > ErrorMsg
+#
+# In the above format, the symbols '|', '(', ')', '=' and '>' occur always
+# and this tool assumes there presence.
+# Also, in the above, 
+#	'ToolName' here is mwccsym2.exe
+#	'ToolType' here is Compiler
+#	'MsgType' is either Error or Warning
+#	'FileName' is the file that caused the compiler error/warning
+#	'Linenumber' is the line at which the error/warning is reported
+#	'AtToken' is the token at which the error/warning was reported.
+#	'ErrorMsg' is the error message and it amrks the end of this error/warning.
+#
+
+my @msgs;
+while(<PIPE>)
+{
+	if( $nextLineOfInterest == 1)
+	{
+		if($_ =~ /^>(.*)/)
+		{
+			$comp_msg .= $1;
+			$new_error_line .= "$comp_msg ";
+			$new_error_line .= ": $error_token" if($error_token);
+			push @msgs, $new_error_line;
+			
+			$nextLineOfInterest = 0;
+			$comp_msg = "";
+			$error_token = "";
+			next;
+		}
+		if($_ =~ /^=(.*)/)
+		{
+			$error_token = $1;
+			next;
+		}
+		if($_ =~ /\((.*)\|([0-9]+)\|([0-9]+)\|([0-9]+)\|([0-9]+)\|([0-9]+)\)/)
+		{
+######### $1 is file name
+######### $2 is line number
+
+			$new_error_line = $1."(";
+			$new_error_line .= $2;
+			$new_error_line .= ")";
+			$new_error_line .= ": ";
+
+			next;
+		}
+	}
+	if($_ =~ /Compiler\|Error/)
+	{
+		$comp_msg = "Error: ";
+		$nextLineOfInterest = 1;
+		next;
+	}
+	elsif($_ =~ /Compiler\|Warning/)
+	{
+		$comp_msg = "Warning: ";
+		$nextLineOfInterest = 1;
+		next;
+	}
+	else
+	{
+		$nextLineOfInterest = 0;
+		push @msgs, $_;
+	}
+}
+
+close PIPE;
+my $msg;
+foreach $msg (@msgs)
+{
+	print "$msg\n";
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/genutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,107 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Contains utility subroutines for MAKMAKE and associated scripts
+# 
+#
+
+package Genutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Genutl_AnyToHex
+	Genutl_VersionToUserString
+	Genutl_VersionToHexString
+	Genutl_VersionToFileAugment
+	Genutl_StringToVersion
+	Genutl_ParseVersionedName
+	Genutl_NormaliseVersionedName
+);
+
+
+sub Genutl_AnyToHex ($) {
+# changes decimal and hexadecimal numbers to the required hexadecimal format
+	my $Num=$_[0];
+	$Num=lc $Num;	# lower casing the x specifying hexadecimal essential
+	if ($Num=~/^(\d{1,10}|0x[\dabcdef]{1,8})$/o) { # this isn't perfect
+		$Num=oct $Num if $Num=~/^0x/o;
+		return sprintf "0x%.8lx", $Num;
+	}
+	return undef;
+}
+
+sub Genutl_VersionToUserString(%) {
+	my (%ver) = @_;
+	return sprintf("%d\.%d", $ver{major}, $ver{minor});
+}
+
+sub Genutl_VersionToHexString(%) {
+	my (%ver) = @_;
+	return sprintf("%04x%04x", $ver{major}, $ver{minor});
+}
+
+sub Genutl_VersionToFileAugment(%) {
+	my (%ver) = @_;
+	return sprintf("{%04x%04x}", $ver{major}, $ver{minor});
+}
+
+sub Genutl_StringToVersion($) {
+	my ($s) = @_;
+	if ($s =~ /^(\d+)\.(\d+)$/) {
+		my %ver;
+		$ver{major} = $1;
+		$ver{minor} = $2;
+		if ($ver{major}<32768 and $ver{minor}<32768) {
+			return %ver;
+		}
+	}
+	return undef;
+}
+
+sub Genutl_ParseVersionedName($) {
+	my ($nref) = @_;
+	return 1 unless ($$nref =~ /\{|\}/);
+	my $a;
+	my $b;
+	if ($$nref =~ /(.*)\{((\d|a|b|c|d|e|f){8})\}(.*?)/i) {
+		$a = $1;
+		$b = $3;
+	} elsif ($$nref =~ /(.*)\{\s*(\d+)\s*\.\s*(\d+)\s*\}(.*?)$/i) {
+		$a = $1;
+		$b = $4;
+		my $major = $2;
+		my $minor = $3;
+		return 0 if ($major>=32768 or $minor>=32768);
+		$$nref = $a.sprintf("{%04x%04x}",$major,$minor).$b;
+	} else {
+		return 0;
+	}
+	if ($a=~/\{|\}/ or $b=~/\{|\}/) {
+		return 0;
+	}
+	return 1;
+}
+
+sub Genutl_NormaliseVersionedName($) {
+	my ($name) = @_;
+	if ($name =~ /(.*)\{\s*(\d+)\s*\.\s*(\d+)\s*\}(.*?)$/i) {
+		my $a = $1;
+		my $b = $4;
+		my $major = $2;
+		my $minor = $3;
+		return $a.sprintf("{%04x%04x}",$major,$minor).$b if ($major<32768 and $minor<32768);
+	}
+	return $name;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/listzip.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,71 @@
+#!/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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# e32toolp/genutil/listzip.pl
+# Utility for listing the contents of a zip file.
+# Syntax:
+# perl listzip.pl <prefix> <zipfile>
+# This command will print all files in the <zipfile>. Each file name is prefixed by
+# <prefix> and is printed on a separate line.
+# 
+#
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+sub _print_usage_and_die();
+sub _print_err_and_die(@);
+
+sub main(@)
+{
+    my ($prefix, $zipf, @junk) = @_;
+
+    _print_usage_and_die() if (!$prefix || !$zipf || @junk);
+
+    _print_err_and_die("$prefix is not a directory.") unless -d $prefix;
+    _print_err_and_die("$zipf doesn't exist.") unless -f $zipf;
+
+    my @raw_data = qx/unzip -l $zipf/;
+
+    for (@raw_data)
+    {
+        if ($_ =~ /^\s*\d+\s+\d\d[-|\/|\.]\d\d[-|\/|\.]\d\d\s+\d\d:\d\d\s+(.*)/)
+        {
+            my $line = "${prefix}/$1";
+            $line =~ s/\//\\/g if($^O =~ /^MSWin32$/i);
+	    # don't print directories under the <build> tags
+	    if (!($line =~ /[\\|\/]$/)) {
+		    print "$line\n";
+		    }
+        }
+    }
+}
+
+sub _print_usage_and_die()
+{
+    print "LISTZIP zip files process tool V$MajorVersion.$MinorVersion.$PatchVersion\nusage: listzip.pl <prefix> <zipfile>\n";
+    exit 2;
+}
+
+sub _print_err_and_die(@)
+{
+    print "listzip.pl: error: @_\n";
+    exit 1;
+}
+
+main(@ARGV);
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/modload.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,64 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Runtime module-loading routine for loading e32tools modules into 'main' module
+# 
+#
+
+
+package Modload;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Load_SetVerbose
+	Load_SetModulePath
+	Load_ModuleL
+);
+
+
+use Pathutl;
+
+my %Mode=(
+	Verbose=>0
+);
+my $ModulePath;
+
+sub Load_SetVerbose () {
+	$Mode{Verbose}=1;
+}
+
+sub Load_SetModulePath ($) {
+	$ModulePath=$_[0];
+}
+
+sub Load_ModuleL (@) {
+# Loads a module into the 'main' package, including all the functions the module defines for export
+
+	my @ModBaseList=@_;
+	my $ModBase;
+	foreach $ModBase (@ModBaseList) {
+		$ModBase=uc $ModBase;
+		die "ERROR: Can't load \"$ModulePath$ModBase.PM\"\n" unless -e "$ModulePath$ModBase.PM";
+		if ($Mode{Verbose}) {
+			print "Loading Module: \"",$ModBase,".PM\"\n";
+		}
+		package main;
+		require $ModBase.".PM" or die "ERROR: Can't load function from \"$ModulePath$ModBase.PM\"\n";
+		my $Package=ucfirst lc $ModBase;
+		$Package->import;
+	}
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/output.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,110 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Text formatting module
+# 
+#
+
+package Output;
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	OutSetLength OutSetPostWrap OutFormat Output
+	OutText
+);
+
+
+
+my $Len=80;
+my $PreWrap="\\";
+my $PreWrapLen=length($PreWrap);
+my $PostWrap=' ';
+my $PostWrapLen=length($PostWrap);
+my $Buf='';
+my $Text='';
+
+sub OutSetLength ($) {
+	if ($_[0]) {
+		$Len=$_[0];
+		return $Len;
+	}
+	$Len=80;
+}
+
+sub OutSetPreWrap ($) {
+	$PreWrap=$_[0];
+	$PreWrapLen=length($PreWrap);
+}
+
+sub OutSetPostWrap ($) {
+	$PostWrap=$_[0];
+	$PostWrapLen=length($PostWrap);
+}
+
+sub OutFormat (@) {
+	my $Item;
+	foreach $Item (@_) {
+		$Buf.=$Item;
+	}
+}
+
+sub OutWrite () {
+	my @Buf=();
+	my $CurLen=0;
+	if ($Buf=~/^(\s)/o) {
+		# output any starting spaces or tabs
+		$Text.=$1;
+		$CurLen=length($1);
+	}
+	while ($Buf=~/([^ "\t\n\r\f]*"[^"\t\n\r\f]+"[^ "\t\n\r\f]*|[^ "\t\n\r\f]+)/go) {
+		# get the elements of $Buf into @Buf
+		push @Buf, $1;
+	}
+	$Buf='';
+	my $Elem;
+	foreach $Elem (@Buf) {
+		my $ElemLen=length($Elem);
+		if (($CurLen+$ElemLen+$PreWrapLen) > $Len) {
+			# $Len doesn't account for the newline character
+			# wrap the line if adding another element will take it over the prescribed length
+			$Text.="$PreWrap\n$PostWrap";
+			$CurLen=$PostWrapLen;
+		}
+		elsif ($CurLen>$PostWrapLen) {
+			# add a space to the line if they're are already elements in the line
+			$Text.=' ';
+			$CurLen++;
+		}
+		# add element to the line
+		$Text.=$Elem;
+		$CurLen+=$ElemLen;
+	}
+	# finish with a newline
+	$Text.="\n";
+}
+
+sub Output (@) {
+	OutWrite if $Buf;	# output the formatted text before doing any more output
+	my $Item;
+	foreach $Item (@_) {
+		$Text.=$Item;
+	}
+}
+
+sub OutText () {
+	my $temp=$Text;
+	$Text='';
+	$temp;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/pathutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,384 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# General Path and File Utility Functions for use with Makmake
+# Distinguish paths from filepaths by assuming paths end with "\"
+# therefore ensure this is the case for all paths coming into programs using this module
+# 
+#
+
+package Pathutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Path_SetVerbose Path_Drive Path_WorkPath Path_RltToWork Path_AbsToWork
+	Path_DelFiles Path_Split Path_Dirs Path_StepDirs Path_Strip 
+	Path_MakePathL Path_UpToRoot Path_MakeRlt Path_MakeAbs Path_Chop
+	Path_MakeEAbs Path_Quote Path_MakeRltToBase Path_Norm Path_PrefixWithDrive Path_PrefixWithDriveAndQuote
+);
+
+use Cwd;
+use File::Path;                # for mkpath
+
+my %Mode=(
+	Verbose=>0
+);
+my $Drive;
+my $WorkPath;
+my @WorkPathList;
+
+sub Path_SetVerbose () {
+	$Mode{Verbose}=1;
+}
+
+sub Path_Drive () {
+# return the current drive - programs shouldn't change directory if using this module
+	$Drive;
+}
+
+sub Path_WorkPath () {
+# return the current working directory - programs shouldn't change directory if using this module
+	$WorkPath;
+}
+
+sub helper_MakeRlt ($@) {
+# helper function for computing relative path(s) given a base path
+	my ($BaseRef,@List)=@_;
+	foreach my $p (@List) {
+		my $filename=&Path_Split('File',$p);
+		my @plist=&Path_Dirs($p);
+		my $upcount=scalar @{$BaseRef};
+		foreach (@{$BaseRef}) {
+			if (uc $_ ne uc $plist[0]) {
+				last;
+			}
+			$upcount -= 1;
+			shift @plist;
+		}
+		$p="";
+		while ($upcount-->0) {
+			$p .= "..\\";
+		}
+		foreach (@plist) {
+			$p .= "$_\\";
+		}
+		$p=".\\" if ($p eq "");		# ensure a well-formed result if path == work
+		$p .= $filename;
+	}
+	return wantarray ? @List : $List[0];	
+}
+
+sub Path_RltToWork (@) {
+# make a path or list of paths relative to the current working directory
+	my @List=@_;
+	@List=&helper_MakeRlt(\@WorkPathList,@List);
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_MakeRltToBase ($@) {	#args: $_[0] Base $_[1]... list of (Abs FilePath/Path)
+# make a path, or list of paths, relative to a particular directory specified by the first
+# path passed into the function
+	return undef unless $_[0]=~m-(|\\$)-o;	# allow for null value passed in
+	my ($Base,@List)=@_;
+	my @BasePathList=&Path_Dirs($Base);
+	@List=&helper_MakeRlt(\@BasePathList,@List);
+	return wantarray ? @List : $List[0];	
+}
+
+sub Path_AbsToWork (@) {
+# make a path or list of paths relative to the current working directory absolute
+	my @List=@_;
+	@List=&Path_MakeAbs($WorkPath,@List);
+	return wantarray ? @List : $List[0];	
+}
+
+sub Path_DelFiles (@) {
+# delete a list of files
+	my @List=@_;
+	my $File;
+	foreach $File (@List) {
+		if (unlink $File) {
+			if ($Mode{Verbose}) {
+				print "Deleted File: \"$File\"\n";
+			}
+			next;
+		}
+		if ($Mode{Verbose}) {
+			print "Not Found: \"$File\"\n";
+		}
+	}
+}
+
+sub Path_Split ($$) {	#args: $_[0] 'Path' or 'Base' or 'Ext' $_[1] Abs/Rel FilePath/Path
+# return the section of a file path required - Path, Base, Ext or File
+	my ($Sect,$P)=@_;
+
+	return '' if !$P;
+	
+	$Sect= ucfirst lc $Sect;
+	if ($Sect eq 'Path') {
+		if ($P=~/^(.*\\)/o) {
+			return $1;
+		}
+		return '';
+	}
+	if ($Sect eq 'Base') {
+		if ($P=~/\\?([^\\]*?)(\.[^\\\.]*)?$/o) {
+			return $1;
+		}
+		return '';
+	}
+	if ($Sect eq 'Ext') {
+		if ($P=~/(\.[^\\\.]*)$/o) {
+			return $1;
+		}
+		return '';
+	}
+	if ($Sect eq 'File') {
+		if ($P=~/([^\\]*)$/o) {
+			return $1;
+		}
+		return '';
+	}
+	undef;
+}
+
+sub Path_Dirs ($) {	#args: $_[0] Abs FilePath/Path
+# return an ordered list of individual directories that make up a path
+	return undef unless $_[0]=~m-^\\-o;
+	my $P=&Path_Split('Path',$_[0]);
+	return undef unless $P=~s-^(.*)\\$-$1-o;
+	$P=~s-^\\(.*)-$1-o;
+	split /\\/,$P;
+}
+
+sub Path_StepDirs ($) { #args: $_[0] Abs FilePath/Path
+# return an ordered list of paths - starting with the directory in the root directory from the
+# path passed into the function, each subsequent path contains the next directory from the path
+# passed into the function, and the last path is the same as the path passed into the function
+	return undef unless $_[0]=~m-^\\-o;
+	my $P=$_[0];
+	my @Dirs=&Path_Dirs($P);
+	my @StepDirs;
+	my $dir;
+	my $stepDir="\\";
+	foreach $dir (@Dirs) {
+		$stepDir.="$dir\\";
+		push @StepDirs, $stepDir;
+	}
+	@StepDirs;
+}
+
+sub Path_Strip ($) {	#args: $_[0] Abs FilePath/Path
+# Remove excess occurrences of '..' and '.' from a path
+	return undef unless $_[0]=~m-^\\-o;
+	my $P=$_[0];
+	while ($P=~s-\\\.\\-\\-go) { }
+	while ($P=~s-\\(?!\.{2}\\)[^\\]*\\\.{2}(?=\\)--go) { }
+	$P;
+}
+
+sub Path_MakePathL (@) {	#args: @_ list of Abs FilePath/Path
+# make a directory or list of directories
+	my @Paths=@_;
+	my $P;
+	foreach $P (@Paths) { 
+		return undef unless $P=~m-^\\-o;
+		$P=&Path_Split('Path',$P);
+		$P=&Path_Strip($P);
+		$P=~m-(.*)\\-o;
+		if (-d $1) {
+			if ($Mode{'Verbose'}) {
+				print "Existing Path: \"$P\"\n";
+			}
+			next;
+		}
+		mkpath[$P];
+		if ($Mode{'Verbose'}) {
+			print "Created Path: \"$P\"\n";
+		}
+	}
+	return wantarray ? @Paths : $Paths[0];
+}
+
+sub Path_UpToRoot ($) {	#args: $_[0] Abs FilePath/Path
+# return the path that will lead from the directory the path passed into the function
+# specifies back up to the root directory
+	return undef unless $_[0]=~m-^\\-o;
+	my $Path=$_[0];
+	my $UpP;
+	while ($Path=~m-\\-go) {
+		$UpP.="..\\";
+	}
+	undef $Path;
+	$UpP=~s-^(.*)\.\.\\-$1-o;
+	$UpP=".\\" unless $UpP;
+}
+
+sub Path_MakeRlt ($@) {	#args: $_[0] Start UpPath $_[1]... list of (Abs FilePath/Path)
+# make a path, or list of paths, relative to a particular directory specified by the first
+# path passed into the function which leads upwards from a particular directory
+	return undef unless $_[0]=~m-(|\\$)-o;	# allow for null value passed in
+	my ($UpPath,@List)=@_;
+	my $p;
+	foreach $p (@List) {
+		return undef unless $p=~m-^\\-o;
+		$p=~s-^\\(.*)$-$1-o;
+		$p=$UpPath.$p;
+	}
+	return wantarray ? @List : $List[0];	
+}
+
+sub Path_MakeAbs ($@) {	#args: $_[0] Start Abs FilePath/Path $_[1]... list of (Abs/Rel FilePath/Path)
+# make a path, or list of paths, absolute given the directory specified by the first path
+# passed into the function which the other paths passed into the function are assumed to be
+# relative to
+	return undef unless $_[0]=~m-^\\-o;
+	my ($Path,@List)=@_;
+	my $BasePath=&Path_Split("Path",$Path);
+	undef $Path;
+	my $p;
+	foreach $p (@List) {
+		if ($p=~m-^\.{2}-o) {
+			$p=&Path_Strip($BasePath.$p);
+			next;
+		}
+		if ($p=~m-^[^\.\\]-o) {
+			$p=&Path_Strip($BasePath.$p);
+			next;
+		}
+		if ($p=~m-^\\-o) {
+			$p=&Path_Strip($p);
+			next;
+		}
+		if ($p=~m-^\.\\(.*)$-o) {
+			$p=&Path_Strip($BasePath.$1);
+			next;
+		}
+		return undef;
+	}
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_MakeEAbs ($@) {	#args: $_[0] Start EPOCPath Abs FilePath/Path $_[1]... list of (Abs/Rel FilePath/Path)
+# Variant of MakAbs which also maps "+\\" to "${EPOCPath}"
+	return undef unless $_[0]=~m-^\\-o;
+	my ($EPOCPath,$Path,@List)=@_;
+	my $BasePath=&Path_Split("Path",$Path);
+	undef $Path;
+	my $p;
+	foreach $p (@List) {
+		if ($p=~m-^\\epoc32\\(.*)$-io) {	# change - special case for existing \\epoc32 references
+			$p=$EPOCPath.$1;
+			next;
+		}
+		if ($p=~m-^\s*\+\\(.*)$-o) {
+			$p=$EPOCPath.$1;
+			next;
+		}
+		if ($p=~m-^\.{2}-o) {
+			$p=&Path_Strip($BasePath.$p);
+			next;
+		}
+		if ($p=~m-^[^\.\\]-o) {
+			$p=$BasePath.$p;
+			next;
+		}
+		if ($p=~m-^\\-o) {
+			next;
+		}
+		if ($p=~m-^\.\\(.*)$-o) {
+			$p=&Path_Strip($BasePath.$1);
+			next;
+		}
+		return undef;
+	}
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_Chop (@) {
+# remove the terminating backslash from a path, or list of paths, if there is one
+	my @List=@_;
+	my $Path;
+	foreach $Path (@List) {
+		$Path=~s-^(.*)\\$-$1-o;
+	}
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_Quote ($) {
+# Quote name for use in GNU makefiles
+	my @List=@_;
+	my $Path;
+	foreach $Path (@List) {
+		$Path=~s- -\\ -go if (defined($Path));
+	}
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_Norm ($) {
+# Normalise source specified paths for processing
+	my ($Path) = @_;
+	$Path =~ s/\//\\/g;
+	return $Path;
+}
+
+sub Path_PrefixWithDrive ($) {
+# Take a path, or list of paths, and prefix with drive based on CWD.
+# Relative paths are just returned.
+	my @List=@_;
+	my $Path;
+	my $Drive=$1 if (cwd =~ /^(.:)/); 
+
+	foreach $Path (@List) {
+		next if ($Path !~ /^\\/);
+		$Path=$Drive.$Path;
+	}
+	
+	return wantarray ? @List : $List[0];
+}
+
+sub Path_PrefixWithDriveAndQuote ($) {
+# Take a path, or list of paths, and prefix with drive based on CWD.
+# Relative paths are just quoted.
+	my @List=@_;
+	my $Path;
+	my $Drive=$1 if (cwd =~ /^(.:)/); 
+
+	foreach $Path (@List) {
+		next if ($Path !~ /^\\/);
+		$Path=$Drive.$Path;
+	}
+
+	foreach $Path (@List) {
+		$Path="\"".$Path."\"";
+	}
+	
+	return wantarray ? @List : $List[0];
+}
+
+
+
+BEGIN {
+# get the current working directory
+	$WorkPath=cwd;
+	$WorkPath=~s-/-\\-go; # separator from Perl 5.005_02+ is forward slash
+	$WorkPath=~s/^(.:)//o;    # remove drive letter
+	$Drive=$1;
+	$WorkPath=~s-^(.*[^\\])$-$1\\-o;        # ensure workpath ends with a backslash
+	@WorkPathList=&Path_Dirs($WorkPath);
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/genutil/prepfile.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,172 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# module for preprocessing makmake-style project files
+# 
+#
+
+
+package Prepfile;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Prepfile_SetVerbose Prepfile_SetUpperCase Prepfile_ProcessL Prepfile_SetCmdOptions
+);
+
+
+use Checkgcc;
+use Pathutl;
+use Preprocessor;
+
+my %Mode=(
+	Verbose=>0,
+	UpperCase=>0,
+        CmdOptions=>''
+);
+
+sub Prepfile_SetVerbose () {
+	$Mode{Verbose}=1;
+}
+
+sub Prepfile_SetUpperCase () {
+	$Mode{UpperCase}=1;
+}
+
+sub Prepfile_SetCmdOptions ($) {
+        $Mode{CmdOptions} = shift;
+        $Mode{CmdOptions} .= ' ' if $Mode{CmdOptions};
+}
+
+sub Prepfile_ProcessL ($$;$@) {
+# use the C++ preprocessor to process a file.  The function fills the data structure specified
+# by the first argument, an array reference, according to the contents of the second argument -
+# a filehandle.  Any other arguments are assumed to be MACROS and are defined for preprocessing.
+
+	my ($ArrayRef,$FILE,$VariantHRHFile,@Macros)=@_;
+	die "\nERROR: Project File \"$FILE\" not found\n" unless -e $FILE;
+
+	my $exe = &PreprocessorToUseExe();
+ 	my $cpp = "$exe.EXE $Mode{CmdOptions}-undef -nostdinc -+ ";
+	my @CppCall;
+ 	push @CppCall, $cpp;
+
+	push @CppCall, join '',	"-I ",&Path_PrefixWithDriveAndQuote("$ENV{EPOCROOT}epoc32\\include"),
+							" -I .",
+							" -I ",&Path_PrefixWithDriveAndQuote(&Path_Split('Path',$FILE));
+
+	my $Macro;
+	# add CL macros to the CPP call for preprocessing of the file
+	foreach $Macro (@Macros) {
+		$Macro=uc $Macro;					 # add the underscores so we can tell what has been
+		push @CppCall, "-D $Macro=_____$Macro"; # expanded and remove the space CPP puts in most of the time
+	}
+	#if a variant file is used
+	if(defined($VariantHRHFile)){
+        my $variantFilePath = Path_Split('Path',$VariantHRHFile);
+	chop( $variantFilePath );
+        push @CppCall, " -I " . &Path_PrefixWithDriveAndQuote($variantFilePath) . " -include " . &Path_PrefixWithDriveAndQuote($VariantHRHFile); 
+	}
+	# all macros made upper case and suppress user-expansion of macros for nefarious purposes
+
+	push @CppCall, &Path_PrefixWithDriveAndQuote($FILE);
+	if ($Mode{'Verbose'}) {
+		print "@CppCall\n";
+	}
+	my $CPPPIPE;
+	open CPPPIPE,"@CppCall |" or die "ERROR: Can't invoke CPP.EXE\n";
+
+	# read the processed output
+	#--------------------------
+
+	my $LineNum=0;
+	my $FileName;
+	while (<CPPPIPE>) {
+
+		# skip blank lines
+		if (/^\s*$/o) {
+			$LineNum++;
+			next;
+		}
+
+		my @Tmp=();
+
+	    # Process the file information lines that cpp inserts.
+		# (note that we don't currently do anything with the
+		# number cpp sometimes puts out after the filename -
+		# it's something to do with inclusion nesting levels)
+		if (/^# (\d+) "(.*)"( \d+)?/o) {
+			$LineNum = scalar $1;
+			my $CurFile=$2;
+			$CurFile=~s-\\\\-\\-go;
+			$CurFile=~s-\\\/-\\-go;
+			$CurFile=~s-\/\\-\\-go;
+			$CurFile=~s-\/\/-\\-go;
+			$CurFile=~s-\/-\\-go;
+			$CurFile=~s-(.:)--go;
+
+			$CurFile=&Path_AbsToWork($CurFile);
+			@Tmp=('#', $CurFile);
+			push @{$ArrayRef}, [ @Tmp ];
+			next;
+		}
+
+		# Process file data
+		push @Tmp, $LineNum;
+		# get rid of the space that cpp puts in most of the time after macro expansion (CPP help doesn't say exactly when!)
+		# don't upper case everything until you've done this.
+		
+		foreach $Macro (@Macros) {
+			s/\/ _____$Macro /\/$Macro/g;
+			s/_____$Macro /$Macro/g;
+			s/_____$Macro/$Macro/g;
+		}
+		if(/^macro/i)
+		{
+			#Parse and Store the mmp file statement by retaining double quotes
+			while (/("([^\t\n\r\f]+)"|([^ \t\n\r\f]+))/go) {
+			        my $Flag = $2 ? $2 : $3;
+				if($Flag =~ m/\\\"/) { 
+					$Flag =~ s/\"\\/\\/g;
+					$Flag =~ s/\""/\"/g;
+				}
+				push @Tmp, $Flag;
+			}
+		}
+		else
+		{
+			#Parse and Store the mmp file statement by removing double quotes
+			while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) {
+				push @Tmp, $2 ? $2 : $3;
+			}
+		}
+		push @{$ArrayRef}, [ @Tmp ];
+		$LineNum++;
+	}		
+
+	if ($Mode{UpperCase}) {
+#		upper-case all the data
+		my $Line;
+		my $Item;
+		foreach $Line (@{$ArrayRef}) {
+			foreach $Item (@$Line) {
+				$Item=uc $Item;
+			}
+		}
+	}
+	close CPPPIPE or die $! ? "ERROR: Error closing $exe.exe pipe ($!)\n\t@CppCall\n"
+ 				: "ERROR: $exe.exe returned non-zero exit status ($?)\n\t@CppCall\n";
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/abld.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component dev_build_sbsv1_abld
+
+source	\src\tools\build\sbsv1\abld
+binary	\src\tools\build\sbsv1\abld\group	all
+exports	\src\tools\build\sbsv1\abld\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// 
+//      ******* IMPORTANT CHANGE TO THE CONTENTS OF THIS FILE (2010/02/11) *******
+//
+//      Some of the content of this file has been moved to another bld.inf.
+// 	    (this is in response to http://developer.symbian.org/bugs/show_bug.cgi?id=151)
+//
+//      If you were planning to edit the "buildsystem" exports, e.g.
+//                  TEMPLATE EXTENSION MAKEFILES FOR ABLD
+//      ...then you now need to go to the following bld.inf to make the change.
+//      ../../buildsystem/group/bld.inf
+// 
+//      **** END OF IMPORTANT CHANGE TO THE CONTENTS OF THIS FILE (2010/02/11) ****
+//
+
+
+// ORIGINAL bld.inf contents (e32toolp component) follow
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+// Symbian Build System common files
+../e32util/defutl.pm 			/epoc32/tools/Defutl.pm
+../e32util/e32tpver.pm 			/epoc32/tools/E32tpver.pm
+../e32util/efreeze.pl 			/epoc32/tools/efreeze.pl
+../e32util/h2inc.pl 			/epoc32/tools/h2inc.pl
+../e32util/makedef.pl 			/epoc32/tools/makedef.pl
+../e32util/prepdef.pl 			/epoc32/tools/prepdef.pl
+../genutil/pathutl.pm 			/epoc32/tools/Pathutl.pm
+../e32util/createrfifile.pl		/epoc32/tools/createrfifile.pl
+../e32util/gendef.pl 			/epoc32/tools/gendef.pl
+../e32util/set-rvct.bat 		/epoc32/tools/set-rvct.bat
+../e32util/omapsig.pl			/epoc32/tools/omapsig.pl
+../platform/sym_lkup_util.pl		/epoc32/tools/sym_lkup_util.pl
+../platform/ARMV5.mk			/epoc32/tools/compilation_config/ARMV5.mk
+../platform/extractvars.make		/epoc32/tools/compilation_config/extractvars.make
+../platform/GCCE.mk			/epoc32/tools/compilation_config/GCCE.mk
+../genutil/listzip.pl			/epoc32/tools/listzip.pl
+../genutil/conv_khronos_openvg_hdr_to_cpp.pl        /epoc32/tools/conv_khronos_openvg_hdr_to_cpp.pl 
+../genutil/ecopyfile.pl        /epoc32/tools/ecopyfile.pl
+../genutil/conv_khronos_hdr_to_cpp.pl        /epoc32/tools/conv_khronos_hdr_to_cpp.pl  
+../e32util/armasm2as.pl        /epoc32/tools/armasm2as.pl
+../e32util/copyfeaturevariants.pl        /epoc32/tools/copyfeaturevariants.pl 
+
+// BSF files
+../platform/armv6.bsf        /epoc32/tools/armv6.bsf 
+../platform/armv6t2.bsf        /epoc32/tools/armv6t2.bsf 
+../platform/gccev7.bsf        /epoc32/tools/gccev7.bsf 
+../platform/armv5smp.bsf        /epoc32/tools/armv5smp.bsf 
+../platform/armv6smp.bsf        /epoc32/tools/armv6smp.bsf 
+../platform/gccev6t2.bsf        /epoc32/tools/gccev6t2.bsf
+../platform/gccev6.bsf        /epoc32/tools/gccev6.bsf 
+../platform/armv6_abiv1.bsf        /epoc32/tools/armv6_abiv1.bsf 
+../platform/armv7.bsf        /epoc32/tools/armv7.bsf  
+
+#ifdef SBSV2
+#ifndef TOOLS2_LINUX
+// export Symbian Build System v1 in case of no confliction.
+
+../genutil/modload.pm        /epoc32/tools/modload.pm  
+../bldmake/linkdeps.pl        /epoc32/tools/linkdeps.pl  
+../platform/cl_gccxml.pm        /epoc32/tools/cl_gccxml.pm 
+../platform/ide_cw.pm        /epoc32/tools/ide_cw.pm 
+../platform/cl_gcc.pm        /epoc32/tools/cl_gcc.pm 
+../toolinfo/gcce_plat2set.pm        /epoc32/tools/gcce_plat2set.pm 
+../platform/cl_x86gcc.pm        /epoc32/tools/cl_x86gcc.pm 
+../platform/filenamepolicyexclusions.txt        /epoc32/tools/filenamepolicyexclusions.txt 
+../makmake/makdeps.pm        /epoc32/tools/makdeps.pm 
+../e32util/epocmbm.pl        /epoc32/tools/epocmbm.pl 
+../platform/cl_edg.pm        /epoc32/tools/cl_edg.pm 
+../platform/cl_tools.pm        /epoc32/tools/cl_tools.pm 
+../e32util/fixsource.bat        /epoc32/tools/fixsource.bat 
+../platform/cl_generic.pm        /epoc32/tools/cl_generic.pm 
+../platform/e32variant.pm        /epoc32/tools/e32variant.pm 
+../platform/bpabiutl.pm        /epoc32/tools/bpabiutl.pm 
+../genutil/prepfile.pm        /epoc32/tools/prepfile.pm 
+../platform/ide_vc6.pm        /epoc32/tools/ide_vc6.pm 
+../bldmake/bldmake.pl        /epoc32/tools/bldmake.pl 
+../e32util/checkgcc.pm        /epoc32/tools/checkgcc.pm 
+../e32util/epocrc.pl        /epoc32/tools/epocrc.pl 
+../memtrace/memtrace.bat        /epoc32/tools/memtrace.bat 
+../platform/cw_project_template_v3.xml        /epoc32/tools/cw_project_template_v3.xml 
+../bldmake/abld.pl        /epoc32/tools/abld.pl 
+../platform/default_plats.txt        /epoc32/tools/default_plats.txt 
+../platform/e32plat.pm        /epoc32/tools/e32plat.pm 
+../e32util/_secure_e32env.pm        /epoc32/tools/e32env.pm 
+../e32util/deletefeaturevariants.pl        /epoc32/tools/deletefeaturevariants.pl 
+../platform/cw_link_descriptor_template_v2.cwlink        /epoc32/tools/cw_link_descriptor_template_v2.cwlink 
+../makmake/mmp.pm        /epoc32/tools/mmp.pm 
+../genutil/err_formatter.pl        /epoc32/tools/err_formatter.pl 
+../platform/cl_bpabi.pm        /epoc32/tools/cl_bpabi.pm 
+../bldmake/metabld.bat        /epoc32/tools/metabld.bat 
+../e32util/epocrc.bat        /epoc32/tools/epocrc.bat 
+../platform/lockit_info.pm        /epoc32/tools/lockit_info.pm 
+../toolinfo/rvct_plat2set.pm        /epoc32/tools/rvct_plat2set.pm 
+../platform/default_plats_v2.txt        /epoc32/tools/default_plats_v2.txt 
+../platform/cl_x86.pm        /epoc32/tools/cl_x86.pm 
+../platform/cl_mingw.pm        /epoc32/tools/cl_mingw.pm 
+../bldmake/metabld.pl        /epoc32/tools/metabld.pl 
+../e32util/checksource.pl        /epoc32/tools/checksource.pl 
+../makmake/makmake.pl        /epoc32/tools/makmake.pl 
+../platform/findimp.pl        /epoc32/tools/findimp.pl 
+../e32util/checksource.pm        /epoc32/tools/checksource.pm 
+../e32util/genshimsrc.bat        /epoc32/tools/genshimsrc.bat 
+../toolinfo/rvct_ver2set.pm        /epoc32/tools/rvct_ver2set.pm   
+../e32util/selectbootmak.pl        /epoc32/tools/selectbootmak.pl 
+../makmake/makhelp.pm        /epoc32/tools/makhelp.pm 
+../platform/cl_codewarrior.pm        /epoc32/tools/cl_codewarrior.pm 
+../bldmake/wrappermakefile.pm        /epoc32/tools/wrappermakefile.pm 
+../genutil/genutl.pm        /epoc32/tools/genutl.pm 
+../platform/cl_vscw.pm        /epoc32/tools/cl_vscw.pm 
+../e32util/epocaif.pl        /epoc32/tools/epocaif.pl 
+../bldmake/bldmake.bat        /epoc32/tools/bldmake.bat 
+../e32util/listfeaturevariants.pl        /epoc32/tools/listfeaturevariants.pl 
+../memtrace/memtrace.pl        /epoc32/tools/memtrace.pl 
+../genutil/ermdir.pl        /epoc32/tools/ermdir.pl 
+../platform/armutl.pm        /epoc32/tools/armutl.pm 
+../platform/cl_arm.pm        /epoc32/tools/cl_arm.pm 
+../makmake/makmake.bat        /epoc32/tools/makmake.bat 
+../e32util/featurevariantparser.pm        /epoc32/tools/featurevariantparser.pm 
+../makmake/_secure_trgtype.pm        /epoc32/tools/trgtype.pm 
+../genutil/emkdir.pl        /epoc32/tools/emkdir.pl 
+../platform/cw_link_descriptor_template.cwlink        /epoc32/tools/cw_link_descriptor_template.cwlink  
+../genutil/output.pm        /epoc32/tools/output.pm 
+../e32util/efreeze.bat        /epoc32/tools/efreeze.bat 
+../platform/cw_project_template_v4.xml        /epoc32/tools/cw_project_template_v4.xml 
+../platform/fcloggerutl.pm        /epoc32/tools/fcloggerutl.pm 
+../platform/cl_win.pm        /epoc32/tools/cl_win.pm 
+../e32util/featurevariantmap.pm        /epoc32/tools/featurevariantmap.pm 
+../e32util/preprocessor.pm        /epoc32/tools/preprocessor.pm 
+../platform/winutl.pm        /epoc32/tools/winutl.pm 
+#endif
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/build.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+To build e32toolp, call
+
+\e32toolp\group\setupprj.bat
+\e32toolp\group\bld.bat rel
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/info.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,184 @@
+SETUPPRJ.BAT
+============
+SETUPPRJ will create a BLD.BAT file in the GROUP directory and
+read the LI.PRJ file in other second-level directories, creating
+a BLD.BAT in each which will provide commands for building any
+.BAT, .PL and .PM files to \epoc32\tools.
+SETUPPRJ will also create \E32TOOLP\GROUP\E32TOOLP.REL
+
+PERLPREP.BAT
+============
+PERLPREP strips "use strict;" debugging lines out
+of .PL and .PM files and perl warning generation -w flag out of .BAT
+files.  It is used for REL builds of E32TOOLP.
+
+RELEASING E32TOOLP
+==================
+make changes to source
+change release.txt - update the date and "made by" details
+add any new files which contain a version number to setver.bat
+(remember perl files can use the service in E32TPVER.PM).
+cd \e32toolp\group
+run setver [version] to apply the latest version number.
+cd \e32toolp
+cvs commit to commit the version changes
+cd \e32toolp\group
+do setupprj to create the batch and .rel file
+do bld clean
+do bld rel
+Prep the tree for release to PVCS:
+cd \
+perl \tools\pvcs-release.pl -f e32toolp
+Tag the modules you're releasing:
+cd \e32toolp
+cvs tag E32TOOLPvNNN
+Move the Latest-Release tag to the new files:
+cvs rtag -d Latest-Release e32toolp
+cvs rtag -r E32TOOLPvNNN Latest-Release e32toolp
+cd \e32toolp\group
+Create a vdiff.lis file with mnt difsrc <previous release>
+do set vcsid=BASETEAM
+do mnt lock  to make sure BASETEAM has the lock for all li.prj files
+do mnt putsrc
+do mnt versrc
+do mnt putrel
+do set vcsid=<your vcsid>
+cd \e32toolp
+Tag the release as complete (on the main branch)
+	cvs tag Release-NNN-complete
+go to the root of a clean drive
+getrel e32toolp tools <version>
+check it basically works - eg bldmake, makmake /mmp
+rd /s /q epoc32
+pgetbld e32toolp group
+setupprj
+bld rel
+mnt valid
+check \e32toolp\valid.lis
+update Lotus Notes
+update tlmakmak.rtf
+
+OTHER INFO
+==========
+CASE SENSITIVITY
+	Perl pattern-matching is twice as quick if it's done case-sensitive - keep
+	all data uppercase except when it's actually being outputted - at that point
+	it  can be formatted by doing something like ucfirst lc ...
+	This is important so that pattern-matching done on data can assume
+	uppercase.
+
+CPP
+	cpp assumes with -M and -MG that missing user headers live in the same directory as the
+	source while missing system headers live in the first system include directory specified.
+	This is not in fact true.  CPP always searches the directory containing the source file
+	for headers if no user include path is specified explicitly.  Then, and only then, if the
+	-MG option is specified to -M cpp will just bang out the missing files without a path,
+	whether or not they exist in the current directory or not.  This means that if cpp is
+	invoked in a makefile, (this probably applies to gcc too), cpp will fail unless these headers
+	without a path exist in the working directory. 
+
+	cpp doesn't replace lines of text within #defines within other #defines 
+	with blank space if the lines aren't applicable for the current set of
+	macros.  This can upset makmake's reporting of correct line numbers for errors.
+
+	cpp documentation states that a space is put at the end of a macro expansion
+	"most of the time".  We need to strip this back out after cpp has done its
+	preprocessing in prepfile.pm.  By expanding macros to themselves with three
+	leading underscores we can tell where a macro has been expanded and strip
+	the space added.
+
+MAKMAKE MODULE DESIGN
+	the IDE/CL modules should provide
+	a complete list of possible build variants and be designed in such a way that a particular
+	implementation would not have to use all the builds if it didn't want to.  I think this
+	will be the case already.  So, for example, if MISA could not do RELGDB the the CL_ARM code
+	should never assume that all builds are required (except DEB or REL, which we must insist upon as a
+	default in some cases).
+
+
+QUOTES IN MAKEFILES
+
+	Must be consistent with quotes round long filenames.  If remove quotes round .in
+	file as a target to appease ar, the target will not be found and relgdb will not
+	build.  It seems that without the quotes the filename is parsed so the leading .\
+	on the front of the relgdb paths no longer makes a difference so rel and relgdb
+	targets are considered the same.  This means that rules for the rel and relgdb .in
+	file, if it is around this target that the quotes are removed, and all subsequent
+	dependencies and rules, will be done for each source file - eg gcc looks like it
+	will be called twice with different flags.  For the relgdb build nmake will complain
+	that it doesn't know how to build the .in file because it sees it as a dependency of
+	the main target with quotes and doesn't recognise it as the same thing appearing later
+	as a target without quotes because the .\ is parsed out.  The rel build doesn't complain
+	because it has no preceding .\ to parse out.  In short, filenames without quotes are parsed and
+	amount to the same thing as filenames with quotes if the only difference between the two is the
+	quotes and not the path itself.
+
+
+COMPILER FLAGS
+==============
+
+ALL BUILDS
+/nologo    - dont display the banner
+/Zp4       - Zp[n] - pack structs on n-byte boundary (whatever that means) /W4        - top level warnings
+/Fo<file>  - specifies object file (left blank so base name taken from .cpp     
+file)
+/c         - compile only, don't link because we'll be linking later
+
+SPECIAL CASES
+
+/ML     - Use run-time library -> Single-threaded       (WINS exe release) /MD     - Use run-time library -> Multi-threaded DLL    (WINS dll release)
+these two flags have "d" appended for debug builds so that the respective debug run-time library is used instead.  These flags are probably unnecessary for all projects not using Win32 libraries but MSVC puts them in by default, and it doesn't do any harm to have them I don't think
+
+/O1     - minimum size optimisation (WINS release)
+/Ob1    - disable inline function expansion (WINS release)  (reason uncertain!)
+
+/Od     - disable optimisations (WINS debug)
+
+/Zi     - generate debugging info into program database (WINS debug)
+
+/FR     - generate browse info (WINS debug)
+
+/Fd<file>     - name program database (WINS debug)
+
+/X      - suppresses searching of include directories specified by environmental
+include variable (so used for all projects not using Win32 services)
+
+
+LINKER FLAGS
+============
+
+ALL BUILDS
+/nologo                 - suppress startup banner /subsystem:windows      - MSVC always puts this in anyway /machine:IX86           - ditto
+/out:<file>             - specifies filename for target /WARN:3                 - top-level warnings
+/nodefaultlib           - don't use Win32 libraries (if any are being used then 
+they are listed before this flag and so are not        
+affected by it)
+
+SPECIAL CASES
+/baseaddress:<hex num>  - base address for DLLs, specified by user /entry:"_E32Startup"    - EPOC32 entry point for EXEs /entry:"_E32Dll"        - EPOC32 entry point for DLLs
+
+/incremental:no         - (WINS release) - presumably so a full-link is always  
+performed
+/incremental:yes        - (WINS debug)  - presumably to save time linking-fully 
+when working on a project
+
+/dll                    - (WINS dll targets)
+
+/pdb<file>              - (WINS debug) <file> names program database
+
+/deffile:<file>         - (WINS dll targets) <file> specifies a def file to     
+refer to if one is specified by the user
+
+/implib:<file>          - specifies name of import library to be created for dll
+targets if one is to be created
+
+/debug                  - (WINS debug)  generates debugging information
+
+
+SOURCES OF INFORMATION FOR MAKMAKE ETC
+======================================
+NMAKE Reference in MSVC help
+Cygnus help files in R:\gcc\help - eg cpp.hlp
+Lotus notes - Epoc Software Design - Development Environment - suggestions
+for better build procedures
+Perl newsgroups
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/perlprep.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,58 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+REM a basic perl preprocessor
+
+if exist %0.bat perl -x %0.bat %1 %2 %3 %4 %5
+if exist %0 perl -x %0 %1 %2 %3 %4 %5
+GOTO End
+
+#!perl
+
+use strict;
+
+die "Usage:\nPERLPREP [infile] [outfile]\n" unless @ARGV==2;
+
+my ($INFILE, $OUTFILE)=map lc $_, @ARGV;
+die "Can't find $INFILE\n" unless -e $INFILE;
+
+if ($INFILE=~/\.(bat|cmd|pm|pl)$/io) {
+	open INFILE,$INFILE or die "Can't open $INFILE: $!\n";
+	my $FileText='';
+	while (<INFILE>) {
+		s/(perl)(\.exe)?\s+-w/$1$2/io;		# remove perl -w switch - has to be first switch
+		s/use\s+strict;\s*\n//oe;	# remove use strict; statement
+		$FileText.=$_;
+	}
+	close INFILE or die "Can't close $INFILE: $!\n";
+	open OUTFILE,">$OUTFILE" or die "Can't open $OUTFILE: $!\n";
+	print OUTFILE $FileText;
+	close OUTFILE or die "Can't close $OUTFILE: $!\n";
+}
+else {
+	system "copy $INFILE $OUTFILE";
+}
+
+
+__END__
+
+:End
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/release.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3925 @@
+
+<unchange>
+================
+(Made by Zheng Shen 12/06/2010)
+1) minor: enable the following scripts on Linux
+conv_khronos_openvg_hdr_to_cpp.pl
+conv_khronos_hdr_to_cpp.pl
+copyfeaturevariants.pl
+ecopyfile.pl
+armasm2as.pl 
+
+===============
+sym_lkup_util 	version 1.1.0
+listzip 	version 1.1.0
+prepdef 	version 1.1.1
+omapsig 	version 1.1.0
+makedef 	version 1.1.1
+h2inc 		version 1.1.0
+gendef 		version 1.1.0
+createrfifile 	version 1.1.0
+efreeze 	version 1.1.1
+================
+(Made by Marvin Shi 02/06/2010)
+1) change for linux porting
+
+=======
+Version 1.1.0 (efreeze.pl)
+Version 1.1.0 (prepdef.pl)
+Version 1.1.0 (makedef.pl)
+================
+(Made by Lorence Wang 14/05/2010)
+1) Lorence Wang
+  Make efreeze.pl prepdef.pl makedef.pl sym_lkup_util.pl stand alone
+
+Version 0.01.679
+================
+(Made by Zheng Shen 11/02/2009)
+1) Marvin Shi
+	PDEF144284  refine fix for Bug 151 -  bldmake is not in PDK2.0c
+2) Ross Qin
+  PDEF144387  Tools meta files should not be exported in the build phase 
+
+Version 0.01.678
+================
+(Made by Zheng Shen 8/02/2009)
+1) Brook Hong
+	PDEF144276  Excess warnings from makedef.pl 
+2) Marvin Shi
+  PDEF144257  Add libWFC and WF to case check exclusions 
+
+Version 0.01.676
+================
+(Made by Marvin Shi 3/02/2010)
+1) Marvin Shi
+	PDEF144099 Missing vmap files when using symbian binary variantion 
+
+Version 0.01.675
+================
+(Made by Marvin Shi 18/01/2010)
+1) Marvin Shi
+	DEF143085  Bug 151 - bldmake is not in PDK2.0c 
+
+Version 0.01.674
+================
+(Made by Zheng Shen 16/12/2009)
+1) Marvin Shi
+	DEF143406  symbian BV build failed for feature variant target build 
+
+Version 0.01.673
+================
+(Made by Marvin Shi 25/11/2009)
+1) Yan Jin
+	DEF143140  Toolsmod integrate to ABLD
+2) Zheng Shen
+	DEF143198  ABLD cannot build STD project when standard C++ support is not available 
+	
+Version 0.01.672
+================
+(Made by Marvin Shi 13/11/2009)
+1) Zheng Shen
+  DEF143038 ABLD is in poor performance on feature variant handling
+2) Marvin Shi
+  DEF142311  SBSv1 hangs when building for GCCE if RVCT license server not available 
+ 	
+Version 0.01.671
+================
+(Made by Vino Jose 24/09/2009)
+
+1) VincentF
+	DEF142155 h2inc.pl produces wrong output with 64-bit Perl
+
+Version 0.01.670
+================
+(Made by Ross Qin, 15/09/2009)
+1) Yan Jin
+	PDEF142025 ABLD LIBRARY ARMV6 does not get exported correct to ARMV6 folder 
+
+Version 0.01.669
+================
+(Made by Ross Qin, 11/09/2009)
+1) Zheng Shen
+	DEF142005 Remove the hardcode RVCT path when RVCT auto switch feature is disabled
+
+Version 0.01.668
+================
+(Made by Zhi Dou, 24/08/2009)
+1) Marvin Shi
+	DEF141643 boost library integration causes dependency warning
+
+Version 0.01.667
+================
+(Made by Zhi Dou, 13/07/2009)
+1) Marvin Shi
+	PDEF138235 [StrayScanner]GCCXML build macros out-of-date 
+
+Version 0.01.666
+================
+(Made by JohnS, 24/02/2009)
+1) MichaelMoate
+	DEF135478 tools_e32toolp.mrp is missing entries for naviengine extension makefiles
+
+Version 0.01.665
+================
+(Made by SivashankarN, 14/11/2008)
+1) Dan Handley
+	DEF128540 Building for the x86gcc platform by default!
+
+Version 0.01.664
+================
+(Made by Kun Xu, 17/06/2008)
+1) Kun Xu
+	PDEF122710 Problems in cl_bpabi.pm impacting Java builds.
+	PDEF123589 ARMV6 BSF handled incorrectly in tools.
+
+Version 0.01.663
+================
+(Made by ParameshwariB, 23/05/2008)
+1) TomCosgrove
+	DEF123134: X86 GCC only: Don't delete the PE-COFF files; they are needed by GDB
+
+Version 0.01.662
+================
+(Made by William Roberts, 22/04/2008)
+1) William Roberts
+	Move make.exe and scpp.exe into e32toolp\binutils directory, and
+	add zip files of the matching source code, comply with the GPL license
+	Adjust setupprj.bat and bld.inf accordingly.
+
+Version 0.01.662
+================
+(Made by Iain Williamson, 08/04/2008)
+1) Iain Williamson
+	GT0367 MS3.2.1 DS781 PREQ1902: Product Creation Tools: Kit Information File
+
+Version 0.01.661
+================
+(Made by Jon Chatten, 06/02/2008)
+1) Jon Chatten
+	DEF117441: SBSv2 - e32toolp should support .rfi generation for GCCXML builds
+
+Version 0.01.660
+================
+(Made by Jon Chatten, 17/01/2008)
+1) Jon Chatten
+	DEF116424: ABLD should ignore the DEPENDS keyword in .mmp file START RESOURCE blocks
+
+Version 0.01.659
+================
+(Made by Peter Harper, 20/12/2007)
+1) Peter Harper
+	CR1234: Product Usability: Fix Symbian's Binary Variation Solution
+	Needs new verion of GCC CPP (Symbian build 548)
+
+Version 0.01.658
+================
+(Made by Jon Coppeard, 15/11/2007)
+1) Jon Coppeard
+	DEF114126: maksym can be speeded up
+
+Version 0.01.657
+================
+(Made by Mool Chand Tyagi, 12/10/2007)
+1) Mool Chand Tyagi
+	PREQ1338: Supporting Static analysis tool in ABLD
+
+Version 0.01.656
+================
+(Made by Saravana KumarP, 27/09/2007)
+1) Saravana KumarP
+	PREQ1801: Feature Manager supporting tool enhancements
+
+Version 0.01.655
+================
+(Made by YiluZhu, 29/08/2007)
+1) YiluZhu
+	DEF110344: [TCL Build]:Warnings related to tools_sdb in DP00005 
+
+Version 0.01.654
+================
+(Made by AndrewSmi, 09/08/2007)
+1) AndrewSmi
+	DEF110094: Run mode debug: debuggable keyword not supported for armv5_abiv1 in MCL
+
+Version 0.01.653
+================
+(Made by Stephen Mansfield 22/08/2007)
+1) stephenm
+    DEF110923: Add new PLUGIN3 target type for EC43 ECOM Interface Extensions
+
+Version 0.01.652
+================
+(Made by Saurabh, 6/08/2007)
+1) Saurabh
+	PDEF107553: Symbian should treat wchar_t as default datatype for OETYPE building any project. 
+
+Version 0.01.651
+================
+(Made by Madhu, 20/07/2007)
+1) Madhu
+	PDEF109271: maksym sometimes ignores ctors & dtors in preference to "sub_objects". 
+
+Version 0.01.650
+================
+(Made by Andrew Haigh, 17/05/2007)
+1) AndrewHaigh
+	PREQ1426: Added support for DEBUGGABLE MMP keyword.
+
+
+================
+(Made by Dusko,  12/12/2006)
+1) Dusko
+	PDEF096684: RF LOCAL_BUILD_PATH is causing build problems with RVCT but works with WINSCW
+
+Version 0.01.648
+================
+(Made by Dusko,  24/11/2006)
+1) KunalM
+	DEF097985  - TOOLS2 build platform doesn't provide the advertised macros correctly
+
+Version 0.01.647
+================
+(Made by Kunal,  08/11/2006)
+1) KunalM
+   PREQ1182 - GNU Make-based build system
+   MS3.6 DS .425 	
+
+Version 0.01.646
+================
+(Made by Dusko,  06/11/2006)
+1) JonC
+   PDEF096296 - Build system generated paths/files don't all comply with the Filename Policy
+
+Version 0.01.645
+================
+(Made by Dusko,  11/10/2006)
+1) Dusko
+DEF093326: MAKSYMROFS.PL broken by changes to rofsbuild log format
+
+Version 0.01.644
+================
+(Made by Dusko,  27/09/2006)
+1) JohanG
+	DEF090303: TARGETTYPE LIB should not permit additional LIBRARY statements.
+
+Version 0.01.643
+================
+(Made by Dusko,  12/09/2006)
+1) JonC
+	Fix for DEF093939 - "abld -checksource" benign warnings are picked up by SCANLOG.
+
+Version 0.01.642
+================
+(Made by Srinivaskv,  11/09/2006)
+1)Srinivaskv
+        BR1874.1 The Instcol.exe build utility is no longer useful as there is no need to deal with black and white screens.Hence this legacy tool should be removed.
+
+Version 0.01.641
+================
+(Made by Dusko,  05/09/2006)
+1) Dusko
+	DEF093365 abld reallyclean not working for h2 
+	INC090726 Failure to replace zip files in abld export if existing files have later times  
+2)	JonC
+	DEF093291 - "abld -checksource" ignores WIN32_LIBRARY statements
+	DEF093289: FIXSOURCE doesn't deal with exclusion list entries correctly
+	
+Version 0.01.640
+================
+(Made by JonathanM,  01/09/2006)
+1) AttilaV
+	DEF091560 Warning when using PAGED keyword in MMP file
+
+Version 0.01.639
+================
+(Made by JonC,  09/08/2006)
+1) JonC
+	Oghma,GT0312,MS3.1 DS.188 - PREQ1182: System-wide: Application of Filename Policy to production build 
+
+Version 0.01.638
+================
+(Made by Dusko,  31/07/2006)
+1) Dusko
+	PDEF087907: Size of compiled resource file is limited up to 64KB
+
+Version 0.01.637
+================
+(Made by Dusko,  25/07/2006)
+1) Dusko
+	INC088496 .c files are compiled with -c90 even if -cpp is specified in the OPTIONS list
+2) JohanG 
+	PDEF090318 Targetpath cases need to match
+3)	JonC
+	DEF088256 CW >=3.1 IDE builds and multiple LANG statements - brok
+
+Version 0.01.636
+================
+(Made by Dusko, 20/07/2006)
+1) Jon Chatten 
+	DEF090302  PRJ_EXPORTS sections in bld.inf files don't support local relative destinations	
+
+
+Version 0.01.635
+================
+(Made by Dusko,  23/06/2006)
+1) Dusko
+	INC088374 Catalogs_3.1 does not compile on S60 3.1 build robot (SOS 9.2 wk24)	
+
+Version 0.01.634
+================
+(Made by Dusko,  23/06/2006)
+1) Rajeswari Rajan
+	INC087802: GCCE Linker can't handle dependencies correctly with -O2 optimization
+
+Version 0.01.633
+================
+(Made by Dusko, 19/06/2006)
+1) JohanG
+	DEF067717: printsym.pl doesn't show DLL name for DLLs without symbols
+
+Version 0.01.632
+================
+(Made by Dusko, 15/06/2006)
+1) JohanG
+	DEF066625: MMP XML files have wrong name to fixes branch.
+	DEF087354: abld makefile - dependencies don't work for user header files
+	DEF087077 S60 3.0: GCCE Compiler/Linker will not link static libraries with circular depen
+	DEF087811 GCCE build broken - elf2e32 not update
+	DEF080212 Extension makefile setupprj step doesn't work if Cygwin is in the path
+	DEF086001 cl_bpabi: reorder the list of linked static libraries to support gcce compiler
+
+2) Dusko 
+	PDEF087156 evalid doesn't ignore RCS tags in header files 
+
+3) SatyakamM
+	DEF087646 Broken MakHelp.pm in MCL 
+
+Version 0.01.631
+================
+(Made by DavidM, 26/05/2006)
+
+1.	AttilaV
+	Milestone: Argus,GT0286,MS3.2
+	Extended MAKMAKE (MAKAKE.PL, MMP.PM, CL_ARM.pm, CL_BPAPI.pm, MAKHELP.PM) to handle new compression related MMP keywords and
+	pass the compression parameter to ELFTRAN/ELF3E32 in tha makefiles.
+
+Version 0.01.630
+================
+(Made by Dusko, 31/05/2006)
+1) JohanG
+	DEF087163 cl_gccml.pm corrupts the mmp.xml generated for GXP files (and CDB)
+2) JonC 
+	DEF087148 "abld -check" sensitive to EC MAKE descriptive output 
+
+Version 0.01.629
+================
+(Made by Dusko, 30/05/2006)
+1) SatyakamM
+	DEF083913: efreeze does'nt mark the frozen DATA symbols as DATA
+
+Version 0.01.628
+================
+(Made by Dusko, 25/05/2006)
+1) Dusko
+	DEF073575 "bldmake -v bldfiles" produces incorrect output
+
+Version 0.01.627
+================
+(Made by Dusko, Mon 19/05/2006)
+1) Johan Groth
+	DEF077591 Dependency generation cannot be turned of in Java builds 
+	DEF084331 Can't find produced GCCXML files in some cases
+	DEF066625 MMP XML files have wrong name 
+	DEF078382 MMP: STRINGTABLE doesn't support forward slashed paths 
+ 
+Version 0.01.626
+================
+(Made by Dusko, Mon 08/05/2006)
+1) Dusko
+	INC084690 Bldmake fails when RVCT isn't installed
+
+Version 0.01.625
+================
+(Made by Dusko, 13/04/2006)
+1) Dusko
+	DEF075216 Tools stubs+abld+tranasm doesnt work
+
+Version 0.01.624
+================
+(Made by JonC, 03/04/2006)
+1) JonC
+	INC079605 Build tools path length limitations
+
+Version 0.01.623
+================
+(Made by Dusko, 23/03/2006)
+1) SatyakamM
+	DEF083247 DEF File oddity - MW linker failure 
+
+Version 0.01.622
+================
+(Made by Dusko, 21/03/2006)
+1) Dusko
+	DEF082351: CW IDE GCCE project creation broken...
+
+Version 0.01.621
+================
+(Made by Dusko, 16/03/2006)
+1) Dusko
+	DEF081536: TARGET keyword is still required with TARGETTYPE NONE
+
+Version 0.01.620
+================
+(Made by Dusko, 07/03/2006)
+1) Dusko
+	DEF080983 .dso files are missing 
+	DEF075343 epocrc.pl is ceateing incorrect .INFO files
+	DEF081762 Incorrectly flipping the file extension for STATICLIBS 
+
+
+Version 0.01.619
+================
+(Made by Dusko, 20/02/2006)
+1) Dusko
+	DEF080567 epocrc.bat script only allows 9 parameters 
+	EF080568 Cannot force C++ compile for ARMV5 builds
+	DEF078622 "abld build gccxml" broken.
+
+Version 0.01.618
+================
+(Made by Jonc, 15/02/2006)
+1) JonC
+	DEF080188 START STRINGTABLE doesn't permit use of the temp generated header only
+
+Version 0.01.617
+================
+(Made by Jonc, 30/01/2006 and 03/02/2006)
+1) JonC
+	 PREQ1366 - Prepare codebase for Linux-hosted system build
+	 Argus, GT0282, MS3.6, DS.138, Tight and Loose Integration Extension Makefiles Tools Support
+
+Version 0.01.616
+================
+(Made by Dusko, 05/01/2006)
+
+1)	Dusko
+	INC073941: Symbian build tools override "--cpu" ARMCC parameter
+2)	JonC
+	DEF075532 - CR ABEK-6CYHEC has broken EVALID ELF comparisons
+
+Version 0.01.615
+================
+(Made by Dusko, 09/12/2005)
+	1)	Dusko
+		DEF073923 makmake for gcce platform is failing 
+		DEF074514 PRJ_EXPORTS failure when files #included within bld.infs using "/" in paths 
+		DEF074174 VA_* macros cannot be used with GCCE 
+		DEF075224: cl_gccxml.pm does not separate user and system includes 	
+
+Version 0.01.614
+================
+(Made by JonC, 09/12/2005)
+1)	JonC
+	PREQ1366 - Tools changes as a result of filename policy
+	MS3.4 DS.145
+
+Version 0.01.613
+================
+(Made by Dusko, 16/11/2005)
+1)	JonC
+	PREQ1366 - Prepare codebase for Linux-hosted system build
+	MS3.2 DS.138 BR.1718	
+2)	Dusko
+	DEF068711: bldmake bldfiles <platform> failing.
+3)	KuldipN
+	DEF073602 - Problems integrating new compilers into toolchain
+
+Version 0.01.612
+================
+(Made by JonC, 15/11/2005)
+1) JonC
+	 PREQ1366 - Prepare codebase for Linux-hosted system build
+	 MS3.1 DS.140 BR.1683.1
+
+Version 0.01.611
+================
+(Made by MichaelMo, 08/11/2005)
+
+1) JonCo
+	 DEF071838: Fixupsym.pl can't cope with folders containing "." in their names
+
+Version 0.01.610
+================
+(Made by Dusko, 04/11/2005)
+1) Dusko
+	DEF072548 Tools stubs+abld+def2dll doesn't work
+
+Version 0.01.609
+================
+(Made by KuldipN, 12/10/2005)
+1) KuldipN
+	PREQ1028 - Plug-in compiler integration (DS 063)
+
+Version 0.01.607
+================
+(Made by Dusko, 15/09/2005)
+1) Dusko
+	DEF068226: CW IDE resource builds don't reflect MMP "START RESOURCE" ordering...   
+	DEF068229: CodeWarrior does not list .inl files in its file listing
+
+Version 0.01.606
+(Made by AndrewSmi, 07/09/2005)
+1) AndrewSmi
+	DEF062651 - RComp compiles erronously omitted structs
+	INC061459 - RCOMP is not warning about identifiers being used as strings
+
+Version 0.01.605
+================
+(Made by KuldipN, 06/09/2005)
+1) KuldipN
+	PREQ1028 - Plug-in compiler integration
+
+Version 0.01.604
+================
+(Made by JonC, 05/09/2005)
+1) JonC
+	MINOR_CHANGE - Addition of non-default EDG MAKMAKE backend.
+
+Version 0.01.603
+================
+(Made by Dusko, 19/08/2005)
+1) Dusko
+	DEF066617: OPTION in MMP files for Symbian 9 does not support GCCE.
+
+Version 0.01.602
+================
+(Made by Dusko, 12/08/2005)
+1) Dusko
+	DEF065225 ARMV5 IDE builds differ from their command line counterparts... 
+	DEF066431 Debugging button not available on some targets because bad default setting
+	DEF065954 CodeWarrior Complains about rss files not being included in the project 
+	DEF066129 Make defect has potential to causes failure in MCL 
+
+Version 0.01.601
+================
+(Made by MaximK, 05/08/2005)
+1) RichardCo
+	MINOR_CHANGE: Add optional dir section to metabld mbc file parsing, to aid Base builds.
+
+Version 0.01.600
+================
+(Made by Dusko, 28/07/2005)
+1) Dusko
+	DEF065839 [System Build] BLDMAKE fails to find ARM Version number 
+
+Version 0.01.599
+================
+(Made by JonC, 21/07/2005)
+1) JonC
+      PREQ1032 Hardware-dependent support for "VFP" floating point acceleration and accelerated maths functions
+
+Version 0.01.598
+================
+(Made by Dusko, 15/07/2005)
+1) Marcel
+	TOOLS03801: CodeWarrior Tool back Cannot build Winscw targets if ABIV2 is selected
+
+Version 0.01.597
+================
+(Made by Dusko, 13/07/2005)
+1) Dusko
+	DEF065018 bldmake calls armcc more often than needed 
+	DEF064902 SYM files are not copied into the release directory
+
+Version 0.01.596
+================
+(Made by Dusko, 01/07/2005)
+1) Dusko
+	DEF064173 secdump.exe blows up when you try and use it 
+
+Version 0.01.595
+================
+(Made by Dusko, 29/06/2005)
+1) Dusko
+	DEF064083 Cannot build ARMV5 Target in CodeWarrior starting with build 03635.01 
+	DEF063878 Recognition of C-style trigraphs is not enabled on WINSCW 
+
+Version 0.01.594
+================
+(Made by KuldipN, 22/06/2005)
+1) KuldipN
+	DEF060825  PR0104: Addition of GCCE support to CodeWarrior
+
+Version 0.01.593
+================
+(Made by KuldipN, 15/06/2005)
+1) KuldipN
+	DEF062125  PR104: Custom DLL generation is failing 
+
+Version 0.01.592
+================
+(Made by Dusko, 10/06/2005)
+1) Dusko
+	DEF060666 bldmake.pl checks armv5 compiler version for every "bldmake bldfiles"
+	DEF062217 ARMv4 build broken / --noscanlib should be re-enabled
+	DEF061950 fixupsym passed incorrect parameter to armlink?
+	DEF056540 CW IDE 9.1 builds shouldn't have ARM4 as a default build platform...
+
+Version 0.01.591
+================
+(Made by KuldipN, 27/05/2005)
+1) KuldipN
+      PREQ413   Changes to support the GCCE toolchain.
+      PREQ414   Enable Commercial Compatible Compilers
+      DEF061420 Elf2e32 Problems
+
+Version 0.01.590
+================
+(Made by Dusko, 20/05/2005)
+1) Dusko
+      DEF060878 Abld escapes space characters
+
+Version 0.01.589
+================
+(Made by ChetanaK, 20/05/2005)
+1) Chetana
+	PREQ834 - ARMV6 support in ABIV2 mode.
+
+Version 0.01.588
+================
+(Made by Dusko, 12/05/2005)
+1) Dusko
+         DEF059351 CHANGES TO CW DEFAULT PROJECT IMPORT TEMPALTES NEEDED TO PROGRESS SEMC FIX 
+
+Version 0.01.587
+================
+(Made by KuldipN, 11/05/2005)
+1) KuldipN
+         DEF060826 - PR0104 - PostLinker Memory Leaks
+
+Version 0.01.586
+================
+(Made by Dusko, 10/05/2005)
+1) BalaT
+	DEF061079 EXPORTUNFROZEN fails to create .lib files 
+
+Version 0.01.585
+================
+(Made by KuldipN, 3/05/2005)
+1) KuldipN
+	PREQ413 Changes to support the GCCE toolchain.
+
+Version 0.01.584
+================
+(Made by Dusko, 27/04/2005)
+1) Dusko
+	INC057221 (Tool chain) Log system messages
+    DEF059345 abld.pl incorrectly lists armv5 twice on 'abld help'
+    INC057946 Should be able to conditionally include code for a platform added via a BSF file 
+    INC058044 Symbian should define ECOM_PLUGIN_UDEB 
+
+
+Version 0.01.583
+================
+(Made by BalaT, 14/04/2005)
+1) BalaT
+	DEF058405 : Linker error when building components in CodeWarrior using RVCT 2.2
+
+Version 0.01.582
+================
+(Made by JonathanM, 24/03/2005)
+1) JonathanM
+	DEF058113: Problem when building within the CW IDE 3.0
+2) AndrewR
+	DEF058129: CW unnecessarily intercepts Win32 exceptions
+3) WilliamRo
+	DEF058094 : e32toolp setupprj.bat should always install the "secure" files. 
+
+Version 0.01.581
+================
+(Made by JonC, 18/03/2005)
+1) JonC
+	DEF057405 : ARMv5 build fails with a command line which is too long 
+
+Version 0.01.580
+================
+(Made by Bala, 18/03/2005)
+1) Bala
+	DEF057008 : RVCT2.2 leading edge build fails with errors in base/coreldr files.
+
+Version 0.01.579
+================
+(Made by Bala, 10/03/2005)
+1) Bala
+	DEF056929 : [System Build] ARMv5 errors in build 03514 (9.1)
+
+Version 0.01.578
+================
+(Made by Dusko 09/03/2005)
+1) Dusko
+	DEF054844 - The cwlink files has the command -noimplib attached to its parameter without a s.
+	DEF054512 - fixupsyms.pl on CEDAR does not support RVCT.
+2) Bala
+    DEF056440 - CodeWarrior ARMV5 linking fails 
+
+
+Version 0.01.577
+================
+(Made by Bala, 09/03/2005)
+1) Bala
+	PREQ1027 Submission of some enhancements for RVCT 2.2 Run-Time ABI Compliance to MCL
+
+Version 0.01.576
+================
+(Made by ..., xx/yy/2005)
+1) AndrewR
+	MINOR_CHANGE: Fix link32 command generation in ide_vc6.pm
+
+Version 0.01.575
+================
+(Made by DjordjeK, 21/02/2005)
+1) AndrewR
+	MINOR_CHANGE: Add __SUPPORT_CPP_EXCEPTIONS__ to MS-Dev workspaces
+
+Version 0.01.574
+================
+(Made by Bala, 22/02/2005)
+1) Bala
+	PREQ1027 Submission of RVCT 2.2 Run-Time ABI Compliance to MCL
+
+Version 0.01.573
+================
+(Made by Dusko, 21/02/2005)
+1) Dusko
+	DEF055405 GCCXML fails for projects with more than 150 source files
+
+Version 0.01.572
+================
+(Made by CarlosF, 15/02/2005)
+1) AndrewR
+	MINOR_CHANGE: Fix MS-Dev workspace generation
+
+Version 0.01.571
+================
+(Made by Dusko, 14/02/2005)
+1) Dusko
+	DEF054764 Cannot turn off compression on executables built on EKA2, armv5 platform.
+
+Version 0.01.570
+================
+(Made by ChetanaK, 09/02/2005)
+1) Chetana
+	PREQ834 and PREQ835 - ARMV6 support
+
+Version 0.01.569
+================
+(Made by Dusko, 24/01/2005)
+1) Dusko
+	DEF054203 ABLD LISTING is broken for ARMV5 
+
+Version 0.01.568
+================
+(Made by Dusko, 19/01/2005)
+1) Dusko
+	DEF051245 - Some Base components won't build for ARMV5 within the OEM3.0 IDE
+	DEF052081 - abld listing on ARMV5 doesn't include code addresses
+
+Version 0.01.567
+================
+(Made by Dusko, 18/01/2005)
+1) Dusko
+	DEF052948 - GCCXML Remarks caused by CM concurrency problems.
+
+Version 0.01.566
+================
+(Made by Dusko, 20/12/2004)
+1) Dusko
+	DEF052149 - ABLD output is incorrectly ordered when output is redirected to a file
+	DEF052588 - Problems building test code - case sensitive tools? 
+
+Version 0.01.565
+================
+(Made by Dusko, 20/12/2004)
+1) Dusko
+	1) INC052330 - Problems building AIF files 
+	2) DEF052182 - Local project header file inclusion in CW IDE projects doesn't always work...
+	3) DEF051361 - Remove CTPKG from trgtype.pm file
+
+Version 0.01.564
+================
+(Made by Dusko, 06/12/2004)
+1) Dusko
+	Reverting changes introduced by cln 468659.
+
+Version 0.01.563
+================
+(Made by Dusko, 03/12/2004)
+1) Dusko
+	1) DEF052428 - [System Build]: CBR (make.exe) errors in 03431 builds
+
+Version 0.01.562
+================
+(Made by Dusko, 02/12/2004)
+
+1) Dusko
+	1) DEF052149 - ABLD output is incorrectly ordered when output is redirected to a file
+	2) DEF052182 - Local project header file inclusion in CW IDE projects doesn't always work...
+	3) DEF051361 - Remove CTPKG from trgtype.pm file
+2) BalaT
+	1) DEF050507 - GNU Make Errors in Windows Application Event Log
+
+
+Version 0.01.561
+================
+(Made by JonathanM, 29/11/2004)
+
+1)	JonathanM
+	1)	Add 2 new capabilities SurroundingsDD and UserEnvironment.
+		Part of Change Request CDRS-65RK9F
+
+Version 0.01.560
+================
+(Made by Dusko, 23/11/2004)
+1) BalaT
+	1) DEF051128 - armv5 library build in parallel cause conflicts
+
+2) Dusko
+	1) DEF051237 - bldmake should not include "arm4" in the default list of platforms for 9..0
+	2) DEF051838 - BLDMAKE error if two :zip exports refer to the same directory
+	3) DEF051383 - ARMV5 command line builds can fail with a "via" file buffer over-run
+
+3) Jon 
+	1) DEF051947 - SystemPath is not set when building for CW_IDE:ARM4
+
+
+1) WilliamRo
+	1)	Removed the migration note for MMP files which don't have a VENDORID
+		This has served its purpose, but is now confusing 3rd parties who think
+		that they should apply for a vendor ID - in fact they shouldn't, because this
+		is a compromise mechanism for licensees to use instead of securing some of
+		their APIs. Only signed SIS files are allowed to include vendor IDs.
+		To check a ROM for vendor ID values, look for "Vendor ID:" in the ROMBUILD
+		log file.
+		
+Version 0.01.559
+================
+(Made by JonC, 17/11/2004)
+
+	Yankee,PR0102,MS3.6 (PREQ 417 partial) CW miscellaneous updates
+	MINOR_CHANGE Update to e32toolp CW IDE tests, version and release notes.
+
+Version 0.01.558
+================
+(Made by Dusko, 08/11/2004)
+1) BalaT
+	1) FIX for DEF051333 - [System Build] Makmake plugins don't pass SystemTargetType to makedef
+
+Version 0.01.557
+================
+(Made by Dusko, 05/11/2004)
+1) BalaT
+	1) DEF047267 - NTT - App-services\alarmserver TRepeatdefinitions udeb fails
+	2) DEF044048 - RVCT version of DEF2DLL camplains about DLLs not having exports 
+2) Dusko 	
+	1) DEF048405 - FPU flags cannot be over ridden from the MMP files, for VFP support.
+
+Version 0.01.556
+================
+(Made by Dusko, 25/10/2004)
+1) JonC
+	1) DEF050428 - __PRODUCT_INCLUDE__ set when it shouldn't be for Codewarrior ARMV5 builds
+	2) DEF050463 - CW IDE WINSCW builds can ignore "Symbian Linker | Additional Command Line:" 
+2) Dusko 	
+	1) DEF049913 - Buildtools dependency on link.exe for 8.1b/9.0 
+
+Version 0.01.555
+================
+(Made by xxx, yy/zz/2004)
+
+1) AndrewR
+	1)	DEF049659 - ARMV5 Compile of EXPORTUNFROZEN MMPs fails to create internal DEF file.
+
+
+Version 0.01.554
+================
+(Made by Dusko, 08/10/2004)
+1) JonC
+	1) DEF049860 - MAKMAKE doesn't fully support CW OEM3.0 
+
+2) BallaT
+	1) DEF049659 - ARMV5 Compile of EXPORTUNFROZEN MMPs fails to create internal DEF file.
+
+	
+Version 0.01.553
+================
+(Made by Dusko, 04/10/2004)
+1) Dusko 
+	Fixes for:
+	DEF049136 - GCCXML: Missing BMARM .def files reported during build.
+	DEF048405 - FPU flags cannot be over ridden from the MMP files, for VFP support.
+	
+2) JonC
+	DEF049354 ARMv5 falls over if linking too many objects  
+
+Version 0.01.552
+================
+(Made by JonC, 16/09/2004)
+1) Jon 
+	Contributes to implementation of PREQ417 (MS3.4 EABI Plugin)
+	e32toolp support for OEM3.0, including ARMV5 IDE builds. 
+
+
+================
+1) William
+	1)	Add support for "TARGET" in START RESOURCE ... END blocks
+		This supplies the basename for the resource file, in place
+		of the default which is the basename of the source file.
+	2)	Fix DEF048180 - engdoc should be excluded from tools_e32toolp
+	3)	Change setupprj.bat so that it verifies the tools_e32toolp.mrp file
+	4)	Change setupprj.bat so that it accepts "secure" as an optional
+		argument. If "secure" is specified, files of the form _secure_xxx
+		are exported as xxx, overriding the (insecure) xxx if it existed.
+
+Version 0.01.551
+================
+(Made by AndreBr, 27/08/2004)
+1) Andre 
+    DEF048272  GCCXML: Makefiles aren't building for 9.0 
+
+
+Version 0.01.550
+================
+(Made by MichaelP, 27/08/2004)
+
+1)	JonathanM
+	1)	MINOR CHANGE: Changed MMP.PL to not issue a warning for an incorrect second UID
+		when this UID is 0x01111111'. This allows test code to deliberately set an
+		incorrect UID.
+
+
+Version 0.01.549
+================
+(Made by KuldipN, 24/08/2004)
+
+1) Dusko & Andre
+	DEF047480  GCCXML: Reference EABI .def files in MMPXML. 
+	DEF047585  GCCXML: Include .def file in GXP Files 
+	DEF047903  GCCXML Platform Doesn't exist when pre-processing bld.inf
+	DEF047413 - Bldmake.pl produces and error that is not Scanlog compatibl
+	DEF047918  Gccxml abld -v -k target problem 
+	DEF047256  ABLD REALLYCLEAN only cleans up the epoc32\build tree 
+	DEF047939  GCCXML: Malformed MMPXML file in GXP 
+
+	MINOR_CHANGE
+	Update of the components used in the automated IDE tests.
+
+Version 0.01.548
+================
+(Made by KuldipN, 5/08/2004)
+	Rolled back to previous version of make to remove fix for
+	DEF046967  Build Errors: Java Build Problems  
+
+Version 0.01.547
+================
+(Made by KuldipN, 27/07/2004)
+
+1) Dusko 
+	1) DEF044958 - some build files are not erased by "abld clean" and "abld reallyclean"  
+	2) DEF046923 Makefile errors with GCCXML build target.
+	3) DEF046922 abld gccxml target ignores EPOCROOT. 
+2) Nahid
+	1) DEF046576 - mmp.pm doesn't produce scanlog compatabile output.
+	2) DEF045994 - Edll.lib in mmp causes CW Warning Messages
+3) Kuldip
+	1) INC046929 - Problem with emkdir.pl - directories not being made
+	2) DEF046967  Build Errors: Java Build Problems  
+
+Version 0.01.546
+================
+(Made by JonC, 12/07/2004)
+
+1) Jon 
+	1) Fix for DEF046739  BUILD ERRORS 8.1b - Build 03313.
+	   As a result, the following fixes are reverted:
+		1) Fix for DEF046732 - \epoc32\build MRP based location breaks test script assumptions.
+		2) Fix for DEF046538 - Build tools fail with very long pathnames.
+		3) Fix for DEF044958 - Some build files are not erased by "abld clean" and "abld reallyclean".
+		4) Fix for DEF046408 - Tools should warn if non-supported RVCT will be used in ARMV5 builds.
+
+Version 0.01.545
+================
+(Made by JonC, 09/07/2004)
+
+1) Jon 
+	1) Fix for DEF046732 - \epoc32\build MRP based location breaks test script assumptions.
+
+Version 0.01.544
+================
+(Made by Dusko, 06/07/2004)
+
+1) Dusko 
+	1) Fix for DEF046538 - Build tools fail with very long pathnames.
+	2) Fix for DEF044958 - Some build files are not erased by "abld clean" and "abld reallyclean".
+	3) Fix for DEF046408 - Tools should warn if non-supported RVCT will be used in ARMV5 builds.
+
+Version 0.01.543
+================
+(Made by Gus, 02/07/2004)
+
+1) Dusko 
+	1) Fix for CR...APOS-626C6K   -notest option added to bldmake.
+
+Version 0.01.542
+================
+(Made by Dusko, 23/06/2004)
+
+1) Dusko 
+	1) Fix for DEF044958 - some build files are not erased by "abld clean" and "abld reallyclean".
+2) Jon
+	1) Fix for "DEF045712 - Large projects build within Codewarrior IDE fail to link".
+	   (Comment update).
+
+
+Version 0.01.541
+================
+(Made by GusR, 22/06/2004)
+
+1) Gus 
+	1) 	PR0099 
+	Sierra MS3.4
+	PREQ687 - "Optimized module build (EABI)."
+	
+
+
+Version 0.01.540
+================
+(Made by JonC, 17/06/2004)
+
+1) Jon 
+	1) Fix for "DEF046143 - make.exe should report runtime exceptions in the Windows Event Log"
+
+
+Version 0.01.539
+================
+(Made by Dusko, 15/06/2004)
+
+1) Dusko 
+	1) Fix for DEF044666 - Bldmake unable to cope with makefiles with the same name.
+2) Gus 
+	1) Fix for DEF045445 - No Dependency in generated makefiles is not being used.
+	2) Fix for DEF045077 - Warnings generated by build tools when built using "bld deb".
+	3) Fix for DEF045255 - Using BLD DEB to build the tools creates errors when tools are used
+3) Naheed
+   1) Fix for DEF045349 - abld build fails to export data when built for one component
+	  - Ensure exports are done when building for one component.
+4) Jon 
+	1) Fix for "DEF046059 : emkdir.pl output should be more verbose"
+
+
+Version 0.01.538
+================
+(Made by Dusko, 28/05/2004)
+
+1) Dusko 
+	1) fix for DEF045551 - GCCXML: Malformed XML when targetpath specified in MMP.
+2) Jon
+	1) Fix for "DEF045035 - Codewarrior ignores #if macro statements in .mmp file.
+	2) Fix for "DEF045460 - RDL TARGETTYPEs require a .def file in EABI builds"
+
+Version 0.01.537
+================
+(Made by Dusko, 25/05/2004)
+
+1) Dusko 
+	1) Fix for DEF045503 - Warnings when building for gccxml platform
+	2) Fix for DEF045428 - GCCXML Compiler Options.
+
+
+Version 0.01.536
+================
+(Made by Dusko, 19/05/2004)
+
+1) Dusko 
+	1) Fix for DEF045168 - GCCXML: MMPXML should contain working directory from which GXP was built.
+
+
+Version 0.01.535
+================
+(Made by Dusko, 14/05/2004)
+
+1) Dusko 
+	1) DEF045015 - Build tools: gccxml should not be one of the default targets
+2) Gus
+	1) DEF045077 - Warnings generated by build tools when built using "bld deb"
+	2) INC044804 - Problem with TEMPMAKESISDECOY during localisation
+3) Jon
+	1) DEF044702 - Disable "stop on application launch" by default in Codewarrior settings panel.
+	2) DEF044703 - Linking projects within the Codewarrior IDE fails for large projects.
+	3) DEF045031 - Incorrect importing of mmp projects into Codewarrior with
+                   TARGETTYPE set as lib
+
+Version 0.01.534
+================
+(Made by GusR, 05/05/2004)
+
+1) GusR
+	Ease Of Deployment
+	  alt_pre=1 now uses scpp.exe for preprocessing
+	  local_build_path now defines where the object files are placed
+	  the gcc directory can now be on a local drive
+	  -savespace -keepgoing now sets nodependencies	
+	New File : preprocessor.pm
+	new File : scpp.exe
+
+Version 0.01.533
+================
+(Made by JonC, 29/04/2004)
+
+1) Jon
+	Fixes for:
+	1) DEF044751 Tools_e32toolp MRP file not specifying new .pm file.
+	2) DEF044147 ARMV5 builds ignore AIF generation as part of the RESOURCE step.
+	3) DEF044230 ARMv5/UDEB should build with -O0
+	4) DEF044048 RVCT version of DEF2DLL camplains about DLLs not having exports 
+
+Version 0.01.532
+================
+(Made by Dusko, 26/04/2004)
+
+1) Dusko 
+	Adding support for Backwards Compatibility Analysis Tool
+	Files changed: cl_generic.pm, e32plat.pm, bldmake.pl
+	New file: cl_gccxml.pl
+
+1) Dusko
+	1) DEF043895 - cl_codewarrior.pm not able to handle long commandlines.
+
+Version 0.01.530
+================
+(Made by Dusko, 06/04/2004)
+
+1) Jon
+	1) Fix for "DEF044083 Incorrect list of warnings suppressed in cl_arm.pm"
+
+
+Version 0.01.529
+================
+(Made by Dusko, 02/04/2004)
+
+1) Dusko
+	1) Fix for DEF043637 - CSYSTEM macro hard coded to WINS.
+	2) Fix for DEF043632 - Cedar tools should not hardwire EKA2 or DO_NOT_USE_THIS_MACRO.
+2) Jon
+	1) Fix for DEF043608 - ARMv5 build tools to "ignore" more warnings.
+	2) Fix for DEF043938 - Projects imported into CW for ARM4 builds do not link.
+	3) Fix for DEF043630 - EABI builds should define "EABI" 
+	4) Fix for DEF043607 - ARMv5 UDEB builds do NOT produce debug information 
+
+
+Version 2.00.528
+===========================
+(Made by JonathanM, 19/03/2004)
+
+1.	JonathanM
+	1.	Implemented the requirements:
+		REQ2632 - Configurability of the enforcement of capabilities
+		REQ2633 - Security violation diagnostic
+		REQ3142 - Associate Platform Security information with an executable.
+		See /cedar/generic/base/documentation/Base_How_To_Configure_Platform_Security_Settings.doc
+
+Version 0.01.527
+================
+(Made by Dusko, 18/03/2004)
+
+1) Dusko
+	1) Fix for DEF042453 - Mistakes in API Classification.
+	2) Fix for DEF042408 - EVALID can't deal with more than 3 "-x" arguments
+2) Jens
+	1) Fix for DEF042878 - verbose output in "abld -v test romfile"
+                           appears in generated oby file
+3) Jon
+	1) Fix for DEF043598 - CAPABILITY in OEM2.0 .pref files prevents IDE build...
+
+Patch for Version 2.00.526
+===========================
+1)	JonathanM
+	1)	Fix for defect DEF043311 - In the CodeWarrior IDE, UID.CPP files are incorrectly generated
+
+Version 2.00.526
+===========================
+(Made by JonathanM, 26/02/2004)
+
+1)	JonathanM
+	1)	Modifications made for implementation of
+		Change Request JDOD-5VUJ7F - Change in executable format of EKA2 binaries.
+	2)	Made MAKMAKE use the new Platform Security capability names.
+	3)	Tools now use the sytax "cap1+cap2+cap3" to specify a neamed set of capabilities
+		(Rather than specifying a single hexadecimal number.)
+
+Version 0.01.525
+================
+(Made by AndrewJ, 13/02/2004)
+
+1)ChrisM
+	1) Fix for DEF041533 - metabld should not insist on paths starting from the root of the drive
+	   added a -r option to indicate the directory tree should be from the current location and not the root.
+
+Version 0.01.524
+================
+(Made by Dusko, 12/02/2004)
+
+1) Dusko
+	1) Fix for DEF041403  Incorrect makefiles is generated for CWTOOLS  
+
+Version 0.01.523
+================
+(Made by Dusko, 30/01/2004)
+
+1) Dusko
+	1) Fix for DEF041857 - MAKMAKE should not complain about MACRO statement with no arguments
+2) Jon
+	1) Fix for DEF041769 - Minor Perl problem in IDE_VC6.PM
+	2) Fix for DEF041802 - Auto Target Libraries should be switched on by default in Code Warrior.
+	3) Fix for DEF041697 - CW command line and IDE builds generate redundant "browse" files
+3) Kuldip
+	1) Fix for DEF41756 ROFSBUILD checks adequate image size incorrectly.
+	2) Fix for DEF41699 Preserving of intermediate files to enable building of ROM from obey file generated by buildrom.pl 
+
+Version 0.01.522
+================
+(Made by Dusko, 22/01/2004)
+
+1) Dusko
+	1) Fix for DEF041591 - BLDMAKE should not complain about "-ARMI" in PRJ_PLATFORMS
+2)  Jon
+	1) Fix for DEF041319 - Remove display of compiler generated commands by default from CW 
+	2) Fix for DEF041432 - makmake.pl uses undefined variable @variant_macros 
+
+Version 0.01.521
+================
+(Made by Dusko, 05/01/2004)
+
+1)  Dusko
+	DEF040718  cedar\generic\base\wins fails to export correctly if EPOCROOT is not \ 
+2)  Kuldip
+	Fix for INC040504  "makedef.pl does not recognise exported data in codewarrior DLLs"
+
+Version 0.01.520
+================
+(Made by JonC, 18/12/2003)
+
+1)  JonC
+	Fix for DEF041019 - CodeWarrior OEM2.8 IDE project settings are incorrect.
+	Fix for DEF041136 - Error found in "tools_e32toolp.mrp"... 
+
+Version 0.01.519
+================
+(Made by Dusko, 17/12/2003)
+
+1)	Kuldip
+	REQ1648 A3.2 Improved Command Line Build Tools   Strict BUILDROM
+
+1)	Jon
+	REQ2212 A.3.4 Code Warrior Tooling, Support for Metrowerks  
+    CodeWarrior for Symbian OS 2.8., Contributes to implementation of 
+    TOOLS/MAKMAKE/cw.17,
+
+1)	Darran
+	Sirocco, CR PHAR-5QYMSN
+    Support nested inclusion of (preprocessor) HR  
+    files in varinat.cfg
+
+1)  Andy
+	low level support for REQ1730, REQ2206 and REQ2140.3.1.
+	support for 'downgrading' cpu specific components when they're missing during 
+	ROMBUILD I.E. ARMV5O1 -> ARMV5. This is similar to the kind of downgrading that
+	takes place  for ARMI, ARM4 and THUMB builds.
+
+Version 0.01.518
+================
+(Made by Dusko, 24/11/2003)
+
+1)	Dusko
+	1)	DEF037657  Cedar tools dont support  COMPRESSTARGET and NOCOMPRESSTARGET MMP keywords
+		Files changed mmp.pm,cl_gcc.pm
+
+	2)	DEF037095  E32Variant can only be used by tools in \epoc32\tools 
+		File changed e32variant.pm
+
+Version 0.01.517
+================
+(Made by Dusko, 10/10/2003)
+1) Kuldip
+	1)	DEF036127 FIXUPSYM requires an EPOCROOT
+		Fixed in \tools\e32toolp\makesym\fixupsym.pl
+
+2) Dusko 
+	1)	DEF038828  Can't build projects that have AIF c12,8 in mmp file
+		Files changed mmp.pm, makmake.pl, cl_generic.pm and ide_cw.pm 
+
+3)	Dennis
+	1)	Fix problem with cl_arm.pm - when building UDFP, UDFP.LIB was added
+		to the list of libraries which caused infinite loops.
+
+Version 0.01.516
+================
+(Made by Dusko, 02/10/2003)
+1) Kuldip
+	1)	DEF038583 - BLDMAKE Error in 03114_Symbian_OS_v8.0b
+		Fixed in \tools\e32toolp\genutil\pathutil.pm
+2) Johannes
+	2)	Fix for DEF037095 - E32variant can only be used by tools in \epoc32\tools
+
+
+Version 0.01.515
+================
+
+(Made by Dennis, 24/09/2003)
+
+1. Dennis
+	1.	Implemented CR ATHE-5PZEAU (Add Version Numbers to Symbian OS Executables).
+
+2. JonathanM
+	1.	Created new .MMP Target types, "NOTIFIER2" and "TEXTNOTIFIER2"
+		This has been added for Notifier plugins which use the new Version 2
+		Client/Server APIs.
+
+
+Version 0.01.512
+================
+(Made by DuskoJ, 22/08/2003)
+
+1) Morgan
+	1)	Added ROFSBUILD extension support to BUILDROM.PL
+		BUILDROM automatically generates the appropriate obey commands for non-XIP
+		ROFS obey files.
+	2)	Improved \tools\e32tools\rombuild\addextension.pl to understand ROFS images
+		and extensions.  addextension.pl can be used to join xip and non-xip images.
+
+2) Dusko 
+	1)	DEF036665 - MAKMAKE should put EGCC.LIB at end of LIB list
+	2) WINUTL.PM changes - support for building tools with CodeWarrior
+
+
+3) Andy 1)	REQ2178 - GENSHIMSRC Generate source for a shim DLL and its associated deffile from a supplied deffile
+
+
+Version 0.01.511
+================
+(Made by DuskoJ, 25/07/2003)
+
+1) Morgan
+	1)	Integrated "fix" for DEF032836 - Rogue Multimedia warning in typhoon build 02194a
+	MAKDEPS.PM is now more defensive when adding to the bad system dependency list.
+2) Jon
+	1)	Fix for defect DEF035996 - Cpp.exe Permission denied failure.
+
+3. Dusko
+	1. fixed DEF036388 Cedar version of maksym.pl is out of date
+
+
+Version 0.01.510
+================
+(Made by DuskoJ, 10/07/2003)
+
+ 1) DuskoJ
+	1) Adding support for building tools with CodeWarrior. 
+	   files changed: 1. bldmake.pl
+					  2. e32plat.pm
+	   new files:	  1. cl_tools.pm  
+	
+  	2) Changes to epocaif to generate .aif files in new format. Aiftool.exe is no
+           longer needed.
+
+  	3) Changes to cl_generic so that when abdl -what command is executed both,
+           XIP and NON XIP version of aif files which are generated with epocaif are 
+  	   listed.
+
+ 2) JohanesK
+	1) DEF036206 - variant.cfg information not used when generating MAKMAKE dependencies
+
+
+Version 0.01.509
+================
+(Made by DuskoJ 07/07/2003)
+
+	1) Fixed DEF035953  Build errors for "cedar\generic\tools\redistribution" 
+	
+
+Version 0.01.508
+================
+(Made by JonC, 26/06/2003)
+
+      1) DEF035949 - EKA2 define is not passed to compiler in Cedar CW IDE builds.
+      2) Update of mmpscan.pl and mmp_testlist.txt to reflect changed Cedar TARGETTYPEs and components.
+      3) Update to build variant documentation.
+
+
+Version 0.01.507
+================
+(Made by JohannesK, 24/06/2003)
+
+      1) Fixed DEF035897 - cedar roms failed to build.
+
+Version 0.01.506
+================
+(Made by JohannesK, 23/06/2003)
+      1) Enabling product variant builds (ported changes from Typhoon).
+
+      2) Fixed DEF035683 - CW project creation is broken in Cedar.
+
+      3) Fixed DEF035802 - Bad case-sensivity in E32variant.pm.
+
+      
+Version 0.01.505
+================
+(Made by JonathanM, 20/05/2003)
+
+1)	JonathanM
+	1)	Modified Cedar tools to define macros 'EKA2' and 'DO_NOT_USE_THIS_MACRO' when
+		processing BLD.INF, MMP files and compiling source.
+	2)	Fixed some missing EPOCROOT support. (Include path for CPP and exported zips.)
+	3)	Modified Cedar GENBUILD to work with master codeline directory structure.
+
+2)	Nicolas
+	CHANGES FOR MASTER CODELINE:
+	1)	Brought back to life AIF support which was removed by submission 229467 to the
+		Jet Stream mainline.  This involved changing various perl scripts and upgrading 
+		winc.zip to a recent Typhoon build (2175) which include versions of bafl.dll and
+		aiftool.exe which support the new resource format.
+	2)	Brought back to life CTL target needed by some techview apps.
+
+
+Version 0.01.504
+================
+(Made by William, 18/03/2003)
+
+1)	Dusko
+	1)	Updated EVALID to use ELF dump to compare ELF files.
+
+2)	William
+	1)	Fixed defect DEF020022 - Minutes & seconds reversed in scanlog.pl output
+	2)	Added SCANLOG.TXT to document of the log file format and patterns used by scanlog.pl
+	3)	Updated EVALID.TXT to add information about "ELF file" comparisons.
+	4)	Updated cl_codewarrior.pm & ide_cw.pm to support CodeWarrior for Symbian OS, OEM v2.0
+
+
+Version 0.01.503
+================
+(Made by William, 10/02/2003)
+
+1) Dusko
+	
+	1)	makmake.pl - Fixed a defect in makmake (added missing $CurSource{BaseTrg} to SourceStruct)
+	2)	Redefined SrcList function (functionality has not changed)
+	3)	Deleted Uids funciton 
+
+	4)	mmp.pm - Deleted inappropriate comments
+	5)	Deleted UIDs function 
+
+	6)	mmp_notes.txt - Some changes to structure description.
+	
+	7)	cl_generic.pl - Uids info extracted from existing data in ResourceStruct 
+	   	and unneeded call to Uids function deleted.
+        
+	8)	bldmake.pl Changes which enable bldmake to understand additional syntax in PRJ_EXPORTS
+	   	part of bld.inf. More complex makefiles are generated in the  epoc32\build tree.
+	   	Generation of the new rules is put into a separate subroutine - CreatePlatExports
+	   	PRJ_EXPORTS now accepts exports to paths including a drive letter: the file(s)
+	   	will be exported to the corresponding subdirectory of epoc32\data, and also exported
+	   	at the RESOURCE step in emulator builds to the corresponding emulated directory.
+	   	For example:  myfile.txt z:\system\data\myfile.txt
+	   	causes exports to epoc32\data\z\system\data\myfile.txt, and also to
+	   	epoc32\release\XXX\{udeb,urel}\z\system\data for each emulator target XXX.
+
+
+1) William
+	1)	Fix defect DEF000968 - MAKMAKE grants capabilities which don't yet exist
+	2)	Add support for "CAPABILITY ALL -ROOT", i.e. for subtracting capabilities for a set
+	3)	Change the default CAPABILITY setting to ALL+0x80000000 so that it can still be clearly
+		identified in executables.
+	4)	Update CodeWarrior IDE support to use the Symbian V8 Linker plugin, and to reject
+		attempts to build IDE projects for "CodeWarrior for Symbian OS, Pro1".
+	5)	Add e32toolp\test directory for regression tests.
+	6)	Add mmpscan.pl which scans MMP files for significant features, and mmp_testlist.txt which
+		covers all of the MAKMAKE features in less than 40 of the current 2432 MMP files.
+	7)	Updates to mmpscan.pl to work in more cases.
+	8)	Additional test functionality cw_ide_test.pl which builds MMP files using both the
+		CodeWarrior IDE and directly via MAKMAKE and commandline builds, comparing the results.
+	9)	Change epocrc.pl to avoid explicitly specifying the default uids argument -{0,*} if
+		neither -uid2 nor -uid3 is specified. This allows UID2 and UID3 keywords in the source
+		files to take effect.
+	10)	Change genbuild.pl to process all specified source files, concatenating them
+		and generating scripts named after the first file.
+	11)	Add "<option arm_build XXX>" to genbuild.pl, so that we can specify additional
+		builds such as <option arm_build armv5> for RVCT builds.
+	12)	Update scanlog to detect RVCT compiler warnings and errors, and added "use strict".
+	13)	Arrange for scanlog.pl to ignore sections which refer to armv* or *edg, so that mainline
+		builds can include early RVCT attempts without swamping the error and warning counts. This
+		skipping is disabled by specifying the "-v" flag to scanlog.pl.
+	14)	Fix Perl warning in evalid.pl
+	15)	Updates to test code (cw_ide_test.pl, mmpscan.pl, mmp_testlist.txt).
+	16)	Change cl_codewarrior.pm to use ".o" rather than ".obj" for compatibility with the IDE
+		builds, and to compile xxx.uid.cpp to uid.o for the same reason: the IDE and command line
+		builds will then produce identical .map files
+	17)	Change ide_cw.pm to avoid specifying a base address for EXEs, to match the command line build.
+	18)	Change ide_cw.pm to specify -D__XXX_ for ASSPs (i.e. when platform != real platform).
+	19)	Change MAKMAKE to reject CodeWarrior for Symbian OS v1.0 as unable to support Jet Stream builds.
+	20)	Remove obsolete target types, post UIKON and ECOM data caging releases.
+		This removes CTL, CTPKG, FEP, MDL, OPX, RDL and WLOG.
+	21)	Remove the cw_ide.pm workaround for ignoring MBW and mapping MCL->MBM. There
+		are no remaining B&W files in Jet Stream, and all of the Color files are now correctly
+		named. The instcol script is no longer needed but still exists to avoid disrupting build
+		scripts: it now just says "instcol is no longer used".
+	22)	Remove support for AIF files, which no longer exist.
+	23)	Fix defect DEF015570 "Irritating and useless X86 builds in default abld platforms list".
+		To include X86 in "ALL" platforms, define environment variable ABLD_ALL_INCLUDES_X86.
+	24)	Disallow .cia files in WINSCW builds.
+	25)	Add support for SRCDBG in ide_cw.pm
+	26)	Change the generated target names in CW projects to be just "ABI BLD" without the MMP name.
+	27)	Fix defect preventing BASEADDRESS being specified for IDE builds of EXEXP targets.
+	28)	Handle Win32Library list correctly in CW projects.
+	29)	Change cw_ide_test.pl so that it restores all of the original files after testing.
+	30)	Update mmp_testlist.txt to a workable set of MMP files, marked "not MISA" and "not WINSCW"
+		if they can't be built in both ABIs.
+	31)	Change scanlog.pl to tolerate malformed log files, which would have helped to detect the 
+		true cause of things like DEF016577 "Scanlog does not detect errors in JRCK log". If the
+		phase doesn't finish properly, no timing will be displayed.
+	32)	Added ===+ timing information to genbuild.pl, for closer analysis of build times.
+	33)	Integrate the "list of color depth" changes for CR MFRN-5HTH2G "Make it possible to have 
+		different color depth of icons and masks in the aif file". We don't have AIF files any more,
+		but this applies to bitmaps as well.
+	34)	Propagate the 7.0s ecopyfile.pl change to support "Build from Clean" process.
+	35)	Remove all record of the WINC platform
+	36)	Remove the .assp files, now that everything is built into a single directory.
+	
+	
+Version 0.01.502
+================
+(Made by William, 20/09/2002)
+
+1) Dusko
+	1)	Fix defect ROS-59ZDWH "OPTIONS keyword doesn't respect upper and lower case"
+		Both the OPTIONS and MACRO keywords now respect the case of their arguments, so it's possible
+		to specify mixed-case compiler flags or mixed case #defines.
+		
+2) William
+	1)	Implement automatic selection of CodeWarrior for Symbian OS v2.0 ("Ganymede") based on
+		examination of environment variables. If the MWSym2Libraries variable exists and refers
+		to directories which all exist, the Ganymede compiler will be used instead of the older
+		Callisto compiler.
+	2) 	Implemented various Metrowerks suggested improvements to the CodeWarrior project template
+	3)	Added more support for the "Symbian Installation" preference panel, and an association for
+		.pkg files.
+	4)	Add EXPORTUNFROZEN to the .pref file for CW IDE projects, as it's supported in Ganymede.
+	5)	Add WINSCW support for WIN32_LIBRARIES which are not in the system search path, for use
+		by the Win32 Ethernet Driver.
+	6)	Fix defect ROS-5CAH9W "EVALID can't handle directory names containing spaces"
+	7) 	Change ide_cw.pm and CW_project_template.xml to assume the new Symbian Resources compiler
+		which handles RSC, MBM and AIF files via a .resources file.
+	8)	Change MAKMAKE so that the cw_ide:plat1+plat2+plat3 commandline arg won't always do the
+		WINSCW target first: it now uses the cw_ide plat in the necessary places to get the .xml
+		file generated, but uses plat1 everywhere else.
+	9)	Change abld.pl to allow WINSCW in the "ALL" list if either v1.0 or v2.0 of CodeWarrior for
+		Symbian OS is installed.
+	10)	Change cl_codewarrior.pm so that WINSCW makefiles will use v2.0 of CodeWarrior for Symbian
+		OS if it's installed, or fallback to v1.0. Make the necessary minor adjustments to the
+		generated Makefiles to compensate for differences in v1.0 and v2.0 tools.
+	11)	Fix defect ROS-5D6FRK "Makmake code to select between CodeWarrior versions is incorrect"
+	12)	Fix defect ROS-5CMNVG "EPOCROOT check gets in the way of CodeWarrior mmp file import"
+	
+ 
+Version 0.01.501
+================
+(Made by ?, --/--/2002)
+
+1)	William
+	1)	Changed genbuild.pl to generate scripts with relative paths, instead of assuming 
+		that the paths in the .txt files were always relative to the root.
+	2)	Removed references to WINC and ARM3 from genbuild.pl
+	3)	Changed BLDMAKE.PL to remove ARMI and THUMB from the list of default platforms
+	4)	Disabled the LNK4089 warning caused by /OPT:REF in MSVC builds.
+	5)	Downgrade the use of "-XXX" which isn't in the default list to a BLDMAKE warning if 
+		-k specified: seems reasonable since the net effect is not to build for platform XXX.
+	6)	More work on defect ROS-595LHD "abld -what problems with very long pathnames" - the non-generic
+		RELEASEABLES are now handled in the same way as the GENERIC_RELEASEABLES, to avoid exceeding
+		line length limits.
+	7)	Fix defect PAL-59YHRT "Build errors not being reported in summary files" - change scanlog.pl to
+		report missing components as "Things not built".
+	8)	Changed the epocrc.pl, epocmbm.pl and epocaif.pl wrapper scripts in anticipation of the
+		new Symbian Resource compiler plugin for CodeWarrior.
+		epocrc.pl - handle "-I-" and UNC paths correctly
+		epocaif.pl - handle "-I-" and UNC paths, use "-o" when preprocessing .rss file, report bmconv failure
+		epocmbm.pl - remove EPOCROOT check to subroutine, report bmconv failure
+	9)	Improve	the Path_RltToWork function to generate more concise relative paths. This impacts
+		any binary which has __FILE__ as read-only data, e.g. via the ASSERT() macro in 
+		epoc32\include\mda\common\base.inl
+	10)	Fix defect CHN-58WEZ3 "EPOCRC.PL fails in VC6 IDE builds with long paths" by supplying
+		an absolute path to epocrc.pl, and having epocrc.pl add the current drive letter instead
+		of generating a relative path. Similar code in epocaif.pl was altered as well.
+	11)	Update EVALID to handle "Preprocessed text" ignoring the lines which indicate the #include
+		structure (and which include source filenames).
+	12)	Update EVALID to ignore the "unique _head & _iname" symbols from import libraries when they
+		appear in gcc MAP files, using the same pattern as for ARM object files.
+	13)	Introduce MAKMAKE "CAPABILITY" keyword which takes a space-separated list of capability names
+		and computes the hex value for the combined list. This is passed to PETRAN in cl_gcc or cl_x86.
+	14)	Change winutl.pm to use __EMULATOR_IMAGE_HEADER() in the xxx.uid.cpp file, adding the extra
+		extra process priority and capability information.
+	15)	Abandon the notion of CompatibleABIs, chiefly by stopping cl_gcc.pm from generating the extra
+		libraries.
+	16)	Change scanlog.pl to pick up more warnings, and to print the warning lines in a "Warning details"
+		section at the end.
+
+2)	Dennis
+	1)	Applied William's suggested changes to enable polymorphic DLLs to have additional exports.
+		Exports 1 and 2 in the DEF file are required to match the polymorphic exports.
+	2)	Made it possible to export a ZIP archive from a component. The following line
+
+		:zip archive.zip basedir
+
+		in the PRJ_EXPORTS or PRJ_TESTEXPORTS section of an MMP file will cause 'archive.zip' to be
+		unzipped into the 'basedir' directory at the export stage of the build.
+		CLEANEXPORT will delete each unzipped file and WHAT will list each unzipped file.
+
+3)	ChrisM
+	1)	Changed memtrace.pl to work with EKA2 memtrace tracing.  MT:P xxxx trace output has
+		the length of the tick in microseconds, so memtrace.pl uses this to work out its
+		time stamp if it is present, otherwise it defaults to EKA1 behaviour.
+
+4)	Andy Sizer
+	1)	Added support for .CIA assembler files.
+		First attempt at support for new RVCT compiler.
+	
+Version 0.01.500
+================
+(Made by AndrewT, 23/05/2002)
+
+EKA2 changes
+
+1)	Andrew
+	1)	Def file processing allows a by-name export "_E32Dll" or "_E32Startup" to appear
+		in the def file. This is elminated from the no-name freeze process and
+		re-introduced to the end of the build def file. This supports the v7 entrypoint
+		scheme, and does not appear in frozen def files.
+	2)	Added target type EXEXP for v7 support of EXEs with exports. This replaces 
+		EXEDLL, which is no longer supported. Removed support for EPOCEXE, these
+		targets should just become EXE.
+	3)	Changed target type KDLL to use a new EKLL.LIB and to not be ASSP specific. These
+		DLLs are all used by the kernel, but do not link to the kernel, and are only built
+		for ARM4 or WINS
+	4)	Changed WINS use of entry-points, DLLs have no Win32 entrypoint but include the
+		_E32Dll symbol to ensure that this is exported by name (see 1). EXEs have a Win32
+		entrypoint to allow auto-boot of the emulator before running the EPOC program, and
+		force the inclusion of the _E32Startup symbol to ensure that this is exported by
+		name.
+
+2)	Nicolas
+	1)	Removed spurious code in cl_x86.pm which caused x86
+		releasables to be copied into \epoc32\tools.
+	2)	Merged in EKA1 WINSCW support and adapted it to EKA2
+		(EXEXP, emulated E32 entry points, EPOCHEAPSIZE, ...).
+	3)	Added new MMP keyword WIN32_HEADERS to instruct makmake
+		to search the standard include directories.
+
+---------------------------
+
+Pre-EKA2 changes
+
+1)	William
+	1)	Revise compare_summary.pl to match scanlog.pl, which stops compare_summary.pl from hanging
+	2)	Change MAKMAKE to use "cpp -undef" when generating source file dependency information.
+	3)	Change BLDMAKE to generate an abld.bat file with the BldInfPath quoted in case it contains 
+		spaces: there's a lot more work still to do, but this is a start...
+	4) 	Remove any leading backslash on filenames in SOURCE statements, since they are by definition
+		interpreted as paths relative to the prevailing SOURCEPATH. This affects FREETYPE.MMP, which
+		was otherwise generating names like graphics\freetype\group\..\\freetype2
+	5)	Fix defect ROS-58CQTC "CW IDE can't import strangely formatted MMP file" by making ide_cw.pm
+		form its own list of source directories from the (SOURCEPATH, SOURCE) pairs.
+	6)	Fix defect BAD-57QNL7 "Charconv does not compile from CodeWarrior GUI" by making ide_cw.pm
+		order the access paths explicitly for userinclude and systeminclude.
+	7)	Change GENBUILD.PL to generate additional batch files for "abld clean" and "abld reallyclean".
+	8)	Implement MAKMAKE support for IDE targets which support multiple platforms: so far this
+		consists of supporting "makmake mmpname someide:plat1+plat2+plat3" syntax and providing the
+		list (plat1, plat2, plat3) to any backend which cares to ask for it.
+	9)	Implement various changes to the generation of CodeWarrior IDE projects: 
+		* Pick up the list of platforms from the "cw_ide:plat1+plat2+plat3" commandline arg (if any)
+		* Enable the "System Log" window for WINSCW UDEB targets
+		* Default "Display generated commands in msg window" to false for all targets
+		* Add the "SymbianImportLibraryPath" setting for use in Ganymede
+		* Allow multiple resource files if they all use the same TARGETPATH
+	10)	Use mwwinrc to compile Win32 resource files in WINSCW builds
+	11)	Fix defect ROS-58VCQY "MAKMAKE fails if + included in pathname" by using quotemeta() to do 
+		the full job on $S_SysDecoyPath
+	12)	Fix defect GAA-57WNNR "Error in bldmake.pl -what option for cw_ide" by reporting the .xml and
+		.pref files correctly. Note however that BLDMAKE can't always get the .pref or .uid.cpp filenames
+		right because they are generated (or not) using information inside the MMP file.
+	13)	Fix defect ROS-595LHD "abld -what problems with very long pathnames" by counting the actual 
+		length of the GENERIC_RELEASEABLESn lines and breaking before it goes over 1900 characters.
+	14) 	Various EVALID improvements, including support for ignoring comments in SGML files
+	15)	Added evalid.txt file for export into epoc32\engdoc\e32toolp
+
+2)	Uma
+	1)	Fix defect ANN-595CNZ "using abld build creates a epoc32 folder in the root of your drive".
+	
+Version 0.01.304
+================
+(Made by William, 22/02/2002)
+
+1)	William
+	1)	Introduce "START RESOURCE ... END" syntax to allow resources to be built into a directory
+		which is neither \System\Data nor the TARGETPATH of the main executable, and to allow
+		resources to be built without an associated header file. Both RESOURCE and SYSTEMRESOURCE
+		are expressed as shorthands for the new syntax, and the internal handling of resources
+		has been unified. As a side-effect, this provides the proper fix for defect JOE-52ZJP3 
+		"Conditional #includes in resource files".
+	2)	Include WINS and WINSCW into the "abld all" platforms according to the presence in the 
+		environment of associated environment variables. If you have the CodeWarrior compiler installed
+		you will have a CWFolder environment variable: ABLD.PL will notice this and include WINSCW
+		in the "ALL" target. WINS is included if the MSDevDir variable is present.
+	3)	Make SETUPPRJ.BAT generate a makefile which is resilient against filenames which contain spaces,
+		and which will keep going even if an individual file can't be installed.
+	4)	Fix defect ROS-573K9P "MMP keyword MACRO keyword not supported in CW IDE projects".
+	5)	Fix defect ROS-57CFVC "CW IDE projects can no longer find RSS files".
+	6)	Fix defect ROS-57CFYY "CW IDE projects fail if RSS file is in unusual place".
+	7)	Clone the targets from the XML template project rather than altering them directly, which
+		is a necessary precursor to supporting ASSP targets, where the ARM4 targets may need to be
+		used more than once.
+	8)	Remove backwards-compatibility support in CL_GCC.PM which copied resources, bitmaps and AIF files
+		from the epoc32\data\z tree into the $(PLATFORM)\$(CFG) directories.
+	9)	Fixed defect ROS-57PJYW "MSVC-based builds are using warning level /W1 by default" by reinstating
+		the /W4 warning level for MSVC-based builds, which was accidentally lost in change 109090.
+		The change also deals with the CL.EXE objection to multiple /Wn arguments on the same commandline, 
+		so that OPTION MSVC /W0 won't itself cause "Command line warning D4025".
+	10)	Annotate all of the CL.EXE command line options used in cl_win.pm and ide_vc6.pm, and move the
+		/GF option into the main definitions rather than repeating it for every source file.
+		
+
+Version 0.01.303
+================
+(Made by William, 06/02/2002)
+
+1)	Uma
+	1)	Changed epocrc.pl and lockit_info.pm to support rls_string (CR JCLE-549DVM).
+
+2)	William
+	1)	Fix defect JOE-52ZJP3 "Conditional #includes in resource files".
+		Use the same "combine the dependency list" quick fix strategy as for 6.1, since the 
+		"multiple languages in MMP files" approach to localisation is on the way out anyway.
+	2)	Make EVALID insensitive to the _head* and __*_iname symbols in the import libraries 
+		generated by DLLTOOL. 
+	3)	Fix defect ROS-55AN6D "fixupsym.pl fails immediately"
+	4)	Update MAKSYM.PL use FindBin::Bin rather than scanning the PATH variable
+	5)	Update SCANLOG.PL to detect recursive make failures (i.e. make[n]: *** rather than just make: ***)
+	6)	Remove the old support for warning waivers, and make the printing of "MISSING:" files 
+		independent of the number of fatal errors
+	7)	Fix defect ROS-55BM2X "ar failure with very large components" by splitting the list of
+		objects into 150-file groups, to avoid the 32K line length limit on Win32 process arguments.
+	8)	Add a "Build All" target to generated CodeWarrior projects, and cut out some junk from the
+		project template.
+	9)	Fix ROS-56QP3D "Problem with EPOCSTACKSIZE when generating CW IDE Projects"
+	10) Revise EPOCRC.PL for use from CodeWarrior IDE RCOMP plugin: drive CPP.EXE differently, and
+		remove the EPOCROOT check. Only the LOCKIT processing needs EPOCROOT, and lockit_info.pm does
+		it's own check when necessary.
+	11) Fix deferred defect HET-4X9G2P "commandline help for epocrc.pl is missleading"
+	12)	Fix defect ROS-55JM2S "Emulator EXEs can come with unexpected .EXP and .LIB files" 
+		for WINSCW by explicitly disabling the exports and import library when linking an EXE.
+	13)	Assume the "CodeWarrior for Symbian OS Professional Edition V1.0" version of MWLD.EXE,
+		which removes the dependence on the Developer Studio LIB.EXE tool for WINSCW builds.
+	14)	Use the CodeWarrior "MWCWinx86Includes" environment variable rather that the Developer Studio
+		"INCLUDE" environment variable when generating WINSCW makefiles.
+	15)	Catch an additional form of MWLD.EXE warning in scanlog.pl
+
+Version 0.01.302
+================
+(Made by William, 03/12/2001)
+
+1)	William
+	1)	Reinstate "use strict;" in MAKMAKE.PL, and fix errors uncovered
+	2)	Fix parsing of "OPTION" to handle the rest of the line better, and
+		to concatenate multiple OPTION statements for the same key.
+	3)	Fix use of uninitialised variable in MAKSYM.PL
+	4)	Change ABLD.PL and MAKEMAKE.PL to specify the -r option to make, so that MAKE 
+		doesn't try built-in inference rules to remake the makefiles or the targets: the
+		BLDMAKE makefiles are very simple and don't need any of that stuff, and the MAKMAKE
+		makefiles contain explicit rules for everything we want.
+	5)	Changed cl_codewarrior.pm and cl_gcc.pm to remove the use of inline files. 
+		It turned out to be simple to change the "ar -M" command into a direct "ar cr" 
+		command line, and the CodeWarrior makefile doesn't use the bscmake rule anyway.
+	6)	Rearranged dependencies so that real files do not depend on "phony" targets.
+		This involved moving the MAKEWORKLIBRARY dependency, and adding MAKEWORK$Bld
+		to the UREL and UDEB target. Changed cl_codewarrior.pm to remove the remaining
+		mentions of .sbr files.
+	7)	Removed the trailing \ from the directory definitions in cl_generic.pm (things like
+		EPOCBLD, EPOCLIB etc) so that they won't be troublesome to MAKE.
+	8)	Removed !if "OS" == "Windows_NT" conditional stuff into the Perl scripts, so
+		that the resulting Makefiles aren't conditional at all.
+	9)	Added Generic_Quote, which quotes a filename in the style required for the
+		type of makefile being generated, and Generic_CopyAction which deals with
+		copying a file (default ?$) to the target of the rule ($@).
+		These are available to users of cl_generic.pm and used within the generic functions.
+	10)	Added MakeCmd to the E32Plat.cmd information, and use it in BLDMAKE to determine
+		the way that the recursive Makefile should be called. Also pass it from MAKMAKE
+		to the cl_XXX.pm module, which checks it and passes the value on to cl_generic.pm
+		if used.
+	11)	Added -s to the recursive calls for WHAT, to avoid any directory information being
+		printed by MAKE.
+	12)	Changed epocaif.pl and epocrc.pl to use File::Copy rather than system "copy..." in
+		the lockit processing.
+	13)	Reworked cl_codewarrior.pm and cl_gcc.pm that they can support both MAKE and NMAKE,
+		generating appropriate Makefiles according to the type requested by MAKMAKE.
+	14)	Change E32PLAT.PM to specify MAKE makefiles for all ARM and WINSCW targets.
+	15)	Removed use of wildcard "$BaseTrg.*" in CLEANLIBRARY
+	16)	Added detection of ABLD fatal errors to scanlog.pl
+	17)	Removed use of DUMPBIN for extracting list of exports in cl_codewarrior.pm, and
+		modified MAKEDEF.PL to handle the mwld.exe output used instead.
+	18)	Fix defect BRN-52RCVD "Evalid doesn't work correctly when run from a 
+		directory more than one level deep."
+	19)	Fix defect ROS-53ECQY "Can't disable WINSCW builds in PRJ_PLATFORMS"
+	20) Change GENBUILD.PL to do "resource" before "library" so that static libraries can
+		make use of generated .RSG and .MBG header files. At the same time, disentangle the
+		WINS and WINC build steps so that WINC is required to stand by itself.
+	21)	In genbuild.pl, remove the extra "what" & "check" steps before the "final" step for 
+		WINS and WINSCW, and pass the "keepgoing" flag to the export step.
+	22)	Fix defect BRN-52KL2Y "\epoc32\localisation\*.rpp and *.info files are not reported 
+		by the build tools as releaseables". All of the files placed in epoc32\localisation
+		are now reported by MAKMAKE as generic releasables.
+	23)	Fix defect ROS-52XGQY "fixupsym.pl is broken by recent MAKMAKE changes" and improve
+		speed of directory scanning (still takes too long though...)
+	24)	Add "what" and "check" reporting to the tools part of genbuild.pl
+	25)	Change makedef.pl to allow filenames with drive letters, and adjust to support both 
+		2.4.5 and 2.5 versions of the CodeWarrior linker.
+	26)	Convert all Perl scripts to use FindBin rather than explicit scanning of the PATH variable.
+	27)	Fix defect FOD-53SN8N "Can't pass more than 1024 characters into ar". by changing cl_gcc.pm 
+		to build the archive files with the full pathnames of the temporary files. This avoids the 
+		need to use "cd xxx;", which caused MAKE.EXE to use a DOS batch file to execute the command.
+	28)	Changed EVALID.PL to ignore the pathnames leading to object files when comparing libraries and
+		MAP files. Also arranged to ignore the MAP file lines involving .stab and .stabstr information.
+	30)	Fix defect THY-54BG7T "Error when invoking GNU make directly" by duplicating the
+		PATH & Path handling from the BLDMAKE-generated makefiles
+	31)	Fix defect PLD-54FQ6U "Recompiling for ARM after making source changes results in link failures"
+		by reinstating the deletion of the .in file prior to calling "ar".
+	32)	Fix a few places where MAKMAKE assumed that pathnames do not contain spaces
+	33)	Add the CW_IDE platform (cf VC6) and implement it in ide_cw.pm with an associated template
+		for the generated .xml file.
+	34)	Restructure MAKMAKE.PL + MMP.PM file handling as SetVarsFromMmp, so that ide_cw.pm can call back
+		to reprocess the MMP file for other platforms.
+	35)	Adjust cl_codewarrior.pm to match the CodeWarrior Symbian Compiler Plugin, and fix a defect with
+		EXPORTUNFROZEN generating the import library from the wrong def file.
+	36)	Change winutl.pm to avoid the LINK.EXE version check for WINSCW builds.
+	37)	Change EVALID.PL to ignore more variations on pathnames when comparing .MAP files
+	38)	Add compare_summary.pl, a utility for comparing two lots of scanlog.pl output.
+
+2)	Uma
+	1)	Fix Defect JUA-53ULTP "abld reallyclean wins" waits for the user input 
+		in order to finish execution"
+
+Version 0.01.301
+================
+(Made by William, 07/08/2001)
+
+1)	William
+	1)	Require 5.005_03 in BLDMAKE and MAKMAKE, so that pre 518 versions of Perl will
+		explicitly fail early rather than fail during FindBin.
+	2)	Extend support for EPOCROOT-relative paths to "SOURCEPATH" keyword, so that
+		generated source files can be stored in the EPOC32\Build tree. Use something like
+		
+		  SOURCEPATH  \epoc32\build\generated\http
+		  SOURCEPATH  +\build\generated\http
+
+		to get files in %EPOCROOT%epoc32\build\generated\http.
+	3)	Remove unnecessary EPOCROOT check in epocaif.pl
+	4)	Turn up optimisation level in CodeWarrior UREL builds.
+	5)	Change bldmake.pl to that "bldmake plat all" works in the way you'd expect, printing
+		a list of all the supported platforms and the information for each one.
+	6)	Update the ASSP file support so that the keyword SINGLE names the associated
+		single ASSP and builds the additional platform description. Remove SISA.ASSP and
+		add "SINGLE SISA" to the MISA.ASSP file.
+	7)	Move all of the ASSP definitions out of E32PLAT.PM into .ASSP files.
+	8)	Add genutils\ecopyfile.pl which acts like "copy src dst" except that it won't
+		update dst if it's identical to src. Changed the various cl_*.pm modules in
+		Makmake to use perl -S ecopyfile.pl instead of schemes based on diff -s
+	9)	Abstract common parts of cl_gcc.pm, cl_win.pm and cl_codewarrior.pm into a shared
+		file cl_generic.pm, and adjust accordingly. This changes the interface expected by
+		MAKMAKE.PL, so the ide_vc6.pm file was also changed.
+	10)	Provide cl_generic.pm support for accumulating the various MAKEWORK targets, and
+		doing all of the directory creation.
+	11)	Provide generic build of resource, bitmap and AIF files into \epoc32\data\Z, with
+		backwards-compatibility copying from the central place into the \epoc32\release
+		directories. This copying will stay for the emulated Z drives, but could be
+		removed for the ARM targets.
+	12)	Implemented support in the Win32-based platforms for DLLs which are both statically
+		and dynamically linked (e.g. FXCM.DLL). This consists of putting the word
+
+			COPY_FOR_STATIC_LINKAGE
+
+		in the START WINS ... END section, and causes the generated makefile to build the
+		DLL into the target directory and then copy it into the release\xxx\yyy directory
+		used to resolve static linkage. This removes the need for some extension makefiles.
+	13)	Reinstated some lost "perl -w" and "use strict;" checking for the "DEB" version 
+		of e32toolp.
+	14)	Revisited the "no target directory for WINC" and "missing TAREGTPATH for resources"
+		handling. It's now consistent throughout, and avoids paths which expand to include
+		two consecutive separators. In the process, I discovered that WINC was building
+		SYSRESOURCE things into an "emulated Z drive" for WINC: clearly wrong so I applied
+		the "no target directory policy" for WINC as well.
+	15)	Added "-w nounusedexpr" to the list of globally disabled warnings in CodeWarrior
+		builds: this unhelpfully reports uses of va_start(), TPckgBuf<TInt> and other
+		entirely reasonable things.
+	16)	Moved linkdeps.pl into e32toolp\bldmake, and deleted the old BATCH component
+	17)	Added make.exe to e32toolp\group and bootstrap it via setupprj.bat. This is the
+		Win32 native build of make 3.79.1, compiled with the HAVE_CASE_INSENSITIVE_FS option.
+	18)	Changed BLD.INF syntax to accept
+
+		    makefile    extension_makefile
+		    nmakefile   extension_makefile   // invoke with nmake
+		    gnumakefile extension_makefile   // invoke with make
+
+		Currently "makefile" is a synonym for "nmakefile", but eventually I'd like to change
+		it over and get rid of "gnumakefile" which is rather ugly.
+		Currently the only "gnumakefile" extension Makefile is in RCOMP.
+	19)	Changed BLDMAKE.PL and ABLD.PL to use MAKE rather than NMAKE, and generate the 
+		appropriate GNU-style Makefiles in the \epoc32\build tree. This required a change
+		to make 3.79.1, which is now labelled with "(Symbian build 002)".
+	20)	Changed scanlog.pl to detect errors and warnings produced by MAKE as well as NMAKE.
+
+1)	GregZ
+	1)	Add first cut of MMP file support for specifying additional compiler options.
+		The syntax is
+
+		    OPTION <keyword> <rest of line>
+
+		where the keywords are interpreted by the MAKMAKE back-ends. Currently the
+		recognised keywords are CW, GCC and MSVC, and there is enough support to
+		deal with "OPTION CW -W off" for turning off warnings in CodeWarrior builds.
+
+
+Version 0.01.300
+================
+(Made by William, 02/05/2001)
+
+NB. Requires ActiveState Perl 518 or later, otherwise MAKMAKE fails due to problems with FindBin.pm
+
+1)	William
+	1)	Changed MAKMAKE to use WINC\UREL\AIFTOOL.EXE rather than WINC\UDEB
+	2)	Changed MAKMAKE to add "abld listing" support for WINS and WINSCW builds
+	3)	Changed MAKMAKE support for "abld listing" so that the assembler listings
+		are named 
+		
+		    <source_basename>.lst.<abi>
+		    
+		e.g. UP_TRP.lst.ARM4, UP_TRP.lst.WINS etc. Previously they were all called UP_TRP.lis
+		Also changed the philosophy slightly: the listing file is still generated in the
+		\epoc32\build tree, but the LISTING target now always copies the file, rather than
+		copying it as a side-effect of generating it. This makes it easier to alternate 
+		between UREL and UDEB versions.
+	4)	Changed MAKMAKE to generate a MAP file for WINSCW release builds.
+	5)	Improved support for ABIs defined via ASSP files: you can now specify ABI, ASSP, 
+		ASSPABI and Single via the ASSP file, but with very limited error checking. 
+		Changed MISA and SISA into targets defined by ASSP files to prove that it works.
+	6)	Updated instcol.pl to allow for either WINSCW or WINS or both.
+	7)	Added EPOCAIF.PL to generate AIF files, and changed MAKMAKE to use it. This involves
+		adding an include path relative to the location of MAKMAKE.PL so that the SDK can ship
+		a single shared AIFTOOL.RH which will do for all DFRDs. This contributes to fixing
+		defect HET-4VEM87 "Location of release\winc on SDKs places restrictions on developers".
+	8)	Fix defect ROS-4VNJTC "EVALID doesn't correctly compare x86 import libraries" by
+		using "dumpbin /symbols /exports" as suggested.
+	9)	Removed MNT.CMD from the moribund setver.bat script
+
+
+Version 0.01.226
+================
+(Made by Morgan, 08/03/2001)
+
+1)	Morgan
+	1)	Altered MAKMAKE GCC platform (CL_GCC.PM) to include intrinsic libraries
+			EDLLSTUB.LIB	- class Dll::
+			EGCC.LIB		- helper functions not in EUSER.LIB
+
+
+Version 0.01.225
+================
+(Made by Dennis, 05/02/2001)
+
+1)	William
+	1)	Fix defect HEY-4S7N73 "MAKMAKE doesn't force GCC to pass include directories to AS" by
+		forcing the .s extension on assembler files to be uppercase. This causes GCC to put the
+		assembler source file through the preprocessor first, which allows us to use the
+		C preprocessor to organise assembler source. This area will need revisiting when we
+		change to a non-GCC compiler for v7.
+	2)	Fix defect ROS-4TAGHW "MAKMAKE should put .EXP files into the \epoc32\build tree"
+	3)	Removed all remaining traces of MCORE - this will imply BLD.INF changes to remove
+		it as well, since it's no longer a recognised platform.
+	4)	Removed tool-related .IPR files, and the SETUPPRJ support for them
+	5)	Fix defect ROS-4TFGCK "BLDMAKE -keepgoing does not prevent attempts to export 
+		missing files" by rearranging the EXPORTS code in bldmake.pl
+
+2)	William
+	1)	Implement initial support for CodeWarrior 6.0 compiler, as WINSCW defining __CW32__
+	2)	Revert to using LIB.EXE for generate import libraries, as MWLD doesn't seem to
+		support this functionality.
+
+3)	Zill
+	1)	Fix defect ROS-4TFGAN "scanlog.pl should detect and report bld.inf warnings"
+
+
+Version 0.01.224
+================
+(Made by Pete, 19/01/2001)
+
+1)	William
+	1)	Fix defect EDNRCHN-4DAMG8 "Small problem with MAKMAKE" by requiring the LINK.EXE
+		output to contain a "version" line.
+	2)	Don't export the DISTRIBUTION.POLICY document to engdoc\e32toolp, to fix
+		defect ARG-4RJFNV "E32ToolP Exports a distribution.policy file ..."
+	3)	Fix defect EDNABRY-4MLEWA "EPOCROOT error message could be more informative" by 
+		checking separately for the unsupported use of a drive letter.
+	4)	Apply the fix for empty path elements to all the other E32TOOLP scripts which
+		use the same algorithm.
+	5)	Fix defect ROS-4SMKB6 "MAKMAKE doesn't check TARGETPATH strongly enough"
+	6)	Fix defect EDNAWIR-4NAM7R "Not possible to include a library for DEBUG only" by
+		implementing the DEBUGLIBRARY keyword: MMP.PM now builds two lists, with LIBRARY
+		statements contributing to both and DEBUGLIBRARY only contributing to the debug list.
+		Tested with FLOGGER.LIB in PPP.MMP, which removed the MSVC LNK4005 warning.
+	7)	Documented SRCDBG and DEBUGLIBRARY
+	8)	Implement "BLDMAKE -K" to support IPR-filtered builds, and make genbuild.pl pass
+		the keepgoing flag to bldmake.
+	9)	Fix defect ROS-4RWF42 "MAKMAKE clean targets should not use wildcards", by
+		converting the WHAT target into a RELEASABLES= list, then using it in both
+		WHAT and CLEANRELEASE. This preserves the identity that CLEANRELEASE should
+		remove exactly the things listed by WHAT.
+	10)	Fix defect EDNWROS-4NULY5 "MAKMAKE can generate Makefiles containing lines longer 
+		than 2048 characters" by using \ continuation in the relevant places.
+
+2)	Jonathan
+	1)	Added memtrace tool and documentation.
+
+
+Version 0.01.223
+================
+(Made by RobertJ, 13/12/2000)
+
+1)	William
+	1)	Update MAKSYM.PL to cope with multiple ROM images in a single ROMBUILD.LOG file.
+		Derive the name of the SYMBOL file from the ROM image name, except for the
+		first ROM image where the SYMBOL file name can be overridden by the optional
+		commandline argument. "maksym x y" will therefore behave the same as before, but
+		"maksym x" will use a sensible name related to the ROM image rather than MAKSYM.LOG.
+	2)	Update FIXUPSYM.PL to cope with multiple ROM images by stopping at the end of the
+		first image. It needs to do this because the same file could appear in multiple
+		extension ROMs, and live at a different address in each one.
+	3)	Rearrange FIXUPSYM.PL internals to test things in a better order, and to give more
+		meaningful explanations for some "can't fixup" conditions.
+	4)	Fix defect ROS-4S6HRP 'MAKSYM can fail with "Empty compile time value..."' in MAKSYM.PL,
+		FIXUPSYM.PL and HPSYM.PL by converting an empty path element into "."
+
+1)	William
+	1)	Update genbuild.pl to support licensee builds
+		- Removed the old PVCS support and references to M*CORE
+		- Replaced batch\build\special.bat with canned special case command
+		  sequences in genbuild.pl
+		- Validate components by checking for the presence of the BLD.INF file
+		  and issuing a "MISSING COMPONENT" warning for those which don't have
+		  BLD.INF files. Only components which pass this test are included in the
+		  generated CMD files.
+		- Generate additional script xxx_pbuild.cmd, so that genpbuild.pl functionality
+		  is supported by genbuild.pl
+
+ 
+Version 0.01.222
+================
+(Made by Alastair, 16/11/2000)
+
+1)	William
+	1)	Fix defect EDNABRY-4QDEN5 "Scanlog.pl doesn't pick up petran errors" by
+		adding a check for "ERROR: bad relocation:", which is actually a warning that
+		PETRAN has had to guess about the meaning of a relocation.
+	2)	Fix defect EDNJLID-4QCGPS "Instcol batch tool not compatible with Win2000" by
+		replacing the batch file with a Perl script.
+
+2)	Alastair
+	1)	Changed prepfile.pm so that it reports information about files
+	  	included into the file that it's processing.  Updated makmake and
+	  	bldmake error reporting to take advantage of the new information.
+	2)	Added new build tool, metabld.pl.  For more information, see the
+	  	documentation in \e32toolp\docs\metabld.rtf, which is exported to
+	  	\epoc32\engdoc\e32toolp\.
+
+
+Version 0.01.221
+================
+(Made by Nicolas, 10/10/2000)
+
+1)	William
+	1)	Fix defect EDNWROS-4N4JLF "ranlib can damage archive files" by not
+		running ranlib. The ar command already generates the symbol
+		directory, so ranlib is unnecessary.
+
+2)	Nicolas
+	2)	Introduced SRCDBG makmake keyword.  When it is specified (no
+		argument), UDEB builds do not use the -O flag any more.  This is
+		hopefully a temporary work-around that will be removed when every
+		EPOC components build and run ok without optimisations.
+	
+
+Version 0.01.220
+================
+(Made by Dennis, 13/09/2000)
+
+1) William
+	1) Sundry M*Core changes to MAKMAKE
+	2) Added "DefFile" key to E32PLAT.PM PlatHash, for selecting the style of DEF file or
+	   predefined exports: this is used to implement the decision that MCORE will use BMARM
+	   def files until such time as we find a name-mangling difference between GCC 98r2 & 99r1
+	3) Put a test into BLDMAKE.PL so that the path is extended with the mcore-tools\pe\bin
+	   directory for MCORE and MCGM builds. This allows the bootstrap to build for MCORE via
+	   extension makefiles.
+	4) Fixed various warnings from perl -w, e.g "ambiguous used of {xxx} resolved to {"xxx"}"
+	5) Corrected messages about "EXPORTFROZEN" to say "EXPORTUNFROZEN"
+	6) Added -Wno-unknown-pragmas to the GCC makefiles, to suppress MCORE warnings. It seems to
+	   be harmless on the 98r2 GCC, so I've made it standard.
+	7) Fix defect EDNCMOS-4NJJ5L "makmake error message incomplete if UID2 is wrong."
+	8) Fix defect EDNRANS-4NQKXP "Can't build Opltran WINC tool under vc6"
+	9) Change EPOCRC.PL to call RPREP, to support the generation of LOCKIT.
+
+
+Version 0.01.213
+================
+(Made by Morgan, 5/7/2000)
+
+1) Anon
+	1) Changes to
+	Change 43137
+	//EPOC/development/base/6.0/e32toolp/BLDMAKE/BLDMAKE.PL#3
+	//EPOC/development/base/6.0/e32toolp/PLATFORM/CL_WIN.PM#3
+
+
+Version 0.01.212
+================
+(Made by MarkCa, 16/05/00)
+
+1)	Alastair
+	Fixed COMABRY-4JGKQ9 "Test T_R32 fails in UREL under WINS/WINC", by specifying
+	the /Op option for all WINS/WINC UREL builds.  This flag disables optimisation of
+	floating-point comparisons and gives better consistency in this area.
+
+
+Version 0.01.211
+================
+(Made by Morgan, 7.4.2000)
+
+1)	William
+	Removed EBLD.BAT
+	Updated MAKMAKE.IPR to reflect changes to Perl modules
+	Removed LISTASM.IPR now that LISTASM.BAT has gone
+
+
+Version 0.01.210
+================
+(Made by Alastair, 15.3.2000)
+
+1)	Alastair
+	MAKMAKE
+	1)	PROJECT .mmp keyword no longer recognised by Makmake.
+	2)	SUBPROJECT .mmp keyword no longer recognised by Makmake - SOURCEPATH
+		keyword to be used instead.  SOURCEPATH works in the same way except
+		that relative paths specified with the SOURCEPATH keyword are considered
+		to be relative to the .mmp file directory rather than the top-level
+		project directory.
+	3)	UNICODEUID .mmp keyword no longer recognised by Makmake - there's now
+		only one keyword for specifying UIDs - UID - which applies only for
+		UNICODE builds of EPOC now that narrow builds are no longer supported.
+	4)	Documentation in \e32toolp\docs updated for this release.
+
+Version 0.01.209
+================
+(Made by Alastair, 10.3.2000)
+
+
+1)	Alastair
+	1)	Created new module, Trgtype.pm, which is loaded by Makmake and
+	  	contains all the data pertaining to target types as Makmake
+	  	understands them, including the mangled names for exports and second
+	  	UIDs for polymorphic DLLs.
+		Adding targettypes for new plugins should now simply be a matter of
+		adding a new entry in the data structure contained in Trgtype.pm.
+
+	2)	Reorganised Makmake.pl and Mmp.pm.
+
+	3)	Fixed regression introduced in version 207 - NOTIFIER target type and
+		FEP UID affected.  Also updated IDE_VC6.PM to counter NMAKE treating
+		'$' symbols as macros when these symbols occur in mangled function
+		names.
+
+	4)	Added warning hint that generated headers should be included with
+		angle brackets since these headers are generated into system include
+		directories.
+
+	5)	Change default .def file location from
+			\<project>\B<platform>\
+		to
+			..\B<platform>	(relative to the .mmp file directory)
+
+	6)	Changed build directory structure from 
+			\EPOC32\Build\<project>\<executable_basename>\<platform>\<build>\
+		to
+			\EPOC32\Build\<absolute_path_to_mmp_file>\<mmp_file_basename>\<platform>\<build>\
+
+	7)	Added new SOURCEPATH .mmp keyword.  This keyword works in exactly the
+		same way as the existing SUBPROJECT keyword, except that relative
+		paths (those specified without an initial backslash) will be treated
+		as relative to the directory containing the .mmp file rather than the
+		top-level directory specified by the PROJECT keyword.  The PROJECT and
+		SUBPROJECT keywords will soon be removed from Makmake altogether.
+
+	8)	The SOURCEPATH and bitmap-specific SOURCEPATH statements now default
+		to the directory containing the .MMP file.
+
+	MAKMAKE & BLDMAKE
+	1)	Changed default makefile directory structure from 
+			\EPOC32\Make\<project>\<platform>\
+		to
+			\EPOC32\Build\<absolute_path_to_mmp_file>\<mmp_file_basename>\<platform>\
+
+	2)	Changed bldmake directory structure from
+			\EPOC32\Bldmake\<project>\
+		to
+			\EPOC32\Build\<absolute_path_to_bld.inf_file>\
+
+		Note that batch files listing tests created by bldmake will therefore
+		be created in this new location, and the .IBY files used in building
+		base roms will be generated into
+		\EPOC32\ROM\<absolute_path_to_bld.inf_file>\.
+
+		The batch files for running these tests will be ROM-built to Z:\test
+		with a name which reflects the path to the relevant bld.inf file, e.g.
+		Test\F32TEST.GROUP.ARMI.AUTO.BAT.
+
+	BLDMAKE & ABLD
+	1)	Added new section to BLD.INF files for exporting files for use with
+		test code from source.  Syntax is
+
+		PRJ_TESTEXPORTS
+		[<source path>\<source file>]	{<destination>}
+		// list each file exported from source on a separate line
+		// {<destination>} defaults to BLD.INF dir
+
+		The files will be exported as part of "ABLD TEST BUILD ..." as well as
+		with "ABLD TEST EXPORT".  "ABLD TEST CLEANEXPORT" will remove the
+		copied files.
+
+	2)	Added new ABLD command, ABLD LISTING, to create an assembler listing
+		for a particular source file.  Syntax is
+		
+		ABLD [test] LISTING [-k][-v] [<platform>] [<build>] [<program>] [<source>]
+
+		Specify just the basename of the source file.  The listing file will
+		be created in the build directory and copied to the same directory as
+		the source file.
+		This command replaces the LISTASM tool, which has now been removed.
+
+	3)	ABLD.PL now changes directory to the directory containing the relevant
+		BLD.INF file when it is invoked.  This change means that extension
+		makefiles should be able to specify paths relative to the BLD.INF file
+		specifying them rather than absolute paths.
+
+	LISTASM
+	1)	Replaced by ABLD LISTING command.  Type "ABLD HELP LISTING" for
+	  	syntax.
+
+
+	GENERAL
+	1)	Updated SETUPPRJ.BAT to export E32TOOLP tools documentation from
+		\e32toolp\docs to \epoc32\engdoc\e32toolp\.
+		Updated this documentation so that it it up-to-date with this release
+		of E32TOOLP, and will hopefully be edited for every future release.
+
+	2)	Removed PARSECOM.PM. Makmake, Efreeze and Makedef now use Perl
+		standard library command-line parser module - Getopt - instead.  This
+		change means that only a hyphen ("-"), rather than a forward slash
+		("/") or a hyphen, can be used to specify switches for these programs.
+
+	GENBUILD
+	1)	Added call for tools platform to create libraries now that some
+		components create libraries for this platform.
+
+2)	Jonathan
+	FIXUPSYM
+	1)	Only relink executables if they're not already fixed up for the correct
+	  	ROM addresses.
+
+
+Version 0.01.208
+================
+(Made by Pete 24/02/00)
+
+1)	Alastair
+	MAKMAKE
+	1)	Applied hacks for building EUSER.DLL in the MSVC IDE as they
+		are applied to command-line builds of EUSER.DLL.
+
+2)	Jonathan
+	1)	Merged in fixupsym and hpsym tools from ER5u e32toolp v134.
+
+
+Version 0.01.207
+================
+(Made by Simon, 01/02/00)
+
+1)	Simon
+	MAKMAKE
+	1)	Changed hardwired directory to new source structure
+	2)	'PROJECT' keyword is now ignored in mmp files
+
+Version 0.01.206
+================
+(Made by Dennis, 19/01/00)
+
+1)	Alastair
+	GENERAL
+	1)	Removed obsolete tstparse.pl.
+
+	MAKMAKE
+	1)	Fixed Symbian defect EDNMRED-4E5NSD "VC6 always asks to build a dummy
+		RSS file before execute".
+	2)	Tools platform now refuses to build anything but EXE target types.
+	3)	Now using perl script emkdir.pl to create directories in makefiles
+		rather than mkdir because it can make paths all at one go under
+		Windows95/98.
+	4)	Added code so that Win32 resources can be specified with a path relative
+		to the .MMP file as well as absolutely.
+	5)	Changed flags for generating .PDB files in WINS builds so that .MMP
+		files with a targetpath specified produce just one .PDB file in the same
+		directory as the executable created.  This change should also enable
+		debugging executables with target paths on different PC drives.
+	6)	Created new .MMP Target type, "notifier", with a 2nd UID 0x10005522 and 
+		1st export "IMPORT_C CArrayPtr<MEikSrvNotifierBase>* NotifierArray()".
+		The targetpath for the executable will default to "system\notifiers".
+
+
+	MAKMAKE & BLDMAKE
+	1)	Added code to read a .ASSP module in \EPOC32\Tools for specifying a new
+		ASSP.  Syntax for the module is
+
+			ABI		[ARM4|ARMI]		# default is ARMI
+		
+		"ABI" specifies the Application Binary Interface for ASSP releasables, such
+		as EDISP.DLL, which do not specify .MMP keywords ASSPABI, ASSPLIBRARY,
+		or ASSPEXPORTS.
+	2)	Added .ASSP modules for MMAD and MAWD, taking them out of E32PLAT.PM.
+	3)	Removed platforms ARM3, MX86, SARM3, SROS, including ARM3 flags in
+		Cl_arm.pm.
+	4)	Changed MEIG and SEIG ASSPs to build for ARM4 rather than ARM3 hardware.
+	5)	Changes to support partially MCORE development
+		a) MCORE and MCGM have been added as platforms to E32Plat.pm.
+		b) Cl_arm.pm has been renamed Cl_gcc.pm and MCORE-specific tools options
+		incorporated.  The system path in MCORE makefiles is prefixed with the path
+		to the MCORE gcc tools rather than the ARM gcc tools.
+	6)	Changes put in as a side-effect of making the MCORE changes
+		a)	GENERIC_WINS is no longer defined for preprocessing .MMP and BLD.INF
+		files to mean WINS but not WINC or TOOLS.
+		b)	__GCC32__ and __VC32__ are now defined for .MMP and BLD.INF
+		preprocessing for compiler-specific conditions.
+		c)	Minor changes to MAKMAKE.PL and MAKDEPS.PM.
+
+
+	GENBUILD
+	1)	Removed references to ARM3.
+
+
+Version 0.01.205
+================
+(Made by Peter, 15/12/99)
+
+MAKMAKE
+1)	Peter
+	1)	Modified E32PLAT.PM so that MEIG builds use ARM4 rather than ARM3.
+
+
+
+Version 0.01.204
+================
+(Made by Morgan, 3/12/99)
+
+1)	Alastair
+	GENERAL
+	1)	Removed dependence on latest version of perl from setupprj.bat, which was
+		introduced in version 203.
+	2)	Removed MNT.BAT and associated files.
+	3)	Added emkdir.pl, a script for creating directory paths.
+
+
+Version 0.01.203
+================
+(Made by Anonymous)
+
+1)	Alastair
+	MAKMAKE
+	1)	Changed VC6 default configuration for all executables (WINS, WINC,
+		TOOLS) to Debug rather than Release.
+
+	2)	Removed -undef flag from the call to CPP to generate dependencies
+		while it's not being used in compiling the source code.
+
+	3)	Changed order of link dependencies in makefiles so that object files
+		generated from the source files of a project are listed before import
+		libraries the project links to.  This change means that the object files
+		will be built even if a required import library is missing, rather than
+		the build of the project failing immediately with nothing being built.
+
+	4)	Added new perl script, ERMDIR.PL, to \EPOC32\Tools.  Makmake command-
+		line generated makefiles now use this script to remove build directories
+		with ABLD CLEAN, rather than deleting individual files.  RMDIR /S/Q
+		unfortunately doesn't work under Windows95/98, hence the need for a
+		script.
+
+	5)	Fixed minor Windows95/98 syntax error in IDE workspaces:
+			IF NOT %ERRORLEVEL%==0 ...
+		has been changed to
+			IF ERRORLEVEL 1 ...
+
+	6)	(From Chris) added USERLDFLAGS macro for passing to calls to the GCC
+		linker for re-linking executables for use with a debugger.
+
+	7)	Added some dependency information for resource targets in the VC6
+		supplementary makefile so that rebuilding is attempted more
+		appropriately.
+
+	MAKMAKE & BLDMAKE
+	1)	Added -undef flag to the call to CPP to preprocess .MMP and BLD.INF
+		files.  This fixes Symbian defect EDNRFID-4CPJY2 'Can't have source
+		directory called "ARM"'.
+
+	2)	Changed .MMP and BLD.INF preprocessor module so that it can be switch
+		between upper-casing the contents of the processed file or leaving case
+		alone.  BLDMAKE now uses the leave-case-alone mode so that exported files
+		retain the case specified in the BLD.INF file.  MAKMAKE uses the upper-
+		case mode.
+
+	BLDMAKE
+	1)	Extended ABLD -keepgoing option so that it is applied for NMAKE calls on
+		particular project makefiles as well as to calls on the meta-makefiles for
+		each component.
+
+	2)	Improved ABLD error checking so that calls such as ABLD BUILD EWSRV ARMI
+		will report an error because the platform is specified after the program
+		rather than going on to build EWSRV for all supported platforms.
+
+	3)	Bldmake bldfiles will now overwrite read-only abld.bat files.
+
+	EFREEZE
+	1)	Changed EFREEZE.PL to check whether the frozen .DEF file is writeable if
+		there are new exports to be added to this file.  If the file is not
+		writeable the script will exit with a suitable error message.  Fixes 
+		Symbian defect EDNABAN-4CDFAK "Some abld commands die with read-only
+		files".
+
+	GENERAL
+	1)	Changed SETUPPRJ.BAT to use GNU MAKE rather than NMAKE.  This means the
+		Cygnus GNU tools need to be in the path before E32TOOLP can be built.
+
+
+Version 0.01.202
+================
+(Made by Alastair 12/10/99)
+
+1)	Alastair
+
+	BLDMAKE & MAKMAKE
+	1)	Removed support for the old GCC compiler.  Building for platforms MARM
+		and SARM is no longer supported.  If MARM is specified as a platform in
+		the BLD.INF file then it will still be expanded to mean ARM4, ARMI and
+		THUMB but really these platforms should be listed explicitly or the
+		default relied upon.
+
+	MAKMAKE
+	1)	Added list of source macros defined for preprocessing to the help
+		displayed by MAKMAKE -PLAT <platform>.  This list isn't complete, since
+		the definition of some macros will depend upon the contents of a
+		particular .MMP file.  Unlisted macros are as follows:
+			__MARM_<ABI>__ if the platform CPU is MARM
+				(where <ABI> may vary according to .MMP contents),
+			Any macros defined in the .MMP file,
+			__DLL__ or __EXE__ respectively if the general target type is DLL or EXE,
+			WIN32 and _WINDOWS if the project links to Win32 libraries,
+			_UNICODE,
+			_DEBUG or NDEBUG for Debug and Release builds respectively.
+
+	2)	Added extratarget, RECREATEWORKSPACE, to the supplementary MSVC6
+		workspace makefile.
+		This target is intended for use as a custom tool within the MSVC IDE, for regenerating
+		workspace once the .MMP file has been edited within the IDE.  To install the target as
+		a custom tool in the IDE, select Tools->Customise...->Tools, and choose a name for the
+		tool, e.g. "Recreate Workspace".  Next, type "nmake.exe" as the command and
+		"-nologo -f $(WkspDir)\$(WkspName).sup.make recreateworkspace" as the program arguments.
+		Leave the "initial directory" field blank, and tick the "Close window on exiting" checkbox.
+		Having edited the .MMP file for a project, select the new tool from the tools menu to
+		recreate the workspace.  If the commands have run correctly, you will be prompted to
+		reload the workspace.
+
+	3)	Changed makefiles to use DIFF.EXE (part of the GCC distribution from GCC
+		version 523) rather than FC4BAT.EXE to compare generated headers.
+		FC4BAT.EXE is no longer required.
+
+	4)	Changed LIBRARY targets in static library makefiles so that they depend
+		upon the UDEB and UREL targets.  This change means that the ABLD LIBRARY
+		command will create static libraries as well as import libraries.
+
+
+	BLDMAKE
+	1)	Added BLDMAKE PLAT <platform> command, which lists the macros defined
+		for the preprocessing of PRJ_MMPFILES and PRJ_TESTMMPFILES sections of
+		BLD.INF files for the <platform> specified.
+
+	2)	Now dynamically loading module PREPFILE.PM, which depends upon
+		CHECKGCC.PM, so that CPP.EXE is checked only if it is going to be used.
+		This change addresses ER5u defect EDNDFER-4BGN9L "BLDMAKE should not insist
+		on CPP being in the right place unless it's going to use it."
+
+	3)	Bldmake now generates a list of programs supported by each platform in a
+		Perl data structure, so that ABLD can tell whether a particular program
+		as specified on the ABLD command-line should be built for a particular
+		platform.  Fewer obscure errors should now be produced by ABLD,
+		especially since error reporting has been tidied up somewhat.
+
+	4)	If the [platform] or [build] parameters are missed out of the ABLD
+		command-line, they will be assumed to be "ALL".  This means that commands
+		such as ABLD BUILD ECONS will build all the UDEB and UREL versions of
+		ECONS for all the platforms specified in the BLD.INF file, as would
+		ABLD BUILD ALL ALL ECONS.  This change means, as far as Engineering
+		components are concerned, that components must avoid using the names of
+		platforms and builds used during overnight building as the basenames of
+		.MMP files or extension makefiles - MAWD, MISA, MCGA, TOOLS, UDEB, UREL,
+		etc.
+		
+		These last 2 changes address the issues raised by ER5u defect EDNDFER-4BPE3P
+		"It would be good if you didn't have to specify a platform".
+
+	5)	Removed the "hidden" status of ABLD command CLEANEXPORT, so that it
+		appears in the list of available commands.  This command will delete all
+		the files generated with ABLD EXPORT.
+
+	6)	Changed component makefiles that BLDMAKE generates so that
+		\epoc32\gcc\bin on the current drive is added to the front of the PATH.
+		This change will ensure that GCC tools on the current drive are used where
+		custom builds make use of the GCC tools.
+
+	EVALID
+	1)	(From William) Updated EVALID.PL which can use \epoc32\tools\pfsdump to
+		compare two EPOC permanent file stores.
+
+	GENBUILD
+	1)	(From William) some improvements to scanlog.pl.
+
+	2)	(From William) a new alternative overnight genbuild log scanning script -
+		complog.pl.
+
+
+
+Version 0.01.201
+================
+(Made by Alastair, 17.9.99)
+
+1)	Alastair
+
+	LISTASM
+	1)	Fixed problem with projects where the basename of the target is
+		different from the basename of the project's makefile.
+	2)	Added code to generate the build directory to contain the generated
+		listing file.
+
+	MAKMAKE
+	1)	Fixed ER5U defect EDNGTIN-4BTGJU "Fatal error in vc6 .SUP.MAKE file".
+
+
+Version 0.01.200
+================
+(Made by Alastair, 9.9.99)
+
+1)	Alastair
+
+	GENBUILD
+	1)	(From William) Changed batch file output so that a list of executables 
+		that should have been produced is added to the log file.
+	2)	(From William) Added SCANLOG.PL, which summarises the output from
+		GENBUILD.  Call "perl -S scanlog.pl < [genbuild_logfile]".
+
+	MAKMAKE
+	1)	Help now displays the EXPORTUNFROZEN keyword and the target types WLOG,
+		VAR and KEXT.
+	2)	Changed FEP targettype first export to the correct version following the
+		change made to the function in CONE version 160.  This fixes ER5u defect
+		EDNDBAR-4BHH87, "MAKMAKE's knowledge of the FEP interface is out of date".
+
+	BLDMAKE
+	1)	Changed ROM names of the batch file for running the tests for a
+		component from <component>.auto.bat and <component>.manual.bat to
+		<component>.<platform>.auto.bat and <component>.<platform>.manual.bat
+		respectively.  This change will only affect E32TEST and F32TEST, since
+		it's only the rombuild for these 2 components which makes use of the
+		experimental .IBY files generated by BLDMAKE.
+
+
+Version 0.01.127
+================
+(Made by Morgan, 26.8.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Implemented new .MMP keyword, EXPORTUNFROZEN, which means "generate an
+		import library containing frozen AND unfrozen exports".  If this keyword
+		is specified, an import library containing all exports will be created
+		as a side-effect of building the main target, instead of an import library
+		being created directly from the frozen .DEF file.
+		Note that, for the new ARM targets, extra import libraries for
+		compatible targets will not be created, as they are when the import
+		library is created directory from the frozen .DEF file.
+		Note also that warnings about unfrozen exports will still appear.
+
+	2)	Trapped error where duplicate bitmap targets are specified in a .MMP
+		file.
+
+	3)	Removed change to make the bitmap header lower-case in the makefile now
+		that BMCONV doesn't use the case to decide the format for the enum in
+		the generated header.
+
+	4)	Changed PLATFORM\IDE_VC6.PM to make Debug rather than Release builds the
+		default in the VC6 IDE.
+
+	5)	Added 2 new experimental IBY file creation keywords, ROMTARGET and
+		RAMTARGET.
+
+	6)	Changed the target in makefiles called by ABLD -WHAT to WHAT rather than
+		RELEASABLES - this doesn't apply to extension makefiles, where the
+		target is still RELEASABLES.
+
+	7)	Removed -LIST option which used to cause assembler listings to be
+		generated.  This is now done with the new LISTASM tool, and support for
+		this tool has been added to the generated makefiles.
+
+	BLDMAKE
+	1)	Allowed "ALL" to be specified as a platform so that it is possible to
+		build, e.g., makefiles for all supported platforms for a particular
+		project within a component using just one command.
+
+	2)	Updated BLDMAKE\EGMAK.FIL with some more information about how to write
+		extension makefiles for use with ABLD.
+
+	3)	BLD.INF processing now allows platforms to be added to and removed from the
+		default PRJ_PLATFORM list.  Keyword "DEFAULT", if specified, will be
+		expanded to the list of default platforms - WINS, ARMI, ARM4 and THUMB with
+		the new gcc compiler.  Prefix platforms to be removed from the default
+		list with a minus sign [-], and add platforms simply by specifying them
+		as usual.
+		(This feature was actually implemented some time ago).
+
+	4)	Added experimental code for creating .IBY files - this currently only
+		works for E32TEST and F32TEST using the command ABLD TEST ROMFILE.
+
+	5)	Added GENBUILD.PL (from William) and GENBUILD.BAT which produces an
+		effect not dissimilar to "ABLD BUILD" for a list of components.
+
+	6)	Added warning if the new gcc compiler is not installed that the new
+		platforms, ARMI, ARM4, THUMB, etc. will not be available.
+
+	LISTASM
+	1)	New tool to generate an assembler listing for a particular source file.
+		Syntax is
+
+		LISTASM [platform] [build] [source_file]
+
+		The tool searched for the .lis target corresponding to the source_file
+		in the platform makefiles in \EPOC32\Make, and executes the command to
+		generate the .lis directory along with the .o file in the intermediate
+		files directory, and then copy this file to the source_file directory.
+		Only GCC makefiles support this tool.
+
+
+Version 0.01.126
+================
+(Made by Alastair, 19.8.99)
+
+1)	Alastair
+
+	BLDMAKE
+	1)	Fixed problem with target FINAL not being called in extension makefiles.
+
+
+Version 0.01.125
+================
+(Made by Alastair, 18.8.99)
+
+1)	Alastair
+
+	GENERAL
+	1)	Jumped the version numbers because release 120 erroneously reports
+		itself as version 124.
+
+	2)	Added new #defines for BLD.INF and .MMP preprocessing for the new
+		compiler targets
+			ARMI defines MARM_ARMI
+			ARM4 defines MARM_ARM4
+			THUMB defines MARM_THUMB
+			ARM3 defines MARM_ARM3
+
+		These #defines aren't applied for ASSP-specific platforms such as MAWD
+		since we can't know the final ABI until we've processed the .MMP file.
+
+
+	MAKMAKE
+	1)	Added new .MMP keyword, ASSPABI, for use in deciding the ABI for
+		projects built for ASSP-specific targets.  See note MAKMAKE #1 for
+		E32TOOLP version 120 - ASSPABI is implied by ASSPEXPORTS or
+		ASSPLIBRARY.
+
+	2)	Removed support for creating VC5 makefiles.
+
+	3)	Added warning during Win32 makefile creation if MSVC6 Service pack 3
+		is not installed.
+
+	4)	Using -march=armv4t for ARM4, to allow direct use of BX in the kernel,
+		where the component is built for ARM4 but the platform can support thumb
+		instructions.
+
+	5)	Added 2 new target types, KEXT and VAR, for kernel extension DLLs and
+		variant DLLs respectively.  Variant DLLs export the function
+		VariantInitialise__Fv at ordinal one for ARM platforms, and link to
+		EVAR.LIB rather than EDLL.LIB.  Kernel extension DLLs link to EEXT.LIB
+		rather than EDLL.LIB.
+
+	6)	Added code to apply .MMP keyword ASSPABI implicitly for known kernel
+		target types - KEXT, LDD, PDD and VAR.
+
+	7)	Added new target type, WLOG, for WSERV logging DLLs.  These DLLs export
+		the function CreateDebugLog(int, TDesC16 &) at ordinal 1, and have
+		second uid 0x10003b23.
+
+
+	EFREEZE/MAKEDEF
+	1)	Minor change in E32UTIL\DEFUTL.PM so that an EXPORTS statement without
+		a subsequent EXPORT definition can have blank space following it.
+
+
+	BLDMAKE
+	1)	Renamed the batch file BLDMAKE creates from BLD.BAT to ABLD.BAT to give
+		it a name less likely to clash with batch files already in existence.
+		The "A" could be said to stand for "Automated".
+
+	2)	Changed ABLD.BAT syntax, which is now as follows
+
+		ABLD [test] BUILD ( ( [-check] | [-what] ) | ( [-k] [-s] [-v] ) )  [<platform>]  [<build> [<program>] ]
+			(this command combines the EXPORT, MAKEFILE, LIBRARY, RESOURCE, TARGET, and FINAL commands).
+		ABLD [test] CLEAN ( ( [-check] | [-what] ) | ( [-k] [-v] ) )  [<platform>]  [<build> [<program>] ]
+			(removes everything that would be created by the corresponding TARGET command)
+		ABLD EXPORT ( ( [-check] | [-what] ) | ( [-k] [-v] ) )
+			(copies the exported files to their destinations)
+		ABLD [test] FINAL  [-k] [-v]   [<platform>]  [<build> [<program>] ]
+			(allows extension makefiles to carry out any build activities necessary after other build activities have been completed)
+		ABLD [test] FREEZE  [-k] [-v]  [<platform>]  [<program>]
+			(freezes exported functions in a .DEF file)
+		ABLD HELP ( [commands] | [options] | [<command>] )
+			(displays lists of commands or options, or help about a particular command)
+		ABLD [test] LIBRARY  [-k] [-v]  [<platform>]  [<program>]
+			(builds the import libraries from the frozen .DEF files)
+		ABLD [test] MAKEFILE ( ( [-check] | [-what] ) | ( [-k] [-v] ) )  [<platform>] [<program>]
+			(creates makefiles or IDE workspaces)
+		ABLD [test] REALLYCLEAN ( ( [-check] | [-what] ) | ( [-k] [-v] ) )  [<platform>]  [<build> [<program>] ]
+			(as for the CLEAN command, but also removes exported files and makefiles)
+		ABLD [test] RESOURCE [-k] [-v]  [<platform>]  [<build> [<program>] ]
+			(creates resource files, bitmaps and AIFs)
+		ABLD [test] TARGET ( ( [-check] | [-what] ) | ( [-k] [-s] [-v] ) )  [<platform>]  [<build> [<program>] ]
+			(creates the main executable, and also the resource files, bitmaps and AIFs)
+		ABLD [test] TIDY [-k] [-v]  [<platform>]  [<build> [<program>] ]
+			(removes releasables which need not be released from a component)
+
+		Options -k, -s and -v can also be specified as -keepgoing, -savespace and
+		-verbose respectively. Specifying -k will mean unrelated build activies will be
+		carried out after errors, -s causes intermediate files to be deleted if building
+		the main executable is successful and -v displays the calls to tools taking
+		place within makefiles during building. Options -what and -check can also be
+		specified as -w and -c respectively. Specifying -what will display the files
+		which will be created or deleted by a particular command, while -check will
+		check that all the files which would be displayed by -what actually exist.
+
+
+2)	Jonathan
+
+	MAKSYM
+	1)	Relax sanity check so that only .text needs to be found in
+	  	rombuild.log.
+	2)	Include data files in the output.
+
+
+
+Version 0.01.121
+================
+(Made by Alastair, 4.8.99)
+
+1)	Alastair
+
+	GENERAL
+	1)	Added GROUP\BUILD.TXT which contains a brief explanation of how to build
+		E32TOOLP.
+
+	EFREEZE
+	1)	Fixed problem with 'EXPORTS' not being added to the top of empty frozen
+		.DEF files when freezing for the first time.
+
+	MAKMAKE
+	1)	Fixed problems with RELEASABLES targets in generated makefiles - target
+		paths for bitmaps were being missed out as was the data path for system
+		resources.
+
+	2)	Fixed problem with generating VC6 workspaces for projects incorporating
+		resource files.
+
+	3)	Added some #defines for source code preprocessing (there are no
+		corresponding #defines for .MMP preprocessing for these #defines):
+
+			Platform		#define
+			ARMI			__MARM_ARMI__
+			ARM4			__MARM_ARM4__
+			THUMB			__MARM_THUMB__
+			ARM3			__MARI_ARM3__
+			
+
+	BLDMAKE
+	1)	Removed TESTBATS target - batch files for test programs are now created
+		with "BLDMAKE BLDFILES" if required.
+
+	2)	Added temporary code to include ARMI, ARM4 and THUMB as targets for the
+		new gcc compiler if MARM is specified explicitly as a platform in a
+		BLD.INF file.
+
+	3)	Changed output from BLD -CHECK so that missing releasables are listed to
+		STDERR in the following format
+
+		MISSING: <first missing releasable>
+		MISSING: <second missing releasable>
+		  ...
+
+	4)	Changed "Nothing to do" report so that it is applied on a per-target basis
+		rather than on a per-makefile basis in the makefiles that BLDMAKE creates.
+		This means that the "Nothing to do" message is not produced by BLD -CHECK
+		or BLD -WHAT with projects that don't have any releasables or any test
+		releasables or any exports.
+
+	5)	Changed BLD.PL so that if ALL is specified as the build parameter, then
+		BLD.PL loops round the available builds for the platform making the
+		relevant calls to NMAKE rather than calling NMAKE once with the
+		corresponding ALL target specified.  This means that custom-build
+		makefiles written for use with BLDMAKE will no longer have to attempt to
+		deal with $(CFG)==ALL.
+
+
+
+
+Version 0.01.120
+================
+(Made by Alastair, 2.8.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Added support for the 3 new GCC compiler platforms - ARMI, ARM4 and
+		THUMB.  Also added support for ARM3, which is effectively old MARM 
+		built with the new GCC compiler.  Compatible import libraries are
+		produced as well as the import libraries for the new platform in
+		question - so, for example, if a DLL is built for ARM4 then an ARMI
+		import library will also be produced.
+		ASSP platforms built with the new compiler will build a selection of
+		interworking/plain arm executables depending upon whether ASSPEXPORT or
+		ASSPLIBRARY statements are present in the relevant .MMP files:
+
+					ASSPEXPORT/ASSPLIBRARY		otherwise
+		MAWD		ARM4						ARMI
+		MCGA		ARM4						ARMI
+		MEIG		ARM3						ARM3
+		MISA		ARM4						ARM4
+		MMAD		ARM4						ARMI
+		SCGA		ARM4						ARMI
+		SEIG		ARM3						ARM3
+		SROS		ARM4						ARMI
+
+	2)	Added code so that bitmap headers are only generated into
+		\EPOC32\Include if the contents of the header file have changed.  A
+		change is required to BMCONV so that the generated file name is
+		omittted from the header before this will work properly.
+
+	3)	Removed -REL option.  Now, targets RELEASABLES and RELEASABLES<build>
+		are added to generated makefiles so that
+		 nmake -nologo -s -f <makefile> RELEASABLES will display a list of
+		releasables that a build of the makefile will produce.
+
+	5)	Added new target type, EPOCEXE, for executables within EPOC
+		launchable from the shell.  On the target machine these executables have
+		no exports and are built as EXEs.  In the Emulator, on the other hand,
+		these executables are built as DLLs which export a single function
+			EXPORT_C TInt WinsMain()
+		at ordinal 1, to be called by the "EXE recogniser" when the executable
+		is launched.  Makmake supplies the mangled name of this function at link
+		time so there is no need to specify a .DEF file for these target types
+		under any platform.  EXEDLL is still supported as a separate targettype
+		so that an EXE under EPOC can export functionality to client DLLs, and
+		if no exports are required under EPOC then a dummy function will still
+		have to be exported at least until the new gcc compiler is available.
+
+	6)	"MAKMAKE <project> VC5" is no longer specifiable - VC6 must be specified
+		instead.  VC5 workspaces are still supported and will be created instead
+		of VC6 workspaces if the VC5 version of LINK.EXE is found first in the 
+		system path.
+
+	7)	Changed default first library from E(DLL|EXE).o under MARM and
+		E(DLL|EXE).obj under WINS to E(DLL|EXE).LIB under all platforms.  This
+		change means that building with this version of E32TOOLP requires E32
+		version 195.
+
+	8)	Removed support for NARROW builds - these changes include
+		a)	Removed support for .MMP UID keyword.
+		b)	Only one frozen .DEF file is expected to exist for each DLL|EXEDLL,
+			though the 'U' basename suffix will still be applied unless the
+			NOSTRICTDEF file keyword is specified.
+		c)	The generated .DEF file is now created in the directory above where
+			it used to be - e.g. in \epoc32\build\e32\euser\wins\ rather than
+			\epoc32\build\e32\euser\wins\udeb\.  This means that you can freeze
+			using either build, rather than having to freeze using the debug
+			build under WINS and the release build under MARM.
+		d)	The LIB(UNICODE|NARROW) FREEZE(UNICODE|NARROW) targets have been
+			removed from generated makefiles.
+
+	BLDMAKE
+	1)	Default BLD.INF platforms now depend upon which version of the GCC
+		compiler is in use.  With the old compiler, the platforms are WINS and
+		MARM, with the new, WINS, ARMI, ARM4 and THUMB.
+		If platforms are explicitly listed in the BLD.INF file and both the old
+		and new compilers are being used intermittently then list all the
+		platforms necessary for both compilers in the BLD.INF and Bldmake will
+		silently remove any that aren't appropriate to the compiler in use.
+		Bldmake detects at run-time whether the new compiler is in use, as does
+		Makmake, and changes its behaviour accordingly.
+
+	2)	Added -what option to BLD.PL.  BLD -what <platform> <build> <.MMP base>
+		will now display a list of releasables.  Releasables will not be
+		displayed where .MMP files are listed in the BLD.INF file with the TIDY
+		keyword.  This option replaces BLDMAKE's RELFILES target, which has been
+		removed.  The option requires MAKMAKE to have generated the makefiles
+		for the component since it utilises the new RELEASABLES target in the
+		generated makefiles.
+
+	3)	Added -check option to BLD.PL.
+		BLD -check <platform> <build> <.MMP base> will check that releasables
+		have been created and send a list of those that have not to STDERR.
+
+	4)	Changed BLD -LIB option now that narrow builds are no longer supported.
+		There is no longer a need to specify UNICODE or NARROW as the second
+		parameter, just use BLD -LIB <platform> {<.MMP basename>} instead.
+
+2)	Jonathan
+
+	MAKSYM - Replaces C++ version formerly in e32tools. Changes are: 
+	1)	Added support for GNU ld version 2.9-psion-98r2. Can still parse map
+	  	files produced by ld 2.6.
+	2)	0-length functions/labels are eliminated from the output file. This is 
+	  	probably a defect rather than a feature.
+	3)	The last function in the .text segment has its length calculated
+	  	correctly when using ld 2.9 map files, and fairly correctly when
+	  	using ld 2.6 map files.
+
+
+Version 0.01.113
+================
+(Made by Alastair, 21.7.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Refined checkgcc.pm so that it doesn't object to GCC being installed
+		on a substituted drive under Windows95/98.
+
+	2)	Changed MAKEWORK<build> target in command-line makefiles so that it is
+		depended upon by the RESOURCE<build> target rather than the <build>
+		target so that the work directories are created even if just the
+		RESOURCE<build> target is being created.
+
+	3)	Fixed SGCA platform so that it's ASSP is MCGA rather than MEIG.
+
+	4)	Changed BITMAP keyword .MMP processing so that the order of source
+		bitmaps as specified in the .MMP file is preserved.
+
+
+Version 0.01.112
+================
+(Made by Alastair, 15.7.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Added TARGETPATH statement syntax to START BITMAP ... END blocks.  If a
+		path is specified with this keyword, it will be added to
+		\EPOC32\Release\WINS\<build>\Z\ and act as the location for the target
+		bitmap.  If this statement is not used then the bitmap will be created
+		in the directory specified by the main .MMP TARGETPATH statement as
+		before.
+
+	2)	Changed pre-link step in MSVC makefiles for DLLs so that, rather than
+		having several pre-link step calls to equivalent commands in command-
+		line makefiles, there is one call to nmake on <project>.sup.make, which
+		contains the command-line equivalent commands.  If this nmake call
+		fails, then the export object that these commands might create is
+		deleted so that the second-stage link fails rather that misleadingly 
+		reporting no errors.
+		Also defined $(PATH) in <project>.sup.make so that the path here is the
+		same as the path was when Makmake generated the file - this should solve
+		problems relating to MSVC's strange concept of paths in custom-build
+		steps.
+
+	3)	Added post-build step in MSVC makefiles to create the import library
+		from the frozen .DEF file so that MSVC build behaviour is the same as
+		command-line build behaviour in this respect.
+
+	4)	Changed resource building in MSVC so that most of the work is done in
+		<project>.sup.make rather than in the error-prone custom-build step.
+
+	5)	Added -pipe switch to GCC calls in arm makefiles.  This flag should
+		speed up compilation by having GCC use pipes rather than temporary files
+		to communicate between the various stages of compilation.
+
+	6)	Changed testing of LINK.EXE version number so that a warning about
+		needing MSVC5 Service Pack 3 is not generated when using MSVC6.
+
+	7)	Changed CLEANBUILD targets in WINS command-line makefiles so that
+		incremental linker files in the RELEASE directory are deleted too.
+
+	8)	Re-implemented mechanism for defining macros on the NMAKE command-
+		line using the $(USERDEFS) NMAKE macro due to popular demand.
+
+
+	MAKEDEF
+	1)	Changed warning about frozen exports not being found in the object files
+		into an error so that it stops the build after a new .DEF file is
+		generated.
+
+	2)	Re-organised error and warning reporting so that clicking on the output
+		message in the MSDEV output window will bring up the relevant frozen or
+		generated .DEF file at the appropriate line number.
+
+
+	BLDMAKE
+	1)	Removed terminating backslash from directory name where tests are applied
+		to check that the directory exists, because some older versions of
+		Perl like build 307 can't cope with that.
+
+	2)	Disable check for duplicate platforms specified in BLD.INF files in
+		case bld.inf files #include bld.inf files from sub-components.
+
+	GENERAL
+	1)	Changed system for building E32TOOLP so that it's more Windows95/98
+		friendly.
+
+
+Version 0.01.111
+================
+(Made by Alastair, 12.7.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Added new RESOURCE<build> targets to generated makefiles.
+
+	2)	Added temporary change so that WINC static libraries are built and linked
+		against in directory \EPOC32\Release\WINC rather that
+		\EPOC32\Release\WINS.
+
+
+	BLDMAKE
+	1)	Added option to BLD.PL, -RESOURCE, which will invoke the new RESOURCE<build>
+		targets in Makmake-generated makefiles.  In other words, this option will build
+		just the bitmaps, aifs and resource files for a component and no
+		binaries or import libraries.
+		Any custom-build makefiles incorporated into the Bldmake system with the BLD.INF
+		MAKEFILE keyword will need to add RESOURCE: targets or errors will be reported.
+		
+	2)	Changed default build for BLD.PL with no options specified or the -savespace
+		option specified.  The default used to be DEB for WINS and REL for MARM.
+		It's now ALL whatever the platform.
+
+	3)	Bldmake relfiles command can now handle multiple releasables listed on
+		the same line by Makmake's -rel flag or custom-build makefiles'
+		RELEASABLES target.  The command splits on whitespace unless spaces
+		occur within quotation marks.
+
+
+
+Version 0.01.110
+================
+(Made by Alastair, 6.7.99)
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Generated command-line makefiles now contain comments providing the name
+		of the .MMP file, the target, target type and general target type.
+	2)	Fixed CLEAN targets for resource files so that they now delete XXX.R* 
+		files rather than XXX.R.* files.
+	3)	Updated -REL flag to include releasables for resources, bitmaps and
+		aifs in the list of releasables produced.
+	4)	Changed AIF handling so that colour depth settings and bitmaps are
+		optional parameters rather than mandatory.
+
+
+	BLDMAKE
+	1)	Changed bldmake bldfiles so that a perl file BLD.PL is no longer
+		generated.  Instead, there is just one BLD.PL in \EPOC32\Tools which is
+		invoked by the respective \<project>\group\bld.bat files with a path to
+		the generated bldmake files.  Among these generated files is
+		PLATFORM.PM, which contains information about the platforms that a
+		particular project supports; this module is loaded by BLD.PL at run-
+		time.
+	2)	Fixed erroneous assumption that bld.inf files won't list .MMP files in
+		another top-level directory which was causing makmake and bldmake to
+		disagree about the destination of makefiles generated with the -D switch.
+	3)	Changed BLDMAKE so that it will fail if not called from the directory
+		containing the BLD.INF file.
+	4)	Changed BLDMAKE output directory so that if the BLD.INF directory is not
+		a two-level directory the second-level directory of which is called
+		"GROUP" then the output directory will be
+			\EPOC32\Bldmake\<full-path to BLD.INF file>\ rather than
+			\EPOC32\Bldmake\<first-level directory of BLD.INF path>\.  This is a
+		temporary move to support developers external to Symbian.
+
+	GENERAL
+	1)	Added fetcher definition file, E32TOOLP.FTC, to the group directory.
+
+
+Version 0.01.109
+================
+(Made by Alastair 29.6.99)
+
+WARNINGS
+1)	EBLD commands may be broken by change (11) to MAKMAKE below, if such a
+	command invokes MAKMAKE with the -D switch.
+
+1)	Alastair
+
+	MAKMAKE
+	1)	Updated Cl-arm.pm to be switchable between the current version of the
+		gcc compiler we use and the newer Gcc29.
+	2)	Removed a "t", standing for thumb, from one of the new Gcc29 plain ARM
+		flags.
+	3)	Added CLEANBUILDALL target as a synonym for CLEANBUILD in command-line
+		makefiles.
+	4)	Removed warning about NARROW .DEF files not being found.
+	5)	.MMP files are now included in generated IDE makefiles as source documents
+		by default.  You'll now get a warning if you're already
+		specifying your .MMP files with the DOCUMENT keyword.
+	6)	Added warning when creating Win32 makefiles which appears if MSVC5
+		Service Pack 3 is not installed.
+	7)	Added new .MMP keyword, MACRO, for specifying user-defined macros for
+		source code preprocessing.  Letters in MACROS will always be upper-
+		cased.  It's no longer possible to define macros on the NMAKE command-
+		line using the $(USERDEFS) NMAKE macro.
+	8)	.MMP files now support bitmaps.  .MMP syntax is
+			START BITMAP <target>
+			{HEADER}
+			SOURCEPATH	<source path>
+			SOURCE		<colour depth> <list of source .BMP files>
+			END
+		SOURCE and SOURCEPATH statements can be repeated any number of times -
+		the directory specified with the SOURCEPATH statement will apply for all
+		subsequent SOURCE statements.  There is no support for localisation of
+		bitmaps.  Colour and black-and-white bitmaps should be specified as
+		separate entities.  There is currently no support for building bitmaps
+		within the MSVC IDE.
+		A lot of source files appear to incorrectly user #include generated
+		headers rather that system #include them with angle brackets.
+	9)	.MMP files now support application information files.  .MMP syntax is
+			AIF	<target> <source path> <resource> \
+				<colour depth> <list of source .BMP files>
+		Colour and black-and-white .AIF files should be specified as separate
+		entities.  Only one colour depth may be specified for all source .BMP
+		files.  There is no support for localisation of .AIF files and currently
+		no support for building .AIF files within the MSVC IDE.
+	10)	Fixed problem with building resources in the MSVC IDE - include paths
+		for .RSS file preprocessing are now specified relative to the .DSP file
+		rather than relative to the working directory where the command to
+		create the .DSP file was invoked.
+	11)	Changed MAKMAKE -D switch so that makefiles are created in
+		 \EPOC32\Make\<project>\<platform>\ rather than
+		 \EPOC32\Make\<platform>\.  This change is to prevent clashes during
+		overnight builds where different components have .MMP files with the
+		same name.
+	12)	Added --thumb-entry LD.EXE flag for THUMB builds.
+	13)	Changed build and release directories for static libraries so that,
+		for example, static libraries will always build into
+		\EPOC32\Release\MARM... rather than \EPOC32\Release\MAWD.  This change
+		may have to be redressed should code for static libraries need to
+		differ for different ASSPs or between single and multi-process versions
+		of EPOC, though this is not currently the case.
+
+		
+	MAKMAKE & BLDMAKE
+	1)	GENERIC_WINS is now defined for preprocessing of .MMP files and BLD.INF
+		files for platforms WINS and VC5, while GENERIC_MARM is defined for
+		platform MARM - this macro effectively means "just MARM", as opposed to
+		MAWD, MEIG, MISA, etc. all of which define the MARM macro too.
+
+
+	BLDMAKE
+	1)	Updated BLDMAKE.PL with a few of William's suggestions to check for
+		missing/duplicate exported files, create .MAKE files rather than .MAK
+		files and other bits and bobs.  Also,  if the BLD.INF file for your
+		component isn't in a subdirectory called "Group" then BLDMAKE generates
+		it's work files into \EPOC32\Bldmake\<full path to BLD.INF dir>\ rather
+		than \EPOC32\Bldmake\<component>\.
+	2)	Added option -savespace to generated BLD.BAT for building as normal
+		except that if the build is successful then the intermediate files will
+		be deleted from the build directories.
+	3)	Changed "TEST" command-line argument so it needn't be specified before
+		any of the available options, it still needs to be the first of the
+		argments though.
+	4)	Bldmake bldfiles now always creates meta-makefiles for exports, programs
+		and test programs.  If these makefiles have nothing to do when they are
+		invoked they report the fact.
+	5)	Added syntax for specifying custom-build makefiles.  Specify these in
+		the PRJ_MMPFILES section of BLD.INF with keyword MAKEFILE.  All
+		subsequent arguments are the same as for .MMP files.  See
+		\e32toolp\bldmake\egmak.fil for an example custom-build makefile.
+	6)	Changed BLD.BAT help so that it's printed to STDOUT rather than STDERR
+		so that it doesn't scroll off the screen with 'bld |more'.
+	7)	Changed BLDMAKE.PL so that BLD.INF is not preprocessed for VC5 and WINS
+		platforms everytime.
+
+
+	OTHER
+	1)	Removed superseded EVALID.CMD.
+
+Version 0.01.108
+================
+(Made by Alastair, 9.6.99)
+
+This release requires VC5 Service Pack 3 to be installed.
+
+You can tell if VC5 SP3 is installed by typing link without any arguments and 
+checking the version number.  If the version is 5.10.7303 you have SP3 installed.  
+You can get SP3 from directory "\\sentinel-main\ualastrb\VS97_SP3".
+
+EXTRA INFORMATION
+	0)	Some of the changes below have been adjusted so that this version of
+		E32TOOLP will continue to work with projects which depend upon E32
+		version 186 and earlier versions.
+	1)	\EPOC32\LINK\ has been renamed \EPOC32\RELEASE\ for temporary backwards
+		compatability.  The UNICODE sub-directory has been renamed UDEB under
+		WINS and UREL under MARM, the NARROW sub-directory has been renamed DEB
+		under WINS and REL under MARM.
+	2)	Targets will attempt to link to [EDLL|EEXE].o under MARM and
+		[EDLL|EEXE].obj under WINS for the moment.
+	3)	Flag -undef will not yet be used in gcc calls because an extra #define
+		is required in the E32 source code for this to work.
+
+MAKMAKE
+	0)	Renamed zip file in S:\e32toolp\zip\ from E32TOOLP.<ver> to TOOLS.<ver>.
+		The files within this zip file now also have full pathnames so ensure
+		you unzip them into the root of your EPOC drive with any flags required
+		to recreate the directory structure.
+
+	1)	Changed makefiles so that import libraries can be generated separately
+		from dlls, direct from the frozen .DEF file.  Import libraries are now
+		generated into directory \Epoc32\Link\[platform]\[NARROW|UNICODE]\. 
+		nmake /f [makefile] [LIB|LIBUNICODE|LIBNARROW] can be used to generate
+		the import libraries, though the libraries will be generated anyway during
+		command-line builds.  This change means that new exports you add to your
+		component won't appear in the component's import libraries until the new
+		exports are frozen.
+
+	2)	Changed DEFFILE .MMP keyword so that, whether the keyword is used or not,
+		the default .DEF file name, \[project]\B[platform]\[target basename].DEF,
+		will be applied if no other filename is specified.  If a .DEF file does
+		not exist for DLL or EXEDLL targets, warnings will be issued about the 
+		project not being frozen.
+
+	3)	Added new makefile targets to command-line makefiles to make freezing
+		easier - FREEZE, FREEZEUNICODE and FREEZENARROW.  Use
+			nmake /f [makefile] [target]
+		to freeze a component.  The makefile will call perl on EFREEZE.PL to
+		compare the frozen .DEF file, if it exists, with the new one and insert
+		any new exports into the frozen .DEF file.  Once the project has been
+		frozen, regenerate the makefile so that it won't produce warnings and
+		will reference the frozen .DEF file in the right places.  The .MMP file
+		need not be altered to include a DEFFILE statement as with previous
+		versions of E32TOOLP.
+		Use xcopy /e *.def *.frz or a similar command if you wish to back up
+		your .DEF files before freezing.
+		ARM targets will take the new .DEF files from the REL and UREL build
+		directories, while Win32 targets will take the new .DEF files from the
+		DEB and UDEB build directories.
+
+	4)	Changed build directory to
+			\EPOC32\Build\[Project]\[Target basename]\[platform]\[build]\.
+
+	5)	Removed LONGBLDPATH keyword.
+
+	6)	Removed NOBROWSEINFO keyword, which was specific tocommand-line Win32
+		makefiles.
+
+	7)	Removed support for MSVC4 makefiles.
+
+	8)	Remove -CLEAN and -MAKEWORK flags.  Using NMAKE on the clean and makework
+		targets in the generated makefiles to carry out these tasks is more versatile 
+		and more efficient.
+
+	9)	Changed targettype LIB so that it builds static libraries properly.
+		DLLs and EXEs will now link to EDLL.LIB and EEXE.LIB respectively,
+		rather than EDLL.OBJ and EEXE.OBJ.  This change means that components
+		built with this version of E32TOOLP will require the latest version of
+		E32, and won't be able to build using the latest version of E32 and old
+		versions of E32TOOLP.
+
+	10)	Static libraries are now generated into
+		\Epoc32\Link\[platform]\[build]\.
+
+	11)	Added new .MMP keyword, STATICLIBRARY, for specifying that a target
+		links to static libraries.
+
+	12)	Removed OBJECT keyword, for linking a target to pre-compiled objects.
+		This keyword wasn't working under ARM builds anyway. If your project
+		links to pre-compiled objects you can list them as static libraries
+		using the new STATICLIBRARY keyword instead - and preferably get them
+		supplied as static libraries rather than object files.
+
+	13)	Changed VC5 makefiles to use a pre-link command which calls link.exe,
+		dumpbin.exe, makedef.pl, and lib.exe as command-line makefiles do.
+		This should mean that DLLs built in VC5 are generated in exactly the 
+		same way as DLLs built with command-line makefiles, though the import
+		libraries will not be generated.  This procedure also avoids the
+		warnings about exports being defined multiple times.
+
+	14)	Added custom build step for building resources within the VC5 IDE.  This
+		change addresses EDN934964
+		"MAKMAKE should integrate EIKRS as a custom build step".  All resources
+		specified for a project should be compiled automatically for all
+		languages specified.  Strangely, VC5 seems not to be able to find
+		rcomp.exe and fc4bat.exe if these tools are invoked without a path,
+		but has no problems with CPP.EXE - even if no system path to CPP.EXE is
+		set.
+		Unfortunately, if a .RSC file is custom-built within the IDE, MSVC assumes
+		it is a Windows resource file and tries to link it with the main target,
+		which causes an error.  To avoid this problem a change	 has been applied so
+		that, if building a resource file for language SC, the output file as far as
+		MSVC is concerned is a .RSC.dummy file, which is created whenever the .RSC
+		file is created.
+
+	15)	Added new targettypes for some types of polymorphic dll.  These are
+			ANI	- animation dlls
+			CTL - system controls
+			FEP - front end processors
+			MDA - media server plug-ins
+			MDL - mime recognisers
+			OPX - OPL extensions
+			PDL - printer drivers
+			RDL - recognisers
+		If any of these targettypes is specified and no deffile is specified
+		then makmake will ensure the correct functions are exported at ordinal
+		1, and, in some cases, ordinal 2.  Makmake will also put in the correct
+		second uid if no uids are specified.
+
+	16)	If a polymorphic dll of recognised type has the wrong second uid a
+		warning will now be issued.  Note that if such a dll, e.g. an APP,
+		specifies the second uid as zero ("0" or "0x00000000") the correct
+		second uid for that polymorphic dll will be applied.  This is useful
+		when you want makmake to handle the second uid but you want to specify
+		an additional third uid.
+
+	17)	Added command-line flag, /PLAT [platform] which displays platform-
+		specific .MMP file syntax.
+
+	18)	Removed __PSISOFT32__ macro now that we have __SYMBIAN32__ defined for
+		all projects.
+
+	19)	Removed __XCON__ macro which had been defined for __WINC__ builds.
+
+	20)	Default .DEF file directory for __WINC__ .DEF files is now
+		\[project]\BWINS rather than \[project]\BWINC.
+
+	21)	Added new module, E32PLAT.PM, which replaces WINS.PM, MARM.PM, etc,
+		containing data about all the platforms currently supported by Epoc.
+		Current platform defines are now as follows:
+		(all these macros begin and end with a pair of underscores).
+
+		All		__SYMBIAN32__ __PSISOFT32__
+
+		MARM	__GCC32__ __EPOC32__ __MARM__
+		MAWD	__GCC32__ __EPOC32__ __MARM__ __MAWD__
+		MCGA	__GCC32__ __EPOC32__ __MARM__ __MCGA__
+		MEIG	__GCC32__ __EPOC32__ __MARM__ __MEIG__
+		MISA	__GCC32__ __EPOC32__ __MARM__ __MISA__
+		MMAD	__GCC32__ __EPOC32__ __MARM__ __MMAD__
+		SARM	__GCC32__ __EPOC32__ __MARM__          __SINGLE__
+		SEIG	__GCC32__ __EPOC32__ __MARM__ __MEIG__ __SINGLE__
+		SROS	__GCC32__ __EPOC32__ __MARM__ __MROS__ __SINGLE__
+		SCGA	__GCC32__ __EPOC32__ __MARM__ __MCGA__ __SINGLE__
+		MX86	__VC32__  __EPOC32__ __MX86__
+		WINS	__VC32__  __WINS__
+		WINC	__VC32__  __WINS__   __WINC__
+
+		The major change here is that __MARM__ now represents the CPU-type being
+		used while __MAWD__, __MEIG__, etc denote the ASSP (Application Specific
+		Standard Product).  This change will affect few releaseables apart from
+		the base team's, since most people's MARM releaseables should run on
+		all the ARM ASSPs without modification.
+
+	22)	Added new .MMP keyword, ASSPEXPORTS.  If this keyword is specified
+		makmake by default will look for an ASSP-specific deffile rather than a
+		CPU-specific one.  In other words, if you're building EKERN.EXE for MISA
+		and specify ASSPEXPORTS and deffile EKERN.DEF without a path makmake will
+		select a deffile from \E32\BMISA rather than \E32\BMARM.
+
+	23)	Replaced FIRSTOBJECT keyword with FIRSTLIB.  This keyword takes the full
+		name, rather than the basename, of the first library in the link to replace
+		EEXE.LIB or EDLL.LIB.
+
+	24)	Changed MAKMAKE.PL and BLDMAKE.PL so additional .PM modules are searched
+		for in whichever directory in the system path the .PL module is first
+		found, rather than the first /^(\w:)?\\EPOC32\\TOOLS\\?$/io style
+		directory found in the path.
+
+	25)	Added -s flag to first call to linker 'LD' in gcc makefiles.  This option
+		strips symbolic information from the output file and specifying it will
+		speed up linking very slightly.
+
+	26)	Fixed EDN870985 "VC5 should put strings into read-only memory".  By
+		specifying the CL.EXE command-line option /GF strings are pooled and
+		placed in read-only memory, thus EPOC builds are emulated more closely.
+		This change applies for WINC too, and applies for MSVC builds as well as
+		command-line builds.
+
+	27)	Added /List option to makmake command-line.  This option will generate a
+		makefile which will produce assembler code listing files, one for each
+		source file, in the build directory during compilation.  This option is
+		only supported for ARM builds at the moment.  These files will have the
+		extension ".S".
+
+	28)	Added -undef switch to GCC calls in ARM makefiles and to CPP calls
+		during dependency generation.  This switch means 
+		"Do not predefine any nonstandard macros.  (Including architecture flags)."
+
+	29)	Added code to module Platform\Cl_arm.pm to create
+		makefiles compatible with Cygnus' latest release of GCC.
+
+	30)	Added code to replace forward slashes with backslashes in data read from
+		environment variables to assist those running makmake in unix shells.
+
+	31)	Removed CL.EXE flag /Ob1 and LINK.EXE flag /incremental:yes from
+		Win32 makefiles because the respective tools apply these by default.
+
+	32)	\EPOC32\Include\E32uid.h is now searched for LDD and PDD narrow and
+		UNICODE second uid values so there is no need for these values to be
+		updated in Makmake everytime the kernel interface changes.
+		\E32\Inc\E32uid.h is searched instead if PROJECT is specified as E32.
+
+	33)	Removed MAKSYS.PM.  Moved function to apply the, now reduced, number of
+		patches required for building E32 into MAKMAKE.PL.
+
+	34)	Added pseudotarget ALL: to command-line makefiles which will build all
+		variants of a target, DEB, REL, UDEB and UREL.
+
+	35)	Removed IMPLIB targettype for generating import libraries - this targettype
+		should no longer be required now that import libraries can be generated
+		separately.
+
+	36)	Added new flag to makmake, -REL, which will display a list of
+		releasables for a component.  This flag is intended for use by BLDMAKE
+		for generating lists of releasables.
+
+	37)	Added support for building Win32 tools.  The platform name is "TOOLS",
+		and makefiles created using "makmake <.MMP basename> tools" will not
+		link to eexe.obj and will link to the Win32 standard libraries by
+		default.  For examples look at the source for the latest E32TOOLS, which
+		has been converted to use makmake.  EXEs will be copied to
+		\Epoc32\Tools\ once built.
+
+	38)	Added new keyword, ASSPLIBRARY, with the same syntax as LIBRARY
+		statements.  This statement is for specifying a target links to import
+		libraries which differ for different ASSPs.  EKERN.LIB is such a
+		library, which differs between MEIG, MAWD and MISA.  EUSER.LIB, on the
+		other hand, presents the same interface under MEIG, MAWD and MISA though 
+		EUSER.DLL is different under each platform.  This keyword should only
+		need to be used in .MMP files for device drivers.
+
+	39)	If the ASSPEXPORTS keyword is not specified and if a DLL is built under
+		an ASSP platform such as MEIG or MAWD, rather than MARM, then the import
+		library for the DLL will be built into \Epoc32\Link\MARM rather than
+		\Epoc32\Link\MAWD.  This change shouldn't affect any projects outside of
+		the Base team though a side-effect of this change is that WINC import
+		libraries will be created in \Epoc32\Link\WINS - this shouldn't be a
+		problem since WINS and WINC should be binary compatible anyway.
+
+EVALID
+	1)	Fixed EDN704662 "EVALID should change the order of it's logging".
+	2)	Fixed EDN650568 "EVALID wins-lib is no good with VC++6.0".
+	3)	Included William's new improved Evalid - Evalid.bat will be used in
+		preference to Evalid.cmd if invoked "evalid".  I haven't removed
+		superseded Evalid.cmd so that the fixes I've already made are archived.
+
+EFREEZE
+	1)	Added new batch file, EFREEZE.BAT to create frozen
+		.DEF files for the first time or to maintain currently existing frozen
+		.DEF files.  Perl is called on EFREEZE.PL in makmake-generated makefiles
+		to read exports out of the frozen .DEF file and the new .DEF
+		file, check and compare them, and append any new exports to the end
+		of the frozen .DEF file.
+		EFREEZE.BAT syntax is 
+			EFREEZE {-Compare} [frozen .DEF file] [new .DEF file]
+		If the -compare option is specified then the frozen .DEF file will not
+		be changed, but information about differences between the files will be
+		generated as in standard EFREEZE operation.
+
+MAKEDEF
+	1)	Added new perl script, MAKEDEF.PL, which replaces DEFMAKE.EXE and
+		DEFTOOL.EXE from E32TOOLS.  Perl is called on this script in makmake-
+		generated makefiles to reorder exports during a build according to which
+		of these exports are already frozen.  Under Win32 platforms, DUMPBIN is
+		called on the import library generated after the first stage of linking
+		to create a list of exports which MAKEDEF.PL can read.  Under EPOC
+		platforms, DLLTOOL is used to generate an interim .DEF file as before.
+		Generated .DEF files follow the .DEF file layout style used in the .DEF
+		files that DLLTOOL generates for all platforms, even WINS.  This makes a
+		WINDIFF comparison of old frozen .DEF files and .DEF files generated by
+		MAKEDEF difficult, though EFREEZE.BAT can be used to do the comparison
+		instead.  If you change the name/parameters of any exported function in
+		source code then updating the freeze file is slightly tricky since
+		EFREEZE.BAT will refuse to do the comparison because of the missing
+		export in the generated .DEF file, though the new mangled name of the
+		export will still appear as a new export at the end of the generated .DEF
+		file.  Some improvements in this area will follow shortly.
+
+BLDMAKE
+	1)	Just one project file, BLD.INF, is now processed by BLDMAKE, rather
+		than several B[platform].PRJ files.  Use #defines as in .MMP files to 
+		specify that certain releasables should only be built for certain
+		platforms.
+		Type BLDMAKE without any parameters for help.
+		The BLD.INF file for your project should reside in the project's 
+		group directory.
+		Type "BLDMAKE INF" for basic BLD.INF syntax.
+		When "BLDMAKE BLDFILES" is typed, BLD.BAT is created in the project's
+		group directory which will call \EPOC32\Bldmake\<project>\BLD.PL.
+		BLD.PL will make calls to nmake to do it's building.  For each platform
+		supported by the project there will be a makefile in
+		\EPOC32\Bldmake\<project>\ controlling building for that platform.
+		There will be a separate makefile for each platform for any test programs.
+		There will also be a makefile to control the exporting of headers.
+		BLD.BAT syntax is much the same as before, except that PREPARING and
+		CLEANING are controlled by passing parameters -MAKMAKE and -CLEAN
+		respectively rather than using separate batch files.  Building of Import
+		Libraries can be controlled separately by using the -LIB and -CLEANLIB
+		flags.  If build commands are to refer to test programs then "TEST" must
+		be the first parameter specified to BLD.BAT, even if the project only
+		contains test programs - e32test is such a component.
+
+GENERAL
+	1)	Changed MNT.BAT to MNT.CMD so that use can be made of SETLOCAL and
+		ENDLOCAL.
+	2)	Removed all li.prj files - these can now be generated by our CVS system.
+
+
+
+Version 0.01.107
+================
+(Made by Alastair, 17/5/99)
+
+Alastair
+	1)	Made the new import libary-building targets dependent upon .DEF files
+		so that libraries are only built if out-of-date with respect to the .DEF
+		files rather than every time.
+
+
+Version 0.01.106
+================
+(Made by Alastair, 17/5/99)
+
+Alastair
+	1)	Added new targets for building .LIB files directly from .DEF files.
+		Targets are LIB<build> where build is DEB, REL, UDEB or UREL.
+
+
+Version 0.01.105
+================
+(Made by Alastair, 14/5/99)
+
+Alastair
+	1)	Added MCGA.PM and updated MAKSYS.PM (both provided by Simon) for the
+		COGENT port.
+
+
+Version 0.01.100
+================
+(Made by Alastair, 1.2.99)
+
+GENERAL
+	1)	Boiler-plated source.
+	2)	Replaced hard-coded R: with %s% in MNT.BAT.
+
+
+Version 0.01.099
+================
+(Made by Alastair, 21.12.98)
+
+MAKMAKE
+	1)	Changed narrow and unicode second UID defaults for LDD targettypes,
+		following corresponding changes to E32 version 159.
+
+
+Version 0.01.098
+================
+(Made by Alastair, 27.11.98)
+
+GENERAL
+	1)	Added EBLD.BAT, previously released as part of EIKTOOLS, to E32TOOLP's
+		releasables.
+
+MAKMAKE
+	1)	Makmake now creates \Epoc32\Release\Wins\App.def when creating a VC4 or
+		VC5 makefile for an app, and does similar things for LDD and PDD
+		targettypes.
+	2)	New file system target, FSY, incorporated, which automates the second uid
+		and the first ordinal export for file system builds in the same way this
+		is accomplished for other supported polymorphic dll targettypes.
+	3)	Added new .MMP keyword, EPOCFIXEDPROCESS, which will pass on the -fixed
+		switch to petran.
+	4)	Removed /LANG command-line flag which used to allow a language to be
+		specified on the command-line.
+	5)	Changed LANG .MMP keyword so that it can take a list of languages, so
+		a resource file will be compiled multiple times, once for each language
+		specified.  If no language lists are specified the language list will
+		default to just SC.  Fixes Epoc S/W problem 228,
+			"mmp fileas doesn't allow compiling 2 language variants".
+	6)	Added extra build stage for command-line wins builds which calls lib.exe
+		to generate an import library and export object from the dll's deffile
+		created by defmake.  The VC5 linker running with Service pack 3 will now
+		no longer produce warnings about multiple exports - though you'll still 
+		get them if you build within the VC5 IDE.
+	7)	RESOURCE and SYSTEMRESOURCE keywords can now take a list of resources.
+		This fixes Epoc S/W problem 300,
+			"Makmake should support multiple resource files".
+		Each resource file will be built for each language specified.
+	8)	Added warnings if duplicate sources, languages, systeminclude paths,
+		userinclude paths, resources or libraries are specified in .MMP files.
+		The duplicates are not listed in the makefile.
+		This fixes Epoc S/W problem 366
+			"MAKMAKE doesn't spot duplicate SOURCE files".
+	9)	Added SROS.PM from Malcolm, and updated MAKSYS.PM accordingly.
+	10)	Changed CL_WIN.PM so that the preprocessing stage for resource files in
+		command-line WINS makefiles always lists the directory containing the
+		source as the first user include directory.  This was an omission from 
+		change #3 in E32TOOLP version 097.
+
+BLDMAKE
+	1)	Created batch files, except those in the group directory, are now
+		created in directory \Epoc32\Bldmake\<project>\<platform>\ rather than in
+		the \<project>\B<plat>\ directories.
+	2)	Batch files created in the group directory are set to be read-only.
+
+
+Version 0.01.097
+================
+(Made by Alastair, 12.11.98)
+
+MAKMAKE
+	1)	VC5 .dsw generated files are no longer all hardwired to point to
+		Euser.dsp.
+	2)	Removed RELGDB configuration for ARM builds.
+	3)	Fixed Epoc S/W problem 277 -
+		'Cannot specify "current directory" as a USERINCLUDE path in MAKMAKE'.
+		The directory containing the source file is now always searched for
+		user-included dependencies (thats #include "<dep>").  This brings
+		dependency-generation by MAKMAKE and MARM makefiles into line with WINS
+		makefiles, where CL.EXE has always searched the directory containing the
+		source (except for the fact that CL.EXE makes no user/system
+		distinction).
+	4)	__SYMBIAN32__ is now defined for all builds.  __PSISOFT32__ is still
+		defined for backward compatibility.
+	5)	New keyword, FIRSTOBJECT, which takes the base name of an object to
+		replace EEXE or EDLL as the first object to be linked.
+	6)	Removed change to link some functions in EKERN by name rather than by
+		ordinal.
+	7)	Fixed Epoc S/W problem 216 - "MAKMAKE's "clean" targets are noisy".
+		Clean targets are now silent (under Windows_NT, at least).
+	8)	Changed the directory which MAKMAKE searches for it's .PM modules to be the
+		first /^(\w:)?\\EPOC32\\TOOLS\\?$/io style directory found in the path
+		environment variable, rather than assuming \EPOC32\TOOLS\ unless
+		<drive>:\EPOC32\TOOLS exists in the path.  
+	9)	Added \E32TOOLP\E32UTIL\Checkgcc.pm, which checks that the first executable
+		version of CPP found in the system path is CPP.EXE and is found in a
+		/^(\w:)?\\EPOC32\\GCC\\BIN\\?$/io style directory.
+	10)	Removed SARMBE.PM, and big-endian hacks from CL_ARM.PM.
+
+BLDMAKE
+	1)	Fix to make sure WINC release directories are created before WINS
+		releaseables that WINC uses are copied across.
+	2)	Change to make sure VC5 batch files are created by bldmake all.
+	3)	OS environment variable is now checked, and output redirection to log
+		files is only attempted if the OS is set to Windows_NT so that bldmake-
+		generated batch files are Windows95 friendly.
+	4)	Warning put in batch files to the effect that bldmake has generated the
+		file and it shouldn't be edited.
+
+
+Version 0.01.096
+================
+(Made by Alastair, 26.10.98)
+
+MAKMAKE
+	1)	No longer carrying out the autouid keyword behaviour for targettypes LIB
+		and IMPLIB.
+	2)	Fixed bug whereby if an EXEDLL target is specified with a lower-
+		case .exe extension the extension wouldn't be changed to .dll for WINS
+		builds.
+
+Version 0.01.095
+================
+(Made by Alastair, 22.10.98)
+
+GENERAL
+	1)	Symbianised Perl source files.
+
+MAKMAKE
+	1)	Added code to handle forward slash file separator which is used in
+		filenames returned by function "cwd" from library Cwd.pm in perl
+		versions 5.005+.  Fixes Epoc S/W problem SW1-215.
+	2)	EXEDLL targets specified without an extension will have the correct extension
+		(.DLL or .EXE) added depending whether the makefile is for a single or
+		multi-process build.
+		Fixes Epoc Software Problem SW1-11.
+	3)	VC5 module now creates .DSW file to save a couple of clicks in the MSVC5
+		workspace.
+	4)	Removed 'D' basename suffix for debug deffiles, both those makmake
+		references as 'freeze' files and those it creates, under all platforms.
+		MARM debug and release builds should already be interoperable, this
+		change is designed to "encourage" the interoperability of WINS debug and
+		release builds, starting with E32.
+	5)	Added new keyword, UNICODEUID, to be used for the specification of
+		second and third unicode uids.  A warning will be generated and no
+		unicode targets provided in the makefile if a second ascii uid is
+		specified but a second unicode uid isn't.
+	6)	Made WINS AUTOUID keyword behaviour compulsory, so every WINS project
+		gets the UIDs it specifies in the .MMP compiled into WINS automatically.
+		This means that current users of the AUTOUID keyword will need to remove
+		it from their .MMP files to avoid a warning.  Those Luddites not
+		already using this keyword will have to remove the #pragma data_seg(".E32_UID")
+ 		section used to specify WINS uids from their code if their project is to link
+		correctly.
+	7)	Added new keyword, EPOCPROCESSPRIORITY, for the specification of process
+		priority for executables.  This keyword will be ignored under Win32
+		platforms.  Specify low,background,foreground,high,windowserver,fileserver,
+		realtimeserver or supervisor.  The value specified will be passed to
+		petran via its -priority switch.
+	8)	Fixed Epoc S/W problem 274 
+			"Problems with include paths containing spaces[MAKMAKE]".
+
+EVALID
+	1)	Added William Roberts' updated EVALID.CMD.  Fixes Epoc S/W problem 151 
+		'EVALID does not support "wins-exe"'.
+
+
+Version 0.01.094
+================
+(Made by Alastair, 22.10.98)
+
+BLDMAKE
+	1)	Batch files created by BLDMAKE are now more Windows95-friendly, but will
+		still fall over due to the 2> syntax in these files.
+	2)	Prepare.bat no longer creates any directories - there was never any need
+		to do this since MAKMAKE did it anyway.
+
+
+Version 0.01.093
+================
+(Made by Petteri, 14.07.98)
+
+MAKMAKE
+
+1)  Fixed SW1-62. (Unicode flags added for resource files in unicode builds.)
+
+2)  Fixed a problem related to capitalisation of filenames when analysing
+    dependencies. 
+
+EVALID
+
+1)  Integrated Andrew Tholke's validation tool. He writes:
+
+  The basic syntax is
+
+  EVALID type file1 file2
+
+  where type specifies the object type, and is one of:
+
+  text, binary
+  wins-dll, wins-lib
+  marm-dll, marm-exe, marm-lib, marm-map
+
+  and file1 and file2 are the two files to be compared, e.g.
+ 
+  evalid marm-dll edbms.dll \epoc32\release\marm\rel\edbms.dll
+
+  EVALID defaults to appending its output to the file .\evalid.lis. 
+  Prior to validating a component set, this file should be deleted. 
+  To force the output to the console, the "-c" switch should be specified before the type, e.g.
+
+  evalid -c wins-lib edbms.lib \epoc32\release\wins\deb\edbms.lib
+
+  To direct the output to a different logfile "-l <logfile>" should be used before the type, e.g.
+
+  evalid -l valid.log marm-map edbms.map \epoc32\release\marm\rel\edbms.map
+
+
+Version 0.01.092
+================
+(Made by Petteri, 10.06.98)
+
+MAKMAKE
+
+1)  Added a new module MAKSYS.PM which handles various base related exceptions
+    to MAKMAKE rules.
+
+2)  Changed OBJECT keyword to look for the files in the target directory rather 
+    than in the build directory.
+
+3)  For Win95 compatibility 'del file1 file2' commands are no longer used.
+
+4)  EXEDLL UIDs are now correct under WINS.
+
+5)  Extension .mmp can now be included in the MMP-file name when starting MAKMAKE.
+
+6)  Two new platform modules have been added. MAWD is for Windermere architecture
+    and MMAD is for MAD Linda.
+
+7)  Filenames in makefiles are no longer automatically turned upper case. Most of
+    the time the capitalisation used in MMP-files is preserved.
+
+8)  Added a new keyword EPOCHEAPSIZE. It can be used to set the minimum and
+    maximum size of the heap in ARM builds.
+
+9)  The following keywords have been moved out of the START MARM ... END block
+    and their names have been changed:
+      ALLOWDLLDATA       is now EPOCALLOWDLLDATA
+      CALLDLLENTRYPOINTS        EPOCCALLDLLENTRYPOINTS
+      DATALINKADDRESS           EPOCDATALINKADDRESS
+      STACKSIZE                 EPOCSTACKSIZE
+
+
+Version 0.01.091
+================
+(Made by Alastair, 18th February, 1998)
+
+This new component contains perl programs that were previously
+contained in component E32TOOLS.  Currently E32TOOLP contains
+MAKMAKE and BLDMAKE which will be removed from the next release
+of E32TOOLS.
+
+Changes from programs in E32TOOLS(090)
+
+MAKMAKE
+
+1)  Added -u flag for calls to rcomp in command-line unicode builds so that
+    the resource file is built with wide strings.
+
+2)  Added new START MARM .. END block keyword, CALLDLLENTRYPOINTS, which will
+    suppress the passing of flag -nocall to PETRAN.  This keyword takes
+    no parameters.
+
+3)  Added new LINKAS keyword. This keyword is platform-independent and replaces
+    the platform-specific START MARM .. END block keyword DLLNAME.  Use LINKAS
+    to specify the full name of the dll you are building if that name is to be
+    different from the name specified by the TARGET keyword for linking
+    purposes.  This keyword currently has no effect for Win32 platforms.  For
+    MARM platforms, the name specified will have the third uid for the executable
+    inserted before its extension and will then be passed to PETRAN as a parameter
+    for the -dllname flag.
+
+4)  For EXEDLL targettypes, if the name specified with the TARGET keyword has
+    the extension .EXE, this will be changed to .DLL within single-process
+    platform makefiles such as WINS makefiles.
+
+5)  For EXEDLL targettypes, extension changes will be applied to names specified
+    with the LINKAS keyword as they are for names specified with the TARGET keyword.
+    So, for single-process platforms (eg WINS), .EXE extensions will become .DLL, and
+    for multi-process platforms (eg MARM), the extension .EXE will be applied whatever
+    extension is specified for the name in the MMPFILE.
+  
+7)  Added new module, OUTPUT.PM, to enable MAKMAKE to wrap long lines neatly
+    within makefiles where appropriate.
+
+8)  Renamed E32TVER.PM E32TPVER.PM.
+
+9)  Changed header information on all files to
+    # Copyright (c) 1998 Psion Software plc
+    # All rights reserved
+
+
+BLDMAKE
+
+1)  Changed BLDMAKE's batch file so it doesn't produce the help for the 'CALL'
+    batch file command if invoked BLDMAKE /?.
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/setupprj.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,542 @@
+@REM Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).
+@REM All rights reserved.
+@REM This component and the accompanying materials are made available
+@REM under the terms of "Eclipse Public License v1.0"
+@REM which accompanies this distribution, and is available
+@REM at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@REM
+@REM Initial Contributors:
+@REM Nokia Corporation - initial contribution.
+@REM 
+@REM Contributors:
+@REM
+@REM Description:
+@REM builds bld.bat files for subprojects within this component
+
+@if exist %0.bat perl -w -x %0.bat %1 %2 %3 %4 %5
+@if exist %0 perl -w -x %0 %1 %2 %3 %4 %5
+@GOTO End
+
+#!perl
+
+use strict;
+use Cwd;
+
+my $EPOCRoot;
+
+BEGIN {
+	$EPOCRoot = $ENV{EPOCROOT};
+	$EPOCRoot .= "\\" unless($EPOCRoot =~ /\\$/);
+	die "ERROR: Must set the EPOCROOT environment variable\n" if (!defined($EPOCRoot));
+	$EPOCRoot =~ s-/-\\-go;	# for those working with UNIX shells
+	die "ERROR: EPOCROOT must not be a UNC path\n" if ($EPOCRoot =~ /^\\\\/);
+	die "ERROR: EPOCROOT must end with a backslash\n" if ($EPOCRoot !~ /\\$/);
+	die "ERROR: EPOCROOT must specify an existing directory\n" if (!-d $EPOCRoot);
+}
+
+
+my $EPOCToolsPath="${EPOCRoot}epoc32\\tools";
+
+my $EPOCToolsConfigFilePath="${EPOCRoot}epoc32\\tools\\compilation_config";
+
+my $DocsPath="${EPOCRoot}epoc32\\EngDoc\\E32toolp";
+
+my $TemplateFilePath="${EPOCRoot}epoc32\\tools\\makefile_templates";
+
+my $ShellFilePath="${EPOCRoot}epoc32\\tools\\shell";
+
+my $BinFilePath="${EPOCRoot}epoc32\\tools";
+
+if (scalar @ARGV > 1) {
+	die "Too many arguments for setupprj.bat\n";
+}
+
+# only the secure platform is now supported, but keep the argument
+# checking as insurance against future developments.
+#
+my $secure = 1;
+if (scalar @ARGV == 1) {
+	my $option = $ARGV[0];
+	if ($option !~ /^secure$/i) {
+		die "Unknown option $ARGV[0] - did you mean \"secure\"?\n";
+	}
+}
+
+my $GroupDir=$0;  # $0 is this script
+$GroupDir=~s-^\w:(.*)$-$1-o;  # remove drive letter
+$GroupDir=~s-\/-\\-go;
+unless ($GroupDir=~m-^\\-o)
+	{
+	# $GroupDir is relative
+	my $Cwd=cwd();
+	$Cwd=~s-^\w:(.*)$-$1-o;  # remove drive letter
+	$Cwd=~s-\/-\\-go;
+	$Cwd=~s-^\\$--o;  # make sure we don't end in a backslash
+	$GroupDir="$Cwd\\$GroupDir";  # append relative group dir to absolute Cwd
+	}
+$GroupDir=~s-^(.*\\)[^\\]+$-$1-o; # remove filename, leaving just path
+# strip the resulting path of excess occurrences of . and ..
+while ($GroupDir=~s-\\\.\\-\\-go) { }
+while ($GroupDir=~s-\\(?!\.{2}\\)[^\\]*\\\.{2}(?=\\)--go) { }
+
+$GroupDir=~s-\\$--o;	# remove trailing backslash
+chdir "$GroupDir" or die "Can't cd to $GroupDir: $!\n";
+
+my %Files=();
+
+# read the component
+opendir E32TOOLP, ".." or die "ERROR: Can't open dir ..\n";
+my $SubDir;
+foreach $SubDir (grep /^[^\.]/o, map lc $_, readdir E32TOOLP) {
+	if ($SubDir!~/^(group|doc|test|binutils|maksym)$/o) {
+		opendir SUBDIR, "..\\$SubDir" or die "ERROR: Can't open dir \"..\\$SubDir\"\n";
+		my @FileList = map lc $_, readdir SUBDIR;
+		foreach my $file (grep /^[^_\.].+\.(pm|pl|bat|cmd|config|bsf|xml|cwlink|txt)$/o, @FileList) {
+			$Files{$file} = "$SubDir\\$file";
+		}
+		if ($secure) {
+			# Look for additional files whose names start with _secure_
+			my @securefiles = grep /^_secure_.+\.(pm|pl|bat|cmd|config|bsf|xml|cwlink|txt)$/o, @FileList;
+			foreach my $file (@securefiles) {
+				my $dstfile = $file;
+				$dstfile =~ s/^_secure_//;
+				if (defined($Files{$dstfile})) {
+					print "$dstfile: $SubDir\\$file overrides $Files{$dstfile}\n";
+				}
+				$Files{$dstfile} = "$SubDir\\$file";
+			}
+		}
+	}
+}
+
+# read the compiler configuration files
+my @ConfigFiles;
+
+opendir CONFIGDIR, "..\\platform" or die "ERROR: Can't open dir \"..\\platform\"\n";
+@ConfigFiles = grep /\.(mk|make)/i, readdir CONFIGDIR;
+
+closedir CONFIGDIR;
+
+opendir SUBDIR, "..\\doc" or die "ERROR: Can't open dir \"..\\doc\"\n";
+my @Docs = map lc $_, readdir SUBDIR;
+@Docs = grep /^[^\.].+\.(rtf|doc|changes|txt|html|htm)$/o, @Docs;
+	
+closedir SUBDIR;	
+
+open TEMPLATEFILESUBDIR, "\"dir \/s \/b \/a-d ..\\..\\buildsystem\\extension\" |";
+my @TemplateFiles=();
+my %TemplateDirs;
+while (<TEMPLATEFILESUBDIR>)
+	{
+	next if ($_ !~ /\.(mk|meta)$/i);	
+	$_ =~ s/^.*\\buildsystem\\extension\\//i;
+	chomp $_;
+	push @TemplateFiles, $_;
+	$_ =~ /^(.*\\)/o;
+	my $path = $1;
+	$path =~ s/\\$//;
+	$TemplateDirs{$path}=1;	
+	}
+close TEMPLATEFILESUBDIR;
+
+opendir SHELLFILESUBDIR, "..\\..\\buildsystem\\shell" or die "ERROR: Can't open dir \"..\\..\\buildsystem\\shell\"\n";
+my @ShellFiles = map lc $_, readdir SHELLFILESUBDIR;
+@ShellFiles = grep /^[^\.].+\.(mk)$/o, @ShellFiles;
+closedir SHELLFILESUBDIR;
+
+open BINFILESUBDIR, "\"dir \/s \/b \/a-d ..\\..\\buildsystem\\bin\" |";
+my @BinFiles=();
+my %BinDirs;
+while (<BINFILESUBDIR>)
+    	{
+    	next if ($_ !~ /\.(exe|jar)$/i);	
+    	$_ =~ s/^.*\\buildsystem\\bin\\//i;
+    	chomp $_;
+    	push @BinFiles, $_;
+    	$_ =~ /^(.*\\)/o;
+    	my $path = $1;
+    	$path =~ s/\\$//;
+    	$BinDirs{$path}=1;	
+    	}
+close BINFILESUBDIR;
+
+my $PrintGroupDir=$GroupDir;
+$PrintGroupDir=~s-\\-\\\\-go;
+
+# Create BLD.BAT
+my $OutTxt='';
+&Output(
+	"\@echo off\n",
+	"\@goto invoke\n",
+	"\n",
+	"#!perl\n",
+	"unless (\@ARGV==1 && \$ARGV[0]=~/^(deb|rel|clean|releasables)\$/io) {\n",
+	"	die\n",
+	"		\"E32TOOLP's bld.bat - usage\\n\",\n",
+	"		\"BLD [param]\\n\",\n",
+	"		\"where\\n\",\n",
+	"		\"param = DEB or REL or CLEAN\\n\"\n",
+	"	;\n",
+	"}\n",
+	"my \$Param=lc \$ARGV[0];\n",
+	"chdir \"$PrintGroupDir\";\n",
+	"if (\$Param =~ /releasables/i)\n",
+	"{\n",
+	"open PIPE, \"..\\\\..\\\\make-abld\\\\make -s -f e32toolp.make \$Param |\" or die \"Can't invoke make: \$!\\n\";\n",
+	"while (<PIPE>) { print \$_; }\n",
+	"close PIPE;\n",
+	"\n",
+	"exit;\n",
+	"}\n",
+	"print \"..\\\\..\\\\make-abld\\\\make -s -f e32toolp.make \$Param\\n\";\n",
+	"open PIPE, \"..\\\\..\\\\make-abld\\\\make -s -f e32toolp.make \$Param |\" or die \"Can't invoke make: \$!\\n\";\n",
+	"while (<PIPE>) { }\n",
+	"close PIPE;\n",
+	"\n",
+	"__END__\n",
+	"\n",
+	":invoke\n",
+	"perl -x $GroupDir\\bld.bat %1 %2\n"
+);
+	
+my $BLDFILE='bld.bat';
+print "Creating File \"$BLDFILE\"\n";
+open BLDFILE,">$BLDFILE" or die "\nERROR: Can't open or create Batch file \"$BLDFILE\"\n";
+print BLDFILE "$OutTxt" or die "\nERROR: Can't write output to Batch file \"$BLDFILE\"\n";
+close BLDFILE or die "\nERROR: Can't close Batch file \"$BLDFILE\"\n";
+
+
+# Create the make file
+$OutTxt='';
+&Output(
+	"\n",
+	"ifeq (\$(OS),Windows_NT)\n",
+	"ERASE = \@erase 2>>nul\n",
+	"else\n",
+	"ERASE = \@erase\n",
+	"endif\n",
+	"\n",
+	"\n",
+	"$EPOCToolsPath :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $EPOCToolsPath\n", 
+	"\n",
+	"$TemplateFilePath :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $TemplateFilePath\n", 
+	"\n"
+);
+
+foreach (sort keys %TemplateDirs) {
+	&Output(
+	"$TemplateFilePath\\$_ :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $TemplateFilePath\\$_\n", 
+	"\n"
+	);
+}
+
+foreach (sort keys %BinDirs) {
+ 	&Output(
+ 	"$BinFilePath\\$_ :\n",
+ 	"\t\@perl -w ..\\genutil\\emkdir.pl $BinFilePath\\$_\n", 
+ 	"\n"
+ 	);
+}
+
+&Output(
+	"$ShellFilePath :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $ShellFilePath\n", 
+	"\n",
+	"$EPOCToolsConfigFilePath :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $EPOCToolsConfigFilePath\n", 
+	"\n",
+	"$DocsPath :\n",
+	"\t\@perl -w ..\\genutil\\emkdir.pl $DocsPath\n", 
+	"\n",
+	"\n",
+	"deb : $EPOCToolsPath $EPOCToolsConfigFilePath $DocsPath $TemplateFilePath $ShellFilePath "
+);
+
+foreach (sort keys %TemplateDirs) {
+	&Output(
+	"$TemplateFilePath\\$_ "
+	);
+}
+
+foreach (sort keys %BinDirs) {
+ 	&Output(
+ 	"$BinFilePath\\$_ "
+ 	);
+}
+
+&Output("\n");
+
+my $File;
+foreach $File (keys %Files) {
+	&Output(
+		"\tcopy \"..\\$Files{$File}\" \"$EPOCToolsPath\\$File\" >nul\n"
+	);
+}
+
+my $ConfigFile;
+foreach $ConfigFile (@ConfigFiles) {
+	&Output(
+		"\tcopy \"..\\platform\\$ConfigFile\" \"$EPOCToolsConfigFilePath\\$ConfigFile\" >nul\n"
+	);
+}
+
+foreach $File (@Docs) {
+	&Output(
+			"\tcopy \"..\\doc\\$File\" \"$DocsPath\\$File\" >nul\n"
+	);
+}
+
+my $tfile;
+foreach $tfile (@TemplateFiles) {
+	&Output(
+			"\tcopy \"..\\..\\buildsystem\\extension\\$tfile\" \"$TemplateFilePath\\$tfile\" >nul\n"
+	);
+}
+
+my $bfile;
+foreach $bfile (@BinFiles) {
+ 	&Output(
+ 			"\tcopy \"..\\..\\buildsystem\\bin\\$bfile\" \"$BinFilePath\\$bfile\" >nul\n"
+ 	);
+}
+
+my $sfile;
+foreach $sfile (@ShellFiles) {
+	&Output(
+			"\tcopy \"..\\..\\buildsystem\\shell\\$sfile\" \"$ShellFilePath\\$sfile\" >nul\n"
+	);
+}
+
+&Output(
+	"\n",
+	"\n",
+	"rel : $EPOCToolsPath $EPOCToolsConfigFilePath $DocsPath $TemplateFilePath $ShellFilePath "
+);
+
+foreach (sort keys %TemplateDirs) {
+	&Output(
+	"$TemplateFilePath\\$_ "
+	);
+}
+
+foreach (sort keys %BinDirs) {
+ 	&Output(
+ 	"$BinFilePath\\$_ "
+ 	);
+}
+
+&Output("\n");
+
+	
+foreach $File (keys %Files) {
+	&Output(
+		"\t.\\perlprep.bat \"..\\$Files{$File}\" \"$EPOCToolsPath\\$File\"\n"
+	);
+}
+
+foreach $ConfigFile (@ConfigFiles) {
+	&Output(
+		"\tcopy \"..\\platform\\$ConfigFile\" \"$EPOCToolsConfigFilePath\\$ConfigFile\" >nul\n"
+	);
+}
+
+foreach $File (@Docs) {
+	&Output(
+			"\tcopy \"..\\doc\\$File\" \"$DocsPath\\$File\" >nul\n"
+	);
+}
+
+foreach $tfile (@TemplateFiles) {
+	&Output(
+			"\tcopy \"..\\..\\buildsystem\\extension\\$tfile\" \"$TemplateFilePath\\$tfile\" >nul\n"
+	);
+}
+foreach $bfile (@BinFiles) {
+ 	&Output(
+ 			"\tcopy \"..\\..\\buildsystem\\bin\\$bfile\" \"$BinFilePath\\$bfile\" >nul\n"
+ 	);
+}
+foreach $sfile (@ShellFiles) {
+	&Output(
+			"\tcopy \"..\\..\\buildsystem\\shell\\$sfile\" \"$ShellFilePath\\$sfile\" >nul\n"
+	);
+}
+&Output(
+	"\n",
+	"rel deb : $EPOCToolsPath\\make.exe\n",
+	"$EPOCToolsPath\\make.exe: ..\\..\\make-abld\\make.exe\n",
+	"\tcopy \$\? \$\@\n"
+);
+
+&Output(
+	"\n",
+	"rel deb : $EPOCToolsPath\\scpp.exe\n",
+	"$EPOCToolsPath\\scpp.exe: ..\\..\\scpp-abld\\scpp.exe\n",
+	"\tcopy \$\? \$\@\n"
+);
+
+
+&Output(
+	"\n",
+	"clean :\n"
+);
+foreach $File (keys %Files) {
+	&Output(
+		"\t-\$(ERASE) \"$EPOCToolsPath\\$File\"\n"
+	);
+}
+foreach $ConfigFile (@ConfigFiles) {
+	&Output(
+		"\t-\$(ERASE) \"$EPOCToolsConfigFilePath\\$ConfigFile\"\n"
+	);
+}
+foreach $File (@Docs) {
+	&Output(
+			"\t-\$(ERASE) \"$DocsPath\\$File\"\n"
+	);
+}
+foreach $tfile (@TemplateFiles) {
+	&Output(
+			"\t-\$(ERASE) \"$TemplateFilePath\\$tfile\"\n"
+	);
+}
+foreach $bfile (@BinFiles) {
+ 	&Output(
+ 			"\t-\$(ERASE) \"$BinFilePath\\$bfile\"\n"
+ 	);
+}
+foreach $sfile (@ShellFiles) {
+	&Output(
+			"\t-\$(ERASE) \"$ShellFilePath\\$sfile\"\n"
+	);
+}
+
+&Output(
+	"\n",
+	"releasables :\n"
+);
+foreach $File (keys %Files) {
+	&Output(
+		"\t\@echo $EPOCToolsPath\\$File\n"
+	);
+}
+foreach $ConfigFile (@ConfigFiles) {
+	&Output(
+		"\t\@echo $EPOCToolsConfigFilePath\\$ConfigFile\n"
+	);
+}
+foreach $File (@Docs) {
+	&Output(
+			"\t\@echo $DocsPath\\$File\n"
+	);
+}
+foreach $tfile (@TemplateFiles) {
+	&Output(
+			"\t\@echo $TemplateFilePath\\$tfile\n"
+	);
+}
+foreach $bfile (@BinFiles) {
+ 	&Output(
+ 			"\t\@echo $BinFilePath\\$bfile\n"
+ 	);
+}
+foreach $sfile (@ShellFiles) {
+	&Output(
+			"\t\@echo $ShellFilePath\\$sfile\n"
+	);
+}
+
+my $MAKEFILE="e32toolp.make";
+print "Creating File \"$MAKEFILE\"\n";
+open MAKEFILE,">$MAKEFILE" or die "\nERROR: Can't open or create Batch file \"$MAKEFILE\"\n";
+print MAKEFILE "$OutTxt" or die "\nERROR: Can't write output to Batch file \"$MAKEFILE\"\n";
+close MAKEFILE or die "\nERROR: Can't close Batch file \"$MAKEFILE\"\n";
+
+
+
+# this code autocreates the .rel file
+
+my @ToolsDst = ("make.exe", "scpp.exe");
+my @DocsDst = @Docs;
+my @ConfigFilesDst = @ConfigFiles;
+my @TemplateFilesDst = @TemplateFiles;
+my @BinFilesDst = @BinFiles;
+my @ShellFilesDst = @ShellFiles;
+
+push @ToolsDst, keys %Files;
+
+# TOOLS.REL file 
+
+my $RELFILE="tools.rel";
+print "Creating File \"$RELFILE\"\n";
+open RELFILE,">$RELFILE" or die "\nERROR: Can't open or create Rel file \"$RELFILE\"\n";
+print RELFILE "${EPOCRoot}epoc32\\tools\\";
+print RELFILE join("\n${EPOCRoot}epoc32\\tools\\", sort @ToolsDst);
+print RELFILE join("\n${EPOCRoot}epoc32\\tools\\compilation_config\\","", sort @ConfigFilesDst);
+print RELFILE join("\n${EPOCRoot}epoc32\\EngDoc\\E32toolp\\","", sort @DocsDst);
+close RELFILE or die "\nERROR: Can't close Rel file \"$RELFILE\"\n";
+
+# Check MRP file - the modern equivalent of tools.rel
+
+my $NewMRPText = "component tools_e32toolp\n";
+$NewMRPText .= "# This file is generated by setupprj.bat\n\n";
+$NewMRPText .= "ipr T\n";
+$NewMRPText .= "ipr O  \\sf\\os\\buildtools\\sbsv1_os\\e32toolp\\binutils\n\n";
+$NewMRPText .= "source \\sf\\os\\buildtools\\sbsv1_os\\e32toolp\n";
+$NewMRPText .= "source \\sf\\os\\buildtools\\toolsandutils\\buildsystem\n";
+$NewMRPText .= join("\nbinary \\epoc32\\tools\\", "",sort @ToolsDst);
+# Don't include EngDoc files in the MRP file
+$NewMRPText .= join("\nbinary \\epoc32\\tools\\compilation_config\\","", sort @ConfigFilesDst);
+$NewMRPText .= join("\nbinary \\epoc32\\tools\\makefile_templates\\","", sort @TemplateFilesDst);
+$NewMRPText .= join("\nbinary \\epoc32\\tools\\","", sort @BinFilesDst);
+$NewMRPText .= join("\nbinary \\epoc32\\tools\\shell\\","", sort @ShellFilesDst);
+$NewMRPText .= "\n\n";
+$NewMRPText .= "notes_source \\component_defs\\release.src\n";
+
+my $MRPFILE="abld.mrp";
+open MRPFILE,"<$MRPFILE" or die "\nERROR: Can't read MRP file \"$MRPFILE\"\n";
+my $OldMRPText = "";
+sysread MRPFILE, $OldMRPText, 100000;	# assumes MRP file is less than 100,000 bytes
+close MRPFILE or die "\nERROR: Can't close MRP file \"$MRPFILE\"\n";
+
+if ($OldMRPText ne $NewMRPText) {
+	print "REMARK: MRP file \"$MRPFILE\" differs from setupprj.bat generated content\n";
+	print "Creating suggested new MRP file \"$MRPFILE.new\"\n";
+	open MRPFILE,">$MRPFILE.new" or die "\nERROR: Can't open or create MRP file \"$MRPFILE.new\"\n";
+	print MRPFILE $NewMRPText;
+	close MRPFILE or die "\nERROR: Can't close MRP file \"$MRPFILE.new\"\n";
+}
+
+
+# SUBROUTINE SECTION
+####################
+sub Output (@) {
+	my $Txt;
+	foreach $Txt (@_) {
+		$OutTxt.=$Txt;
+	}
+}
+
+sub UpToRoot ($) {	#args: $_[0] Abs FilePath/Path
+# return the path that will lead from the directory the path passed into the function
+# specifies back up to the root directory
+	return undef unless $_[0]=~m-^\\-o;
+	my $Path=$_[0];
+	my $UpP;
+	while ($Path=~m-\\-go)
+		{
+		$UpP.="..\\";
+		}
+	undef $Path;
+	$UpP=~s-^(.*)\.\.\\-$1-o;
+	$UpP=".\\" unless $UpP;
+}
+
+
+
+__END__
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/group/setver.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,78 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+goto Invoke
+
+#!perl
+
+#
+# use to set the version in relevant e32toolp files.
+#
+# Add new files requiring this service to the @InputFiles list below.
+#
+# Each file must contain the text to be changed in the form
+# 'version=xxx', where xxx is a 3 digit number.
+#
+
+use strict;
+
+my @InputFiles=qw(
+	\E32TOOLP\E32UTIL\E32TPVER.PM
+);
+	
+die "Usage:\nSETVER [version]\n" unless $#ARGV==0;
+
+my $Version=shift @ARGV;
+
+die "Unexpected version format\n" unless $Version=~/\d{3}/o;
+
+my $FILE;
+foreach $FILE (@InputFiles) {
+	open FILE, $FILE or die "Can't open \"$FILE\": $!\n";
+	my $FileText='';
+	my $Unchanged=1;
+	while (<FILE>) {
+		if ($Unchanged) {
+			$Unchanged=0 if s/^(.*version=)\d{3}([^\d]*.*)$/$1$Version$2/io;
+		}
+		$FileText.=$_;
+	}
+	open FILE,">$FILE" or die "Can't open \"$FILE\": $!\n";
+	print FILE $FileText;
+	close FILE or die "Can't close \"$FILE\": $!\n";
+}
+
+__END__
+
+:Invoke
+@rem command.com is rubbish and does not understand "%*"
+@shift
+@perl -x \E32TOOLP\GROUP\SETVER.BAT %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
+
+
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/kif/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,30 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+
+TOOLS2
+
+PRJ_EXPORTS
+../perl/genkif.pl	/epoc32/tools/genkif.pl
+kif1.xsd	/epoc32/data/kif1.xsd
+
+PRJ_MMPFILES
+
+PRJ_EXTENSIONS
+
+start   extension   tools/kif
+
+end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/kif/group/kif1.xsd	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). All Rights Reserved. 
+-->
+<xsd:schema
+  xmlns:xsd="http://www.w3.org/2001/XMLSchema"
+  xmlns:ki="http://www.symbian.com/kif1"
+  targetNamespace="http://www.symbian.com/kif1">
+	<xsd:element name="kitinfo">
+		<xsd:complexType>
+			<!-- Note I'd like to have used xsd:all here but it's not allowed to contain xsd:any -->
+			<xsd:sequence>
+				<xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+				<xsd:element ref="ki:release"/>
+				<xsd:any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
+			</xsd:sequence>
+			<xsd:attribute name="label" type="xsd:string" use="required"/>	
+		</xsd:complexType>
+	</xsd:element>
+	<xsd:element name="release">
+		<xsd:complexType>
+			<xsd:attribute name="version" type="xsd:string" use="required"/>
+			<xsd:attribute name="build" type="xsd:string" use="required"/>
+		</xsd:complexType>
+	</xsd:element>
+</xsd:schema>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/kif/perl/genkif.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,84 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use XML::Simple;
+use File::Path;
+use File::Copy;
+use Win32::File;
+use Getopt::Long;
+use strict;
+
+my $outfile;
+my $verbose;
+GetOptions("o=s", \$outfile, "v+", \$verbose);
+
+if (!defined $outfile) {
+	die "ERROR: Syntax: genkif.pl -o <kif filename>\n";
+} elsif (-f $outfile) {
+	print STDOUT "REMARK: KIF generation skipped due to it already existing (in '$outfile').\n";
+	exit 0;
+} elsif (-e $outfile) {
+	die "ERROR: KIF output file '$outfile' must not be a directory or other non-file type\n";
+} elsif ($verbose) {
+	print "Got output file of '$outfile'\n";
+}
+
+my $buildnum = $ENV{'BuildNumber'};
+if (!defined $buildnum) {
+	die "ERROR: KIF generation skipped due to the BuildNumber environment variable not being set.\n";
+} elsif ($verbose) {
+	print "Got build number of '$buildnum'\n";
+}
+
+my $namespace = "ki";
+my $nsuri = "http://www.symbian.com/kif1";
+my $schema = "kif1.xsd";
+
+my $build;
+my $version;
+if ($buildnum =~ /^(.*)_Symbian_OS_v(.*)$/) {
+	$build = $1;
+	$version = $2;
+	print "Parsed build number as $build, os version $version\n" if $verbose;
+} else {
+	die "ERROR: Build number '$buildnum' is not a valid build number\n";
+}
+
+# Generate the Kit Information File
+
+print "Constructing the KIF data\n" if $verbose;
+
+my $mapper = new XML::Simple('rootname' => $namespace.':kitinfo', 'searchpath' => '.');
+
+my $hash = {
+	'xsi:schemaLocation' => "$nsuri $schema",
+	"xmlns:".$namespace => $nsuri,
+	'xmlns:xsi' => 'http://www.w3.org/2001/XMLSchema-instance',
+	'label' => $buildnum,
+	$namespace.':release' => {
+		'build' => $build,
+		'version' => $version
+	}
+};
+
+print "Writing the KIF data to '$outfile'\n" if $verbose;
+
+open(my $out, ">$outfile") or die "ERROR: Couldn't open $outfile for writing: $!\n";
+
+print $out $mapper->XMLout($hash, 'xmldecl' => "<?xml version='1.0'?>");
+
+close($out) or die "ERROR: Couldn't write to $outfile".": $!\n";
+
+print "Generated KIF in $outfile\n";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/_secure_trgtype.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,423 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# this package controls target types known to the build system
+# To add new types to the system, simply add an entry to the %Types data structure.
+# Look at the existing types for an appropriate example
+# 
+#
+
+package Trgtype;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Trg_GetL
+	Trg_List
+);
+
+use Genutl;
+
+my %Types=(
+	ANI=>{
+		'Exports'=>{
+			MARM=>['CreateCAnimDllL__Fv'],
+			EABI=>['_Z15CreateCAnimDllLv'],
+			WINS=>['?CreateCAnimDllL@@YAPAVCAnimDll@@XZ'],
+			X86=>['?CreateCAnimDllL@@YAPAVCAnimDll@@XZ'],
+			x86gcc=>['_Z15CreateCAnimDllLv']
+		},
+		UID2=>'0x10003b22',
+	},
+	APP=>{
+		'Exports'=>{
+			MARM=>['NewApplication__Fv'],
+			EABI=>['_Z14NewApplicationv'],
+			WINS=>['?NewApplication@@YAPAVCApaApplication@@XZ'],
+			X86=>['?NewApplication@@YAPAVCApaApplication@@XZ'],
+		},
+		NeedUID3=>1,
+		UID2=>'0x100039ce',
+		Deprecated=>"Convert to EXE",
+	},
+	CTL=>{
+		'Exports'=>{
+			MARM=>['CreateControlL__FRC7TDesC16'],
+			EABI=>['_Z14CreateControlLRK7TDesC16'], 
+			WINS=>['?CreateControlL@@YAXABVTDesC16@@@Z'],
+			X86=>['?CreateControlL@@YAXABVTDesC16@@@Z'],
+		},
+		UID2=>'0x10003a34',
+		Deprecated=>"Convert to application",
+	},
+	DLL=>{
+		NeedDeffile=>1,
+	},	
+	EPOCEXE=>{
+		Basic=>'EXEDLL',
+		'Exports'=>{
+			WINS=>['?WinsMain@@YAHXZ'],
+		},
+	},
+	EXE=>{
+		Basic=>'EXE',
+	},
+	EXEDLL=>{
+		Basic=>'EXEDLL',
+		NeedDeffile=>1,
+	},
+	EXEXP=>{
+		Basic=>'EXE',
+		NeedDeffile=>1,
+	},
+	FSY=>{
+		'Exports'=>{
+			MARM=>['CreateFileSystem'],
+			EABI=>['CreateFileSystem'],
+			WINS=>['CreateFileSystem'],
+			X86=>['CreateFileSystem'],
+			x86gcc=>['CreateFileSystem']
+		},
+		UID2=>'0x100039df',
+	},
+	IMPLIB=>{
+		NeedDeffile=>1,
+		Basic=>'IMPLIB',
+	},	
+	KDLL=>{
+		FirstLib=>'EKLL.LIB',
+#		Kernel=>1,
+		System=>1,
+	},
+	KEXT=>{
+		FirstLib=>'EEXT.LIB',
+#		Kernel=>1,
+		System=>1,
+	},
+	KLIB=>{
+		Basic=>'LIB',
+#		Kernel=>1,
+		System=>1,
+	},
+	LDD=>{
+		FirstLib=>'EDEV.LIB',
+#		Kernel=>1,
+		System=>1,
+		'Exports'=>{
+			MARM=>['CreateLogicalDevice__Fv'],
+			EABI=>['_Z19CreateLogicalDevicev'],
+			WINS=>['?CreateLogicalDevice@@YAPAVDLogicalDevice@@XZ'],
+			X86=>['?CreateLogicalDevice@@YAPAVDLogicalDevice@@XZ'],
+			x86gcc=>['_Z19CreateLogicalDevicev']
+		},
+		UID2=>'0x100000af',
+	},
+	LIB=>{
+		Basic=>'LIB',
+	},
+	ECOMIIC=>{
+		'Exports'=>{
+			MARM=>['ImplementationGroupProxy__FRi'],
+			EABI=>['_Z24ImplementationGroupProxyRi'], 
+			WINS=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z'],
+			X86=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z'],
+		},
+		Path=>'System\Libs\Plugins',
+		UID2=>'0x10009D8D',
+		Deprecated=>"Convert to PLUGIN (ECOM)",
+	},
+	PLUGIN=>{
+		'Exports'=>{
+			MARM=>['ImplementationGroupProxy__FRi'],
+			EABI=>['_Z24ImplementationGroupProxyRi'],
+			WINS=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z'],
+			X86=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy@@AAH@Z'],
+			x86gcc=>['_Z24ImplementationGroupProxyRi']
+		},
+		ResourcePath=>'Resource\Plugins',
+		UID2=>'0x10009D8D',
+	},
+	PLUGIN3=>{
+		'Exports'=>{
+			MARM=>['ImplementationGroupProxy__FRi'],
+			EABI=>['_Z24ImplementationGroupProxyRi'],
+			WINS=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy3@@AAH@Z'],
+			X86=>['?ImplementationGroupProxy@@YAPBUTImplementationProxy3@@AAH@Z'],
+			x86gcc=>['_Z24ImplementationGroupProxyRi']
+		},
+		ResourcePath=>'Resource\Plugins',
+		UID2=>'0x10009D93',
+	},
+	MDA=>{
+		'Exports'=>{
+			MARM=>['NewMediaLibraryL__Fv'],
+			EABI=>['_Z16NewMediaLibraryLv'],
+			WINS=>['?NewMediaLibraryL@@YAPAVCMdaLibrary@@XZ'],
+			X86=>['?NewMediaLibraryL@@YAPAVCMdaLibrary@@XZ'],
+		},
+		UID2=>'0x1000393f',
+		Deprecated=>"Convert to ???",
+	},
+	MDL=>{
+		'Exports'=>{
+			MARM=>['CreateRecognizer__Fv'],
+			EABI=>['_Z16CreateRecognizerv'],
+			WINS=>['?CreateRecognizer@@YAPAVCApaDataRecognizerType@@XZ'],
+			X86=>['?CreateRecognizer@@YAPAVCApaDataRecognizerType@@XZ'],
+		},
+		UID2=>'0x10003a19',
+		Deprecated=>"Convert to PLUGIN (ECOM)",
+	},
+	RDL=>{
+		'Exports'=>{
+			MARM=>['CreateRecognizer__Fv'],
+			EABI=>['_Z16CreateRecognizerv'],
+			WINS=>['?CreateRecognizer@@YAPAVCApaFileRecognizerType@@XZ'],
+		},
+		UID2=>'0x10003a37',
+		Deprecated=>"Convert to PLUGIN (ECOM)",
+	},
+	NOTIFIER=>{
+		'Exports'=>{
+			MARM=>['NotifierArray__Fv'],
+			EABI=>['_Z13NotifierArrayv'],
+			WINS=>['?NotifierArray@@YAPAV?$CArrayPtr@VMEikSrvNotifierBase@@@@XZ'],
+			X86=>['?NotifierArray@@YAPAV?$CArrayPtr@VMEikSrvNotifierBase@@@@XZ'],
+		},
+		Path=>'System\Notifiers',
+		UID2=>'0x10005522',
+		Deprecated=>"Convert to PLUGIN (ECOM)",
+	},
+	NOTIFIER2=>{
+		'Exports'=>{
+			MARM=>['NotifierArray__Fv'],
+			EABI=>['_Z13NotifierArrayv'],
+			WINS=>['?NotifierArray@@YAPAV?$CArrayPtr@VMEikSrvNotifierBase2@@@@XZ'],
+			X86=>['?NotifierArray@@YAPAV?$CArrayPtr@VMEikSrvNotifierBase2@@@@XZ'],
+		},
+		Path=>'System\Notifiers',
+		UID2=>'0x101fdfae',
+		Deprecated=>"Convert to PLUGIN (ECOM)",
+	},
+	TEXTNOTIFIER2=>{
+		'Exports'=>{
+			MARM=>['NotifierArray__Fv'],
+			EABI=>['_Z13NotifierArrayv'],
+			WINS=>['?NotifierArray@@YAPAV?$CArrayPtr@VMNotifierBase2@@@@XZ'],
+			X86=>['?NotifierArray@@YAPAV?$CArrayPtr@VMNotifierBase2@@@@XZ'],
+			x86gcc=>['_Z13NotifierArrayv']
+		},
+		Path=>'System\Notifiers',
+		UID2=>'0x101fe38b',
+		# Not deprecated - the Text Window Server will have AllFiles, 
+		# so it can continue scanning for binaries
+	},
+	PDD=>{
+		FirstLib=>'EDEV.LIB',
+#		Kernel=>1,
+		System=>1,
+		'Exports'=>{
+			MARM=>['CreatePhysicalDevice__Fv'],
+			EABI=>['_Z20CreatePhysicalDevicev'],
+			WINS=>['?CreatePhysicalDevice@@YAPAVDPhysicalDevice@@XZ'],
+			X86=>['?CreatePhysicalDevice@@YAPAVDPhysicalDevice@@XZ'],
+			x86gcc=>['_Z20CreatePhysicalDevicev']
+		},
+		UID2=>'0x100039d0',
+	},
+	PDL=>{
+		'Exports'=>{
+			MARM=>['NewPrinterDeviceL__Fv'],
+			EABI=>['_Z17NewPrinterDeviceLv'],
+			WINS=>['?NewPrinterDeviceL@@YAPAVCPrinterDevice@@XZ'],
+			X86=>['?NewPrinterDeviceL@@YAPAVCPrinterDevice@@XZ'],
+			x86gcc=>['_Z17NewPrinterDeviceLv']
+		},
+		UID2=>'0x10003b1c',
+		ResourcePath=>'Resource\Printers',
+	},
+	STDDLL=>{
+		NeedDeffile=>1,
+		UID2=>'0x20004C45',
+	},
+	STDEXE=>{
+		Basic=>'EXE',
+		UID2=>'0x20004C45',
+	},
+	STDLIB=>{
+		Basic=>'LIB',
+	},
+	VAR=>{
+		'Exports'=>{
+			MARM=>['VariantInitialise__Fv'],
+			EABI=>['_Z17VariantInitialisev'],
+			X86=>['?VariantInitialise@@YAPAVAsic@@XZ'],
+			x86gcc=>['_Z17VariantInitialisev']
+		},
+		FirstLib=>'EVAR.LIB',
+#		Kernel=>1,
+		System=>1,
+	},
+	VAR2=>{
+		'Exports'=>{
+			MARM=>['VariantInitialise'],
+			EABI=>['VariantInitialise'],
+			X86=>['VariantInitialise'],
+			x86gcc=>['VariantInitialise']
+		},
+		FirstLib=>'EVAR.LIB',
+		System=>1,
+	},
+	NONE=>{
+		Basic=>'IMPLIB',
+	},
+);
+
+sub Trg_GetL ($$$) {
+#	takes target type, followed by a ref to a data structure
+#	to fill with exports, second UID and default targetpath, etc.,
+#
+#	dies upon error
+
+	my ($Candidate, $TrgHash_ref)=@_;
+	$Candidate= uc $Candidate;
+
+#	Is type in our list?
+	unless (defined $Types{$Candidate}) {
+		die "ERROR: Target type \"$Candidate\" not supported\n";
+	}
+
+#	Get the data
+	my %TrgHash=%{$Types{$Candidate}};
+
+
+#	Set the defaults
+	$TrgHash{Name}=$Candidate;
+
+	
+	unless ($TrgHash{Basic}) {
+		$TrgHash{Basic}='DLL';
+	}
+
+	unless ($TrgHash{FirstLib}) {
+		$TrgHash{FirstLib}='';
+	}
+
+	unless ($TrgHash{Kernel}) {
+		$TrgHash{Kernel}=0;
+	}
+
+	unless ($TrgHash{System}) {
+		$TrgHash{System}=0;
+	}
+
+	unless ($TrgHash{Exports}{MARM}) {
+		$TrgHash{Exports}{MARM}=[];
+	}
+	else {
+		unless (@{$TrgHash{Exports}{MARM}}<=2) {
+			die "INTERNAL ERROR: Too many MARM exports defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+	unless ($TrgHash{Exports}{EABI}) {
+		$TrgHash{Exports}{EABI}=[];
+	}
+	else {
+		unless (@{$TrgHash{Exports}{EABI}}<=2) {
+			die "INTERNAL ERROR: Too many EABI exports defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+	unless ($TrgHash{Exports}{WINS}) {
+		$TrgHash{Exports}{'WINS'}=[];
+	}
+	else {
+		unless (@{$TrgHash{Exports}{WINS}}<=2) {
+			die "INTERNAL ERROR: Too many WINS exports defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+	unless ($TrgHash{Exports}{X86}) {
+		$TrgHash{Exports}{X86}=[];
+	}
+	else {
+		unless (@{$TrgHash{Exports}{X86}}<=2) {
+			die "INTERNAL ERROR: Too many X86 exports defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+	unless ($TrgHash{Exports}{x86gcc}) {
+		$TrgHash{Exports}{x86gcc}=[];
+	}
+	else {
+		unless (@{$TrgHash{Exports}{x86gcc}}<=2) {
+			die "INTERNAL ERROR: Too many x86gcc exports defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+
+	unless ($TrgHash{NeedDeffile}) {
+		$TrgHash{NeedDeffile}=0;
+	}
+
+	unless ($TrgHash{NeedUID3}) {
+		$TrgHash{NeedUID3}=0;
+	}
+
+	unless ($TrgHash{Path}) {
+		$TrgHash{Path}='';
+	}
+	else {
+		# apply terminating backslash
+		$TrgHash{Path}=~s-^(.*[^\\])$-$1\\-o;
+		# apply Z drive
+		$TrgHash{Path}="Z\\$TrgHash{Path}";
+	}
+
+	unless ($TrgHash{ResourcePath}) {
+		$TrgHash{ResourcePath}='';
+	}
+	else {
+		# apply terminating backslash & Z drive
+		$TrgHash{ResourcePath}=~s-^(.*[^\\])$-Z\\$1\\-o;
+	}
+
+	unless ($TrgHash{UID2}) {
+		$TrgHash{UID2}='';
+	}
+	else {
+		$TrgHash{UID2}=&Genutl_AnyToHex($TrgHash{UID2});
+		unless (defined $TrgHash{UID2}) {
+			die "INTERNAL ERROR: UID2 badly defined for type \"$TrgHash{Name}\" in Trgtype.pm\n";
+		}
+	}
+
+#	Deprecated target warnings
+
+	if ($TrgHash{Deprecated}) {
+		print "MIGRATION_NOTE: type \"$TrgHash{Name}\" is deprecated - $TrgHash{Deprecated}\n";
+	}
+	
+#	Pass the data
+	%{$TrgHash_ref}=%TrgHash;
+}
+
+sub Trg_List () {
+#	returns a list of known poly types
+
+	sort keys %Types;
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/makdeps.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,409 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Module which wraps the dependency information provided the preprocessor when invoked with certain switches
+# so that dependency information rather than preprocessing information is produced.
+# 
+#
+
+package Makdeps;
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Deps_InitL
+	Deps_SetVerbose
+	Deps_SetUserHdrsOnly
+	Deps_SetNoDependencies
+	Deps_SetSysIncPaths
+	Deps_SetUserIncPaths
+	Deps_SetPlatMacros
+	Deps_SetStdIncSysIncPaths
+	Deps_GenDependsL
+	Deps_SetPrefixFile
+	Deps_GetNoDependencies
+	Deps_SetNoDependenciesStatus
+	Deps_GetOSVariantFile
+	Deps_SetOSVariantFile
+);
+
+use Checkgcc;
+use Pathutl;
+use Preprocessor;
+
+
+my $ChopSysDecoyPath;
+my $EPOCIncPath;
+my @StdPaths;
+my %Mode;
+my @PlatMacros;
+my $SysDecoyPath;
+my @SysFlags;
+my @SysPaths;
+my @UserFlags;
+my @UserPaths;
+my $PrefixFileOption = "";
+my $VariantFile=&main::VariantFile();
+
+# special variable used in pattern-matching - special characters nullified
+my $S_SysDecoyPath;
+
+BEGIN {	# NB don't initialise essential items to be provided later by calling module, then will cause errors with undef
+	$Mode{'Verbose'}=0;
+	$Mode{'UserHdrsOnly'}=0;
+	$Mode{'NoDependencies'}=0;
+	@PlatMacros=();
+	# note -MG option assumes missing user headers live in 1st userincpath and missing sys headers in 1st sysdir
+	@SysPaths=();
+	@UserPaths=();
+	@StdPaths=();
+	@SysFlags=();
+	@UserFlags=();
+	# Use random number to ensure DecoyPath is unique (ish)
+	srand();
+	my $randnum=int(rand(100));
+	if (defined $ENV{PBUILDPID}) {
+		$SysDecoyPath=&Path_WorkPath."TEMPMAK$ENV{PBUILDPID}SYSDECOY$randnum\\";
+	} else {
+		$SysDecoyPath=&Path_WorkPath."TEMPMAKSYSDECOY$randnum\\";
+	}
+	$S_SysDecoyPath=quotemeta($SysDecoyPath);
+	$ChopSysDecoyPath=&Path_Chop($SysDecoyPath);
+}
+
+sub Deps_InitL ($@) {	# abs Generated Hdr dir, StdIncsysdir (with drive letter if required)
+# set up a decoy system include path, and set which path will contain generated headers, eg .RSG files, and which
+# paths are the standard system include paths for the compiler used - eg \MSDEV\INCLUDE
+	($EPOCIncPath,@StdPaths)=@_;
+
+# remove the decoy directory then try to make it again - if it contains files rmdir won't work, so mkdir won't
+# work and the user will have to sort it out.  If it doesn't contain files and has been left lying around
+# because someone has killed the program half-way through, then rmdir will remove it and mkdir will work OK
+	rmdir $ChopSysDecoyPath if -d $ChopSysDecoyPath;
+	mkdir $ChopSysDecoyPath,2 or die "ERROR: Can't make temp dir \"$ChopSysDecoyPath\"\nIf it already exists, please remove it\n";
+}
+sub Deps_SetVerbose {
+	$Mode{'Verbose'}=1;
+}
+
+sub Deps_SetUserHdrsOnly {
+# allow calling program to dictate that only listings of user headers, not system headers, be produced
+	$Mode{'UserHdrsOnly'}=1;
+}
+
+sub Deps_SetNoDependencies {
+# Ensure that we do not create a list of dependencies.
+	$Mode{'NoDependencies'}=1;
+}
+
+sub Deps_GetNoDependencies {
+# Get the status of NoDependencies.
+	return $Mode{'NoDependencies'};
+}
+
+sub Deps_SetNoDependenciesStatus($) {
+# Ensure that we do not create a list of dependencies.
+	$Mode{'NoDependencies'}=shift;
+}
+
+sub Deps_GetOSVariantFile() {
+# Return the variant .hrh file currently defined
+	return $VariantFile;
+}
+
+sub Deps_SetOSVariantFile($) {
+# Override the variant .hrh file currently defined
+	$VariantFile=shift;
+}
+
+sub Deps_SetSysIncPaths (@) {	# takes list abs paths
+# set the system include paths where we'll look for system included files, and
+# for user included files if these are not found in the user include directories
+	return unless @_;
+	@SysPaths=@_;
+	@SysFlags=&Path_Chop(@SysPaths); # newer gcc doesn't like trailing backslash
+	@SysFlags=&Path_PrefixWithDriveAndQuote(@SysFlags);
+	my $Flag;
+	foreach $Flag (@SysFlags) {
+		$Flag=~s/^(.*)$/-I $1/o;
+	}
+}
+sub Deps_SetUserIncPaths (@) {	# takes list of abs paths
+# set the user include paths to find user included files in
+	return unless @_;
+	@UserPaths=@_;
+	@UserFlags=&Path_Chop(@UserPaths); # newer gcc doesn't like trailing backslash
+	@UserFlags=&Path_PrefixWithDriveAndQuote(@UserFlags);
+	my $Flag;
+	foreach $Flag (@UserFlags) {
+		$Flag=~s/^(.*)$/-I $1/o;
+	}
+}
+sub Deps_SetPlatMacros (@) {
+# set the macros to be defined by the preprocessor
+	return unless @_;
+	@PlatMacros=@_;
+	my $Flag;
+	foreach $Flag (@PlatMacros) {
+		if($Flag =~ m/\\\"/) { 
+			$Flag =~ s/\\\"/\"/g ; 
+		}
+		$Flag=~s/^(.*)$/-D$1/o;
+	}
+}
+
+sub Deps_SetPrefixFile($) {
+    my ($file) = @_;
+    $PrefixFileOption = " -include $file ";
+}
+
+sub Deps_GenDependsL ($@) {	# takes abs source filepath and list of Build Macros
+
+	if ( $Mode{'NoDependencies'} ) {
+		# no need build a dependency list.
+		return;
+	}
+
+#	Set any more macros the preprocessor needs to be defined for the source file
+#	to be preprocessed.
+#	Call preprocessor and produce the dependency listing.
+
+	my ($Src,@BldMacros)=@_;
+
+	if (not -e $Src) {
+		warn "WARNING: \"",$Src,"\" not found!\n";
+		return;
+	}
+
+# 	Always put the source path at the head of the user path list
+#	and take it out at the end of this function
+	unshift @UserPaths, &Path_Split('Path', lc $Src);
+
+	my $ChopSysDecoyPath=&Path_Chop($SysDecoyPath); # newer gcc doesn't like trailing backslash
+	my $MacroFlag;
+	foreach $MacroFlag (@BldMacros) {
+		$MacroFlag=~s/^(.*)$/-D$1/o;
+	}
+	undef $MacroFlag;
+
+	my $ChopSrcPath=&Path_Chop(&Path_Split('Path',$Src)); # newer gcc doesn't like trailing backslash
+	my $ProductVariantFlag = "";
+	if($VariantFile){
+	    $ProductVariantFlag  = "-include " . &Path_PrefixWithDriveAndQuote($VariantFile);
+	}
+	my $VariantIncludePath;
+	if (defined &main::PMPrefixFile)
+	{
+	$VariantIncludePath = &main::PMPrefixFile;
+	$VariantIncludePath =~ s/"//g;
+	$VariantIncludePath = Path_Split("path", $VariantIncludePath);
+	
+	$VariantIncludePath = Path_Chop($VariantIncludePath);
+	$VariantIncludePath = Path_PrefixWithDriveAndQuote($VariantIncludePath);
+	}
+	my $CPPCommand;
+ 	my $exe = &PreprocessorToUseExe();
+	$CPPCommand = "$exe -undef -M -MG -nostdinc $PrefixFileOption";
+	$CPPCommand .= " -I $VariantIncludePath" if $VariantIncludePath;
+	$CPPCommand .= " -I ".&Path_PrefixWithDriveAndQuote($ChopSrcPath)." @UserFlags -I- -I ".&Path_PrefixWithDriveAndQuote($ChopSysDecoyPath)." @SysFlags @PlatMacros @BldMacros $ProductVariantFlag ".&Path_PrefixWithDriveAndQuote($Src);
+
+	if ($Mode{'Verbose'}) {
+		print "$CPPCommand\n"
+	}
+ 	open CPPPIPE,"$CPPCommand |" or die "ERROR: Can't invoke $exe.EXE\n";
+
+	# XYZ.CPP.o: \
+	#  ..\..\..\base\bafl\src\xyz.cpp \
+	#  ..\..\..\EPOC32\INCLUDE\E32DES16.H ..\..\..\EPOC32\INCLUDE\E32STD.INL \
+	#  ..\..\..\EPOC32\INCLUDE\E32BASE.INL \
+	#  ..\..\..\base\bafl\inc\bautil.h \
+	#  ..\..\..\awkward\ name\bafl\inc\bautil.h \
+	#  ..\..\..\lastthing.h
+
+	my @RTWDepList;
+	while (<CPPPIPE>) {
+		s/ \\$//oi;	# remove trailing continuation character
+		s/\\ /;/go;	# convert embedded spaces (\<space>) into semicolon which can't occur in filenames
+		# avoid the target of the rule by requiring whitespace in front of each element
+		while (/\s(\S+)/go) {
+			my $dep = $1;
+			$dep =~ s/;/ /go;	# spaces were turned into semicolon, so convert back again here
+			$dep =~ s-/-\\-go;	# replace forward slashes with backward slashes
+			$dep =~ s/^.\://;
+			$dep =~ s/\s+$//; 	# remove trailing spaces
+			push @RTWDepList,$dep;
+		}
+	}
+	close CPPPIPE or die "ERROR: $exe.EXE failure\n";
+
+	# drop the first dependent, which is the source file itself
+	shift @RTWDepList;
+
+# make all paths absolute
+	my @DepList=&Path_AbsToWork(@RTWDepList);
+	undef @RTWDepList;
+
+# test the dependencies
+	eval { @DepList=&TestDepends($Src,@DepList); };
+	die $@ if $@;
+	
+	my @SortedDepList;
+# get just those headers found in the user include path if user headers only specified
+	if (not $Mode{'UserHdrsOnly'}) {
+		@SortedDepList=sort @DepList;
+	}
+	else {
+		my @UserDepList=();
+		my $Dep;
+		my $UserPath;
+		DEPLOOP: foreach $Dep (@DepList) {
+			foreach $UserPath (@UserPaths) {
+				if ($UserPath eq &Path_Split('Path',$Dep)) {
+					push @UserDepList, $Dep;
+					next DEPLOOP;
+				}
+			}
+		}
+		@SortedDepList=sort @UserDepList;
+	}
+
+# take the source path out of the user path list
+	shift @UserPaths;
+
+	@SortedDepList;
+} 
+
+
+sub TestDepends (@) { # takes source list of absolute dependencies - called by GenDepends
+# check that the dependencies exist or are to be generated later, because gcc with the -MG switch
+# will assume that missing system headers live in the first system include path specified (the decoy
+# directory in our case), and the missing user headers live in the current working directory
+
+	my ($Src,@DepList)=@_;
+
+	my @BadSysList;
+	my @BadUserList;
+	my $Dep;
+	my @GoodList;
+	my $SrcPath=&Path_Split('Path', $Src);
+
+	my $Path;
+	my $File;
+	DEPLOOP: foreach $Dep (@DepList) { # system dependencies not found
+		$Path=&Path_Split('Path', lc $Dep);
+		if ($Dep=~/^$S_SysDecoyPath(.*)$/o) { # allow things like "#include <sys\stats.h>"
+# any files listed as existing in the system decoy directory will be missing system include files
+			$File=$1;
+# change any missing generated header entries so that they are thought to be in $EPOCIncPath, where they will be generated to
+			if ($File=~/\.(RSG|MBG)$/oi) {
+				push @GoodList, "$EPOCIncPath$File";
+				next DEPLOOP;
+			}
+# remove missing system include files from the list if they actually exist in standard directories - since the makefiles can't handle
+# files which may be on a different drive - we don't mind this because if we're using MSVC then we can assume
+# the MSVC include files will exist
+			my $LR;
+			foreach $LR (@StdPaths) {	# tackle MSDEV include dir on diff drive
+				if (-e "$LR$File") {	# don't put MSDEV includes in dep list - drive letter would end up in makefile
+					next DEPLOOP;
+				}
+			}
+# put any other missing system files on the bad list after checking that they really don't exist on the system paths
+# at this point in time.  This check is applied in an attempt to avoid sporadic warnings in the build where system
+# headers have been listed in the system decoy directory, and hence flagged as missing, when they do seem to have
+# been present at this time post-build...
+			foreach $Path (@SysPaths) {
+				if (-e "$Path$File") {
+					next DEPLOOP;
+				}
+			}
+			push @BadSysList, $File;
+			next DEPLOOP;
+		}
+# preprocessor lists any missing user headers as existing in the current directory,
+# and, if no userinclude paths are specified,
+# searches to path containing the source file for user headers by default
+		if ($Path eq lc &Path_WorkPath) { # possible missing user headers
+			$File=&Path_Split('File',$Dep);
+			# does the userinclude path contain the current working directory?
+			my $LoopPath;
+			my $WorkPathInUserPaths=0;
+			foreach $LoopPath (@UserPaths) {
+				if ( (lc $LoopPath) eq (lc &Path_WorkPath) ) {
+					$WorkPathInUserPaths=1;
+					next;
+				}
+			}
+			if ($WorkPathInUserPaths) { # the user include path contains the current working directory
+				if (-e $Dep) {
+					push @GoodList,$Dep;	# file found in specified userinclude path, OK
+					next DEPLOOP;
+				}
+			}
+			push @BadUserList, $File;	# file not found in specified userinclude path, bad
+			next DEPLOOP;
+		}
+		push @GoodList, $Dep;
+	}
+
+	my $Bad;
+	if (@BadSysList) {
+		warn	"\nWARNING: Can't find following headers in System Include Path\n";
+		foreach $Bad (@BadSysList) {
+			print STDERR " <$Bad>";
+		}
+		print STDERR "\n(Sys Inc Paths";
+		foreach $Path (@SysPaths,@StdPaths) {
+			print STDERR " \"$Path\"";
+		}
+		warn
+			")\nDependency list for \"$Src\" may be incomplete\n",
+			"\n"
+		;
+	}
+	if (@BadUserList) {
+		warn "\nWARNING: Can't find following headers in User or System Include Paths\n";
+		my $GenHdr=0;
+		foreach $Bad (@BadUserList) {
+			print STDERR " \"$Bad\"";
+			if ($File=~/\.(RSG|MBG)$/o) {
+				$GenHdr=1;
+			}
+		}
+		print STDERR "\n(User Inc Paths";
+		foreach $Path (@UserPaths) {
+			print STDERR " \"$Path\"";
+		}
+		warn
+			")\nDependency list for \"$Src\" may be incomplete\n",
+			"\n"
+		;
+		if ($GenHdr) {
+			warn
+				"Note that generated headers should be system-included with angle brackets <>\n",
+				"\n"
+			;
+		}
+	}
+
+	@GoodList;
+}
+
+
+END {
+	# remove the dependency decoy directories
+	if (-d "$ChopSysDecoyPath") {
+		rmdir "$ChopSysDecoyPath" or warn "Please remove temp dir \"$ChopSysDecoyPath\"\n";
+	}
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/makhelp.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,225 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Makhelp;
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Help_Invocation
+	Help_Mmp
+	Help_Plat
+);
+
+
+use E32tpver;
+use featurevariantparser;
+# also requires main module to have loaded platform module(s) and Modload.pm and Trgtype.pm
+
+sub Help_Invocation () {
+
+	print
+		"\n",
+		"MAKMAKE - Makefile Creation Utility (Build ",&E32tpver,")\n",
+		"\n",
+		"MAKMAKE {flags} [{MMPFilePath}MMPFileRoot] [Platform[.Feature Variant]]\n",
+		"\n",
+		"Flags: (case insensitive)\n",
+		" -D               -> create makefile in ", $E32env::Data{BldPath}, "[project]\\[platform]\\\n",
+		" -MMP             -> information - basic mmp syntax\n",
+		" -PLAT [platform] -> information - platform-specific mmp syntax\n",
+		" -V               -> verbose mode\n",
+		" -ND              -> generate no dependencies info\n",
+		" -[debug|no_debug]-> enable/disable generation of symbolic debug information for ARM ABI compliant platforms\n",
+		" -LOGFC           -> enable function call logging\n",
+		" -INVARIANT       -> force default feature variant processing only, unless FEATUREVARIANT is present in the .mmp file\n",
+		"\n"
+	;
+
+	my @Plats=&main::Plat_List;
+	print
+		"Available Platforms: (case insensitive)\n",
+		" @Plats\n"
+	;
+
+	my @BuildableFeatureVariants=featurevariantparser->GetBuildableFeatureVariants();
+	if (@BuildableFeatureVariants)
+		{
+		@BuildableFeatureVariants = map{uc($_)} @BuildableFeatureVariants;
+
+		print
+			"\nAvailable Feature Variants for Supporting Platforms: (case insensitive)\n",
+			" @BuildableFeatureVariants\n"
+		;
+		}
+}
+
+sub Help_Mmp () {
+
+	my @TrgTypes=&main::Trg_List;
+	my $TrgTypes='TARGETTYPE             [';
+	my $Spacing=length($TrgTypes);
+	my $LineLen=$Spacing;
+	foreach (@TrgTypes) {
+		$TrgTypes.=$_.'|';
+		$LineLen+=(length($_)+1);
+		if ($LineLen>($Spacing+50)) {
+			$TrgTypes.="\n".(' 'x$Spacing);
+			$LineLen=$Spacing;
+		}
+	}
+	chop $TrgTypes;
+	$TrgTypes.=']';
+
+	print <<ENDHERE;
+
+Makmake Project File - Basic Syntax
+
+/* Use C++ comments if required */
+START BITMAP           [target]
+TARGETPATH             [emulated_path_on_target_machine]
+HEADER
+SOURCEPATH             [.mmp-relative_source_path (default - .mmp_dir)]
+SOURCE                 [color_depth] [source_bitmaps]
+END
+
+START RESOURCE         [source]
+TARGET                 [target (default - source)]
+TARGETPATH             [emulated_path_on_target_machine]
+HEADER
+LANG                   [languages (overrides global LANG)]
+UID                    [uid(s) for resource file]
+END
+
+START STRINGTABLE      [source]
+EXPORTPATH             [location]
+HEADERONLY             [export only header file]
+END
+
+AIF                    [target] [src_path] [resource] {[color_depth] [bitmaps]}
+ALWAYS_BUILD_AS_ARM
+ARMFPU                 [SOFTVFP | VFPV2]
+ASSPABI
+ASSPEXPORTS
+ASSPLIBRARY            [ASSP_libraries]
+BYTEPAIRCOMPRESSTARGET
+CAPABILITY             [NONE | list of {-}CAPABILITY_NAME]
+COMPRESSTARGET
+DEBUGGABLE             [Executable can be debugged in a running system]
+DEBUGGABLE_UDEBONLY    [Only Debug (UDEB) executables can be debugged in a running system]
+DEBUGLIBRARY           [libraries - use in addition to LIBRARY for DEBUG builds]
+
+DEFFILE                [{path}{deffile} (default -
+                          \[project]\B[platform]\[target basename].DEF)
+                        If the path ends in \~\ the ~ is replace by B[platform] ]
+
+DOCUMENT               [sourcepath-relative_documents]
+EPOCALLOWDLLDATA
+EPOCCALLDLLENTRYPOINTS
+EPOCDATALINKADDRESS    [relocation_address]
+EPOCFIXEDPROCESS
+EPOCHEAPSIZE           [min_size][max_size]
+EPOCPROCESSPRIORITY    [PRIORITY_NAME]
+EPOCSTACKSIZE          [stack_size]
+EXPORTLIBRARY          [executables export library name if different from TARGET]
+EXPORTUNFROZEN
+FIRSTLIB               [first link object - overrides EEXE.LIB or EDLL.LIB]
+FEATUREVARIANT         [process for all variants when '-invariant' is used in MAKMAKE calls]
+INFLATECOMPRESSTARGET
+LANG                   [languages (defaults to SC)]
+LIBRARY                [libraries]
+LINKAS                 [executable's linking name if different from TARGET]
+LINKEROPTION           [COMPILER] [rest of line is linker options]
+MACRO                  [user-defined_macros]
+NEWLIB                 [override default operator new/operator delete library]
+NOCOMPRESSTARGET
+NOEXPORTLIBRARY        [don't generate an export library]
+NOSTRICTDEF
+OPTION                 [COMPILER] [rest of line is extra compiler options]
+OPTION_REPLACE         [oldComplierOption] [newOption]
+PAGED
+PAGEDCODE
+PAGEDDATA
+RAMTARGET              // syntax not yet finalized
+RESOURCE               [sourcepath-relative_resources]
+ROMTARGET              // syntax not yet finalized
+SECUREID               [secure ID]
+SMPSAFE                [mark executable as SMP safe]
+SOURCE                 [sourcepath-relative_sources]
+SOURCEPATH             [.mmp relative_source_path (default - .mmp_dir]
+SRCDBG
+STATICLIBRARY          [static_libraries]
+STDCPP
+NOSTDCPP
+STRICTDEPEND
+SYSTEMINCLUDE          [system_include_path]
+SYSTEMRESOURCE         [sourcepath-relative_system_resources]
+TARGET                 [target]
+TARGETPATH             [emulated_path_on_target_machine]
+$TrgTypes
+UID                    [uid2|0 {uid3}]
+UNPAGED
+UNPAGEDCODE
+UNPAGEDDATA
+USERINCLUDE            [user_include_path - source_dir searched first always]
+VENDORID               [vendorid]
+VERSION                [MAJOR.minor {explicit} - specify version number of
+                         the target. If EXPLICIT specified decorate target
+                         filename and DEF file name with version.]
+WCHARENTRYPOINT
+
+#if defined([PLATFORM])
+[universal keyword statements restricted to [PLATFORM] ]
+#endif
+
+START [PLATFORM]
+[platform-specific keyword statements]
+// use MAKMAKE /PLAT [PLATFORM] to display these
+END
+
+ENDHERE
+
+}
+
+sub Help_Plat ($$$$$) {
+	my ($Plat,$CPU,$DefFile,$MmpMacrosRef, $MacrosRef)=@_;
+
+#	list of source macros is incomplete in this function.  It may also contain:
+#	__MARM_<ABI>__ if the platform CPU is MARM - (ABI may vary according to .MMP contents though)
+#	Any macros defined in the .MMP file
+#	__DLL__ or __EXE__ respectively if the $BasicTrgType is DLL or EXE
+#	WIN32 and _WINDOWS if the project links to Win32 libraries
+#
+#	Furthermore, build macros _UNICODE, _DEBUG or _NDEBUG aren't listed - the _UNICODE
+#	macro should probably be defined as a permanent macro now that we're not doing Narrow
+#	builds anymore.
+
+	$DefFile= 'B'.$DefFile unless ($DefFile eq 'EABI');
+	print
+		"\n",
+		"Makmake Project File - Platform-specific Syntax\n",
+		"\n",
+		"// Platform   -> $Plat\n",
+		"// Default_Def_Dir -> \\[project]\\$DefFile\\\n",
+		"// MMP_Macros -> @$MmpMacrosRef\n",
+		"// Source_Macros -> @$MacrosRef (+ others)\n",
+		"\n",
+		"START [MMP_Macro]\n"
+	;
+	&main::PMHelp_Mmp if defined &main::PMHelp_Mmp;
+	print "END\n";
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/makmake.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,28 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+
+perl -S makmake.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/makmake.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1901 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# all variables called *Path* are set up to end with a backslash
+# all variables called *Path or *File are stored as absolute (file)paths within makmake
+# all variables called UpPath* are stored as relative paths within makmake
+# 
+#
+
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+use Cwd;
+# modified start: makefile improvement 
+use File::stat;
+use Time::localtime;
+# modified end: makefile improvement 
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+# Prototype to remove warning.
+sub AddStringTables();
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+
+use lib $PerlLibPath;
+use E32env;
+use E32Plat;
+use E32Variant;
+use Genutl;
+use Modload;
+use Pathutl;
+use Trgtype;
+use CheckSource;
+use featurevariantparser;
+use featurevariantmap;
+
+# THE MAIN PROGRAM SECTION
+##########################
+
+{
+	Load_SetModulePath($PerlLibPath);
+	Plat_Init($PerlLibPath);
+}
+
+my $MAKEFILE;
+my $MMPFILE;
+my %Options;
+my %Plat;
+my %TruePlat;
+my %BldMacros;
+my $PlatArg;
+my @PlatOverrideList=();
+my $EABIDef;
+my $DebugSwitch=undef;
+
+my $IsCompilerWrapperOption = 0;
+my $IsProxyWrapperOption = 0;
+my $FeatureVariantArg;
+my %FeatureVariantInfo;
+
+{
+	# process the command line
+	unless (GetOptions(\%Options, 'd', 'mmp', 'plat=s', 'v', 'arm', 'nd' , 'ithumb' , 'iarm' , 'debug', 'no_debug', 'logfc','wrap:s')) {
+		exit 1;
+	}
+	#Update the variable to set the information of -wrap option
+	if(exists($Options{wrap})) {
+		if ($Options{wrap} eq "") {
+			# Set the Compiler wrapper option information i.e. '1'
+			$IsCompilerWrapperOption = 1;
+		} elsif ($Options{wrap} eq "proxy") {
+			$IsProxyWrapperOption = 1;
+		} else {
+			print "WARNING: Invalid value for option -wrap: $Options{wrap}\n";
+		}
+	}
+	
+	$Options{makemakefile}='1' unless ($Options{mmp} || $Options{plat});
+
+	if ($Options{mmp} or $Options{plat}) {
+		eval { &Load_ModuleL('MAKHELP'); };
+		die $@ if $@;
+	}
+
+	if ($Options{mmp}) {
+		&Help_Mmp;
+		exit;
+	}
+
+	if ($Options{plat}) {
+		eval { &Plat_GetL($Options{plat},\%Plat,\%BldMacros); };
+		die $@ if $@;
+		eval { &Load_ModuleL($Plat{MakeMod}); };
+		die $@ if $@;
+		&Help_Plat($Plat{Real},$Plat{CPU}, $Plat{DefFile}, \@{$Plat{MmpMacros}},\@{$Plat{Macros}});
+		exit;
+	}
+
+#	show help & exit if necessary
+	if (@ARGV != 2) {
+		&Usage();
+	}
+	if ($Options{v}) {
+		print "perl -S makmake.pl @ARGV\n";
+		&Load_SetVerbose;
+		&Path_SetVerbose;
+		&Plat_SetVerbose;
+	}
+
+	$PlatArg=uc pop @ARGV;
+
+	# Process build platform arguments where they differ from the "norm"
+	if ($PlatArg=~/^(\S+)\.(\S+)$/)
+		{
+		# Explicit feature variant platforms take the form <base platform>.<variant name>
+		# e.g. armv5.variant1
+		$PlatArg=$1;
+		$FeatureVariantArg=$2;
+		}
+	elsif ($PlatArg=~/^(\S+):(\S+)$/)
+		{
+		# IDE platforms can take the form cw_ide:<platform-1>+<platform-2>+<platform-n>
+		# e.g. cw_ide:plat1+plat2+plat3
+		# 			
+		$PlatArg=$1;
+		@PlatOverrideList=split(/\+/,$2);
+		}
+
+	eval { &Plat_GetL($PlatArg,\%TruePlat,\%BldMacros); };
+	die $@ if $@;
+	if (scalar @PlatOverrideList) {
+		$PlatArg=$PlatOverrideList[0];
+	}
+
+	
+	$MMPFILE=pop @ARGV;
+	die "ERROR: Can't specify MMP file on a different drive\n" if $MMPFILE=~/^\w:\\/o;
+	if ($MMPFILE!~/.MMP$/io) {
+		$MMPFILE.='.MMP';
+	}
+	$MMPFILE=&Path_AbsToWork($MMPFILE);
+
+	eval { &Load_ModuleL('Mmp'); };
+	die $@ if $@;
+	if ($Options{v}) {
+		&Mmp_SetVerbose;
+	}
+	if ($Options{d}) {
+		die "ERROR: $E32env::Data{EPOCPath} does not exist\n" if (!-d $E32env::Data{EPOCPath});
+	}
+	
+	if ($Options{debug}) {
+		$DebugSwitch = 1;
+	}
+	elsif($Options{no_debug}){
+		$DebugSwitch = 0;
+	}
+}
+
+my %LinkerOptions;
+my %WarningLevel;
+my $ABI;
+my @AifStruct;
+my $AllowDllData;
+my $CompressTarget;
+my $CompressTargetMode;   #NONE
+my $ASSPExports;
+my @ASSPLibList;
+my @BitMapStruct;
+my $BuildAsARM=$Options{arm};
+my $CallDllEntryPoints;
+my $Capability;
+my @CapabilityFlags;
+my $DataLinkAddress;
+my @DebugLibList;
+my %Def;
+my %DocHash;
+my $ExportUnfrozen;
+my $FirstLib;
+my $FixedProcess;
+my %HeapSize;
+my @LibList;
+my $LinkAs;
+my $LinkAsBase;
+my $ExportLibrary;
+my $NoExportLibrary;
+my %MmpFlag;
+my @PlatTxt2D;
+my $ProcessPriority;
+my @RamTargets;
+my @ResourceStruct;
+my @RomTargets;
+my $SmpSafe;
+my @SourceStruct;
+my $StackSize;
+my @StatLibList;    
+my $StdCpp;
+my $NoStdCpp;
+my $NewLib;
+my @SysIncPaths;
+my @ResourceSysIncPaths;
+my $ResourceVariantMacroHRHFile;
+my $Trg;
+my %TrgType;
+my @UidList;
+my @UserIncPaths;
+my $SrcDbg;
+my %Path;
+my %Version;
+my $SecureId;
+my $VendorId;
+my $variantMacroHRHFile = Variant_GetMacroHRHFile();  # HRH file containing macros specific to a variant
+my %ReplaceOptions;
+my $ARMFPU;
+my @StringTable;
+my @StringTableUserIncPaths;
+my $CodePagingTargetMode;	# 0-N/A, 1-UNPAGED, 2-PAGED
+my $DataPagingTargetMode;	# 0-N/A, 1-UNPAGED, 2-PAGED
+my %CheckSourceUDEBIncludes;
+my %CheckSourceURELIncludes;
+my %CheckSourceMMPMetaData;
+my %CheckSourceMMPIncludes;
+my $IsWideCharMain=0;
+my $IsDebuggable; # 0-NONDEBUGGABLE, 1-DEBUGGABLE, 2-DEBUGGABLE_UDEBONLY
+
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTDEBUGGABLE => 0;
+use constant DEBUGGABLE =>  1;
+use constant DEBUGGABLE_UDEBONLY => 2;
+
+# If the platform does support feature variants but none are specified, then we assume the use of "DEFAULT" if it exists
+# If default doesn't exist feature variantion is basically disabled?
+$FeatureVariantArg = 'default' if (!$FeatureVariantArg && defined &PMSupportsFeatureVariants && featurevariantparser->DefaultExists());
+
+# Preload the details of the variant requested if any - we need the HRH file for MMP file processing
+if ($FeatureVariantArg)
+	{
+	# First check the feature variant is valid
+	my @buildableFeatureVariants = featurevariantparser->GetBuildableFeatureVariants();
+	die "ERROR: \"$PlatArg.$FeatureVariantArg\" feature variant is either invalid or virtual.\n" if !(grep /^$FeatureVariantArg$/i, @buildableFeatureVariants);
+
+	# Now load the variant
+	%FeatureVariantInfo = featurevariantparser->GetVariant($FeatureVariantArg);
+	
+	# Change the HRH file to use
+	$variantMacroHRHFile = $FeatureVariantInfo{VARIANT_HRH} if $FeatureVariantInfo{VARIANT_HRH};
+	}
+	
+&SetVarsFromMmp($PlatArg);
+die $@ if $@;
+
+{
+	# set up the makefile filepath - need to do this before loading the platform module
+	# because UID source file will be added and set up in the makefile path under WINS
+	if ($Options{d}) {
+		$MAKEFILE=join ('', $Path{Bld}, &Path_Split('Base',$MMPFILE), $TruePlat{Ext});
+	}
+	else {
+		$MAKEFILE=join "", &Path_WorkPath, &Path_Split('Base',$MMPFILE), $TruePlat{Ext};
+	}
+}
+
+{
+	# Generate an X86GCC def file from eabi def file in build dir if needed
+	if (($PlatArg eq "X86GCC" || $PlatArg eq "X86GMP") && $Def{Base} && not -e &DefFile)
+	{
+		# Find the equivalent eabi def file
+		my $eabiDefFile = File::Spec->canonpath("$Def{Path}../eabi/$Def{Base}$Def{Ext}");
+		if (-e $eabiDefFile)
+		{
+			# Need to create MAKEFILE directory early in this case
+			eval { &Path_MakePathL($MAKEFILE); };
+			die $@ if $@;
+			# Change def file path to build path 
+			$Def{Path} = $Path{Bld};
+			&generateX86GCCDefFile($eabiDefFile, &DefFile);
+		}
+		else
+		{
+			print "WARNING: Unable to find EABI def file at $eabiDefFile to generate X86GCC def file with\n";
+		}
+	}
+}
+
+{
+
+
+#	load the platform module
+	eval { &Load_ModuleL($TruePlat{MakeMod}); };
+	die $@ if $@;
+
+	unless (defined &PMHelp_Mmp) {
+#		check this function is defined - all modules must have it - if not perhaps the
+#		platform module has not loaded is compiler module successfully via "use"
+		die "ERROR: Module \"$Plat{MakeMod}\" not loaded successfully\n";
+	}
+}
+
+	# Allow the platform to bow out if feature variants have been specified but it doesn't support them
+	if ($FeatureVariantArg && !defined &PMSupportsFeatureVariants)
+		{
+		die "ERROR: The \"$PlatArg\" platform does not support feature variants.\n";
+		}
+
+{
+	# allow the platform to bow out if it can't support some .MMP file specifications
+	if (defined &PMCheckPlatformL) {
+		eval { &PMCheckPlatformL(); };
+		die $@ if $@;
+	}
+}
+
+my @StdIncPaths=();
+
+{
+	# get the platform module to do it's mmpfile processing - WINS modules may set up an extra source file
+	# for UIDs here depending upon the targettype
+	&PMPlatProcessMmp(@PlatTxt2D) if defined &PMPlatProcessMmp;
+}
+
+%CheckSourceMMPMetaData = &Mmp_CheckSourceMMPMetaData();
+%CheckSourceMMPIncludes = &Mmp_CheckSourceMMPIncludes();
+
+# merge checksource processing from platform specific .mmp sections, if applicable
+%CheckSourceMMPMetaData = (%CheckSourceMMPMetaData, &PMPlatCheckSource()) if defined &PMPlatCheckSource;
+
+@ResourceSysIncPaths = @SysIncPaths;
+$ResourceVariantMacroHRHFile = $variantMacroHRHFile;
+
+AddStringTables();
+
+# Process feature variants if applicable
+
+if ($FeatureVariantArg)
+	{
+	if ($Options{v})
+		{
+		$featurevariantmap::verbose = 1;
+		$featurevariantparser::verbose = 1;
+		}
+
+	# Get the default variant details
+	my %DefaultFeatureVariantInfo = $FeatureVariantInfo{NAME} =~ /^default$/i ? %FeatureVariantInfo : featurevariantparser->GetVariant("DEFAULT");	
+	die "ERROR: Feature variant \"$PlatArg.default\" is invalid.\n" if !$DefaultFeatureVariantInfo{VALID};
+
+	# The following IF statement decides whether to use the default variant and not use the hash in the filename 
+	# This prevents the generation of dll's/exe's for which variants are not needed (i.e they are invariant)
+	# It also avoids the time-consuming and redundant hash generation
+	# A component is considered invariant if it's not a DLL or EXE or FEATUREVARIANT isn't present in the .mmp file
+	
+# modified start: makefile improvement 
+	if ($TrgType{Basic} =~ /^(EXEDLL|EXE|DLL|LIB)$/ && &Mmp_IsFeatureVariant)
+# modified end: makefile improvement 
+		{
+		# Load the requested variant if it hasn't already been preloaded		
+		%FeatureVariantInfo = featurevariantparser->GetVariant($FeatureVariantArg) if !$FeatureVariantInfo{NAME} || $FeatureVariantInfo{NAME} ne $FeatureVariantArg;
+		}
+	else
+		{
+		# Use the default variant
+		%FeatureVariantInfo = %DefaultFeatureVariantInfo;
+		$FeatureVariantInfo{INVARIANT} = 1;
+		$FeatureVariantInfo{NAME} = uc $FeatureVariantArg;
+		}
+
+	die "ERROR: Feature variant \"$PlatArg.$FeatureVariantInfo{NAME}\" is invalid.\n" if !$FeatureVariantInfo{VALID};
+	
+	my @featureVariantSysIncPaths = (@{$FeatureVariantInfo{BUILD_INCLUDES}},@SysIncPaths);
+	
+	# Further process paths and filenames so that they include a drive letter.
+	# We store this in a hash specifically for passing on to featurevariantmap->Hash
+	
+	my @processedIncludes = &Path_PrefixWithDrive(&Path_Chop(@UserIncPaths), &Path_Chop(@featureVariantSysIncPaths));
+	push @processedIncludes, &Path_Chop(&PMToolChainIncDir) if defined &PMToolChainIncDir && &PMToolChainIncDir;
+	
+	my $processedPreInclude = "";
+	if (defined &PMPrefixFile)
+		{
+		$processedPreInclude = &PMPrefixFile;
+		$processedPreInclude =~ s/\"//g;
+		$processedPreInclude = &Path_PrefixWithDrive($processedPreInclude);		
+		}
+
+	my %processedFeatureVariantInfo;
+	$processedFeatureVariantInfo{PREINCLUDE} = $processedPreInclude if $processedPreInclude;
+	$processedFeatureVariantInfo{BUILD_INCLUDES} = \@processedIncludes if @processedIncludes;
+	$processedFeatureVariantInfo{VALID} = 1;
+	
+	# Pass in the details of the macros tested in the MMP
+	$processedFeatureVariantInfo{MMPTESTED} = &Mmp_TestedMacros();
+
+	my @pathedSrcList = ();
+	push @pathedSrcList, Path_PrefixWithDrive($$_{SrcPath}.$$_{CurFile}) foreach (@SourceStruct);
+
+	foreach my $bld (@{$Plat{Blds}})
+		{
+# modified start: makefile improvement 
+		my @reusedHash;
+# modified end: makefile improvement 
+		if ($FeatureVariantInfo{INVARIANT})															# Invariant override
+			{
+			$FeatureVariantInfo{$bld."_LABEL"} = "INVARIANT";
+			}
+		else
+			{
+# modified by SV start: makefile improvement 
+			my $vmap = "$E32env::Data{RelPath}".lc($Plat{Real})."\\".lc($bld)."\\".Trg()."." . $FeatureVariantInfo{NAME}.".vmap";
+# modified by SV end: makefile improvement 
+			$vmap = Path_PrefixWithDrive($vmap);
+			if(-e $vmap){
+				my @variantlist = featurevariantmap->GetVariantListFromVmap($vmap);
+				my @calls;
+				foreach(@variantlist)
+				{
+					my $target = "CHECKVMAP".uc($bld);
+					my $makefile = $MAKEFILE.".".$_;
+					if(-e $makefile){
+						push @calls, "make -r -f \"$makefile\"  $target";
+					}
+				}
+				foreach my $call (@calls)
+				{
+					print "call: $call" if $Options{v};
+					open PIPE, "$call |";
+					while(<PIPE>) {
+						print $_;
+					}
+					close PIPE;
+				}
+				if(-e $vmap){
+					@reusedHash = featurevariantmap->CheckOldVmapFile($vmap, \%FeatureVariantInfo);
+				}
+			}
+			if(defined(@reusedHash))
+			{
+				$FeatureVariantInfo{$bld."_LABEL"} = $reusedHash[0];
+				$FeatureVariantInfo{$bld."_FEATURES"} = $reusedHash[1];
+				next;
+			}
+# modified end: makefile improvement 
+			my @macros = (@{$Plat{Macros}}, @{$BldMacros{$bld}}, "__SUPPORT_CPP_EXCEPTIONS__");
+			push @macros, "__PRODUCT_INCLUDE__=\"".&Path_PrefixWithDrive($FeatureVariantInfo{VARIANT_HRH})."\"" if $FeatureVariantInfo{VARIANT_HRH};
+			$processedFeatureVariantInfo{MACROS} = \@macros;
+
+			print ("Feature variant hash processing: \"$FeatureVariantInfo{NAME} $bld\"\n") if $Options{v};
+			
+			my @result = featurevariantmap->HashAndFeatures(\@pathedSrcList, \%processedFeatureVariantInfo);
+			$FeatureVariantInfo{$bld."_LABEL"} = $result[0];
+			$FeatureVariantInfo{$bld."_FEATURES"} = $result[1];
+			
+			die "ERROR: Can't obtain hash for \"$PlatArg.$FeatureVariantInfo{NAME}\" feature variant.\n" if !$FeatureVariantInfo{$bld."_LABEL"};
+			}
+		}
+
+	# Customise standard content based on feature variant updates
+	@SysIncPaths = @featureVariantSysIncPaths;
+	$variantMacroHRHFile = $FeatureVariantInfo{VARIANT_HRH};
+	$MAKEFILE .= ".$FeatureVariantInfo{NAME}";
+
+	# Resources are always processed in the context of the default variant's system include and variant files when
+	# feature variants are in use
+	@ResourceSysIncPaths = (@{$DefaultFeatureVariantInfo{BUILD_INCLUDES}},@ResourceSysIncPaths);
+	$ResourceVariantMacroHRHFile = $DefaultFeatureVariantInfo{VARIANT_HRH};
+	}
+
+
+{
+	# if verbose mode set, output some info
+	#--------------------------------------
+	if ($Options{v}) {
+		print  
+			"Target: \"$Trg\"\n",
+			"TargetType: \"$TrgType{Name}\"\n",
+			"Libraries: \"@LibList\"\n",
+			"Debug Libraries: \"@DebugLibList\"\n",
+			"Static Libraries: \"@StatLibList\"\n",
+			"Uids: \"@UidList\"\n",
+			"BuildVariants: \"@{$Plat{Blds}}\"\n",
+			"TargetMakeFile: \"$MAKEFILE\"\n",
+			"UserIncludes: \"<Source Dir> @UserIncPaths\"\n",
+			"SystemIncludes: \"@SysIncPaths\"\n"
+		;
+
+	if (%FeatureVariantInfo)
+		{
+		print 
+			"Feature Variant Name: \"$FeatureVariantInfo{NAME}\"\n",
+			"Feature Variant SystemIncludes: \"@{$FeatureVariantInfo{BUILD_INCLUDES}}\"\n",
+			"Feature Variant HRH file: \"$FeatureVariantInfo{VARIANT_HRH}\"\n";
+
+		foreach my $bld (@{$Plat{Blds}})
+			{
+			print "Feature Variant $bld Label: \"".$FeatureVariantInfo{$bld."_LABEL"}."\"\n";			
+			}
+		
+		}
+	}
+}
+
+# Special handling for non-default invariant makefiles without FEATUREVARIANT in the MMP file
+# In this situation the default variant makefle is just included into the variant makefile
+# modified start: makefile improvement 
+if ($TrgType{Basic} =~ /^(EXEDLL|EXE|DLL|LIB)$/ && %FeatureVariantInfo && $FeatureVariantInfo{INVARIANT})
+	{
+	$MAKEFILE =~ s/([^.]*$)/DEFAULT/;
+# modified by SV start: makefile improvement 
+		if( $FeatureVariantInfo{NAME} !~ /^default$/i)
+			{
+				print "not creating makefile for  : $FeatureVariantInfo{NAME}\n" if ($Options{v});
+			}
+# modified by SV end: makefile improvement 
+	if(-e $MAKEFILE )
+		{
+		my $mmp_time = -M $MMPFILE;
+		my $makefile_time = -M $MAKEFILE;
+		if( $makefile_time <= $mmp_time)
+			{
+			exit;
+			}
+		}
+	undef %FeatureVariantInfo;
+	%FeatureVariantInfo = featurevariantparser->GetVariant("default");
+	$FeatureVariantInfo{INVARIANT} = 1;
+	$FeatureVariantInfo{UREL_LABEL} = 'INVARIANT';
+	$FeatureVariantInfo{UDEB_LABEL} = 'INVARIANT';
+	}
+# modified by SV start: makefile improvement 
+	elsif(%FeatureVariantInfo)
+	{
+	my $variant_info = &Path_Chop($E32env::Data{BldPath}).$Path{BldInfPath}."\\FeatureVariantInfo\\".$Plat{Real}."\\".$Plat{Real}.".".$FeatureVariantInfo{NAME}.".".&Path_Split('Base', $MMPFILE).".info";
+	#if mmp file does not exists
+	$variant_info = &Path_Chop($E32env::Data{BldPath}).$Path{BldInfPath}."\\FeatureVariantInfo\\".$Plat{Real}."\\".$Plat{Real}.".".$FeatureVariantInfo{NAME}.".info" if ! -e $MMPFILE;
+# modified by SV end: makefile improvement 
+	my $variant_key = "VARIANT_PLAT_NAME_".&Path_Split('Base', $MMPFILE);
+	$variant_info_new = $variant_info.".tmp";
+	open VARIANTINFOR_NEW, ">$variant_info_new" or die "ERROR: Can't open or create file \"$variant_info_new\"\n";
+
+	# Open the variant infor file
+	open VARIANTINFOR, "<$variant_info" or die "ERROR: Can't open file \"$variant_info\"\n";
+	while(<VARIANTINFOR>)
+		{
+		if(/^$variant_key/)
+			{
+			print VARIANTINFOR_NEW $variant_key.":=".$FeatureVariantInfo{NAME}."\n";
+			}
+			else
+			{
+			print VARIANTINFOR_NEW $_;
+			}
+		}
+	# Close and cleanup
+	close VARIANTINFOR or die "ERROR: Can't close file \"$variant_info\"\n";
+	close VARIANTINFOR_NEW or die "ERROR: Can't close file \"$variant_info\"\n";
+	unlink $variant_info;
+	rename($variant_info_new, $variant_info);
+	if ($Options{v}) {
+		print "Successful Variant Infor File Creation\n";
+
+		}
+	}
+# modified end: makefile improvement 
+
+my $CurAifRef;
+my $CurBaseObj;
+my $CurBld;
+my $CurBitMapRef;
+my @CurDepList;
+my $CurDoc;
+my $CurResrc;
+my $CurResourceRef;
+my $CurSrc;
+my $CurSrcPath;
+my $ResrcIsSys;
+# modified start: makefile improvement 
+my %CurSrcSet;
+# modified end: makefile improvement 
+
+# Set up library paths getting the backend module to help if it wants to
+{
+	&InitLinkPaths();
+}
+
+{
+
+	# LOOPING SECTION
+	#----------------
+	# Load the output module
+	eval { &Load_ModuleL('OUTPUT'); };
+	die $@ if $@;
+
+ 
+	# Believe include first on the system list. 
+    my $VariantFile=&main::VariantFile();
+    if($VariantFile){
+        my $VariantFilePath = Path_Split('Path',$VariantFile);
+        chop($VariantFilePath);
+
+        push(@SysIncPaths, $VariantFilePath);
+    }
+
+	my $ResourceVariantFile=&main::ResourceVariantFile();
+    if($ResourceVariantFile){
+        my $ResourceVariantFilePath = Path_Split('Path',$ResourceVariantFile);
+        chop($ResourceVariantFilePath);
+
+        push(@ResourceSysIncPaths, $ResourceVariantFilePath);
+    }
+    
+    ## Add default system include info for TOOLS2
+    if ($PlatArg eq 'TOOLS2') {    	
+    	push @SysIncPaths , "$E32env::Data{EPOCPath}include\\tools\\stlport";
+    }
+
+	# If the stdcpp keyword is used, or if the target type is STD* ...
+	if ($StdCpp or $TrgType{Name} eq 'STDEXE' or $TrgType{Name} eq 'STDDLL' or $TrgType{Name} eq 'STDLIB') {
+		push @SysIncPaths, $E32env::Data{EPOCPath}."include\\stdapis";
+	}
+
+	&PMStartBldList($Plat{MakeCmd}) if defined &PMStartBldList;
+	my $LoopBld;
+	foreach $LoopBld (@{$Plat{Blds}}) {
+		$CurBld=$LoopBld;
+		&PMBld if defined &PMBld;
+	}
+	undef $CurBld;
+	undef $LoopBld;
+	&PMEndBldList if defined &PMEndBldList;
+
+
+	# Load the Dependency Generator
+	eval { &Load_ModuleL('MAKDEPS'); };
+	die $@ if $@;
+	eval { &Deps_InitL($E32env::Data{EPOCIncPath},@StdIncPaths); };
+	die $@ if $@;
+	if ($Options{v}) {
+		&Deps_SetVerbose;
+	}
+	if ($Plat{UsrHdrsOnly}) {
+		&Deps_SetUserHdrsOnly;
+	}
+
+	if ($Options{nd} || ($ENV{SYMBIANBUILD_DEPENDENCYOFF} && ($ENV{SYMBIANBUILD_DEPENDENCYOFF}==1))) {
+		&Deps_SetNoDependencies
+	}
+	&Deps_SetNoDependencies if(grep /boostlibrary/i, &Mmp_UserIncPaths);
+
+	&Deps_SetUserIncPaths(@UserIncPaths);
+	&Deps_SetSysIncPaths(@ResourceSysIncPaths);
+	&Deps_SetPlatMacros(@{$Plat{Macros}});
+
+	my $prefixFile;
+	$prefixFile = &PMPrefixFile if defined &PMPrefixFile;
+	&Deps_SetPrefixFile($prefixFile) if $prefixFile;
+
+#	Start source list - bitmaps, resources, .AIF files, documents, sources.
+
+	# If feature variants are in use, dependency analysis may use a different overall variant file to that for "straight" source
+	my $curDepOSVariantFile = &Deps_GetOSVariantFile();
+	&Deps_SetOSVariantFile($ResourceVariantFile);
+
+	&PMStartSrcList if defined &PMStartSrcList;
+
+#	start bitmaps
+
+	if ($Options{v}) {
+		print "Starting bitmaps\n";
+	}
+	my $LoopBitMapRef;
+	foreach $LoopBitMapRef (@BitMapStruct) {
+		$CurBitMapRef=$LoopBitMapRef;
+		if ($Options{v}) {
+			print "BitMap: \"$$CurBitMapRef{Trg}\"\n";
+		}
+		&PMBitMapBld if defined &PMBitMapBld;
+	}
+	undef $CurBitMapRef;
+	undef $LoopBitMapRef;
+
+#	end bitmaps
+
+#	start resources
+
+	if ($Options{v}) {
+		print "Starting resources\n";
+	}
+	my $LoopResourceRef;
+	foreach $LoopResourceRef (@ResourceStruct) {
+		$CurResourceRef=$LoopResourceRef;
+		if ($Options{v}) {
+			print "Resource: \"$$CurResourceRef{Trg}\"\n";
+		}
+		eval { @CurDepList=&Deps_GenDependsL($$CurResourceRef{Source}, ("LANGUAGE_$$CurResourceRef{Lang}")); };
+		die $@ if $@;
+		&PMResrcBld if defined &PMResrcBld;
+		undef @CurDepList;
+	}
+	undef $CurResourceRef;
+	undef $LoopResourceRef;
+
+#	end resources
+
+#	start aifs
+
+	if ($Options{v}) {
+		print "Starting aifs\n";
+	}
+
+# Add tools-relative include path to sys includes, to allow for shared include\aiftool.rh
+	use FindBin;
+	$FindBin::Bin =~ /:(.*)\//;
+	my $extraIncPath = $1;
+	$extraIncPath =~ s/\//\\/g;
+	my @SavedResourceSysIncPaths = @ResourceSysIncPaths;
+	push @ResourceSysIncPaths, "$extraIncPath\\INCLUDE";
+	&Deps_SetSysIncPaths(@ResourceSysIncPaths);
+
+	my $LoopAifRef;
+	foreach $LoopAifRef (@AifStruct) {
+		$CurAifRef=$LoopAifRef;
+		if ($Options{v}) {
+			print "Aif: \"$$CurAifRef{Trg}\"\n";
+		}
+		eval { @CurDepList=&Deps_GenDependsL("$$CurAifRef{Source}"); };
+		die $@ if $@;
+		&PMAifBld if defined &PMAifBld;
+		undef @CurDepList;
+	}
+	undef $CurAifRef;
+	undef $LoopAifRef;
+
+	@ResourceSysIncPaths = @SavedResourceSysIncPaths;
+
+#	end aifs
+
+#	start sources
+
+	if ($Options{v}) {
+		print "Starting sources\n";
+	}
+	
+	my $SrcRef;
+	&Deps_SetOSVariantFile($curDepOSVariantFile);
+	&Deps_SetSysIncPaths(@SysIncPaths);
+
+	foreach $SrcRef (@SourceStruct){
+		 $CurSrcPath=$$SrcRef{SrcPath};
+		 $CurSrc=$$SrcRef{CurFile};
+
+		 my @userIncludes = &Mmp_UserIncPaths;
+		 @userIncludes = (@userIncludes, @StringTableUserIncPaths) if (@StringTableUserIncPaths);
+		 unshift (@userIncludes, $CurSrcPath);		 
+
+		 if ($TruePlat{Ext} !~ /\.DSP|\.xml/i)
+		 	{
+			foreach my $buildVariant (@{$Plat{Blds}})
+				{		 		
+				my @macros = &MacroList;
+				@macros = (@macros, @{$BldMacros{$buildVariant}});
+
+				my $checkSourceCommandStore;
+			
+				if ($buildVariant =~ /rel$/i)
+					{
+					$checkSourceCommandStore = \%CheckSourceURELIncludes
+					}
+				else
+					{
+					$checkSourceCommandStore = \%CheckSourceUDEBIncludes
+					}
+				CheckSource_Includes($CurSrcPath.$CurSrc, %$checkSourceCommandStore, $VariantFile, @macros, @userIncludes, @SysIncPaths);
+			}
+		 }
+		 if ($Options{v}) {
+			print "Sourcepath: \"$CurSrcPath\"\n";
+		 }
+		 &PMStartSrc if defined &PMStartSrc;
+
+#			strict depend alt 1 start - call different module function if strict depend flag specified
+			if (((not $MmpFlag{StrictDepend}) || (not defined &PMSrcBldDepend)) && defined &PMSrcDepend) {
+				eval { @CurDepList=&Deps_GenDependsL($CurSrcPath.$CurSrc);};
+				die $@ if $@;
+# modified start: makefile improvement 
+				foreach $srcFile (@CurDepList) {
+					if(not exists($CurSrcSet{$srcFile})){
+						my $srctmp = $srcFile;
+						$CurSrcSet{$srctmp} = 1;
+					}
+				}
+# modified end: makefile improvement 
+				&PMSrcDepend if defined &PMSrcDepend;
+				undef @CurDepList;
+			}
+							
+#			strict depend alt 1 end
+
+			my $LoopBld;
+			foreach $LoopBld (@{$Plat{Blds}}) {
+				$CurBld=$LoopBld;
+				&PMStartSrcBld if defined &PMStartSrcBld;
+
+#				strict depend alt 2 start - call the module function that deals with dependencies generated for each build variant
+				if ($MmpFlag{StrictDepend} && defined &PMSrcBldDepend) {
+					eval { @CurDepList=Deps_GenDependsL($CurSrcPath.$CurSrc,@{$BldMacros{$CurBld}}); };
+					die $@ if $@;
+					&PMSrcBldDepend if defined &PMSrcBldDepend;
+					undef @CurDepList;
+				}
+#				strict depend alt 2 end
+
+				&PMEndSrcBld if defined &PMEndSrcBld;
+			}
+			undef $CurBld;
+			undef $LoopBld;
+			&PMEndSrc if defined &PMEndSrc;
+# modified start: makefile improvement 
+			my $cursrcfile = $CurSrcPath.$CurSrc;
+			if(not exists($CurSrcSet{$cursrcfile})){
+				$CurSrcSet{$cursrcfile} = 1;
+			}
+# modified end: makefile improvement 
+		}
+		undef $CurSrc;
+		undef $CurSrcPath;  
+	
+	
+
+#	end sources
+
+#	start documents
+
+	if ($Options{v}) {
+		print "Starting documents\n";
+	}
+	my $LoopSrcPath;
+	foreach $LoopSrcPath (sort keys %DocHash) {
+		$CurSrcPath=$LoopSrcPath;
+		if ($Options{v}) {
+			print "Sourcepath: \"$CurSrcPath\"\n";
+		}
+		my $LoopDoc;
+		foreach $LoopDoc (sort @{$DocHash{$CurSrcPath}}) {
+			$CurDoc=$LoopDoc;
+			if ($Options{v}) {
+				print "Document: \"$CurDoc\"\n";
+			}
+			&PMDoc if defined &PMDoc;
+		}
+		undef $CurDoc;
+		undef $LoopDoc;
+	}
+	undef $CurSrcPath;
+	undef $LoopSrcPath;
+
+#	end documents
+
+#	rombuild
+
+	my %SpecialRomFileTypes=(
+		KEXT=>'extension[MAGIC]',
+		LDD=>'device[MAGIC]',
+		PDD=>'device[MAGIC]',
+		VAR=>'variant[MAGIC]'
+	);
+	my %KHash1 = (
+		kext=>1,
+		ldd=>1,
+		pdd=>1,
+		var=>1,
+		kdll=>1
+	);
+	my %KHash2 = (
+		primary=>1,
+		variant=>1,
+		extension=>1,
+		device=>1
+	);
+	unless ($TrgType{Basic} =~ /^IMPLIB$/io or $TruePlat{Ext} =~ /\.DSP|\.xml/i) { # change to avoid rombuild target for IDE makefiles
+		&Output("ROMFILE:\n");
+		unless ($Plat{OS} ne 'EPOC32' or $TrgType{Basic} eq 'LIB') {
+			my $ref;
+			foreach $ref (@RomTargets) {
+				my $ABIDir = '##MAIN##';
+				my $RomFileType='file';
+				if ($$ref{FileType}) {	# handle EKERN.EXE and EFILE.EXE with new ROMFILETYPE keyword instead
+					$RomFileType=$$ref{FileType}; # or just do this bit as a custom build makefile
+				}
+				elsif ($CallDllEntryPoints) {
+					$RomFileType='dll';
+				}
+				elsif ($SpecialRomFileTypes{$TrgType{Name}}) {
+					$RomFileType=$SpecialRomFileTypes{$TrgType{Name}};
+				}
+				my $RomPath="sys\\bin\\";
+				if ($$ref{Path}) {
+					$RomPath=$$ref{Path};
+				}
+				elsif ($TrgType{Path}) {
+					$RomPath=$TrgType{Path};
+					$RomPath=~s-z\\(.*)-$1-o;
+				}
+				my $RomFile=$LinkAsBase;
+				if ($$ref{File}) {
+					$RomFile=$$ref{File};
+				}
+				my $RomDecorations='';
+				if ($DataLinkAddress) {
+					$RomDecorations="reloc=$DataLinkAddress";
+				}
+				elsif ($FixedProcess) {
+					$RomDecorations.='fixed';
+				}
+				
+				$ABIDir = '##KMAIN##' if ($KHash1{lc $TrgType{Name}});
+				$ABIDir = '##KMAIN##' if ($KHash2{lc $RomFileType});
+				my $IbyTextFrom="$RomFileType=$E32env::Data{RelPath}$ABIDir\\##BUILD##\\$Trg";
+				my $IbyTextTo="$RomPath$RomFile";
+				my $Spaces= 60>length($IbyTextFrom) ? 60-length($IbyTextFrom) : 1; 
+				&Output("\t\@echo ", $IbyTextFrom, ' 'x$Spaces, "$IbyTextTo $RomDecorations\n");
+			}
+			foreach $ref (@RamTargets) {
+				my $ABIDir = '##MAIN##';
+				$ABIDir = '##KMAIN##' if ($KHash1{lc $TrgType{Name}});
+				my $RomFileType='data';
+				my $RomPath="sys\\bin\\";
+				if ($$ref{Path}) {
+					$RomPath=$$ref{Path};
+				}
+				my $RomFile=$Trg;
+				if ($$ref{File}) {
+					$RomFile=$$ref{File};
+				}
+				my $RomDecorations='attrib=r';
+
+				my $IbyTextFrom="$RomFileType=$E32env::Data{RelPath}$ABIDir\\##BUILD##\\$Trg";
+				my $IbyTextTo="$RomPath$RomFile";
+				my $Spaces= 60>length($IbyTextFrom) ? 60-length($IbyTextFrom) : 1; 
+				&Output("\t\@echo ", $IbyTextFrom, ' 'x$Spaces, "$IbyTextTo $RomDecorations\n");
+			}
+		}
+	}
+#	end rombuild
+
+	&PMEndSrcList if defined &PMEndSrcList;
+}
+
+{
+
+	# open the makefile and write all the text it requires to it if makmake has so far been successful
+	#-------------------------------------------------------------------------------------------------
+	eval { &Path_MakePathL($MAKEFILE); };
+	die $@ if $@;
+	if ($Options{v}) {
+		print "Creating: \"$MAKEFILE\"\n";
+	}
+	open MAKEFILE,">$MAKEFILE" or die "ERROR: Can't open or create file \"$MAKEFILE\"\n";
+	print MAKEFILE &OutText or die "ERROR: Can't write output to file \"$MAKEFILE\"\n";
+	close MAKEFILE or die "ERROR: Can't close file \"$MAKEFILE\"\n";
+	if ($Options{v}) {
+		print "Successful MakeFile Creation\n";
+	}
+}
+
+	
+################ END OF MAIN PROGRAM SECTION #################
+#------------------------------------------------------------#
+##############################################################
+
+
+
+
+
+# SUBROUTINE SECTION
+####################
+
+sub FatalError (@) {
+
+	print STDERR "MAKMAKE ERROR: @_\n";
+	exit 1;
+}
+
+sub Usage () {
+
+		eval { &Load_ModuleL('MAKHELP'); };
+		die $@ if $@; 
+		eval { &Help_Invocation; };
+		die $@ if $@;
+		exit;
+}
+
+sub getEABIDef() {
+	# Preprocess the mmp with ARMv5 platform settings so we can pick up 
+    # EABI specific def file entries etc. 
+    my ($platname)="ARMV5";
+    
+    # get platform info for armv5
+    eval { &Plat_GetL($platname,\%Plat,\%BldMacros); };
+	return $@ if $@;
+	&Mmp_Reset;
+	# process 
+    
+    # set package to ignore warnings about missing .def file. 
+    &Mmp_SetIgnoreMissingDef;
+    
+    eval { &Mmp_ProcessL($E32env::Data{EPOCPath}, $MMPFILE, \%Plat, $FeatureVariantInfo{BUILD_INCLUDES}); };
+	return $@ if $@;
+	my %EABIDef=%{&Mmp_Def};
+	
+    # handle case that def file doesn't exist -> Simply set to ""
+    my $EABIDefFile = "$EABIDef{Path}$EABIDef{Base}$EABIDef{Ext}";;
+   	unless (-e "$EABIDefFile") {
+        $EABIDefFile = "";
+	}
+    
+    return $EABIDefFile;
+	
+}
+
+sub SetVarsFromMmp ($) {
+
+	my ($platname)=@_;
+    
+	if($platname eq "GCCXML") {
+        $EABIDef = getEABIDef();
+    } 
+    else {
+        $EABIDef = "";
+    }
+
+	# MMP FILE PROCESSING - filter the mmp file content through the GCC preprecessor
+	#-------------------------------------------------------------------------------
+	eval { &Plat_GetL($platname,\%Plat,\%BldMacros); };
+	return $@ if $@;
+	&Mmp_Reset;
+
+	if($platname eq "GCCXML" || $platname eq "X86GCC" || $platname eq "X86GMP") {
+	# set package to ignore warnings about missing .def file, this is necessary,
+	# as either EABI .def or GCC .def may not exist, and this shouldn't be reported
+	# as a warning or error. Similarly for x86gcc def files - these are autogenerated.
+	&Mmp_SetIgnoreMissingDef;
+	}
+
+	eval { &Mmp_ProcessL($E32env::Data{EPOCPath}, $MMPFILE, \%Plat, $FeatureVariantInfo{BUILD_INCLUDES}); };
+	return $@ if $@;
+
+	%WarningLevel=&Mmp_WarningLevel;
+	%LinkerOptions=&Mmp_LinkerOptions;
+	$ABI=&Mmp_ABI;
+	@AifStruct=@{&Mmp_AifStruct};
+	$AllowDllData=&Mmp_AllowDllData;
+	$CompressTarget=&Mmp_CompressTarget;
+	$CompressTargetMode=&Mmp_CompressTargetMode;
+	$ASSPExports=&Mmp_ASSPExports;
+	@ASSPLibList=&Mmp_ASSPLibList;
+	@BitMapStruct=@{&Mmp_BitMapStruct};
+	$BuildAsARM=$BuildAsARM || &Mmp_BuildAsARM;
+	$CallDllEntryPoints=&Mmp_CallDllEntryPoints;
+	$Capability=&Mmp_Capability;
+	@CapabilityFlags=&Mmp_CapabilityFlags;
+	$DataLinkAddress=&Mmp_DataLinkAddress;
+	@DebugLibList=@{&Mmp_DebugLibList};
+	%Def=%{&Mmp_Def};
+	%DocHash=%{&Mmp_DocHash};
+	$ExportUnfrozen=&Mmp_ExportUnfrozen;
+	$FirstLib=&Mmp_FirstLib;
+	$FixedProcess=&Mmp_FixedProcess;
+	%HeapSize=%{&Mmp_HeapSize};
+	@LibList=@{&Mmp_LibList};
+	$LinkAs=&Mmp_LinkAs;
+	$LinkAsBase=&Mmp_LinkAsBase;
+	$ExportLibrary=&Mmp_ExportLibrary;
+	$NewLib = &Mmp_NewLib;
+    $NoExportLibrary=&Mmp_NoExportLibrary;
+	%MmpFlag=%{&Mmp_MmpFlag};
+	@PlatTxt2D=&Mmp_PlatTxt2D;
+	$ProcessPriority=&Mmp_ProcessPriority;
+	@RamTargets=&Mmp_RamTargets;
+	@ResourceStruct=@{&Mmp_ResourceStruct};
+	@RomTargets=&Mmp_RomTargets;
+	$SmpSafe=&Mmp_SmpSafe;
+	@SourceStruct=@{&Mmp_SourceStruct};
+	$StackSize=&Mmp_StackSize;
+	@StatLibList=&Mmp_StatLibList;    
+	$StdCpp = &Mmp_StdCpp;
+	$NoStdCpp = &Mmp_NoStdCpp;
+	@SysIncPaths=&Mmp_SysIncPaths;
+	$Trg=&Mmp_Trg;
+	%TrgType=%{&Mmp_TrgType};
+	@UidList=&Mmp_UidList;
+	@UserIncPaths=&Mmp_UserIncPaths;
+	$SrcDbg=&Mmp_SrcDbg;
+	%Version=&Mmp_Version;
+	$SecureId=&Mmp_SecureId;
+	$VendorId=&Mmp_VendorId;
+	%ReplaceOptions=&Mmp_Replace;
+	$ARMFPU=&Mmp_ARMFPU;
+	@StringTable=@{&Mmp_StringTable};
+	$CodePagingTargetMode=&Mmp_CodePagingTargetMode;
+	$DataPagingTargetMode=&Mmp_DataPagingTargetMode;
+	$IsWideCharMain=&Mmp_IsWideCharMain;
+	$IsDebuggable=&Mmp_IsDebuggable;
+
+#	finish defining any macros
+
+	if ($Plat{CPU} eq 'MARM') {
+#		apply the ABI source define - note that it is difficult to define a corresponding
+#		.MMP define since we can't be sure what the ABI is until we've processed the .MMP file,
+#		though we could apply it for generic MARM builds only
+		push @{$Plat{Macros}}, "__MARM_${ABI}__";
+	}
+
+	if ($TrgType{Basic}=~/^(DLL|EXE)$/o) { # this macro may soon be removed
+		push @{$Plat{Macros}},'__'.$TrgType{Basic}.'__';
+	}
+
+#	add the macros defined in the .mmp file
+	push @{$Plat{Macros}}, &Mmp_Macros;
+
+# set up a hash containing the start paths for various things
+	undef %Path;
+
+#	set up ASSP link path - this is the path where the target looks for ASSP-specific import libraries
+        $Path{ASSPLink}="$E32env::Data{LinkPath}$Plat{ASSP}\\";
+
+#	set up build path
+	my $BldInfPath=cwd;
+	$BldInfPath=~s-/-\\-go;						# separator from Perl 5.005_02+ is forward slash
+	$BldInfPath=~s/^(.:)//o;					# remove drive letter
+	$BldInfPath=~s-^(.*[^\\])$-$1\\-o;			# ensure workpath ends with a backslash
+	$Path{BldInfPath} = $BldInfPath;			# Remember the path to bldinf
+	$Path{Bld}=join('', &Path_Chop($E32env::Data{BldPath}), $BldInfPath, &Path_Split('Base',$MMPFILE), "\\$Plat{Real}\\");
+}
+
+sub generateX86GCCDefFile()
+{
+	my ($oldPath, $newPath) = @_;
+	print "Generating X86GCC deffile from $oldPath\n";
+	if (!open(OLDDEF, $oldPath))
+	{
+		print "Warning: Failed to open $oldPath for reading\n".
+		return;
+	}
+	# Force creation of new def file even if one already exists
+	if (!open(NEWDEF, ">$newPath"))
+	{
+		close OLDDEF;
+		print "Warning: Failed to open $newPath for writing\n".
+		return;
+	}
+	while (<OLDDEF>)
+	{
+		chomp;
+		if (/^\s*_ZT(I|V)/ && !/\sABSENT/i)
+	    {
+		# Typeinfo that isn't already absent. Add the ABSENT keyword.
+		    my @frags = split /;/, $_, 2; # 1 or 2 parts depending on the presence of a comment
+		    $frags[0] =~ s/\s*$/ ABSENT /;
+		    $_ = join ';', @frags;
+	    }
+	    else
+	    {
+		# Try to substitute any va_list params with char* (Pc). Ignore if no match
+		s/St9__va_list/Pc/g;
+	    }
+		print NEWDEF "$_\n";	    
+	}
+	close OLDDEF;
+	close NEWDEF;
+	print "Successfully generated $newPath\n";
+}
+
+sub InitLinkPaths() {
+#	set up lib path - this is the path where the target puts it's import library
+
+	my $ABI=&Mmp_ABI;
+
+#	let the build target determine where it puts its import libray and where its links against its imports
+	my $UnderlyingABI=$ABI;
+	$UnderlyingABI=&PMUnderlyingABI($ABI) if defined &PMUnderlyingABI;
+
+	$Path{Lib}="$E32env::Data{LinkPath}";
+	unless ($ASSPExports) {
+		$Path{Lib}.= lc($UnderlyingABI)."\\";
+	} 
+	else {
+		$Path{Lib}.= lc($Plat{ASSP})."\\";
+	}
+
+
+#	set up link path - this is the place where the target looks for ordinary libraries
+	$Path{Link}="$E32env::Data{LinkPath}"."$UnderlyingABI\\";
+
+#	set up stat link path - this is where the target looks for static libraries
+	$Path{StatLink}="$E32env::Data{LinkPath}";
+	if ($Plat{StatLink}) {
+			$Path{StatLink}.=lc($Plat{StatLink})."\\";
+	} else {
+		unless ($Plat{OS} eq 'WINS') {	# WINC and WINS versions of EEXE are different
+			$Path{StatLink}.=lc($ABI)."\\"; # ARM static libraries are currently always ASSP-independent
+		}
+		else {
+			$Path{StatLink}.=lc($Plat{ASSP})."\\"; # WINC static libraries are currently always ASSP-specific
+		}
+	}
+
+#	set up release path
+	$Path{Rel}="$E32env::Data{RelPath}".lc($Plat{Real})."\\";
+	
+}
+
+sub CreateExtraFile ($$) { # takes abs path for source and text
+# allows modules to create extrafiles
+	my ($FILE,$Text)=@_;
+	if ($Options{makemakefile}) {	# only create if making the makefile
+		if ($Options{v}) {
+			print "Creating \"$FILE\"\n";
+		}
+		eval { &Path_MakePathL($FILE); };
+		die $@ if $@;
+		open FILE, ">$FILE" or die "WARNING: Can't open or create \"$FILE\"\n";
+		print  FILE $Text or die "WARNING: Can't write text to \"$FILE\"\n";
+		close FILE or die "WARNING: Can't close \"$FILE\"\n";
+	}
+}
+
+sub ABI () {
+	$ABI;
+}
+sub AddSrc ($$) { # needs abs path for source
+# allows modules to add a source file to the project and have it created if necessary
+	my ($SRCFILE,$Text)=@_;
+	my $SrcPath=&Path_Split('Path',$SRCFILE);
+	my $CurFile=&Path_Split('File',$SRCFILE);
+	my $BaseName=&Path_Split('Base',$SRCFILE);
+	
+	if ((not -e $SRCFILE) || (-M $SRCFILE > -M $MMPFILE)) {
+		# only create the file if it's older than the .MMP file
+		CreateExtraFile($SRCFILE,$Text);
+	}
+	 my %CurSource;
+	 $CurSource{SrcPath}=$SrcPath;
+	 $CurSource{CurFile}=$CurFile;
+	 $CurSource{BaseTrg}=$BaseName;
+	 push @SourceStruct, \%CurSource;
+}
+sub AddPlatMacros (@) {
+# allows modules to add extra macros to the platform macro list
+	push @{$Plat{Macros}},@_;
+}
+sub AifRef () {
+	$CurAifRef;
+}
+sub AifStructRef () {
+	\@AifStruct;
+}
+sub AllowDllData () {
+	$AllowDllData;
+}
+sub CompressTarget () {
+	$CompressTarget;
+}
+sub CompressTargetMode () {
+	$CompressTargetMode;
+}
+sub BuildAsARM () {
+	return 0 if $Options{ithumb};
+	return 1 if $Options{iarm};
+	$BuildAsARM;
+}
+sub ASSPLibList () {
+	@ASSPLibList;
+}
+sub ASSPLinkPath () {
+#	this is the path where the target looks for ASSP-specific import libraries
+	my $Path=$Path{ASSPLink};
+	if ($CurBld) {
+		if ($Plat{OS} eq 'EPOC32') {
+			$Path.="UREL\\";
+		}
+		else {
+			$Path.="UDEB\\";
+		}
+	}
+	$Path;
+}
+sub BaseMak () {
+	&Path_Split('Base',$MAKEFILE);
+}
+sub BaseResrc () {
+	&Path_Split('Base',$CurResrc);
+}
+sub BaseResrcList () {
+	my @ResrcList=&ResrcList;
+	my $Path;
+	foreach $Path (@ResrcList) {
+		$Path=&Path_Split('Base',$Path);
+	}
+	@ResrcList;
+}
+sub BaseSrc () {
+	&Path_Split('Base',$CurSrc);
+}
+sub ExtSrc () {
+	&Path_Split('Ext',$CurSrc);
+}
+sub BaseSrcList () {
+	my @SrcList=&SrcList;
+	my $Path;
+	foreach $Path (@SrcList) {
+		$Path=&Path_Split('Base',$Path);
+	}
+	@SrcList;
+}
+sub BaseSysResrcList () {
+	my @SysResrcList=&SysResrcList;
+	my $Path;
+	foreach $Path (@SysResrcList) {
+		$Path=&Path_Split('Base',$Path);
+	}
+	@SysResrcList;
+}
+sub BaseTrg () {
+	&Path_Split('Base',$Trg);
+}
+sub BitMapRef () {
+	$CurBitMapRef;
+}
+sub BitMapStructRef () {
+	\@BitMapStruct;
+}
+sub Bld () {
+	$CurBld;
+}
+sub BldList () {
+	@{$Plat{Blds}};
+}
+sub BldPath () {
+	my $Path=$Path{"Bld"};
+	if ($CurBld) {
+		$Path.=$FeatureVariantInfo{$CurBld."_LABEL"}."\\" if (%FeatureVariantInfo && !$FeatureVariantInfo{INVARIANT} && $FeatureVariantInfo{$CurBld."_LABEL"});
+		$Path.="$CurBld\\";
+	}
+	$Path;
+}
+sub CallDllEntryPoints () {
+	$CallDllEntryPoints;
+}
+sub Capability () {
+	$Capability;
+}
+sub CapabilityFlags () {
+	@CapabilityFlags;
+}
+sub DataLinkAddress () {
+	$DataLinkAddress;
+}
+sub DataPath () {
+	$E32env::Data{DataPath};
+}
+sub DebugLibList () {
+	@DebugLibList;
+}
+sub DefFile () {
+	"$Def{Path}$Def{Base}$Def{Ext}";
+}
+sub DefFileType () {
+	$Plat{DefFile};
+}
+sub DepList () {
+	sort @CurDepList;
+}
+sub Doc () {
+	$CurDoc;
+}
+sub DocList () {
+	if ($CurSrcPath) {
+		return sort @{$DocHash{$CurSrcPath}};
+	}
+	my @DocList;
+	my $Key;
+	foreach $Key (keys %DocHash) {
+		push @DocList,@{$DocHash{$Key}};
+	}
+	sort @DocList;
+}
+sub EPOCPath () {
+	$E32env::Data{EPOCPath};
+}
+sub EPOCDataPath () {
+	$E32env::Data{EPOCDataPath};
+}
+sub EPOCIncPath () {
+	$E32env::Data{EPOCIncPath};
+}
+sub EPOCRelPath () {
+	$E32env::Data{RelPath};
+}
+sub EPOCSecurePlatform () {
+	$E32env::Data{SecurePlatform};
+}
+sub EPOCToolsPath () {
+	$E32env::Data{EPOCToolsPath};
+}
+sub Exports () {
+	@{$TrgType{Exports}{$Plat{"DefFile"}}};
+}
+sub ExportUnfrozen () {
+	$ExportUnfrozen;
+}
+sub FirstLib () {
+	$FirstLib;
+}
+sub FixedProcess () {
+	$FixedProcess;
+}
+sub BasicTrgType () {
+	$TrgType{Basic};
+}
+sub HeapSize () {
+	%HeapSize;
+}
+sub LibList () {
+	@LibList;
+}
+sub LibPath () {
+#	this is the path where the target puts it's import library
+	my $Path=$Path{Lib};
+	if ($CurBld) {
+		if (($Plat{DefFile} eq 'EABI') || ($Plat{DefFile} eq 'x86gcc') || ($Plat{OS} eq 'TOOLS2')) {
+			$Path.="lib\\";
+		}
+		elsif ($Plat{OS} eq 'EPOC32') {
+			$Path.="urel\\";
+		}
+		else {
+			$Path.="udeb\\";
+		}
+	}
+	$Path;
+}
+sub LinkAs () {
+	$LinkAs;
+}
+sub LinkAsBase () {
+	$LinkAsBase;
+}
+sub ExportLibrary () {
+	$ExportLibrary;
+}
+sub NoExportLibrary () {
+	$NoExportLibrary;
+}
+sub LinkPath () {
+#	this is the place where the target looks for CPU-specific libraries
+	my $Path=$Path{Link};
+	if ($CurBld) {
+		if ($Plat{DefFile} eq 'EABI' || $Plat{DefFile} eq 'x86gcc') {
+			$Path.="LIB\\";
+		}
+		elsif ($Plat{OS} eq 'EPOC32') {
+			$Path.="UREL\\";
+		}
+		else {
+			$Path.="UDEB\\";
+		}
+	}
+	$Path;
+}
+
+sub MacroList ($) {
+	if ($_[0]) {
+	return @{$BldMacros{$_[0]}};
+	}
+	return @{$Plat{Macros}} unless $CurBld;
+	(@{$Plat{Macros}},@{$BldMacros{$CurBld}});
+}
+
+# returns the file containing Variant specific Macros
+sub VariantFile($)
+{
+    return $variantMacroHRHFile;
+}
+# returns the file containing Variant specific Macros, which may differ from the above if feature variants are used
+sub ResourceVariantFile($)
+{
+    return $ResourceVariantMacroHRHFile;
+}
+sub MakeFilePath () {
+	&Path_Split('Path',$MAKEFILE);
+}
+sub MmpFile () {
+	$MMPFILE;
+}
+sub PerlLibPath () {
+	$PerlLibPath;
+}
+sub Plat () {
+	$Plat{Real};
+}
+sub PlatABI () {
+	$Plat{"ABI"};
+}
+sub PlatCompiler () {
+	$Plat{"Compiler"};
+}
+sub PlatName () {
+	$Plat{Name};
+}
+sub PlatOS () {
+	$Plat{OS};
+}
+sub PlatOverrideList () {
+	@PlatOverrideList;
+}
+sub ProcessPriority () {
+	$ProcessPriority;
+}
+sub RelPath () {
+	my $Path=$Path{Rel};
+	if ($CurBld) {
+		$Path .= lc($CurBld)."\\";
+	}
+	$Path;
+}
+sub ResourceRef () {
+	$CurResourceRef;
+}
+sub ResourceStructRef () {
+	\@ResourceStruct;
+}
+sub SetCurBld($) {
+	$CurBld=$_[0];		# used by ide_cw.pm when handling additional platforms
+}
+sub	SetStdIncPaths (@) {
+# allows module to set standard include paths
+	@StdIncPaths=();
+	my $Path;
+	foreach $Path (@_) {
+		$Path=~s-^(.*[^\\])$-$1\\-o if defined($Path);
+		push @StdIncPaths, $Path;	# only place drive letters may appear, up to modules to handle
+	}
+}
+sub Src () {
+	$CurSrc;
+}
+sub SourceStructRef () {
+	\@SourceStruct;		#array of references to hashes of SOURCEPATH => (filename1, filename2, ...)
+	}
+sub SrcList () {
+	my @SrcList;
+    my $KeyRef;
+    foreach $KeyRef (@SourceStruct) {
+            push @SrcList,$$KeyRef{CurFile};
+           } 
+	 @SrcList;
+}
+
+sub SmpSafe () {
+	$SmpSafe;
+}
+
+sub StackSize () {
+	$StackSize;
+}
+sub StatLibList () {
+	@StatLibList;
+}
+sub StatLinkPath () {
+	my $Path=$Path{StatLink};
+	if ($CurBld) {
+		$Path.="$CurBld\\";
+	}
+	$Path;
+}
+sub StdCpp () {
+	$StdCpp;
+}
+sub NoStdCpp () {
+	$NoStdCpp;
+}
+
+sub NewLib () {
+	$NewLib;
+}
+sub SetStatLinkPath($) {
+	($Path{StatLink}) = @_;
+}
+sub SrcPath () {
+	$CurSrcPath;
+}
+sub SysIncPaths () {
+	@SysIncPaths;
+}
+sub ResourceSysIncPaths () {
+	return @ResourceSysIncPaths;
+}
+sub Trg (;$) {
+	# The optional $bld argument permits (U)DEB and (U)REL distinction in situations where $CurBld isn't set/relevant
+	my ($bld) = @_;
+	$bld = $CurBld if (!$bld);
+
+	return "" if !$Trg;
+
+	my $localTrg = $Trg;	
+	my $vinfo = $FeatureVariantInfo{$bld."_LABEL"};
+	$localTrg =~ s/(\.[^\.]+)$/\.$vinfo$1/ if ($bld && %FeatureVariantInfo && !$FeatureVariantInfo{INVARIANT} && $vinfo);
+	return $localTrg;
+}
+sub TrgPath () {
+	$TrgType{Path};
+}
+sub TrgType () {
+	$TrgType{Name};
+}
+# this can probably go as its always 0 now
+sub KernelTrg () {
+	$TrgType{Kernel};
+}
+sub SystemTrg () {
+	$TrgType{System};
+}
+sub UidList () {
+	@UidList;
+}
+sub UserIncPaths () {
+	@UserIncPaths;
+}
+sub SrcDbg () {
+	$SrcDbg;
+}
+sub CompilerOption
+{
+	my $CompOption=$WarningLevel{$_[0]};
+	$CompOption="" if (!defined($CompOption)); 
+	$CompOption;
+}
+sub LinkerOption
+{
+    my $lnkOption = $LinkerOptions{$_[0]};
+    $lnkOption="" if (!defined($lnkOption));
+    $lnkOption;
+}
+
+sub PlatRec () {
+	%Plat;
+}
+
+sub Version() {
+	%Version;
+}
+
+sub SecureId() {
+	$SecureId;
+}
+
+sub VendorId () {
+	$VendorId;
+}
+
+sub EABIDef () {
+	$EABIDef;
+}
+
+sub ReplaceOptions () {
+	my @ReplacementOptions = ();
+	if (defined($ReplaceOptions{$_[0]}))
+	{
+		@ReplacementOptions=@{$ReplaceOptions{$_[0]}};
+	}	
+	@ReplacementOptions;
+}
+
+sub ARMFPU () {
+	$ARMFPU;
+}
+
+sub IsDebuggable () {
+	$IsDebuggable;
+}
+
+sub PlatTxt2D () {
+	@PlatTxt2D;
+}
+
+sub ToolChain () {
+	my $ToolChain = $TruePlat{Toolchain};
+	$ToolChain ="" if(!defined ($TruePlat{Toolchain}) );
+	$ToolChain;
+}
+
+sub StringTables () 
+{
+	@StringTable;
+}
+
+
+#This generates and adds the generated source of the stringtable to the source list so it's included in the binary.
+sub AddStringTables ()
+{
+	if(@StringTable)
+	{
+		foreach my $stringtable (@StringTable)
+		{
+			my %genSrcHash;
+
+			$genSrcHash{SrcPath} = $Path{Bld};
+			$genSrcHash{CurFile} = $stringtable->{BaseTrg}.".cpp";
+			$genSrcHash{BaseTrg} = $stringtable->{BaseTrg};
+
+			push(@SourceStruct, \%genSrcHash) if !$stringtable->{Hdronly};
+
+			# Execute it now.  This can probably be moved into the makefile by adding a suitable rule
+			# to ensure the resource file is generated before the source tries to #include it.
+			my $stPath = $Path{Bld};
+
+			my $stCpp = $stringtable->{BaseTrg}.".cpp";
+			my $stHeader = lc($stringtable->{BaseTrg}).".h";
+			my $stFile = $stringtable->{STFile};
+			my $stOrigin = $stringtable->{STPath};
+			system("perl -S ecopyfile.pl $stOrigin$stFile $stPath$stFile");
+			system("perl -S stringtable.pl $stPath$stFile");
+
+			#If it's an exported header we'll need to export it.
+			if(defined $stringtable->{ExportPath}) 
+			{
+				my $exportpath = $stringtable->{ExportPath};
+
+				system("perl -S ecopyfile.pl $stPath$stHeader $exportpath\\$stHeader");
+
+				push(@UserIncPaths, $exportpath);
+				push(@StringTableUserIncPaths, $exportpath);
+			}
+			#otherwise we just need the path of the generated header to be added 'userinclude'.
+			else 
+			{
+				push(@UserIncPaths, $Path{Bld});
+				push(@StringTableUserIncPaths, $Path{Bld});
+			}
+		}
+	}
+}
+
+sub CheckSourceMMPMetaData () {
+	%CheckSourceMMPMetaData;
+}
+
+sub CheckSourceMMPIncludes () {
+	%CheckSourceMMPIncludes;
+}
+
+sub CheckSourceURELIncludes () {
+	%CheckSourceURELIncludes;
+}
+
+sub CheckSourceUDEBIncludes () {
+	%CheckSourceUDEBIncludes;
+}
+
+sub CodePagingTargetMode() {
+	$CodePagingTargetMode;
+}
+
+sub DataPagingTargetMode() {
+	$DataPagingTargetMode;
+}
+
+sub DebugSwitchUsed () {
+	return 1 if (defined $DebugSwitch);
+	return 0;
+}
+
+sub SymbolicDebugEnabled () {
+	return $DebugSwitch;
+}
+
+sub IsFunctionCallLogging() {
+	$Options{logfc};
+}
+
+sub IsWideCharMain() {
+	return $IsWideCharMain;
+}
+
+sub MmpMacros(){
+	my @mmpMacros=&Mmp_Macros;
+	return @mmpMacros;
+}
+
+sub FeatureVariantInfo()
+	{
+	return %FeatureVariantInfo;
+	}
+
+sub FeatureVariantVMapFile()
+	{
+	return "" if !%FeatureVariantInfo || defined $FeatureVariantInfo{INVARIANT};
+
+	my $target = RelPath().Trg();
+	$target =~ s/\.$FeatureVariantInfo{$CurBld."_LABEL"}//;
+# modified by SV start: makefile improvement 
+	my $vmap = $target. "." . $FeatureVariantInfo{NAME}.".vmap";
+# modified by SV end: makefile improvement 
+
+	eval { &Path_MakePathL($vmap); };	
+
+	if (featurevariantmap->Save($target, $FeatureVariantInfo{$CurBld."_LABEL"}, $FeatureVariantInfo{NAME}, $FeatureVariantInfo{$CurBld."_FEATURES"}, &Mmp_IsFeatureVariant ? [ 'FEATUREVARIANT' ] : undef))
+		{
+		die "ERROR: Couldn't create feature variant map file \"$vmap\".\n";
+		}
+
+	return $vmap;
+	}
+
+sub FeatureVariantBaseTrg()
+	{
+	# In some situations, for example .sym files, we need a feature variant tagged name
+	# based on the normal BaseTrg i.e. root target name but minus extension.
+	my $localBaseTrg = BaseTrg();
+		
+	if (%FeatureVariantInfo && !defined $FeatureVariantInfo{INVARIANT})
+		{
+		$localBaseTrg .= ".".$FeatureVariantInfo{$CurBld."_LABEL"};
+		}
+
+	return $localBaseTrg;
+	}
+
+sub CommandFile()
+	{
+	my $plat = Plat();	
+	$plat .= ".$FeatureVariantInfo{NAME}" if %FeatureVariantInfo;
+	return MakeFilePath().BaseTrg().".$plat.".Bld().".objects.via";
+	}
+
+#Compiler wrapper option support
+sub CompilerWrapperOption()
+{
+  # Return 1 if compiler wrapper option option(-wrap) is specified else return 0	
+  $IsCompilerWrapperOption;
+}
+
+#Proxy wrapper option support
+sub ProxyWrapperOption()
+{
+  # Return 1 if compiler wrapper option option(-wrap) is specified else return 0	
+  $IsProxyWrapperOption;
+}
+# modified start: makefile improvement 
+sub getSrcSet()
+{
+	return \%CurSrcSet;
+}
+# modified end: makefile improvement 
+
+#1 = STDCPP support is available
+#others = STDCPP support is not available
+my $stdcppsupport;
+
+#STDCPP support check (SYMBIAN_OE_LIBSTDCPP)
+#return non-zero means STDCPP support is available,
+#otherwise it's not available
+sub StdCppSupport()
+{
+	return $stdcppsupport if (defined $stdcppsupport);
+	
+	my @hrhMacros = &Variant_GetMacroList;
+	if (grep /^\s*SYMBIAN_OE_LIBSTDCPP\s*$/, @hrhMacros)
+	{
+		$stdcppsupport = 1;
+	}
+	else
+	{
+	    $stdcppsupport = 0;
+	}
+	
+	return $stdcppsupport;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/makmake/mmp.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2410 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Processes an mmp file and sets up subroutines to return the data
+# 
+#
+
+package Mmp;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Mmp_SetVerbose
+	Mmp_ProcessL
+
+	Mmp_ABI
+	Mmp_AifStruct
+	Mmp_AllowDllData
+	Mmp_CompressTarget
+	Mmp_ASSPExports
+	Mmp_ASSPLibList
+	Mmp_BuildAsARM
+	Mmp_BitMapStruct 
+	Mmp_CallDllEntryPoints
+	Mmp_Capability
+	Mmp_CapabilityFlags
+	Mmp_DataLinkAddress
+	Mmp_DebugLibList 
+	Mmp_Def
+	Mmp_DocHash
+	Mmp_ExportUnfrozen
+	Mmp_FirstLib
+	Mmp_FixedProcess
+	Mmp_HeapSize
+	Mmp_LibList 
+	Mmp_LinkAs
+	Mmp_LinkAsBase
+	Mmp_ExportLibrary
+	Mmp_NewLib
+	Mmp_NoExportLibrary
+	Mmp_Macros
+	Mmp_MmpFlag
+	Mmp_PlatTxt2D
+	Mmp_ProcessPriority
+	Mmp_ResourceStruct 
+	Mmp_SmpSafe
+	Mmp_RamTargets
+	Mmp_RomTargets
+	Mmp_SourceStruct 
+	Mmp_StackSize
+	Mmp_StatLibList 
+	Mmp_SysIncPaths
+	Mmp_Trg
+	Mmp_TrgType
+	Mmp_UidList
+	Mmp_UserIncPaths
+	Mmp_SrcDbg
+	Mmp_StdCpp
+	Mmp_NoStdCpp
+	Mmp_WarningLevel
+	Mmp_LinkerOptions
+	Mmp_Reset
+	Mmp_Uids
+	Mmp_Version
+	Mmp_SecureId
+	Mmp_VendorId
+	Mmp_Replace
+	Mmp_ARMFPU	
+	Mmp_SetIgnoreMissingDef 
+	Mmp_StringTable
+	Mmp_CompressTargetMode
+	Mmp_CodePagingTargetMode
+	Mmp_DataPagingTargetMode
+	Mmp_CheckSourceMMPMetaData
+	Mmp_CheckSourceMMPIncludes
+	Mmp_IsWideCharMain
+	Mmp_IsDebuggable
+	Mmp_IsFeatureVariant
+	Mmp_TestedMacros
+);
+
+
+use Genutl;
+use Prepfile;
+use Pathutl;
+use Trgtype;
+use CheckSource;
+use Cwd;
+
+my %ProcessPriorityNames = (
+	LOW=>'Low',
+	BACKGROUND=>'Background',
+	FOREGROUND=>'Foreground',
+	HIGH=>'High',
+	WINDOWSERVER=>'WindowServer',
+	FILESERVER=>'FileServer',
+	REALTIMESERVER=>'RealTimeServer',
+	SUPERVISOR=>'SuperVisor'
+);
+
+my %CapabilityNames;
+
+my %Mode;
+
+my $ABI;
+my @AifStruct;
+my $AllowDllData=0;
+
+use constant COMPRESS => 0;
+use constant NOCOMPRESS => 1;
+my $CompressTarget=COMPRESS;	# compress the target binary (negative logic)
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+my $CompressTargetMethod=NOCOMPRESSIONMETHOD;   #NONE
+
+my $ASSPABISwitch=0;
+my $ASSPExports=0;
+my @ASSPLibList;
+my @BitMapStruct;
+my $BuildAsARM=0;
+my $CallDllEntryPoints=0;
+my $Capability;
+my @CapabilityFlags=(0,0);
+my %CurSource;
+my $DataLinkAddress='';
+my @DebugLibList;
+my %Def;
+$Def{Path}='';
+$Def{Base}='';
+$Def{Ext}='';
+my %DocHash;
+my $ExportUnfrozen=0;
+my $FirstLib;
+my $FixedProcess=0;
+my %HeapSize;
+my @LangList;
+my @LibList;
+my $LinkAs;
+my $LinkAsBase;
+my $ExportLibrary;
+my $NoExportLibrary;
+my @Macros;
+my %MmpFlag;
+my $NewLib;
+my @PlatTxt2D;
+my $ProcessPriority='';
+my @ResourceStruct;
+my @RamTargets;
+my @RomTargets=({}); # include default
+my $SmpSafe = 0;
+my @SourceStruct;
+my $StackSize='';
+my @StatLibList;
+my $StdCpp = 0;
+my $NoStdCpp = 0;
+my @SysIncPaths;
+my $Trg;
+my %TrgType;
+my @UidList;
+my @UserIncPaths;
+my $SrcDbg=0;
+my %Compiler;
+my %LinkerOptions;
+my %Version;
+my $SecureId;
+my $VendorId;
+my %Replace;
+my $ARMFPU;
+my $IgnoreMissingDef=0;
+my @StringTableStruct;
+my $CodePagingTargetMode;	# 0-N/A, 1-UNPAGED, 2-PAGED
+my $DataPagingTargetMode;	# 0-N/A, 1-UNPAGED, 2-PAGED
+my $WideCharMain=0;
+my $IsDebuggable;	# 0-NON_DEBUGGABLE, 1-DEBUGGABLE,2-DEBUGGABLE_UDEBONLY
+my $FeatureVariant=0;
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+use constant NON_DEBUGGABLE => 0;
+use constant DEBUGGABLE => 1;
+use constant DEBUGGABLE_UDEBONLY => 2;
+my %CheckSourceMMPMetaData;
+my %CheckSourceMMPIncludes;
+my %mmptestedMacrosHash;
+
+# List of deprecated 2nd UIDs. These are checked in a Secure Platform
+my %deprecatedUIDs=
+    (
+    "0x10005e32" => "Unmigrated FEP detected from use of UID 0x10005e32 ",
+    "0x10004cc1" => "Unmigrated Application Initaliser (CEikLibrary deriver) detected from use of UID 0x10004cc1 ",
+    "0x10003a30" => "Unmigrated Conarc plugin detected from use of UID 0x10003a30",
+    "0x10003a19" => "Unmigrated Recogniser detected from use of UID 0x10003a19",
+    "0x10003a37" => "Unmigrated Recogniser detected from use of UID 0x10003a37",
+    "0x10003a34" => "Unmigrated CTL detected from use of UID 0x10003a34"
+    );
+
+
+sub Mmp_Reset() {
+	undef $ABI;
+	undef @AifStruct;
+	$AllowDllData=0;
+	$CompressTarget=COMPRESS;
+    $CompressTargetMethod=NOCOMPRESSIONMETHOD;
+	$ASSPABISwitch=0;
+	$ASSPExports=0;
+	$BuildAsARM=0;
+	undef @ASSPLibList;
+	undef @BitMapStruct;
+	$CallDllEntryPoints=0;
+	undef $Capability;
+	@CapabilityFlags=(0,0);
+	undef $VendorId;
+	$DataLinkAddress='';
+	undef @DebugLibList;
+	undef %Def;
+	$Def{Path}='';
+	$Def{Base}='';
+	$Def{Ext}='';
+	undef %DocHash;
+	$ExportUnfrozen=0;
+	undef $FirstLib;
+	$FixedProcess=0;
+	undef %HeapSize;
+	undef @LangList;
+	undef @LibList;
+	undef $LinkAs;
+	undef $LinkAsBase;
+	undef $ExportLibrary;
+	undef @Macros;
+	undef %MmpFlag;
+	undef $NewLib;
+	undef @PlatTxt2D;
+	$ProcessPriority='';
+	undef @ResourceStruct;
+	undef @RamTargets;
+	@RomTargets=({}); # include default
+	undef @SourceStruct;   
+	$StackSize='';
+	undef @StatLibList;
+	$SmpSafe = 0;
+	$StdCpp = 0;
+	$NoStdCpp = 0;
+	undef @SysIncPaths;
+	undef $Trg;
+	undef %TrgType;
+	undef @UidList;
+	undef @UserIncPaths;
+	$SrcDbg=0;
+	undef %Compiler;
+	undef %LinkerOptions;
+    undef %Version;
+    $IgnoreMissingDef=0;
+    undef $ARMFPU;
+	undef @StringTableStruct;
+	$CodePagingTargetMode=0;	# default N/A
+	$DataPagingTargetMode=0;	# default N/A
+	$IsDebuggable=0; # Default = 0 (Not debuggable)
+	undef %mmptestedMacrosHash;
+}
+
+BEGIN {
+	$Mode{'Verbose'}=0;
+
+	%CapabilityNames = (
+
+		TCB =>					(1<<0),
+		COMMDD =>				(1<<1),
+		POWERMGMT =>			(1<<2),
+		MULTIMEDIADD =>			(1<<3),
+		READDEVICEDATA =>		(1<<4),
+		WRITEDEVICEDATA =>		(1<<5),
+		DRM =>					(1<<6),
+		TRUSTEDUI =>			(1<<7),
+		PROTSERV =>				(1<<8),
+		DISKADMIN =>			(1<<9),
+		NETWORKCONTROL =>		(1<<10),
+		ALLFILES =>				(1<<11),
+		SWEVENT =>				(1<<12),
+		NETWORKSERVICES =>		(1<<13),
+		LOCALSERVICES =>		(1<<14),
+		READUSERDATA =>			(1<<15),
+		WRITEUSERDATA =>		(1<<16),
+		LOCATION =>				(1<<17),
+		SURROUNDINGSDD =>		(1<<18),
+		USERENVIRONMENT =>		(1<<19),
+#old capability names have zero value
+		ROOT =>				0,
+		MEDIADD =>			0,
+		READSYSTEMDATA =>	0,
+		WRITESYSTEMDATA =>	0,
+		SOUNDDD =>			0,
+		UIDD =>				0,
+		KILLANYPROCESS =>	0,
+		DEVMAN =>			0,
+		PHONENETWORK =>		0,
+		LOCALNETWORK =>		0
+	);
+	my $all=0;
+	foreach (keys %CapabilityNames)
+		{
+		$all = $all | $CapabilityNames{$_};
+		}
+	$CapabilityNames{"ALL"} = $all;
+}
+
+sub Mmp_SetVerbose () {
+	$Mode{'Verbose'}=1;
+}
+
+sub Mmp_SetIgnoreMissingDef() {
+    $IgnoreMissingDef = 1;
+}
+
+sub Mmp_ProcessL ($$$$) {
+	my ($EPOCPath, $MMPFILE, $Plat_ref, $BuildIncList)=@_;
+	my $emulator = $$Plat_ref{OS} ne 'EPOC32';
+
+	if ($Mode{Verbose}) {
+		&Prepfile_SetVerbose;
+	}
+
+	# Generate macro usage information and add variant build includes
+	my $options = '-dU';
+	foreach ( @$BuildIncList )
+		{
+		$options .= ' -I ' . &Path_PrefixWithDriveAndQuote($_);
+		}
+
+#	preprocess the project description file
+	my @Mmp2D;
+	Prepfile_SetCmdOptions($options);
+	eval { &Prepfile_ProcessL(\@Mmp2D, $MMPFILE, &main::VariantFile(), @{$$Plat_ref{MmpMacros}}); };
+	Prepfile_SetCmdOptions('');
+	die $@ if $@;
+
+	my @checkSourceMacros;
+	foreach (@{$$Plat_ref{MmpMacros}}) {
+		$_=uc $_;
+		push @checkSourceMacros, " $_=_____$_";
+	}
+
+	my $current = cwd;
+	$current =~ s/\//\\/g;
+	$current =~ s/^[a-zA-Z]://;
+
+	# Mimic what the current parsing routine does in terms of include paths and .mmp files
+	my @checkSourceUserIncludePaths;
+	push @checkSourceUserIncludePaths, "$ENV{EPOCROOT}epoc32\\include";
+	push @checkSourceUserIncludePaths, "\.";
+	push @checkSourceUserIncludePaths, $current;
+	my @checkSourceSystemIncludePaths = ();
+
+	CheckSource_Includes($MMPFILE, %CheckSourceMMPIncludes, &main::VariantFile(), @checkSourceMacros, @checkSourceUserIncludePaths, @checkSourceSystemIncludePaths, $CheckSource_NoUserSystemDistinction);
+
+	my $NoStrictDef=0;
+	my $TrgPath='';
+	my $TrgType;
+
+	my $MmpPath=&Path_Split('Path', $MMPFILE);
+
+	my @MmpDie=();
+	my @MmpWarn=();
+	my @MmpDiagnostic=();
+	my @MmpMigrationNote=();
+
+	my (%CheckAif, %CheckASSPLib, %CheckDoc, %CheckLang, %CheckLib, %CheckMacro, %CheckResrc, %CheckSrc, %CheckStatLib, %CheckSysInc, %CheckSysResrc, %CheckUserInc);
+
+	my ($CheckDef);
+
+	my ($CheckRamTargets, $CheckRomTargets);
+
+	my ($OtherPlatSwitch, $PlatTxtSwitch);
+
+	my (%CurBitMap, $CurBitMapSrcPath);
+	$CurBitMapSrcPath=$MmpPath;
+
+	my (%CurResource, %ResourceCheckLang);
+
+	my %CurStringTable;
+	my ($CurSrcPath, $MmpMacro, $Line);
+	$CurSrcPath=$MmpPath;
+
+#	include the .MMP file as a document
+	@{$DocHash{$MmpPath}}=(&Path_Split('File', $MMPFILE));
+	$CheckDoc{$MMPFILE}='zero - specified by default';
+
+# process the data structure
+	my $CurFile=$MMPFILE;
+	LINE: foreach $Line (@Mmp2D) {
+		my $LineNum=shift @$Line;
+		$_=shift @$Line;
+		if ($LineNum eq '#') {
+			$CurFile=$_;
+			next LINE;
+		}
+
+		# Get details of tested macros affecting the MMP file
+		# We get this from -dU preprocessor option
+		if (/^#define$/ && "@$Line" =~ /^(\w+(?:\([^\)]*\))?)(?:\s(\S.*?))?\s*$/)
+			{
+			# Record macro details for defined tested macro
+			$mmptestedMacrosHash{$1} = $2 ? "\'$2\'" : 'defined';
+			next LINE;
+			}
+		elsif (/^#undef$/)
+			{
+			# Record macro details for undefined tested macro
+			$mmptestedMacrosHash{"@$Line"} = 'undefined';
+			next LINE;
+			}
+				
+		$CurFile = &Path_Norm ($CurFile);
+		
+		$_=uc $_;
+
+		my $mainElement = $_;
+		
+		if ($PlatTxtSwitch) {
+			if (/^END$/o) {
+				$PlatTxtSwitch=0;
+				next LINE;
+			}
+			push @PlatTxt2D, [ "$CurFile($LineNum)", $_, @$Line ];
+			next LINE;
+		}
+		if ($OtherPlatSwitch) {
+			if (/^END$/o) {
+				$OtherPlatSwitch=0;
+				next LINE;
+			}
+			next LINE;
+		}
+		# ----------- handle body of START BITMAP ... END -------------
+		if (%CurBitMap) {
+			if (/^SOURCE$/o) {
+				unless (@$Line>1) {
+					push @MmpDie, "$CurFile($LineNum) : Not enough arguments for Bitmap keyword SOURCE\n";
+				}
+				my $cldepth = shift @$Line;
+				my @ClDepths = split(/,/, $cldepth);
+				foreach (@ClDepths) {
+					$_ = lc $_; # bmconv can't handle upper-case 'C's
+					unless (/^c?\d\d?a?$/o) {
+						push @MmpDie, "$CurFile($LineNum) : BITMAP color depth \"$_\" - unexpected format\n";
+					}
+				}
+				@ClDepths = (@ClDepths) x @$Line;	# make a sufficiently long list of color depths
+				foreach (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "BITMAP SOURCE", $_, $LineNum, $CheckSource_PhysicalCheck, $CurBitMapSrcPath);
+					$_ = &Path_Norm($_);
+					
+					$_=lc $_;	# bmconv generates a header with case-sensitive enums
+					my $bitmap = "$CurBitMapSrcPath$_";
+					push @{$CurBitMap{Source}}, { # sources must be kept in order
+						Src=>$bitmap,
+						ClDepth=>shift @ClDepths	# take next color depth from the list
+					};
+					unless (-e $bitmap) {
+						push @MmpWarn, "$CurFile($LineNum) : BITMAP source \"$CurBitMapSrcPath$_\" not found\n";
+					}
+				}
+				next LINE;
+			}
+			if (/^END$/o) {
+				$CurBitMapSrcPath=$MmpPath;
+				my %BitMap=%CurBitMap;
+				undef %CurBitMap;
+				push @BitMapStruct, \%BitMap;
+				next LINE;
+			}
+			if (/^SOURCEPATH$/o) {
+				unless ($CurBitMapSrcPath=shift @$Line) {
+					push @MmpDie, "$CurFile($LineNum) : No path specified with Bitmap keyword SOURCEPATH\n";
+					next LINE;
+				}
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "BITMAP SOURCEPATH", $CurBitMapSrcPath, $LineNum, $CheckSource_PhysicalCheck);
+				$CurBitMapSrcPath = &Path_Norm($CurBitMapSrcPath);
+				
+				$CurBitMapSrcPath=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+				$CurBitMapSrcPath=&Path_MakeAbs($CurFile,$CurBitMapSrcPath);
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for Bitmap keyword SOURCEPATH\n";
+				}
+				next LINE;
+			}
+			if (/^HEADER$/o) {
+				if ($CurBitMap{Hdr}) {
+					push @MmpWarn, "$CurFile($LineNum) : Bitmap HEADER already specified at line $CurBitMap{Hdr}\n";
+					next LINE;
+				}
+				$CurBitMap{Hdr}="$CurFile($LineNum)";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Bitmap keyword HEADER takes no arguments\n";
+				}
+				next LINE;
+			}
+
+
+			if (/^TARGETPATH$/o) {
+				if ($CurBitMap{TrgPath}) {
+					push @MmpWarn, "$CurFile($LineNum) : Bitmap TARGETPATH already specified\n";
+					next LINE;
+				}
+				unless ($CurBitMap{TrgPath}=shift @$Line) {
+					push @MmpDie, "$CurFile($LineNum) : No path specified with Bitmap keyword TARGETPATH\n";
+					next LINE;
+				}
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "BITMAP TARGETPATH", $CurBitMap{TrgPath}, $LineNum);
+				$CurBitMap{TrgPath} = &Path_Norm($CurBitMap{TrgPath});
+
+				$CurBitMap{TrgPath}=~s-^\\(.*)$-$1-o;        # remove leading backslash, if any
+				$CurBitMap{TrgPath}=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+				$CurBitMap{TrgPath}="z\\$CurBitMap{TrgPath}";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for Bitmap keyword TARGETPATH\n";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Unrecognised Bitmap Keyword \"$_\"\n";
+		}
+		
+		# ----------- handle body of START RESOURCE ... END -------------
+		if (%CurResource) {
+			if (/^END$/o) {
+				$CurResource{SrcPath}=$CurSrcPath;
+				my %Resource=%CurResource;
+				undef %CurResource;
+				push @ResourceStruct, \%Resource;
+				undef %ResourceCheckLang;
+				next LINE;
+			}
+			if (/^HEADER$/o) {
+				if ($CurResource{Hdr}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource HEADER already specified at line $CurResource{Hdr}\n";
+					next LINE;
+				}
+				elsif ($CurResource{Hdronly}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource HEADERONLY already specified at line $CurResource{Hdr}\n";
+					next LINE;
+				}
+				$CurResource{Hdr}="$CurFile($LineNum)";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource keyword HEADER takes no arguments\n";
+				}
+				next LINE;
+			}
+			if (/^HEADERONLY$/o) {
+				if ($CurResource{Hdronly}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource HEADERONLY already specified at line $CurResource{Hdr}\n";
+					next LINE;
+				}
+				elsif ($CurResource{Hdr}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource HEADER already specified at line $CurResource{Hdr}\n";
+					next LINE;
+				}
+				$CurResource{Hdronly}="$CurFile($LineNum)";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource keyword HEADERONLY takes no arguments\n";
+				}
+				next LINE;
+			}
+
+			if (/^LANG$/o) {
+				if (@$Line) {
+					my $Candidate;
+					foreach $Candidate (@$Line) {
+						if ($ResourceCheckLang{$Candidate}) {
+							push @MmpWarn, "$CurFile($LineNum) : Duplicate Language \"$Candidate\" at line $ResourceCheckLang{$Candidate}\n";
+							next; 
+						}
+						push @{$CurResource{Lang}}, $Candidate;
+						$ResourceCheckLang{$Candidate}="$CurFile($LineNum)";
+					}
+					next LINE;
+				}
+				push @MmpWarn, "$CurFile($LineNum) : No Languages specified for keyword LANG\n";
+				next LINE;
+			}
+			if (/^TARGET$/o) {
+				if ($CurResource{BaseTrg}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource TARGET already specified\n";
+					next LINE;
+				}
+			    my $src=shift @$Line;
+			    CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "RESOURCE TARGET", $src, $LineNum);
+			    
+			    $src = &Path_Norm($src);
+				$CurResource{BaseTrg}=&Path_Split('Base',$src);
+				unless ($CurResource{BaseTrg}) {
+					push @MmpDie, "$CurFile($LineNum) : No name specified with Resource keyword TARGET\n";
+					next LINE;
+				}
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for Resource keyword TARGET\n";
+				}
+				next LINE;
+			}
+			if (/^TARGETPATH$/o) {
+				if ($CurResource{TrgPath}) {
+					push @MmpWarn, "$CurFile($LineNum) : Resource TARGETPATH already specified\n";
+					next LINE;
+				}
+				unless ($CurResource{TrgPath}=shift @$Line) {
+					push @MmpDie, "$CurFile($LineNum) : No path specified with Resource keyword TARGETPATH\n";
+					next LINE;
+				}
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "RESOURCE TARGETPATH", $CurResource{TrgPath}, $LineNum);
+				$CurResource{TrgPath} = &Path_Norm($CurResource{TrgPath});
+				
+				$CurResource{TrgPath}=~s-^\\(.*)$-$1-o;        # remove leading backslash, if any
+				$CurResource{TrgPath}=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+				$CurResource{TrgPath}="z\\$CurResource{TrgPath}";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for Resource keyword TARGETPATH\n";
+				}
+				next LINE;
+			}
+			if (/^UID$/o) {
+				if (@$Line) {
+					if (scalar @$Line>2) {
+						push @MmpWarn, "$CurFile($LineNum) : Can't specify more than 2 Uids\n";
+						next LINE;
+					}
+					foreach (@$Line) {
+						$_=&Genutl_AnyToHex($_);
+						if (defined $_) {
+							push @{$CurResource{Uids}}, $_;
+							next;
+						}
+						push @MmpDie, "$CurFile($LineNum) : Uid doesn't fit expected number format\n";
+						next LINE;
+					}
+					next LINE;
+				}
+				push @MmpWarn, "$CurFile($LineNum) : No Uids specified for Resource keyword UID\n";
+				next LINE;
+			}
+			if (/^DEPENDS$/o) {
+				# Note that DEPENDS lines are tolerated, but ignored - these are only relevant to build systems
+				# other than ABLD
+				next LINE;
+			}
+			
+			push @MmpWarn, "$CurFile($LineNum) : Unrecognised Resource Keyword \"$_\"\n";
+		}
+		if (/^WCHARENTRYPOINT$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			if ($TrgType=~/^STDEXE$/io) {
+				$WideCharMain=1;	
+			}
+			else{
+				push @MmpWarn, "$CurFile($LineNum) : WCHARENTRYPOINT is supported only for Target Type STDEXE\n";
+			}
+			next LINE;
+		}
+		# ----------- handle body of START STRINGTABLE ... END -------------
+		if(%CurStringTable)
+		{	
+			if (/^END$/o) {
+				my %stringtable = %CurStringTable;
+				push @StringTableStruct, \%stringtable;
+				undef %CurStringTable;
+				next LINE;
+			}
+			if (/^EXPORTPATH/o) {
+				if (scalar @$Line != 1) {
+					push @MmpDie, "$CurFile($LineNum) : Wrong number of arguments for EXPORTPATH\n";
+				} 
+				if(defined $CurStringTable{ExportPath})	{
+					push @MmpDie, "$CurFile($LineNum) : Redefinition of EXPORTPATH\n";
+				}
+				else {
+				    my $src=shift @$Line;
+					$CurStringTable{ExportPath} = $src;
+
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "STRINGTABLE EXPORTPATH", $CurStringTable{ExportPath}, $LineNum);
+					
+					$CurStringTable{ExportPath} = &Path_Norm($CurStringTable{ExportPath});					
+
+					$CurStringTable{ExportPath} =~ s/\\$//o;   # ensure path doesn't end with a backslash (cl_generic.pm will add one)
+					$CurStringTable{ExportPath} = &Path_MakeEAbs($EPOCPath,$CurFile,$CurStringTable{ExportPath});
+
+				}
+				next LINE;
+			}
+			if (/^HEADERONLY$/o) {
+				if ($CurStringTable{Hdronly}) {
+					push @MmpWarn, "$CurFile($LineNum) : Stringtable HEADERONLY already specified\n";
+					next LINE;
+				}
+				$CurStringTable{Hdronly}="$CurFile($LineNum)";
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Stringtable keyword HEADERONLY takes no arguments\n";
+				}
+				next LINE;
+			}
+		}
+		# ----------- handle top-level MMP file -------------------	
+		if (/^START$/) {
+			unless ($_=uc shift @$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : No Argument specified for START block\n";
+				next LINE;
+			}
+			foreach $MmpMacro (@{$$Plat_ref{MmpMacros}}) {
+				if ($_ eq $MmpMacro) {
+					$PlatTxtSwitch="$CurFile($LineNum)";
+					next LINE;
+				}
+			}
+			if ($_ eq 'BITMAP') {
+				unless ($CurBitMap{Trg}=shift @$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : No Bitmap Target specified\n";
+					$CurBitMap{Trg}='NoTargetSpecified';
+				}
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for START BITMAP clause\n";
+				}
+
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "START BITMAP", $CurBitMap{Trg}, $LineNum);
+				$CurBitMap{Trg} = &Path_Norm($CurBitMap{Trg});
+				next LINE;
+			}
+			if ($_ eq 'RESOURCE') {
+				if (scalar @$Line != 1) {
+					push @MmpWarn, "$CurFile($LineNum) : Wrong number of arguments for START RESOURCE clause\n";
+				} 
+				else {
+				    my $src=shift @$Line;
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "START RESOURCE", $src, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$src = &Path_Norm($src);
+				    
+					$CurResource{Source}="$CurSrcPath$src";
+				}
+
+				
+				next LINE;
+			}
+			if ($_ eq 'STRINGTABLE') {
+				if (scalar @$Line != 1) {
+					push @MmpWarn, "$CurFile($LineNum) : Wrong number of arguments for START STRINGTABLE clause\n";
+				} 
+				else {
+				    my $Candidate = shift @$Line;
+				    CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "START STRINGTABLE", $Candidate, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$Candidate = &Path_Norm($Candidate);
+				    
+					$Candidate =~ s/^\\//;	# remove leading \, if any	
+					$CurStringTable{BaseTrg}=&Path_Split('Base',$Candidate);
+					my $path=&Path_Split('Path',$Candidate);
+					if($path){
+					  $CurStringTable{STPath}=&Path_MakeAbs($CurSrcPath,&Path_Split('Path',$Candidate));
+					}
+					else {
+					  $CurStringTable{STPath}=$CurSrcPath;
+					}
+					$CurStringTable{STFile}=&Path_Split('File',$Candidate);
+
+				}
+				next LINE;
+			}
+			$OtherPlatSwitch="$CurFile($LineNum)";
+			next LINE;
+		}
+
+		if (/^AIF$/o) {
+			my ($trg, $dir, $file, $clDepth, @bitmaps)=@$Line;
+			unless ($file) { # bitmaps aren't essential
+				push @MmpDie, "$CurFile($LineNum) : Not enough arguments for keyword AIF\n";
+				next LINE;
+			}
+			my %Data;
+			$Data{Trg} = $trg;	# Defect: may include directory
+			$dir=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+			$Data{Source}=&Path_MakeAbs($CurFile, "$dir$file");
+			unless (-e "$Data{Source}") {
+				push @MmpWarn, "$CurFile($LineNum) : AIF source \"$Data{Source}\" not found\n";
+			}
+			if ($CheckAif{$Data{Trg}}) {
+				push @MmpDie, "$CurFile($LineNum) : Duplicate Aif \"$Data{Trg}\" at line $CheckAif{$Data{Trg}}\n";
+				next LINE;
+			}
+			$CheckAif{$Data{Trg}}="$CurFile($LineNum)";
+			push @AifStruct, \%Data;
+			next LINE unless (@bitmaps);
+			# handle bitmaps
+			my @ClDepths = split(/,/, $clDepth);
+			foreach (@ClDepths) {
+				$_ = lc $_; # bmconv can't handle upper-case 'C's
+				unless (/^c?\d\d?$/o) {
+					push @MmpDie, "$CurFile($LineNum) : AIF color depth \"$_\" - unexpected format\n";
+				}
+			}
+			@ClDepths = (@ClDepths) x @bitmaps;	# make a sufficiently long list of color depths
+			foreach $file (@bitmaps) {
+				if ($file !~ /^\\/) {
+					$file = &Path_MakeAbs($CurFile, "$dir$file");
+				}
+				push @{$Data{BitMaps}}, { # sources must be kept in order
+					Src=>$file,
+					ClDepth=>shift @ClDepths	# take next color depth from the list
+				};
+				unless (-e $file) {
+					push @MmpWarn, "$CurFile($LineNum) : AIF source \"$file\" not found\n";
+				}
+			}
+			next LINE;
+		}
+		if (/^ASSPABI$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$ASSPABISwitch=1;
+			next LINE;
+		}
+		if (/^ASSPEXPORTS$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$ASSPExports=1;
+			next LINE;
+		}
+		if (/^ASSPLIBRARY$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum);
+					$Candidate = &Path_Norm($Candidate);
+					
+					unless ($emulator or &Genutl_ParseVersionedName(\$Candidate)) {
+						push @MmpWarn, "$CurFile($LineNum) : Bad version in ASSPLIBRARY\n";
+					}
+					if ($CheckASSPLib{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Library \"$Candidate\" at line $CheckASSPLib{$Candidate}\n";
+						next; 
+					}
+					
+					push @ASSPLibList, $Candidate;
+					$CheckASSPLib{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Libraries specified for keyword ASSPLIBRARY\n";
+			next LINE;
+		}
+		if (/^CAPABILITY$/o) {
+			if (defined($Capability)) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine CAPABILITY\n";
+				next LINE;
+			}
+			if (scalar @$Line == 0) {
+				push @MmpWarn, "$CurFile($LineNum) : Wrong number of arguments for CAPABILITY\n";
+				next LINE;
+			}
+			foreach my $capname (@$Line) {
+				my $invert = 0;
+				if ($capname =~ /^-(\w*)/) {
+					$invert = 0xffffffff;
+					$capname = $1;
+				}
+				my $capFlag = 0;
+				if (defined($CapabilityNames{uc $capname})) {
+					$capFlag = $CapabilityNames{uc $capname};
+					if (not $capFlag) {
+						push @MmpDiagnostic, "$CurFile($LineNum) : Use of old capability name, \"$capname\" ignored\n";
+						next;
+					}
+					if ("ALL" eq uc $capname and $invert) {
+						push @MmpWarn, "Capability '-ALL' not allowed";
+						next;
+					}
+				}
+				elsif ("NONE" eq uc $capname) {
+					if($invert) {
+						push @MmpWarn, "Capability '-NONE' not allowed";
+						next;
+					}
+				}
+				else {
+					push @MmpWarn, "$CurFile($LineNum) : Unknown capability \"$capname\" ignored\n";
+					next;
+				}
+				# append name to capability string
+				if (defined($Capability) and not $invert) { $Capability .= "+"; }
+				if($invert) { $Capability .= "-"; }
+				$Capability .= $capname;
+
+				# add capability mask to flags
+				$CapabilityFlags[0] = $CapabilityFlags[0] ^ $invert;
+				$CapabilityFlags[0] = $CapabilityFlags[0] | $capFlag;
+				$CapabilityFlags[0] = $CapabilityFlags[0] ^ $invert;
+				$CapabilityFlags[1] = 0;
+				next;
+			}
+			next LINE;
+		}
+		if (/^DEBUGLIBRARY$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum);
+					$Candidate = &Path_Norm($Candidate);
+					
+					unless ($emulator or &Genutl_ParseVersionedName(\$Candidate)) {
+						push @MmpWarn, "$CurFile($LineNum) : Bad version in DEBUGLIBRARY\n";
+					}
+					if ($CheckLib{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Library \"$Candidate\" at line $CheckLib{$Candidate}\n";
+						next; 
+					}
+					
+					push @DebugLibList, $Candidate;
+					$CheckLib{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Libraries specified for keyword DEBUGLIBRARY\n";
+			next LINE;
+		}
+		if (/^DEFFILE$/o)  {
+			if ($CheckDef) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine DEFFILE\n";
+				next LINE;
+			}
+			$CheckDef=1;
+			unless ($_=shift @$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : No file specified for keyword DEFFILE\n";
+				next LINE;
+			}
+
+			$Def{CheckSource_MMPEntry} = $_;		
+			$Def{CheckSource_LineNumber} = $LineNum;
+			$Def{CheckSource_MMPFile} = $CurFile;
+			
+			$_ = &Path_Norm($_);
+			
+			$Def{Base}=&Path_Split('Base',$_);
+			$Def{Ext}=&Path_Split('Ext',$_);
+			$Def{Path}=&Path_Split('Path',$_);
+			
+			if ($Def{Path}) {
+				$Def{Path}=&Path_MakeEAbs($EPOCPath,$CurFile,$Def{Path});
+			}
+
+			if ($Def{Base} =~ /\{|\}/) {
+				push @MmpDie, "$CurFile($LineNum) : Bad DEFFILE name\n";
+			}
+			next LINE;
+		}
+		if (/^DOCUMENT$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$Candidate = &Path_Norm($Candidate);
+					
+					if ($CheckDoc{"$CurSrcPath$Candidate"}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Document \"$CurSrcPath$Candidate\" at line ", $CheckDoc{"$CurSrcPath$Candidate"}, "\n";
+						next; 
+					}
+					unless (-e "$CurSrcPath$Candidate") {
+						push @MmpWarn, "$CurFile($LineNum) : DOCUMENT \"$CurSrcPath$Candidate\" not found\n";
+					}
+					
+					push @{$DocHash{$CurSrcPath}}, $Candidate;
+					$CheckDoc{"$CurSrcPath$Candidate"}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Files specified for keyword DOCUMENT\n";
+			next LINE;
+		}
+		if (/^EPOCALLOWDLLDATA$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$AllowDllData=1;
+			next LINE;
+		}
+		if (/^ALWAYS_BUILD_AS_ARM$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$BuildAsARM=1;
+			next LINE;
+		}
+		if (/^EPOCCALLDLLENTRYPOINTS$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$CallDllEntryPoints=1;
+			next LINE;
+		}
+		if (/^EPOCDATALINKADDRESS$/o) {
+			if (@$Line) { 
+				my $temp=&main::Genutl_AnyToHex(shift @$Line);
+				if (defined $temp) {
+					$DataLinkAddress=$temp;
+					next LINE;
+				}
+				push @MmpDie, "$CurFile($LineNum) : Data link address doesn't fit expected number format\n";
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No data link address specified for keyword $_\n";
+			next LINE;
+		}
+		if (/^EPOCFIXEDPROCESS$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$FixedProcess=1;
+			next LINE;
+		}
+		if (/^EPOCHEAPSIZE$/o) {
+			if (@$Line) {
+				my $tempMin=&main::Genutl_AnyToHex(shift @$Line);
+				if (defined $tempMin) {
+					if (@$Line) {
+						my $tempMax=&main::Genutl_AnyToHex(shift @$Line);
+						if (defined $tempMax) {
+							$HeapSize{Min}=$tempMin;
+							$HeapSize{Max}=$tempMax;
+							next LINE;
+						}
+						push @MmpDie, "$CurFile($LineNum) : maximum heap size doesn't fit expected number format\n";
+						next LINE;
+					}
+					push @MmpDie, "$CurFile($LineNum) : No maximum heap size specified for keyword $_\n";
+					next LINE;
+				}
+				push @MmpDie, "$CurFile($LineNum) : minimum heap size doesn't fit expected number format\n";
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No minimum heap size specified for keyword $_\n";
+			next LINE;
+		}
+		if (/^EPOCPROCESSPRIORITY$/o) {
+			if ($ProcessPriority) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine EPOCPROCESSPRIORITY\n";
+				next LINE;
+			}
+			if ($ProcessPriority=shift @$Line) {
+				if (defined($ProcessPriorityNames{uc $ProcessPriority})) {
+					$ProcessPriority = $ProcessPriorityNames{uc $ProcessPriority}; # canonical form
+					next LINE;
+				}
+				push @MmpDie, "$CurFile($LineNum) : ProcessPriority \"$ProcessPriority\" not supported\n";
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Priority specified for keyword EPOCPROCESSPRIORITY\n";
+			next LINE;
+		}
+		if (/^EPOCSTACKSIZE$/o) {
+			if (@$Line) {
+				my $temp=&main::Genutl_AnyToHex(shift @$Line);
+				if (defined $temp) {
+					$StackSize=$temp;
+					next LINE;
+				}
+				push @MmpDie, "$CurFile($LineNum) : Stack size doesn't fit expected number format\n";
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No stack size specified for keyword STACKSIZE\n";
+			next LINE;
+		}
+		if (/^COMPRESSTARGET$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$CompressTarget=COMPRESS;
+            $CompressTargetMethod=NOCOMPRESSIONMETHOD; # means 'use default'
+			next LINE;
+		}
+		if (/^NOCOMPRESSTARGET$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$CompressTarget=NOCOMPRESS;
+            $CompressTargetMethod=NOCOMPRESSIONMETHOD;
+			next LINE;
+		}
+        if (/^INFLATECOMPRESSTARGET$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+            $CompressTarget=COMPRESS;
+			$CompressTargetMethod=INFLATECOMPRESSIONMETHOD;
+			next LINE;
+		}
+		if (/^BYTEPAIRCOMPRESSTARGET$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+            $CompressTarget=COMPRESS;
+			$CompressTargetMethod=BYTEPAIRCOMPRESSIONMETHOD;
+			next LINE;
+		}
+		if (/^EXPORTUNFROZEN$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$ExportUnfrozen=1;
+			next LINE;
+		}
+		if (/^FIRSTLIB$/o) {
+			if ($FirstLib) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine FIRSTLIB\n";
+				next LINE;
+			}
+			if ($FirstLib=shift @$Line) {
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $FirstLib, $LineNum);
+				$FirstLib = &Path_Norm($FirstLib);
+				next LINE;
+			}
+			
+			push @MmpWarn, "$CurFile($LineNum) : Nothing specified for keyword FIRSTLIB\n";
+			next LINE;
+		}
+		if (/^LANG$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					if ($CheckLang{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Language \"$Candidate\" at line $CheckLang{$Candidate}\n";
+						next; 
+					}
+					push @LangList, $Candidate;
+					$CheckLang{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Languages specified for keyword LANG\n";
+			next LINE;
+		}
+		if (/^LIBRARY$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum);
+					$Candidate = &Path_Norm($Candidate);
+					
+					unless ($emulator or &Genutl_ParseVersionedName(\$Candidate)) {
+						push @MmpWarn, "$CurFile($LineNum) : Bad version in LIBRARY\n";
+					}
+					if ($CheckLib{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Library \"$Candidate\" at line $CheckLib{$Candidate}\n";
+						next; 
+					}
+					
+					push @LibList, $Candidate;
+					push @DebugLibList, $Candidate;	    # appears in both
+					$CheckLib{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Libraries specified for keyword LIBRARY\n";
+			next LINE;
+		}
+		if (/^LINKAS$/o) {
+			if ($LinkAs) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine LINKAS\n";
+				next LINE;
+			}
+			if ($LinkAs=shift @$Line) {
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No name specified for keyword LINKAS\n";
+			next LINE;
+		}
+		if (/^EXPORTLIBRARY$/o) {
+			if ($NoExportLibrary) {
+				push @MmpDie, "$CurFile($LineNum) : Can't specify both EXPORTLIBRARY and NOEXPORTLIBRARY\n";
+				next LINE;
+			}
+			if ($ExportLibrary) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine EXPORTLIBRARY\n";
+				next LINE;
+			}
+			if ($ExportLibrary=shift @$Line) {
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $ExportLibrary, $LineNum);
+				$ExportLibrary = &Path_Norm($ExportLibrary);
+				$ExportLibrary=&Path_Split('Base',$ExportLibrary);
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No name specified for keyword EXPORTLIBRARY\n";
+			next LINE;
+		}
+		if (/^NOEXPORTLIBRARY$/o) {
+			if ($ExportLibrary) {
+				push @MmpDie, "$CurFile($LineNum) : Can't specify both EXPORTLIBRARY and NOEXPORTLIBRARY\n";
+				next LINE;
+			}
+			$NoExportLibrary = 1;
+			next LINE;
+		}
+		if (/^NEWLIB$/o) {
+			if ($NewLib) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine NEWLIB\n";
+				next LINE;
+			}
+			if ($NewLib = shift @$Line) {
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $NewLib, $LineNum);
+				$NewLib = &Path_Norm($NewLib);
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No library specified for keyword NEWLIB\n";
+			next LINE;
+		}
+		if (/^MACRO$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					if ($CheckMacro{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Macro \"$Candidate\" at line $CheckMacro{$Candidate}\n";
+						next; 
+					}
+					push @Macros, $Candidate;
+					$CheckMacro{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			next LINE; 
+		}
+		if (/^NOSTRICTDEF$/o) {
+			if ($NoStrictDef) {
+				push @MmpWarn, "$CurFile($LineNum) : NOSTRICTDEF already set\n";
+				next LINE;
+			}
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword NOSTRICTDEF takes no arguments\n";
+			}
+			$NoStrictDef=1;
+			next LINE;
+		}
+		if (/^RAMTARGET$/o) {
+			if ($CheckRamTargets) {
+				push @MmpWarn, "$CurFile($LineNum) : RAM targets already specified at line $CheckRamTargets\n";
+				next LINE;
+			}
+			$CheckRamTargets="$CurFile($LineNum)";
+			unless (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : No targets specified for keyword RAMTARGET\n";
+				next LINE;
+			}
+			if ($$Line[0] eq '+') {
+				my %Data=();
+				push @RamTargets, \%Data;	# include default
+				shift @$Line;
+			}
+			my $Elem;
+			foreach $Elem (@$Line) {
+				my %Data=();
+				$Data{File}=&Path_Split('File',$Elem);
+				$Data{Path}=&Path_Split('Path',$Elem);
+				push @RamTargets, \%Data;
+			}
+			next LINE;
+		}
+		if (/^RESOURCE$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {			
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$Candidate = &Path_Norm($Candidate);
+					
+					if ($CheckResrc{$Candidate}) {
+						push @MmpDie, "$CurFile($LineNum) : Duplicate Resource $Candidate at line $CheckResrc{$Candidate}\n";
+						next;
+					}
+					
+					$CheckResrc{$Candidate}="$CurFile($LineNum)";
+					my $source="$CurSrcPath$Candidate";
+					unless (-e $source) {
+						push @MmpWarn, "$CurFile($LineNum) : RESOURCE source \"$source\" not found\n";
+					}
+					
+					$CurResource{BaseTrg}=&Path_Split('Base',$Candidate);
+					$CurResource{Source}=$source;
+					$CurResource{Hdr}="$CurFile($LineNum)";
+					# $CurResource{TrgPath} will be filled in at the end;
+					my %Resource=%CurResource;
+					undef %CurResource;
+					push @ResourceStruct, \%Resource;
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Resources specified for keyword RESOURCE\n";
+			next LINE; 
+		}
+		if (/^ROMTARGET$/o) {
+			if ($CheckRomTargets) {
+				push @MmpWarn, "$CurFile($LineNum) : ROM targets already specified at line $CheckRomTargets\n";
+				next LINE;
+			}
+			$CheckRomTargets="$CurFile($LineNum)";
+			unless (@$Line) {
+				@RomTargets=();
+				next LINE;
+			}
+			if ($$Line[0] eq '+') {
+				shift @$Line;
+			}
+			else {
+				@RomTargets=(); # remove default
+			}
+			my $Elem;
+			foreach $Elem (@$Line) {
+				my %Data=();
+				$Data{File}=&Path_Split('File',$Elem);
+				$Data{Path}=&Path_Split('Path',$Elem);
+				push @RomTargets, \%Data;
+			}
+			next LINE;
+		}
+		if (/^SMPSAFE$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$SmpSafe = 1;
+			next LINE;
+		}
+		if (/^SOURCE$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$Candidate = &Path_Norm($Candidate);
+					
+					$Candidate =~ s/^\\//;	# remove leading \, if any	
+					$CurSource{BaseTrg}=&Path_Split('Base',$Candidate);
+					my $path=&Path_Split('Path',$Candidate);
+					if($path){
+					  $CurSource{SrcPath}=&Path_MakeAbs($CurSrcPath,&Path_Split('Path',$Candidate));
+					}
+					else {
+					  $CurSource{SrcPath}=$CurSrcPath;
+					}
+					$CurSource{CurFile}=&Path_Split('File',$Candidate);
+
+					my %Source=%CurSource;
+					undef %CurSource;
+					push @SourceStruct, \%Source;
+					
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Sources specified for keyword SOURCE\n";
+			next LINE; 
+		}
+		if (/^SOURCEPATH$/o) {
+			if ($CurSrcPath=shift @$Line) {
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $CurSrcPath, $LineNum, $CheckSource_PhysicalCheck);				
+				$CurSrcPath = &Path_Norm($CurSrcPath);
+				
+				$CurSrcPath=~s-^(.*[^\\])$-$1\\-o;	# in case no terminating backslash
+				$CurSrcPath=&Path_MakeEAbs($EPOCPath,$CurFile,$CurSrcPath);
+				if (-d &Path_Chop($CurSrcPath)) {
+					next LINE;
+				}
+				push @MmpWarn, "$CurFile($LineNum) : SOURCEPATH \"$CurSrcPath\" not found\n";
+				next LINE;
+			}
+			push @MmpDie, "$CurFile($LineNum) : No Source Path specified for keyword SOURCEPATH\n";
+			next LINE;
+		}
+		if (/^STATICLIBRARY$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum);
+					$Candidate = &Path_Norm($Candidate);
+					
+					if ($CheckStatLib{$Candidate}) {
+						push @MmpWarn, "$CurFile($LineNum) : Duplicate Library \"$Candidate\" at line $CheckStatLib{$Candidate}\n";
+						next;
+					}
+					
+					push @StatLibList, $Candidate;
+					$CheckStatLib{$Candidate}="$CurFile($LineNum)";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Libraries specified for keyword STATICLIBRARY\n";
+			next LINE;
+		}
+		if (/^STDCPP$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$StdCpp=1;
+			next LINE;
+		}
+  		if (/^NOSTDCPP$/o) {
+  			if (@$Line) {
+  				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+  			}
+  			$NoStdCpp=1;
+  			next LINE;
+  		}
+		if (/^STRICTDEPEND$/o) {
+			if ($MmpFlag{StrictDepend}) {
+				push @MmpWarn, "$CurFile($LineNum) : STRICTDEPEND already set\n";
+				next LINE;
+			}
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword STRICTDEPEND takes no arguments\n";
+			}
+			$MmpFlag{StrictDepend}=1;
+			next LINE;
+		}
+		if (/^SYSTEMINCLUDE$/o){
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck);
+					$Candidate = &Path_Norm($Candidate);
+					
+					$Candidate=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+					$Candidate=&Path_MakeEAbs($EPOCPath,$CurFile,$Candidate);
+					if ($CheckSysInc{$Candidate}) {
+						next; 
+					}
+					push @SysIncPaths,$Candidate;
+					$CheckSysInc{$Candidate}="$CurFile($LineNum)";
+					if (-d &Path_Chop($Candidate)) {
+						next;
+					}
+					push @MmpWarn, "$CurFile($LineNum) : SYSTEMINCLUDE path \"$Candidate\" not found\n";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Paths specified for keyword SYSTEMINCLUDE\n";
+			next LINE;
+		}
+		if (/^SYSTEMRESOURCE$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck, $CurSrcPath);
+					$Candidate = &Path_Norm($Candidate);
+					
+					if ($CheckSysResrc{$Candidate}) {
+						push @MmpDie, "$CurFile($LineNum) : Duplicate Resource \"$Candidate\" at line $CheckSysResrc{$Candidate}\n";
+						next; 
+					}
+					$CheckSysResrc{$Candidate}="$CurFile($LineNum)";
+					my $source="$CurSrcPath$Candidate";
+					unless (-e $source) {
+						push @MmpWarn, "$CurFile($LineNum) : SYSTEMRESOURCE source \"$source\" not found\n";
+					}
+					$CurResource{BaseTrg}=&Path_Split('Base',$Candidate);
+					$CurResource{Source}=$source;
+					$CurResource{Hdr}="$CurFile($LineNum)";
+					$CurResource{TrgPath}="z\\system\\data\\";	# needs to match e32env.pm
+					my %Resource=%CurResource;
+					undef %CurResource;
+					push @ResourceStruct, \%Resource;
+				}
+				if (&main::EPOCSecurePlatform()) {    
+					push @MmpMigrationNote, "Obsolete SYSTEMRESOURCE keyword specified in \"$MMPFILE\"";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Resources specified for keyword SYSTEMRESOURCE\n";
+			next LINE; 
+		}
+		if (/^TARGET$/o) {
+			if ($Trg) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine TARGET\n";
+				next LINE;
+			}
+			if ($Trg=shift @$Line) {
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Trg, $LineNum);
+				$Trg = &Path_Norm($Trg);
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Target specified for keyword TARGET\n";
+			next LINE;
+		}
+		if (/^TARGETPATH$/o) {
+			if ($TrgPath) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine TARGETPATH\n";
+				next LINE;
+			}
+			unless ($TrgPath=shift @$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : No Path specified for keyword TARGETPATH\n";
+				next LINE;
+			}
+
+			CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $TrgPath, $LineNum);
+			$TrgPath = &Path_Norm($TrgPath);
+			
+			$TrgPath=~s-^\\(.*)$-$1-o;
+			$TrgPath=~s-^(.*[^\\])$-$1\\-o;
+			$TrgPath="z\\$TrgPath";
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Too many arguments for keyword TARGETPATH\n";
+			}
+			next LINE;
+		}
+		if (/^TARGETTYPE$/o) {
+			if ($TrgType) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine TARGETTYPE\n";
+				next LINE;
+			}
+			unless ($TrgType=shift @$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : No Type specified for keyword TARGETTYPE\n";
+				next LINE;
+			}
+			eval { &Trg_GetL($TrgType, \%TrgType); };
+			if ($@) {
+				push @MmpDie, "$CurFile($LineNum) : $@";
+			}
+			next LINE;
+		}
+		if (/^UID$/o) {
+			if (@$Line) {
+				foreach (@$Line) {
+					if ($#UidList>=1) {
+						push @MmpWarn, "$CurFile($LineNum) : Can't specify more than 2 Uids\n";
+						next LINE;
+					}
+					$_=&Genutl_AnyToHex($_);
+					if (defined $_) {
+						push @UidList, $_;
+						next;
+					}
+					push @MmpDie, "$CurFile($LineNum) : Uid doesn't fit expected number format\n";
+					next LINE;
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Uids specified for keyword UID\n";
+			next LINE;
+		}
+		if (/^SECUREID$/o) {
+			if ($SecureId) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine SECUREID\n";
+				next LINE;
+			}
+			if (@$Line) {
+				$SecureId = &Genutl_AnyToHex(shift @$Line);
+				if (!defined $SecureId) {
+					push @MmpDie, "$CurFile($LineNum) : SECUREID doesn't fit expected number format\n";
+					next LINE;
+				}
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for keyword SECUREID\n";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Missing argument for keyword SECUREID\n";
+			next LINE;
+		}
+		if (/^VENDORID$/o) {
+			if (defined($VendorId)) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine VENDORID\n";
+				next LINE;
+			}
+			if (@$Line) {
+				$VendorId = &Genutl_AnyToHex(shift @$Line);
+				if (!defined $VendorId) {
+					push @MmpDie, "$CurFile($LineNum) : VENDORID doesn't fit expected number format\n";
+					next LINE;
+				}
+				if (@$Line) {
+					push @MmpWarn, "$CurFile($LineNum) : Too many arguments for keyword VENDORID\n";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Missing argument for keyword VENDORID\n";
+			next LINE;
+		}
+		if (/^USERINCLUDE$/o) {
+			if (@$Line) {
+				my $Candidate;
+				foreach $Candidate (@$Line) {
+					CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, $mainElement, $Candidate, $LineNum, $CheckSource_PhysicalCheck);
+					$Candidate = &Path_Norm($Candidate);
+					
+					$Candidate=~s-^(.*[^\\])$-$1\\-o;   # ensure path ends with a backslash
+					$Candidate=&Path_MakeEAbs($EPOCPath,$CurFile,$Candidate);
+					if ($CheckUserInc{$Candidate}) {
+						next; 
+					}
+					push @UserIncPaths,$Candidate;
+					$CheckUserInc{$Candidate}="$CurFile($LineNum)";
+					if (-d &Path_Chop($Candidate)) {
+						next;
+					}
+					push @MmpWarn, "$CurFile($LineNum) : USERINCLUDE path \"$Candidate\" not found\n";
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : No Paths specified for keyword USERINCLUDE\n";
+			next LINE;
+		}
+		if (/^SRCDBG$/o) {
+			if (@$Line) {
+				push @MmpWarn, "$CurFile($LineNum) : Keyword $_ takes no arguments\n";
+			}
+			$SrcDbg=1;
+			next LINE;
+		}
+		if (/^VERSION$/o) {
+			if (%Version) {
+				push @MmpDie, "$CurFile($LineNum) : Attempt to redefine VERSION\n";
+				next LINE;
+			}
+			unless (@$Line) {
+				push @MmpDie, "$CurFile($LineNum) : Missing argument to VERSION\n";
+				next LINE;
+			}
+			%Version = &Genutl_StringToVersion(shift @$Line);
+			if (!%Version) {
+				push @MmpDie, "$CurFile($LineNum) : Bad VERSION number\n";
+				next LINE;
+			}
+			if (@$Line) {
+				if ((lc $$Line[0]) eq 'explicit') {
+					$Version{explicit} = 1;
+					shift @$Line;
+				}
+				if (scalar(@$Line)) {
+					push @MmpDie, "$CurFile($LineNum) : Garbage after VERSION number\n";
+				}
+			}
+			next LINE;
+		}
+		
+		if (/^OPTION$/oi ) {
+			if (@$Line >= 2) {
+				my $compilerkey= uc shift @$Line;
+				if (!defined($Compiler{$compilerkey})) {
+					# first use of "OPTION xxx"
+					$Compiler{$compilerkey}=shift @$Line;
+				}
+				# concatenate extra stuff
+				while (@$Line) {
+					$Compiler{$compilerkey}.=" ".shift @$Line;
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Keyword OPTION requires at least two arguments\n";
+			next LINE;
+			}
+		if (/^LINKEROPTION$/oi ) {
+			if (@$Line >= 2) {
+			        # first parameter is the compiler
+				my $compilerkey= uc shift @$Line;
+				if (!defined($Compiler{$compilerkey})) {
+					# first use of "LINKEROPTION xxx"
+					$LinkerOptions{$compilerkey}=shift @$Line;
+				}
+				# concatenate extra stuff
+				while (@$Line) {
+					$LinkerOptions{$compilerkey}.=" ".shift @$Line;
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Keyword LINKEROPTION requires at least two arguments\n";
+			next LINE;
+			}
+		if (/^OPTION_Replace$/oi ) {
+			if (@$Line >= 2) {
+				my $compilerkey= uc shift @$Line;
+				my $repOptions= shift @$Line;
+				while (@$Line) 
+				{
+					$repOptions.= " ".shift @$Line;
+				}
+				$repOptions =~ s/=\s*/=/g;
+				push @{$Replace{$compilerkey}},$repOptions;
+				
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : Keyword OPTION_Replace requires at least two arguments\n";
+			next LINE;
+			}
+		if (/^ARMFPU$/oi) {
+			if ($ARMFPU) {
+				push @MmpWarn, "$CurFile($LineNum) : Attempt to redefine ARMFPU\n";
+				next LINE;
+			}
+			if ($ARMFPU=shift @$Line) {
+				if (($ARMFPU !~ /^SOFTVFP$/oi) && ($ARMFPU !~ /^VFPV2$/oi)) {
+					push @MmpWarn, "$CurFile($LineNum) : ARMFPU can only specify SOFTVFP or VFPV2 as an argument\n";
+					undef $ARMFPU;
+				}
+				next LINE;
+			}
+			push @MmpWarn, "$CurFile($LineNum) : ARMFPU must specify either SOFTVFP or VFPV2 as an argument\n";
+			next LINE;
+		}
+		if( /^PAGED$/o) {
+			#revert "PAGED" keyword from code and data paged to code paged only
+			#if ($CodePagingTargetMode == PAGED or $DataPagingTargetMode == PAGED) {
+			if ($CodePagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			#revert "PAGED" keyword from code and data paged to code paged only
+			#if ($CodePagingTargetMode == UNPAGED or $DataPagingTargetMode == UNPAGED) {
+			if ($CodePagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$CodePagingTargetMode = PAGED;
+			#revert "PAGED" keyword from code and data paged to code paged only
+			#$DataPagingTargetMode = PAGED;
+			next LINE;
+			}
+		if( /^UNPAGED$/o) {
+			if ($CodePagingTargetMode == UNPAGED or $DataPagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			if ($CodePagingTargetMode == PAGED or $DataPagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$CodePagingTargetMode = UNPAGED;
+			$DataPagingTargetMode = UNPAGED;
+			next LINE;
+			}
+		if( /^PAGEDCODE$/o) {
+			if ($CodePagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			if ($CodePagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$CodePagingTargetMode = PAGED;
+			next LINE;
+			}
+		if( /^UNPAGEDCODE$/o) {
+			if ($CodePagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			if ($CodePagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$CodePagingTargetMode = UNPAGED;
+			next LINE;
+			}
+		if( /^PAGEDDATA$/o) {
+			if ($DataPagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			if ($DataPagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$DataPagingTargetMode = PAGED;
+			next LINE;
+			}
+		if( /^UNPAGEDDATA$/o) {
+			if ($DataPagingTargetMode == UNPAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : duplicate paging setting\n";
+			}
+			if ($DataPagingTargetMode == PAGED) {
+				push @MmpWarn, "$CurFile($LineNum) : conflict paging setting\n";
+			}
+			$DataPagingTargetMode = UNPAGED;
+			next LINE;
+			}
+		if( /^DEBUGGABLE_UDEBONLY$/o) {
+			$IsDebuggable = DEBUGGABLE_UDEBONLY;
+			next LINE;
+			}
+		if( /^DEBUGGABLE$/o) {
+			if ($IsDebuggable != DEBUGGABLE_UDEBONLY)
+			{
+				$IsDebuggable = DEBUGGABLE;
+			}
+			next LINE;
+			}
+		if( /^FEATUREVARIANT$/o) {
+			push @MmpDie, "$CurFile($LineNum) : FEATUREVARIANT specified multiple times" if ($FeatureVariant);
+			$FeatureVariant = 1;
+			next LINE;
+			}
+
+		push @MmpWarn, "$CurFile($LineNum) : Unrecognised Keyword \"$_\"\n";
+	}
+
+	undef $Line;
+	undef $MmpMacro;
+
+
+	# test the mmp contents
+	#----------------------
+	if ($PlatTxtSwitch || $OtherPlatSwitch)	{
+		push @MmpDie, $PlatTxtSwitch ? $PlatTxtSwitch : $OtherPlatSwitch, ": Unterminated START ... END block\n";
+	}
+	undef $PlatTxtSwitch;
+	undef $OtherPlatSwitch;
+
+	# Check the consistency of the mmp file contents
+	unless ($Trg) {
+		unless($TrgType=~/^NONE$/io){
+			push @MmpDie, "ERROR: No Target specified\n";
+		}
+	}
+	unless ($TrgType) {
+		push @MmpDie, "ERROR: No TargetType specified\n";
+	}
+  	if( $StdCpp && $NoStdCpp ) {
+  		push @MmpWarn, "WARNING: Keyword statement STDCPP not permitted with keyword NOSTDCPP.\n";
+  		push @MmpWarn, "WARNING: Keyword statements STDCPP and NOSTDCPP ignored.\n";
+  		$StdCpp = 0;
+  		$NoStdCpp = 0;
+  	}
+
+	if (($TrgType =~ /^LIB$/io) && (scalar(@DebugLibList) || scalar(@LibList) || scalar(@StatLibList))) {
+		push @MmpWarn, "WARNING: Library statements (DEBUGLIBRARY, LIBRARY or STATICLIBRARY) not permitted with TARGETTYPE LIB.";
+		push @MmpWarn, "WARNING: Library statements (DEBUGLIBRARY, LIBRARY or STATICLIBRARY) ignored.\n";
+		undef @DebugLibList;
+		undef @LibList;
+		undef @StatLibList;
+	}
+
+	if ($TrgType =~ /^LIB$/io && $NewLib) {
+		push @MmpWarn, "WARNING: Library statement NEWLIB not permitted with TARGETTYPE LIB.";
+		push @MmpWarn, "WARNING: Library statement NEWLIB ignored.\n";
+		undef @DebugLibList;
+		undef @LibList;
+		undef @StatLibList;
+	}
+
+	if ($TrgType =~ /^STD(EXE|DLL)$/io && $NewLib) {
+		push @MmpWarn, "WARNING: Library statement NEWLIB not permitted with TARGETTYPE STD*.";
+		push @MmpWarn, "WARNING: Library statement NEWLIB ignored.\n";
+		undef @DebugLibList;
+		undef @LibList;
+		undef @StatLibList;
+	}
+
+	if (($TrgType=~/^IMPLIB$/io) || ($TrgType=~/^NONE$/io)) {
+		push @MmpDie, "ERROR: SOURCE not permitted with TARGETTYPE $TrgType\n" if (@SourceStruct);
+	} elsif (!@SourceStruct) {
+		push @MmpDie, "ERROR: No Sources specified\n";
+	}
+	if ($TrgType{NeedUID3} && $#UidList<1) {
+		push @MmpWarn, "WARNING: No Uid3 specified in \"$MMPFILE\" for TargetType \"$TrgType\"\n";
+	}
+	if ($Trg && $Trg=~/\{|\}/) {
+		push @MmpDie, "ERROR: Bad TARGET name specified\n";
+	}
+	if ($ExportLibrary and $ExportLibrary=~/\{|\}/) {
+		push @MmpDie, "ERROR: Bad EXPORTLIBRARY name specified\n";
+	}
+	if ($LinkAs and $LinkAs=~/\{|\}/) {
+		push @MmpDie, "ERROR: Bad LINKAS name specified\n";
+	}
+	# Make sure a valid compression method has been chosen if target is going to be paged
+	if ($CodePagingTargetMode == PAGED && $CompressTarget == COMPRESS) {
+		if ($CompressTargetMethod == INFLATECOMPRESSIONMETHOD) {
+			push @MmpWarn, "Incompatible keywords! The INFLATECOMPRESSTARGET is not allowed with PAGED!\n";
+			push @MmpWarn, "Changing compression method to BYTEPAIRCOMPRESSTARGET\n";
+		}
+		$CompressTargetMethod = BYTEPAIRCOMPRESSIONMETHOD;
+	}
+
+  # Ensure 2nd UID is not deprecated
+  if (&main::EPOCSecurePlatform() && $TrgType{Basic} eq "DLL")
+    {
+    $deprecatedUIDs{"0x100039ce"} = "Unmigrated dll style application detected from use of UID 0x100039ce";
+    }
+  
+  # Do not need UIDs for a resource only (i.e. TARGETTYPE is "none") mmp file
+  if  ((!$TrgType=~/^NONE$/io) && &main::EPOCSecurePlatform() && defined($deprecatedUIDs{$UidList[0]}))
+    {
+    push @MmpMigrationNote, "$deprecatedUIDs{$UidList[0]}\n";
+    }
+
+#	PUT IN SOME DEFAULTS
+
+	if ($TrgPath eq '') {
+		# set up default path from $TrgType 
+		$TrgPath = $TrgType{Path};
+	}
+	my $ResourceTrgPath = $TrgType{ResourcePath};
+	if ($ResourceTrgPath eq '') {
+		$ResourceTrgPath = $TrgPath;	# default to TrgPath, as before
+	}
+	unless (%Version) {
+	    if ($$Plat_ref{DefFile} =~ /^\s*EABI\s*/i ) {
+			$Version{major} = 10;	# Start major versions at 10 for EABI to allow coexistence with GCC98r2 ABI
+		} else {
+			$Version{major} = 1;
+		}
+		$Version{minor} = 0;
+	}
+
+	# check for languages
+	@LangList=('SC') unless @LangList;
+
+  if (&main::EPOCSecurePlatform() && !defined($Capability) &&
+    (($TrgType{Basic} eq "DLL") || (uc($TrgType) eq "EXEXP")))
+    {
+    push @MmpMigrationNote, "No Capabilities set in \"$MMPFILE\" for TargetType: $TrgType\n";
+    }
+
+	# Supply default capability mask if not set explicitly, and convert to hex string
+	$Capability = "none" unless (defined($Capability));
+	$CapabilityFlags[0] = 0 unless (defined($CapabilityFlags[0]));
+        $CapabilityFlags[1] = 0 unless (defined($CapabilityFlags[1]));
+
+        $CapabilityFlags[0] = sprintf("0x%08x", $CapabilityFlags[0]);
+        $CapabilityFlags[1] = sprintf("0x%08x", $CapabilityFlags[1]);
+
+#	ensure all bitmaps have targetpaths and check for duplicate bitmaps
+	my %BitMapCheck;
+	my $BitMapRef;
+	foreach $BitMapRef (@BitMapStruct) {
+		unless ($$BitMapRef{TrgPath}) {
+			$$BitMapRef{TrgPath}=$ResourceTrgPath;
+		}
+		if ($BitMapCheck{"$$BitMapRef{TrgPath}$$BitMapRef{Trg}"}) {
+			push @MmpDie, "ERROR: Duplicate bitmap target \"$$BitMapRef{TrgPath}$$BitMapRef{Trg}\"\n";
+			next;
+		}
+		$BitMapCheck{"$$BitMapRef{TrgPath}$$BitMapRef{Trg}"}=1;
+	}
+
+#	ensure all resources have targetpaths, expand language list and check for duplicates
+	my %ResourceCheck;
+	my $ResourceRef;
+	my @PerLanguageResourceStruct;
+	foreach $ResourceRef (@ResourceStruct) {
+					
+		unless ($$ResourceRef{BaseTrg}) {
+			$$ResourceRef{BaseTrg}=&Path_Split('Base',$$ResourceRef{Source});
+		}
+		unless ($$ResourceRef{TrgPath}) {
+			$$ResourceRef{TrgPath}=$ResourceTrgPath;
+		}
+		unless ($$ResourceRef{Lang}) {
+			@{$$ResourceRef{Lang}}=@LangList;
+		}
+		# generate one instance per language.
+		my @list = @{$$ResourceRef{Lang}};
+		my $base = "$$ResourceRef{TrgPath}$$ResourceRef{BaseTrg}";
+		foreach my $lang (@list) {
+			my %newResourceRef = %{$ResourceRef};
+			$newResourceRef{Lang} = $lang;
+			$newResourceRef{Trg} = $base.lc("\.R$lang");
+			push @PerLanguageResourceStruct, \%newResourceRef;
+		}
+	}
+	@ResourceStruct = @PerLanguageResourceStruct;
+	undef @PerLanguageResourceStruct;
+	
+	foreach $ResourceRef (@ResourceStruct) {
+		if ($ResourceCheck{"$$ResourceRef{TrgPath}$$ResourceRef{Trg}"}) {
+			push @MmpDie, "ERROR: Duplicate Resource target \"$$ResourceRef{TrgPath}$$ResourceRef{Trg}\"\n";
+			next;
+		}
+		$ResourceCheck{"$$ResourceRef{TrgPath}$$ResourceRef{Trg}"}=1;
+	}
+
+	my $Plat=&main::Plat;
+
+	if (@MmpDie || @MmpWarn || @MmpDiagnostic || @MmpMigrationNote) {
+		warn "\nMMPFILE \"$MMPFILE\"\n";
+		if (@MmpDiagnostic) {
+			warn
+				"DIAGNOSTIC MESSAGE(S)\n",
+				@MmpDiagnostic,
+				"\n"
+			;
+			}
+
+		foreach my $printedWarning (@MmpWarn)
+			{
+			print "WARNING: $printedWarning\n";
+			}
+		foreach my $printedError (@MmpDie)
+			{
+			print "FATAL ERROR: $printedError\n";
+			}
+
+		foreach my $printedMigrationNote (@MmpMigrationNote)
+			{
+			print "MIGRATION_NOTE: $printedMigrationNote\n";
+			}		
+
+		if (@MmpDie)
+			{
+			die;
+			}
+	}
+
+
+#	COMPLETE THE UID LIST
+
+	while ($#UidList<1) {
+		push @UidList, '0x00000000';
+	}
+
+	# check the second UID, or set it
+	if ($TrgType{UID2}) {
+		if ($UidList[0]=~/^0x00000000$/o) {
+			# put in second uid for known targetypes without them
+			$UidList[0]=$TrgType{UID2};
+		}
+		elsif ($UidList[0] ne $TrgType{UID2}) {
+			# text comparison is OK here because UIDs have both been through AnyToHex function
+			if ($UidList[0] ne '0x01111111') {
+				# issue warning (but not if UID == 0x01111111 (to allow test code to deliberately set incorrect UID)
+				warn(
+					"WARNING: Second Uid is $UidList[0], but\n",
+					" expected value for Target Type $TrgType is $TrgType{UID2}\n"
+				);
+			}
+		}
+	}
+
+#	Put in the first UID in the list
+	if ($TrgType{Basic}=~/^DLL$/o) {
+		unshift @UidList, '0x10000079';
+	}
+	elsif ($TrgType{Basic}=~/^(EXE)$/o) {
+		unshift @UidList, '0x1000007a';
+	}
+	elsif ($TrgType{Basic}=~/^(EXEDLL)$/o) {
+# EXE on EPOC32, DLL on Emulator
+# NOTE: On EKA1 EXEDLL used EXE UID1 on emulator
+# On EKA2 this is unacceptable
+		if (!$emulator) {
+			unshift @UidList, '0x1000007a';
+		} else {
+			unshift @UidList, '0x10000079';
+		}
+	}
+	else {
+		unshift @UidList, '0x00000000';
+	}
+
+# If no SID specified use UID3
+	$SecureId = $UidList[2] unless(defined $SecureId);
+
+#	SORT OUT TARGET TYPE DATA STRUCTURE
+
+	# set the target path
+	if ($TrgPath) {
+		$TrgType{Path}=$TrgPath;
+	}
+
+#	put in the $Linkas default
+	if (!$LinkAs and $TrgType=~/^IMPLIB$/io) {
+		$LinkAs = $Trg;
+		$LinkAs =~ s/\.lib$/\.dll/i;
+	} else {
+		$LinkAs = $Trg unless $LinkAs;
+	}
+	$LinkAsBase = $LinkAs;
+	unless ($emulator) {
+		$LinkAs = &DecorateWithVersion($LinkAs, %Version);
+	}
+
+# If explicit version add to target
+	if ($Version{explicit} && !$emulator) {
+		$Trg = &DecorateWithVersion($Trg, %Version);
+	}
+
+
+#	Reconcile any EXEDLL targettypes - must be done after first UIDs put in the list
+#	and after the $LinkAs keyword has been defined/defaulted
+	if ($TrgType{Basic} eq 'EXEDLL') {
+		$TrgType{Basic} = $emulator ? 'DLL' : 'EXE';
+		$Trg=&Path_Split('Base',$Trg).'.EXE';
+		$LinkAsBase=&Path_Split('Base',$LinkAsBase).'.EXE';
+		$LinkAs=&Path_Split('Base',$LinkAs).'.EXE';
+	}
+
+#	put in the $ExportLibrary default
+	$ExportLibrary=&Path_Split('Base',$Trg) unless $ExportLibrary;
+	unless ($emulator) {
+		$ExportLibrary = &DecorateWithVersion($ExportLibrary, %Version);
+	}
+
+#	Get the EPOC entrypoint static library
+	unless ($FirstLib) {
+		unless ($TrgType{FirstLib}) {
+			$FirstLib="E$TrgType{Basic}.LIB";
+		}
+		else {
+			$FirstLib=$TrgType{FirstLib};
+		}
+	}
+
+
+#	 WORK OUT THE ASSP IMPLICATIONS
+
+#	Nullify ASSP-specific API things for WINS/WINC since the API should always be
+#	the same for WINC as for WINS,
+	if ($emulator) {
+		$ASSPABISwitch=0;
+		$ASSPExports=0;
+		unshift @LibList, @ASSPLibList;
+		unshift @DebugLibList, @ASSPLibList;	# keep DebugLibList in sync with LibList
+		@ASSPLibList=();
+	}
+	else {
+#		Force ASSPABISwitch for known kernel components or if ASSPEXPORTS or ASSPLIBRARY specified in .MMP file
+		if ($TrgType{Kernel} or $ASSPExports or @ASSPLibList) {
+			$ASSPABISwitch=1;
+		}
+	}
+
+#	Switch the ABI if necessary
+	unless ($ASSPABISwitch) {
+#		apply the standard ABI
+		$ABI=$$Plat_ref{ABI};
+	}
+	else {
+#		kernel-specific stuff
+#		check that the platform is not generic
+		if ($$Plat_ref{Generic}) {
+			die "ERROR: Can't apply ASSPABI, ASSPEXPORTS or ASSPLIBRARY for generic platform \"$$Plat_ref{Name}\n";
+		}
+
+#		apply the ASSP-specific ABI
+		$ABI=$$Plat_ref{ASSPABI};
+	}
+
+#	COMPLETE THE .DEF FILE STRUCTURE
+
+	# apply the default .DEF filename, and
+	# check as far as possible that the project is frozen
+	if (($TrgType{NeedDeffile} or $CheckDef)) {
+		unless ($Def{Path} and $Def{Path} !~ /\\\~\\$/) {
+			my $augment;
+			if ($ASSPExports) {
+			    if ($$Plat_ref{DefFile} =~ /^\s*EABI\s*/i ) {
+					$augment = $$Plat_ref{ASSP};
+			    } else {
+					$augment = "B$$Plat_ref{ASSP}";
+			    }
+			} else {
+			    if ($$Plat_ref{DefFile} =~ /^\s*EABI\s*/i ) {
+					$augment = lc($$Plat_ref{DefFile});
+			    } else {
+					$augment = lc("B$$Plat_ref{DefFile}");
+			    }
+			}
+			if ($Def{Path} =~ /\\\~\\$/) {
+				$Def{Path} =~ s/\\\~\\$/\\$augment\\/;
+			} else {
+				$Def{Path}=&Path_Strip(&Path_Split('Path',$MMPFILE)."..\\$augment\\");
+			}
+		}
+		unless ($Def{Base}) {
+			$Def{Base} = &Path_Split('Base',$LinkAsBase);
+		}
+		unless ($Def{Ext}) {
+			$Def{Ext}='.def';
+		}
+#		now that we've dumped narrow, treat the 'u' basename suffix as part of the frozen
+#		.DEF file basename.  Once we've dumped the suffix we won't have to store the extension
+#		separately either
+		if (!$emulator && $Version{explicit}) {
+			$Def{Base} .= &Genutl_VersionToFileAugment(%Version);
+		} elsif (!$NoStrictDef) {
+			$Def{Base}.='u';
+		}
+
+		if ($Def{CheckSource_MMPEntry})
+		{
+			my $type = "DEFFILE";
+			$type .= " (NOSTRICTDEF)" if ($NoStrictDef);
+			
+			# for GCCXML and X86GCC, ignore check source errors for missing .def file
+			my $checkdef = (($IgnoreMissingDef) && ($Def{Path} =~ /[\\\/]bmarm[\\\/]/ || $$Plat_ref{Name} eq "X86GCC" || $$Plat_ref{Name} eq "X86GMP")) ? 0 : 1;
+			
+			if( $checkdef ) {
+			  CheckSource_MetaData(%CheckSourceMMPMetaData, $Def{CheckSource_MMPFile}, $type, $Def{CheckSource_MMPEntry}, $Def{CheckSource_LineNumber}, $CheckSource_PhysicalCheck, $Def{Path});
+			}
+		}
+			
+#		check deffile exists,
+        unless (-e "$Def{Path}$Def{Base}$Def{Ext}") {
+            if($IgnoreMissingDef == 0) {
+                warn "WARNING: Frozen .def file $Def{Path}$Def{Base}$Def{Ext} not found - project not frozen\n";
+            }
+     	}
+	}
+}
+
+sub Mmp_ABI () {
+	$ABI;
+}
+sub Mmp_AifStruct () {
+	\@AifStruct;
+}
+sub Mmp_AllowDllData () {
+	$AllowDllData;
+}
+sub Mmp_CompressTarget () {
+	$CompressTarget;
+}
+sub Mmp_CompressTargetMode () {
+	$CompressTargetMethod;
+}
+sub Mmp_ASSPExports () {
+	$ASSPExports;
+}
+sub Mmp_ASSPLibList () {
+	@ASSPLibList;
+}
+sub Mmp_BitMapStruct () {
+	\@BitMapStruct;
+}
+sub Mmp_BuildAsARM () {
+	$BuildAsARM;
+}
+sub Mmp_CallDllEntryPoints () {
+	$CallDllEntryPoints;
+}
+sub Mmp_Capability () {
+	$Capability;
+}
+sub Mmp_CapabilityFlags () {
+	@CapabilityFlags;
+}
+sub Mmp_DataLinkAddress () {
+	$DataLinkAddress;
+}
+sub Mmp_DebugLibList () {
+	\@DebugLibList;
+}
+sub Mmp_Def () {
+	\%Def;
+}
+sub Mmp_DocHash () {
+	\%DocHash;
+}
+sub Mmp_ExportUnfrozen () {
+	$ExportUnfrozen;
+}
+sub Mmp_FirstLib () {
+	$FirstLib;
+}
+sub Mmp_FixedProcess () {
+	$FixedProcess;
+}
+sub Mmp_HeapSize () {
+	\%HeapSize;
+}
+sub Mmp_LibList () {
+	\@LibList;
+}
+sub Mmp_LinkAs () {
+	$LinkAs;
+}
+sub Mmp_LinkAsBase () {
+	$LinkAsBase;
+}
+sub Mmp_ExportLibrary () {
+	$ExportLibrary;
+}
+sub Mmp_NoExportLibrary () {
+	$NoExportLibrary;
+}
+sub Mmp_NewLib () {
+	$NewLib;
+}
+sub Mmp_Macros () {
+	@Macros;
+}
+sub Mmp_MmpFlag () {
+	\%MmpFlag;
+}
+sub	Mmp_PlatTxt2D () {
+	@PlatTxt2D;
+}
+sub Mmp_ProcessPriority () {
+	$ProcessPriority;
+}
+sub Mmp_RamTargets () {
+	@RamTargets;
+}
+sub Mmp_ResourceStruct () {
+	\@ResourceStruct;
+}
+sub Mmp_RomTargets () {
+	@RomTargets;
+}
+sub Mmp_SourceStruct () {
+	\@SourceStruct;
+}
+sub Mmp_StackSize () {
+	$StackSize;
+}
+sub Mmp_StatLibList () {
+	@StatLibList;
+}
+sub Mmp_StdCpp () {
+	$StdCpp;
+}
+sub Mmp_NoStdCpp () {
+	$NoStdCpp;
+}
+sub Mmp_SysIncPaths () {
+	@SysIncPaths;
+}
+sub Mmp_Trg () {
+	$Trg;
+}
+sub Mmp_TrgType () {
+	\%TrgType;
+}
+sub Mmp_UidList () {
+	@UidList;
+}
+sub Mmp_UserIncPaths () {
+	@UserIncPaths;
+}
+sub Mmp_SrcDbg () {
+	$SrcDbg;
+}
+
+sub Mmp_WarningLevel() {
+     %Compiler; 
+} 
+
+sub Mmp_LinkerOptions() {
+    %LinkerOptions
+}
+
+sub Mmp_Version() {
+	%Version;
+}
+
+sub Mmp_SecureId() {
+	$SecureId;
+}
+
+sub Mmp_VendorId () {
+	$VendorId;
+}
+
+sub DecorateWithVersion($$) {
+	my ($name, %ver) = @_;
+	my $base = &Path_Split('Base', $name);
+	my $ext = &Path_Split('Ext', $name);
+	unless ($base =~ /\{(\d|a|b|c|d|e|f){8}\}$/i) {
+		$base .= &Genutl_VersionToFileAugment(%Version);
+	}
+	return "$base$ext";
+}
+
+sub Mmp_Replace() {
+	%Replace;
+}
+
+sub Mmp_SmpSafe() {
+	$SmpSafe;
+}
+
+sub Mmp_StringTable() {
+	\@StringTableStruct;
+}
+sub Mmp_ARMFPU() {
+	$ARMFPU;
+}
+
+sub Mmp_CheckSourceMMPMetaData() {
+	%CheckSourceMMPMetaData;
+}
+
+sub Mmp_CheckSourceMMPIncludes() {
+	%CheckSourceMMPIncludes;
+}
+
+sub Mmp_CodePagingTargetMode() {
+	$CodePagingTargetMode;
+}
+
+sub Mmp_DataPagingTargetMode() {
+	$DataPagingTargetMode;
+}
+
+sub Mmp_IsWideCharMain() {
+	$WideCharMain;
+}
+
+sub Mmp_IsDebuggable() {
+	$IsDebuggable;
+}
+
+sub Mmp_IsFeatureVariant() {
+	$FeatureVariant;
+}
+
+# Return the macros tested in the MMP file
+sub Mmp_TestedMacros() {
+	return \%mmptestedMacrosHash;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/memtrace/memtrace.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,27 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@echo off
+
+perl -S memtrace.pl %1 %2 %3 %4 %5 %6 %7 %8 %9
+if errorlevel==1 goto CheckPerl
+goto End
+
+:CheckPerl
+perl -v >NUL
+if errorlevel==1 echo Is Perl, version 5.003_07 or later, installed?
+goto End
+
+:End
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/memtrace/memtrace.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,265 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Postprocess EPOC memory usage trace file
+# 
+#
+
+no strict 'vars';
+use English;
+# Standard Symbian boilerplate to find and load E32env library
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+my $PerlLibPath;    # fully qualified pathname of the directory containing our Perl modules
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+	$PerlLibPath .= "\\";
+}
+
+use lib $PerlLibPath;
+use Modload;
+Load_SetModulePath($PerlLibPath);
+
+my $tickperiod = 0;
+my $emulproc = quotemeta("epoc[00000000]0001::");
+my $apprun = quotemeta("apprun[10003a4b]");
+my $ramdrive = quotemeta("TheRamDriveChunk");
+
+my @chunknames;	# Array of chunk names, indexed by chunkid
+my @traces;		# Array of chunk traces, each trace being an array
+				# of (tick,chunkid,size) triples
+my @chunkgroup;	# Group that a chunk belongs to, indexed by chunkid
+my @groupnames;	# Array of chunk group names (normally a group==a process)
+my @groups;		# Array of chunk groups, each group being an array of chunkids
+
+my %opts;
+my $result = GetOptions (\%opts, "detailed", "help");
+if($result && ($opts{'help'} || $#ARGV<0))
+	{
+	&help;
+	exit 0;
+	}
+if(!$result || $#ARGV>0)
+	{
+	&usage;
+	exit 1;
+	}
+
+my $file = $ARGV[0];
+open TRACE,$file or die "Error: Can't open trace file \"$file\".\n";
+
+#
+# Parse trace file
+#
+my %current;	# chunkids hashed by DChunk address
+my $nextchunkid;
+while(<TRACE>)
+	{
+	if (/MT:P\s+(\d+)\s*$/)
+		{
+		$tickperiod = $1;
+		}
+	elsif (/MT:C\s+(\d+)\s+([0-9a-fA-F]+)\s+(.+)\s*$/)
+		{
+		$current{$2} = $nextchunkid++;
+		push @chunknames, $3;
+		}
+	elsif (my ($tick, $addr, $size, $name) =
+		   (/MT:A\s+(\d+)\s+([0-9a-fA-F]+)\s+([0-9a-fA-F]+)\s+(.+)\s*$/))
+		{
+		my $chunkid = $current{$addr};
+		die "Error: Parsing failure - is trace file complete ?"
+			unless (defined $chunkid);
+		push @traces, [0+$tick, $chunkid, hex($size)];
+
+		# Check whether chunk has been renamed to something more useful
+		$chunknames[$chunkid] = $name
+			if (($chunknames[$chunkid] =~ /^$emulproc/io) ||
+				($chunknames[$chunkid] =~ /^$apprun/io));
+		}
+	elsif (/MT:D\s+(\d+)\s+([0-9a-fA-F]+)\s+(.+)\s*$/)
+		{
+		die "Error: Parsing failure" unless (defined $current{$2});
+		push @traces, [0+$1, $current{$2}, 0];
+		delete $current{$2};
+		}
+	elsif (/(MT:.\s+.*)/)
+		{
+		printf "Warning: Unrecognised trace line \"$1\".\n";
+		}
+	}
+close TRACE;
+die "Error: File \"$file\" does not contain any memory traces.\n"
+  unless ($#chunknames>0);
+
+
+#
+# Group chunks together by name
+#
+for (0..$#chunknames)
+	{
+	my $chunkid = $_;
+	my $name = $chunknames[$chunkid];
+	$name = $1 if ($name =~ /($ramdrive)$/i);	# Special handling for ramdrive
+	$name = $1 if ($name =~ /^$emulproc(.*)/i);	# Use thread names on Emulator
+	($name) = ($name =~ /([^:]+)/);				# otherwise strip thread name
+
+	# yuck! linear search
+	my $found = 0;
+	for (0..$#groupnames)
+		{
+		my $groupid = $_;
+		if ($groupnames[$groupid] eq $name)
+			{
+			$found = 1;
+			push @{$groups[$groupid]}, $chunkid;
+			$chunkgroup[$chunkid] = $groupid;
+			last;
+			}
+		}
+	
+	if (!$found)
+		{
+		push @groupnames, $name;
+		push @groups, [$chunkid];
+		$chunkgroup[$chunkid] = $#groups;
+		}
+	}
+
+# Strip instance number (if any) from group name for presentation
+for (0..$#groupnames)
+	{
+	$groupnames[$_] = $1 if ($groupnames[$_] =~ /^([^]]+]?)/);
+	}
+
+#
+# Output
+#
+my @chunksizes; # Array of chunk sizes, indexed by chunkid
+for (0..$#chunknames) { $chunksizes[$_] = 0 };
+	
+if ($opts{'detailed'})
+	{
+	# Detailed output
+
+	foreach my $name (@groupnames) { print ",\"$name\"" };
+	print "\n";
+
+	# if the tick size in microseconds hasn't been reported in the log with MT:P, take a guess
+	my $tickdiv = 0;
+	if ($tickperiod == 0)
+		{
+		# Uses hacky method to determine whether on Emulator or Target
+		$tickdiv = ($chunknames[0] =~ /^$emulproc/io) ? 10 : 64;
+		}
+	else
+		{
+		# tickperiod is number of microseconds 
+		$tickdiv = 1000000 / $tickperiod;
+		}
+
+	my ($oldtick, $minitick) = (0,0);
+	my @groupsizes;
+	for my $trace (@traces)
+		{
+		my ($tick, $chunkid, $size) = @$trace;
+		if ($oldtick != $tick)
+			{
+			$oldtick = $tick;
+			$minitick=0;
+			}
+
+		$chunksizes[$chunkid] = $size;
+		my $groupid=$chunkgroup[$chunkid];
+		my $groupsize = 0;
+		foreach $chunkid (@{$groups[$groupid]})
+			{
+			$groupsize += $chunksizes[$chunkid];
+			}
+		$groupsizes[$groupid] = $groupsize;
+
+		print $tick/$tickdiv + ($minitick++)/1000000;
+		foreach $groupsize (@groupsizes)
+			{
+			if ($groupsize)
+				{
+				printf ",%d", $groupsize/1024;
+				}
+			else
+				{
+				print ',';		# make output prettier by omitting 0s
+				}
+			}
+		print "\n";
+		}
+	}
+else
+	{
+	# Summary output
+
+	my @grouphighs;
+	for my $trace (@traces)
+		{
+		my ($tick, $chunkid, $size) = @$trace;
+		$chunksizes[$chunkid] = $size;
+		my $groupid=$chunkgroup[$chunkid];
+		my $groupsize = 0;
+		foreach $chunkid (@{$groups[$groupid]})
+			{
+			$groupsize += $chunksizes[$chunkid];
+			}
+		$grouphighs[$groupid] = $groupsize
+			if (!defined($grouphighs[$groupid]) ||
+				($grouphighs[$groupid] < $groupsize));
+	}
+
+	printf "\"Process\", Size [K]\n";
+	for (0..$#groupnames)
+		{
+		printf "\"$groupnames[$_]\", %d\n", $grouphighs[$_]/1024;
+		}
+	}
+exit 0;
+
+
+sub help ()
+	{
+	my $build;
+	
+	&Load_ModuleL('E32TPVER');
+	print "\nmemtrace - " .
+	  "Postprocess EPOC memory usage trace (Build ", &E32tpver, ")\n";
+	&usage;
+	}
+	
+sub usage ()
+	{
+	print <<EOF
+
+Usage:
+  memtrace [-d] <logfile>
+
+Where:
+  <logfile>     Memory usage trace file.
+
+Options:
+  -d            Produce a detailed listing.
+EOF
+	;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV5.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,612 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This file provides the definition of variables that are used by the component
+# specific makefile. This is for the BPABI (Base Platform ABI) platform using the
+# RVCT compiler.
+# Path Settings
+# 
+#
+
+# Compiler Installation Location
+CC_INSTALL_PATH=
+
+#----------------------------------
+# Programs used from the ToolChain
+#----------------------------------
+
+# C++ Compiler
+CC=armcc
+
+# Linker
+LD=armlink
+
+# Assembler
+ASM=armasm
+
+# Archiver
+AR=armar
+
+# Translator to translate the GCC inline assembler code
+TRANASM=tranasm.bat
+
+#--------------------
+# Option Prefix
+#--------------------
+
+# This value will be used by the backend to segregate one option from the other.
+# If option prefix is one among '+','*','.'or '?' (these metacharacters have specific predefined meaning
+# for pattern matching in Perl) then it should be preceded with '\'.
+OPTION_PREFIX=
+
+#------------------
+# Compiler Options
+#------------------
+
+# Flag whether the compiler requires Unix slashes for absolute paths
+UNIX_SLASH_FOR_CC_ABS_PATHS=0
+
+#-------------------
+# Debug Mode Options
+#-------------------
+
+# Optimization Level in DEBUG mode
+DEBUG_OPTIMISATION=-O0
+
+# Option to produce debug information
+DEBUG_OPTION=-g
+
+DEBUG_FORMAT_DWARF2=--dwarf2
+DEBUG_FORMAT_DWARF3=--dwarf3
+
+# DWARF 2 is default on the ARMV5 build platform.
+DEBUG_FORMAT=$(DEBUG_FORMAT_DWARF2)
+
+# Specific compiler options for a UDEB build
+SYMBIAN_UDEB_CCFLAGS=$(DEBUG_OPTION)
+
+#-------------------------
+# Target Processor Options
+#-------------------------
+
+# Option to select the appropriate target processor
+ifeq "$(RVCT_VER_MAJOR)" "2"
+TARGET_ARCH_OPTION=--cpu 5T
+else
+TARGET_ARCH_OPTION=--cpu 5TE
+endif
+
+# Option to generate the approproate ARM instruction set.
+ARM_INSTRUCTION_SET=--arm
+
+# Option to generate the approproate thumb instruction set.
+THUMB_INSTRUCTION_SET=--thumb
+
+# Compiler define for thumb instruction set
+COMPILER_THUMB_DEFINES=-D__MARM_THUMB__
+
+# Compiler define for interwork
+COMPILER_INTERWORK_DEFINES=-D__MARM_INTERWORK__
+
+# Option to specify the floating point conformance.
+FPMODE_OPTION=--fpmode ieee_no_fenv
+
+# Compiler option to select softvfp mode
+SOFTVFPMODE_OPTION=--fpu softvfp
+
+# Compiler option to select hardware floating point unit
+VFP2MODE_OPTION=--fpu vfpv2
+
+# Option to force all enumerations to be stored in as integers.
+ENUM_OPTION=--enum_is_int
+
+# Option to disable the generation of unaligned word and halfword accesses on ARMV6
+# and ARMV7 processors.
+ifeq "$(RVCT_VER_MAJOR)" "2"
+NO_UNALIGNED_ACCESS=--memaccess -UL41
+else
+NO_UNALIGNED_ACCESS=--no_unaligned_access
+endif
+
+#---------------------------------
+# Options controlling C++ Features
+#---------------------------------
+
+# Option for handling Virtual functions and Virtual Tables
+EXPORT_VTBL_OPTION=--export_all_vtbl
+
+# Disables unused virtual function elimination (VFE) in C++ mode. --vfe is the default
+VFE_OPTION=--no_vfe
+
+# Option to turn on exception handling
+EXCEPTIONS=--exceptions --exceptions_unwind
+NO_EXCEPTIONS=--no_exceptions --no_exceptions_unwind
+
+#-------------------------------------------------------------------------
+# Options controlling the ARM Architecture Procedure Call Standard (AAPCS)
+#-------------------------------------------------------------------------
+
+# This Option is for ARM Architecture Procedure Call Standard with the
+# qualifier to support calls between the ARM and Thumb instruction sets.
+AAPCS_OPTION=--apcs /inter
+
+#-----------------------------------------------------------
+# Options controlling generation of Compiler Warnings/Errors
+#-----------------------------------------------------------
+
+# Option to control the Compiler warnings
+CC_WARNINGS_CONTROL_OPTION=--diag_suppress 161,611,654,997,1152,1300,1464,1488,6318,6331,2523
+
+# Option to control the Compiler warnings for building Standard C++ application
+CC_STDCPP_WARNINGS_CONTROL_OPTION=--diag_suppress 161,611,654,997,1152,1300,1464,1488,6318,6331
+
+# Option to suppress the Compiler errors
+CC_ERRORS_CONTROL_OPTION=--diag_error 1267
+
+# Option to suppress the Compiler errors for building Standard C++
+CC_STDCPP_ERRORS_CONTROL_OPTION=--diag_error 1267
+
+# Option to modify the Compiler warnings and errors for Symbian OS
+SYMBIAN_CC_MESSAGE_OPTION=$(CC_WARNINGS_CONTROL_OPTION) $(CC_ERRORS_CONTROL_OPTION)
+
+#-----------------
+# Optional Options
+#-----------------
+
+# Compiler option to avoid the generation of the intermediate files. (Optional)
+TEMP_FILES_OPTION=
+
+# Library Option
+OWN_LIBRARY_OPTION=--library_interface=aeabi_clib
+
+# Option to generate the Object File
+COMPILE_ONLY_OPTION=-c
+
+# Option to generate the Preprocessed File
+PREPROCESSOR_OPTION=-E
+
+# Other additional Options to be passed to the compiler
+EXTRA_CC_OPTION=
+
+#---------------------
+# Preprocessor Options
+#---------------------
+
+# Prefix Header File passed to the preprocessor
+PREFIXFILE=$(EPOCROOT)epoc32\include\rvct\rvct.h
+
+# For .cpp Source files
+CPP_LANG_OPTION=--cpp
+
+# For .c Source files
+C_LANG_OPTION=--c90
+
+# For .cia Source files
+CIA_LANG_OPTION=--cpp -D__CIA__
+
+#-------------------
+# Assembler Options
+#-------------------
+
+# Option to generate the Assembler instructions
+ASSEMBLER_LISTING_OPTION=-S --interleave
+
+# Output option used to pass the output file name
+ASM_OUTPUT_OPTION=-o
+
+#------------------
+# Translator Options
+#------------------
+
+# Flags to be passed to the translator
+TRANASM_FLAGS=-n -s
+
+# Output option used to pass the output file name
+TRANASM_OUTPUT_OPTION=-o=
+
+# Input option used to pass the input file name
+TRANASM_INPUT_OPTION=
+
+#---------------------------
+# Include Options and Files
+#---------------------------
+
+# Option to specify the location of the header files
+INCLUDE_OPTION=-J
+
+# Preinclude file for that compiler that contains all the compiler specific definitions
+# required by the Symbian OS source code.
+PREINCLUDE_OPTION=--preinclude $(EPOCROOT)epoc32\include\rvct\rvct.h
+
+# Include options required by Function Call Logger
+FC_LOGGER_INCLUDE_OPTION=-I
+FC_LOGGER_DICTIONARY_FILE_NAME=--dictionary_file_name
+FC_LOGGER_GENERATED_C_FILE_NAME=--gen_c_file_name
+
+# Preinclude file to be passed to the Function Call Logger which uses EDG compiler
+#PREINCLUDE_OPTION_FCLOGGER=$(FC_LOGGER_INCLUDE_OPTION) $(EPOCROOT)EPOC32\INCLUDE\RVCT --preinclude edg_rvct2_2.h
+
+# Option to control the search for the header files. For example, if we do not want to do a search in the
+# standard include directory of C++, then can restrict it by providing the appropriate option.
+HEADER_FILES_CONTROL_OPTION=
+
+# Path to pick the header files from the Compiler installation directory
+COMPILER_INCLUDE_PATH=
+
+# Fetches the version of the tools from the installation directory
+VERSION_OPTION=
+VERSION_INFO=
+
+#---------------------
+# Release Mode Options
+#---------------------
+
+# Optimization Level in RELEASE mode
+REL_OPTIMISATION=-O2
+
+# Specific compiler options for a UREL build
+SYMBIAN_UREL_CCFLAGS=
+
+#---------------------------------
+# Symbol Attribute Setting Options
+#---------------------------------
+
+# Option to set the visibility of runtime symbols as DEFAULT (instead of HIDDEN)
+RUNTIME_SYMBOL_VISIBILITY_OPTION=--dllimport_runtime
+
+# Option to specify the output of the toolchain
+OUTPUT_OPTION=-o
+
+# Options to be passed when building System Target(kernel)
+KERNEL_OPTIONS=$(ARM_INSTRUCTION_SET) $(NO_EXCEPTIONS)
+
+# Options to be passed when building in Arm mode
+ARM_OPTIONS=$(ARM_INSTRUCTION_SET)
+
+# Options to be passed when building in Thumb mode
+THUMB_OPTIONS=$(THUMB_INSTRUCTION_SET)
+
+# Common compiler options for Arm and Thumb mode
+COMMON_OPTIONS=$(DEBUG_FORMAT) $(SYMBIAN_CC_MESSAGE_OPTION)
+
+# Invariant Options which cannot be modified by the user from MMP file
+INVARIANT_OPTIONS= $(TARGET_ARCH_OPTION) $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION)
+
+# Common compiler options for compiling programs targeted at Symbian OS
+#CCFLAGS=$(SYMBIAN_CC_MESSAGE_OPTION) $(EXCEPTIONS) $(TARGET_ARCH_OPTION) $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION) $(TEMP_FILES_OPTION) $(HEADER_FILES_CONTROL_OPTION) $(COMPILE_ONLY_OPTION) $(EXTRA_CC_OPTION)
+CCFLAGS=$(COMMON_OPTIONS) $(INVARIANT_OPTIONS) $(TEMP_FILES_OPTION) $(HEADER_FILES_CONTROL_OPTION) $(COMPILE_ONLY_OPTION) $(EXTRA_CC_OPTION)
+
+#------------------
+# Linker Options
+#------------------
+
+# Output option used to pass the output file name
+LINKER_OUTPUT_OPTION=-o
+
+# Option to generate debug information
+LINKER_DEBUG_OPTION=--debug
+
+# Option to *not* generate debug information.
+LINKER_NODEBUG_OPTION=
+
+#--------------------------------------------------------------
+# Options to generate executables conforming to BPABI standards
+#--------------------------------------------------------------
+
+# Option to generate an executable conforming to the Base Platform ABI for the ARM Architecture
+BPABI_OPTION=--bpabi
+
+# The `R_ARM_TARGET1' relocation is typically used for entries in the `.init_array' section. It is
+# interpreted as either `R_ARM_REL32' or `R_ARM_ABS32', depending on the target. The following option
+# override the default export relocations.
+TARGET_RELOCATION_OPTION=
+
+#-------------------------------------
+# Options to specify the output format
+#-------------------------------------
+
+# Option to create a relocatable ELF image. A relocatable image has a dynamic segment that contains
+# relocations that can be used to relocate the image post link-time.
+RELOCATABLE_IMAGE_OPTION=
+
+# Option to create an ELF shared object.
+SHARED_OBJECT_OPTION=--dll
+
+#-------------------------------------------
+# Options to set the Start of RO/RW sections
+#-------------------------------------------
+
+# Option to set the start of the code section (RO Region)
+CODE_SEGMENT_START=
+
+# Option to split object into RO and RW sections
+SPLIT_OPTION=
+
+# Option to set the start of the Data section (RW region)
+RW_BASE_OPTION=--rw-base
+
+# Option to be passed to the linker to set the start of the data section (RW region)
+DATA_SEGMENT_START=$(SPLIT_OPTION) $(RW_BASE_OPTION)
+
+#---------------------------------------------------------
+# Options controlling generation of Linker Warnings/Errors
+#---------------------------------------------------------
+
+# Option to control the Linker warnings
+LD_WARNINGS_CONTROL_OPTION=--diag_suppress 6331,6780
+
+# Option to suppress the Linker errors
+LD_ERRORS_CONTROL_OPTION=
+
+# Option to modify the Linker warnings and errors for Symbian OS
+SYMBIAN_LD_MESSAGE_OPTION=$(LD_WARNINGS_CONTROL_OPTION) $(LD_ERRORS_CONTROL_OPTION)
+
+# Option to specify whether unresolved symbol references from regular object files can be allowed or not.
+UNRESOLVED_SYMBOL_REF_OPTION=
+
+# Option to specify the undefined reference
+UNDEFINED_SYMBOL_REF_OPTION=
+
+# Other additional Options to be passed to the Linker
+EXTRA_LD_OPTION=--datacompressor=off
+
+ifeq "$(RVCT_VER_MAJOR)" "3"
+# Without this linker option, objects with ".directive" sections (i.e. objects
+# created by RVCT 2.2) will cause problems.
+EXTRA_LD_OPTION += --export_all
+endif
+
+#-------------------
+#Entry Point Options
+#-------------------
+
+# Option to pass the explicit symbol for beginning execution of the program
+LINKER_ENTRY_OPTION=--entry
+
+# Symbol used to denote the Start of the grouped archives.
+START_GROUP_SYMBOL=(
+
+# Symbol used to denote the End of the grouped archives.
+END_GROUP_SYMBOL=)
+
+#-------------------------
+# Library Specific Options
+#-------------------------
+
+# Option to control the search in the standard libraries
+STDLIB_OPTION=--no_scanlib
+
+# Additional static libraries that should automatically be supplied to the linker.
+ifeq "$(RVCT_VER_MAJOR)" "2"
+STATIC_LIBS_LIST=armlib\h_t__uf.l(switch8.o)
+else
+STATIC_LIBS_LIST=armlib\h_5.l(switch8.o)
+endif
+
+# Option to pass the path from where the runtime libraries should be picked up
+STATIC_LIBS_PATH=--libpath
+
+# Fetches the library path from the installation directory
+STATIC_LIBRARY_PATH=
+STATIC_LIBS=
+
+# Additional runtime libraries that should be supplied to the linker.
+RTVER:=$(RVCT_VER_MAJOR)_$(RVCT_VER_MINOR)
+RUNTIME_LIBS_LIST=drtaeabi.dso dfpaeabi.dso dfprvct$(RTVER).dso drtrvct$(RTVER).dso
+
+
+# The library that contains operator new and operator delete.
+SYM_NEW_LIB=scppnwdl.dso
+
+# Option to pass the path from where the runtime libraries should be picked up
+RUNTIME_LIBS_PATH=
+
+# Option to turn on implicit symbol versioning
+SYMVER_OPTION=--symver_soname
+
+# Option to specify the shared object name that is stored in the executable
+SO_NAME_OPTION=--soname
+
+# Option to generate the map file that provides information about the linking
+LINKER_SYMBOLS_OPTION=--symbols
+
+# Option to specify the Symbols file
+LINKER_SYMBOLS_FILE_OPTION=--list
+
+# Option to produce the Map file that provides information about linking
+LINKER_SYMBOLS_MAP_OPTION=$(LINKER_SYMBOLS_OPTION) $(LINKER_SYMBOLS_FILE_OPTION)
+
+# Option to specify the linker script file
+LINKER_SCRIPT_FILE_OPTION=
+
+#Via file prefixes
+VIA_FILE_PREFIX=
+VIA_FILE_SUFFIX=
+
+# option to take object file names from other(via) file, here in case of ARMV5 it is necessary to specify space after the "--via " option.
+COMMANDFILE_OPTION:=--via 
+
+# Linker options which can be customized from BSF
+LD_OPTIONS=$(SYMBIAN_LD_MESSAGE_OPTION)$(UNRESOLVED_SYMBOL_REF_OPTION) $(STDLIB_OPTION) $(EXTRA_LD_OPTION)
+
+# Linker option common to all link commands for UREL build
+SYMBIAN_UREL_LINK_FLAGS=$(BPABI_OPTION) $(RELOCATABLE_IMAGE_OPTION) $(TARGET_RELOCATION_OPTION) $(LD_OPTIONS)
+
+# Linker option common to all link commands for UDEB build
+SYMBIAN_UDEB_LINK_FLAGS=$(BPABI_OPTION) $(RELOCATABLE_IMAGE_OPTION) $(TARGET_RELOCATION_OPTION) $(LD_OPTIONS)
+
+
+#-----------------
+# Archiver Options
+#-----------------
+
+# ARCHIVER variable should be set since there is a dependency for this variable in e32test.
+ARCHIVER= $(AR)
+
+ARCHIVER_CREATE_OPTION=--create
+
+# Archiver options which can be set from BSF files
+AR_OPTIONS=
+
+#--------------------------------------
+# Compiler and Platform specific macros
+#--------------------------------------
+
+# Macro definitions required to identify the compiler. Allows for conditional compilation based on compiler
+PLATFORM_DEFINES=
+
+COMPILER_DEFINES=
+
+# Compiler target option
+COMPILER_PLAT=ARMCC
+
+#--------------------------------------
+# Function Call Logger Options
+#--------------------------------------
+FC_LOGGER_OPTION=--wchar_t_keyword --microsoft_version=1300 --diag_suppress 66,161,611,654,815,830,997,1152,1300,1390
+
+# Defines for Function Call Logger
+FC_LOGGER_DEFINES=-D__ARMCC_VERSION=220435
+
+#------------
+# OE Options
+#------------
+
+# Options to export all the globol symbols and import undefined references, required by OE
+OE_OPTIONS=--no_hide_all
+
+# OE Glue code libs
+OE_EXE_LIBS=libcrt0.lib
+OE_EXE_LIBS_WCHAR=libwcrt0.lib
+
+# OE Import Libs
+OE_IMPORT_LIBS=euser.lib
+
+# The library that contains operator new and operator delete.
+OE_NEW_LIB=stdnew.dso
+
+#-----------------------------------------------------------------------------------------------------
+#This section defines the interface with Symbian tools
+#This SHOULD NOT be changed as any changes in this section will not be picked up by the tools back end
+#-----------------------------------------------------------------------------------------------------
+
+# Programs used from the ToolChain
+export  CC
+export  LD
+export  ASM
+export  AR
+export  TRANASM
+
+# Preprocessor Options
+export  PREFIXFILE
+export  CPP_LANG_OPTION
+export  C_LANG_OPTION
+export  CIA_LANG_OPTION
+
+# Option Prefix
+export OPTION_PREFIX
+
+# Compiler Options
+export	PREPROCESSOR_OPTION
+export  ASSEMBLER_LISTING_OPTION
+export  ASM_OUTPUT_OPTION
+export  INCLUDE_OPTION
+export  PREINCLUDE_OPTION
+export  HEADER_FILES_CONTROL_OPTION
+export  COMPILER_INCLUDE_PATH
+export  SYMBIAN_UREL_CCFLAGS
+export  SYMBIAN_UDEB_CCFLAGS
+export  REL_OPTIMISATION
+export  DEBUG_OPTIMISATION
+export  ARM_OPTIONS
+export  THUMB_OPTIONS
+export  COMMON_OPTIONS
+export  INVARIANT_OPTIONS
+export  KERNEL_OPTIONS
+export  COMPILER_THUMB_DEFINES
+export  COMPILER_INTERWORK_DEFINES
+export  SOFTVFPMODE_OPTION
+export  VFP2MODE_OPTION
+export  RUNTIME_SYMBOL_VISIBILITY_OPTION
+export  OUTPUT_OPTION
+export  CCFLAGS
+export  UNIX_SLASH_FOR_CC_ABS_PATH
+export  EXCEPTIONS
+export  NO_EXCEPTIONS
+export 	VERSION_INFO
+export  NO_UNALIGNED_ACCESS
+export  DEBUG_FORMAT
+
+# Linker Options
+export  LINKER_OUTPUT_OPTION
+export  LINKER_DEBUG_OPTION
+export  LINKER_NODEBUG_OPTION
+export  CODE_SEGMENT_START
+export  DATA_SEGMENT_START
+export  UNDEFINED_SYMBOL_REF_OPTION
+export  LINKER_ENTRY_OPTION
+export  START_GROUP_SYMBOL
+export  END_GROUP_SYMBOL
+export  SHARED_OBJECT_OPTION
+export  STDLIB_OPTION
+export  STATIC_LIBS_LIST
+export  STATIC_LIBS_PATH
+export 	STATIC_LIBRARY_PATH
+export  STATIC_LIBS
+export  RUNTIME_LIBS_LIST
+export  SYM_NEW_LIB
+export  RUNTIME_LIBS_PATH
+export  SYMVER_OPTION
+export  SO_NAME_OPTION
+export  LINKER_SYMBOLS_MAP_OPTION
+export  COMMANDFILE_OPTION
+export	VIA_FILE_PREFIX
+export	VIA_FILE_SUFFIX
+export  SYMBIAN_UREL_LINK_FLAGS
+export  SYMBIAN_UDEB_LINK_FLAGS
+export  LD_OPTIONS
+
+# Archiver Options
+export  ARCHIVER
+export  ARCHIVER_CREATE_OPTION
+export  AR_OPTIONS
+
+# Compiler Specific Defines
+export  COMPILER_DEFINES
+export  COMPILER_PLAT
+
+# Platform Specific Defines
+export  PLATFORM_DEFINES
+
+# Translator Options
+export  TRANASM_FLAGS
+export  TRANASM_OUTPUT_OPTION
+export  TRANASM_INPUT_OPTION
+
+# Function Call Logger options
+export PREINCLUDE_OPTION_FCLOGGER
+export FC_LOGGER_OPTION
+export FC_LOGGER_DEFINES
+export FC_LOGGER_INCLUDE_OPTION
+export FC_LOGGER_DICTIONARY_FILE_NAME
+export FC_LOGGER_GENERATED_C_FILE_NAME
+
+#OE Options
+export OE_OPTIONS
+export OE_EXE_LIBS
+export OE_EXE_LIBS_WCHAR
+export OE_IMPORT_LIBS
+export OE_NEW_LIB
+
+#-----------------------------------------------------------------------------------------------------
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV5SMP.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV5SMP architecture. 
+
+CUSTOMIZES ARMV5
+
+SMP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV6.BSF	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu 6 $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION) $(NO_UNALIGNED_ACCESS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV6SMP.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu MPCore --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter --memaccess -UL41
+
+SMP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV6T2.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARM 6T2 architecture. The options specified
+# here are same as for ARMV6 except --cpu 6T2 (instead of --cpu 5T).
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu 6T2 $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION) $(NO_UNALIGNED_ACCESS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV6_abiv1.BSF	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV6 architecture. The options specified here are same as for ARMV5 except 
+# the --cpu 6 option in INVARIANT_OPTIONS. This specifies to compiler to compile for generic ARMV6. If any other 
+# specific options are required such as --cpu ARM1136J-S, etc, then it can be done via a different BSF file
+# NOTE: The options specified here for the compiler disable the unaligned memory access.
+
+CUSTOMIZES ARMV5_ABIV1
+
+INVARIANT_OPTIONS --cpu 6 --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter --memaccess -UL41
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ARMV7.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for ARMV 7-A architecture.
+
+CUSTOMIZES ARMV5
+
+INVARIANT_OPTIONS --cpu=7-A $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION) $(NO_UNALIGNED_ACCESS)
+
+# On ARMV7 we use DWARF 3 instead of DWARF 2.
+DEBUG_FORMAT $(DEBUG_FORMAT_DWARF3)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/GCCE.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,636 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This file provides the definition of variables that are used by the component specific makefile
+# This is for the BPABI (Base Platform ABI) platform using the GCCE compiler.
+# Functions added as the part of Plugin Architecture
+# 
+#
+
+#function to find the include path
+define find-inc-path
+	$(subst /bin/../,/,$(subst libgcc.a,%,$(shell $(CC) -print-libgcc-file-name)))
+endef
+
+#function to find the installation path
+define find_install_path
+	$(subst /bin/../lib/gcc/arm-none-symbianelf/3.4.3,,$(subst libgcc.a,,$(shell $(CC) -print-libgcc-file-name)))
+endef
+
+#function to include the version info
+define find-version-info
+$(strip $(shell $(CC) $(VERSION_OPTION)))
+endef
+
+#function to find the library path
+#function to determine the libgcc path
+define find-gcclib-path
+	"$(patsubst %libgcc.a,%,$(shell $(CC) -print-libgcc-file-name))"
+endef
+
+#function to determine the libsupc++ path
+define find-libsupc-path
+	"$(patsubst %/libsupc++.a,%,$(shell $(CC) -print-file-name=libsupc++.a))"
+endef
+
+#---------------
+# Path Settings
+#---------------
+
+# Compiler Installation Location
+CC_INSTALL_PATH=$(strip $(call find_install_path))
+
+#----------------------------------
+# Programs used from the ToolChain
+#----------------------------------
+
+# C++ Compiler
+CC=arm-none-symbianelf-g++
+
+# Linker
+LD=arm-none-symbianelf-ld
+
+# Assembler
+ASM=arm-none-symbianelf-as
+
+# Archiver
+AR=arm-none-symbianelf-ar
+
+# Translator to translate the GCC inline assembler code
+TRANASM=
+
+#--------------------
+# Option Prefix
+#--------------------
+
+# This value will be used by the backend to segregate one option from the other.
+# If option prefix is one among '+','*','.'or '?' (these metacharacters have specific predefined meaning 
+# for pattern matching in Perl) then it should be preceded with '\'.
+OPTION_PREFIX=
+
+#------------------
+# Compiler Options
+#------------------
+
+# Flag whether the compiler requires Unix slashes for absolute paths
+UNIX_SLASH_FOR_CC_ABS_PATHS=1
+
+#-------------------
+# Debug Mode Options
+#-------------------
+
+# Optimization Level in DEBUG mode
+DEBUG_OPTIMISATION=
+
+# Option to produce debug information:
+#   -g1: little information.
+#   -g2: more information.
+#   -g : same as -g2.
+#   -g3: maximum amount of information. For example, at this level information
+#        about macros is created.
+DEBUG_OPTION=-g3
+
+# Option to set the debug format.
+#
+# GCC doesn't support the full DWARF3 format.
+DEBUG_FORMAT:=-gdwarf-2
+
+# Specific compiler options for a UDEB build
+SYMBIAN_UDEB_CCFLAGS= $(DEBUG_OPTION) $(DEBUG_FORMAT)
+
+#-------------------------
+# Target Processor Options 
+#-------------------------
+
+# Option to select the appropriate target processor
+TARGET_ARCH_OPTION=-march=armv5t
+
+# Option to generate the approproate ARM instruction set.
+ARM_INSTRUCTION_SET=-marm
+
+# Option to generate the approproate thumb instruction set.
+THUMB_INSTRUCTION_SET=-mthumb
+
+# Compiler define for thumb instruction set
+COMPILER_THUMB_DEFINES=-D__MARM_THUMB__
+
+# Compiler define for interwork
+COMPILER_INTERWORK_DEFINES=-D__MARM_INTERWORK__
+
+# Option to specify the floating point conformance. 
+FPMODE_OPTION=
+
+# Compiler option to select softvfp mode
+SOFTVFPMODE_OPTION=-msoft-float
+
+# Compiler option to select hardware floating point unit
+VFP2MODE_OPTION=
+
+# Option to force all enumerations to be stored in as integers. 
+ENUM_OPTION=
+
+#---------------------------------
+# Options controlling C++ Features
+#---------------------------------
+
+# Option for handling Virtual functions and Virtual Tables
+EXPORT_VTBL_OPTION=
+
+# Disables unused virtual function elimination (VFE) in C++ mode. --vfe is the default
+VFE_OPTION= 
+
+# Option to turn on exception handling
+EXCEPTIONS=-fexceptions
+NO_EXCEPTIONS=-fno-exceptions
+
+#-------------------------------------------------------------------------
+# Options controlling the ARM Architecture Procedure Call Standard (AAPCS)
+#-------------------------------------------------------------------------
+
+# This Option is for ARM Architecture Procedure Call Standard with the 
+# qualifier to support calls between the ARM and Thumb instruction sets.
+AAPCS_OPTION=-mapcs -mthumb-interwork
+
+#-----------------------------------------------------------
+# Options controlling generation of Compiler Warnings/Errors 
+#-----------------------------------------------------------
+
+# Option to control the Compiler warnings
+CC_WARNINGS_CONTROL_OPTION=-Wall -Wno-unknown-pragmas
+
+# Option to control the Compiler warnings for building Standard C++ application
+CC_STDCPP_WARNINGS_CONTROL_OPTION=-Wall -Wno-unknown-pragmas
+
+# Option to suppress the Compiler errors
+CC_ERRORS_CONTROL_OPTION=
+
+# Option to suppress the Compiler errors for building Standard C++
+CC_STDCPP_ERRORS_CONTROL_OPTION=
+
+# Option to modify the Compiler warnings and errors for Symbian OS
+SYMBIAN_CC_MESSAGE_OPTION=$(CC_WARNINGS_CONTROL_OPTION) $(CC_ERRORS_CONTROL_OPTION)
+
+#-----------------
+# Optional Options
+#-----------------
+
+# Compiler option to avoid the generation of the intermediate files. (Optional)
+TEMP_FILES_OPTION=-pipe
+
+# Library Option
+OWN_LIBRARY_OPTION=
+
+# Option to generate the Object File
+COMPILE_ONLY_OPTION=-c
+
+# Option to generate the Preprocessed File
+PREPROCESSOR_OPTION=-E
+
+# Other additional Options to be passed to the compiler
+EXTRA_CC_OPTION=
+
+#---------------------
+# Preprocessor Options
+#---------------------
+
+# Prefix Header File passed to the preprocessor
+PREFIXFILE=$(EPOCROOT)EPOC32\INCLUDE\GCCE\GCCE.h
+
+# For .cpp Source files
+CPP_LANG_OPTION=-x c++ -Wno-ctor-dtor-privacy
+
+# For .c Source files
+C_LANG_OPTION=-x c
+
+# For .cia Source files
+CIA_LANG_OPTION=-x c++ -S -Wa,-adln
+
+#-------------------
+# Assembler Options
+#-------------------
+
+# Option to generate the Assembler instructions
+ASSEMBLER_LISTING_OPTION=-S
+
+# Output option used to pass the output file name
+ASM_OUTPUT_OPTION=-o
+
+#------------------
+# Translator Options
+#------------------
+
+# Flags to be passed to the translator
+TRANASM_FLAGS=-n -s 
+
+# Output option used to pass the output file name
+TRANASM_OUTPUT_OPTION=-o=
+
+# Input option used to pass the input file name
+TRANASM_INPUT_OPTION=
+
+#---------------------------
+# Include Options and Files
+#---------------------------
+
+# Option to specify the location of the header files
+INCLUDE_OPTION=-I
+
+# Preinclude file for that compiler that contains all the compiler specific definitions
+# required by the Symbian OS source code.
+PREINCLUDE_OPTION=-include $(EPOCROOT)EPOC32/INCLUDE/GCCE/GCCE.h
+
+# Include options required by Function Call Logger  
+FC_LOGGER_INCLUDE_OPTION=-I
+FC_LOGGER_DICTIONARY_FILE_NAME=--dictionary_file_name
+FC_LOGGER_GENERATED_C_FILE_NAME=--gen_c_file_name
+
+# Preinclude file to be passed to the Function Call Logger which uses EDG compiler 
+PREINCLUDE_OPTION_FCLOGGER=$(FC_LOGGER_INCLUDE_OPTION) $(EPOCROOT)EPOC32/INCLUDE/GCCE --preinclude edg_gcce.h
+
+# Option to control the search for the header files. For example, if we do not want to do a search in the
+# standard include directory of C++, then can restrict it by providing the appropriate option.
+HEADER_FILES_CONTROL_OPTION=-nostdinc
+
+# Path to pick the header files from the Compiler installation directory
+COMPILER_INCLUDE_PATH=$(call find-inc-path)include
+
+# Fetches the version of the tools from the installation directory
+VERSION_OPTION=-dumpversion
+VERSION_INFO:=$(call find-version-info)
+
+GCC_MAJOR:=$(word 1,$(subst ., , $(VERSION_INFO)))
+GCC_MINOR:=$(word 2,$(subst ., , $(VERSION_INFO)))
+
+#---------------------
+# Release Mode Options
+#---------------------
+
+# Optimization Level in RELEASE mode
+REL_OPTIMISATION=-O2 -fno-unit-at-a-time
+
+# Specific compiler options for a UREL build
+SYMBIAN_UREL_CCFLAGS=
+
+#---------------------------------
+# Symbol Attribute Setting Options
+#---------------------------------
+
+# Option to set the visibility of runtime symbols as DEFAULT (instead of HIDDEN)
+RUNTIME_SYMBOL_VISIBILITY_OPTION=
+
+# Option to specify the output of the toolchain
+OUTPUT_OPTION=-o
+
+# Options to be passed when building System Target(kernel)
+KERNEL_OPTIONS=$(ARM_INSTRUCTION_SET) $(NO_EXCEPTIONS)
+
+# Options to be passed when building in Arm mode
+ARM_OPTIONS=$(ARM_INSTRUCTION_SET)
+
+# Options to be passed when building in Thumb mode
+THUMB_OPTIONS=$(THUMB_INSTRUCTION_SET)
+
+# Common compiler options for Arm and Thumb mode
+COMMON_OPTIONS=$(SYMBIAN_CC_MESSAGE_OPTION)
+
+# Invariant Options which cannot be modified by the user from MMP file
+INVARIANT_OPTIONS= $(TARGET_ARCH_OPTION) $(ENUM_OPTION) $(OWN_LIBRARY_OPTION) $(FPMODE_OPTION) $(EXPORT_VTBL_OPTION) $(VFE_OPTION) $(AAPCS_OPTION)
+
+# Common compiler options for compiling programs targeted at Symbian OS
+CCFLAGS=$(COMMON_OPTIONS)  $(INVARIANT_OPTIONS) $(TEMP_FILES_OPTION) $(HEADER_FILES_CONTROL_OPTION) $(COMPILE_ONLY_OPTION) $(EXTRA_CC_OPTION)
+
+#------------------
+# Linker Options
+#------------------
+
+# Output option used to pass the output file name
+LINKER_OUTPUT_OPTION=-o
+
+# Option to generate debug information
+LINKER_DEBUG_OPTION=
+
+# Option to *not* generate debug information.
+LINKER_NODEBUG_OPTION=--strip-debug
+
+#--------------------------------------------------------------
+# Options to generate executables conforming to BPABI standards
+#--------------------------------------------------------------
+
+# Option to generate an executable conforming to the Base Platform ABI for the ARM Architecture
+BPABI_OPTION=
+
+# The `R_ARM_TARGET1' relocation is typically used for entries in the `.init_array' section. It is
+# interpreted as either `R_ARM_REL32' or `R_ARM_ABS32', depending on the target. The following option
+# override the default export relocations.
+ifeq "$(GCC_MAJOR)" "3"
+	TARGET_RELOCATION_OPTION:=--target1-abs
+else
+	TARGET_RELOCATION_OPTION:=--target1-rel
+endif
+
+#-------------------------------------
+# Options to specify the output format
+#-------------------------------------
+
+# Option to create a relocatable ELF image. A relocatable image has a dynamic segment that contains 
+# relocations that can be used to relocate the image post link-time.
+RELOCATABLE_IMAGE_OPTION=
+
+# Option to create an ELF shared object.
+SHARED_OBJECT_OPTION=-shared
+
+#-------------------------------------------
+# Options to set the Start of RO/RW sections
+#-------------------------------------------
+
+# Option to set the start of the code section (RO Region)
+CODE_SEGMENT_START=-Ttext
+
+# Option to split object into RO and RW sections
+SPLIT_OPTION=
+
+# Option to set the start of the Data section (RW region)
+RW_BASE_OPTION=-Tdata
+
+# Option to be passed to the linker to set the start of the data section (RW region)
+DATA_SEGMENT_START=$(SPLIT_OPTION) $(RW_BASE_OPTION)
+
+#---------------------------------------------------------
+# Options controlling generation of Linker Warnings/Errors 
+#---------------------------------------------------------
+
+# Option to control the Linker warnings
+LD_WARNINGS_CONTROL_OPTION=
+
+# Option to suppress the Linker errors
+LD_ERRORS_CONTROL_OPTION=
+
+# Option to modify the Linker warnings and errors for Symbian OS
+SYMBIAN_LD_MESSAGE_OPTION=$(LD_WARNINGS_CONTROL_OPTION) $(LD_ERRORS_CONTROL_OPTION)
+
+# Option to specify whether unresolved symbol references from regular object files can be allowed or not.
+UNRESOLVED_SYMBOL_REF_OPTION=--no-undefined
+
+# Option to specify the undefined reference
+UNDEFINED_SYMBOL_REF_OPTION=-u
+
+# Other additional Options to be passed to the Linker
+EXTRA_LD_OPTION=
+
+#-------------------
+#Entry Point Options
+#-------------------
+
+# Option to pass the explicit symbol for beginning execution of the program
+LINKER_ENTRY_OPTION=--entry
+
+# Symbol used to denote the Start of the gouped archives.
+START_GROUP_SYMBOL=
+
+# Symbol used to denote the End of the gouped archives.
+END_GROUP_SYMBOL=
+
+#-------------------------	
+# Library Specific Options
+#-------------------------
+
+# Option to control the search in the standard libraries
+STDLIB_OPTION=-nostdlib
+
+# Additional static libraries that should be supplied to the linker to be linked with
+STATIC_LIBS_LIST=-lsupc++ -lgcc
+
+# Option to pass the path from where the runtime libraries should be picked up
+STATIC_LIBS_PATH=-L
+
+# Fetches the library path from the installation directory, here the functions will return null if the 
+# proper installation path is not set in the Environment Variable
+STATIC_LIBRARY_PATH=$(STATIC_LIBS_PATH)$(call find-gcclib-path) $(STATIC_LIBS_PATH)$(call find-libsupc-path)
+STATIC_LIBS=$(STATIC_LIBRARY_PATH)
+
+# Additional runtime libraries that should be supplied to the linker to be linked with
+# Provide the libraries separated by space, scppnwdl.dso should come before drtrvct2_2.dso
+RUNTIME_LIBS_LIST=dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso scppnwdl.dso drtrvct2_2.dso
+ifeq "$(GCC_MAJOR)" "3" 
+	RUNTIME_LIBS_LIST=dfpaeabi.dso dfprvct2_2.dso drtaeabi.dso drtrvct2_2.dso
+else
+	RUNTIME_LIBS_LIST=drtaeabi.dso dfpaeabi.dso drtrvct3_1.dso dfprvct3_1.dso 
+endif
+
+# The library that contains operator new and operator delete.
+SYM_NEW_LIB=scppnwdl.dso
+
+# Option to pass the path from where the runtime libraries should be picked up
+RUNTIME_LIBS_PATH=
+
+# Option to turn on implicit symbol versioning
+SYMVER_OPTION=--default-symver
+
+# Option to specify the shared object name that is stored in the executable
+SO_NAME_OPTION=-soname
+
+# Option to generate the map file that provides information about the linking
+LINKER_SYMBOLS_OPTION=-Map
+
+# Option to specify the Symbols file
+LINKER_SYMBOLS_FILE_OPTION=
+
+# Option to produce the Map file that provides information about linking
+LINKER_SYMBOLS_MAP_OPTION=$(LINKER_SYMBOLS_OPTION) $(LINKER_SYMBOLS_FILE_OPTION)
+
+# Option to specify the linker script file
+LINKER_SCRIPT_FILE_OPTION=-T
+
+#Via file prefix and suffix 
+VIA_FILE_PREFIX=-(
+VIA_FILE_SUFFIX=-)	
+
+# option to take object file names from other(via) file, here the condition check for 
+# GCCE compiler version is done as the via option differs for different versions in GCCE
+ifeq ($(shell $(CC) -dumpversion),3.4.3)
+	COMMANDFILE_OPTION=
+else 
+	COMMANDFILE_OPTION=@
+endif
+
+# Linker options which can be customized from BSF 
+LD_OPTIONS=$(SYMBIAN_LD_MESSAGE_OPTION)$(UNRESOLVED_SYMBOL_REF_OPTION) $(STDLIB_OPTION) $(EXTRA_LD_OPTION)
+
+# Linker option common to all link commands for UREL build
+SYMBIAN_UREL_LINK_FLAGS=$(BPABI_OPTION) $(RELOCATABLE_IMAGE_OPTION) $(TARGET_RELOCATION_OPTION) $(LD_OPTIONS)
+
+# Linker option common to all link commands for UDEB build
+SYMBIAN_UDEB_LINK_FLAGS=$(BPABI_OPTION) $(RELOCATABLE_IMAGE_OPTION) $(TARGET_RELOCATION_OPTION) $(LD_OPTIONS)
+
+#-----------------
+# Archiver Options
+#-----------------
+
+# ARCHIVER variable should be set since there is a dependency for this variable in e32test.
+ARCHIVER= $(AR)
+
+ARCHIVER_CREATE_OPTION=cr
+
+# Archiver options which can be set from BSF files
+AR_OPTIONS=
+
+#--------------------------------------
+# Compiler and Platform specific macros
+#--------------------------------------
+
+# Macro definitions required to identify the compiler. Allows for conditional compilation based on compiler
+PLATFORM_DEFINES=-D__MARM_ARMV5__
+
+COMPILER_DEFINES=-D__GCCE__
+
+# Compiler target option
+COMPILER_PLAT=GCCE
+
+#--------------------------------------
+# Function Call Logger Options
+#--------------------------------------
+FC_LOGGER_OPTION=--wchar_t_keyword --microsoft_version=1300 --diag_suppress 66,161,611,654,815,830,997,1152,1300,1390 
+
+# Defines for Function Call Logger 
+FC_LOGGER_DEFINES=
+
+#------------
+# OE Options
+#------------
+
+# Options to export all the globol symbols and import undefined references, required by OE
+OE_OPTIONS=-fvisibility=default
+
+# OE Glue code libs
+OE_EXE_LIBS=libcrt0.lib
+OE_EXE_LIBS_WCHAR=libwcrt0.lib
+
+# OE Import Libs
+OE_IMPORT_LIBS=euser.lib
+
+# The library that contains operator new and operator delete.
+OE_NEW_LIB=stdnew.dso
+
+#-----------------------------------------------------------------------------------------------------
+#This section defines the interface with Symbian tools 
+#This SHOULD NOT be changed as any changes in this section will not be picked up by the tools back end
+#-----------------------------------------------------------------------------------------------------
+
+# Programs used from the ToolChain
+export  CC
+export  LD
+export  ASM
+export  AR
+export  TRANASM
+
+# Preprocessor Options
+export  PREFIXFILE
+export  CPP_LANG_OPTION
+export  C_LANG_OPTION
+export  CIA_LANG_OPTION
+
+# Option Prefix
+export OPTION_PREFIX
+
+# Compiler Options
+export	PREPROCESSOR_OPTION
+export  ASSEMBLER_LISTING_OPTION
+export  ASM_OUTPUT_OPTION
+export  INCLUDE_OPTION
+export  PREINCLUDE_OPTION
+export  HEADER_FILES_CONTROL_OPTION
+export  COMPILER_INCLUDE_PATH
+export  SYMBIAN_UREL_CCFLAGS
+export  SYMBIAN_UDEB_CCFLAGS
+export  REL_OPTIMISATION
+export  DEBUG_OPTIMISATION
+export  ARM_OPTIONS
+export  THUMB_OPTIONS
+export  COMMON_OPTIONS
+export  INVARIANT_OPTIONS
+export  KERNEL_OPTIONS
+export  COMPILER_THUMB_DEFINES
+export  COMPILER_INTERWORK_DEFINES
+export  SOFTVFPMODE_OPTION
+export  VFP2MODE_OPTION
+export  RUNTIME_SYMBOL_VISIBILITY_OPTION
+export  OUTPUT_OPTION
+export  CCFLAGS
+export  UNIX_SLASH_FOR_CC_ABS_PATHS
+export  EXCEPTIONS
+export  NO_EXCEPTIONS
+export 	VERSION_INFO
+
+# Linker Options
+export  LINKER_OUTPUT_OPTION
+export  LINKER_DEBUG_OPTION
+export  LINKER_NODEBUG_OPTION
+export  CODE_SEGMENT_START
+export  DATA_SEGMENT_START
+export  UNDEFINED_SYMBOL_REF_OPTION
+export  LINKER_ENTRY_OPTION
+export  START_GROUP_SYMBOL
+export  END_GROUP_SYMBOL
+export  SHARED_OBJECT_OPTION
+export  STDLIB_OPTION
+export  STATIC_LIBS_LIST
+export  STATIC_LIBS_PATH
+export 	STATIC_LIBRARY_PATH
+export  STATIC_LIBS
+export  RUNTIME_LIBS_LIST
+export  RUNTIME_LIBS_PATH
+export  SYM_NEW_LIB
+export  SYMVER_OPTION
+export  SO_NAME_OPTION
+export  LINKER_SYMBOLS_MAP_OPTION
+export  COMMANDFILE_OPTION
+export	VIA_FILE_PREFIX
+export	VIA_FILE_SUFFIX
+export  SYMBIAN_UREL_LINK_FLAGS
+export  SYMBIAN_UDEB_LINK_FLAGS
+export  LD_OPTIONS
+
+# Archiver Options
+export  ARCHIVER
+export  ARCHIVER_CREATE_OPTION
+export  AR_OPTIONS
+
+# Compiler Specific Defines
+export  COMPILER_DEFINES
+export  COMPILER_PLAT
+
+# Platform Specific Defines
+export  PLATFORM_DEFINES
+
+# Translator Options
+export  TRANASM_FLAGS
+export  TRANASM_OUTPUT_OPTION
+export  TRANASM_INPUT_OPTION
+
+# Function Call Logger options
+export PREINCLUDE_OPTION_FCLOGGER
+export FC_LOGGER_OPTION
+export FC_LOGGER_DEFINES
+export FC_LOGGER_INCLUDE_OPTION
+export FC_LOGGER_DICTIONARY_FILE_NAME
+export FC_LOGGER_GENERATED_C_FILE_NAME
+
+#OE Options
+export OE_OPTIONS
+export OE_EXE_LIBS
+export OE_EXE_LIBS_WCHAR
+export OE_IMPORT_LIBS
+export OE_NEW_LIB
+
+#-----------------------------------------------------------------------------------------------------
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/GCCEV6.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for the ARMV6 architecture.
+
+CUSTOMIZES GCCE
+
+INVARIANT_OPTIONS -march=armv6 -mapcs -mthumb-interwork
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/GCCEV6T2.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for the ARMV6T2 architecture.
+
+CUSTOMIZES GCCE
+
+INVARIANT_OPTIONS -march=armv6t2 -mapcs -mthumb-interwork
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/GCCEV7.bsf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+#<bsf>#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This BSF file is to support building for the ARMV7-A architecture.
+
+CUSTOMIZES GCCE
+
+INVARIANT_OPTIONS -march=armv7-a -mapcs -mthumb-interwork
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/armutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,180 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# this package does various ancillary things for armedg modules
+# 
+#
+
+package Armutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Armutl_Help_Mmp
+
+	Armutl_DoMmp
+
+	Armutl_ArmIncDir
+	Armutl_ArmLibList
+	Armutl_ArmRT
+	Armutl_AsmFileList
+	Armutl_ArmVersion
+	Armutl_RVCTMajorVersion
+	Armutl_RVCTMinorVersion
+	Armutl_RVCTPatchLevel
+	Armutl_RVCTBuildNumber
+	Armutl_ArmLibDir
+);
+
+use RVCT_plat2set;
+
+my $ArmInc='';
+my @ArmLibList=();
+my $ArmRT=0;
+my @AsmFileList=();
+
+# make sure that some of the tool subroutines  still work in case of Plat() does not exists in namespace main
+my $Plat = main::Plat() if defined &main::Plat;
+
+my ($RVCTMajorVersion, $RVCTMinorVersion, $RVCTBuildNumber) = RVCT_plat2set::get_version_list($Plat);
+
+my $RVCTVersion = "$RVCTMajorVersion.$RVCTMinorVersion";
+my $RVCTPatchLevel = 0;
+
+
+sub Armutl_Help_Mmp {
+# provide the help text for START <armedg platforms> END blocks
+
+	print
+		"ARMINC  // include value of RVCT*INC environment variable to search paths\n",
+		"ARMLIBS // list the ARM supplied libraries to be linked against\n",
+		"ARMRT   // indicates this target froms part of the runtime and so\n",
+                "        // shouldn't be linked against itself or other runtime libs\n",
+	        "ARMNAKEDASM // list .cpp files subject to auto-translation from GCC inline asm to ARM embedded asm\n"
+	;
+}
+
+sub Armutl_DoMmp (@) { # takes platform text
+	my @PlatTxt=@_;
+
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $MakeFilePath=&main::MakeFilePath;
+	my $MMPFILE=&main::MmpFile;
+	my @UidList=&main::UidList;
+
+	# set up START ARMV5|THUMB2 ... END block module variables
+	my @MmpWarn=();
+	my $Line;
+
+	LINE: foreach $Line (@PlatTxt) {
+		my $LineInfo=shift @$Line;
+		$_=shift @$Line;
+		if (/^ARMINC$/o) {
+			$ArmInc = RVCT_plat2set::get_inc_path($Plat);
+			next LINE;
+		}
+		if (/^ARMRT$/o) {
+		    $ArmRT = 1;
+		    next LINE;
+		}
+		if (/^ARMLIBS$/o) {
+			my $LibVar = "RVCT${RVCTMajorVersion}${RVCTMinorVersion}LIB";
+			my $ArmLibDir = RVCT_plat2set::get_lib_path($Plat);
+
+			push @MmpWarn, "$LineInfo : No libraries specified for keyword ARMLIBS\n" unless @$Line;
+
+			while (@$Line) {
+			  my $lib = shift @$Line;
+
+              my $lib_path = RVCT_plat2set::find_lib( $Plat, $lib );
+
+              if ($lib_path)
+              {
+				  push @ArmLibList, $lib_path;
+              }
+              else
+              {
+				  push @MmpWarn, "$LineInfo : arm library file $lib not found.\n" ;
+              }
+			}
+			next LINE;
+		      }
+		if (/^ARMNAKEDASM$/o) {
+		    push @MmpWarn, "$LineInfo : No files specified for keyword ARMNAKEDASM\n" unless @$Line;
+		    push @AsmFileList, @$Line;
+		    next LINE;
+		}
+		push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
+	}
+
+	undef $Line;
+	if (@MmpWarn) {
+		warn
+			"\nMMPFILE \"$MMPFILE\"\n",
+			"START .. END BLOCK WARNINGS(S)\n",
+			@MmpWarn,
+			"\n"
+		;
+	}
+	undef @MmpWarn;
+    }
+
+sub Armutl_ArmIncDir() {
+    $ArmInc;
+}
+
+sub Armutl_ArmLibList() {
+    @ArmLibList;
+}
+
+sub Armutl_ArmRT() {
+    $ArmRT;
+}
+
+sub Armutl_AsmFileList() {
+    @AsmFileList;
+}
+
+sub Armutl_ArmVersion() {
+  return $RVCTVersion;
+}
+
+sub Armutl_RVCTMajorVersion() {
+  return $RVCTMajorVersion;
+}
+
+sub Armutl_RVCTMinorVersion() {
+  return $RVCTMinorVersion;
+}
+
+sub Armutl_RVCTPatchLevel() {
+  return $RVCTPatchLevel;
+}
+
+sub Armutl_RVCTBuildNumber() {
+  return $RVCTBuildNumber;
+}
+
+sub Armutl_ArmLibDir() {
+  my $LibVar = "RVCT${RVCTMajorVersion}${RVCTMinorVersion}LIB";
+  my $ArmLibDir = $ENV{$LibVar};
+  return $ArmLibDir;
+}
+
+1;
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/bpabiutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This package  does various ancillary things for BPABI (Base Platform ABI) platforms
+# 
+#
+
+package BPABIutl;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	BPABIutl_Plat_List
+	BPABIutl_Config_Path
+	BPABIutl_Get_Config_Variables
+);
+
+use E32Variant;
+require E32Plat;
+
+my %ConfigPath;
+my $variantABIV2Keyword = &Variant_GetMacro();
+
+sub BPABIutl_Plat_List {
+
+# Identify the BPABI platforms to be supported based on the compiler configuration files
+# present in the location specified by the environment variable "SYMBIAN_COMPILATION_CONFIG_DIR"
+# and in the directory $EPOCROOT\epoc32\tools\compilation_config
+
+	my @CompilerConfigPath;
+
+	if (exists($ENV{'SYMBIAN_COMPILATION_CONFIG_DIR'})) 
+	{
+		my $Path = $ENV{SYMBIAN_COMPILATION_CONFIG_DIR};
+		@CompilerConfigPath = split(/;/, $Path);
+	}
+
+	push @CompilerConfigPath, "$ENV{EPOCROOT}epoc32\\tools\\compilation_config";
+
+	my $ConfigDir;
+	my @BPABIPlats = ();
+
+	foreach $ConfigDir (@CompilerConfigPath)
+	{
+		opendir DIR, "$ConfigDir";
+		my @Plats=grep /\.mk$/i, readdir DIR;
+		my $Plat;
+		foreach $Plat (@Plats) 
+		{
+# The platform name will be same as the name of the configuration file <config.mk>
+# with the suffix '.mk' removed
+			$Plat =~ s/\.mk//;
+			if ($variantABIV2Keyword) {
+				if ($Plat =~ /^armv5_abiv2$/i) {
+					$Plat = "ARMV5";
+				}
+			}
+			else {
+				if ($Plat =~ /^armv5$/i) {
+					$Plat = "ARMV5_ABIV2";
+				}
+			}
+			unless (grep /$Plat$/i, @BPABIPlats) {
+				$Plat = uc $Plat;
+				push @BPABIPlats, $Plat;
+				if (!$variantABIV2Keyword && $Plat =~ /^ARMV5_ABIV2$/i) {
+					$ConfigPath{$Plat} = "$ConfigDir\\ARMV5.mk";
+				}
+				else {
+					$ConfigPath{$Plat} = "$ConfigDir\\$Plat.mk";
+				}
+			}
+		}
+	}
+	closedir DIR;
+	return @BPABIPlats;
+}
+
+sub BPABIutl_Config_Path($) {
+	my ($plat) = @_;
+# Returns the Path of the compiler configuration file
+	if (!keys(%ConfigPath))
+	{
+	    # Running for first time so initialise ConfigPath
+	    BPABIutl_Plat_List();
+	}
+	if (!$ConfigPath{$plat})
+	{
+		# Get the root platform name to support hierarchy of customizations
+		my $CustomizedPlat =  &E32Plat::Plat_Root($plat);
+
+# In default ABIV1 mode, the platform name for v2 mode of ARMV5 is ARMV5_ABIV2
+		if ( !$variantABIV2Keyword && $CustomizedPlat =~ /^ARMV5$/i ){
+			$ConfigPath{$plat} = $ConfigPath{ARMV5_ABIV2};
+		}
+
+# In default ABIV2 mode, the platform name for v2 mode of ARMV5 is ARMV5
+		elsif ( $variantABIV2Keyword && $CustomizedPlat =~ /^ARMV5$/i) {
+			$ConfigPath{$plat} = $ConfigPath{ARMV5};
+		}
+		else{
+			$ConfigPath{$plat}=$ConfigPath{$CustomizedPlat};
+		}
+	}
+	return "$ConfigPath{$plat}";
+}
+
+# routine to extract a set of variables from the compilation configuration
+# file. The variables extracted are determined by the extractvars.make file.
+# The variables are returned in a hash.
+sub BPABIutl_Get_Config_Variables
+{
+    my ($plat) = @_;
+    my $configfile = BPABIutl_Config_Path($plat);
+    my $extractvars = "$ENV{EPOCROOT}epoc32\\tools\\compilation_config\\extractvars.make";
+    my $command = "make CONFIG_FILE=$configfile -s -f $extractvars" ;
+    my $result = `$command`;
+    my %vars;
+    my @lines = split('\n', $result);
+    foreach my $line (@lines)
+    {
+	chomp $line;
+	if ($line =~ /(\w+)=(.*)/)
+	{
+	    $vars{$1} = $2;
+	}
+    }
+    return %vars;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_arm.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2046 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_arm;
+
+my $ToolPrefix='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+	'Entry'=>'-e',
+	'Ld'=>'',
+	'Elftran'=>'',
+);
+
+# takes an 'expression'  to evaluate with $_ bound to each of the 
+# remaining args
+sub PrintList
+{
+    my $expr = shift @_;
+    foreach (@_) {
+	my $str = eval($expr);
+	&main::Output($str);
+    }
+}
+
+# specify floating point model here
+my $floatingpointmodel = "softvfp";
+
+if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i)) {
+	$floatingpointmodel = "vfpv2";
+}
+
+my $Archive;
+my $Link;
+my $Objcopy;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMPlatProcessMmp
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMStartSrc
+		PMAifBld
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+	PMPrefixFile
+	PMSupportsFeatureVariants
+);
+
+use Cwd;
+use Armutl;
+use RVCT_plat2set;
+use cl_generic;
+use E32env;
+use Genutl;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NON_DEBUGGABLE => 0;
+use constant DEBUGGABLE => 1;
+use constant DEBUGGABLE_UDEBONLY => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+
+sub PMHelp_Mmp {
+    &Armutl_Help_Mmp;
+}
+
+my $Plat=main::Plat();
+
+my ($RVCTMajorVersion, $RVCTMinorVersion, $RVCTBuildNumber) = RVCT_plat2set::get_version_list($Plat); 
+
+my $RVCTVersion = "${RVCTMajorVersion}_${RVCTMinorVersion}";
+
+my $ARMCCVersion = "${RVCTMajorVersion}${RVCTMinorVersion}0${RVCTBuildNumber}";
+
+my $oP = '--';
+$oP = '-' if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2);
+
+#Check if Function call Logger is enabled
+my $Function_Call_Logger=&main::IsFunctionCallLogging();
+
+# Get the information regarding supporting Compiler Wrapper Option
+my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+
+#Check the existence of elf2e32.exe in the system path
+my $IsExistELF2E32EXE = 0;
+    open ELF2E32PIPE, "elf2e32 2>&1 |";
+    while (<ELF2E32PIPE>) {
+	if($_=~/^Symbian Post Linker\, Elf2E32/) {
+	    $IsExistELF2E32EXE = 1;
+	    last;
+	}
+	next;
+    }
+    close ELF2E32PIPE;
+
+my $ArmIncDir;
+my @ArmLibList;
+my $ArmRT = 0;
+my %AsmFiles = ();
+my %AsmDirs = ();
+my $oe_options = '';
+my $NamedSymLkup = 0;
+my $symNameLkupOpt = '';
+
+
+sub PMPlatProcessMmp (@) {
+        &Armutl_DoMmp(@_);
+	$ArmIncDir = RVCT_plat2set::get_inc_path($Plat);
+	&main::SetStdIncPaths($ArmIncDir);
+	@ArmLibList = &Armutl_ArmLibList;
+	$ArmRT = &Armutl_ArmRT;
+	my @AsmFileList = &Armutl_AsmFileList;
+	foreach (@AsmFileList) { $AsmFiles{ucfirst lc $_} = 1; }
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+my $RVCT20 = 0; 
+
+# suppress these warnings & errors
+#Warning: #66-D: enumeration value is out of "int" range 
+# "EUSER\CBASE\Ub_act.cpp", line 20: Warning:  #161-D: unrecognized #pragma
+# 611: overloaded virtual function "entity" is only partially overridden in <entitykind> "entity"
+# "EUSER\CBASE\Ub_act.cpp", line 256: Warning:  #654-D: declaration modifiers are incompatible with previous declaration
+# 997: <entity-kind> "entity" is hidden by "entity" -- virtual function override intended?
+# "EPOC32\include\s32stor.h", line 354: Error:  #1152-D: polymorphic base classes need to be exported as well
+# "INCLUDE\e32base.h", line 31: Warning:  #1300-D: ~CBufBase inherits implicit virtual
+#"COMPSUPP\\RVCT2_1\\Dfpaeabi.cpp", line 87: Warning: A1488W: PROC/FUNC at line 9 without matching ENDP/ENDFUNC
+#"COMPSUPP\\RVCT2_1\\Dfpaeabi.cpp", line 85: Warning: A1464W: ENDP/ENDFUNC without corresponding PROC/FUNC
+#Warning: L6318W: _integrator_cm1136_ekern.in(.text) contains branch to a non-code symbol FindMostSignificantOne(unsigned long).
+
+my $diag_suppressions = '--diag_suppress 66,161,611,654,997,1152,1300,1464,1488,6318,6331';
+
+# downgrade from errors to warnings
+my $diag_warnings = '';
+
+# upgrade from warnings to errors
+# Warning:  #1267-D: Implicit physical register R0 should be defined as a variable
+my $diag_errors = '--diag_error 1267';
+  
+my $commonOptions = $RVCT20 ?
+  "$diag_suppressions $diag_warnings $diag_errors" :
+  "$diag_suppressions $diag_warnings $diag_errors";  
+
+my @mmpOption = &main::ReplaceOptions("ARMCC");
+my $CompilerOption = &main::CompilerOption("ARMCC");
+my $contingentOptions;
+my $thumbOptions = $RVCT20 ? '-thumb' : '--thumb ';
+my $armOptions = $RVCT20 ? '-arm' : '--arm ';
+my $kernelOptions = $RVCT20 ? '-arm' : '--arm --no_exceptions --no_exceptions_unwind';
+my $invariantOptions = $RVCT20 ? 
+  '-cpu 5T --enum_is_int -Ono_known_library --export_vtbl -apcs /inter' :
+  '--cpu 5T --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter';
+$invariantOptions .= ' --dllimport_runtime' unless ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2);  
+my $exceptions = $RVCT20 ? '' : ' --exceptions --exceptions_unwind';
+my $floatingpoint = $RVCT20 ? '' : ' --fpu '.$floatingpointmodel.'';
+my @FCLogger_Macros; # Macros required to be passed to the FCLogger
+
+my $useLinkerFeedBack = 0;
+
+sub LinkerFeedBackFile() {
+  return unless $useLinkerFeedBack;
+  my $Trg = &main::Trg;
+  return "$Trg.lfb";
+}
+
+sub LinkerFeedBackOption() {
+  return "" unless $useLinkerFeedBack;
+  my $BasicTrgType=&main::BasicTrgType;
+  return "" unless ($BasicTrgType=~/^(DLL|EXE)/o);
+  my $file = LinkerFeedBackFile();
+  return "--feedback $file ";
+}
+
+my %BSF_keywords = (
+		    COMMON_OPTIONS => 1,
+		    THUMB_OPTIONS => 1,
+		    ARM_OPTIONS => 1,
+		    KERNEL_OPTIONS => 1,
+		    INVARIANT_OPTIONS => 1
+		   );
+
+sub Read_BSF_Options() {
+        my %plat = (main::PlatRec());
+	my @Customization_Data = split(/\n/,$plat{'CUSTOMIZATION_DATA'});
+	foreach my $option (@Customization_Data) {
+			next if ($option =~ /^$/);
+	        warn "Unrecognized BSF syntax: $option.\n"
+		        unless ($option =~ /\s*(\S+)\s+(.+)$/);
+		my $key = uc $1;
+		my $val = $2;
+	        warn "Unrecognized BSF keyword: $key.\n"
+		        unless ($BSF_keywords{$key});
+		if ($key =~ /COMMON_OPTIONS/) {
+		        Set_BSF_Options(\$commonOptions,$val);
+			next;
+		}
+		if ($key =~ /THUMB_OPTIONS/) {
+		        Set_BSF_Options(\$thumbOptions,$val);
+			next;
+		}
+		if ($key =~ /ARM_OPTIONS/) {
+		        Set_BSF_Options(\$armOptions,$val);
+			next;
+		}
+		if ($key =~ /KERNEL_OPTIONS/) {
+		        Set_BSF_Options(\$kernelOptions,$val);
+			next;
+		}
+		if ($key =~ /INVARIANT_OPTIONS/) {
+		        Set_BSF_Options(\$invariantOptions,$val);
+			next;
+		}
+
+	}		
+}
+
+# Set the options passed from BSF file 
+# @param OptionName    - BSF Keyword using which the options would be overridden in the BSF file
+# @param Options       - List of options read from the BSF keyword
+sub Set_BSF_Options($$)
+{
+	my ($OptionName,$Options) = @_;
+	my @Fragments=();
+	
+	# Check if the value of BSF option is to be set or added/removed.
+	if($Options =~ /\+\[.*\]\+|\-\[.*\]\-/)
+	{
+		if (@Fragments = Split_BSF_Options($Options,'RemoveOptions'))
+		{
+			foreach my $Opt (@Fragments) 
+			{
+				# Remove trailing white spaces
+				$Opt =~ s/\s+$//;				
+				$$OptionName =~ s/$Opt//g;
+			}					
+			@Fragments=();
+		}
+		if (@Fragments = Split_BSF_Options($Options,'AddOptions')) 
+		{
+			$$OptionName .= " @Fragments";
+			@Fragments=();
+		}		
+		
+		# Warn if options are not present in the form '+[...]+' or '-[...]-'
+		$Options =~ s/\+\[.*?\]\+|\-\[.*?\]\-//g;
+		if($Options !~ /^\s*$/)
+		{
+			print "Warning: Ignoring option(s) \"$Options\" specified in BSF as option(s) should be in the form '+[...]+' or '-[...]-.\n";
+		}
+	}
+	else
+	{
+		$$OptionName = $Options;
+	}		
+	
+	&main::Output(					
+		"\n"
+	);
+}
+
+# Split BSF options to find options which are to be added/removed
+# @param String      - List of options present in form '+[...]+' or '-[....]-'
+# @param $Task       - Variable to decide whether to return options to be addded or options to be removed
+sub Split_BSF_Options($$)
+{
+	my ($String,$Task) = @_;
+    my @Result = ();
+	my @Fragments = ();
+	my $Pattern = '';
+		
+	if ($Task eq 'AddOptions')
+	{
+		# Get the options which are to be added (present in the form '+[...]+')
+		@Fragments = $String =~ /\+\[(.*?)\]\+/g;	
+	}
+	elsif ($Task eq 'RemoveOptions') 
+	{
+		# Get the options which are to be removed (present in the form '-[...]-')
+		@Fragments = $String =~ /\-\[(.*?)\]\-/g;
+	}	
+
+	# Set the value of '$Pattern' which is required to segregate one option from another based on the option prefix.
+	# Option prefix for RVCT can be '-' or '--'.
+	$Pattern = '-{1,2}\S+\s*(?!-)\S*';	
+
+	foreach my $Val (@Fragments) 
+	{
+		my @Opt = $Val =~ /$Pattern/g;
+		push @Result,@Opt;		 		
+	}
+	return @Result;	
+}
+
+sub ComputeCompilerOpts() {
+	my %plat = &main::PlatRec();
+	Read_BSF_Options() if ($plat{'CUSTOMIZES'});
+	my $ABI=&main::ABI;
+	my $TrgType=&main::TrgType;
+	if (SysTrg()) {
+	        $contingentOptions = $kernelOptions.$floatingpoint;
+        } elsif (main::BuildAsARM() or ($ABI eq 'ARMV4')) {
+	        $contingentOptions = $armOptions.$floatingpoint.$exceptions;
+	    } else {
+			$contingentOptions = $thumbOptions.$floatingpoint.$exceptions.' -D__MARM_THUMB__';	
+			push @FCLogger_Macros, '__MARM_THUMB__';
+	}
+	# support for ARMV4
+	my $invopts = "$invariantOptions";
+	if ($ABI eq 'ARMV4') {
+		$invopts =~ s/5T/4/;
+		$invopts =~ s/inter/nointer/;
+	} else {
+		$contingentOptions .= ' -D__MARM_INTERWORK__';
+		push @FCLogger_Macros, '__MARM_INTERWORK__';
+	}
+
+	#Options to export all the external symbols for OE DLL , OE Exe and OE Static Lib
+	if ($TrgType=~/^STDDLL$/o || $TrgType=~/^STDEXE$/o || $TrgType=~/^STDLIB$/o) {
+		$oe_options=' --no_hide_all';
+	}
+
+	return $commonOptions.' '.$contingentOptions.' '.$invopts.' '.$oe_options.' '.&main::CompilerOption("ARMCC");
+}
+
+my $Makecmd;
+
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $ABI=&main::ABI;
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DefFile=&main::DefFile;
+	my $EPOCPath=&main::EPOCPath;
+	my $LinkAs=&main::LinkAs;
+	my $LibPath=&main::LibPath.'LIB\\';
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+
+	my $VariantFile=&main::VariantFile();
+
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+		if ($BasicTrgType=~/^LIB$/o) {
+			# Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+			# Rename all the static libs produced with RVCT2.1 as {libname}2_1.lib
+		        if ($Trg=~/^\s*(\S+)(\.lib)$/io) {
+			        if ($1!~/$RVCTVersion/i) {
+				        $Trg=$1.$RVCTVersion.".lib";
+				}
+			}
+			if ($BaseTrg!~/$RVCTVersion/i) {
+			        $BaseTrg .= $RVCTVersion;
+			}
+		}
+	}
+
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+    my $SystemTrg = &main::SystemTrg;
+    my $ExportLibrary=&main::ExportLibrary;
+    my $NoExportLibrary=&main::NoExportLibrary;
+    # N.B. should get better way to detect kernel probably!!
+    $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+	
+    # N.B. should get better way to detect this
+    $SystemTrg = 1 if ($Trg =~ /KSRT/i);
+
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+#	work out the flags for various platforms
+	unless ($ABI eq 'ARMV5' or $ABI eq 'ARMV4') {
+		&main::FatalError("Platform module - ABI \"$ABI\" unrecognised");
+	}
+	my $ComputeCompilerOpts=ComputeCompilerOpts();
+	if (@mmpOption) 
+	{
+		my $pattern = '-{1,2}\S+\s*(?!-)\S*';	
+		foreach my $options (@mmpOption) 
+		{
+			my @opts = $options =~ /$pattern/g;
+			my $count = 0;
+			while ($count <= $#opts) 
+			{
+				my $opt;
+				my $rep;
+				if ($opts[$count] =~ /^(\S+)\s+(\S+)$/) 
+				{
+					$opt = $1;
+					$rep = $2;
+					$ComputeCompilerOpts =~ s/$opt\s+\S+\s+/ $opt $rep /g;
+					$count++;
+				}
+				else
+				{
+					$opt = $opts[$count];
+					$rep = $opts[$count+1];
+					$ComputeCompilerOpts =~ s/$opt/$rep/g;					
+					$count+=2;
+				}
+			}		
+		}
+	}
+
+	$PlatOpt{Arm} = $ComputeCompilerOpts;
+
+	my $InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+
+	$Archive=$ToolPrefix.'armar';
+	$Link=$ToolPrefix."armlink ${oP}diag_suppress 6331,6780 ";
+	$Objcopy=$ToolPrefix.'objcopy';
+
+	&Generic_Header(0,$Makecmd);	# define standard things using absolute paths
+		 
+	if ($Makecmd eq "nmake") {
+		&main::Output(
+			"\n",
+  			"PATH=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(PATH)\n",
+			"\n"
+		);
+	}
+	else {
+		&main::Output(
+			"\n",
+			"# must set both PATH and Path to make it work correctly\n",
+  			"Path:=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(Path)\n",
+			"PATH:=\$(Path)\n",
+			"\n"
+		);
+	}
+
+	&main::Output(
+		"INCDIR  ="
+	);
+	PrintList("\" -J \$_\"", @ChopUserIncPaths);
+	PrintList("\" -J \$_\"", @ChopSysIncPaths);
+	if ($ArmIncDir) {
+		&main::Output(
+		    " -J \"$ArmIncDir\" ",
+		);	
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	#Function Call Logger
+	if ($Function_Call_Logger)	{
+		&main::Output(
+			"INCDIR_FCLOGGER  ="
+		);
+		PrintList("\" -I \$_\"", @ChopUserIncPaths);
+		PrintList("\" -I \$_\"", @ChopSysIncPaths);
+		if ($ArmIncDir) {
+			&main::Output(
+				" -I \"$ArmIncDir\" "
+			);	
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+	
+	&main::Output(
+		"ARMCCFLAGS=$PlatOpt{Arm} -c\\\n",
+		"\n"
+	);
+
+	&main::Output(
+		"ARMCCDEFS = "
+	);
+	PrintList("\" -D\$_\"", @MacroList);
+	
+	if($VariantFile) {
+		if ($Function_Call_Logger) {
+			#FC Logger accepts product include file without path
+			my $file=&main::Path_Split('File', ${VariantFile});
+			
+			&main::Output(
+				" -D\"__PRODUCT_INCLUDE__=\\\"${file}\\\"\""
+			);
+		}
+		else {
+			&main::Output(
+				" -D__PRODUCT_INCLUDE__=\\\"${VariantFile}\\\""
+			);
+		}
+	}
+
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+
+	if ($TrgType=~/^STDDLL$/o || $TrgType=~/^STDEXE$/o){
+#	For now, named symbol lookup is enabled only for the STD binaries. Later, it may be enabled based on an mmp 
+#	keyword.
+
+		$NamedSymLkup = 1;
+		$symNameLkupOpt = '--sym_name_lkup';
+	}
+
+
+
+	foreach (@BldList) {
+		&main::Output(
+			"ARMCC$_ = armcc"
+		);
+		if(&main::DebugSwitchUsed() ) {
+#			when the debug switch is specified and enabled, set the compiler's debug flag for both udeb or urel.
+#			when the debug switch is disabled, don't set the compiler's debug flag for either udeb or urel.
+#			The optimization option is set only based on the build i.e., Udeb or Urel and is independent of
+#			whether debug is enabled or not. This might give a poorer debug view for debug-enabled Urel build.
+			if(&main::SymbolicDebugEnabled() ) {
+				&main::Output(
+						  ' -g'
+				);
+			}
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				      ' -g'
+			);
+		}
+
+		if (/DEB$/o) {
+			&main::Output(
+				      ' -O0'
+			);
+		}
+		else {
+			&main::Output(
+				      ' -O2'
+			);
+		}		
+		&main::Output(
+			' $(ARMCCFLAGS)'
+		);
+		my @ml = &main::MacroList($_);
+		PrintList("\" -D\$_\"", @ml);
+		&main::Output(
+			" \$(ARMCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	#Function call logger
+	if ($Function_Call_Logger)	{
+		#Send all the debug macros to logger
+		foreach (@BldList) {
+			&main::Output (
+				"FCLOGGER$_ = ",
+				$EPOCPath, 
+				"tools\\fc_logger\\edgcpfe"
+			);
+
+			my @ml = &main::MacroList($_);
+			push @ml, "__ARMCC_VERSION=$ARMCCVersion";
+			PrintList("\" -D\$_\"", @ml);
+			&main::Output(
+				" \$(ARMCCDEFS)"
+			);
+			PrintList("\" -D\$_\"", @FCLogger_Macros);
+			&main::Output(
+				"\n",
+				"\n"
+			);
+		}
+	}
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCTRG$_)\\".&main::Trg($_))
+			);
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+	PrintList("\"\nRESOURCE\$_ : MAKEWORK\$_\"", @BldList);
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+	        PrintList("\" \$_\"", @BldList);
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib"),
+				);
+				# if elf2e32.exe(postlinker) exists, then generate .dso along with .lib
+				if ($IsExistELF2E32EXE) {
+					&main::Output(
+						" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso"), "\n"
+					);
+				}
+				else {
+					&main::Output("\n");
+				}
+			}
+			else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create any import libraries.\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		} else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+
+		my $theDefFile = $DefFile;
+		$theDefFile = "\$(EPOCBLD)\\$BaseTrg.def" unless (-e $DefFile);
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+			"\n",
+			&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), " : ",
+			&Generic_Quote($DefFile), "\n",
+				"\tperl -S prepdef.pl ", &Generic_Quote($DefFile), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+				"\tdef2dll.bat --path=\$(EPOCLIB)\\LIB \\\n\t\t--bldpath=\$(EPOCBLD) \\\n\t\t--import=$ExportLibrary \\\n",
+			"\t\t--deffile=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking\n",
+			"\n",
+		 );
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), "\n",
+				"\tcopy \"\$<\" \"\$@\"\n"
+			);
+		}
+		#if elf2e32.exe(postlinker) exists, then generate .dso(which will be used by ABIV2 platforms)
+		if ($IsExistELF2E32EXE) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), " : ",
+				&Generic_Quote($DefFile), "\n",
+					"\telf2e32 --definput=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" --dso=",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"),
+					" --linkas=$LinkAs\n"
+			);
+			if ($ExtraExportLibrary) {
+				&main::Output(
+					"\n",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso"), " : ",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), "\n",
+					"\tcopy \"\$<\" \"\$@\"\n"
+				);
+			}		
+		}		
+	}
+
+	my $freezeDir = &main::Path_Split('Path', $DefFile);
+	chop($freezeDir);
+
+	# dummy rule for def files to cope with filename case differences
+	unless (&main::ExportUnfrozen) {
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				"\n",
+				"\n",
+				&Generic_Quote($DefFile), " : ", "\n",
+				"\t\@rem Do nothing\n",
+			);
+		}
+	}
+
+	&main::Output(
+		"\n",
+		"\n",
+		&Generic_Quote($freezeDir), " : ", "\n",
+		"\tperl -S emkdir.pl \$\@\n",
+	);
+
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE : ",
+		&Generic_Quote($freezeDir), "\n",
+	);
+	if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+# 	    call perl on the script here so make will die if there are errors 
+#           - this doesn't happen if calling perl in a batch file
+	    &main::Output( "\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n" );
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib\"\n"
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+
+	my $ABI=&main::ABI;
+    my @ASSPLibList=&main::ASSPLibList;
+    my @SrcList=&main::SrcList;
+    my @StringTables=&main::StringTables;
+    my $BaseTrg=&main::BaseTrg;
+	my $FeatureVariantBaseTrg=&main::FeatureVariantBaseTrg;
+    my $Bld=&main::Bld;
+    my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+    my $DefFile=&main::DefFile;
+    my $EPOCIncPath=&main::EPOCIncPath;
+    my $FirstLib=&main::FirstLib;
+    if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+	    # Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+	    # Rename all the static libs used with RVCT2.1 as {libname}2_1.lib
+	    if ($FirstLib=~/^\s*(\S+)(\.lib)$/io) {
+		    if ($1!~/$RVCTVersion/i) {
+			    $FirstLib=$1."${RVCTVersion}.lib";
+		    }
+	    }
+    }
+    my $BasicTrgType=&main::BasicTrgType;
+    my @LibList;
+    my @RTLibList = $RVCT20 ?
+      ('udfp.lib', 'udrt.lib', 'udrt.lib(VtblExports.o)'):
+      ('dfpaeabi.lib', "dfprvct${RVCTVersion}.lib", 'drtaeabi.lib', 'drtaeabi.lib(VtblExports.o)');
+    if ( $RVCTVersion lt "2_2" ) {
+		push @RTLibList, "dfprvct${RVCTVersion}-thunk.lib";
+		push @RTLibList, "drtrvct${RVCTVersion}.lib";
+    }
+    else {
+		# The scppnwdl.lib should come before drtrvct2_2.lib
+		push @RTLibList, "scppnwdl.lib";
+		push @RTLibList, "drtrvct${RVCTVersion}.lib";
+    }
+    my $SystemTrg = &main::SystemTrg;
+    my $LibPath= &main::LibPath;
+    my $LinkAs=&main::LinkAs;
+    my $ExportLibrary=&main::ExportLibrary;
+    my $NoExportLibrary=&main::NoExportLibrary;
+    # N.B. should get better way to detect kernel probably!!
+    $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+    my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+    my $RelPath=&main::RelPath;
+    my @StatLibList=&main::StatLibList;
+    if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+	    # Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+	    # Rename all the static libs used with RVCT2.1 as {libname}2_1.lib
+	    for (my $i =0; $i < scalar(@StatLibList); $i++) {
+		    if ($StatLibList[$i]=~/^\s*(\S+)(\.lib)$/io) {
+			    if ($1!~/$RVCTVersion/i) {
+				    $StatLibList[$i]=$1."${RVCTVersion}.lib";
+			    }
+		    }
+	    }
+    }	     
+    my $StatLinkPath=&main::StatLinkPath;
+    my $Trg=&main::Trg;
+    if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+	    if ($BasicTrgType=~/^LIB$/o) {
+		    # Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+		    # Rename all the static libs produced with RVCT2.1 as {libname}2_1.lib
+		    if ($Trg=~/^\s*(\S+)(\.lib)$/io) {
+			    if ($1!~/$RVCTVersion/i) {
+				    $Trg=$1.$RVCTVersion.".lib";
+			    }
+		    }
+		    if ($BaseTrg!~/$RVCTVersion/i) {
+			    $BaseTrg .= $RVCTVersion;
+		    }
+	    }
+    }
+
+	#OE Glue Code
+	my @oe_exe_libs=("libcrt0.lib");
+	my @oe_exe_libs_wchar=("libwcrt0.lib");
+
+	#OE Import Library List
+	my @oe_import_library_list=();
+
+    my $TrgType=&main::TrgType;
+    my @UidList=&main::UidList;
+	my $InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}	
+
+
+    my $linkerDebugOpt = "";
+    if(&main::DebugSwitchUsed() ){
+		if(&main::SymbolicDebugEnabled ()){
+#		set the linker's debug flag if the debug switch is specified and enabled.
+		$linkerDebugOpt = "${oP}debug ";
+		}
+	}
+	elsif ($Bld =~ /DEB/) {
+	$linkerDebugOpt = "${oP}debug ";
+	}
+    
+	if ($Bld =~ /DEB/) {
+	@LibList = &main::DebugLibList;
+	} else {
+	@LibList = &main::LibList;
+    }
+
+	if(not(grep /^euser.lib$/, @LibList)){
+		push @oe_import_library_list, "euser.lib";
+	}
+	if(not (grep /^libc.lib$/i, @LibList)){
+		push @oe_import_library_list, "libc.lib";
+	}
+
+#	set up $LinkAs
+    $UidList[2]=~/^0x(.*)$/o;
+    if ($1 ne '00000000') {	# have to make sure than series of noughts in brackets doesn't appear in name for null uids
+	$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+    }
+
+
+    # REAL TARGETS
+    #-------------
+    &main::Output(
+		  "# REAL TARGET - BUILD VARIANT $Bld\n",
+		  "\n"
+		  );
+
+#	releasables
+	my @releaseables;
+	
+	push @releaseables, "$RelPath$Trg" if ($BasicTrgType!~/^IMPLIB$/io);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		push @releaseables, "$RelPath$Trg.map";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+		push @releaseables, "$LibPath$ExportLibrary.lib";
+		push @releaseables, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+		#if elf2e32.exe(postlinker) exists in the $PATH, then include .dsos also into releasables list
+		if ($IsExistELF2E32EXE) {
+			push @releaseables, "$LibPath$ExportLibrary.dso";
+			push @releaseables, "$LibPath$ExtraExportLibrary.dso" if ($ExtraExportLibrary);
+		}		
+	}
+
+	push @releaseables, &main::FeatureVariantVMapFile() if &main::FeatureVariantVMapFile();
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+	    	my $BaseSrc = &main::Path_Split('Base', $_);
+	    	my $Ext = &main::Path_Split('Ext', $_);
+		if ($Ext =~ /cia/i) {
+		    $BaseSrc = "$BaseSrc\_";
+		}
+		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	# Compiler wrapper support starts
+	if($IsCompilerWrapperOption)
+	{
+	 	my $Platcmpwrap=&main::Plat;
+	 	
+		&main::Output(
+			"COMPWRAP$Bld : OUTPUT_NAME = ",
+			"$Platcmpwrap\_$Bld",
+			"\n"
+		);
+	 	
+		&main::Output(
+			"COMPWRAP$Bld : MAKEWORK$Bld"
+		);
+
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			&main::Output(
+				" \\\n\tCOMPWRAP$Bld$BaseSrc"
+			);
+		}
+
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+	# Compiler wrapper support
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+		if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+			# Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+			&main::Output(
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB$RVCTVersion.lib")
+			);
+		}
+		else {
+			&main::Output(
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.lib")
+			);
+		}
+	}
+	    
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList);
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @LibList);
+
+		#OE Import Libraries 
+		if ( $TrgType=~/^STDEXE$/o || $TrgType=~/^STDDLL$/o ) 
+		{
+			PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @oe_import_library_list);
+		}
+
+		#OE Glue Code
+		if ($TrgType=~/^STDEXE$/o) {
+			if (&main::IsWideCharMain()) {
+				PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\$Bld\\\\\$_\"\)", @oe_exe_libs_wchar);
+			}
+			else {
+				PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\$Bld\\\\\$_\"\)", @oe_exe_libs);
+			}
+		}
+
+        my $StaticRTLib = $RVCT20 ? "usrt20" : "usrt${RVCTVersion}" ;
+        # use ksrt for system code and usrt for user ARM code
+        $StaticRTLib = "ksrt${RVCTVersion}" if ($SystemTrg);
+        &main::Output(
+	        " \\\n\t",
+		&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$StaticRTLib\.lib")
+		) unless ($Trg =~ /(U|K)SRT/i || ($BasicTrgType=~/^LIB$/o));
+
+	unless ($ArmRT || ($BasicTrgType=~/^LIB$/o)) {
+	    my $TargLib = "$ExportLibrary.lib";
+		$TargLib =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	    unless ($SystemTrg) {
+			foreach (@RTLibList) {
+				&main::Output(
+					" \\\n\t",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$_")
+				) unless ($_ =~ /$TargLib/i);
+			}
+	    }
+	}
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\$_\"\)", @ArmLibList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+   	&main::Output(
+ 		"\n# ADDITIONAL LINKER OPTIONS",
+ 		"\nUSERLDFLAGS = ",
+ 		&main::LinkerOption("ARMCC"),
+  		"\n\n"
+  	);
+	
+	&main::Output(
+		"VTBLEXPORTS$Bld="
+	);
+        my $vtobj = quotemeta("(VtblExports.o)");
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_$vtobj\"\)", @LibList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my $objectFiles = "";
+
+	my $bldPath =	&main::BldPath;
+	my $replacement;
+# If LOCAL_BUILD_PATH is set replace the \epoc32\build with local setting
+	if ( defined( $ENV{LOCAL_BUILD_PATH} ) )  {
+		$replacement = 	$ENV{"LOCAL_BUILD_PATH"};
+		my $epocroot=$ENV{"EPOCROOT"};
+		my $match = "\Q${epocroot}\EEPOC32\\\\BUILD";
+		$bldPath =~ s/${match}/${replacement}/;
+	}
+#	Must add StringTable obj files first to preserve Evalid results consistency.
+	foreach my $item (@StringTables) {
+		$objectFiles .= $bldPath.$$item{BaseTrg}.".o\n" if !($$item{Hdronly});
+	}
+
+        &main::Output(
+	        "OBJECTS$Bld="
+	);
+        foreach (@SrcList) {
+	    	my $BaseSrc = &main::Path_Split('Base', $_);
+	    	my $Ext = &main::Path_Split('Ext', $_);
+		if ($Ext =~ /cia/i) {
+		    $BaseSrc = "$BaseSrc\_";
+		}
+
+	        &main::Output(
+		        " \\\n\t",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+		      );
+
+#	Only add if not already added from @StringTables
+	my $objectFile = $bldPath.$BaseSrc.".o\n";
+	$objectFile=~ s/\\/\\\\/g;    # escape the '\'
+	if ($objectFiles !~ m/$objectFile/i){
+		$objectFiles .= &main::BldPath.$BaseSrc.".o\n";
+	}
+
+
+	}
+        &main::Output(
+	        "\n",
+		"\n"
+	);
+
+
+	# Create "via" file containing all object files in order to reduce
+	# command line lengths in pertinent calls
+	my $objectsViaFile = &main::CommandFile();	
+	&main::CreateExtraFile($objectsViaFile, $objectFiles);
+	
+
+        if ($BasicTrgType=~/^LIB$/o) {
+	        &main::Output(
+		      &Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"),
+		      " : \$(OBJECTS$Bld)"
+		);
+        } else {
+	        &main::Output(
+		      &Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ",
+		      &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.in")
+	        );
+        }
+
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			" ", &Generic_Quote($DefFile)
+		);
+	}
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::Output(
+			" ", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$FirstLib")
+		);
+	}
+	&main::Output(
+		" \$(LIBS$Bld)"
+	);
+
+#	generate an export object from the ordered .DEF file
+        if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+#       	make the .exp file a dependency for targets that have exports		
+		&main::Output(" ", &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.exp"), "\n");
+		if (&main::ExportUnfrozen) {
+		    &main::Output(
+			"\tdef2dll.bat --path=\$(EPOCBLD$Bld) \\\n\t\t--bldpath=\$(EPOCBLD$Bld) \\\n\t\t--export=$ExportLibrary \\\n\t\t--import=$ExportLibrary\\\n",
+			"\t\t--deffile=\$(EPOCBLD$Bld)\\$ExportLibrary.def \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking $symNameLkupOpt\n",
+		    );
+		    &main::Output(
+		        "\n",
+		        "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" ",
+		        "\"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\"",
+		        "\n"
+		    );
+		    if ($ExtraExportLibrary) {
+			&main::Output(
+			    "\n",
+			    "\tcopy \"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\" ",
+			    "\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib\"",
+			    "\n"
+			);
+		    }			    
+		    #if elf2e32.exe(postlinker) exists, then generate .dso(which will be used by ABIV2 platforms)
+		    if ($IsExistELF2E32EXE) {
+			    &main::Output(
+				    "\n",
+				    "\telf2e32 --definput=\"\$(EPOCBLD$Bld)\\$ExportLibrary.def\" --dso=",
+				    "\$(EPOCLIB)\\LIB\\$ExportLibrary.dso --linkas=$LinkAs\n"
+			    );
+			    if ($ExtraExportLibrary) {
+				    &main::Output(
+					    "\n",
+					    "\tcopy \"\$(EPOCLIB)\\LIB\\$ExportLibrary.dso\" ",
+					    "\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso\"",
+					    "\n"
+				    );
+			    }		
+		    }		
+	        }
+	} elsif($NamedSymLkup){
+#		For an EXE, generate the .exp to accomodate 0th ordinal
+		&main::Output(" ", &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.exp"), "\n");
+	}
+	else {
+	    &main::Output("\n");
+	}
+
+#       get rid of any -symbols produced .map file
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+	        &main::Output(
+			"\t-\$(ERASE) \"\$(EPOCTRG$Bld)\\$Trg.map\" \n"
+		);	
+	}
+#		Generate the dependency info - This is required to put the libraries in the same order
+#		as mentioned in mmp.
+		if($NamedSymLkup) {
+			&main::Output(
+			"\tperl -S deputil.pl $InterWorking --path=\$(EPOCBLD$Bld) \\\n",
+			 "\t\t--out=$ExportLibrary \\\n",
+			 "\t\t--libpath=\$(EPOCLIB)\\LIB \\\n",
+			 "\t\t\$(LIBS$Bld)\n",
+			);
+		}
+		my $AbsentSubst = '';
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+	        my $datalinkbase = "0x400000";
+	        $datalinkbase = &main::DataLinkAddress if (&main::DataLinkAddress);
+
+#               make sure the linker feedback file is writable if it exists.
+		my $lfbfile = LinkerFeedBackFile();
+		&main::Output(
+			"\t\@if exist $lfbfile attrib -r $lfbfile\n"
+			) if $useLinkerFeedBack;
+
+		my $lfboption = LinkerFeedBackOption();
+
+	        &main::Output(
+		        "\t$Link $linkerDebugOpt ${oP}shl ${oP}reloc ${oP}split ${oP}rw-base $datalinkbase  \\\n\t\t$lfboption${oP}noscanlib $PlatOpt{Ld}\\\n"
+			);
+			my $EntrySymbol;
+			if ($BasicTrgType=~/^DLL$/o) {
+				$EntrySymbol = '_E32Dll';
+			}
+			elsif ($BasicTrgType=~/^EXE$/o) {
+				$EntrySymbol = '_E32Startup';
+			}
+			if ($EntrySymbol) {
+				$AbsentSubst = " -absent $EntrySymbol";
+			}
+	        if ($BasicTrgType=~/^DLL$/o) {
+	            # get the right object file for the entry point
+	            my $ObjFile = "UC_DLL_.o";
+	            if ($FirstLib =~ /EDEV/i) {
+		            $ObjFile = "D_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EKLL/i) {
+		            $ObjFile = "L_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EEXT/i) {
+		            $ObjFile = "X_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EVAR/i) {
+		            $ObjFile = "V_ENTRY_.o";
+	            }
+	            &main::Output(
+				    "\t\t${oP}entry _E32Dll \$(EPOCSTATLINK$Bld)\\$FirstLib($ObjFile) \$(EPOCSTATLINK$Bld)\\$FirstLib \\\n",
+				    "\t\t\$(EPOCBLD$Bld)\\$ExportLibrary.exp \\\n"
+				);
+	        } elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o) {
+			    # get the right object file for the entry point
+			    my $ObjFile = "UC_EXE_.o" ;
+			    if ($FirstLib =~ /KC_EXE/i) {
+					$ObjFile = "K_ENTRY_.o";
+			    }
+				# If building user-side under RVCT2.0.x, use 2.0.1 static library	
+				if ($RVCT20) { 
+					if ($ObjFile =~/UC_EXE_.o/i) { 
+						$FirstLib = "EEXE20.LIB"; 
+					} 
+				} 
+			    
+			    &main::Output( "\t\t${oP}entry _E32Startup \$(EPOCSTATLINK$Bld)\\$FirstLib($ObjFile) \$(EPOCSTATLINK$Bld)\\$FirstLib \\\n" );
+			    if ($TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o || $NamedSymLkup) {
+					&main::Output( "\t\t\$(EPOCBLD$Bld)\\$ExportLibrary.exp \\\n" );
+			    }
+			}
+			if($NamedSymLkup) {
+				&main::Output(
+				"\t\t--edit \"\$(EPOCBLD$Bld)\\$ExportLibrary.dep\" \\\n"
+				);
+			}
+	        &main::Output(
+		        "\t\t-o \"\$(EPOCBLD$Bld)\\$Trg\" \\\n",
+		        "\t\t${oP}symbols ${oP}list \"\$(EPOCTRG$Bld)\\$Trg.map\" \\\n",
+				"\t\t\$(EPOCBLD$Bld)\\$BaseTrg.in \\\n"
+			);
+	        &main::Output(
+		        "\t\t\$(LIBS$Bld) \\\n",
+				"\t\t\$(VTBLEXPORTS$Bld) \$(USERLDFLAGS) \n"
+			);
+
+	        if(&main::DebugSwitchUsed() ){
+				if(&main::SymbolicDebugEnabled() ) {
+				&main::Output(
+					"\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+					);
+				}
+			}
+	        elsif ($Bld=~/^UDEB$/o) {
+	               &main::Output(
+			       "\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+		       );
+	        }
+		
+		if (&main::CompressTarget) {
+		    &main::Output(
+			    "\telftran $PlatOpt{Elftran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", " -nocompress "
+				 );
+		    
+		}
+		else {
+			if(&main::CompressTargetMode==NOCOMPRESSIONMETHOD){
+				&main::Output(
+					"\telftran $PlatOpt{Elftran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " "
+				);
+			}
+			elsif(&main::CompressTargetMode==INFLATECOMPRESSIONMETHOD){
+				&main::Output(
+				"\telftran $PlatOpt{Elftran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod deflate"
+				);
+			}
+			elsif(&main::CompressTargetMode==BYTEPAIRCOMPRESSIONMETHOD){
+				&main::Output(
+					"\telftran $PlatOpt{Elftran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod bytepair"
+				);
+			}
+		}
+
+		if (&main::IsDebuggable eq DEBUGGABLE) {
+ 			&main::Output(
+ 				' -debuggable '
+ 			);
+ 		}
+
+		if (&main::SmpSafe) {
+ 			&main::Output(
+ 				' -smpsafe'
+ 			);
+ 		}
+
+		if (&main::IsDebuggable eq DEBUGGABLE_UDEBONLY) {		
+			if ($Bld=~/^UDEB$/o) {
+				&main::Output(
+				' -debuggable '
+				);
+			}
+		}
+		
+		# change - exexps are allowed data, but they look like dlls to elftran....
+		if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			&main::Output(
+				' -allow'
+			);
+		}
+		if (not &main::CallDllEntryPoints ) {
+			&main::Output(
+				' -nocall'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' -datalinkaddress ',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' -fixed'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' -heap ',$HeapSize{Min},' ',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' -priority ',&main::ProcessPriority
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' -stack ',&main::StackSize
+			);
+		}
+
+		if (&main::CodePagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -codepaging unpaged'
+			);
+		}
+		elsif (&main::CodePagingTargetMode == PAGED) {
+			&main::Output(
+				' -codepaging paged'
+			);
+		}
+
+		if (&main::DataPagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -datapaging unpaged'
+			);
+		}
+		elsif (&main::DataPagingTargetMode == PAGED) {
+			&main::Output(
+				' -datapaging paged'
+			);
+		}
+
+		&main::Output(
+			"\\\n\t\t"
+		);
+
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" -uid$i $_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' -vid ',&main::VendorId
+			);
+		}
+		&main::Output(
+			"\\\n\t\t"
+		);
+		&main::Output(
+			' -fpu ',$floatingpointmodel
+		);
+		&main::Output(
+			' -capability ',&main::Capability
+		);
+		if($NamedSymLkup) {
+			&main::Output(
+				' -sym_name_lkup'
+			);
+		}
+		&main::Output(
+			"\\\n\t\t"
+		);
+		&main::Output(
+			" \"\$(EPOCBLD$Bld)\\$Trg\""
+		);
+		&main::Output(
+			"\\\n\t\t"
+		);
+		&main::Output(
+			" \"\$\@\" \n"
+		);
+		&main::Output(
+			"\n"
+		);
+
+         }
+         elsif ($BasicTrgType=~/^LIB$/o) {
+	        &main::Output(
+		        "\tarmar ${oP}create \$(EPOCSTATLINK$Bld)\\$Trg ${oP}via $objectsViaFile\n"
+		);
+         }
+
+         &main::Output(
+		 "\n"
+	 );
+	 
+#	add static lib into the object via file
+	my $libViaFiles=$objectFiles;
+	if (@StatLibList) {
+		foreach (@StatLibList) {
+			$libViaFiles.= &main::RelPath."$_ \n";
+		}
+		&main::CreateExtraFile($objectsViaFile, $libViaFiles);
+	}
+	
+    # TARGET *.IN
+    #------------
+	 
+    &main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.in"), ": \$(OBJECTS$Bld)\n",
+ 	    "\t$Link $linkerDebugOpt ${oP}partial \\\n",
+	    "\t\t-o \$\@ \\\n",
+	    "\t\t${oP}via $objectsViaFile\n\n",
+    );
+    
+
+#   reorder the .DEF file taking frozen exports into account if there are any
+    if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o || $NamedSymLkup) {
+
+	    # TARGET *.EXP
+	    #------------
+	    &main::Output(
+		    &Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.exp"), ": \$(EPOCBLD$Bld)\\$BaseTrg.in"
+	    );
+
+# if project is frozen, makedef (and hence the .exp file) are dependent upon it
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+			    &main::Output(" $DefFile");
+			}
+		}
+
+	    &main::Output(
+		"\n\tperl -S elf2inf.pl -o \$(EPOCBLD$Bld)\\$ExportLibrary.inf \\\n", 
+		"\t\t\$\<",
+		"\n\tperl -S makedef.pl $AbsentSubst -Inf \$(EPOCBLD$Bld)\\$ExportLibrary.inf \\\n"
+	    );
+    	if (!$DefFile || $NoExportLibrary) {    			
+    		&main::Output( "\t\t-ignore_unfrozen_noncallable \\\n" );
+    	}
+	if (SysTrg()) {
+    		&main::Output( "\t\t-SystemTargetType \\\n" );
+    	}
+    		
+	    if (-e $DefFile) {	# effectively "if project frozen ..."
+	            &main::Output(
+			"\t\t-Frzfile \"$DefFile\" \\\n"
+		    );
+	    }
+
+		if($NamedSymLkup && !$DefFile){
+#		For an EXE with named lookup, suppress the 'unfrozen exports' makedef warnings.
+			&main::Output(
+			"\t\t-ignore_unfrozen_exports \\\n",
+			);
+		}
+
+	    # freeze ordinals, a maximum of 2, for polymorphic dlls
+	    my $Ordinal;
+	    my $Num=1;
+	    foreach $Ordinal (&main::Exports) {
+	            &main::Output( "\t\t-$Num $Ordinal \\\n" );
+		    $Num++;
+	    }
+	    
+	    my $theDefFile = "\$(EPOCBLD$Bld)\\$ExportLibrary.def";
+	    $theDefFile = $DefFile if (-e $DefFile && !&main::ExportUnfrozen);
+	    &main::Output(
+		"\t\t\"\$(EPOCBLD$Bld)\\$ExportLibrary.def\"\n",
+		"\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.def\" \"\$(EPOCBLD)\\$ExportLibrary.def\"\n",
+		"\tdef2dll.bat $AbsentSubst \\\n\t\t--path=\$(EPOCBLD$Bld) \\\n\t\t--bldpath=\$(EPOCBLD$Bld) \\\n\t\t--export=$ExportLibrary \\\n",
+		"\t\t--deffile=$theDefFile \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking $symNameLkupOpt\n"
+	    );
+    }
+
+    &main::Output( "\n" );
+}
+
+# Set to 1 if multifile compilation wanted
+my $domultifile = 0;
+
+sub DoMultiFile () {
+        return $ENV{RVCTMultiFile} if (defined $ENV{RVCTMultiFile});
+	return $domultifile;
+}
+
+my %CompilationGroups = ();
+
+sub InitMultiFileCompilation() {
+#	Do preparatory work for multifile compilation
+	my $SourceStructRef=&main::SourceStructRef;
+
+#	We sort the source files by path and extension. These form natural groups to compile together.
+	my %PathToSourceMap = ();
+	foreach my $SourceRef (@$SourceStructRef) {
+		my $SrcFile = $$SourceRef{CurFile};
+		my $Ext = &main::Path_Split('Ext', $SrcFile);
+	        push @{$PathToSourceMap{$$SourceRef{SrcPath}}{$Ext}}, $SrcFile;
+	}
+
+#	Now we split each group into sets of 10. 
+	foreach my $SrcPath (keys %PathToSourceMap) {
+		foreach my $Ext (keys %{$PathToSourceMap{$SrcPath}}) {
+			my @FileList;
+			my @ObjectList;
+			my @SourceList;
+			my $NumToGo = 10;
+			foreach my $File (@{$PathToSourceMap{$SrcPath}{$Ext}}) {
+				my $base = &main::Path_Split('Base', $File);
+				my $cia = ($Ext =~ /cia/i);
+				$base .= "_" if $cia;
+				push @FileList, $File;
+				push @ObjectList, "$base.o";
+#				this gives us our source files xxx				
+				push @SourceList, $cia ? "$base.cpp" : "$SrcPath$base$Ext";
+				$NumToGo--;
+				unless ($NumToGo) {
+#				       Use the last file as the key. This means e.g that all the dependency
+#				       info will have been generated for the earlier files in the list
+				       push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+       				       push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+				       $NumToGo = 10;
+				       undef @FileList;
+				       undef @ObjectList;
+				       undef @SourceList;
+				}
+			}
+			push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+			push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+		}
+	}
+
+#	debug print out	
+	if (0) {
+	foreach my $keyfile (keys %CompilationGroups) {
+		print "$keyfile :\n";
+		foreach my $class (keys %{$CompilationGroups{$keyfile}}) {
+			print "\t$class:\n\t\t";
+			print join " ", @{$CompilationGroups{$keyfile}{$class}}, "\n";
+		}
+	}
+	}
+			
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+
+	InitMultiFileCompilation() if DoMultiFile();
+
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+	&Generic_AifBld;
+}
+
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @DepList=&main::DepList;
+	return if (@DepList == 0);
+
+	my @BldList=&main::BldList;	
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	
+	my $BaseObj=$BaseSrc;
+	my $cia = 0;
+	if ($ExtSrc =~ /cia/i ) {
+		$cia = 1;
+		$BaseObj .= '_';
+	}
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.pre"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseObj.cpp"), " ",
+		) if $cia;
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseObj.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my @DepList=&main::DepList;
+	return if (@DepList == 0);
+	
+	my $Bld=&main::Bld;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	
+	my $BaseObj=$BaseSrc;
+	my $cia = 0;
+	if ($ExtSrc =~ /cia/i ) {
+		$cia = 1;
+		$BaseObj .= '_';
+	}
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.cpp"), " ",
+	) if $cia;
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.o"), " :",
+	);
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+my $curdrive = "x";
+
+sub quoted_path
+    {
+    my ($arg) = @_;
+    return "\"$arg\"" if ($arg !~ /^\\[^\\]/);	# not an absolute path
+    if ($curdrive eq "x")
+		{
+		$curdrive="";
+		$curdrive=$1 if (cwd =~ /^(.:)/);	
+		}
+    return "\"$curdrive$arg\"";
+    }
+
+sub PMPrefixFile 
+{ 
+    my $IncPath = &main::EPOCIncPath;
+    
+    return quoted_path(&Generic_Quote("$IncPath"."rvct\\rvct.h"));
+}
+
+
+my $preinclude =   "--preinclude \$(EPOCINC)\\rvct\\rvct.h";
+my $edg_preinclude = "-I \$(EPOCINC)\\RVCT${RVCTVersion} --preinclude edg_rvct${RVCTVersion}.h";
+
+sub SelectLangOptions {
+	my ($Ext) = @_;
+	if ($Ext=~/^.cpp$/) {
+		# In case of function call logger, the preinclude file is passed to the function call logger
+		# hence it is not required to pass the same file to the compiler.
+		return "--cpp "	if ($Function_Call_Logger);
+		return "--cpp $preinclude ";
+	}
+	if ($Ext=~/^.cia$/) {
+		return "--cpp ";
+	}
+	if ($Ext=~/^.c$/) {
+		if($CompilerOption =~/--cpp/) {
+			#Function Call Logger
+			return "--cpp " if ($Function_Call_Logger);
+			return "--cpp $preinclude ";
+		}
+		else {
+			#Function Call Logger
+			return "--c90 " if ($Function_Call_Logger);
+			return "--c90 $preinclude ";
+		}
+	}
+	# To support .cc, .cxx, .c++ file extensions for Open Environment
+	elsif ($Ext=~/^(.cc|.cxx|.c\+\+)$/) {
+		#Function Call Logger
+		return "--cpp " if ($Function_Call_Logger);
+		return "--cpp $preinclude ";
+	}
+	return '';
+}
+
+sub PMEndSrcBld {
+#       Generate multifile compilation stuff if needed.
+        if (DoMultiFile()) {
+	       MultiFileEndSrcBld();
+	       return;
+	}
+
+	my $ABI=&main::ABI;
+	my $Plat=&main::Plat;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=lc &main::Src;	
+	my $SrcPath=&main::Path_Chop(&main::SrcPath);
+	my $Ext = &main::Path_Split('Ext', $Src);	
+	my $BaseTrg=&main::BaseTrg;
+	my $BldPath = &main::BldPath;
+	$Src = ucfirst $Src if ($Ext !~ /\.(cpp|c)$/);		
+	my $LangOptions = &SelectLangOptions($Ext);
+	# support for auto 'translated' ASM 
+	my $AsmFilep = $AsmFiles{$Src};
+
+	# Logger Ouput filename 
+	my $Logger_Output = lc ($BaseSrc) . ".int.cpp";
+	my $LstExt ;
+	if($Plat =~ /^(ARMV[6-9])/i){
+		$LstExt = $1 ;	
+	}
+	else{
+		$LstExt = $ABI;
+	}
+	
+	my $lfboption = LinkerFeedBackOption();
+
+	#Function Call Logger
+	my $FC_Logger_Option=" --wchar_t_keyword --microsoft_version=1300 --dictionary_file_name $BldPath$BaseTrg.txt --diag_suppress 66,161,611,654,815,830,997,1152,1300,1390";
+
+	if ($AsmFilep || $Ext =~ /cia/i) {
+		&main::Output(
+# compile the translated, preprocessed source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\@echo $Src\n",
+			"\t\$(ARMCC$Bld) $lfboption$LangOptions -J $SrcPath \$(INCDIR) -o \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp\n",
+			"\n",
+# rule to translate the preprocessed source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+			"\ttranasm.bat -n -s -o=\$\@ \$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+			"\n",
+# rule to preprocess the source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+			&Generic_Quote("$SrcPath\\$Src"), "\n",
+  			"\t\$(ARMCC$Bld) -D__CIA__ -E $preinclude $LangOptions -J $SrcPath \$(INCDIR) $SrcPath\\$Src -o \$\@ \n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc\_.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp\n",
+			"\n"
+			);
+	} else {
+		#If Function Call logging is enabled, add call to function call logger
+		if ($Function_Call_Logger) {
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"),
+				" : ",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$Logger_Output"),
+				"\n",
+				"\t\@echo $Logger_Output\n",
+				"\t\$(ARMCC$Bld) $lfboption$LangOptions -J $SrcPath \$(INCDIR) -o \$\@ \$(EPOCBLD$Bld)\\$Logger_Output\n",
+				"\n",
+# generate an assembly listing target too
+				"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+				"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc.$LstExt.lst"),
+				"\n",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+				&Generic_Quote("$SrcPath\\$Logger_Output"), "\n",
+				"\t\$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ \$(EPOCBLD$Bld)\\$Logger_Output \n",
+				"\n"
+			);
+
+			#Call to Function Call Logger
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$Logger_Output"), " : ",
+				&Generic_Quote("$SrcPath\\$Src"),
+				"\n",
+				"\t \@echo $Logger_Output\n",
+				"\t \$(FCLOGGER$Bld) $lfboption$edg_preinclude \\\n",
+			    "\t -I $SrcPath  \\\n",
+				"\t \$(INCDIR_FCLOGGER) $FC_Logger_Option \\\n",
+			    "\t --gen_c_file_name \$\@ $SrcPath\\$Src\n",
+				"\n\n",
+			);
+		}
+		else {			
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+				&Generic_Quote("$SrcPath\\$Src"), "\n",
+				"\t\@echo $Src\n",
+				"\t\$(ARMCC$Bld) $lfboption$LangOptions -J $SrcPath \$(INCDIR) -o \$\@ $SrcPath\\$Src\n",
+				"\n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath\\$Src"), "\n",
+			"\t\$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ $SrcPath\\$Src \n",
+			"\n"
+			);
+			#Compiler wrapper support starts
+			if($IsCompilerWrapperOption)
+			{
+				my $Platcmpwrap=&main::Plat;
+				&main::Output(
+					"COMPWRAP$Bld$BaseSrc : ",
+					&Generic_Quote("$SrcPath\\$Src"), "\n",
+					"\t\@echo Analysing $Src\n",
+					"\t\$(COMPWRAP) \$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ $SrcPath\\$Src \n",
+					"\n"
+				);
+			}
+			#Compiler wrapper support ends
+			
+		}
+	}
+}
+
+my $MFVarN = 0;
+sub MultiFileEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+        my $KeyFile = &main::Src;
+	my $Src=ucfirst lc $KeyFile;
+	my $SrcPath=&main::Path_Chop(&main::SrcPath);
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $LangOptions = &SelectLangOptions($Ext);
+	# support for auto 'translated' ASM 
+	my $AsmFilep = $AsmFiles{$Src};
+
+	my $lfboption = LinkerFeedBackOption();
+
+	if ($AsmFilep || $Ext =~ /cia/i) {
+		if ($CompilationGroups{$KeyFile}) {
+# compile the translated, preprocessed source
+		       &main::Output( "OBJECTS$MFVarN = ");
+		       foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+			       &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " "); 
+		       }
+       		       &main::Output( "\n\n");
+		       &main::Output( "SOURCES$MFVarN = ");
+		       foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+			       &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$src", " "));
+		       }
+       		       &main::Output( "\n\n");
+		       &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+		       &main::Output(
+				     "\t\@echo Compiling \$(SOURCES$MFVarN)\n", 
+				     "\t\$(ARMCC$Bld) -J $SrcPath \$(INCDIR) $lfboption\\\n",
+				     "\t\t$LangOptions -o \$\@ --multifile \$(SOURCES$MFVarN)"
+		      );
+       		       &main::Output( "\n\n");
+		       $MFVarN++;
+		}
+		&main::Output(
+# rule to translate the preprocessed source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+			"\ttranasm.bat -n -s -o=\$\@ \$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+			"\n",
+# rule to preprocess the source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+			&Generic_Quote("$SrcPath\\$Src"), "\n",
+  			"\t\$(ARMCC$Bld) -D__CIA__ -E $preinclude $LangOptions -J $SrcPath \$(INCDIR) $SrcPath\\$Src -o \$\@ \n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc\_.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp\n",
+			"\n"
+			);
+	} else {
+
+		if ($CompilationGroups{$KeyFile}) {
+#                      compile the source
+		       &main::Output( "OBJECTS$MFVarN = ");
+		       foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+			       &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " "); 
+		       }
+       		       &main::Output( "\n\n");
+		       &main::Output( "SOURCES$MFVarN = ");
+		       foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+			       &main::Output( &Generic_Quote("\\\n\t$src"), " ");
+		       }
+       		       &main::Output( "\n\n");
+		       &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+		       &main::Output(
+				     "\t\@echo Compiling \$(SOURCES$MFVarN)\n", 
+				     "\t\$(ARMCC$Bld) -J $SrcPath \$(INCDIR) $lfboption\\\n",
+				     "\t\t$LangOptions -o \$\@ --multifile \$(SOURCES$MFVarN)"
+		      );
+       		       &main::Output( "\n\n");
+		       $MFVarN++;
+		}
+#		generate an assembly listing target too
+		&main::Output(
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath\\$Src"), "\n",
+			"\t\$(ARMCC$Bld) $LangOptions -S -J $SrcPath \$(INCDIR) -o \$\@ $SrcPath\\$Src \n",
+			"\n"
+			);
+	}
+}
+
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+sub PMSupportsFeatureVariants
+	{
+	return 1;
+	}
+
+1;
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_bpabi.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2885 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# This package contains routines to handle Base Platform ABI (BPABI) Platforms.
+package Cl_bpabi;
+
+my @commonOptions;
+my @thumbOptions;
+my @armOptions;
+my @kernelOptions;
+my @invariantOptions;
+my @linkerOptions;
+my @archiverOptions;
+my @debugFormat;
+my $ArmIncDir;
+my @ArmLibList;
+
+my %configVariables;
+
+#Check if Function call Logger is enabled
+my $Function_Call_Logger=&main::IsFunctionCallLogging();
+
+# Get the information regarding supporting Compiler Wrapper Option
+my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+my $IsProxyWrapperOption=&main::ProxyWrapperOption();
+
+# takes an 'expression'  to evaluate with $_ bound to each of the
+# remaining args
+sub PrintList
+{
+    my $expr = shift @_;
+    foreach (@_) {
+	my $str = eval($expr);
+	&main::Output($str);
+    }
+}
+
+sub DepLinkList
+{
+    my $expr = shift @_;
+    my @arr;
+    foreach (@_) {
+	my $str = eval($expr);
+	push @arr, $str;
+    }
+    return @arr;
+}
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMPlatProcessMmp
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMStartSrc
+		PMAifBld
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+	PMPrefixFile
+	PMToolChainIncDir
+	PMSupportsFeatureVariants
+);
+
+use Cwd;
+
+# Armutl package does various ancillary things for armedg modules
+use Armutl;
+use BPABIutl;
+use E32Plat;
+use RVCT_plat2set;
+use gcce_plat2set;
+
+# This is the RVCT Version information required by Armutl package
+my $RVCTMajorVersion;
+my $RVCTMinorVersion;
+my $RVCTVersion;
+
+my $GCCEMajorVersion;
+my $GCCEMinorVersion;
+my $GCCEVersion;
+
+# The name of the build platform, e.g. ARMV6.
+my $PlatName = main::Plat();
+
+# The name of the root platform. This is useful if the plaform is derived using a
+# BSF file. If the current platform is not derived, $RootName will be the same as
+# $PlatName.
+my $RootName = E32Plat::Plat_Root($PlatName);
+
+
+# cl_generic package contains generic routines to handle bits of makefiles which are
+# common to all of the platforms. Currently it deals with AIF, MBM amd RSC files.
+use cl_generic;
+
+# E32env package contains information for makmake and associated e32tools perl programs
+# within the Epoc32 Environment
+use E32env;
+
+# Genutl package contains utility subroutines for MAKMAKE and associated scripts
+use Genutl;
+
+# Modload package is the runtime module-loading routine for loading e32tools modules into
+# 'main' module
+use Modload;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+
+use constant NON_DEBUGGABLE => 0;
+use constant DEBUGGABLE => 1;
+use constant DEBUGGABLE_UDEBONLY => 2;
+
+my %plat = &main::PlatRec();
+my $CustomizedARMV5Plat = 0;
+
+if (($plat{'CUSTOMIZES'}) && (($plat{'ROOTPLATNAME'} eq "ARMV5") || ($plat{'ROOTPLATNAME'} eq "ARMV5_ABIV2"))) {
+# The following flag is set to handle the exceptions related to ARMV5 toolchain.
+	$CustomizedARMV5Plat = 1;		
+}
+
+#this fucntion will be used for cw_ide platform to update the PlatName and reinitialize the hashtable
+sub getVariableForNewPlat
+{
+	$PlatName = main::Plat();	
+	undef(%configVariables);
+}
+sub PMHelp_Mmp {
+
+# Help Text for ARM Platform, lists out the MMP keywords used incase of ARM Compiler
+	if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+	{
+		return &Armutl_Help_Mmp;
+	}
+	else
+	{
+		return "";
+	}
+}
+
+my $ToolChainIncDir;
+my @ToolChainLibList;
+my $ArmRT = 0;
+my %AsmFiles = ();
+my %AsmDirs = ();
+my $NamedSymLkup = 0;
+my $InterWorking = '';
+
+sub PMPlatProcessMmp (@) {
+	&InitToolChain(@_);
+	$ToolChainIncDir = &GetToolChainIncDir;
+	&main::SetStdIncPaths($ToolChainIncDir);
+	@ToolChainLibList = &GetLibList;
+# Variable to check if the target forms part of the run time libraries, if it is so
+# shouldn't be linked against itself or other runtime libs
+	$ArmRT = &IsTargetRT;
+	my @AsmFileList = &GetToolChainAsmFileList;
+	foreach (@AsmFileList) { $AsmFiles{ucfirst lc $_} = 1; }
+}
+
+my $preinclude;
+
+my $Makecmd;
+
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $ABI=&main::ABI;
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DefFile=&main::DefFile;
+	my $EPOCPath=&main::EPOCPath;
+	my $LinkAs=&main::LinkAs;
+	my $LibPath=&main::LibPath.'LIB\\';
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+	push @MacroList, "__SYMBIAN_STDCPP_SUPPORT__" if ( StdCppTarget() );
+
+  	my $Plat=&main::Plat;
+  	my $Trg=&main::Trg;
+  	my $TrgType=&main::TrgType;
+  
+  # This horrible change (presumably to allow GCCE to work with edll.lib etc.
+  # produced by RVCT breaks SMP (and also breaks any optimized platform
+  # builds such as ARMV6, and also Thumb2 builds).
+  # Work round for now by conditioning the horrible change on the absence of
+  # SMP in the platform definition.
+  	my %PlatHash = &main::PlatRec();
+  	unless ($PlatHash{SMP}) {
+		my $myStatLinkPath;
+		$myStatLinkPath = "$E32env::Data{LinkPath}";
+		$myStatLinkPath .= "ARMV5";
+		&main::SetStatLinkPath($myStatLinkPath);
+	}
+
+	my $VariantFile=&ChangeSlash(&main::VariantFile);
+
+	my @UidList=&main::UidList;
+    my $SystemTrg = &main::SystemTrg;
+    my $ExportLibrary=&main::ExportLibrary;
+    my $NoExportLibrary=&main::NoExportLibrary;
+    # N.B. should get better way to detect kernel probably!!
+    $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+
+    # N.B. should get better way to detect this
+    $SystemTrg = 1 if ($Trg =~ /KSRT/i);
+
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+	# Required for .lib generation
+	$InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+
+	# need to add config file for makmake invocation
+	my $config_file = BPABIutl_Config_Path($PlatName);
+
+	&main::Output("\n", "include $config_file\n", "\n");
+	&Generic_Header(0,$Makecmd, 1);	# define standard things using absolute paths and request that a make function
+									# is provided to provide optional conversion of absolute paths to Unix slashes
+
+# modified start: makefile improvement 
+	&main::Output(
+		"CHECKVMAP : CHECKVMAPUDEB CHECKVMAPUREL",
+		"\n"
+	);
+# modified end: makefile improvement 
+	if ($Makecmd eq "nmake") {
+		&main::Output(
+			"\n",
+  			"PATH=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(PATH)\n",
+			"\n"
+		);
+	}
+	else {
+		&main::Output(
+			"\n",
+			"# must set both PATH and Path to make it work correctly\n",
+  			"Path:=",&main::Path_Drive,$EPOCPath,"gcc\$(PBUILDPID)\\bin;\$(Path)\n",
+			"PATH:=\$(Path)\n",
+			"\n"
+		);
+	}
+
+	if ($BasicTrgType=~/^(DLL|EXE)/o)
+	{
+
+		my $OtherLinkerOpts;
+		my $toolchain = getConfigVariable('COMPILER_PLAT');
+		
+		# In case of GCCE releases, '--map' option was supported only from build 3.4.3 Q1C release
+		# Hence this is a special case, where GCCE platform is checked to ensure that the --map option
+		# is accepted in the correct relase. Even if the option is provided in the config file, it will be
+		# ignored for versions before 3.4.3 Q1C 2005 release.
+
+		# Check to be included in the Makefile, so that the map filename is provided as input only
+		# when the MAP option is supplied
+
+		&main::Output("ifdef LINKER_SYMBOLS_MAP_OPTION\n");
+		foreach (@BldList)
+			{
+			&main::Output("\t$_"."_MAP_FILE=\"\$(EPOCTRG$_)\\".&main::Trg($_).".map\"\n");
+			}
+		&main::Output("else\n");
+		foreach (@BldList)
+			{
+			&main::Output("\t$_"."_MAP_FILE=\n");
+			}
+		&main::Output("endif\n");
+
+		#	In some compiler toolchains, the start address may be required to be provided using the appropriate option.
+		#	Incase if the option is provided by the toolchain, then pass we need to pass in the start address.
+		&main::Output(
+			"\nifdef CODE_SEGMENT_START\n",
+			"\tCODE_SEGMENT_START += 0x8000 \n",
+			"endif\n",
+		);
+
+
+		# In some compiler toolchain, the symboled archives may have to be listed
+		&main::Output(
+			"ifdef START_GROUP_SYMBOL\n",
+			"\tEEXE_OBJECT=\$(START_GROUP_SYMBOL)UC_EXE_.o\$(END_GROUP_SYMBOL)\n",
+			"\tEDLL_OBJECT=\$(START_GROUP_SYMBOL)UC_DLL_.o\$(END_GROUP_SYMBOL)\n",
+			"\tDENTRY_OBJECT=\$(START_GROUP_SYMBOL)D_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+			"\tLENTRY_OBJECT=\$(START_GROUP_SYMBOL)L_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+			"\tXENTRY_OBJECT=\$(START_GROUP_SYMBOL)X_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+			"\tVENTRY_OBJECT=\$(START_GROUP_SYMBOL)V_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+			"\tKENTRY_OBJECT=\$(START_GROUP_SYMBOL)K_ENTRY_.o\$(END_GROUP_SYMBOL)\n",
+			"endif\n\n"
+		);
+		
+		# put the extra linker options from MMP file into the linker flags
+		$OtherLinkerOpts=&main::LinkerOption($toolchain);
+		
+		if($OtherLinkerOpts) {
+			&main::Output(
+				"\n# ADDITIONAL LINKER OPTIONS\n",
+				"ifdef SYMBIAN_UREL_LINK_FLAGS\n",
+				"\tSYMBIAN_UREL_LINK_FLAGS += $OtherLinkerOpts \n",
+				"else\n",
+				"\tSYMBIAN_UREL_LINK_FLAGS = $OtherLinkerOpts \n",
+				"endif\n",
+				"ifdef SYMBIAN_UDEB_LINK_FLAGS\n",
+				"\tSYMBIAN_UDEB_LINK_FLAGS += $OtherLinkerOpts \n",
+				"else\n",
+				"\tSYMBIAN_UDEB_LINK_FLAGS = $OtherLinkerOpts \n",
+				"endif\n\n"
+			);
+		}
+	}
+
+	&main::Output(
+		"INCDIR ="
+	);
+
+	PrintList("\"  \\\$(INCLUDE_OPTION) \$_\"", @ChopUserIncPaths);
+	PrintList("\" \\\$(INCLUDE_OPTION) \$_\"", @ChopSysIncPaths);
+
+	$ToolchainIncDir = &GetToolChainIncDir;
+
+	if($ToolchainIncDir ne '')
+	{
+		&main::Output(
+			" \$(INCLUDE_OPTION) ","\"$ToolchainIncDir\"");
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	#Function call logger takes -I as include option
+	my $FCLogger_inc_option = getConfigVariable('FC_LOGGER_INCLUDE_OPTION'); 
+	if ($Function_Call_Logger)	{
+		&main::Output(
+			"INCDIR_FCLOGGER  ="
+		);
+		PrintList("\" $FCLogger_inc_option \$_\"", @ChopUserIncPaths);
+		PrintList("\" $FCLogger_inc_option \$_\"", @ChopSysIncPaths);
+		$ToolchainIncDir = &GetToolChainIncDir;
+		if($ToolchainIncDir ne '')	{
+			&main::Output(
+				" $FCLogger_inc_option \"$ToolchainIncDir\""
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+  	# Set control warnings and errors options for building Standard C++ application
+  	if( StdCppTarget() ) {
+  		&main::Output("CC_WARNINGS_CONTROL_OPTION=\$(CC_STDCPP_WARNINGS_CONTROL_OPTION)","\n");
+  		&main::Output("CC_ERRORS_CONTROL_OPTION=\$(CC_STDCPP_ERRORS_CONTROL_OPTION)","\n");
+  		&main::Output("\n",	"\n");
+  	}
+  	
+	Read_BSF_Options() if ($plat{'CUSTOMIZES'});
+
+	my $kernelOption=0;
+	my $buildAsArmOption=0;
+	my $thumbOption=0;
+
+	if (SysTrg())
+	{
+		$kernelOption=1;
+	}
+	elsif (main::BuildAsARM() or ($ABI eq 'ARMV4'))
+	{
+		$buildAsArmOption=1;
+	}
+	else
+	{
+		$thumbOption=1;
+	}
+
+	my $OtherOpts = undef;	
+
+	my $toolchain = getConfigVariable('COMPILER_PLAT');
+
+	$OtherOpts = &main::CompilerOption($toolchain);
+
+	
+	if($kernelOption==1)
+	{
+		if(@kernelOptions) {
+# Kernel options as read from BSF file (KERNEL_OPTIONS keyword)
+			Set_BSF_Options('KERNEL_OPTIONS',\@kernelOptions);
+		}
+		$OtherOpts .= " \$(KERNEL_OPTIONS) ";
+	}
+	elsif($buildAsArmOption==1)
+	{	
+		if(@armOptions) {
+# Arm options as read from BSF file (ARM_OPTIONS keyword)
+			Set_BSF_Options('ARM_OPTIONS',\@armOptions);
+		}
+		$OtherOpts .= " \$(ARM_OPTIONS) ";
+	}
+	elsif($thumbOption==1)
+	{
+		if(@thumbOptions) {
+# Thumb options as read from BSF file (THUMB_OPTIONS keyword)
+			Set_BSF_Options('THUMB_OPTIONS',\@thumbOptions);
+		}
+		$OtherOpts .= " \$(THUMB_OPTIONS) ";
+	}
+
+	if($thumbOption==1 || $buildAsArmOption==1 || $kernelOption ==1 )
+	{
+		if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i))
+		{
+			$OtherOpts .=	" \$(VFP2MODE_OPTION) ";
+		}
+		else
+		{
+			$OtherOpts .=	" \$(SOFTVFPMODE_OPTION) ";
+		}
+	}
+
+	if ($thumbOption==1)
+	{
+		$OtherOpts .= " \$(COMPILER_THUMB_DEFINES) ";
+	}
+
+	$OtherOpts .= " \$(COMPILER_INTERWORK_DEFINES) ";
+
+	# Options to export symbols by default, for OE
+	if($TrgType=~/^STDDLL$/o || $TrgType=~/^STDEXE$/o || $TrgType=~/^STDLIB$/o) {
+		$OtherOpts .= " \$(OE_OPTIONS) ";
+	}
+
+	if($OtherOpts)
+	{
+		&main::Output(
+			"OTHEROPTIONS=$OtherOpts",
+			"\n",
+			"CCFLAGS += \$(OTHEROPTIONS)",
+			"\n"
+		);
+	}
+
+	if(@invariantOptions) {
+# Invariant options as read from BSF file (INVARIANT_OPTIONS keyword)
+		Set_BSF_Options('INVARIANT_OPTIONS',\@invariantOptions);
+	}
+
+	if(@commonOptions) {
+# Common options as read from BSF file (COMMON_OPTIONS keyword)
+		Set_BSF_Options('COMMON_OPTIONS',\@commonOptions);
+	}
+	
+	if(@linkerOptions) {
+# Linker options as read from BSF file (LD_OPTIONS keyword)
+		Set_BSF_Options('LD_OPTIONS',\@linkerOptions);
+	}	
+
+	if ($BasicTrgType=~/^LIB$/o) {
+		if(@archiverOptions) {
+# Archiver options as read from BSF file (AR_OPTIONS keyword)
+		Set_BSF_Options('AR_OPTIONS',\@archiverOptions);
+		}
+	}		
+
+	if(@debugFormat) {
+		Set_BSF_Options('DEBUG_FORMAT',\@debugFormat);
+	}	
+
+	&main::Output(
+		"CCDEFS = \$(COMPILER_DEFINES) "
+	);
+
+	PrintList("\" -D\$_\"", @MacroList);
+
+	&main::Output(
+		" \$(PLATFORM_DEFINES) "
+	);
+
+	&main::Output(
+
+	);
+
+	if($kernelOption==1)
+	{
+		&main::Output(
+			"-D__KERNEL_MODE__ "
+		);
+	}
+
+	if($VariantFile){
+		#Function Call Logger
+		if ($Function_Call_Logger) {
+			#FC Logger accepts product include file without path
+			my $file=&main::Path_Split('File', &main::VariantFile);
+			&main::Output(
+				" -D\"__PRODUCT_INCLUDE__=\\\"${file}\\\"\""
+			);
+		}
+		else {
+			&main::Output(
+				" -D__PRODUCT_INCLUDE__=\\\"${VariantFile}\\\""
+			);
+		}
+	}
+
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	if ( $RootName =~ /^ARMV5$/ ) {
+		# Now we know that the platform is either ARMV5 or a platform derived from
+		# ARMV5 (BSF).
+	
+		# See if an environment variable overrides the default DWARF version for
+		# this platform.
+		
+		my $env_dwarf_key = "ABLD_${PlatName}_DWARF";
+		my $env_dwarf_val = $ENV{$env_dwarf_key};
+
+		if ($env_dwarf_val) {
+			main::FatalError("The value of $env_dwarf_key is invalid.") unless ($env_dwarf_val =~ /^[23]$/);
+			main::FatalError("We don't support DWARF-2 on ARMV7.") if ($PlatName =~ /^ARMV7/ && $env_dwarf_val == 2);
+
+			&main::Output( "DEBUG_FORMAT=\$(DEBUG_FORMAT_DWARF$env_dwarf_val)\n\n");
+		}
+	}
+
+
+	foreach (@BldList) {
+		&main::Output(
+			"CC$_ = ", $IsProxyWrapperOption ? "$ENV{ABLD_COMPWRAP} ":"", "\$(CC) "
+		);
+
+		# SYMBIAN_UDEB/UREL_CCFLAGS don't have the optimisation levels.
+		if(&main::DebugSwitchUsed() ){
+			if(&main::SymbolicDebugEnabled() ) {
+				&main::Output(
+					" \$(SYMBIAN_UDEB_CCFLAGS) "
+				);
+			}
+			else {
+				&main::Output(
+					" \$(SYMBIAN_UREL_CCFLAGS) "
+				);
+			}
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				" \$(SYMBIAN_UDEB_CCFLAGS) "
+			);
+		}
+		else {
+			&main::Output(
+				" \$(SYMBIAN_UREL_CCFLAGS) "
+			);
+
+		}
+		#Set the optimisation levels depending on whether it is a UREL or a UDEB build
+		if (/DEB$/o) {
+			&main::Output(
+				" \$(DEBUG_OPTIMISATION) "
+			);
+		}
+		else {
+		&main::Output(
+				" \$(REL_OPTIMISATION) "
+			);
+		}
+
+		&main::Output(
+			"\$(RUNTIME_SYMBOL_VISIBILITY_OPTION) "
+		);
+
+		if($kernelOption == 0)
+		{
+			&main::Output(
+				"\$(EXCEPTIONS) "
+			);
+		}
+		&main::Output(
+			'$(CCFLAGS) '
+		);
+
+		my @ml = &main::MacroList($_);
+		PrintList("\" -D\$_\"", @ml);
+
+		&main::Output(
+			" \$(CCDEFS)\n"
+		);
+		my @mmpReplaceOptions = &main::ReplaceOptions($toolchain);
+		
+		if (@mmpReplaceOptions)
+		{
+			my $OptionPrefix = getConfigVariable('OPTION_PREFIX');
+			my $Pattern;
+
+			# Set the value of '$Pattern' which is required to segregate one option from another based on the option prefix.
+			if($OptionPrefix) 
+			{
+				$Pattern = $OptionPrefix.'\S+\s*(?!'.$OptionPrefix.')\S*';
+			}
+			else 
+			{
+				# If option prefix is not set in the configuration make file, then set default
+				# option prefix as '-' or '--'.
+				$Pattern = '-{1,2}\S+\s*(?!-)\S*';
+			}
+
+			foreach my $options (@mmpReplaceOptions) 
+			{
+				my @opts = $options =~ /$Pattern/g;
+				my $count = 0;
+
+				while ($count <= $#opts) 
+				{
+					my $opt;
+					my $rep;
+					if ($opts[$count] =~ /^(\S+)\s+(\S+)$/) 
+					{
+						$opt = $1;
+						$rep = $2;
+						&main::Output(
+							"CC$_ := \$(subst $opt ,@@,\$(CC$_))\n",
+							"CC$_ := \$(CC$_:@@%=$opt $rep)",							
+							"\n"
+						);			
+						$count++;
+					}
+					else
+					{
+						$opt = $opts[$count];
+						$rep = $opts[$count+1];
+						
+						# Substitute '=' with '%' which is a wild card character in makefile.					
+						$opt =~ s/=/%/;
+					
+						&main::Output(
+							"CC$_ := \$(CC$_:$opt=$rep)",
+							"\n"
+						);							
+						$count+=2;
+					}
+				}
+			}
+		}
+		&main::Output(
+			"\n"
+		);
+	}
+
+	&main::Output(		
+		"\n"
+	);
+
+	#Function call logger
+	if ($Function_Call_Logger)	{
+		#Send all the debug macros to logger
+		foreach (@BldList) {
+			&main::Output
+			(
+				"FCLOGGER$_ = ", 
+				$EPOCPath, 
+				"tools\\fc_logger\\edgcpfe"
+			);
+
+			my @ml = &main::MacroList($_);
+			PrintList("\" -D\$_\"", @ml);
+			if ($thumbOption==1) {
+				&main::Output(
+					" \$(COMPILER_THUMB_DEFINES)"
+				);
+			}
+			&main::Output(" \$(COMPILER_INTERWORK_DEFINES)",
+						  " \$(CCDEFS)",
+						  " \$(FC_LOGGER_DEFINES)",
+						  " \$(FC_LOGGER_OPTION)");
+			&main::Output(
+				"\n",
+				"\n"
+			);
+		}
+	}
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCTRG$_)\\".&main::Trg($_))
+			);
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+	PrintList("\"\nRESOURCE\$_ : MAKEWORK\$_\"", @BldList);
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+			PrintList("\" \$_\"", @BldList);
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				if ($PlatName =~ /^ARMV5$/) {
+					&main::Output(
+						" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso"),
+						" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib"), "\n"
+					);
+				}
+				else {
+					&main::Output(
+						" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso"), "\n"
+					);
+				}
+			}
+			else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create any import libraries.\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		} else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.dso\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+
+		my $theDefFile = $DefFile;
+		$theDefFile = "\$(EPOCBLD)\\$BaseTrg.def" unless (-e $DefFile);
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY (.dso) \n",
+			"\n",
+			&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), " : ",
+			&Generic_Quote($DefFile), "\n",
+				"\tperl -S prepdef.pl ", &Generic_Quote($DefFile), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+				"\telf2e32 --definput=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" --dso=",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"),
+				" --linkas=$LinkAs\n",
+			"\n"
+		 );
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.dso"), "\n",
+				"\tcopy \"\$<\" \"\$@\"\n"
+			);
+		}
+
+		# Generate .lib files which will be used for ARMV5_ABIV1 platform (ABIV1 mode toolchain)
+		# Only for ARMV5 platform
+		if ($PlatName =~ /^ARMV5$/)
+		{
+			&main::Output(
+				"\n",
+				"\n",
+				"# REAL TARGET - LIBRARY (.lib) \n",
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), " : ",
+				&Generic_Quote($DefFile), "\n",
+					"\tperl -S prepdef.pl ", &Generic_Quote($DefFile), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+					"\tdef2dll.bat --path=\$(EPOCLIB)\\LIB \\\n\t\t--bldpath=\$(EPOCBLD) \\\n\t\t--import=$ExportLibrary \\\n",
+					"\t\t--deffile=\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking\n",
+					"\n",
+			);
+			if ($ExtraExportLibrary) {
+				&main::Output(
+					"\n",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib"), " : ",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), "\n",
+					"\tcopy \"\$<\" \"\$@\"\n"
+				);
+			}
+		}
+	}
+
+	my $freezeDir = &main::Path_Split('Path', $DefFile);
+	chop($freezeDir);
+
+	# dummy rule for def files to cope with filename case differences
+	unless (&main::ExportUnfrozen) {
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				"\n",
+				"\n",
+				&Generic_Quote($DefFile), " : ", "\n",
+				"\t\@rem Do nothing\n",
+			);
+		}
+	}
+
+	&main::Output(
+		"\n",
+		"\n",
+		&Generic_Quote($freezeDir), " : ", "\n",
+		"\tperl -S emkdir.pl \$\@\n",
+	);
+
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE : ",
+		&Generic_Quote($freezeDir), "\n",
+	);
+	if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+#		call perl on the script here so make will die if there are errors
+#           - this doesn't happen if calling perl in a batch file
+		&main::Output( "\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n" );
+	}
+	else {
+		&main::Output( "\tperl -e \"print \\\"warning: freeze could not be supported or \\
+		         you need to declare an explicitly specified def file using the keyword \\
+			 DEFFILE in the MMP file!\\n\\\"\""); 
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExportLibrary.dso\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso\"\n"
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+
+    my $ABI=&main::ABI;
+    my @ASSPLibList=&main::ASSPLibList;
+    my @SrcList=&main::SrcList;
+    my $FeatureVariantBaseTrg=&main::FeatureVariantBaseTrg;
+    my $Bld=&main::Bld;
+    my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+    my $DefFile=&main::DefFile;
+    my $EPOCIncPath=&main::EPOCIncPath;
+    my $FirstLib=&main::FirstLib;
+    my $BasicTrgType=&main::BasicTrgType;
+    my @LibList;
+    my @RTLibList = &GetRTLibList();
+    my $SystemTrg = &main::SystemTrg;
+    my $LibPath= &main::LibPath;
+    my $LinkAs=&main::LinkAs;
+    my $ExportLibrary=&main::ExportLibrary;
+    my $NoExportLibrary=&main::NoExportLibrary;
+    # N.B. should get better way to detect kernel probably!!
+    $SystemTrg = 1 if ($ExportLibrary =~ /EKERN/i);
+    my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+    my $RelPath=&main::RelPath;
+    my @StatLibList=&main::StatLibList;
+    my $StatLinkPath=&main::StatLinkPath;
+    my $Trg=&main::Trg;
+    my $TrgType=&main::TrgType;
+    my @UidList=&main::UidList;
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}
+	my $objectFiles;
+
+    if ($Bld =~ /DEB/) {
+	@LibList = &main::DebugLibList;
+    } else {
+	@LibList = &main::LibList;
+    }
+
+#	set up $LinkAs
+    $UidList[2]=~/^0x(.*)$/o;
+    if ($1 ne '00000000') {	# have to make sure than series of noughts in brackets doesn't appear in name for null uids
+	$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+    }
+
+
+    # REAL TARGETS
+    #-------------
+    &main::Output(
+		  "# REAL TARGET - BUILD VARIANT $Bld\n",
+		  "\n"
+		  );
+
+#	releasables
+	my @releaseables;
+
+	push @releaseables, "$RelPath$Trg" if ($BasicTrgType!~/^IMPLIB$/io);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		push @releaseables, "$RelPath$Trg.map";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+		push @releaseables, "$LibPath$ExportLibrary.dso";
+		push @releaseables, "$LibPath$ExtraExportLibrary.dso" if ($ExtraExportLibrary);
+		if ($PlatName =~ /^ARMV5$/)	{
+			push @releaseables, "$LibPath$ExportLibrary.lib";
+			push @releaseables, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+		}
+	}
+
+	push @releaseables, &main::FeatureVariantVMapFile() if &main::FeatureVariantVMapFile();
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	
+	&Generic_WhatTargets($Bld, "WHAT$Bld", @releaseables);
+	my @cleantargets = (@releaseables, "$RelPath$ExtraExportLibrary.sym");
+	
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+		&Generic_CleanTargets($Bld, "CLEANRELEASE$Bld", @cleantargets);
+	}
+	else {
+		push @cleantargets, "$LibPath$ExportLibrary.dso";
+			push @cleantargets, "$LibPath$ExtraExportLibrary.dso" if ($ExtraExportLibrary);
+		if ($PlatName =~ /^ARMV5$/) {
+            push @cleantargets, "$LibPath$ExportLibrary.lib";
+            push @cleantargets, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+		}
+			&Generic_CleanTargets($Bld, "CLEANRELEASE$Bld", @cleantargets);
+	}
+	
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+		if ($Ext =~ /cia/i && ($PlatName ne "GCCE")) {
+			$BaseSrc = "$BaseSrc\_";
+		}
+		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	#Compiler wrapper support starts
+	if($IsCompilerWrapperOption)
+	{
+		my $Platcmpwrap=&main::Plat;
+		
+		&main::Output(
+			"COMPWRAP$Bld : OUTPUT_NAME = ",
+			"$Platcmpwrap\_$Bld",
+			"\n"
+		);
+		
+		&main::Output(
+			"COMPWRAP$Bld : MAKEWORK$Bld"
+		);
+
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			&main::Output(
+				" \\\n\tCOMPWRAP$Bld$BaseSrc"
+			);
+		}
+
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+	#--Compiler wrapper support ends
+
+	# Flag that tells us wheter to run checklib.exe on user-added static libraries.
+	my $run_checklib = 0;
+
+  	if (@StatLibList && $BasicTrgType =~ /^(EXE|DLL)$/o && !$SystemTrg && main::StdCppSupport()) {
+		# There are user-added static libraries. They should be checked for
+		# consistent use of operator new.
+		$run_checklib = 1;
+
+		#Create a make variable for the libraries.
+		main::Output("\nUSER_ADDED_ARCHIVES_$Bld=");
+		PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList);
+		main::Output("\n\n");
+	}
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+        
+	my @depLibs;
+	if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.lib")
+		);
+		push @depLibs, &Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.lib");
+	}
+        
+	my $StaticRTLib = "";
+
+
+	if ($SystemTrg) {
+		$StaticRTLib = "ksrt";
+	}
+	else {
+		$StaticRTLib = "usrt";
+	}
+
+	if ($RVCTVersion) {
+		$StaticRTLib .= $RVCTVersion;
+	}
+	elsif ($GCCEVersion) {
+		if ($GCCEMajorVersion < 4) {
+			$StaticRTLib .= "2_2";
+		}
+		else {
+			$StaticRTLib .= "3_1";
+		}
+	}
+	else {
+		$StaticRTLib .= "2_2";
+	}
+
+	&main::Output(" \\\n\$(EPOCSTATLINK$Bld)\\$StaticRTLib\.lib");
+
+	&main::Output(" \\\n\t",getConfigVariable('VIA_FILE_PREFIX'));
+	PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCBSFSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList);
+	&main::Output(" \\\n\t",getConfigVariable('VIA_FILE_SUFFIX'));
+	
+	@depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCBSFSTATLINK$Bld\)\\\\\$_\"\)", @StatLibList));
+	
+	
+	my @ImportLibList = ImportLibraryList(@LibList);
+	PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @ImportLibList);
+	@depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @ImportLibList));
+        
+	if ($TrgType=~/^STDEXE$/o || $TrgType=~/^STDDLL$/o) {
+		$NamedSymLkup = 1;
+		my @OEImportLibraryList = &GetOEImportLibList();
+		@OEImportLibraryList = ImportLibraryList(@OEImportLibraryList);
+		if(not (grep /^libc.dso$/i, @LibList)) {
+				push @OEImportLibraryList, "libc.dso";
+		}
+		PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @OEImportLibraryList);
+		@depLibs = (@depLibs, DepLinkList("\&Generic_Quote\(\"\\\$\(EPOCLIB\)\\\\LIB\\\\\$_\"\)", @OEImportLibraryList));
+	}
+
+	unless ($ArmRT || ($BasicTrgType=~/^LIB$/o)) {
+		my $TargLib = "$ExportLibrary.dso";
+		$TargLib =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		unless ($SystemTrg) {
+			foreach (@RTLibList) {
+  				# Ignore the empty file name      Modified by Kun Xu for DEF126030 on 06/08/2008
+  				if(!$_) 
+  				{
+  					next;		
+  				}
+				&main::Output(
+					" \\\n\t",
+					&Generic_Quote("\$(EPOCLIB)\\LIB\\$_")
+				) unless ($_ =~ /$TargLib/i);
+				push @depLibs, &Generic_Quote("\$(EPOCLIB)\\LIB\\$_") unless ($_ =~ /$TargLib/i);
+			}
+		}
+	}
+    #OE Glue Code 
+	if ($TrgType=~/^STDEXE$/o) {
+		my @OELibList = &GetOELibList();
+		foreach (@OELibList) {
+			&main::Output(
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_"),
+			);
+			push @depLibs, &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_");
+		}
+	}
+	PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\$_\"\)", @ToolChainLibList);
+                
+	&main::Output(
+		"\n",
+		"\n"
+	);
+        
+	main::Output(
+                "LIBS$Bld" . "DEPS="
+	);
+        
+	my @tmp;
+	for my $lib (@depLibs)
+	{
+            $lib =~ s/\(.*\.o\)//;
+            $lib =~ s/\\$//;
+            push @tmp, $lib unless ($lib =~ /-\(/ || $lib =~ /-\)/);
+	}
+                
+	PrintList("\' \\\n\t\'\.\&Generic_Quote\(\"\$_\"\)", @tmp);
+        
+	&main::Output(
+			"\n",
+			"\n"
+	);
+
+	&main::Output(
+		"VTBLEXPORTS$Bld="
+	);
+        my $vtobj = quotemeta("(VtblExports.o)");
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+        &main::Output(
+			"OBJECTS$Bld="
+		);
+        foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+		if ($Ext =~ /cia/i && ($PlatName ne "GCCE")) {
+			$BaseSrc = "$BaseSrc\_";
+		}
+
+			&main::Output(
+				" \\\n\t",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+			  );
+
+			$objectFiles .= &main::BldPath.$BaseSrc.".o ";
+	}
+        &main::Output(
+			"\n",
+		"\n"
+	);
+
+	# IsCustomDllUseCase() subroutine is called to check if the given executable 
+	# is a custom dll or not.
+	my $IsCustomDll = IsCustomDllUseCase();
+
+	if ($IsCustomDll) 
+	{
+		# Generate ".bin" file(assembly listing file) only if frozen deffile is present and EXPORTUNFROZEN is not specified
+		# in the Mmp file.
+		if((-e $DefFile) && (!&main::ExportUnfrozen))
+		{
+			&main::Output(
+				"EXPFILE$Bld = \$(EPOCBLD$Bld)\\$ExportLibrary.bin \n",			
+				"\n"
+			);
+		}
+		else 
+		{
+			&main::Output(
+				"EXPFILE$Bld = \n",
+				"\n"
+			);
+		}		
+	}
+	
+	# Create "via" file containing all object files in order to reduce
+	# command line lengths in pertinent calls
+	my $objectsViaFile = &main::CommandFile();
+	my $viaoption = getConfigVariable('COMMANDFILE_OPTION');
+	
+    if ($BasicTrgType=~/^LIB$/o && StdCppTarget() ) {
+
+        # Add the magic object that identifies the library as a STDLIB.
+        $objectFiles .= "$ENV{EPOCROOT}epoc32/tools/tag/tag_elf";
+	}
+
+	$objectFiles =~ s/\\/\//g ;
+
+	&main::CreateExtraFile($objectsViaFile, $objectFiles);
+		 
+		   &main::Output(
+			 &Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"),
+			 " : \$(OBJECTS$Bld) \$(LIBS". $Bld . "DEPS)"
+            );
+
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			" ", &Generic_Quote($DefFile)
+		);
+	}
+
+	if($IsCustomDll eq 1)
+	{
+		&main::Output( " \$(EXPFILE$Bld) " );	
+	}
+
+    &main::Output("\n");
+
+
+#       get rid of any -symbols produced .map file
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+			&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCTRG$Bld)\\$Trg.map\" \n"
+		);
+		}
+
+		my $AbsentSubst = '';
+		if ($BasicTrgType=~/^(DLL|EXE)/o) {
+
+			if ($run_checklib) {
+				my $checklib = "checklib";
+
+				if ( StdCppTarget() ) {
+					$checklib .= " stdc++ --elf";
+				}
+				else {
+					$checklib .= " symc++ --elf";
+				}
+
+				&main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" );
+			}
+
+			my $WrapLD = $IsProxyWrapperOption ? "$ENV{ABLD_COMPWRAP} " : "";
+			if ($Bld =~ /DEB/)
+			{
+				if($PlatName ne "GCCE"){
+					# if the compiler is RVCT then append SYMBIAN_UDEB_LINK_FLAGS to option string 
+					# in order to override the default ones. 
+					&main::Output(
+						"\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ", "\$(SHARED_OBJECT_OPTION) ",
+						"\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ", "\$(SYMBIAN_UDEB_LINK_FLAGS) ", "\$(SO_NAME_OPTION) ","$LinkAs"
+					); 
+				} else {
+					&main::Output(
+						"\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SYMBIAN_UDEB_LINK_FLAGS) ", "\$(SHARED_OBJECT_OPTION) ",
+						"\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ","\$(SO_NAME_OPTION) ","$LinkAs"
+					);
+				}
+			}
+			else
+			{
+				if($PlatName ne "GCCE"){
+					# if the compiler is RVCT then append SYMBIAN_UREL_LINK_FLAGS to option string 
+					# in order to override the default ones. 
+					&main::Output(
+						"\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SHARED_OBJECT_OPTION) ",
+						"\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ", "\$(SYMBIAN_UREL_LINK_FLAGS) ", "\$(SO_NAME_OPTION) ", "$LinkAs"
+					);
+				} else {
+					&main::Output(
+						"\t", $WrapLD, "\$(LD) ","\$(STATIC_LIBS) ","\$(SYMBIAN_UREL_LINK_FLAGS) ","\$(SHARED_OBJECT_OPTION) ",
+						"\$(CODE_SEGMENT_START) ", "\$(DATA_SEGMENT_START) 0x400000 ", "\$(SYMVER_OPTION) ","\$(SO_NAME_OPTION) ","$LinkAs"
+					);
+				}
+			}
+
+			if(&main::DebugSwitchUsed()){
+				if(&main::SymbolicDebugEnabled() ) {
+					&main::Output(
+						" \$(LINKER_DEBUG_OPTION) "
+					);
+				}
+				else {
+					&main::Output(
+						" \$(LINKER_NODEBUG_OPTION) "
+					);
+				}
+			}
+			elsif($Bld =~/DEB/){
+				&main::Output(
+					" \$(LINKER_DEBUG_OPTION) "
+				);
+			}
+			else {
+				&main::Output(
+					" \$(LINKER_NODEBUG_OPTION) "
+				);
+			}
+
+			my $EntrySymbol;
+			if ($BasicTrgType=~/^DLL$/o) {
+				$EntrySymbol = '_E32Dll';
+			}
+			elsif ($BasicTrgType=~/^EXE$/o) {
+				$EntrySymbol = '_E32Startup';
+			}
+			if ($EntrySymbol) {
+				$AbsentSubst = " --absent $EntrySymbol";
+			}
+
+			if (($BasicTrgType=~/^DLL$/o) || ($BasicTrgType=~/^EXE$/o)) {
+				&main::Output(
+					" \$(LINKER_ENTRY_OPTION)",
+					" $EntrySymbol "
+					);
+				my $undefined_option = getConfigVariable('UNDEFINED_SYMBOL_REF_OPTION');
+				if ($undefined_option)
+				{
+					&main::Output(
+						" \$(UNDEFINED_SYMBOL_REF_OPTION)",
+						" $EntrySymbol "
+					);
+				}
+			}
+
+			if ($BasicTrgType=~/^DLL$/o) {
+				# get the right object file for the entry point
+				my $ObjFile="\$(EDLL_OBJECT)";
+				if ($FirstLib =~ /EDEV/i) {
+					$ObjFile="\$(DENTRY_OBJECT)";
+				}
+				if ($FirstLib =~ /EKLL/i) {
+					$ObjFile="\$(LENTRY_OBJECT)";
+				}
+				if ($FirstLib =~ /EEXT/i) {
+					$ObjFile="\$(XENTRY_OBJECT)";
+				}
+				if ($FirstLib =~ /EVAR/i) {
+					$ObjFile="\$(VENTRY_OBJECT)";
+				}
+
+				&main::Output(
+					" \$(EPOCSTATLINK$Bld)\\$FirstLib", "$ObjFile",
+					" \$(EPOCSTATLINK$Bld)\\$FirstLib", " \\", "\n"
+				);
+			} elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o) {
+				# get the right object file for the entry point
+				my $ObjFile="\$(EEXE_OBJECT)";
+				if ($FirstLib =~ /KC_EXE/i) {
+					$ObjFile="\$(KENTRY_OBJECT)";
+				}
+
+				&main::Output(
+					" \$(EPOCSTATLINK$Bld)\\$FirstLib", "$ObjFile",
+					" \$(EPOCSTATLINK$Bld)\\$FirstLib", " \\", "\n"
+				);
+			}
+
+			&main::Output(
+				"\t\t\$(LINKER_OUTPUT_OPTION) \"\$(EPOCBLD$Bld)\\$Trg\" \\\n",
+#				"\t\t\$(OBJECTS$Bld) \\\n"
+			);
+
+		&main::Output(
+			"\t\t\$(LINKER_SYMBOLS_MAP_OPTION) ",
+			"\$(","$Bld","_MAP_FILE) \\\n"
+		);
+
+		# Pass in the command file if the command file option is passed in
+		if($viaoption) {
+                        #'@' is for GCCE whos version is not 3.4.3
+			if($viaoption eq '@'){
+				main::Output(
+					"\t\t$viaoption$objectsViaFile \\\n"
+				);
+			}
+                        #'-via' is for RVCT 
+			else{
+				main::Output(
+					"\t\t$viaoption $objectsViaFile \\\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\t\t\$(OBJECTS$Bld) \\\n"
+			);
+		}
+
+		if($IsCustomDll eq 1) {
+			&main::Output( "\t\t\$(EXPFILE$Bld) \\\n" );
+		}
+
+			&main::Output(
+				"\t\t\$(LIBS$Bld) \\\n",
+				"\t\t\$(VTBLEXPORTS$Bld) \$(USERLDFLAGS) \n"
+			);
+
+			if(&main::DebugSwitchUsed() ){
+				if(&main::SymbolicDebugEnabled() ) {
+				&main::Output(
+					"\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+					);
+				}
+			}
+			elsif ($Bld=~/^U?DEB$/o) {
+				   &main::Output(
+				   "\tcopy \"\$(EPOCBLD$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$FeatureVariantBaseTrg.sym\"\n"
+			   );
+			}
+		if (-e $DefFile) {
+			&main::Output(
+				"\tcopy ", &Generic_Quote(("\"$DefFile\"")), " \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+			);
+		}
+
+		&main::Output(
+			"\telf2e32 --sid=", &main::SecureId(), " "
+		);
+
+		if (&main::IsDebuggable eq DEBUGGABLE) {
+			&main::Output(
+				' --debuggable '
+			);
+		}
+
+		if (&main::IsDebuggable eq DEBUGGABLE_UDEBONLY) {
+			if ($Bld=~/^UDEB$/o) {
+				&main::Output(
+				' --debuggable '
+				);
+			}
+		}
+		
+		# Do not export Arm Static Library Symbols
+		if (&Armutl_ArmLibList) {
+			&main::Output(
+				' --excludeunwantedexports'
+			);
+		}
+
+		if ($IsCustomDll eq 1) {
+			&main::Output(
+				' --customdlltarget'
+			);
+		}
+		if (keys(%Version)) {
+			&main::Output(
+				' --version=', &Genutl_VersionToUserString(%Version)
+			);
+		}
+		# exexps are allowed data, but they look like dlls to elftran....
+		if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			&main::Output(
+				' --dlldata'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' --datalinkaddress=',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' --fixedaddress'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' --heap=',$HeapSize{Min},',',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' --priority=',&main::ProcessPriority
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' --stack=',&main::StackSize
+			);
+		}
+		&main::Output(
+			"\\\n\t\t"
+		);
+
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" --uid$i=$_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' --vid=',&main::VendorId
+			);
+		}
+		&main::Output(
+			"\\\n\t\t"
+		);
+
+		&main::Output(
+			' --capability=',&main::Capability
+		);
+
+		my $vfpv2_support = getConfigVariable('VFP2MODE_OPTION');
+		if ($vfpv2_support && &main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i))
+		{
+			&main::Output(
+				' --fpu=vfpv2'
+			);
+		}
+		else
+		{
+			&main::Output(
+				' --fpu=softvfp'
+			);
+		}
+
+		if (&main::SmpSafe)
+		{
+			&main::Output(
+				' --smpsafe'
+			);
+		}
+
+
+		if(($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/ ) || $TrgType=~/^EXEXP/ || $TrgType=~/^STDEXE/){
+			&main::Output(
+				' --targettype=',$TrgType
+				);
+		}
+		else{
+			&main::Output(
+				' --targettype=',$BasicTrgType
+				);
+		}
+
+		&main::Output(
+			' --output=',"\"\$\@\""
+			);
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if (-e $DefFile) {
+				&main::Output(
+					' --definput=',"\"\$(EPOCBLD)\\$ExportLibrary.prep.def\""
+					);
+			}
+			# Non-callable exports will be ignored if the MMP file does not contain the DEFFILE keyword or contains the NOEXPORTLIBRARY keyword			 
+			if (!($DefFile) || $NoExportLibrary) {				
+				&main::Output( " --ignorenoncallable" );
+			}
+			&main::Output(
+				' --dso=',
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.dso")
+				);
+			&main::Output(
+				' --defoutput=',
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.def")
+				);
+				if(&main::ExportUnfrozen) {
+					&main::Output( ' --unfrozen ');
+				}
+			}
+		#the input elf file - as the last arg
+		&main::Output(
+			" --elfinput=","\"\$(EPOCBLD$Bld)\\$Trg\"",
+			" --linkas=$LinkAs"
+			);
+		if (&main::CompressTarget)
+			{
+			&main::Output(
+			" --uncompressed"
+			);
+			}
+		else
+			{
+			if(&main::CompressTargetMode == NOCOMPRESSIONMETHOD)
+			{
+				# Do nothing
+			}
+			elsif(&main::CompressTargetMode == INFLATECOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" --compressionmethod inflate"
+			);
+			}
+			elsif(&main::CompressTargetMode == BYTEPAIRCOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" --compressionmethod bytepair"
+			);
+			}
+
+			}
+		
+		if($NamedSymLkup){
+			&main::Output(" --namedlookup"
+		);
+		}
+
+		&main::Output(
+		" --libpath=", "\"\$(EPOCLIB)\\LIB\""
+		);
+
+		if($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/){
+			my $Export;
+			my $Ordinal=1;
+			foreach $Export (&main::Exports) {
+				if($Ordinal == 1) {
+				&main::Output(" --sysdef=");
+				}
+				&main::Output(
+					"$Export,$Ordinal; "
+				);
+				$Ordinal++;
+			}
+		}
+
+		if (&main::CodePagingTargetMode == UNPAGED) {
+			&main::Output(
+				' --codepaging=unpaged'
+			);
+		}
+		elsif (&main::CodePagingTargetMode == PAGED) {
+			&main::Output(
+				' --codepaging=paged'
+			);
+		}
+
+		if (&main::DataPagingTargetMode == UNPAGED) {
+			&main::Output(
+				' --datapaging=unpaged'
+			);
+		}
+		elsif (&main::DataPagingTargetMode == PAGED) {
+			&main::Output(
+				' --datapaging=paged'
+			);
+		}
+
+		&main::Output(
+			"\n"
+		);
+
+		}
+         elsif ($BasicTrgType=~/^LIB$/o) {
+			&main::Output(
+			"\t\$(AR) ",
+				" \$(ARCHIVER_CREATE_OPTION) ",
+				" \$(EPOCBSFSTATLINK$Bld)\\$Trg \\\n"
+			);
+		# Pass in the command file if the command file option is passed in
+		if($viaoption) {
+                        #'@' is for GCCE whos version is not 3.4.3
+			if($viaoption eq '@'){
+				&main::Output(
+					"\t\t$viaoption$objectsViaFile\n"
+				);
+			}
+                        #'-via' is for RVCT  
+			else{
+				&main::Output(
+					"\t\t$viaoption $objectsViaFile\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\t\t\$(OBJECTS$Bld) \n"
+			);
+		}
+		# Pass the archiver options which can be customized form BSF file
+		&main::Output(
+			"\t\t\$(AR_OPTIONS) \n"
+		);
+         }
+
+         &main::Output(
+		 "\n"
+	 );
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::Output(
+			"\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.def\" ", "\"\$(EPOCBLD)\\$ExportLibrary.def\"\n"
+			);
+		if  (&main::ExportUnfrozen) {
+			if ($PlatName =~ /^ARMV5$/)
+			{
+				&main::Output(
+				"\tdef2dll.bat --path=\$(EPOCBLD$Bld) \\\n\t\t--bldpath=\$(EPOCBLD$Bld) \\\n\t\t--export=$ExportLibrary \\\n\t\t--import=$ExportLibrary \\\n",
+				"\t\t--deffile=\$(EPOCBLD)\\$ExportLibrary.def \\\n\t\t--linkAs=$LinkAs \\\n\t\t$InterWorking \\\n\t\t--absent=undef \n"
+				);
+				&main::Output(
+					"\n",
+					"\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" ",
+					"\"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\"",
+					"\n"
+				);
+				if ($ExtraExportLibrary) {
+				&main::Output(
+					"\n",
+					"\tcopy ", " \"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib\" ",
+					"\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib\"",
+					"\n"
+				);
+				}
+			}
+
+			&main::Output(
+					  "\n",
+				  "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.dso\" ",
+				  "\"\$(EPOCLIB)\\LIB\\$ExportLibrary.dso\"",
+				  "\n"
+				 );
+
+			&main::Output(
+					  "\n",
+				  "\tcopy ", " \"\$(EPOCBLD$Bld)\\$ExportLibrary.dso\" ",
+				  "\"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.dso\"",
+				  "\n"
+				 ) if ($ExtraExportLibrary);
+
+		}
+	}
+
+	if($IsCustomDll eq 1)
+	{
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$ExportLibrary.bin"), ": $DefFile\n");
+
+	    my $theDefFile = "\$(EPOCBLD)\\$ExportLibrary.def";
+	    $theDefFile = $DefFile if (-e $DefFile && !&main::ExportUnfrozen);
+	    my $theAssembler = " \$(ASM) ";
+	    &main::Output(
+		"\telf2e32  \\\n\t\t--definput=$theDefFile \\\n\t\t--dump=a \\\n\t\t--output=\$(EPOCBLD$Bld)\\$ExportLibrary.s \n",
+  		"\t$theAssembler \$(AAPCS_OPTION) \\\n\t\t \$(ASM_OUTPUT_OPTION) \$(EPOCBLD$Bld)\\$ExportLibrary.bin  \$(EPOCBLD$Bld)\\$ExportLibrary.s\n\n"
+	    );
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.s\"\n\n"
+		);
+	}
+
+    &main::Output( "\n" );
+}
+
+# Set to 1 if multifile compilation wanted
+my $domultifile = 0;
+
+sub DoMultiFile () {
+        return $ENV{RVCTMultiFile} if (defined $ENV{RVCTMultiFile});
+	return $domultifile;
+}
+
+my %CompilationGroups = ();
+
+sub InitMultiFileCompilation() {
+#	Do preparatory work for multifile compilation
+	my $SourceStructRef=&main::SourceStructRef;
+
+#	We sort the source files by path and extension. These form natural groups to compile together.
+	my %PathToSourceMap = ();
+	foreach my $SourceRef (@$SourceStructRef) {
+		my $SrcFile = $$SourceRef{CurFile};
+		my $Ext = &main::Path_Split('Ext', $SrcFile);
+			push @{$PathToSourceMap{$$SourceRef{SrcPath}}{$Ext}}, $SrcFile;
+	}
+
+#	Now we split each group into sets of 10.
+	foreach my $SrcPath (keys %PathToSourceMap) {
+		foreach my $Ext (keys %{$PathToSourceMap{$SrcPath}}) {
+			my @FileList;
+			my @ObjectList;
+			my @SourceList;
+			my $NumToGo = 10;
+			foreach my $File (@{$PathToSourceMap{$SrcPath}{$Ext}}) {
+				my $base = &main::Path_Split('Base', $File);
+				my $cia = ($Ext =~ /cia/i);
+				$base .= "_" if $cia && ($PlatName ne "GCCE");
+				push @FileList, $File;
+				push @ObjectList, "$base.o";
+#				this gives us our source files xxx
+				push @SourceList, ($cia && ($PlatName ne "GCCE")) ? "$base.cpp" : "$SrcPath$base$Ext";
+				$NumToGo--;
+				unless ($NumToGo) {
+#					   Use the last file as the key. This means e.g that all the dependency
+#					   info will have been generated for the earlier files in the list
+					   push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+						   push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+					   $NumToGo = 10;
+					   undef @FileList;
+					   undef @ObjectList;
+					   undef @SourceList;
+				}
+			}
+			push @{$CompilationGroups{$FileList[$#FileList]}{Sources}}, @SourceList;
+			push @{$CompilationGroups{$FileList[$#FileList]}{Objects}}, @ObjectList;
+		}
+	}
+
+#	debug print out
+	if (0) {
+	foreach my $keyfile (keys %CompilationGroups) {
+		print "$keyfile :\n";
+		foreach my $class (keys %{$CompilationGroups{$keyfile}}) {
+			print "\t$class:\n\t\t";
+			print join " ", @{$CompilationGroups{$keyfile}{$class}}, "\n";
+		}
+	}
+	}
+
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+
+	InitMultiFileCompilation() if DoMultiFile();
+
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+	&Generic_AifBld;
+}
+
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @DepList=&main::DepList;
+	return if (@DepList == 0);
+
+	my @BldList=&main::BldList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+
+	my $BaseObj=$BaseSrc;
+	my $cia = 0;
+	if ($ExtSrc =~ /cia/i ) {
+		$cia = 1;
+		$BaseObj .= '_' if ($PlatName ne "GCCE");
+	}
+
+  	foreach my $Bld (@BldList) {
+		my $tranasm = getConfigVariable('TRANASM');
+		if ($tranasm)
+		{
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " ",
+			) if $cia && ($PlatName ne "GCCE");
+		}
+
+		&main::Output(
+  			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.cpp"), " ",
+		) if $cia && ($PlatName ne "GCCE");
+		&main::Output(
+  			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+  			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+
+	my $prefix_file=getConfigVariable('PREFIXFILE');
+
+	my @tempdeplist = &main::DepList;
+
+	my $totalcount = $#tempdeplist;
+	my $count = 0;
+	while( $totalcount >= $count )
+	{
+		my $dependencyfile = shift(@tempdeplist);
+		if($dependencyfile eq $prefix_file )
+		{
+			$DepList[$count]="\$(PREFIXFILE)";
+		}
+		$count += 1;
+	}
+
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my @DepList=&main::DepList;
+	return if (@DepList == 0);
+
+	my $Bld=&main::Bld;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+
+	my $BaseObj=$BaseSrc;
+	my $cia = 0;
+	if ($ExtSrc =~ /cia/i ) {
+		$cia = 1;
+		$BaseObj .= '_' if ($PlatName ne "GCCE");
+	}
+
+	my $tranasm = getConfigVariable('TRANASM');
+	if ($tranasm)
+	{
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " ",
+		) if $cia && ($PlatName ne "GCCE");
+	}
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.cpp"), " ",
+	) if $cia && ($PlatName ne "GCCE");
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseObj.o"), " :",
+	);
+
+	my $prefix_file=getConfigVariable('PREFIXFILE');
+
+	my @tempdeplist = &main::DepList;
+
+	my $totalcount = $#tempdeplist;
+	my $count = 0;
+	while( $totalcount >= $count )
+	{
+		my $dependencyfile = shift(@tempdeplist);
+		if($dependencyfile eq $prefix_file )
+		{
+			$DepList[$count]="\$(PREFIXFILE)";
+		}
+		$count += 1;
+	}
+
+        PrintList("\' \\\n\t\'\.\&Generic_Quote\(\$_\)", @DepList);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub quoted_path
+{
+    my $curdrive="";
+    my ($arg) = @_;
+    return "\"$arg\"" if ($arg !~ /^\\[^\\]/);	# not an absolute path
+
+		$curdrive=$1 if (cwd =~ /^(.:)/);
+    return "\"$curdrive$arg\"";
+}
+
+sub PMPrefixFile
+{
+# Prefix Header File passed to the preprocessor
+
+	my $prefix_file=getConfigVariable('PREFIXFILE');
+	return quoted_path($prefix_file) if defined $prefix_file;
+}
+
+sub PMToolChainIncDir
+	{
+	# Extra system include directories dictated by the toolchain
+	return $ToolChainIncDir;
+	}
+
+sub PMEndSrcBld {
+#       Generate multifile compilation stuff if needed.
+        if (DoMultiFile()) {
+		   MultiFileEndSrcBld();
+		   return;
+	}
+
+	my $ABI=&main::ABI;
+	my $Plat=&main::Plat;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $BaseTrg=&main::BaseTrg;
+	my $BldPath = &main::BldPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	$Src = ucfirst $Src if ($Ext !~ /\.(cpp|c)$/);
+	my $LangOptions = &SelectLangOptions($Ext);
+	# support for auto 'translated' ASM
+	my $AsmFilep = $AsmFiles{$Src};
+
+	$preinclude = &GetToolChainPreInclude();
+	
+	#Function call logger takes -I as include option
+	my $FCLogger_inc_option = getConfigVariable('FC_LOGGER_INCLUDE_OPTION'); 
+	my $logger_preinclude = getConfigVariable('PREINCLUDE_OPTION_FCLOGGER'); 
+	my $Dictionary_File_Name = getConfigVariable('FC_LOGGER_DICTIONARY_FILE_NAME');
+	my $Generated_C_File_Name = getConfigVariable('FC_LOGGER_GENERATED_C_FILE_NAME');
+	
+	my $ChopSrcPath=&main::Path_Chop($SrcPath);
+	my $lfboption = LinkerFeedBackOption();
+	my $LstExt ;
+	if($Plat =~ /^(ARMV[6-9])/i){
+		$LstExt = $1 ;	
+	}
+	else{
+		$LstExt = $ABI;
+	}
+	if ($AsmFilep || ($Ext =~ /cia/i && ($PlatName ne "GCCE"))) {
+		&main::Output(
+# compile the translated, preprocessed source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\@echo $Src\n",
+			"\t\$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+			"\n"
+			);
+# rule to translate the preprocessed source
+			my $tranasm = getConfigVariable('TRANASM');
+			if ($tranasm)
+			{
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+
+				"\t\$(TRANASM) \$(TRANASM_FLAGS) \$(TRANASM_OUTPUT_OPTION)\$\@ \$(TRANASM_INPUT_OPTION)\$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+			"\n"
+			);
+# rule to preprocess the source
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@) \n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+			"\n"
+			);
+			}
+			else
+			{
+			&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@) \n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp)\n",
+			"\n"
+			);
+			}
+	} 
+	else {
+		#If Function call logging is enabled, add call to function call logger
+		if ($Function_Call_Logger)	{
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), 
+				" : ",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.int.cpp"), 
+				"\n",
+				"\t\@echo $BaseSrc.int.cpp\n",
+				"\t\$(CC$Bld) $lfboption$LangOptions ", 
+				" \$(INCLUDE_OPTION) ",
+				"\$(call absolutePaths, $ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc.int.cpp)\n",
+				"\n",
+# generate an assembly listing target too
+				"LISTING$Bld$BaseSrc : ", 
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), 
+				"\n",
+				"\t",
+				&Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+				"\n",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), 
+				" : ",
+				&Generic_Quote("$SrcPath$Src"), 
+				"\n",
+				"\t\$(CC$Bld) $LangOptions ",
+				"\$(ASSEMBLER_LISTING_OPTION) ",
+				"\$(INCLUDE_OPTION)",
+				" \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src) \n",
+				"\n"
+			);
+			
+			#Call to Function Call Logger
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.int.cpp"),
+				" : ",
+				&Generic_Quote("$SrcPath\\$Src"),
+				"\n",
+				"\t\@echo $BaseSrc.int.cpp\n",
+				"\t\$(FCLOGGER$Bld) $lfboption \\\n" ,
+				"\t$FCLogger_inc_option $ChopSrcPath \\\n",
+				"\t$logger_preinclude \\\n ",
+				"\t\$(INCDIR_FCLOGGER) \\\n" ,
+				"\t$Dictionary_File_Name $BldPath$BaseTrg.txt \\\n" ,
+				"\t$Generated_C_File_Name \$\@ $ChopSrcPath\\$Src \n",
+				"\n\n"
+			);
+		}
+		else {
+			&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\@echo $Src\n",
+			"\t\$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src)\n",
+			"\n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(CC$Bld) $LangOptions ","\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src) \n",
+			"\n"
+			);
+			# Compiler wrapper support starts...
+			if($IsCompilerWrapperOption)
+			{
+				&main::Output(
+					"COMPWRAP$Bld$BaseSrc : ",
+					&Generic_Quote("$SrcPath$Src"), "\n",
+					"\t\@echo Analysing $Src\n",
+					"\t\$(COMPWRAP) \$(CC$Bld) $lfboption $LangOptions ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src)\n",
+					"\n"
+				);
+			}
+			# Compiler wrapper support ends...
+		}
+	}
+}
+
+my $MFVarN = 0;
+sub MultiFileEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+        my $KeyFile = &main::Src;
+	my $Src=ucfirst lc $KeyFile;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $LangOptions = &SelectLangOptions($Ext);
+	# support for auto 'translated' ASM
+	my $AsmFilep = $AsmFiles{$Src};
+
+	my $ChopSrcPath=&main::Path_Chop($SrcPath);
+	my $lfboption = LinkerFeedBackOption();
+
+	if ($AsmFilep || ($Ext =~ /cia/i && ($PlatName ne "GCCE"))) {
+		if ($CompilationGroups{$KeyFile}) {
+# compile the translated, preprocessed source
+			   &main::Output( "OBJECTS$MFVarN = ");
+			   foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+				   &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " ");
+			   }
+				   &main::Output( "\n\n");
+			   &main::Output( "SOURCES$MFVarN = ");
+			   foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+				   &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$src", " "));
+			   }
+				   &main::Output( "\n\n");
+			   &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+			   &main::Output(
+					 "\t\@echo Compiling \$(SOURCES$MFVarN)\n",
+					 "\t\$(CC$Bld) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $lfboption\\\n",
+					 "\t\t$LangOptions \$(OUTPUT_OPTION) \$\@ --multifile \$(SOURCES$MFVarN)"
+			  );
+				   &main::Output( "\n\n");
+			   $MFVarN++;
+		}
+		&main::Output(
+# rule to translate the preprocessed source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), "\n",
+			"\ttranasm -n -s -o=\$\@ \$(EPOCBLD$Bld)\\$BaseSrc.pre\n",
+			"\n",
+# rule to preprocess the source
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.pre"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(CC$Bld) \$(PREPROCESSOR_OPTION) $preinclude $LangOptions ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $ChopSrcPath\\$Src \$(OUTPUT_OPTION) \$\@ \n",
+# generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.cpp"), "\n",
+			"\t\$(CC$Bld) $LangOptions ", "\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) \$(OUTPUT_OPTION) \$\@ \$(EPOCBLD$Bld)\\$BaseSrc\_.cpp\n",
+			"\n"
+			);
+	} else {
+
+		if ($CompilationGroups{$KeyFile}) {
+#                      compile the source
+			   &main::Output( "OBJECTS$MFVarN = ");
+			   foreach my $obj (@{$CompilationGroups{$KeyFile}{Objects}}) {
+				   &main::Output( &Generic_Quote("\\\n\t\$(EPOCBLD$Bld)\\$obj"), " ");
+			   }
+				   &main::Output( "\n\n");
+			   &main::Output( "SOURCES$MFVarN = ");
+			   foreach my $src (@{$CompilationGroups{$KeyFile}{Sources}}) {
+				   &main::Output( &Generic_Quote("\\\n\t$src"), " ");
+			   }
+				   &main::Output( "\n\n");
+			   &main::Output( "\$(OBJECTS$MFVarN) : \$(SOURCES$MFVarN) \n");
+
+			   &main::Output(
+					 "\t\@echo Compiling \$(SOURCES$MFVarN)\n",
+					 "\t\$(CC$Bld) ", "\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) $lfboption\\\n",
+					 "\t\t$LangOptions \$(OUTPUT_OPTION) \$\@ --multifile \$(SOURCES$MFVarN)"
+			  );
+				   &main::Output( "\n\n");
+			   $MFVarN++;
+		}
+#		generate an assembly listing target too
+		&main::Output(
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$LstExt.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(CC$Bld) $LangOptions ","\$(ASSEMBLER_LISTING_OPTION) ","\$(INCLUDE_OPTION)"," \$(call absolutePaths,$ChopSrcPath \$(INCDIR)) \$(OUTPUT_OPTION) \$\@ $ChopSrcPath\\$Src \n",
+			"\n"
+			);
+	}
+}
+
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+# modified start: makefile improvement 
+	&checkVMAPFiles;
+# modified end: makefile improvement 
+}
+
+sub ImportLibraryList {
+	my $dso;
+	my $base;
+	my @ImportLibList;
+	foreach $dso (@_) {
+		$base = &main::Path_Split('Base', $dso);
+		$dso = $base.".dso";
+		push @ImportLibList, $dso;
+	}
+	return @ImportLibList;
+}
+
+sub ChangeSlash($) {
+	my $abspath = $_[0];
+	$abspath =~ s/\\/\//g ;
+	return $abspath;
+}
+
+# System libraries such as the standard C++ libraries or floating point libraries or any other
+# static libraries are made into DLLs by linking its export table against them. Such DLLs that are
+# created from a static library is known as a Custom DLL. The ARM libraries can be supplied using
+# the ARMLIBS mmp keyword  A DLL is considered to be a customdll based on the presence of ARMLIBS
+# keyword and also the presence of DEFFILE keyword.
+
+sub IsCustomDllUseCase()
+{
+	# To check if ARMLIBS keyword is passed in the MMP file.
+	# Armutl_ArmLibList() gets the list of static arm libraries, if used by an executable.
+	my $armliblist = &Armutl_ArmLibList;
+
+	# To check if DEFFILE keyword is used in the MMP file to supply the def file.
+	my $deffile = &main::DefFile;
+
+	if ($armliblist && $deffile)
+	{
+		return 1;
+	}
+	return 0;
+	
+}
+
+sub GetToolChainPreInclude {
+	my $preinclude_file = getConfigVariable('PREINCLUDE_OPTION');
+
+	$preinclude_file =~ s/\\/\//g;
+	return "$preinclude_file";
+}
+
+sub SelectLangOptions {
+	my ($Ext) = @_;
+	$preinclude = &GetToolChainPreInclude;
+	if ($Ext=~/^.cpp$/ || ($Ext=~/^.cia$/ && ($PlatName eq "GCCE"))) {
+		#Function Call Logger
+		return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+		return " \$(CPP_LANG_OPTION) $preinclude ";
+	}
+	if ($Ext=~/^.cia$/) {
+		return " \$(CIA_LANG_OPTION) ";
+	}
+	if ($Ext=~/^.c$/) {
+		my $CompilerOption = &main::CompilerOption("ARMCC");
+		if($CompilerOption =~ /--cpp/){
+			#Function Call Logger
+			return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+			return " \$(CPP_LANG_OPTION) $preinclude ";
+		}
+		else {
+			#Function Call Logger
+			return " \$(C_LANG_OPTION) " if ($Function_Call_Logger);
+			return " \$(C_LANG_OPTION) $preinclude ";
+		}
+	}
+	# To support .cc, .cxx, .c++ file extensions for Open Environment
+	elsif ($Ext=~/^(.cc|.cxx|.c\+\+)$/) {
+		#Function Call Logger
+		return " \$(CPP_LANG_OPTION) " if ($Function_Call_Logger);
+		return " \$(CPP_LANG_OPTION) $preinclude ";
+	}
+	return '';
+}
+
+sub IsMapOptAvail() {
+	open PIPE, "arm-none-symbianelf-g++ -v 2>&1 | ";
+	while(<PIPE>){
+
+		if($_ =~ /gcc version (.*) \(release\).*/i)
+		{
+			if($1 lt "3.4.3")
+			{
+				return 0;
+			}
+			elsif($_ =~ /gcc version (.*) \(release\) \(CodeSourcery ARM (.*) (\d*)\)/i)
+			{
+				if($1 eq "3.4.3" && uc $2 ne "Q1B" && $3 ge 2005)
+				{
+					return 1;
+				}
+				elsif($1 gt "3.4.3")
+				{
+					return 1;
+				}
+				else
+				{
+					return 0;
+				}
+			}
+
+		}
+
+	}
+	close PIPE;
+}
+
+sub StdCppTarget() {
+    
+    # STDCPP is supported
+    return 0 if (! main::StdCppSupport());
+    
+  	if ( main::NoStdCpp() ) { #MMP keyword NOSTDCPP set
+  	       return 0;
+  	}	       
+	
+	if ( main::StdCpp() ) { # MMP keyword STDCPP set.
+		return 1;
+	}
+	else {
+		return ( main::TrgType() =~ /^(STDEXE|STDDLL|STDLIB)$/io );
+	}
+}
+
+sub GetRTLibList() {
+
+	my $newlib = main::NewLib(); # Could have been set in the MMP file.
+
+	unless ($newlib) {
+		if ( StdCppTarget() ) {
+			$newlib = getConfigVariable('OE_NEW_LIB');
+		}
+		else {
+			$newlib = getConfigVariable('SYM_NEW_LIB');
+		}
+	}
+
+	my @RtLib;
+	my $list = "$newlib " . getConfigVariable('RUNTIME_LIBS_LIST') ;
+	if (length($list) >0)
+	{
+		@RtLib = split(/\s+/, $list);
+	}
+	return @RtLib;
+}
+
+sub GetOELibList() {
+	my @OELib;
+	my $list;
+	if (&main::IsWideCharMain()) {
+		$list = getConfigVariable('OE_EXE_LIBS_WCHAR');
+	}
+	else {
+		$list = getConfigVariable('OE_EXE_LIBS');
+	}
+
+	if (length($list) >0)
+	{
+		@OELib = split(/\s+/, $list);
+	}
+	return @OELib;
+}
+
+sub GetOEImportLibList() {
+	my @OEImportLib;
+	my $list;
+	$list = getConfigVariable('OE_IMPORT_LIBS');
+	
+	if (length($list) >0)
+	{
+		@OEImportLib = split(/\s+/, $list);
+	}
+	return @OEImportLib;
+}
+
+sub InitToolChain(@) {
+
+	if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+	{
+		my $RVCTBuildNumber;
+
+		($RVCTMajorVersion, $RVCTMinorVersion, $RVCTBuildNumber) = RVCT_plat2set::get_version_list($PlatName);
+
+		$RVCTVersion = "${RVCTMajorVersion}_${RVCTMinorVersion}";
+
+		my $aRVCTVersion = "${RVCTMajorVersion}.${RVCTMinorVersion}";
+		if (($aRVCTVersion == 2.2) && ($RVCTBuildNumber < 559))
+		{
+			warn "WARNING: When building using ABIV2 mode toolchain Compiler RVCT2.2 Build 559 or later is required.\n";
+		}
+		&Armutl_DoMmp(@_);
+	}
+	elsif ($RootName eq "GCCE")
+	{
+		($GCCEMajorVersion, $GCCEMinorVersion) = gcce_plat2set::get_version_list($Platname);
+
+		$GCCEVersion = "${GCCEMajorVersion}_${GCCEMinorVersion}";
+	}
+
+}
+
+my %BSF_keywords = (
+			COMMON_OPTIONS => 1,
+			THUMB_OPTIONS => 1,
+			ARM_OPTIONS => 1,
+			KERNEL_OPTIONS => 1,
+			INVARIANT_OPTIONS => 1,
+			LD_OPTIONS => 1,
+			AR_OPTIONS => 1,
+			DEBUG_FORMAT => 1
+		   );
+
+
+sub Read_BSF_Options() {
+        my %plat = (main::PlatRec());
+		my @Customization_Data = split(/\n/,$plat{'CUSTOMIZATION_DATA'});
+	foreach my $option (@Customization_Data) {
+			next if ($option =~ /^$/);
+			warn "Unrecognized BSF syntax: $option.\n"
+				unless ($option =~ /\s*(\S+)\s+(.+)$/);
+		my $key = uc $1;
+		my $val = $2;
+			warn "Unrecognized BSF keyword: $key.\n"
+				unless ($BSF_keywords{$key});
+		if ($key =~ /COMMON_OPTIONS/) {
+				push @commonOptions, $val;
+			next;
+		}
+		if ($key =~ /THUMB_OPTIONS/) {
+				push @thumbOptions, $val;
+			next;
+		}
+		if ($key =~ /ARM_OPTIONS/) {
+				push @armOptions, $val;
+			next;
+		}
+		if ($key =~ /KERNEL_OPTIONS/) {
+				push @kernelOptions, $val;
+			next;
+		}
+		if ($key =~ /INVARIANT_OPTIONS/) {
+				push @invariantOptions, $val;
+			next;
+		}
+		if ($key =~ /LD_OPTIONS/) {
+				push @linkerOptions, $val;
+			next;
+		}
+		if ($key =~ /AR_OPTIONS/) {
+				push @archiverOptions, $val;
+			next;
+		}
+		if ($key =~ /DEBUG_FORMAT/) {
+				push @debugFormat, $val;
+			next;
+		}
+
+	}
+}
+
+# Set the options passed from BSF file 
+# @param OptionName    - BSF Keyword using which the options would be overridden in the BSF file
+# @param Options       - List of options read from the BSF keyword
+sub Set_BSF_Options($$)
+{
+	my ($OptionName,$Options) = @_;
+	my @Fragments=();
+	foreach my $val (@{$Options})
+	{		
+		# Check if the value of BSF option is to be set or added/removed.
+		if($val =~ /\+\[.*\]\+|\-\[.*\]\-/)
+		{
+			if (@Fragments = Split_BSF_Options($val,'RemoveOptions'))
+			{
+				foreach my $Opt (@Fragments) 
+				{
+					# Remove trailing white spaces
+					$Opt =~ s/\s+$//;
+					# Substitute '=' with '%' which is a wild card character in makefile.
+					# This is required for cases where option to be removed contains '=' (e.g.'-march=armv5t').
+					# When such options are to be removed, "$(INVARIANT_OPTIONS:-march=armv5t=)" is written in the makefile.
+					# However, because of the occurence of '=', pattern match fails in the makefile and such options are not removed. 
+					# To resolve this, '=' is replaced with '%'  in the makefile so that the substitution pattern looks like 
+					# "$(INVARIANT_OPTIONS:-march%armv5t=)" in makefile (e.g."$(INVARIANT_OPTIONS:-march%armv5t=)").
+					$Opt =~ s/=/%/;
+					&main::Output(
+						"$OptionName := \$($OptionName:$Opt=)",					
+						"\n"
+					);
+				}					
+				@Fragments=();
+			}
+			if (@Fragments = Split_BSF_Options($val,'AddOptions')) 
+			{
+				&main::Output(
+					"$OptionName += @Fragments ",
+					"\n"
+				);
+				@Fragments=();
+			}
+			
+			# Warn if options are not present in the form '+[...]+' or '-[...]-'
+			$val =~ s/\+\[.*?\]\+|\-\[.*?\]\-//g;
+			if($val !~ /^\s*$/)
+			{
+				print "Warning: Ignoring option(s) \"$val\" for $OptionName as option(s) should be in the form '+[...]+' or '-[...]-.\n";
+			}
+		}
+		else
+		{
+			&main::Output(
+				"$OptionName = $val ",
+				"\n"
+			);
+		}		
+	}
+	&main::Output(					
+		"\n"
+	);
+}
+
+# Split BSF options to find options which are to be added/removed
+# @param String      - List of options present in form '+[...]+' or '-[....]-'
+# @param $Task       - Variable to decide whether to return options to be addded or options to be removed
+sub Split_BSF_Options($$)
+{
+	my ($String,$Task) = @_;
+    my @Result = ();
+	my @Fragments = ();
+	my $Pattern = '';
+	# Get the toolchain specific option prefix to segregate the options.
+	my $OptionPrefix = getConfigVariable('OPTION_PREFIX');
+	
+	if ($Task eq 'AddOptions')
+	{
+		# Get the options which are to be added (present in the form '+[...]+')
+		@Fragments = $String =~ /\+\[(.*?)\]\+/g;	
+	}
+	elsif ($Task eq 'RemoveOptions') 
+	{
+		# Get the options which are to be removed (present in the form '-[...]-')
+		@Fragments = $String =~ /\-\[(.*?)\]\-/g;
+	}	
+
+	# Set the value of '$Pattern' which is required to segregate one option from another based on the option prefix.
+	if($OptionPrefix) 
+	{
+		$Pattern = $OptionPrefix.'\S+\s*(?!'.$OptionPrefix.')\S*';
+	}
+	else 
+	{
+		# If option prefix is not set in the configuration make file, then set default
+		# option prefix as '-' or '--'.
+		$Pattern = '-{1,2}\S+\s*(?!-)\S*';
+	}
+
+	foreach my $Val (@Fragments) 
+	{
+		my @Opt = $Val =~ /$Pattern/g;
+		push @Result,@Opt;				
+	}
+	return @Result;	
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+sub GetLibList() {
+	my @LibList;
+	my @StaticLibList;
+	my $list = getConfigVariable('STATIC_LIBS_LIST') ;
+
+	if (length($list) >0)
+	{
+		@StaticLibList = split(/\s+/, $list);
+	}
+	if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat) {
+		@LibList=&Armutl_ArmLibList;
+		if(@LibList==0) {
+			my $LibDir = Armutl_ArmLibDir();
+			# convert '/' to  '\'  if there are some '/'
+			$LibDir =~ s#/#\\#g;
+			if (@StaticLibList) {
+				foreach my $lib (@StaticLibList) {
+					push @LibList, ("$LibDir\\$lib");
+				}
+			}
+		}
+	}
+	else
+	{
+		@LibList = ('$(STATIC_LIBS_LIST)');
+	}
+	return @LibList;
+}
+
+sub GetToolChainAsmFileList() {
+	my @FileList;
+	@FileList=&Armutl_AsmFileList;
+	if(@FileList)
+	{
+		return @FileList;
+	}
+	return;
+}
+
+sub IsTargetRT() {
+	my $RTtarget=&Armutl_ArmRT;
+	if($RTtarget)
+	{
+		return $RTtarget;
+	}
+	return;
+}
+
+sub GetToolChainIncDir {
+	if($PlatName eq "ARMV5" || $PlatName eq "ARMV5_ABIV2" || $CustomizedARMV5Plat)
+	{
+  		#the ToolChainIncDir's value depends on the key word ARMINC in mmp file
+  		return &Armutl_ArmIncDir;
+	}
+	else
+	{
+		my $compiler_inc_path = getConfigVariable('COMPILER_INCLUDE_PATH');
+		$compiler_inc_path =~ s/^\s+//g;
+		return ($compiler_inc_path);
+	}
+}
+
+my $useLinkerFeedBack = 0;
+
+sub LinkerFeedBackFile() {
+  return unless $useLinkerFeedBack;
+  my $Trg = &main::Trg;
+  return "$Trg.lfb";
+}
+
+sub LinkerFeedBackOption() {
+	return "" unless $useLinkerFeedBack;
+	my $BasicTrgType=&main::BasicTrgType;
+	return "" unless ($BasicTrgType=~/^(DLL|EXE)/o);
+	my $file = LinkerFeedBackFile();
+	return "/$(FEEDBACK_FILE_OPTION) $file ";
+
+}
+
+sub getConfigVariable
+{
+    my ($variable) = @_;
+    initialiseConfigVariables();
+    return $configVariables{$variable};
+}
+
+sub initialiseConfigVariables()
+{
+    if (!keys(%configVariables))
+    {
+		%configVariables = BPABIutl_Get_Config_Variables($PlatName);
+
+		if (!keys(%configVariables))
+		{
+			# no variables were extracted from configuration file.
+			&main::FatalError("Cannot extract configuration variables for $PlatName");
+		}
+    }
+}
+
+sub PMSupportsFeatureVariants
+{
+	return 1;
+}
+# modified start: makefile improvement 
+sub checkVMAPFiles
+{
+	my %srcSet = %{&main::getSrcSet};
+	my %featureVariantInfo = &main::FeatureVariantInfo();
+	my $vmapfile = &main::Trg.".".$featureVariantInfo{NAME}.".vmap";
+	my $mmpFile = &main::MmpFile;
+	if ( $vmapfile ){
+		&main::Output(
+			"\n",
+			"\n",
+			"# Rules to check out the VMAP files",
+			"\n",
+			"\n",
+		);
+		&main::Output(
+			"CHECKVMAPUREL : ",
+			"\$(EPOCTRG)\\urel\\",
+			$vmapfile,
+			" \n",
+			"\$(EPOCTRG)\\urel\\",
+			$vmapfile,
+			" : \\\n",
+			"\t",
+			$mmpFile,
+		);
+		foreach my $srcfile (sort keys(%srcSet))
+		{
+			&main::Output(
+				" \\\n \t",
+				$srcfile,
+			);
+		}
+		&main::Output(
+			"\n",
+			"\t-\$(ERASE) \$(EPOCTRG)\\urel\\",
+			$vmapfile,
+			"\n",
+			"\n",
+		);
+		&main::Output(
+			"CHECKVMAPUDEB : ",
+			"\$(EPOCTRG)\\udeb\\",
+			$vmapfile,
+			" \n",
+			"\$(EPOCTRG)\\udeb\\",
+			$vmapfile,
+			" : \\\n",
+			"\t",
+			$mmpFile,
+		);
+		foreach my $srcfile (sort keys(%srcSet))
+		{
+			&main::Output(
+				" \\\n \t",
+				$srcfile,
+			);
+		}
+		&main::Output(
+			"\n",
+			"\t-\$(ERASE) \$(EPOCTRG)\\udeb\\",
+			$vmapfile,
+			"\n",
+			"\n",
+		);
+	}
+}
+# modified by SV end: makefile improvement 
+# modified end: makefile improvement 
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_codewarrior.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1497 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_codewarrior;
+
+# declare variables global for module
+my @Win32LibList=();
+my $Win32StdHeaders;
+my $BaseAddressFlag;
+my $Win32Resrc;
+
+my $MWCC;
+my $MWLD;
+my $MWIncludePath;
+my $MWIncludeVar;
+my $CWVersion;
+my $CWVersionReadable;
+my $CWBuildNum;
+my $CWRuntimeLibs="";
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+
+	PMPlatCheckSource
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use Winutl;
+use cl_generic;
+use E32Variant;
+
+my $NamedSymLkup = 0;
+
+my $stdcpp_tag_file = 'tag_coff';
+my $stdcpp_tag_path = '$(EPOCROOT)epoc32\tools\tag';
+
+sub RoundUp1k($) {
+	# Accept C hexadecimal number (0xNNN).  Convert argument to Kb
+	# rounded up to the next 1kb boundary.
+	use integer;
+	return (hex($_[0]) + 1023) / 1024;
+}
+
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+sub PMCheckPlatformL {
+
+	my $IsProxyWrapperOption=&main::ProxyWrapperOption();
+
+	# check version of CodeWarrior for Symbian OS
+	
+	if (defined($ENV{MWCSym2Includes})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{MWSym2Libraries})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{CWFolder})) {
+		$MWCC = "mwcc.exe";
+		$MWLD = "mwld.exe";
+	}
+	if (!defined($MWCC)) {
+		die "ERROR: Unable to identify a valid CodeWarrior for Symbian OS installation\n";
+	}
+
+	# determine default include path
+	
+	$MWIncludeVar = 'MWCIncludes';	# default, even if it doesn't exist
+	$MWIncludePath = '';			# default is empty
+	
+	foreach my $var ('MWCSym2Includes','MWCWinx86Includes','MWCIncludes') {
+		if (defined($ENV{$var})) {
+			$MWIncludePath = $ENV{$var};
+			$MWIncludeVar = $var;
+			last;
+		}
+	}
+
+	open PIPE, "$MWCC |", or &main::FatalError( "Failed to find version information for $MWCC \n");
+	while (<PIPE>) {
+		if($_ =~ /Version\s+(\d+)\.(\d+)\.(\d+)\s+build\s+(\d+)/) {
+			my $MajorVer = $1;
+			my $MinorVer = $2;
+			my $PatchNum = $3;
+			
+			$CWBuildNum = $4;
+
+            $CWVersionReadable = "$1.$2.$3 build $4";
+
+#			The CW compiler documentation says that the compiler version is a 2-byte value as
+#			0xMnpp (the corresponding CW's pre-defined macro is __MWERKS__), where,
+#				M is the major version number (which means it is accomodated in the first 4 bits, 
+#				n is the minor version number (which means it is accomodated in the next 4 bits, 
+#				pp is the patch number (which means it is accomodated in the next 8 bits.
+#			Here, an integer is formed from these 3 values to uniquely identify the compiler version.
+			$CWVersion = ($MajorVer << 12) + ($MinorVer << 8) + $PatchNum;
+			last;
+		}
+	}
+	close PIPE;
+	
+	if ($IsProxyWrapperOption){
+		$MWCC = "$ENV{ABLD_COMPWRAP} " . $MWCC;
+		$MWLD = "$ENV{ABLD_COMPWRAP} " . $MWLD;
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, $MWIncludePath);
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	if ($BaseAddressFlag ne "") {
+		$BaseAddressFlag=" -imagebase \"$BaseAddressFlag\"";
+	}
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32Resrc=&Winutl_Win32Resrc;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+sub PMPlatCheckSource () {
+	&Winutl_CheckSourceMMPMetaData ();
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	my $AifStructRef=&main::AifStructRef;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+
+	push @MacroList, "__SYMBIAN_STDCPP_SUPPORT__" if StdCppTarget();
+	
+    my $VariantFile=&main::VariantFile();
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $WarningLevel=&main::CompilerOption("CW");
+	my $LinkAs=&main::LinkAs;
+
+	Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+	my $TrgDir="";
+	my $AifTrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\$(TRGDIR)\\";
+		$AifTrgDir=$TrgDir;
+	}
+
+# Handle migration of binaries to secure location
+
+	&Winutl_AdjustTargetPath(\$TrgDir);
+	
+# Change - mwwinrc.exe uses MWWinx86Includes or MWCIncludes, but some installations
+# fail to install either. Set MWCIncludes from the chosen variable as part
+# of the Makefile.
+	if (!defined($ENV{MWCIncludes}) && $MWIncludeVar ne 'MWCIncludes') {
+		&main::Output(
+			"\n",
+			"MWCIncludes:=\$($MWIncludeVar)\n",
+			"export MWCIncludes\n",
+			"\n"
+		);
+	}
+	if( ($CWVersion == 0x3205 && $CWBuildNum == 465)){
+		if($TrgType =~ /^(STDDLL|STDEXE|STDLIB)$/o) {
+		&main::Output(
+				"\n",
+				"MWSym2LibraryFiles:=msl_all_mse_symbian_d.lib;gdi32.lib;user32.lib;kernel32.lib;\n",
+				"export MWSym2LibraryFiles\n",
+				"\n"
+			);
+		}
+		else {
+			&main::Output(
+				"\n",
+				"MWSym2LibraryFiles:=msl_all_static_mse_symbian_d.lib;gdi32.lib;user32.lib;kernel32.lib;\n",
+				"export MWSym2LibraryFiles\n",
+				"\n"
+			);
+		}
+	}
+		
+	if($WarningLevel =~ /\-cwd\s\s*include/){	
+		&main::Output(
+			"# EPOC DEFINITIONS\n",
+			"\n",
+			"INCDIR  = -cwd include -i-"
+		);
+	}
+	else {
+		&main::Output(
+			"# EPOC DEFINITIONS\n",
+			"\n",
+			"INCDIR  = -cwd source -i-"
+		);
+	}
+	foreach (@ChopUserIncPaths,@ChopSysIncPaths) {
+		&main::Output(
+			" \\\n -i \"$_\""
+		);
+	}
+	use Pathutl;
+	if($VariantFile){
+	    my $variantFilePath = Path_Split('Path',$VariantFile);
+	    $VariantFile  = Path_Split('FILE',$VariantFile);
+	    # workaround for codewarrior defect:
+	    # codewarrior at the moment doesn't accept an absolute path with the
+	    # the -include option unless it contains a drive letter, this is solved
+	    # by including the directory and the file separately
+	    &main::Output("\\\n -i \"$variantFilePath \" -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWFLAGS ="		
+	);
+
+	# 'wchar_t' should be treated as default datatype for OE targets because when wchar_t option is turned off, 
+	# using 'wchar_t' defaults to the unsigned short int and wrong functionality. 
+	if ( $TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io || StdCppTarget() ) 
+	{
+		&main::Output(
+			" -wchar_t on"
+		);	
+	}
+	else 
+	{
+		&main::Output(
+			" -wchar_t off"
+		);
+	}
+
+	&main::Output(		
+		" -align 4",		# long alignment
+		" -warnings on",	# selection of warnings
+		" -w nohidevirtual",	# turn off "hides inherited virtual function" warning
+		   ",nounusedexpr",	# turn off "expression has no side effect" warning
+		" -msgstyle gcc",	# use GCC-style message format
+		# " -strict on",		# strict ANSI/ISO C++ checking
+		" -enum int",		# use int for enumeration types
+		" -str pool",		# pool strings into a single data object
+		" -exc ms",			# SEH C++ exception implementation
+		" -trigraphs on",		# Enable recognition of C-style trigraphs, e.g. '??/' -> '\'
+		" $WarningLevel"		
+	
+	);
+
+	if ($Win32StdHeaders or &main::Plat eq 'TOOLS') {
+		&main::Output(
+			" -stdinc"		# insist because mwccsym2 has -nostdinc as the default(?)
+		);
+	}
+	else {
+		&main::Output(
+			" -nostdinc"	# insist because mwcc has -stdinc as the default.
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWDEFS  = "
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -d \"$_\""
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CW$_ = $MWCC"
+		);
+		if (/DEB$/o) {
+			&main::Output(
+				' -g -O0'   # debug information, no optimisation
+			);
+#			euser change to apply inlining on the _NAKED functions
+
+#			stdexe/stddll change so that the inline functions dont 
+#			get exported (in debug build) causing a different export list for debug and release builds
+			if ($BaseTrg!~/^EUSER$/oi && $TrgType !~ /^(STDEXE|STDDLL)$/io) {
+				&main::Output(
+					' -inline off'
+				);
+			}	
+		}
+		elsif (/REL$/o) {
+			&main::Output(
+				' -O4,s'	# highest level of optimisation, optimise for space
+			);
+		}
+
+		if( ($CWVersion == 0x3205 && $CWBuildNum >= 465) || $CWVersion > 0x3205){
+			if ($TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io) {
+				&main::Output(
+					' -runtime dllmulti'
+				);
+			}
+			else {
+				&main::Output(
+					' -runtime staticmulti'
+				);
+			}
+		}
+
+		&main::Output(
+			' $(CWFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -d $_"
+			);
+		}
+		&main::Output(
+			" \$(CWDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n",
+				"\t", &Generic_Quote("\$(EPOCTRG$_)\\$TrgDir$Trg")
+			);
+			if (&Winutl_CopyForStaticLinkage) {
+				&main::Output(
+					" \\\n",
+					"\t", &Generic_Quote("\$(EPOCTRG$_)\\$Trg")
+				);
+			}
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	foreach (@BldList) {
+		my $makework="MAKEWORK$_";
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : $makework"
+		);
+
+		my $BitMapRef;
+		foreach $BitMapRef (@$BitMapStructRef) {
+			my $file="\$(EPOCTRG$_)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t", &Generic_Quote($file)
+			);
+		}
+		undef $BitMapRef;
+
+		my $ResourceRef;
+		foreach $ResourceRef (@$ResourceStructRef) {
+			if(! defined $$ResourceRef{Hdronly}) {
+				my $file="\$(EPOCTRG$_)\\$$ResourceRef{Trg}";
+				&Generic_MakeWorkFile($makework,$file);
+				&main::Output(	# must come before main target because source for target will depend on the
+				" \\\n",		# *.rsg file in $EPOCIncPath
+				"\t", &Generic_Quote("$file")
+				);
+			}
+		}
+		undef $ResourceRef;
+
+		my $AifRef;
+		foreach $AifRef (@$AifStructRef) {
+			my $file="\$(EPOCTRG$_)\\$AifTrgDir$$AifRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t", &Generic_Quote($file)
+			);
+		}
+		undef $AifRef;
+
+		&main::Output(
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"\n",
+		"# REAL TARGET - LIBRARY\n",
+		"\n",
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg;
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), "\n",
+					"\n",
+					&Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), " : ",
+					&Generic_Quote($DefFile), "\n",
+					"\tperl -S prepdef.pl ",&Generic_Quote($DefFile)," \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+					"\t$MWLD \"\$(EPOCBLD)\\$ExportLibrary.prep.def\" -importlib -o \$\@",
+					" -addcommand \"out:$LibLinkAs\" -warnings off",
+					"\n"
+				);
+			} else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\".\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		} else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE :\n"
+	);
+	if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n"
+		);
+	}
+	else {
+		&main::Output( "\tperl -e \"print \\\"warning: freeze could not be supported or \\
+		         you need to declare an explicitly specified def file using the keyword \\
+			 DEFFILE in the MMP file!\\n\\\"\""); 
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB");
+
+	&Generic_Releaseables;
+}
+
+my $uidfile;
+sub PMBld {
+
+	my $AifStructRef=&main::AifStructRef;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $RelPath=&main::RelPath;
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	# Get the information regarding supporting Compiler Wrapper Option
+	my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+
+	$NamedSymLkup = 1 if($TrgType =~ /^(STDDLL|STDEXE)$/o);
+
+	$uidfile = "$BaseTrg.UID";
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+	# OE Glue Code
+	my @oe_exe_libs=("libcrt0.lib");
+	my @oe_exe_libs_wchar=("libwcrt0.lib");
+
+	# OE Import Libraries
+	my @oe_import_libs=("euser.lib"); 
+ 	if(not (grep /^libc.lib$/i, @LibList)){
+ 			push @oe_import_libs, "libc.lib";
+ 	}	   	
+	   	
+   # Handle migration of binaries to secure location
+
+	my $BLDTRGPATH = "";
+	my $AIFBLDTRGPATH = "";
+	if ($TrgPath) {
+		$BLDTRGPATH = "\$(TRGDIR)\\";	    # handles TARGETPATH
+		$AIFBLDTRGPATH = $BLDTRGPATH;
+		&Winutl_AdjustTargetPath(\$BLDTRGPATH);
+	}
+	$BLDTRGPATH = "\$(EPOCTRG$Bld)\\".$BLDTRGPATH;
+	$AIFBLDTRGPATH = "\$(EPOCTRG$Bld)\\".$AIFBLDTRGPATH;
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	
+	unless (&main::Plat() eq 'TOOLS') {
+		if ($TrgType !~ /^IMPLIB$/io) {
+			if ($TrgType !~ /^NONE/io) {
+				push @releaseables, "$BLDTRGPATH$Trg";
+				if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+					push @releaseables,"$BLDTRGPATH$Trg.map";
+				}
+				if (&Winutl_CopyForStaticLinkage) {
+					push @releaseables, "\$(EPOCTRG$Bld)\\$Trg";
+				}
+			}
+			my $BitMapRef;
+			foreach $BitMapRef (@$BitMapStructRef) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			}
+			my $ResourceRef;
+			foreach $ResourceRef (@$ResourceStructRef) {
+				if(! defined $$ResourceRef{Hdronly}) {
+					push @releaseables,"\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}";
+				}
+			}
+			my $AifRef;
+			foreach $AifRef (@$AifStructRef) {
+				push @releaseables, "$AIFBLDTRGPATH$$AifRef{Trg}";
+			}
+		}
+		if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+			push @releaseables, "\$(EPOCLIB$Bld)\\$ExportLibrary.lib";
+		}
+		if ($Bld=~/DEB$/o) {
+			# debugging support files?
+		}
+	}
+	else {
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			my $toolspath=&main::EPOCToolsPath();
+			push @releaseables, "$toolspath$Trg";
+		}
+	}
+
+
+	my $firstlib = "";
+	my $newlib = "";
+
+	if ( $BasicTrgType =~ /^(EXE|DLL)$/o && main::Plat() ne 'TOOLS' ) {
+
+		$firstlib = main::FirstLib();
+
+		unless ( StdCppTarget() || ! main::StdCppSupport()) {
+
+			$newlib = main::NewLib(); # Check if has been set in the MMP file.
+
+			unless ($newlib) {
+				if ( main::SystemTrg() ) {
+
+					$newlib = 'scppnwdl_kern.lib';
+				}
+				else {
+					$newlib = 'scppnwdl.lib';
+				}
+			}
+		}
+	}
+
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	my $adjustedTargetPath=$TrgPath;
+	&Winutl_AdjustTargetPath(\$adjustedTargetPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", "$RelPath$adjustedTargetPath");
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+		$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+		
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	#Compiler wrapper support starts
+	if($IsCompilerWrapperOption)
+	{
+	 	my $Platcmpwrap=&main::Plat;
+	 	
+		&main::Output(
+			"COMPWRAP$Bld : OUTPUT_NAME = ",
+			"$Platcmpwrap\_$Bld",
+			"\n"
+		);
+	 	
+		&main::Output(
+			"COMPWRAP$Bld : MAKEWORK$Bld"
+		);
+
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+			
+			&main::Output(
+				" \\\n\tCOMPWRAP$Bld$BaseSrc"
+			);
+		}
+
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+	#--Compiler wrapper support ends
+
+	# Flag that tells whether to run checklib.exe on static libraries.
+	my $run_checklib = 0;
+
+	if (@StatLibList && $BasicTrgType =~ /^(EXE|DLL)$/o && !main::SystemTrg() && main::StdCppSupport()) {
+		# There are user-added static libraries. They should be checked for
+		# consistent use of operator new.
+		$run_checklib = 1;
+
+		#Create a make variable for the libraries.
+		main::Output("\nUSER_ADDED_ARCHIVES_$Bld=");
+		for (@StatLibList) {
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+			);
+		}
+
+		main::Output("\n\n");
+	}
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+		);
+	}
+	
+	#OE Glue Code
+	if ($TrgType=~/^STDEXE$/o) {
+		if (&main::IsWideCharMain()) {
+			foreach (@oe_exe_libs_wchar) {
+				&main::Output(
+					" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+				);
+			}
+		}
+		else {
+			foreach (@oe_exe_libs) {
+				&main::Output(
+					" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+				);
+			}
+		}
+	}
+
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+	}
+
+	#OE Import Libraries
+	if ($TrgType =~ /^STDEXE$/o || $TrgType =~ /^STDDLL$/o) {
+		foreach (@oe_import_libs) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+		}
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_OBJS$Bld="
+	);
+	my $have_uidfile = 0;
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		if ($BaseSrc eq $uidfile) {
+			$have_uidfile = 1;
+			next;
+		}
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+   		);
+   	}
+
+	my $add_stdcpp_tag = 0;
+
+	if ($BasicTrgType=~/^LIB$/o && StdCppTarget() ) {
+		$add_stdcpp_tag = 1;
+	}
+
+	if ($add_stdcpp_tag) {
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("$stdcpp_tag_path\\$stdcpp_tag_file")
+		);
+	}
+	if ($Win32Resrc) {
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res")
+		);
+	}
+	if ($have_uidfile) {
+		# ensure that the uid file is at the end of the list, as it's implicit in
+		# CodeWarrior IDE projects.
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg"."_UID_.o")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::OutFormat(
+		"COMMON_LINK_FLAGS$Bld=",
+		' -msgstyle gcc',
+		' -stdlib'		# use default runtime library for compiler help functions
+	);
+	if ($MWLD =~ /mwcc.exe/) {
+		&main::OutFormat(
+			' -warnings on'	# on by default in mwccsym2.exe
+		);
+	}
+
+	main::OutFormat(" \"\$(EPOCSTATLINK$Bld)\\$firstlib\" ") if $firstlib;
+	main::OutFormat(" \"\$(EPOCSTATLINK$Bld)\\$newlib\" ")   if $newlib;
+
+	foreach my $lib (@Win32LibList) {
+		 my $win32lib = $lib;    # take a copy, to avoid updating contents of Win32LibList!
+		$win32lib = "-l$win32lib" unless ($win32lib =~ /\\/);
+		&main::OutFormat(
+			" ",lc $win32lib
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -main __Win32DllMain@12',
+			' -shared'
+		);
+	}
+	elsif ($TrgType=~/^EXEXP$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -noentry',
+			' -shared'
+		);
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				' -m "?_E32Bootstrap@@YGXXZ"'
+			);
+		}
+	}
+	if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) {
+		&main::OutFormat(
+			' -subsystem console'
+		);
+	}
+	else {
+		&main::OutFormat(
+			' -subsystem windows'
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::OutFormat(
+			' -heapreserve=',RoundUp1k($HeapSize{Max}),' -heapcommit=',RoundUp1k($HeapSize{Min})
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' -g'
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if($TrgType =~/^(STDEXE|STDDLL|STDLIB)$/o) {
+		if(! (( $CWVersion == 0x3205 && $CWBuildNum >= 465 ) || $CWVersion > 0x3205 ) ) {
+			&main::FatalError("TargetType $TrgType requires CodeWarrior version `3.2.5 build 465' or later but you have $CWVersionReadable.");
+		}
+	}
+
+	my $EntrySymbol='';
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $NamedSymLkup) {
+		my $Include="";
+		if ($BasicTrgType=~/^DLL$/o) {
+			$Include="-m __E32Dll";
+			$EntrySymbol='__E32Dll';
+		}
+		else {
+			$Include="-m __E32Startup";
+			$EntrySymbol='__E32Startup';
+		}
+		&main::Output(
+			"STAGE1_LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+			" -o \"\$(EPOCBLD$Bld)\\$Trg\"");
+		
+		if ($NamedSymLkup) {
+			&main::Output(
+			" -export all",
+			" -map \"\$(EPOCBLD$Bld)\\$Trg.map\""
+			);
+		}
+		else {
+			&main::Output(' -export dllexport');
+		}
+
+		if($CWRuntimeLibs ne "") {
+			&main::Output(
+				" -l$CWRuntimeLibs "
+			);
+		}
+		if($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+			&main::Output(
+				" $Include",
+				' -nocompactimportlib', 
+				" -implib \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"",
+				" -addcommand \"out:$Trg\" -warnings off",
+				"\n",
+			);
+		}
+		else{
+#		Dont generate import libs for an Exe
+			&main::Output(
+				" $Include",
+				" -addcommand \"out:$Trg\" -warnings off",
+				"\n",
+			);
+		}
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	&main::Output(
+		"LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+		" -o \"$BLDTRGPATH$Trg\" ", &main::LinkerOption("CW") 
+	);
+	if($CWRuntimeLibs ne "") {
+			&main::Output(
+				" -l$CWRuntimeLibs "
+			);
+	}
+	if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+		# Generate map file for release build executables
+		&main::Output(
+			" -map \"$BLDTRGPATH$Trg.map\"", 
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			" -f \"\$(EPOCBLD)\\$ExportLibrary.def\"",	# use generated .DEF file
+		);
+		if (&main::ExportUnfrozen) {
+			&main::Output(
+				" -implib \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"",
+				" -addcommand \"out:$Trg\" -warnings off"
+			);
+		}
+		else {
+			&main::Output(
+				' -noimplib'
+			);
+		}
+	}
+	else {
+		&main::Output(
+			' -noimplib'
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		&Generic_Quote("$BLDTRGPATH$Trg"), " : \$(LINK_OBJS$Bld) "
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			&Generic_Quote($DefFile)
+		);
+	}
+
+	main::Output(" ", Generic_Quote("\$(EPOCSTATLINK$Bld)\\$firstlib") ) if $firstlib;
+	main::Output(" ", Generic_Quote("\$(EPOCSTATLINK$Bld)\\$newlib") )   if $newlib;
+
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+	my $checklib = "checklib";
+
+	if ( StdCppTarget() ) {
+		$checklib .= " stdc++ --coff";
+	}
+	else {
+		$checklib .= " symc++ --coff";
+	}
+
+	&main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" ) if ($run_checklib);
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"\t$MWLD \$(STAGE1_LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+		);
+		if(!$NamedSymLkup){
+#		Dont delete the binary as we need to extract symbol/dependency info
+			&main::Output(
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+			);
+		}
+
+#		Generate an export info file
+		my $show_options = "names,verbose";
+		$show_options = "names,unmangled,verbose" if ($MWLD =~ /mwldsym2.exe/);
+		&main::Output(
+			"\t$MWLD -S -show only,$show_options -o \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+
+#		call makedef to reorder the export information
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\""
+		);
+		if (SysTrg()) {
+    			&main::Output( "\t\t-SystemTargetType \\\n" );
+	    	}		
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				" -Frzfile \"$DefFile\""
+			);
+		}
+		my $Export;
+		my $Ordinal=1;
+		foreach $Export (&main::Exports) {
+#				replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+			$Export=~s-\$-\$\$-go;
+			&main::Output(
+				" -$Ordinal $Export"
+			);
+			$Ordinal++;
+		}
+		&main::Output(" -sym_name_lkup") if($NamedSymLkup);
+
+		&main::Output(" -export_entrypoint_E32Dll") if ($TrgType =~ /^STDDLL$/i);  # Workaround: To export entry point _E32DLL for target type STDDLL
+
+		&main::Output(
+			" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+	}
+	elsif($NamedSymLkup) {
+#	2-stage linking required for all those targets that enable symbol lookup
+		&main::Output( "\t$checklib ","\$(USER_ADDED_ARCHIVES_$Bld)\n" ) if ($run_checklib);
+		&main::Output(
+			"\t$MWLD \$(STAGE1_LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+		);
+	}
+	my $gen_src_file = "";
+	if($NamedSymLkup){
+#		pick the symbols and the dependencies.
+		&main::Output(
+			"\t$MWLD -S -show only,names,verbose -o \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+		);
+
+#		Generate the source file with symbol and dependency information in the named data segment.
+		$gen_src_file = "${BaseTrg}_SYM_";
+		
+		if($BasicTrgType=~/^EXE$/o){
+#		For an EXE, generate the symbols as well as the dependencies
+			&main::Output(
+				"\tperl -S sym_lkup_util.pl -o \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -sym \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" -map \"\$(EPOCBLD$Bld)\\$Trg.map\"\n"
+			);
+		}
+		else {
+#		For DLLs, generate only the dependencies.
+			&main::Output(
+				"\tperl -S sym_lkup_util.pl -o \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -sym \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\" --ignore_export_dir\n"
+			);
+		}
+		main::Output(
+			"\t\$(CW$Bld) -c \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\" -o \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		);
+	}
+
+#	Perform the final link step
+	&main::Output(
+		"\t$MWLD "
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"-library "
+		);
+
+		&main::Output( "-l $stdcpp_tag_path ") if ($add_stdcpp_tag);
+	}
+	
+	if($NamedSymLkup){
+#	Final linking and cleanup
+		main::Output(
+		"\$(LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))",
+		" \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$gen_src_file.cpp\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$gen_src_file.o\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.sym\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg.map\"\n",
+		"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+		);
+	}
+	else {
+		&main::Output(
+			"\$(LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+		);
+	}
+	
+	
+	if (&main::Plat eq 'TOOLS') {
+		&main::Output(
+			"\tcopy \"BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+	}
+	if (&Winutl_CopyForStaticLinkage) {
+		&Generic_MakeWorkDir("MAKEWORK$Bld", "\$(EPOCTRG$Bld)");
+		&main::Output(
+			"\n",
+			&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ", 
+			&Generic_Quote("$BLDTRGPATH$Trg"), "\n",
+			"\t", &Generic_CopyAction(),
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $BitMapRef=&main::BitMapRef;
+
+	my $ChopTrgPath="";
+	if ($$BitMapRef{TrgPath}) {
+		$ChopTrgPath.="\\$$BitMapRef{TrgPath}";
+		chop $ChopTrgPath;
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$ChopTrgPath";
+		&main::Output(
+			&Generic_Quote("$path\\$$BitMapRef{Trg}"), " : ", 
+			&Generic_Quote("$$BitMapRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $ResourceRef=&main::ResourceRef;
+	my @BldList=&main::BldList;
+
+	foreach my $Bld (@BldList) 
+	{
+		if(! defined $$ResourceRef{Hdronly})
+		{
+			&main::Output(
+				&Generic_Quote("\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}"), " : ", 
+				&Generic_Quote("$$ResourceRef{GenericTrg}"), "\n",
+				"\t", &Generic_CopyAction(),
+				"\n"
+			);
+		}
+	}
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $AifRef=&main::AifRef;
+	my $TrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\\\$(TRGDIR)";
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$TrgDir";
+		&main::Output(
+			&Generic_Quote("$path\\$$AifRef{Trg}"), " : ",
+			&Generic_Quote("$$AifRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=&main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext=&main::ExtSrc;
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+	my $TrgType=&main::TrgType;
+	# Get the information regarding supporting Compiler Wrapper Option
+	my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -lang c++ -o \"\$\@\" -c \"$SrcPath$Src\"\n",
+			"\n",
+#			assembler listing target - uses implicit rule to do disassembly
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$Plat.lst"),
+			"\n"
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\" "
+		);
+		# When building for OE target type and source file is of C++ type, 
+ 		# then pass macro "__wchar_t_defined" to indicate that datatype "wchar_t" is enabled.
+ 		if ( StdCppTarget() || $TrgType =~ /^(STDEXE|STDDLL|STDLIB)$/io ) 
+ 		{			
+ 			if (lc($Ext) =~ /^(.cpp|.cc|.cxx|.c\+\+)$/)
+ 			{
+ 				&main::Output(
+ 					" -d \"__wchar_t_defined\" "					
+ 				);			
+ 			}
+ 		}
+ 		&main::Output(
+   			"\n",
+ 			"\n"
+ 		);
+		&main::Output(
+#			assembler listing target - uses implicit rule to do disassembly
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$Plat.lst"),
+			"\n"
+		);
+
+		# Output files if Compiler Wrapper Option is specified
+		if($IsCompilerWrapperOption)
+		{
+			my $Platcmpwrap=&main::Plat;
+			&main::Output(
+				"COMPWRAP$Bld$BaseSrc : ",
+				&Generic_Quote("$SrcPath$Src"), "\n",
+				"\techo Analysing $Src\n",
+				"\t\$(COMPWRAP) \$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\" ",
+				"\n\n"
+			);
+
+		}
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	my $show_options = "source";
+	$show_options = "source,unmangled,comments" if ($MWLD =~ /mwldsym2.exe/);
+	
+	&main::Output(
+		"\n",
+		"# Implicit rule for generating .lis files\n",
+		"\n",
+		".SUFFIXES : .lis .o\n",
+		"\n",
+		".o.lis:\n",
+		"\t$MWLD -S -show $show_options \$< -o \$\@\n",
+		"\n",
+		"\n"
+	);
+
+	if ($Win32Resrc) {
+		my @BldList=&main::BldList;
+		my @DepList=&main::Deps_GenDependsL($Win32Resrc);
+
+		&main::Output(
+			"# Win32 Resource $Win32Resrc\n",
+			"\n",
+			"DEPEND="
+		);
+		foreach (@DepList) {
+			&main::Output(
+				" \\\n\t", &Generic_Quote($_)
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	
+		my $Bld;
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		my $respath=&main::Path_Chop(&main::Path_Split('Path',$Win32Resrc));
+		foreach $Bld (@BldList) {
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res"), " : ",
+				&Generic_Quote($Win32Resrc), " \$(DEPEND)\n",
+				"\tmwwinrc -o \$\@ \"$Win32Resrc\"\n",
+				"\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+sub StdCppTarget() {
+    
+    # STDCPP is supported
+    return 0 if (! main::StdCppSupport());
+    
+	if ( main::NoStdCpp()) { # MMP keyword NOSTDCPP set
+		return 0;
+	}
+	
+	if ( main::StdCpp() ) { # MMP keyword STDCPP set.
+		return 1;
+	}
+	else {
+		return ( main::TrgType() =~ /^(STDEXE|STDDLL|STDLIB)$/io );
+	}
+}
+
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_edg.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,496 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Cl_edg;
+# 
+#
+
+package Cl_edg;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+);
+use cl_generic;
+use Genutl;
+use File::Path;
+use Cwd;
+
+sub PMHelp_Mmp {
+	print "// No additional keywords for this platform\n";
+}
+
+my $epocroot = $ENV{EPOCROOT};
+$epocroot=~ s-\\$--;            # chop trailing \\
+my $Makecmd;
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::SysIncPaths)); # old style
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::UserIncPaths)); # old style
+	my $RelPath="$epocroot\\EPOC32\\RELEASE";
+	my $RPath = &main::Path_RltToWork($RelPath);
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Trg=&main::Trg;
+	my $DPath = &main::Path_RltToWork($epocroot);
+	my $DefFile = &main::DefFile;
+	my $EABIDefFile = &main::EABIDef;
+    
+    my $EdgSysIncludeList = "Edg_sysinc_list.txt";
+    my $EdgUserIncludeList = "Edg_userinc_list.txt";
+    my $EdgUdebReportList = "Edg_udeb_rep_list.txt";
+    my $EdgUrelReportList = "Edg_urel_rep_list.txt";
+
+	&Generic_Header(0,$Makecmd);	# define standard things using relative paths
+
+	# EDG report file generation
+	
+	&main::Output(
+		"GXPTRGUDEB = $RPath\\EDG\\UDEB\n",
+		"GXPTRGUREL = $RPath\\EDG\\UREL\n\n",
+		"DEFFILE = $DefFile\n\n",
+        "EABIDEFFILE = $EABIDefFile\n\n",
+		"EDG_SYSINC_LIST=\${EPOCBLD}\\..\\..\\", $EdgSysIncludeList,
+		"\n",
+		"EDG_USERINC_LIST=\${EPOCBLD}\\..\\..\\", $EdgUserIncludeList,
+		"\n",
+		"EDG_UREL_REP_LIST=\${EPOCBLD}\\..\\..\\",$EdgUrelReportList,
+		"\n",
+		"EDG_UDEB_REP_LIST=\${EPOCBLD}\\..\\..\\", $EdgUdebReportList,
+		"\n\n"
+	);
+
+	&main::Output(
+		"INCDIR ="
+	);
+	
+
+	foreach (@ChopRTWUserIncPaths) {
+		&main::Output(
+			" --include_directory \"$_\""
+		);
+	}
+
+	&main::Output(
+		"\n"
+	);
+
+
+	&main::Output(
+		"SYSINCDIR ="
+	);
+
+	foreach (@ChopRTWSysIncPaths) {
+	     &main::Output(
+			" --sys_include \"$_\"",
+	     );
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+
+	my $preinclude =   "--preinclude \$(EPOCINC)\\edg\\edg3_7_rvct2_2.h";#this is the variant line you must change to "simulate" another compiler.
+	&main::Output( 
+		"GCCFLAGS = --wchar_t_keyword --no_code_gen --exceptions --no_warnings",
+		" ${preinclude}",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCDEFS = -D __MARM_THUMB__ -D __MARM_INTERWORK__ -D __ARMCC__ -D __EPOC32__ -D __MARM__ -D __EABI__ -D __ARMCC_2__ -D __ARMCC_2_2__ -D __SUPPORT_CPP_EXCEPTIONS__  -D IMPORT_C= -D EXPORT_C= -D __softfp="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -D $_"
+		);
+	}
+	if($VariantFile){
+	    &main::Output(" -D __PRODUCT_INCLUDE__=\\\"${VariantFile}\\\"");
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_ = cpfe"
+		);
+		
+		&main::Output(
+			' $(GCCFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -D $_"
+			);
+		}
+                
+		&main::Output(
+			" \$(GCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	&main::Output(
+			"LIBRARY:\n",
+			"\t\@echo Nothing to do\n"
+	);
+
+	&main::Output(
+		"RESOURCEUREL:\n",
+		"\t\@echo Nothing to do\n"
+	);
+
+	&main::Output(
+		"RESOURCEUDEB:\n",
+		"\t\@echo Nothing to do\n\n\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			my $TrgBase = &main::Path_Split('base',$Trg);           
+			&main::Output (
+			" \\\n\t",
+			&Generic_Quote("\$(GXPTRG$_)\\$TrgBase.gxp")
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+}
+	
+sub PMBld {
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;
+	# DefFile
+	my $DefFile = &main::DefFile;
+	# EABIDefFile
+	my $EABIDefFile = &main::EABIDef;
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC CLEANEDGTEMPFILES$Bld\n",
+		"\n"
+	);
+
+	&main::Output("CLEANEDGTEMPFILES$Bld :\n",
+			"\t\-\$(ERASE) \$(EDG_SYSINC_LIST) ",
+			"\$(EDG_USERINC_LIST) ",
+			"\$(EDG_${Bld}_REP_LIST) "
+			);
+
+	my @releaseables;
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	# XML Stuff
+	&main::Output(
+				&Generic_Quote("\$(GXPTRG$Bld)\\$BaseTrg.gxp"), " : ",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.gxp"),
+	);
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::SysIncPaths)); # old style
+	foreach my $incPath (@ChopRTWSysIncPaths) {
+	&main::Output(
+		"\n\t\@echo $incPath >> \$(EDG_SYSINC_LIST)",
+		);
+	}
+	
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::UserIncPaths)); # old style
+	foreach my $incPath (@ChopRTWUserIncPaths) {
+	&main::Output(
+		"\n\t\@echo $incPath >> \$(EDG_USERINC_LIST)",
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+        
+	# TARGET *.GXP
+	#------------
+	if (scalar @SrcList >150) {
+		# deal with very long lists by splitting them into 150 file pieces, which allows
+		# about 200 bytes per filename if the underlying max size is 32K
+		#
+        
+		my $counter1=150;	# i.e. trigger new variable immediately
+		my $counter2=0;
+		my @objvarlist=();
+		foreach (@SrcList) {
+			if ($counter1==150) {
+				$counter1=0;
+				$counter2++;
+				my $objvar = "OBJECTS$Bld$counter2";
+				push @objvarlist, " \$($objvar)";
+				&main::Output(
+					"\n",
+					"$objvar="
+				);
+			}
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+                        next if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$Ext.aut")
+			);
+			$counter1++;
+		}
+		
+        &main::Output(
+			"\n\n"
+		);
+	} else {
+		# shorter lists remain unchanged
+		#
+		&main::Output(
+			"OBJECTS$Bld="
+		);
+                foreach (@SrcList) {
+			my $BaseSource = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+                        next if (lc($Ext) eq '.cia');
+			&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSource$Ext.aut")
+			);  
+		}       
+		
+		&main::Output(
+			"\n",
+			"\n"
+		);
+
+		&main::Output("RESOURCEINFO$Bld=");
+		&main::Output("\n\n");
+		
+		&main::Output(
+            
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.gxp"), " : \$(OBJECTS$Bld) \$(EABIDEFFILE) \$(RESOURCEINFO$Bld)\n",
+			"\n\n"
+		);
+	}
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.aut"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+    my $cia = (lc($ExtSrc) eq '.cia') ? "" : "";
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.aut"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output( 
+		"\n",
+		"\n"
+	);
+}
+
+my %sources;
+
+sub PMEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	my $RTWSrcPath=&main::Path_Chop(&main::Path_RltToWork($SrcPath));
+
+	# add source path, source file and build type to hashmap. 
+    $sources{$SrcPath}{$Src}{$Bld}=1;
+   
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;
+
+	@browser = ();
+	my $EdgReportFile = "\$(EDG_UREL_REP_LIST)";
+	if($Bld =~ /udeb/i){
+		$EdgReportFile = "\$(EDG_UDEB_REP_LIST)";
+	}
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.aut"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -D __CIA__ --include_directory \"$RTWSrcPath\" \$(INCDIR) --xref \"\$\@\" \"$RTWSrcPath\\$Src\"\n",
+		"\t\@echo \"\$\<\" >> $EdgReportFile\n",
+		"\n");
+	} else {
+		
+                my $BldPath=&main::BldPath;
+                my $EdgReportFilePath=UpDir(UpDir(UpDir($BldPath)));
+		
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$Ext.aut"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) --include_directory \"$RTWSrcPath\" \$(INCDIR) \$(SYSINCDIR) --xref \"\$\@\" \"$RTWSrcPath\\$Src\"\n",
+			"\t\@echo \$(EPOCBLD$Bld)\\$BaseSrc$Ext.aut >> $EdgReportFile\n",
+			"\n"
+		);
+
+		foreach $browser (@browser)
+		{
+		 print "$browser\n";
+		}
+	}
+}
+
+sub PMEndSrc {
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+		&Generic_End;
+}
+
+
+
+sub UpDir($)
+	{
+	my ($aPath) = @_;
+
+	my $lastChar = substr($aPath,-1);
+	my $end = length($aPath)-1;
+
+	if ( ($lastChar eq '\\') || ($lastChar eq '/') )
+		{
+		$end -= 1;
+		}
+
+	my $last = rindex($aPath,'\\',$end);
+	if ( (rindex($aPath,'/',$end)>$last) | ($last == -1) )
+		{ $last = rindex($aPath,'/',$end); }
+
+	if ($last == -1)
+		{ return ""; }
+	else
+		{ return substr($aPath,0,$last).'/'; }
+	}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_gcc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1213 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_gcc;
+
+my $GccPrefix='';
+my $ToolPrefix='';
+my $HelperLib='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+	'Entry'=>'-e',
+	'Gcc'=>'',
+	'Ld'=>'',
+	'Petran'=>'',
+	'Optimize'=>'-O'
+);
+my $Dlltool;
+my $Archive;
+my $Link;
+my $Objcopy;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMPlatProcessMmp
+
+	PMUnderlyingABI
+
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use cl_generic;
+use Genutl;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+sub PMHelp_Mmp {
+	print "// No additional keywords for this platform\n";
+}
+
+sub PMPlatProcessMmp (@) {
+	my $MMPFILE=&main::MmpFile;
+
+	# set up START MARM ... END block module variables
+	my @MmpWarn=();
+	my $Line;
+	LINE: foreach $Line (@_) {
+		my $LineInfo=shift @$Line;
+		$_=shift @$Line;
+		push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
+	}
+
+	undef $Line;
+	if (@MmpWarn) {
+		warn
+			"\nMMPFILE \"$MMPFILE\"\n",
+			"START .. END BLOCK WARNINGS(S)\n",
+			@MmpWarn,
+			"\n"
+		;
+	}
+	undef @MmpWarn;
+}
+
+sub SystemTarget() {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	# N.B. should get better way to detect kernel probably!!
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	
+	return 0;
+}
+
+my %CompatibleABIs=(
+	ARMI=>['ARM4', 'THUMB'],
+	ARM4=>['ARMI'],
+	THUMB=>['ARMI']
+);
+my @CompatibleABIs;
+sub PMUnderlyingABI($) {
+	my ($ABI) = @_;
+	if ($ABI eq 'ARM4T') {
+		if (&main::BuildAsARM) {
+			return 'ARMI';
+		}
+		elsif (SystemTarget()) {
+			return 'ARM4';
+		}
+		else {
+			return 'THUMB';
+		}
+	}
+	return $ABI;
+}
+
+my $Makecmd;
+my %ABILibPath=();
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $ABI=&main::ABI;
+	my $UnderlyingABI=PMUnderlyingABI($ABI);
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::SysIncPaths));
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::UserIncPaths));
+	my $DefFile=&main::DefFile;
+	my $EPOCPath=&main::EPOCPath;
+	my $LinkAs=&main::LinkAs;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+	my $WarningLevel=&main::CompilerOption("GCC");
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $SystemTrg = SystemTarget();
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+#	set up dlltool flag hash
+	my %ABIDlltool=(
+		ARMI=>'-m arm_interwork',
+		ARM4=>'-m arm',
+		THUMB=>'-m thumb'
+	);
+
+#	work out the flags for various platforms
+	if ($ABI eq 'ARMI') {
+		$PlatOpt{Gcc}='-march=armv4t -mthumb-interwork';
+		$PlatOpt{Dlltool}=$ABIDlltool{ARMI};
+	}
+	elsif ($ABI eq 'ARM4T') {
+		if (&main::BuildAsARM) {
+			$PlatOpt{Gcc}='-march=armv4t -mthumb-interwork';
+			$PlatOpt{Dlltool}=$ABIDlltool{ARMI};
+		}
+		elsif ($SystemTrg) {
+			$PlatOpt{Gcc}='-march=armv4';
+#			allow thumb for ARM4 ABI where necessary
+			unless (&main::PlatABI eq 'ARM4') {
+				$PlatOpt{Gcc}.='t';
+			}
+			$PlatOpt{Dlltool}=$ABIDlltool{ARM4};
+		}
+		else {
+			$GccPrefix='thumb-epoc-pe-';
+			$PlatOpt{Gcc}='-mthumb-interwork -D__MARM_THUMB__';
+			$PlatOpt{Dlltool}=$ABIDlltool{THUMB};
+		}
+	}
+	elsif ($ABI eq 'ARM4') {
+		$PlatOpt{Gcc}='-march=armv4';
+#		allow thumb for ARM4 ABI where necessary
+		unless (&main::PlatABI eq 'ARM4') {
+			$PlatOpt{Gcc}.='t';
+		}
+		$PlatOpt{Dlltool}=$ABIDlltool{ARM4};
+	}
+	elsif ($ABI eq 'THUMB') {
+		$GccPrefix='thumb-epoc-pe-';
+		$PlatOpt{Gcc}='-mthumb-interwork';
+		$PlatOpt{Dlltool}=$ABIDlltool{THUMB};
+	}
+	else {
+		&main::FatalError("Platform module - ABI \"$ABI\" unrecognised");
+	}
+	
+	@CompatibleABIs=@{$CompatibleABIs{$UnderlyingABI}};
+
+#	set up CompatibleABI lib path hash
+	foreach (@CompatibleABIs) {
+		$ABILibPath{$_}=&main::Path_Strip("$LibPath..\\$_\\");
+	}
+	my %ABIRTWLibPath=();
+	foreach (@CompatibleABIs) {
+		$ABIRTWLibPath{$_}=&main::Path_RltToWork($ABILibPath{$_});
+	}
+
+	$Dlltool=$ToolPrefix.'dlltool';
+	$Archive=$ToolPrefix.'ar';
+	$Link=$ToolPrefix.'ld';
+	$Objcopy=$ToolPrefix.'objcopy';
+
+	&Generic_Header(1,$Makecmd);	# define standard things using relative paths
+
+#	GCC needs a fully-qualified path
+	if ($ENV{'PATH'} !~ m/[a-zA-z]{1}:{1}.[^;]*epoc32\\gcc\\bin/i) {
+		if ($Makecmd eq "nmake") {
+			&main::Output(
+				"\n",
+				"PATH=",&main::Path_Drive,$EPOCPath,"gcc\\bin;\$(PATH)\n",
+				"\n"
+			);
+		}
+		else {
+			&main::Output(
+				"\n",
+				"# must set both PATH and Path to make it work correctly\n",
+				"Path:=",&main::Path_Drive,$EPOCPath,"gcc\\bin;\$(Path)\n",
+				"PATH:=\$(Path)\n",
+				"\n"
+			);
+		}
+	}
+
+	&main::Output(
+		"INCDIR  ="
+	);
+
+	foreach (@ChopRTWUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	foreach (@ChopRTWSysIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	if($VariantFile){
+	    # gcc needs a relativ path
+	    $VariantFile = &main::Path_RltToWork($VariantFile);
+	    &main::Output("\\\n  -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCFLAGS=$PlatOpt{Gcc} \\\n",
+		"\t\t-pipe -c -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas $WarningLevel\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCDEFS ="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_ = ${GccPrefix}gcc"
+		);
+		if (/REL$/o) {
+			&main::Output(
+				      ' -s -fomit-frame-pointer ',
+				      $PlatOpt{Optimize}
+			);
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				' -g'
+			);
+			unless (&main::SrcDbg) {
+			    &main::Output(
+			    	' ', $PlatOpt{Optimize}
+			    );
+			}
+		}
+		&main::Output(
+			' $(GCCFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -D$_"
+			);
+		}
+		&main::Output(
+			" \$(GCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n\t",
+				&Generic_Quote("\$(EPOCTRG$_)\\$Trg")
+			);
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+	
+	foreach (@BldList) {
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : MAKEWORK$_"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"LIBRARY : MAKEWORK"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\UREL\\$PrimaryExportLibrary.lib")
+				);
+				foreach (@CompatibleABIs) {
+					&main::Output(
+						" ", &Generic_Quote("$ABILibPath{$_}UREL\\$PrimaryExportLibrary.lib")
+					);
+					&Generic_MakeWorkDir('MAKEWORKLIBRARY',"$ABILibPath{$_}UREL");
+				}
+				&main::Output(
+					"\n"
+				);
+			} else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create any import libraries.\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\UREL\\$PrimaryExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+			"# EPOCBLDP = ", &Generic_Definition('EPOCBLDP'), "\n",
+			"# EPOCLIB = ", &Generic_Definition('EPOCLIB'), "\n",
+		);
+		&main::Output(
+			"\n",
+			&Generic_Quote("\$(EPOCBLDP)\\$ExportLibrary.prep.def"), " : ",
+			&Generic_Quote($DefFile), "\n",
+			"\tperl -S prepdef.pl \$< \$@\n",
+			"\n",
+			&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), " : ",
+			&Generic_Quote("\$(EPOCBLDP)\\$ExportLibrary.prep.def"), "\n",
+			"\tpushd ".&Generic_Quote("\$(EPOCBLDP)")." && \\\n",
+			"\t$Dlltool $PlatOpt{Dlltool} --output-lib \"$ExportLibrary.tmp.lib\" --def \"$ExportLibrary.prep.def\" --dllname \"$LinkAs\" && popd && move ", &Generic_Quote("\$(EPOCBLDP)\\$ExportLibrary.tmp.lib"), " \$@\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), "\n",
+				"\tcopy \$< \$@\n"
+			);
+		}
+		foreach (@CompatibleABIs) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("$ABILibPath{$_}UREL\\$ExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCBLDP)\\$ExportLibrary.prep.def"), "\n",
+				"\tpushd ".&Generic_Quote("\$(EPOCBLDP)")." && \\\n",
+				"\t$Dlltool $ABIDlltool{$_} --output-lib \"$ExportLibrary.tmp.lib\" \\\n",
+				"\t\t--def \"$ExportLibrary.prep.def\" \\\n",
+				"\t\t--dllname \"$LinkAs\" && popd && move ", &Generic_Quote("\$(EPOCBLDP)\\$ExportLibrary.tmp.lib"), " \$@\n"
+			);
+			if ($ExtraExportLibrary) {
+				&main::Output(
+					"\n",
+					&Generic_Quote("$ABILibPath{$_}UREL\\$ExtraExportLibrary.lib"), " : ",
+					&Generic_Quote("$ABILibPath{$_}UREL\\$ExportLibrary.lib"), "\n",
+					"\tcopy \$< \$@\n"
+				);
+			}
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE :\n"
+	);
+	if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLDP)\\$ExportLibrary.def\" \n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\UREL\\$ExportLibrary.lib\"\n",
+			"\t-\$(ERASE) \"\$(EPOCBLDP)\\$ExportLibrary.prep.def\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib\"\n"
+			);
+		}
+		foreach (@CompatibleABIs) {
+			&main::Output(
+				"\t-\$(ERASE) \"$ABILibPath{$_}UREL\\$ExportLibrary.lib\"\n"
+			);
+			if ($ExtraExportLibrary) {
+				&main::Output(
+					"\t-\$(ERASE) \"$ABILibPath{$_}UREL\\$ExtraExportLibrary.lib\"\n"
+				);
+			}
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UREL");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LibPath=&main::LibPath;
+	my $LinkAs=&main::LinkAs;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $SystemTrg = SystemTarget();
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}
+
+	if ($Bld =~ /DEB/) {
+		@LibList = &main::DebugLibList;
+	} else {
+		@LibList = &main::LibList;
+	}
+
+#	set up $LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') {	# have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	
+
+	push @releaseables, "$RelPath$Trg" if ($BasicTrgType!~/^IMPLIB$/io);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		push @releaseables, "$RelPath$Trg.MAP";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+		push @releaseables, "$LibPath$ExportLibrary.lib";
+		push @releaseables, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+		foreach (@CompatibleABIs) {
+			push @releaseables, "$ABILibPath{$_}UREL\\$ExportLibrary.lib";
+			push @releaseables, "$ABILibPath{$_}UREL\\$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+		}
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLDP$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	if (defined $ENV{PBUILDPID}) {
+		my $ChopBldPPath = $ChopBldPath;
+		$ChopBldPPath =~ s/(.*)\\(\w+)\\$Bld$/$1\\$2\$\(PBUILDPID\)\\$Bld/i;
+		&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPPath);
+	}
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB")
+		);
+	}
+	if ($HelperLib) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$HelperLib")
+		);
+	}
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)/o) { # Add the GCC helper fns
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EGCC.LIB")
+		);
+	}
+	foreach (@ASSPLibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCASSPLINK$Bld)\\$_")
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"# EPOCBLDP$Bld = ", &main::Path_AbsToWork(&Generic_Definition("EPOCBLDP$Bld")), "\n",
+		"# EPOCSTATLINK$Bld = ", &main::Path_AbsToWork(&Generic_Definition("EPOCSTATLINK$Bld")), "\n",
+		"# EPOCLIB = ", &main::Path_AbsToWork(&Generic_Definition("EPOCLIB")), "\n",
+	);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ",
+		&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseTrg.in")
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			" ", &Generic_Quote($DefFile)
+		);
+	}
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::Output(
+			" ", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$FirstLib")
+		);
+	}
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+
+#	Establish the entry point symbol
+	my $EntrySymbol;
+	if ($BasicTrgType=~/^DLL$/o) {
+		$EntrySymbol = '_E32Dll';
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		$EntrySymbol = '_E32Startup';
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+
+#		generate a .DEF file from the objects and static libraries
+		&main::Output(
+			"\tpushd ".&Generic_Quote("\$(EPOCBLDP$Bld)")." && \\\n",
+			"\t$Dlltool $PlatOpt{Dlltool} --output-def \"$ExportLibrary.inf\" \"$BaseTrg.in\""
+		);
+		foreach (@StatLibList) {
+			&main::Output(
+				" \"", &main::Path_MakeRltToBase(&main::Path_AbsToWork(&Generic_Definition("EPOCBLDP$Bld")."\\"), &main::Path_AbsToWork(&Generic_Definition("EPOCSTATLINK$Bld")."\\"))."$_\""
+			);
+		}
+		&main::Output(
+			" && popd\n"
+		);
+
+#		reorder the .DEF file taking frozen exports into account if there are any
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S makedef.pl -Deffile \"\$(EPOCBLDP$Bld)\\$ExportLibrary.inf\"$AbsentSubst"
+		);
+		if (SystemTarget()) {
+    			&main::Output( "\t\t-SystemTargetType \\\n" );
+	    	}		
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				" -Frzfile \"$DefFile\""
+			);
+		}
+		# freeze ordinals, a maximum of 2, for polymorphic dlls
+		my $Ordinal;
+		my $Num=1;
+		foreach $Ordinal (&main::Exports) {
+			&main::Output(
+				" -$Num $Ordinal"
+			);
+			$Num++;
+		}
+		&main::Output(
+			"  \"\$(EPOCBLDP)\\$ExportLibrary.def\"\n"
+		);
+
+#		delete the unordered definition file
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$ExportLibrary.inf\"\n"
+		);
+
+#		generate an export object from the ordered .DEF file
+		&main::Output(
+			"\tpushd ".&Generic_Quote("\$(EPOCBLDP$Bld)")." && \\\n",
+			"\t$Dlltool $PlatOpt{Dlltool} --def \"..\\$ExportLibrary.def\" \\\n",
+			"\t\t--output-exp \"$ExportLibrary.exp\" \\\n",
+			"\t\t--dllname \"$LinkAs\""
+		);
+		if (&main::ExportUnfrozen) {
+			&main::Output(
+				"\\\n",
+				"\t\t--output-lib \"", &main::Path_MakeRltToBase(&main::Path_AbsToWork(&Generic_Definition("EPOCBLDP$Bld")."\\"), &main::Path_AbsToWork(&Generic_Definition("EPOCLIB")."\\"))."UREL\\$ExportLibrary.lib\"",
+				" && popd\n"
+			);
+			if ($ExtraExportLibrary) {
+				&main::Output(
+					"\n",
+					"\tcopy \$(EPOCLIB)\\UREL\\$ExportLibrary.lib ",
+				       	"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib",
+					"\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				" && popd\n"
+			);
+		}				
+	}
+
+#	call ld to do base relocations (and dll exports)
+	if ($BasicTrgType=~/^(DLL|EXE)/o) {
+		&main::Output(
+			"\t$Link $PlatOpt{Ld} -s"
+			);	
+		if ($BasicTrgType=~/^DLL$/o) {
+			&main::Output(
+				" $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol \"\$(EPOCBLDP$Bld)\\$ExportLibrary.exp\" --dll \\\n"
+			);
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			&main::Output(
+				" $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol \\\n"
+			);
+		}
+#		--whole-archive is required here apparently because of a defect  in the gcc toolchain
+#		the flag can probably be removed with a later version of gcc
+		&main::Output(
+			"\t\t--base-file \"\$(EPOCBLDP$Bld)\\$BaseTrg.bas\" -o \"\$(EPOCBLDP$Bld)\\$Trg\" \\\n",
+			"\t\t\"\$(EPOCSTATLINK$Bld)\\$FirstLib\" --whole-archive \"\$(EPOCBLDP$Bld)\\$BaseTrg.in\" \\\n",
+			"\t\t--no-whole-archive"
+		);
+		&main::Output(
+			" \$(LIBS$Bld) \$(USERLDFLAGS)\n"
+		);
+
+#		delete temporary files
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$ExportLibrary.exp\"\n"
+			);
+		}
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$Trg\"\n"
+		);
+
+#		call dlltool to do base relocations (and dll exports)
+		&main::Output(
+			"\tpushd ".&Generic_Quote("\$(EPOCBLDP$Bld)")." && \\\n",
+			"\t$Dlltool $PlatOpt{Dlltool} \\\n"
+		);
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			&main::Output(
+				"\t\t--def \"..\\$ExportLibrary.def\" \\\n",
+				"\t\t--dllname \"$LinkAs\" \\\n"
+			);
+		}
+		&main::Output(
+			"\t\t--base-file \"$BaseTrg.bas\" \\\n",
+			"\t\t--output-exp \"$ExportLibrary.exp\" && popd\n"
+		);
+
+#		delete temporary files
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$BaseTrg.bas\"\n"
+		);
+
+#		call ld to link the target
+		&main::Output(
+			"\t$Link $PlatOpt{Ld}"
+		);
+		if ($Bld=~/^U?REL$/o) {
+			&main::Output(
+				" -s"
+			);
+		}
+		if ($BasicTrgType=~/^DLL$/o) {
+			&main::Output(
+				" $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol --dll \\\n"
+			);
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			&main::Output(
+				" $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol \\\n"
+			);
+		}
+#		--whole-archive is required here apparently because of a defect in the gcc toolchain
+#		the flag can probably be removed with a later version of gcc
+		&main::Output(
+			"\t\t\"\$(EPOCBLDP$Bld)\\$ExportLibrary.exp\" \\\n",
+			"\t\t-Map \"\$(EPOCTRG$Bld)\\$Trg.map\" -o \"\$(EPOCBLDP$Bld)\\$Trg\" \\\n",
+			"\t\t\"\$(EPOCSTATLINK$Bld)\\$FirstLib\" --whole-archive \"\$(EPOCBLDP$Bld)\\$BaseTrg.in\" \\\n",
+			"\t\t--no-whole-archive"
+		);
+		&main::Output(
+			" \$(LIBS$Bld) \$(USERLDFLAGS)\n"
+		);
+
+#		delete temporary files
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$ExportLibrary.exp\"\n"
+		);
+
+		if ($Bld=~/DEB$/o) {
+			&main::Output(
+				"\t$Objcopy -X \"\$(EPOCBLDP$Bld)\\$Trg\" \"\$(EPOCTRG$Bld)\\$BaseTrg.sym\"\n"
+			);
+		}
+
+		if (&main::CompressTarget) {
+			&main::Output(
+			"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " -nocompress " ,  " \"\$(EPOCBLDP$Bld)\\$Trg\" \"\$\@\" \\\n",
+			"\t\t"
+			);
+		}
+		else {
+			if(&main::CompressTargetMode==NOCOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " \"\$(EPOCBLDP$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+			elsif(&main::CompressTargetMode==INFLATECOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod deflate", " \"\$(EPOCBLDP$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+			elsif(&main::CompressTargetMode==BYTEPAIRCOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod bytepair", " \"\$(EPOCBLDP$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+		}
+
+		if (&main::AllowDllData) {
+			&main::Output(
+				' -allow'
+			);
+		}
+		if (not &main::CallDllEntryPoints) {
+			&main::Output(
+				' -nocall'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' -datalinkaddress ',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' -fixed'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' -heap ',$HeapSize{Min},' ',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' -priority ',&main::ProcessPriority
+			);
+		}
+		if (&main::SmpSafe) {
+			&main::Output(
+				' -smpsafe'
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' -stack ',&main::StackSize
+			);
+		}
+
+ 		if (&main::CodePagingTargetMode == UNPAGED) {
+ 			&main::Output(
+ 				' -codepaging unpaged'
+ 			);
+ 		}
+ 		elsif (&main::CodePagingTargetMode == PAGED) {
+ 			&main::Output(
+ 				' -codepaging paged'
+ 			);
+ 		}
+ 
+ 		if (&main::DataPagingTargetMode == UNPAGED) {
+   			&main::Output(
+ 				' -datapaging unpaged'
+  			);
+   		}
+ 		elsif (&main::DataPagingTargetMode == PAGED) {
+   			&main::Output(
+ 				' -datapaging paged'
+   			);
+   		}
+		
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" -uid$i $_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' -vid ',&main::VendorId
+			);
+		}
+		&main::Output(
+			' -capability ',&main::Capability,
+		);
+		&main::Output("\n");
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCBLDP$Bld)\\$Trg\"\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tcopy \"\$(EPOCBLDP$Bld)\\$BaseTrg.in\" \"\$(EPOCSTATLINK$Bld)\\$Trg\"\n"
+		);
+	}
+
+	&main::Output(
+		"\n"
+	);
+
+
+	# TARGET *.IN
+	#------------
+	if (scalar @SrcList >150) {
+		# deal with very long lists by splitting them into 150 file pieces, which allows
+		# about 200 bytes per filename if the underlying max size is 32K
+		#
+		my $counter1=150;	# i.e. trigger new variable immediately
+		my $counter2=0;
+		my @objvarlist=();
+		foreach (@SrcList) {
+			if ($counter1==150) {
+				$counter1=0;
+				$counter2++;
+				my $objvar = "OBJECTS$Bld$counter2";
+				push @objvarlist, " \$($objvar)";
+				&main::Output(
+					"\n",
+					"$objvar="
+				);
+			}
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc.o")
+			);
+			$counter1++;
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseTrg.in"), " : ", @objvarlist,"\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n"
+		);
+		foreach (@objvarlist) {
+			# Add the files to the list in groups
+			&main::Output(
+				"\t$Archive cr \$\@$_\n"
+			);
+		}
+		&main::Output(
+			"\n\n"
+		);
+	} else {
+		# shorter lists remain unchanged
+		#
+		&main::Output(
+			"OBJECTS$Bld="
+		);
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc.o")
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseTrg.in"), " : \$(OBJECTS$Bld)\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\t$Archive cr \$\@ \$^\n",
+			"\n\n"
+		);
+	}
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+	
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLDP$_)\\$BaseSrc$cia.lis"), " ",
+			&Generic_Quote("\$(EPOCBLDP$_)\\$BaseSrc$cia.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc$cia.lis"), " ",
+		&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc$cia.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	my $RTWSrcPath=&main::Path_Chop(&main::Path_RltToWork($SrcPath));
+
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(GCC$Bld) -x c++ -D__CIA__ -I \"$RTWSrcPath\" \$(INCDIR) -o \$\@ \"$RTWSrcPath\\$Src\"\n",
+			"\n",
+	#		generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$ABI.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -x c++ -D__CIA__ -Wa,-adln -I \"$RTWSrcPath\" \$(INCDIR) -o nul: \"$RTWSrcPath\\$Src\" > \$\@\n",
+			"\n"
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(GCC$Bld) -I \"$RTWSrcPath\" \$(INCDIR) -o \$\@ \"$RTWSrcPath\\$Src\"\n",
+			"\n",
+	#		generate an assembly listing target too
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$ABI.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLDP$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -Wa,-adln -I \"$RTWSrcPath\" \$(INCDIR) -o nul: \"$RTWSrcPath\\$Src\" > \$\@\n",
+			"\n"
+		);
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_gccxml.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,964 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Cl_gccxml;
+# 
+#
+
+package Cl_gccxml;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+	PMBitMapBld
+	PMResrcBld
+
+);
+use cl_generic;
+use Genutl;
+use File::Path;
+use Cwd;
+use Pathutl;
+
+sub PMHelp_Mmp {
+	print "// No additional keywords for this platform\n";
+}
+
+	# takes an 'expression'  to evaluate with $_ bound to each of the
+	# remaining args
+	sub PrintList
+	{
+		my $expr = shift @_;
+		foreach (@_) {
+		my $str = eval($expr);
+		&main::Output($str);
+		}
+	}
+
+my $epocroot = $ENV{EPOCROOT};
+$epocroot=~ s-\\$--;            # chop trailing \\
+my $Makecmd;
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $RelPath="$epocroot\\EPOC32\\RELEASE";
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Trg=&main::Trg;
+	my $DPath = &main::Path_RltToWork($epocroot);
+	my $DefFile = &main::DefFile;
+	my $EABIDefFile = &main::EABIDef;
+	my $ExtCompileOption = &main::CompilerOption("GCCXML");
+	
+	&Generic_Header(0,$Makecmd);	# define standard things using absolute paths
+
+	$DefFile="" if(!(-e $DefFile));
+	&main::Output(
+		"GXPTRGUDEB = $RelPath\\GCCXML\\UDEB\n",
+		"GXPTRGUREL = $RelPath\\GCCXML\\UREL\n\n",
+		"DEFFILE = $DefFile\n\n",
+        "EABIDEFFILE = $EABIDefFile\n\n"
+	);
+
+	&main::Output(
+		"INCDIR  ="
+	);
+
+	foreach (@ChopUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+
+	&main::Output(
+		" -I- "
+	);
+
+	foreach (@ChopSysIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	if($VariantFile){
+	    &main::Output("\\\n  -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output( 		
+		"GCCFLAGS= -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas -UWIN32 -fshort-wchar -quiet -w $ExtCompileOption\n",  # -fsyntax-only
+		"\n"
+	);
+
+	&main::Output(
+		"GCCDEFS = -D __EABI__ -D __SUPPORT_CPP_EXCEPTIONS__"
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_ = gccxml_cc1plus -bi"
+		);
+		if (/REL$/o) {
+			&main::Output(
+				      ' -fomit-frame-pointer '
+			);
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				' -g'
+			);
+		}
+		&main::Output(
+			' $(GCCFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -D$_"
+			);
+		}
+                
+		&main::Output(
+			" \$(GCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	&main::Output(
+			"LIBRARY:\n",
+			"\t\@echo Nothing to do\n"
+	);
+
+	# Resource building is done entirely via cl_generic.pm
+	PrintList("\"\nRESOURCE\$_ : MAKEWORK\$_\"", @BldList)
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			my $TrgBase = &main::Path_Split('base',$Trg);           
+			&main::Output (
+			" \\\n\t",
+			&Generic_Quote("\$(GXPTRG$_)\\$TrgBase$BasicTrgType.gxp")
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+}
+
+# DumpToFile
+sub DumpMMPToFile
+{
+	my $rfiFileList;
+	my @rfiFiles;
+	if(scalar @_) # if an argument has been passed then it is a reference to the list of .RFI files.
+	{
+		($rfiFileList) = @_;
+		@rfiFiles = @$rfiFileList;
+	}
+
+	my $BldPath=&main::BldPath;
+	my $Target = &main::Trg; 
+	my $TargetBase = &main::Path_Split('Base', $Target); 
+	my $Gxpurel="$epocroot\\epoc32\\release\\gccxml\\urel";
+	my $Gxpudeb="$epocroot\\epoc32\\release\\gccxml\\udeb";
+	unless (-d $BldPath) {
+		mkpath([$BldPath]);
+	}
+	unless (-d $Gxpurel) {
+		mkpath([$Gxpurel]);
+	}
+	unless (-d $Gxpudeb) {
+		mkpath([$Gxpudeb]);
+	}
+    $BldPath = (&main::Path_StepDirs($BldPath))[-2];
+	use File::Basename;
+    my $FileName = basename(&main::MmpFile());
+    $FileName = $BldPath.$FileName.".xml";
+    open FILE,"> $FileName" or die "Cannot open mmp info dump file $FileName: $!";
+    print FILE "<?xml version=\"1.0\"?>\n<mmpInfo>\n"; 
+   
+    my $Path = &main::RelPath();
+    my $MmpFile = &main::MmpFile();  
+    my $TrgType = &main::TrgType(); 
+    my $TrgPath = &main::TrgPath(); 
+    print FILE "\t<mmp path=\"$MmpFile\"/>\n"; 
+	print FILE "\t<target name=\"$Target\" type=\"$TrgType\" ";
+    
+	if(not $TrgPath eq '') 
+	{
+		print FILE "path=\"$TrgPath\""; 
+	}
+	print FILE "/>\n";
+	# insert current working directory
+	my $WorkPath = &main::Path_WorkPath();
+	print FILE "\t<cwd path=\"$WorkPath\"/>\n";
+    
+    my $ABI = &main::ABI; 
+    print FILE "\t<abi type=\"$ABI\"/>\n"; 
+    my $LinkAs = &main::LinkAs;
+    print FILE "\t<linkAs name=\"$LinkAs\"/>\n"; 
+    my $LinkAsBase = &main::LinkAsBase;
+    print FILE "\t<linkAsBase name=\"$LinkAsBase\"/>\n"; 
+    
+    # Uids
+    my @UidList=&main::UidList;
+    my $count = 0;
+    print FILE "\t<uids";
+    foreach my $uid(@UidList)
+    {
+		print FILE " u$count=\"$uid\"" ;
+		$count++; 
+    }
+    print FILE "/>\n";
+    
+    # Versioning 
+    my %Version = &main::Version; 
+    print FILE "\t<version";
+    foreach my $var (sort keys %Version)
+    {
+        print FILE " $var=\"$Version{$var}\"";
+    }
+    print FILE "/>\n";
+    
+    # Capabilities
+    my $Capability = &main::Capability;
+    print FILE "\t<capability id=\"$Capability\"/>\n"; 
+    
+	# DefFile
+	my $DefFile = &main::DefFile;
+	$DefFile="" if(!(-e $DefFile));
+	print FILE "\t<defFile path=\"$DefFile\" type=\"GCC\"/>\n";
+
+	# EABIDefFile
+	my $EABIDefFile = &main::EABIDef;
+	print FILE "\t<defFile path=\"$EABIDefFile\" type=\"EABI\"/>\n";
+        
+    # Handle All types of libraries
+    my $FirstLib = &main::FirstLib; 
+    my @LibList = &main::LibList;
+    my @ASSPLibList = &main::ASSPLibList;
+    my @StatLibList = &main::StatLibList;;    
+    print FILE "\t<libs>\n"; 
+    
+	#first
+    print FILE "\t\t<lib name=\"$FirstLib\" type=\"First\"/>\n"; 
+    
+    #  normal
+    foreach my $lib (@LibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\"/>\n"; 
+    }
+    # ASSP Specific
+    foreach my $lib (@ASSPLibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\" type=\"ASSP\"/>\n";
+    }
+    
+    # Static Libraries
+    foreach my $lib (@StatLibList)
+    {
+        print FILE "\t\t<lib name=\"$lib\" type=\"Static\"/>\n";
+    }
+    print FILE "\t</libs>\n";
+
+    # Resources
+    print FILE "\t<resources>\n";
+    my $rfiFile;
+    foreach $rfiFile (@rfiFiles)
+    {
+	    print FILE "\t\t<resource name=\"$rfiFile\"/>\n";
+    }
+    print FILE "\t</resources>\n";
+
+    close FILE;
+}
+	
+sub PMBld {
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;
+	# DefFile
+	my $DefFile = &main::DefFile;
+	# EABIDefFile
+	my $EABIDefFile = &main::EABIDef;
+
+	my $rfiList = GatherResourceInformation();
+	my @RfiFiles = @$rfiList;
+
+
+
+	DumpMMPToFile(\@RfiFiles);
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	my @releaseables;
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+	&Generic_Releaseables;
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	# XML Stuff
+	&main::Output(
+				&Generic_Quote("\$(GXPTRG$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : ",
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"),
+				"\n\tcopy \"\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp\" \"\$@\""
+	); 
+	
+	&main::Output(
+		"\n",
+		"\n"
+	);
+        
+	# TARGET *.GXP
+	#------------
+	if (scalar @SrcList >150) {
+		# deal with very long lists by splitting them into 150 file pieces, which allows
+		# about 200 bytes per filename if the underlying max size is 32K
+		#
+
+		my $counter1=150;	# i.e. trigger new variable immediately
+		my $counter2=0;
+		my @objvarlist=();
+		foreach (@SrcList) {
+			if ($counter1==150) {
+				$counter1=0;
+				$counter2++;
+				my $objvar = "OBJECTS$Bld$counter2";
+				push @objvarlist, " \$($objvar)";
+				&main::Output(
+					"\n",
+					"$objvar="
+				);
+			}
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.xml")
+			);
+			$counter1++;
+		}
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile()).".xml";
+		&main::Output(
+			" \\\n\t\$(EPOCBLD)\\$FileName",
+			"\n",
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : ", @objvarlist,"\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n"
+		);
+		foreach (@objvarlist) {
+			&main::Output(
+				"\tzip -j \$\@$_\n"
+			);
+		}
+		&main::Output(
+			"\tif exist \$(EABIDEFFILE) zip -j \$\@ \$(EABIDEFFILE)\n",
+			"\n\n"
+		);
+	} else {
+		# shorter lists remain unchanged
+		#
+		&main::Output(
+			"OBJECTS$Bld="
+		);
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile()).".xml";
+
+		&main::Output("\$(EPOCBLD)\\$FileName");
+        foreach (@SrcList) {
+			my $BaseSource = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSource.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSource.xml")
+			);
+		}       
+		
+		&main::Output(
+			"\n",
+			"\n"
+		);
+
+		&main::Output("RESOURCEINFO$Bld=");
+		foreach (@RfiFiles)
+		{
+			&main::Output(" \\\n\t\$(EPOCBLD)\\$_");
+		}
+		&main::Output("\n\n");
+
+		&main::Output(
+
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg$BasicTrgType.gxp"), " : \$(OBJECTS$Bld) \$(EABIDEFFILE) \$(RESOURCEINFO$Bld)\n",
+
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\tzip -j \$\@ \$^ \$(EABIDEFFILE) \$(RESOURCEINFO$Bld)\n",
+			"\n\n"
+		);
+	}
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+	&Generic_BitMapBld;
+}
+
+sub PMResrcBld {
+	&Generic_ResrcBld;
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.xml"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.xml"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output( 
+		"\n",
+		"\n"
+	);
+}
+
+my %sources;
+
+sub PMEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	my $ChopSrcPath=&main::Path_Chop($SrcPath);
+
+	# add source path, source file and build type to hashmap. 
+    $sources{$SrcPath}{$Src}{$Bld}=1;
+   
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.xml"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -D__CIA__ -I \"$ChopSrcPath\" \$(INCDIR) -fxml=\$\@ -o nul \"$ChopSrcPath\\$Src\"\n",
+			"\n",
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.xml"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -I \"$ChopSrcPath\" \$(INCDIR) -fxml=\$\@ -o nul \"$ChopSrcPath\\$Src\"\n",
+			"\n",
+		);
+	}
+
+	#Keep the staus of the dependency-generation-flag was enabled or disabled.
+	my $Deps_Stat = &main::Deps_GetNoDependencies();
+	if($Deps_Stat){
+		#If the no-dependency-generation-flag turned on, turn it off temporarily, so that we can get 
+		#the dependencies.
+		&main::Deps_SetNoDependenciesStatus(0);
+	}
+	# Code to print the log file includeheaders.txt
+	my $IncFileName = "$epocroot\\epoc32\\release\\gccxml\\includeheaders.txt";
+	open INC_FILE,">> $IncFileName" or die "Cannot open file $IncFileName";
+
+	#Get the dependencies for the current source file.
+	my @DepList=&main::Deps_GenDependsL("$SrcPath$Src");
+	foreach(@DepList) {
+		print INC_FILE "$_\n";
+	}
+	close INC_FILE;
+	
+	#Set the dependency-generation-flag to its original state so that, it doesn't affect the other target 
+	#builds.
+	&main::Deps_SetNoDependenciesStatus($Deps_Stat);
+
+	# Code to print the existance of the file in logs
+	my $neededfile="$epocroot\\epoc32\\release\\gccxml\\includeheaders.txt";
+	if (!-e $neededfile)
+	{ 
+		print "!!! File $epocroot\\epoc32\\release\\gccxml\\includeheaders.txt does not exist\n";
+	}
+}
+
+sub PMEndSrc {
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+        my $BldPath=&main::BldPath;
+        my $Target = &main::Trg; 
+        my $TargetBase = &main::Path_Split('Base', $Target);
+		use File::Basename;
+	    my $FileName = basename(&main::MmpFile());
+	    $FileName = $BldPath.$FileName.".xml";
+        open FILE,">> $FileName" or die "Cannot open mmp info dump file $FileName: $!";
+		my $path;
+        foreach $path (keys %sources)
+        {
+            my %thing =  %{$sources{$path}}; # {"UREL"}; 
+            my $file;
+            foreach $file (keys %thing)
+            {
+                if( defined $thing{$file}{"UREL"})
+                {
+                    if( defined  $thing{$file}{"UDEB"} )
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\"/>\n";
+                    }
+                    else
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\" type=\"UREL\"/>\n";
+                    }
+                }
+                else
+                {
+                    if(defined $thing{$file}{"UDEB"})
+                    {
+                        print FILE "\t<sourceFile name=\"$file\" path=\"$path\" type=\"UDEB\"/>\n";
+                    }
+                    else
+                    {
+                        die "Should Never Get HERE!";
+                    }
+                }
+                
+            }
+        }
+        
+
+
+        my $BldInfDir=&Path_WorkPath;
+        my $PrjBldDir=$E32env::Data{BldPath};
+        $PrjBldDir=~s-^(.*)\\-$1-o;
+        $PrjBldDir.=$BldInfDir;
+        $PrjBldDir=~m-(.*)\\-o; # remove backslash because some old versions of perl can't cope
+
+
+        ### the export call is like this
+        my $lCmd = "make -r -f \"${PrjBldDir}EXPORT.make\" WHAT";
+        my @lExportDump = split(/\n/,`$lCmd`);
+        foreach my $lLine (@lExportDump) {
+            $lLine =~ s/"//g;
+            chomp($lLine);
+            if($lLine =~ /.*\.h/i) {
+                print FILE "\t<export name=\"$lLine\"/>\n";
+            }
+        }
+
+		print FILE "</mmpInfo>\n\n";
+        close FILE;
+
+
+
+		&Generic_End;
+}
+
+
+sub GetRelDir
+{
+	my ($fileName) = @_;
+	$fileName = CleanPath($fileName); # make sure that /'s are use rather than \ or \\
+	if($fileName!~m-\/-) # no directory, just a file name, so return ./
+	{
+		return "./";
+	}
+	elsif($fileName=~m-^(.*\/)[^\/]+$-) # return directory
+	{
+		return $1;
+	}
+	else # don't know how could get here
+	{
+		return "./";
+	}
+}
+
+
+sub SearchMmpFile
+{
+	my @rfiFiles;
+	my @SystemIncludes = &main::SysIncPaths;
+	my @UserIncludes = &main::UserIncPaths;
+	my $ResourceStruct = &main::ResourceStructRef;
+	
+	foreach my $ResourceStructure (@$ResourceStruct)
+	{
+		push @rfiFiles, AnalyseResourceFile($$ResourceStructure{Source}, \@SystemIncludes, \@UserIncludes);
+	}
+	return \@rfiFiles;
+}
+
+sub AnalyseResourceFile
+{ # when get to here $rssFile should be fully qualified relative to mmp file location (i.e. base: .../name.rss)
+	my ($rssFile, $systemIncludeList, $userIncludeList) = @_;
+	my @resourceRelatedFiles = ($rssFile);
+	my $baseFile = 0; #flag to indicate whether this is the base file which the rfi file is named after
+	my $rssItem;
+	my $containerFile;
+	foreach $rssItem (@resourceRelatedFiles) #@resourceRelatedFiles is added to during this foreach loop as included files are found
+	{
+		$rssItem = CleanPath($rssItem);
+		if( ! ($baseFile) )
+		{
+			$baseFile = 1; # set to non-zero so that setting up the rfi file is only done once
+			if($rssItem =~m-\/-)
+			{
+				if($rssItem =~m-^\S*\/([^\/]+)$-) # just extracts file name
+				{
+					$containerFile = $1 . ".rfi";
+				}
+			}
+			else
+			{
+				$containerFile = $rssItem . ".rfi";
+			}
+			open CONTAINER, ">$containerFile";
+		}
+		OutputHeader($rssItem);
+		my $resourceFiles = ReadFile($rssItem, \@resourceRelatedFiles, $systemIncludeList, $userIncludeList);
+		@resourceRelatedFiles = @$resourceFiles;
+	}
+	close CONTAINER;
+	return $containerFile;
+}
+
+sub CheckForInclude
+{ # check whether the passed line from the resource type file is a #include line, if it is then store it to be added to the rfi file
+	my ($line, $dir, $resourceFiles, $systemIncludeList, $userIncludeList) = @_;
+	my @resourceFiles = @$resourceFiles;
+	if($line =~ /^\s*\#include\s+([\<\"])(\S+)([\>\"])(\s+\/\/.*)?/)
+	{
+		if( ($1 eq "\"") and ($3 eq "\"") )
+		{
+			my $possibleAddition = SearchDirectories($2, "quoted", $dir, $systemIncludeList, $userIncludeList);
+			if($possibleAddition ne "")
+			{
+				push @resourceFiles, $possibleAddition;
+			}
+		}
+		elsif( ($1 eq "\<") and ($3 eq "\>") )
+		{
+			my $possibleAddition = SearchDirectories($2, "angle", $dir, $systemIncludeList, $userIncludeList);
+			if($possibleAddition ne "")
+			{
+				push @resourceFiles, $possibleAddition;
+			}
+		}
+	}
+	return \@resourceFiles;
+}
+
+sub ReadFile
+{ # copy the passed file into the rfi file and check it for included files
+	my ($fileName, $resourceFiles, $systemIncludeList, $userIncludeList) = @_;
+	my $dir = GetRelDir($fileName);
+
+	open RESOURCE, $fileName or die "Can't open file $fileName from " . cwd() . "\n";
+	my $line;
+	foreach $line (<RESOURCE>)
+	{
+		print CONTAINER $line;
+		$resourceFiles = CheckForInclude($line, $dir, $resourceFiles, $systemIncludeList, $userIncludeList);
+	}
+	close RESOURCE;
+	return $resourceFiles;
+}
+
+sub OutputHeader
+{
+	my ($fileName) = @_;
+	print CONTAINER "\n\n/* GXP ***********************\n";
+	if($fileName =~m-\/-)
+	{ # remove path as only want to store file name
+		if($fileName =~m-^\S*\/([^\/]+)$-)
+		{
+			print CONTAINER " * $1\n";
+		}
+	}
+	else
+	{
+		print CONTAINER " * $fileName\n";
+	}
+	print CONTAINER " ****************************/\n\n";
+}
+
+
+sub RecordSystemIncludes
+{
+	my ($line) = @_;
+	my @terms = split(/ /, $line);
+	my $term;
+	my @systemIncludes = ();
+	foreach $term (@terms)
+	{
+		if($term!~m/\/\//) # if term is not the start of a c++ style comment
+		{
+			push @systemIncludes, $term;
+		}
+		else
+		{
+			last;
+		}
+	}
+	return \@systemIncludes;
+}
+
+sub RecordUserIncludes
+{
+	my ($line) = @_;
+	my @terms = split(/ /, $line);
+	my $term;
+	my @userIncludes = ();
+	foreach $term (@terms)
+	{
+		if($term!~m/\/\//) # if term is not the start of a c++ style comment
+		{
+			push @userIncludes, $term;
+		}
+		else
+		{
+			last;
+		}
+	}
+	return \@userIncludes;
+}
+
+sub CleanPath # change \ and \\ in path to /
+{
+	my ($fileName) = @_;
+	$fileName =~ s-\\\\-\/-og;
+	$fileName =~ s-\\-\/-og;
+	return $fileName;
+}
+
+sub RecordSourcePath
+{
+	my ($line) = @_;
+	my $sourcePath;
+	if($line=~/^(\S+)/) # in case of comments at end of line
+	{
+		$sourcePath = $1;
+		$sourcePath = CleanPath($sourcePath);
+		if($sourcePath !~ m/\/$/)
+		{
+			$sourcePath .= "\/";
+		}
+	}
+	return $sourcePath;
+}
+
+sub SearchDirectories
+{
+	my ($fileName, $includeType, $base, $systemIncludeList, $userIncludeList) = @_;
+	my @systemIncludes = @$systemIncludeList;
+	my @userIncludes = @$userIncludeList;
+
+	$fileName = CleanPath($fileName);
+
+	if(-e $base.$fileName)
+	{
+		return $base.$fileName;
+	}
+	if($includeType eq "quoted")
+	{
+		# search through the user includes and return dir + file name if found
+		my $directory;
+		foreach $directory (@userIncludes)
+		{
+			my $qualifiedFileName = $directory . "/" . $fileName;
+			if(-e $qualifiedFileName)
+			{
+				return $qualifiedFileName;
+			}
+		}
+	}
+
+	# search through the system includes
+	my $directory;
+	foreach $directory (@systemIncludes)
+	{
+		my $qualifiedFileName = $directory . "/" . $fileName;
+		if(-e $qualifiedFileName)
+		{
+			return $qualifiedFileName;
+		}
+	}
+	return "";
+}
+
+
+sub GatherResourceInformation
+{
+	my $BldPath=&main::BldPath;
+	unless (-d $BldPath) {
+		mkpath([$BldPath]);
+	}
+	$BldPath = (&main::Path_StepDirs($BldPath))[-2];
+	my $bldInfDirectory = cwd(); # store current directory so can return to it later
+	my $MmpFile = &main::MmpFile();
+	$MmpFile = CleanPath($MmpFile);
+	my $MmpFileDir = "./";
+	my $MmpFileName = $MmpFile;
+	if($MmpFile=~m-\/-)
+	{
+		if($MmpFile=~m-^(.*)\/([^\/]*)$-)
+		{
+			$MmpFileDir = $1;
+			$MmpFileName = $2;
+		}
+	}
+	chdir($MmpFileDir) or die "Error: Could not change to MMP file directory: $MmpFileDir\n";
+	
+	my $rfiFileList = &SearchMmpFile; # analyse the mmp file for resource files
+
+	my @RfiFiles = @$rfiFileList;
+	foreach (@RfiFiles) # copy the rfi files to the BldPath and delete them from temporary locations
+	{
+		system("copy \"$_\" \"$BldPath$_\"");
+		unlink $_;
+	}
+	chdir($bldInfDirectory); # return to the orignial directory
+
+	return \@RfiFiles; # return list of rfi files to be added to .mmp.xml file
+}
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_generic.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1137 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# this package contains generic routines to handle bits of makefiles which are
+# common to all of the platforms. Currently it deals with AIF, MBM amd RSC files.
+# 
+#
+
+package cl_generic;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Generic_Define
+	Generic_Definition
+	Generic_MakeWorkDir
+	Generic_MakeWorkFile
+	Generic_Quote
+	Generic_Header
+	Generic_Releaseables
+	Generic_BitMapBld
+	Generic_ResrcBld
+	Generic_AifBld
+	Generic_End
+	Generic_CopyAction
+	Generic_WhatCleanTargets
+	Generic_WhatTargets
+	Generic_CleanTargets
+);
+
+use File::Basename;
+use lockit_info;
+use CheckSource;
+use E32Variant;
+
+my $SavedBldPath;
+my $MakefileType=0;	# 0=NMAKE, 1=MAKE
+my %CheckSourceResourceIncludes;
+
+sub Generic_Header ($$;$) {
+	my ($UseRltPaths, $makefileType, $supportAbsPathConversion) = @_;
+	
+	$MakefileType=($makefileType eq "nmake")? 0:1;
+
+	my $LibSubDir="UDEB";
+	if (&main::PlatOS eq 'EPOC32') {
+		$LibSubDir="UREL";
+	}
+	elsif (&main::PlatOS eq 'TOOLS2') {
+		$LibSubDir="LIB";
+	}
+
+	my $BldPath=&main::BldPath;
+
+	if ( LocalBuildPathExists() ) {
+		$BldPath = ConvertToLocalBuild($BldPath);
+	}
+
+	# Get the information regarding supporting Compiler Wrapper option
+	my $IsCompilerWrapperOption=&main::CompilerWrapperOption();
+	my $RelPath=&main::RelPath;
+	my $LibPath=&main::LibPath;
+	my $LinkPath=&main::LinkPath;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $ASSPLinkPath=&main::ASSPLinkPath;
+
+	$SavedBldPath=&main::Path_Chop($BldPath);
+
+	if ($UseRltPaths) {
+
+		if ( ! LocalBuildPathExists() ) {
+			# Local build does not exists so keep relative path.
+			$BldPath     =&main::Path_RltToWork($BldPath);
+		}
+
+		$RelPath     =&main::Path_RltToWork($RelPath);
+		$LibPath     =&main::Path_RltToWork($LibPath);
+		$LinkPath    =&main::Path_RltToWork($LinkPath);
+		$StatLinkPath=&main::Path_RltToWork($StatLinkPath);
+		$ASSPLinkPath=&main::Path_RltToWork($ASSPLinkPath);
+	}
+
+	$BldPath=&main::Path_Chop($BldPath);
+	$RelPath=&main::Path_Chop($RelPath);
+	$LibPath=&main::Path_Chop($LibPath);
+	$LinkPath=&main::Path_Chop($LinkPath);
+	$StatLinkPath=&main::Path_Chop($StatLinkPath);
+	$ASSPLinkPath=&main::Path_Chop($ASSPLinkPath);
+
+	my $EPOCDataPath=&main::Path_Chop(&main::EPOCDataPath);
+	my $EPOCIncPath=&main::Path_Chop(&main::EPOCIncPath);
+	my $DataPath=&main::Path_Chop(&main::DataPath);
+	my $TrgPath=&main::Path_Chop(&main::TrgPath);
+
+	my $erasedefn = "\@erase";
+	$erasedefn = "\@erase 2>>nul" if ($ENV{OS} eq "Windows_NT");
+
+	&main::Output(
+		"\n",
+		'# CWD ',             &main::Path_WorkPath, "\n",
+		'# MMPFile ',         &main::MmpFile,       "\n",
+		'# Target ',          &main::Trg,           "\n",
+		'# TargetType ',      &main::TrgType,       "\n",
+		'# BasicTargetType ', &main::BasicTrgType,  "\n",
+		'# MakefileType ', ($MakefileType==1)? "GNU":"NMAKE", "\n"
+	);
+
+	my @BldList=&main::BldList;
+	my %featureVariantInfo = &main::FeatureVariantInfo;
+	
+	if (%featureVariantInfo)
+		{
+		&main::Output("# FeatureVariantName ", $featureVariantInfo{NAME}, "\n");
+
+		foreach (@BldList)
+			{
+			&main::Output("# FeatureVariant".$_."Label ", $featureVariantInfo{$_."_LABEL"}, "\n");
+			}
+		}
+		
+	&main::Output(
+		"\n",
+		"ERASE = $erasedefn\n",
+		"\n"
+	);
+
+	# Include function to perform optional DOS to Unix slash conversion
+	# on absolute paths if requested from backend.
+	if ($supportAbsPathConversion) {
+		&main::Output(
+			"ifeq \"\$(UNIX_SLASH_FOR_CC_ABS_PATHS)\" \"1\"\n",
+			"define absolutePaths\n",
+			"\$(subst \\,\/,\$1)\n",
+			"endef\n",
+			"else\n",
+			"define absolutePaths\n",
+			"\$1\n",
+			"endef\n",
+			"endif\n",
+			"\n"
+		);
+	}
+
+	&main::Output(
+		"# EPOC DEFINITIONS\n",
+		"\n"
+	);
+	
+	Generic_Define("EPOCBLD",  $BldPath);
+	if (defined $ENV{PBUILDPID}) {
+		my $BldPathP = $BldPath . '$(PBUILDPID)';
+		Generic_Define("EPOCBLDP", $BldPathP);
+	} else {
+		Generic_Define("EPOCBLDP", $BldPath);
+	}
+	Generic_Define("EPOCTRG",  $RelPath);
+	Generic_Define("EPOCLIB",  $LibPath);
+	Generic_Define("EPOCLINK", $LinkPath);
+	Generic_Define("EPOCSTATLINK", $StatLinkPath);
+	Generic_Define("EPOCBSFSTATLINK", $RelPath);
+	Generic_Define("EPOCASSPLINK", $ASSPLinkPath);
+
+	Generic_Define("EPOCDATA", $EPOCDataPath);
+	Generic_Define("EPOCINC",  $EPOCIncPath);
+	Generic_Define("TRGDIR",   $TrgPath);
+	Generic_Define("DATADIR",  $DataPath);
+	
+
+	foreach (@BldList) {
+		&main::Output("\n");
+
+		my $bldOffset = "";
+		$bldOffset .= $featureVariantInfo{$_."_LABEL"}."\\" if (%featureVariantInfo && !$featureVariantInfo{INVARIANT});
+			
+		Generic_Define("EPOCBLD$_", "\$(EPOCBLD)\\".$bldOffset.lc($_));
+		if (defined $ENV{PBUILDPID}) {
+			Generic_Define("EPOCBLDP$_", "\$(EPOCBLDP)\\".$bldOffset.lc($_));
+		} else {
+			Generic_Define("EPOCBLDP$_", "\$(EPOCBLD)\\".$bldOffset.lc($_));
+		}
+		Generic_Define("EPOCTRG$_", "\$(EPOCTRG)\\".lc($_));
+		Generic_Define("EPOCLIB$_", "\$(EPOCLIB)\\".lc($LibSubDir));
+		Generic_Define("EPOCLINK$_", "\$(EPOCLINK)\\".lc($LibSubDir));
+		Generic_Define("EPOCSTATLINK$_", "\$(EPOCSTATLINK)\\".lc($_));
+		Generic_Define("EPOCBSFSTATLINK$_","\$(EPOCBSFSTATLINK)\\".lc($_));
+		Generic_Define("EPOCASSPLINK$_", "\$(EPOCASSPLINK)\\".lc($LibSubDir));
+	}
+	
+	# Compiler Wrapper option support 
+	# Generate the information Compiler Wrapper options in second level make file.
+	if($IsCompilerWrapperOption)
+	{
+		&main::Output(
+			"\n\n",
+			"#COMPILER WRAPPER OPTION DEFINITIONS\n",
+			"COMPWRAP = ",
+			"$ENV{ABLD_COMPWRAP}", # Extract the tool name from environment variable
+			"\n\n"
+		);
+	}
+	# Compiler Wrapper option
+	
+	my $gccxml;
+	if (&main::Plat =~ /gccxml/i){
+		$gccxml = &main::Plat;
+	}
+	
+	my $edg;
+	if (&main::Plat =~ /edg/i){
+		$edg = &main::Plat;
+	}
+	
+	&main::Output(
+		"\n",
+		"# EPOC PSEUDOTARGETS\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		if(!$edg){
+			&main::Output(
+				"$_ : MAKEWORK$_ RESOURCE$_\n\n"
+			);
+		}
+		else {
+			&main::Output(
+				"$_ : MAKEWORK$_ \n\n"
+			);
+		}
+	}
+
+	&main::Output(	# ALL comes after DEB: because first target in makefile is the default
+		"ALL :"
+	);
+	foreach (@BldList) {
+		&main::Output(
+			" $_"
+		);
+	}
+	# # Compiler Wrapper option support 
+	if($IsCompilerWrapperOption)
+	{
+		&main::Output(	# ALL comes after DEB: because first target in makefile is the default
+			"\n\nCOMPWRAPALL : COMPWRAPUREL COMPWRAPUDEB"
+		);
+
+	}
+
+	&main::Output(
+		"\n",
+		"\n",
+		"CLEAN CLEANALL : CLEANBUILD CLEANRELEASE CLEANLIBRARY\n",
+		"\n"
+	);
+	my $pseudoTarget;
+	foreach $pseudoTarget ("WHAT", "RESOURCE", "CLEANBUILD", "CLEANRELEASE", 
+				"MAKEWORK", "LISTING")
+		{
+		if(($gccxml && $pseudoTarget eq "RESOURCE") ||
+		!($gccxml || $edg)){
+
+			&main::Output(
+				"\n",
+				"\n",
+				"$pseudoTarget $pseudoTarget","ALL :"
+			);
+			foreach (@BldList) {
+				&main::Output(
+					" $pseudoTarget$_"
+				);
+			}
+		}	
+	}
+	if($gccxml){
+		&main::Output(
+		"\n",
+		"\n",
+		);
+	}
+
+	if(!($gccxml || $edg)){
+		&main::Output(
+			"\n",
+			"\n",
+			"MAKEWORK : MAKEWORKLIBRARY\n",
+			"\n"
+		);
+	}
+	if(!$edg){
+		foreach (@BldList) {
+			&main::Output(
+				"RESOURCE$_ "
+			);
+		}
+		&main::Output(
+			": GENERIC_RESOURCE\n",
+			"\n"
+		);
+	}
+}
+
+# Quote name if necessary, according to the type of Makefile
+
+sub Generic_Quote ($) {
+	my ($name)=@_;
+	if ($MakefileType==1) {
+		# GNU make wants backslash before each space
+		$name =~ s/ /\\ /go;
+	} else {
+		# NMAKE prefers quotes around all filenames
+		$name = "\"$name\"";
+	}
+	return $name;
+}
+
+# Generic file copying action, which uses built-in variables quoted appropriately
+#
+# GNU make variables may contain spaces, but perl.exe will be executed directly
+# and so doesn't need any quotes.
+
+sub Generic_CopyAction($) {
+	my ($target) = @_;
+	my $source = '$?';
+	$target = '$@' if (!defined $target);
+	return "perl -S ecopyfile.pl $source $target\n";
+}
+
+# Record necessary directories, for eventual emkdir.pl rules
+# Also need to record related defines, to eliminate duplicates
+
+my %DirDefines;
+sub expandDefines ($) {
+	my ($value)=@_;
+	while ($value =~ /^(.*?)\$\((\w+)\)(.*)$/) {
+		last if ($2 eq 'PBUILDPID');
+		$value="$1$DirDefines{$2}$3";
+	}
+	return $value;
+}
+sub Generic_Define ($$;$) {
+	my ($name, $value, $trailer)=@_;
+	$trailer="" if (! defined $trailer);
+	&main::Output(
+		"$name = $value$trailer\n"
+	);
+	$DirDefines{$name}=expandDefines($value);
+}
+sub Generic_Definition ($) {
+	return $DirDefines{$_[0]};
+}
+
+my %MkDirs;
+sub Generic_MkDir ($) {
+	my $dir=&main::Path_Chop(&expandDefines($_[0]));
+	$dir = lc $dir;
+	$dir =~ s/\$\(pbuildpid\)/\$\(PBUILDPID\)/g;
+	$MkDirs{$dir}=1;
+	return $dir;
+}
+
+# Accumulate MAKEWORK targets and lists of directories,
+# automatically filling in the rest of the details.
+#
+my %MakeWork;
+sub Generic_MakeWorkDir($$) {
+	my ($work, $dir) = @_;
+
+	if ( LocalBuildPathExists() ) {
+		$dir = ConvertToLocalBuild($dir);
+	}
+
+	my $workhash;
+	if (defined $MakeWork{$work}) {
+		$workhash=$MakeWork{$work};
+	} else {
+		my %newhash;
+		$workhash=\%newhash;
+		$MakeWork{$work}=$workhash;
+	}
+	my $normdir=lc &main::Path_Chop(&expandDefines($dir));
+	$normdir =~ s/\$\(pbuildpid\)/\$\(PBUILDPID\)/g;
+	$$workhash{$normdir} ||= &Generic_MkDir($dir);
+}
+
+sub Generic_MakeWorkFile($$) {
+	my ($work, $file) = @_;
+	my $dir=&main::Path_Split('Path',&expandDefines($file));
+	&Generic_MakeWorkDir($work,$dir);
+}
+
+
+sub Generic_WhatTargets($$@)
+{
+	my ($prefix, $whattarget, @files)=@_;
+	
+	if ((scalar @files) == 0) {
+		&main::Output(
+			"\n",
+			"\n$whattarget :\n",
+			"\t\@rem none\n"
+		);
+	} else {
+# emit list of releasables in batches to avoid overflowing the 2048 character 
+# batch file line limit doing echo or erase...
+
+		my $count=1;
+		my $length=0;
+		&main::Output(
+			"\n",
+			"${prefix}_RELEASEABLES$count="
+		);
+
+		my $File;
+
+		foreach $File (sort @files) {
+			my $name = &Generic_Quote($File);
+			my $namelen = length($name)+3;	# for space, newline and tab
+			if ($length+$namelen > 1700) {	# very conservative limit
+				$count++;
+				$length=0;
+				&main::Output(
+					"\n",
+					"${prefix}_RELEASEABLES$count="
+				);
+			}
+			&main::Output(
+				" \\\n\t", $name
+			);
+			$length += $namelen;
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"$whattarget:\n"
+		);
+		my $filecount=1;
+		while ($filecount<=$count) {
+			&main::Output(
+				"\t\@echo \$(${prefix}_RELEASEABLES$filecount)\n"
+			);
+			$filecount++;
+		}
+	}
+
+	&main::Output(
+		"\n",
+	);
+}
+	
+sub Generic_CleanTargets($$@) {
+	my ($prefix, $cleantarget, @files)=@_;
+	
+	if ((scalar @files) == 0) {
+		&main::Output(
+			"\n",
+			"\n$cleantarget :\n",
+			"\t\@rem none\n"
+		);
+	} else {
+# emit list of releasables in batches to avoid overflowing the 2048 character 
+# batch file line limit doing echo or erase...
+
+		my $count=1;
+		my $length=0;
+		&main::Output(
+			"\n",
+			"${prefix}_CLEANTARGETS$count="
+		);
+
+		my $File;
+
+		foreach $File (sort @files) {
+			my $name = &Generic_Quote($File);
+			my $namelen = length($name)+3;	# for space, newline and tab
+			if ($length+$namelen > 1700) {	# very conservative limit
+				$count++;
+				$length=0;
+				&main::Output(
+					"\n",
+					"${prefix}_CLEANTARGETS$count="
+				);
+			}
+			if (!main::NoExportLibrary || ($name !~ /.dso$/i && $name !~ /.lib$/i))
+			{
+				&main::Output(
+					" \\\n\t", $name
+				);
+				$length += $namelen;
+			}
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"$cleantarget:\n",
+		);
+		my $filecount=1;
+		while ($filecount<=$count) {
+			&main::Output(
+				"\t-\$(ERASE) \$(${prefix}_CLEANTARGETS$filecount)\n"
+			);
+			$filecount++;
+		}
+	}
+
+	&main::Output(
+		"\n",
+	);
+}
+
+sub Generic_WhatCleanTargets($$$@) {
+	my ($prefix, $whattarget, $cleantarget, @files)=@_;
+	
+	if ((scalar @files) == 0) {
+		&main::Output(
+			"\n",
+			"\n$whattarget $cleantarget :\n",
+			"\t\@rem none\n"
+		);
+	} else {
+# emit list of releasables in batches to avoid overflowing the 2048 character 
+# batch file line limit doing echo or erase...
+
+		my $count=1;
+		my $length=0;
+		&main::Output(
+			"\n",
+			"${prefix}_RELEASEABLES$count="
+		);
+
+		my $File;
+
+		foreach $File (sort @files) {
+			my $name = &Generic_Quote($File);
+			my $namelen = length($name)+3;	# for space, newline and tab
+			if ($length+$namelen > 1700) {	# very conservative limit
+				$count++;
+				$length=0;
+				&main::Output(
+					"\n",
+					"${prefix}_RELEASEABLES$count="
+				);
+			}
+			&main::Output(
+				" \\\n\t", $name
+			);
+			$length += $namelen;
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"$whattarget:\n"
+		);
+		my $filecount=1;
+		while ($filecount<=$count) {
+			&main::Output(
+				"\t\@echo \$(${prefix}_RELEASEABLES$filecount)\n"
+			);
+			$filecount++;
+		}
+		&main::Output(
+			"\n",
+			"$cleantarget:\n",
+		);
+		$filecount=1;
+		while ($filecount<=$count) {
+			&main::Output(
+				"\t-\$(ERASE) \$(${prefix}_RELEASEABLES$filecount)\n"
+			);
+			$filecount++;
+		}
+	}
+
+	&main::Output(
+		"\n",
+	);
+}
+
+# accumulated list of generic releasables
+my %Files;	
+sub Generic_End {
+	&Generic_WhatCleanTargets("GENERIC","WHATGENERIC","CLEANGENERIC", keys %Files);
+	
+	&main::Output(
+		"# Rules to create all necessary directories\n",
+	);
+
+	foreach (sort keys %MakeWork) {
+		my $workhash = $MakeWork{$_};
+		&main::Output(
+			"\n$_ :",
+		);
+		foreach (sort keys %$workhash) {
+			my $withcase=$$workhash{$_};
+			if ($withcase =~ /\$\(PBUILDPID\)\\/) {
+				&main::Output(
+					" \\\n",
+					"\t\$(if \$(PBUILDPID),", &Generic_Quote($withcase), ")"
+				);
+			} else {
+				&main::Output(
+					" \\\n",
+					"\t", &Generic_Quote($withcase)
+				);
+			}
+		}
+		&main::Output(
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my $dir;
+	foreach $dir (sort keys %MkDirs) {
+		if ($dir =~ /\$\(PBUILDPID\)\\/) {
+			&main::Output(
+				"\$(if \$(PBUILDPID),", &Generic_Quote($dir),") \\\n",
+			);
+		} else {
+			&main::Output(
+				&Generic_Quote($dir)," \\\n",
+			);
+		}
+	}
+	&main::Output(
+		":\n",
+		"\tperl -S emkdir.pl \$\@\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CHECKSOURCE :\n",
+	);
+
+	&main::Output (CheckSource_MakefileOutput(&main::CheckSourceMMPIncludes));
+	&main::Output (CheckSource_MakefileOutput(%CheckSourceResourceIncludes));
+	&main::Output (CheckSource_MakefileOutput(&main::CheckSourceMMPMetaData));
+
+	my $cs_targetprefix = "";
+	$cs_targetprefix = "U" unless (&main::Plat =~ /tools/i);
+
+	&main::Output(
+		"\nCHECKSOURCE".$cs_targetprefix."REL :\n",
+	);
+
+	&main::Output (CheckSource_MakefileOutput(&main::CheckSourceURELIncludes));
+
+	&main::Output(
+		"\nCHECKSOURCE".$cs_targetprefix."DEB :\n",
+	);
+
+	&main::Output (CheckSource_MakefileOutput(&main::CheckSourceUDEBIncludes));
+
+}
+
+sub Generic_Releaseables {
+
+	my $ResrcPath=&main::TrgPath;
+	my $dir;
+	my $EPOCIncPath=&main::EPOCIncPath;
+
+	&Generic_MakeWorkDir('GENERIC_MAKEWORK',$SavedBldPath);	    # used for temp directory in epocrc.pl
+			
+	my $AifStructRef=&main::AifStructRef;
+	my $AifRef;
+	foreach $AifRef (@$AifStructRef) {
+# regression change - workaround lack of AIF directory
+		$$AifRef{TrgFile}=&main::Path_Split('File',$$AifRef{Trg});  # record for later
+		my $path=&main::Path_Split('Path',"$ResrcPath$$AifRef{Trg}");  
+		my $file="\$(EPOCDATA)\\$ResrcPath$$AifRef{Trg}";
+		my $xip="_xip";
+		my $base=&main::Path_Split('Base',"$file");
+		my $root=&main::Path_Split('Path',"$file");
+		my $ext=&main::Path_Split('Ext',"$file");
+		my $file_xip="$root"."$base$xip$ext";	# since XIP AIF format is generated
+		if ($path eq "") {
+			# no target path for the AIF file, so not a releasable
+			$file="$SavedBldPath\\$$AifRef{Trg}";
+		} else {
+			$Files{$file}=1;
+			$Files{$file_xip}=1;
+		}
+		$$AifRef{GenericTrg}=$file;	    # record for later
+		&Generic_MakeWorkFile('GENERIC_MAKEWORK',$file);
+	}
+
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my $BitMapRef;
+	foreach $BitMapRef (@$BitMapStructRef) {
+		my $path=$$BitMapRef{TrgPath};
+		my $file="\$(EPOCDATA)\\$path$$BitMapRef{Trg}";
+		$$BitMapRef{GenericTrg}=$file;	    # record for later
+		$Files{$file}=1;
+		&Generic_MakeWorkFile('GENERIC_MAKEWORK',$file);
+		if ($$BitMapRef{Hdr}) {
+			my $mbg=&main::Path_Split('Base', $$BitMapRef{Trg});
+			$mbg="\$(EPOCINC)\\$mbg.mbg";
+			&Generic_MakeWorkDir('GENERIC_MAKEWORK',$EPOCIncPath);
+			$Files{$mbg}=1;
+		}
+	}
+
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my $ResourceRef;
+	foreach $ResourceRef (@$ResourceStructRef) {
+		if(defined $$ResourceRef{Hdronly})
+			{
+				my $rsg="\$(EPOCINC)\\$$ResourceRef{BaseTrg}.rsg";
+				$$ResourceRef{GenericTrg}=$rsg;	# record for later
+
+				&Generic_MakeWorkDir('GENERIC_MAKEWORK',$EPOCIncPath);
+				$Files{$rsg}=1;			
+			}
+		else
+			{
+				my $file="\$(EPOCDATA)\\$$ResourceRef{Trg}";
+				$$ResourceRef{GenericTrg}=$file;	# record for later
+				$Files{$file}=1;
+				&Generic_MakeWorkFile('GENERIC_MAKEWORK',$file);
+				if ($$ResourceRef{Hdr}) {
+					my $rsg="\$(EPOCINC)\\$$ResourceRef{BaseTrg}.rsg";
+					&Generic_MakeWorkDir('GENERIC_MAKEWORK',$EPOCIncPath);
+					$Files{$rsg}=1;
+				}
+			}
+	}
+
+# Do StringTable 'export'
+	my @stringTables = &main::StringTables();
+	foreach my $stringtable (@stringTables)
+	{
+		if(defined $stringtable->{ExportPath})
+		{
+			$Files{$stringtable->{ExportPath}."\\".$stringtable->{BaseTrg}.".h"} = 1;
+		}
+	}
+
+
+	&main::Output(
+		"GENERIC_RESOURCE : GENERIC_MAKEWORK\n",
+		"\n"
+	);
+
+}
+
+sub Generic_BitMapBld {
+
+	my $BitMapRef=&main::BitMapRef;
+	my $quotedTrg=&Generic_Quote($$BitMapRef{GenericTrg});
+	my $WorkPath = &main::Path_Chop(&main::Path_WorkPath); ## required for Lockit
+
+	&main::Output(
+		"# BitMap $$BitMapRef{Trg}\n",
+		"\n",
+		"GENERIC_RESOURCE : $quotedTrg\n",
+		"\n",
+		"$quotedTrg :"
+	);
+
+#	must lower-case header here since bmconv generates a header with case-sensitive enums accordingly
+	my $BitMapHdr=join('', &main::EPOCIncPath, &main::Path_Split('Base', $$BitMapRef{Trg}), '.mbg');
+	my $TmpBitMapHdr=join('', &main::BldPath, &main::Path_Split('Base', $$BitMapRef{Trg}), '.mbg');
+
+	my $SrcRef;
+	foreach $SrcRef (@{$$BitMapRef{Source}}) {
+	
+		if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+			%Files = &Lockit_Releasables($WorkPath, $$BitMapRef{Trg}, \%Files, basename($$SrcRef{Src}),"","");		
+		}
+		else {
+			%Files = &Lockit_Releasables($WorkPath, $$BitMapRef{Trg}, \%Files, basename($$SrcRef{Src}));
+		}
+		&main::Output(
+			" \\\n  ", &Generic_Quote($$SrcRef{Src})
+		);
+	}
+	&main::Output(
+		"\n",
+		"\tperl -S epocmbm.pl -h\"$TmpBitMapHdr\"",
+		"\t-o\"$$BitMapRef{GenericTrg}\"",
+		"\t-l\"\\$$BitMapRef{TrgPath}:$WorkPath\"",
+		"\\\n\t\t"
+	);
+	&main::Output(
+		" -b\""
+	);
+	foreach $SrcRef (@{$$BitMapRef{Source}}) {
+		&main::Output(
+			"\\\n\t\t/$$SrcRef{ClDepth}$$SrcRef{Src}"
+		);
+	}
+
+
+	&main::Output(
+		"\" \\\n\t\t"
+	);
+
+	&main::Output(
+		" -l\"\\$$BitMapRef{TrgPath}:$WorkPath\"\n"
+	);
+
+	if ($$BitMapRef{Hdr}) {
+		&main::Output(
+			"\tperl -S ecopyfile.pl \"$TmpBitMapHdr\" \"$BitMapHdr\"\n",
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+}
+
+sub Generic_ResrcBld {
+	my $ResourceRef=&main::ResourceRef;
+	my $WorkPath = &main::Path_Chop(&main::Path_WorkPath); # required for Lockit
+	my @RcompMacro=&main::MmpMacros;
+
+	&main::Output(
+		"# Resource $$ResourceRef{Trg}\n",
+		"\n"
+	);
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND="
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my $BaseResrc= $$ResourceRef{BaseTrg};
+	my $SrcPath=&main::Path_Split('Path', $$ResourceRef{Source});
+
+	my $AbsSrc;
+	my $AbsSrcPath;
+	
+	my $ResrcHdr=join '', &main::EPOCIncPath(), $BaseResrc, '.rsg';
+	my $AbsResrcHdr;
+	my $PlatName=&main::PlatName;
+
+	my @ChopAbsSysIncPaths;
+	my @ChopAbsUserIncPaths;
+
+	@ChopAbsSysIncPaths=&main::Path_Chop(&main::Path_AbsToWork(&main::ResourceSysIncPaths));
+	@ChopAbsUserIncPaths=&main::Path_Chop(&main::Path_AbsToWork(&main::UserIncPaths));
+
+	$AbsSrc=&main::Path_AbsToWork($$ResourceRef{Source});
+	$AbsSrcPath=&main::Path_AbsToWork($SrcPath);
+	$AbsResrcHdr=&main::Path_AbsToWork($ResrcHdr);
+
+	my $ChopAbsSrcPath=&main::Path_Chop($AbsSrcPath);
+
+	my $EPOCDataDir = &main::Path_Chop($$ResourceRef{TrgPath});
+	
+	my $RscOption= "";
+	my $HeaderOption = "";
+	my $HeaderCopyCmd = "";
+    if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha'))  {
+	if ($$ResourceRef{Hdr} || $$ResourceRef{Hdronly}) {
+		$HeaderOption = " -h\"$SavedBldPath\\$BaseResrc$$ResourceRef{Lang}.rsg\"";
+		$HeaderCopyCmd = "\tperl -S ecopyfile.pl \"$SavedBldPath\\$BaseResrc$$ResourceRef{Lang}.rsg\" \"$ResrcHdr\"\n";
+	}
+	
+	}
+	else {
+	if ($$ResourceRef{Hdr} || $$ResourceRef{Hdronly}) {
+		$HeaderOption = " -h\"$SavedBldPath\\$BaseResrc.rsg\"";
+		$HeaderCopyCmd = "\tperl -S ecopyfile.pl \"$SavedBldPath\\$BaseResrc.rsg\" \"$ResrcHdr\"\n";
+	}
+	}
+	if (! $$ResourceRef{Hdronly}) {
+		$RscOption = " -o\$\@ ";
+	}
+	
+	my $Uidsref=$$ResourceRef{Uids};
+	my @Uids=();
+	@Uids = @{$Uidsref} if (defined($Uidsref));
+	my $Uidsarg="";
+	if ($#Uids>0) {
+		$Uidsarg="-uid2 $Uids[0] -uid3 $Uids[1]";
+	}
+	elsif ($#Uids==0) {
+		$Uidsarg="-uid2 $Uids[0] ";
+	}
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha'))  {
+		%Files = &Lockit_Releasables($WorkPath, $$ResourceRef{Source}, \%Files, "", $$ResourceRef{Lang}) unless $$ResourceRef{Hdronly};
+	}
+	else {			
+		%Files = &Lockit_Releasables($WorkPath,$$ResourceRef{Source}, \%Files, "") unless $$ResourceRef{Hdronly};
+	}
+	my $quotedTrg=&Generic_Quote($$ResourceRef{GenericTrg});
+	&main::Output(
+		"GENERIC_RESOURCE : $quotedTrg\n",
+		"\n",
+		"$quotedTrg : ", &Generic_Quote($AbsSrc), " \$(DEPEND)\n",
+		"\tperl -S epocrc.pl -m045,046,047 -I \"$ChopAbsSrcPath\""
+	);
+	foreach (@ChopAbsUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	&main::Output(
+		" -I-"
+	);
+	foreach (@ChopAbsSysIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	foreach(@RcompMacro) {
+		&main::Output(
+			" -D$_ "
+		);
+	}
+	&main::Output(
+		" -DLANGUAGE_$$ResourceRef{Lang} -u \"$AbsSrc\" ",
+		" $Uidsarg ",
+		"$RscOption $HeaderOption -t\"$SavedBldPath\""
+	);
+
+	if (!$$ResourceRef{Hdronly}) {
+		&main::Output(
+			" -l\"$EPOCDataDir:$WorkPath\""
+		);				
+	}
+
+	if (&main::ResourceVariantFile()) {
+		&main::Output(
+			" -preinclude\"".&main::ResourceVariantFile()."\""
+		);
+	}
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		if ((lc $$ResourceRef{Lang}) eq "sc") {
+	
+			&main::Output(
+				"\n",
+				$HeaderCopyCmd,
+			);
+		}
+		&main::Output(		
+		"\n"
+		);
+	
+	}
+	else {
+		&main::Output(
+			"\n",
+			$HeaderCopyCmd,
+			"\n"
+		);
+	}
+
+	my @macros;
+	push @macros, "LANGUAGE_$$ResourceRef{Lang}", "_UNICODE";
+	my @userIncludes = &main::Path_Chop(&main::Path_AbsToWork(&main::UserIncPaths));
+	unshift (@userIncludes, $AbsSrcPath);	
+	my @systemIncludes = &main::Path_Chop(&main::Path_AbsToWork(&main::ResourceSysIncPaths));
+
+	CheckSource_Includes($AbsSrc, %CheckSourceResourceIncludes, &Variant_GetMacroHRHFile(), @macros, @userIncludes, @systemIncludes);
+}
+
+sub Generic_AifBld {
+
+	my $AifRef=&main::AifRef;
+	my $ResrcPath=&main::TrgPath;
+
+	&main::Output(
+		"# Aif $$AifRef{Trg}\n",
+		"\n"
+	);
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND="
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::ResourceSysIncPaths));
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::UserIncPaths));
+	my $BaseResrc=&main::Path_Split('Base',$$AifRef{Source});
+
+	my $WorkPath = &main::Path_Chop(&main::Path_WorkPath); # required for Lockit
+	my $quotedTrg=&Generic_Quote($$AifRef{GenericTrg});
+	&main::Output(
+		"GENERIC_RESOURCE : $quotedTrg\n",
+		"\n",
+		"$quotedTrg : ", &Generic_Quote("$$AifRef{Source}"), " \$(DEPEND)"
+	);
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+	%Files = &Lockit_Releasables($WorkPath, $$AifRef{TrgFile}, \%Files, "", "");
+	}
+	else 
+	{
+	%Files = &Lockit_Releasables($WorkPath, $$AifRef{TrgFile}, \%Files, "");
+	}
+	my $bitmapArg = "";
+	if ($$AifRef{BitMaps}) { # bitmaps aren't essential
+		$bitmapArg = "\\\n\t\t-b\"";
+		foreach my $BitMapRef (@{$$AifRef{BitMaps}}) {
+			my $BitMap = &main::Path_Split('File', $$BitMapRef{Src});
+			if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+			%Files = &Lockit_Releasables($WorkPath, $$AifRef{TrgFile}, \%Files, $BitMap, "");
+			}
+			else
+			{
+			%Files = &Lockit_Releasables($WorkPath, $$AifRef{TrgFile}, \%Files, $BitMap);
+			}
+			&main::Output(
+				" ", &Generic_Quote("$$BitMapRef{Src}")
+			);
+			$bitmapArg .= "\\\n\t\t/$$BitMapRef{ClDepth}$$BitMapRef{Src}";
+		}
+		$bitmapArg .= "\" ";
+	}
+	&main::Output(
+		"\n",
+		"\tperl -S epocaif.pl -o\$\@ ",
+		"\"$$AifRef{Source}\" ",
+		"\\\n\t\t",
+		"-t\"$SavedBldPath\" ",
+		" -l\"\$(TRGDIR):$WorkPath\"",
+		$bitmapArg,
+		"\\\n\t\t"
+	);
+	foreach (@ChopRTWUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	&main::Output(
+		" -I-"
+	);
+	foreach (@ChopRTWSysIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+
+
+#
+# Check to see that LOCAL_BUILD_PATH exists.
+#
+
+sub LocalBuildPathExists() 
+{
+	if ( defined( $ENV{LOCAL_BUILD_PATH} ) ) {
+		return 1;
+	}
+	else {
+		return 0;
+	}
+}
+
+
+#
+# Take the build path and ensure that it is now local. 
+#
+
+
+sub ConvertToLocalBuild($)
+{
+	my ($BldPath)=@_;
+
+	my $sub_replacement = $ENV{"LOCAL_BUILD_PATH"};
+	if ( !ValidBuildPath($sub_replacement) ) {
+		&FatalError(" Invalid Local Build Path : LOCAL_BUILD_PATH = \"$BldPath\"  must be in format drive:dir_name1 " );
+	}
+	else
+	{
+		# Replace the \epoc32\build with local setting
+		my $epocroot=$ENV{"EPOCROOT"};
+		
+		my $sub_match = "\Q${epocroot}\EEPOC32\\\\BUILD";
+		$BldPath =~ s/${sub_match}/${sub_replacement}/;
+	}
+
+	return $BldPath
+}
+
+
+
+#
+# Checks that the path is at least of the form drive:path_name
+# If no drive: then the makefiles will be produced but not work. 
+#
+
+
+sub ValidBuildPath($)
+{
+	my ($BldPath)=@_;
+
+	if ( $BldPath =~/^[a-zA-z]{1}:{1}.*$/) {
+		# Must have at least d:
+		return 1;
+	}
+	else {
+		return 0;
+	}
+
+}
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_mingw.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,591 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_mingw;
+
+my $MinGWInstall='$(EPOCROOT)epoc32\\gcc_mingw\\bin';
+my $MinGWPreInclude='$(EPOCINC)\\gcc_mingw\\gcc_mingw.h';
+
+my $GccPrefix='';
+my $ToolPrefix='';
+my $HelperLib='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+    'Gcc'=>'',
+	'Ld'=>'',
+	# MinGW > 3.2.3 has been found to generate programs that crash (rombuild in particular) 
+	# and a workaround this appears to be to use specific optimisations rather than
+	# specifying -O options
+	'Optimize'=>'-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'
+
+);
+my $Dlltool;
+my $Archive;
+my $Link;
+my $Objcopy;
+
+my @Win32LibList=();
+my $Win32StdHeaders;
+
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMCheckPlatformL
+	PMPlatProcessMmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+);
+
+use cl_generic;
+use Genutl;
+use Winutl;
+
+sub PMHelp_Mmp {
+}
+
+sub PMCheckPlatformL {
+	if ((&main::Plat eq 'TOOLS2') and (&main::BasicTrgType ne 'EXE') and (&main::BasicTrgType ne 'LIB'))
+		{
+		die "Can't specify anything but EXE or LIB TARGETTYPEs for this platform\n";
+		}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, "$ENV{EPOCROOT}epoc32\\gcc_mingw\\include");
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+my $Makecmd;
+
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @SysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @UserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+
+	my $EPOCPath=&main::EPOCPath;
+	my $LibPath=&main::LibPath;
+
+	my @MacroList=&main::MacroList();
+
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $CompilerOption=&main::CompilerOption("GCC");
+	my $LinkerOption=&main::LinkerOption("GCC");
+
+	$Dlltool=$ToolPrefix.'$(DLLTOOL)';
+	$Archive=$ToolPrefix.'$(AR)';
+	$Link=$ToolPrefix.'$(GCC)';
+	$Objcopy=$ToolPrefix.'$(OBJCOPY)';
+
+	&Generic_Header(0, $Makecmd);	# define standard things using absolute paths
+	
+	push @MacroList, "__TOOLS__";
+	push @MacroList, "__TOOLS2_WINDOWS__";
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+	push @MacroList, "__PRODUCT_INCLUDE__=\\\"${VariantFile}\\\"" if ($VariantFile);
+
+	# Remove __GCC32__ for TOOLS2 builds from the macro list.
+	my $count = 0;
+	foreach my $item (@MacroList) {
+		if ($item =~ m/GCC32/i) {
+			splice (@MacroList,$count,1)
+		}
+		$count++;
+	}
+
+
+#	GCC needs a fully-qualified path
+	&main::Output(
+		"\n",
+		"# must set both PATH and Path to make it work correctly\n",
+		"Path:=\$(Path)\n",
+		"PATH:=\$(Path)\n",
+		"\n"
+	);
+
+	&main::Output(
+		"INCDIR= -isystem \"$ENV{EPOCROOT}epoc32\\include\\tools\\stlport\" "
+	);
+
+	foreach (@SysIncPaths) {
+		&main::Output(
+			" -isystem \"$_\""
+		);
+	}
+
+	foreach (@UserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+
+	if($VariantFile){
+	    &main::Output("\\\n  -include $MinGWPreInclude");
+	}
+
+
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCFLAGS=$PlatOpt{Gcc} \\\n",
+		"\t\t-pipe -c -Wall -W -Wno-ctor-dtor-privacy -Wno-unknown-pragmas",
+	);
+	
+	&main::Output(
+		" $CompilerOption",		# user-supplied compiler options
+		"\n",
+		"\n"
+	);
+	
+	&main::Output(
+ 		"\n# ADDITIONAL LINKER OPTIONS",
+ 		"\nUSERLDFLAGS = ",
+ 		$LinkerOption,
+  		"\n\n"
+  	);
+
+	&main::Output(
+		"GCCDEFS="
+	);
+
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	&main::Output(
+		"MINGWPATH?=$MinGWInstall", "\n",
+		"DLLTOOL:=\$(MINGWPATH)\\dlltool", "\n",
+		"AR:=\$(MINGWPATH)\\ar", "\n",
+		"OBJCOPY:=\$(MINGWPATH)\\objcopy", "\n",
+		"GCC:=\$(MINGWPATH)\\g++", "\n" 
+	);
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_=\$(GCC)"
+		);
+		if (/^REL$/o) {
+			&main::Output(' -s ', $PlatOpt{Optimize});
+		}
+		elsif (/^DEB$/o) {
+			&main::Output(' -g');
+			unless (&main::SrcDbg) {
+				&main::Output(' ', $PlatOpt{Optimize});
+			}
+		}
+		&main::Output(' $(GCCFLAGS)');
+		foreach (&main::MacroList($_)) {
+			&main::Output(" -D$_");
+		}
+		&main::Output(" \$(GCCDEFS)\n");
+	}
+
+	&main::Output("\n","\n");
+
+	foreach (@BldList) {
+		&main::Output("$_ :");
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (" \\\n\t",&Generic_Quote("\$(EPOCTRG$_)\\$Trg"));
+		}
+		&main::Output("\n","\n");
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+
+	foreach (@BldList) {
+		&main::Output("\n",	"RESOURCE$_ : MAKEWORK$_");
+	}
+	&main::Output("\n", "\n",);
+
+	&main::Output("LIBRARY : MAKEWORKLIBRARY");
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(" $_");
+		}
+	}
+
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}LIB");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LibPath=&main::LibPath;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+
+	if ($Bld =~ /DEB/) {
+		@LibList = &main::DebugLibList;
+	} else {
+		@LibList = &main::LibList;
+	}
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	my $toolspath=&main::EPOCToolsPath();
+
+	if ($BasicTrgType!~/^LIB$/io)
+		{
+		push @releaseables, "$toolspath$Trg";
+		}
+	else
+		{
+		push @releaseables, "$RelPath$Trg";
+		}
+
+	if (!$NoExportLibrary && ($BasicTrgType!~/^(LIB|EXE)$/io)) {	
+		push @releaseables, "\$(EPOCLINK$Bld)\\lib$ExportLibrary.a";
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	
+	&main::Output(
+		"OBJECTS$Bld="
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ",
+		&Generic_Quote("\$(OBJECTS$Bld)")
+	);
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+#	Link target
+	if ($BasicTrgType=~/^EXE/o) {
+#		call g++ to link the target
+		&main::Output(
+			"\t$Link $PlatOpt{Ld}"
+		);
+		if ($Bld=~/^REL$/o) {
+			&main::Output(
+				" -s"
+			);
+		}
+		
+		&main::Output(
+			" -o \"\$(EPOCTRG$Bld)\\$Trg\" \\\n",
+			"\t\t\$(OBJECTS$Bld) \\\n"
+		);
+		&main::Output(
+			"\t\t-L\$(EPOCTRG$Bld) \\\n"
+		);
+			
+		# Add dynamic libraries (dlls on Windows, .so on *nix systems) to linker options
+		if (scalar @LibList)
+		{
+			&main::Output("\t\t-Wl,-Bdynamic ");
+		}
+		my $libs="";
+		foreach my $lib (@LibList)
+		{
+			$libs.="-l$lib ";
+		}
+		if ($libs ne "")
+		{
+			&main::Output(
+				"$libs \\\n"
+			);
+		}
+		
+		# Add static libraries (.a on both Windows and *nix) to linker options
+		if (scalar @StatLibList)
+		{
+			&main::Output("\t\t-Wl,-Bstatic ");
+		}
+		my $statLibs="-lstlport.5.1 ";
+		foreach my $lib (@StatLibList)
+		{
+			$statLibs.="-l$lib ";
+		}
+		if ($statLibs ne "")
+		{
+			$statLibs.="\\\n";
+		}
+		&main::Output(
+			"$statLibs"
+		);
+		
+		&main::Output(
+			"\t\t \$(USERLDFLAGS)\n"
+		);
+		&main::Output(
+			"\tcopy \"\$(EPOCTRG$Bld)\\$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\t$Archive cr \$\@ \$^\n"
+		);
+	}
+	elsif ($BasicTrgType =~ /^DLL$/o)
+	{
+		&main::Output(
+			"\t$Link -shared -o \$@ -Wl,--out-implib,\$(EPOCLINK$Bld)\\" . "lib" . "$ExportLibrary.a \$(OBJECTS$Bld)",
+			"\n"
+		);
+		&main::Output(
+			"\tcopy \"\$@\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+
+	}
+
+
+	&main::Output(
+		"\n"
+	);
+
+
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=&main::Src;
+	my $SrcPath=&main::Path_Chop(&main::SrcPath);
+	my $Ext=&main::Path_Split('Ext', $Src);
+	my $Plat=$main::Plat;
+
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;	
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+		&Generic_Quote("$SrcPath\\$Src"), "\n",
+		"\techo $Src\n",
+		"\t\$(GCC$Bld) -I \"$SrcPath\" \$(INCDIR) -o \$\@ \"$SrcPath\\$Src\"\n",
+		"\n",
+#		generate an assembly listing target too
+		"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+		"\t", &Generic_CopyAction("$SrcPath\\$BaseSrc.tools2.lst"),
+		"\n",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+		&Generic_Quote("$SrcPath\\$Src"), "\n",
+		"\t\$(GCC$Bld) -Wa,-adln -I \"$SrcPath\" \$(INCDIR) -o nul: \"$SrcPath\\$Src\" > \$\@\n",
+		"\n"
+	);
+	
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_tools.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,569 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package Cl_tools;
+
+# declare variables global for module
+my @Win32LibList=();
+my $BaseAddressFlag;
+my $Win32Resrc;
+
+my $MWCC;
+my $MWLD;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+	PMCheckPlatformL
+	PMPlatProcessMmp
+	PMStartBldList
+	PMBld
+	PMStartSrcList
+	PMStartSrc
+	PMSrcDepend
+	PMSrcBldDepend
+	PMEndSrcBld
+	PMEndSrc
+	PMEndSrcList
+);
+
+use Winutl;
+use cl_generic;
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub PMCheckPlatformL {
+	if ((&main::Plat eq 'TOOLS') and (&main::BasicTrgType ne 'EXE') and (&main::BasicTrgType ne 'LIB')) {
+		die "Can't specify anything but EXE or LIB targettypes for this platform\n";
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, $ENV{MWCSym2Includes});
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	if ($BaseAddressFlag ne "") {
+		$BaseAddressFlag=" -imagebase \"$BaseAddressFlag\"";
+	}
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32Resrc=&Winutl_Win32Resrc;
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $WarningLevel=&main::CompilerOption("CW");
+
+	# check version of CodeWarrior for Symbian OS
+	if (defined($ENV{MWSym2Libraries})) {
+		my $allthere=1;
+		foreach (split/;/,$ENV{MWSym2Libraries}) {
+			s/^\+//;	# remove leading "+", if any
+			if (!-d $_) {
+				$allthere=0;
+				last;
+			}
+		}
+		if ($allthere) {
+			$MWCC = "mwccsym2.exe";
+			$MWLD = "mwldsym2.exe";
+			print "Detected CodeWarrior for Symbian OS, version 2.0\n";
+		}
+	}
+	if (!defined($MWCC)) {
+		if (defined($ENV{CWFolder}) && -d $ENV{CWFolder}) {
+			$MWCC = "mwcc.exe";
+			$MWLD = "mwld.exe";
+			print "Detected CodeWarrior for Symbian OS, version 1.0\n";
+			die "ERROR: This version of CodeWarrior is not suitable for Symbian OS version 8\n";
+		}
+		else {
+			die "ERROR: Unable to identify a valid CodeWarrior for Symbian OS installation\n";
+		}
+	}
+	
+	Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+	my $TrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\$(TRGDIR)\\";
+	}
+
+# Change - winutl.pm checks MWCWinx86Includes, but mwccsym2.exe seems to use MWCIncludes
+	if ($MWCC eq "mwccsym2.exe" && !defined($ENV{MWCIncludes})) {
+		&main::Output(
+			"\n",
+			"MWCIncludes:=\$(MWCSym2Includes)\n",
+			"export MWCIncludes\n",
+			"\n"
+		);
+	}
+		
+	&main::Output(
+		"# EPOC DEFINITIONS\n",
+		"\n",
+		"INCDIR  = -cwd source -i-"
+	);
+	foreach (@ChopUserIncPaths,@ChopSysIncPaths) {
+		&main::Output(
+			" \\\n -i \"$_\""
+		);
+	}
+	use Pathutl;
+	if($VariantFile){
+	    my $variantFilePath = Path_Split('Path',$VariantFile);
+	    $VariantFile  = Path_Split('FILE',$VariantFile);
+	    # workaround for codewarrior defect:
+	    # codewarrior at the moment doesn't accept an absolute path with the
+	    # the -include option unless it contains a drive letter, this is solved
+	    # by including the directory and the file separately
+	    &main::Output("\\\n -i \"$variantFilePath\" -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWFLAGS =",
+		" -wchar_t off",	# do not treat wchar_t as a predefined type
+		" -align 4",		# long alignment
+		" -warnings on",	# selection of warnings
+		" -w nohidevirtual",	# turn off "hides inherited virtual function" warning
+		   ",nounusedexpr",	# turn off "expression has no side effect" warning
+		" -msgstyle gcc",	# use GCC-style message format
+		# " -strict on",		# strict ANSI/ISO C++ checking
+		" -enum int",		# use int for enumeration types
+		" -str pool",		# pool strings into a single data object
+		" $WarningLevel"		
+	
+	);
+
+	&main::Output(
+		" -stdinc"		# insist because mwccsym2 has -nostdinc as the default(?)
+	);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWDEFS  = "
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -d \"$_\""
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CW$_ = $MWCC"
+		);
+		if (/DEB$/o) {
+			&main::Output(
+				' -g -O0'   # debug information, no optimisation
+			);
+		}
+		elsif (/REL$/o) {
+			&main::Output(
+				' -O4,s'    # highest level of optimisation, optimise for space
+			);
+		}
+		&main::Output(
+			' $(CWFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -d $_"
+			);
+		}
+		&main::Output(
+			" \$(CWDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		&main::Output (
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCTRG$_)\\$TrgDir$Trg")
+		);
+		
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY",
+		"\n"
+	);
+	&main::Output(
+		"\n",
+		"FREEZE :\n"
+	);
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB");
+
+	&Generic_Releaseables;
+}
+
+my $uidfile;
+sub PMBld {
+
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $RelPath=&main::RelPath;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+
+	$uidfile = "$BaseTrg.UID";
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+	my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\";
+	if ($TrgPath) {
+		$BLDTRGPATH .= "\$(TRGDIR)\\";	    # handles TARGETPATH
+	}
+
+
+#	releasables
+	my @releaseables;
+	
+	my $toolspath=&main::EPOCToolsPath();
+	push @releaseables, "$toolspath$Trg";
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", "$RelPath$TrgPath");
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc = "uid" if ($BaseSrc eq $uidfile);
+		
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_OBJS$Bld="
+	);
+	my $have_uidfile = 0;
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		if ($BaseSrc eq $uidfile) {
+			$have_uidfile = 1;
+			next;
+		}
+   		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+   		);
+   	}
+	
+	if ($have_uidfile) {
+		# ensure that the uid file is at the end of the list, as it's implicit in
+		# CodeWarrior IDE projects.
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\uid.o")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::OutFormat(
+		"COMMON_LINK_FLAGS$Bld=",
+		' -msgstyle gcc',
+		' -stdlib'		# use default runtime library for compiler help functions
+	);
+	if ($MWLD eq "mwcc.exe") {
+		&main::OutFormat(
+			' -warnings on'	# on by default in mwccsym2.exe
+		);
+	}
+
+	&main::OutFormat(
+		' -subsystem console'
+	);
+		
+	if ($Bld=~/DEB$/o) {
+		&main::OutFormat(
+				' -g'
+			);
+		}
+	
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+		" -o \"$BLDTRGPATH$Trg\"" 
+	);
+	
+	&main::Output(
+		' -noimplib'
+	);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		&Generic_Quote("$BLDTRGPATH$Trg"), " : \$(LINK_OBJS$Bld) "
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			&Generic_Quote($DefFile)
+		);
+	}
+
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+#	Perform the final link step
+	&main::Output(
+		"\t$MWLD "
+	);
+	
+	&main::Output(
+		"\$(LINK_FLAGS$Bld) \$(LINK_OBJS$Bld)\n",
+	);
+
+	&main::Output(
+		"\tcopy \"$BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+	);
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc = "uid" if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc = "uid" if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc = "uid" if ($BaseSrc eq $uidfile);
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=&main::Src;
+	my $SrcPath=&main::SrcPath;
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+		&Generic_Quote("$SrcPath$Src"), "\n",
+		"\t\$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\"\n",
+		"\n",
+#		assembler listing target - uses implicit rule to do disassembly
+		"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+		"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$Plat.lst"),
+		"\n"
+	);
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	my $show_options = "source";
+	$show_options = "source,unmangled,comments" if ($MWLD eq "mwldsym2.exe");
+	
+	&main::Output(
+		"\n",
+		"# Implicit rule for generating .lis files\n",
+		"\n",
+		".SUFFIXES : .lis .o\n",
+		"\n",
+		".o.lis:\n",
+		"\t$MWLD -S -show $show_options \$< -o \$\@\n",
+		"\n",
+		"\n"
+	);
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_vscw.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1860 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_vscw;
+
+# declare variables global for module
+
+my @Win32LibList=();
+my $Win32StdHeaders;
+my $BaseAddressFlag;
+my $Win32Resrc;
+
+my $MWCC;
+my $MWLD;
+my $MWIncludePath;
+my $MWIncludeVar;
+
+# declare variables global for VS6
+my %IdeBlds=();
+my %PrjHdrs=();
+my $DspText='';
+my $VcprojText='';
+my $PlatName=&main::PlatName;
+my $guid='';
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMDoc
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use Winutl;
+use cl_generic;
+use E32Variant;
+use lockit_info;
+
+sub RoundUp1k($) {
+	# Accept C hexadecimal number (0xNNN).  Convert argument to Kb
+	# rounded up to the next 1kb boundary.
+	use integer;
+	return (hex($_[0]) + 1023) / 1024;
+}
+
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+sub PMCheckPlatformL {
+
+	# check version of CodeWarrior for Symbian OS
+	
+	if (defined($ENV{MWCSym2Includes})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{MWSym2Libraries})) {
+		$MWCC = "mwccsym2.exe";
+		$MWLD = "mwldsym2.exe";
+	}
+	if (!defined($MWCC) && defined($ENV{CWFolder})) {
+		$MWCC = "mwcc.exe";
+		$MWLD = "mwld.exe";
+	}
+	if (!defined($MWCC)) {
+		die "ERROR: Unable to identify a valid CodeWarrior for Symbian OS installation\n";
+	}
+	
+	# determine default include path
+	
+	$MWIncludeVar = 'MWCIncludes';	# default, even if it doesn't exist
+	$MWIncludePath = '';			# default is empty
+	
+	foreach my $var ('MWCSym2Includes','MWCWinx86Includes','MWCIncludes') {
+		if (defined($ENV{$var})) {
+			$MWIncludePath = $ENV{$var};
+			$MWIncludeVar = $var;
+			last;
+		}
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, $MWIncludePath);
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	if ($BaseAddressFlag ne "") {
+		$BaseAddressFlag=" -imagebase \"$BaseAddressFlag\"";
+	}
+	@Win32LibList=&Winutl_Win32LibList;
+	$Win32Resrc=&Winutl_Win32Resrc;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	my $AifStructRef=&main::AifStructRef;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+	my $VariantFile=&main::VariantFile();
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $WarningLevel=&main::CompilerOption("CW");
+	my $LinkAs=&main::LinkAs;
+
+	&main::Output(
+			"PATH=$ENV{EPOCROOT}epoc32\\tools\\;$ENV{PATH}",
+			"\n",
+			"Path=\$(PATH)",
+			"\n"
+			);
+
+# Get the drive letter to call the Lada compiler to call it with absolute path
+	&main::Output(
+			"COMPILER_PATH=\"$ENV{EPOCROOT}epoc32\\tools\\nokia_compiler\\Symbian_Tools\\Command_Line_Tools\\\"",
+			"\n"
+	);
+
+	Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+	my $TrgDir="";
+	my $AifTrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\$(TRGDIR)\\";
+		$AifTrgDir=$TrgDir;
+	}
+
+# Handle migration of binaries to secure location
+
+	&Winutl_AdjustTargetPath(\$TrgDir);
+	
+# Change - mwwinrc.exe uses MWWinx86Includes or MWCIncludes, but some installations
+# fail to install either. Set MWCIncludes from the chosen variable as part
+# of the Makefile.
+	if (!defined($ENV{MWCIncludes}) && $MWIncludeVar ne 'MWCIncludes') {
+		&main::Output(
+			"\n",
+			"MWCIncludes:=\$($MWIncludeVar)\n",
+			"export MWCIncludes\n",
+			"\n"
+		);
+	}
+
+	my $CompilerLibPath="$ENV{EPOCROOT}epoc32\\tools\\nokia_compiler\\Symbian_Support\\Runtime\\Runtime_x86\\Runtime_Win32\\Libs;$ENV{EPOCROOT}epoc32\\tools\\nokia_compiler\\Symbian_Support\\Win32-x86 Support\\Libraries\\Win32 SDK";
+	&main::Output(
+			"\n",
+		"MWLibraries:=\+$CompilerLibPath\n",
+		"export MWLibraries\n",
+		"\n"
+		);
+	&main::Output(
+			"\n",
+		"MWLibraryFiles:=gdi32.lib;user32.lib;kernel32.lib;\n",
+		"export MWLibraryFiles\n",
+		"\n"
+		);
+	
+	&main::Output(
+		"# EPOC DEFINITIONS\n",
+		"\n",
+		"INCDIR  = -cwd source -i-"
+	);
+	foreach (@ChopUserIncPaths,@ChopSysIncPaths) {
+		&main::Output(
+			" \\\n -i \"$_\""
+		);
+	}
+	use Pathutl;
+	if($VariantFile){
+	    my $variantFilePath = Path_Split('Path',$VariantFile);
+	    $VariantFile  = Path_Split('FILE',$VariantFile);
+	    # workaround for codewarrior defect:
+	    # codewarrior at the moment doesn't accept an absolute path with the
+	    # the -include option unless it contains a drive letter, this is solved
+	    # by including the directory and the file separately
+	    &main::Output("\\\n -i \"$variantFilePath \" -include \"$VariantFile\"");
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWFLAGS =",
+		" -wchar_t off",	# do not treat wchar_t as a predefined type
+		" -align 4",		# long alignment
+		" -warnings on",	# selection of warnings
+		" -w nohidevirtual",	# turn off "hides inherited virtual function" warning
+		   ",nounusedexpr",	# turn off "expression has no side effect" warning
+		" -enum int",		# use int for enumeration types
+		" -str pool",		# pool strings into a single data object
+		" -exc ms",			# SEH C++ exception implementation
+		" $WarningLevel"		
+	
+	);
+	if ($Win32StdHeaders or &main::Plat eq 'TOOLS') {
+		&main::Output(
+			" -stdinc"		# insist because mwccsym2 has -nostdinc as the default(?)
+		);
+	}
+	else {
+		&main::Output(
+			" -nostdinc"	# insist because mwcc has -stdinc as the default.
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CWDEFS  = "
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -d \"$_\""
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CW$_ = perl -S err_formatter.pl \$(COMPILER_PATH)$MWCC -msgstyle parseable "
+		);
+		if (/DEB$/o) {
+
+			if($PlatName eq "VS6") {
+				&main::Output(
+					' -sym codeview'
+				);
+			}
+			else
+			{
+				&main::Output(
+					' -sym codeview_new'
+				);
+			}
+
+
+#			euser change to apply inlining on the _NAKED functions
+			if ($BaseTrg!~/^EUSER$/oi) {
+				&main::Output(
+					' -inline off'
+				);
+			}	
+		}
+		elsif (/REL$/o) {
+			&main::Output(
+				' -O4,s'	# highest level of optimisation, optimise for space
+			);
+		}
+		&main::Output(
+			' $(CWFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -d $_"
+			);
+		}
+		&main::Output(
+			" \$(CWDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				" \\\n",
+				"\t", &Generic_Quote("\$(EPOCTRG$_)\\$TrgDir$Trg")
+			);
+			if (&Winutl_CopyForStaticLinkage) {
+				&main::Output(
+					" \\\n",
+					"\t", &Generic_Quote("\$(EPOCTRG$_)\\$Trg")
+				);
+			}
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	foreach (@BldList) {
+		my $makework="MAKEWORK$_";
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : $makework"
+		);
+
+		my $BitMapRef;
+		foreach $BitMapRef (@$BitMapStructRef) {
+			my $file="\$(EPOCTRG$_)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t", &Generic_Quote($file)
+			);
+		}
+		undef $BitMapRef;
+
+		my $ResourceRef;
+		foreach $ResourceRef (@$ResourceStructRef) {
+			my $file="\$(EPOCTRG$_)\\$$ResourceRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(	# must come before main target because source for target will depend on the
+			" \\\n",		# *.rsg file in $EPOCIncPath
+			"\t", &Generic_Quote("$file")
+			);
+		}
+		undef $ResourceRef;
+
+		my $AifRef;
+		foreach $AifRef (@$AifStructRef) {
+			my $file="\$(EPOCTRG$_)\\$AifTrgDir$$AifRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t", &Generic_Quote($file)
+			);
+		}
+		undef $AifRef;
+
+		&main::Output(
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"\n",
+		"# REAL TARGET - LIBRARY\n",
+		"\n",
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg;
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), "\n",
+					"\n",
+					&Generic_Quote("\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib"), " : ",
+					&Generic_Quote($DefFile), "\n",
+					"\tperl -S prepdef.pl ",&Generic_Quote($DefFile)," \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+					"\t\$(COMPILER_PATH)$MWLD -msgstyle gcc \"\$(EPOCBLD)\\$ExportLibrary.prep.def\" -importlib -o \$\@",
+					" -addcommand \"out:$LibLinkAs\" -warnings off",
+					"\n"
+				);
+			} else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\".\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		} else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE :\n"
+	);
+	if ($DefFile and $BasicTrgType!~/^IMPLIB$/io) {
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB");
+
+	&Generic_Releaseables;
+
+	if($PlatName eq "VS6") {
+		VS6StartBldList();
+	}
+	elsif($PlatName eq "VS2003") 
+	{
+		VS2003StartBldList();
+	}
+
+}
+
+sub VS6StartBldList(){
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my $Plat=&main::Plat;
+
+	# set up global IDE builds variable
+	%IdeBlds= (
+		UREL=> "$BaseTrg - Win32 Release",
+		UDEB=> "$BaseTrg - Win32 Debug",
+	);
+	if (&main::Plat eq 'TOOLS') {
+		%IdeBlds= (
+			REL=> "$BaseTrg - Win32 Release",
+			DEB=> "$BaseTrg - Win32 Debug",
+		);
+	}
+	
+
+	$DspText=join('',
+		"# Microsoft Developer Studio Project File - Name=\"$BaseTrg\" - Package Owner=<4>\n",
+		"# Microsoft Developer Studio Generated Build File, Format Version 6.00\n",
+		"# ** DO NOT EDIT **\n",
+		"\n"
+	);
+
+	$DspText.=join('',
+		"# TARGTYPE \"Win32 (x86) External Target\" 0x0106\n",
+		"\n",
+		"CFG=",$IdeBlds{$BldList[0]},"\n",
+		"!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n",
+		"!MESSAGE use the Export Makefile command and run\n",
+		"!MESSAGE \n",
+		"!MESSAGE NMAKE /f \"",$BaseTrg,".mak\".\n",
+		"!MESSAGE \n",
+		"!MESSAGE You can specify a configuration when running NMAKE\n",
+		"!MESSAGE by defining the macro CFG on the command line. For example:\n",
+		"!MESSAGE \n",
+		"!MESSAGE NMAKE /f \"",$BaseTrg,".mak\" CFG=\"".$IdeBlds{$BldList[0]}."\"\n",
+		"!MESSAGE \n",
+		"!MESSAGE Possible choices for configuration are:\n",
+		"!MESSAGE \n"
+	);
+	
+	foreach (reverse @BldList) {
+		$DspText.=join('',
+			"!MESSAGE \"",$IdeBlds{$_},"\" (based on \"Win32 (x86) External Target\")"
+		);
+		$DspText.="\n";
+	}
+
+	$DspText.=join('',
+		"!MESSAGE \n",
+		"\n"
+	);
+
+	# BEGIN THE PROJECT
+	#------------------
+	$DspText.=join('',
+		"# Begin Project\n",
+		"# PROP AllowPerConfigDependencies 0\n",
+		"# PROP Scc_ProjName \"\"\n",
+		"# PROP Scc_LocalPath \"\"\n",
+		"\n"
+	);
+
+}
+
+sub VS2003StartBldList(){
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my $Plat=&main::Plat;
+
+	$guid = `uuidgen.exe`;
+	$guid =~ s/\n//g;
+	$guid = uc $guid;
+# set up global IDE builds variable
+	%IdeBlds= (
+		UREL=> "Release|Win32",
+		UDEB=> "Debug|Win32",
+	);
+	if ($Plat eq 'TOOLS') {
+		%IdeBlds= (
+			REL=> "Release|Win32",
+			DEB=> "Debug|Win32",
+		);
+	}
+	
+
+	$VcprojText=join('',
+		"<?xml version=\"1.0\" encoding=\"Windows-1252\"?>\n",
+		"<VisualStudioProject\n",
+		"\tProjectType=\"Visual C++\"\n",
+		"\tVersion=\"7.10\"\n",
+		"\tName=\"$BaseTrg\"\n",
+		"\tProjectGUID=\"{$guid}\"\n",
+		"\tSccProjectName=\"\"\n",
+		"\tSccLocalPath=\"\"\n",
+		"\tKeyword=\"MakeFileProj\">\n",
+		"\t<Platforms>\n",
+		"\t\t<Platform\n",
+		"\t\t\tName=\"Win32\"/>\n",
+		"\t</Platforms>\n",
+		"\t<Configurations>\n",
+		"\n"
+	);
+
+}
+
+my $uidfile;
+sub PMBld {
+
+	my $AifStructRef=&main::AifStructRef;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $RelPath=&main::RelPath;
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+
+	$uidfile = "$BaseTrg.UID";
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+ 	
+# Handle migration of binaries to secure location
+
+	my $BLDTRGPATH = "";
+	my $AIFBLDTRGPATH = "";
+	if ($TrgPath) {
+		$BLDTRGPATH = "\$(TRGDIR)\\";	    # handles TARGETPATH
+		$AIFBLDTRGPATH = $BLDTRGPATH;
+		&Winutl_AdjustTargetPath(\$BLDTRGPATH);
+	}
+	$BLDTRGPATH = "\$(EPOCTRG$Bld)\\".$BLDTRGPATH;
+	$AIFBLDTRGPATH = "\$(EPOCTRG$Bld)\\".$AIFBLDTRGPATH;
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+	
+	unless (&main::Plat() eq 'TOOLS') {
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			push @releaseables, "$BLDTRGPATH$Trg";
+			if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+				push @releaseables,"$BLDTRGPATH$Trg.map";
+			}
+			if (&Winutl_CopyForStaticLinkage) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$Trg";
+			}
+			my $BitMapRef;
+			foreach $BitMapRef (@$BitMapStructRef) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			}
+			my $ResourceRef;
+			foreach $ResourceRef (@$ResourceStructRef) {
+				push @releaseables,"\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}";
+			}
+			my $AifRef;
+			foreach $AifRef (@$AifStructRef) {
+				push @releaseables, "$AIFBLDTRGPATH$$AifRef{Trg}";
+			}
+		}
+		if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+			push @releaseables, "\$(EPOCLIB$Bld)\\$ExportLibrary.lib";
+		}
+		if ($Bld=~/DEB$/o) {
+			# debugging support files?
+		}
+	}
+	else {
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			my $toolspath=&main::EPOCToolsPath();
+			push @releaseables, "$toolspath$Trg";
+		}
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+  my $adjustedTargetPath=$TrgPath;
+  &Winutl_AdjustTargetPath(\$adjustedTargetPath);
+  &Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+  &Generic_MakeWorkDir("MAKEWORK$Bld", "$RelPath$adjustedTargetPath");
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+		$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+		
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote("\$(EPOCLINK$Bld)\\$_")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_OBJS$Bld="
+	);
+	my $have_uidfile = 0;
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		if ($BaseSrc eq $uidfile) {
+			$have_uidfile = 1;
+			next;
+		}
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+   		);
+   	}
+	if ($Win32Resrc) {
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res")
+		);
+	}
+	if ($have_uidfile) {
+		# ensure that the uid file is at the end of the list, as it's implicit in
+		# CodeWarrior IDE projects.
+		&main::Output(
+			" \\\n",
+			"\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg"."_UID_.o")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::OutFormat(
+		"COMMON_LINK_FLAGS$Bld=",
+		' -stdlib'		# use default runtime library for compiler help functions
+	);
+	if ($MWLD eq "mwcc.exe") {
+		&main::OutFormat(
+			' -warnings on'	# on by default in mwccsym2.exe
+		);
+	}
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+			);
+		}
+	}
+	foreach my $lib (@Win32LibList) {
+		 my $win32lib = $lib;    # take a copy, to avoid updating contents of Win32LibList!
+		$win32lib = "-l$win32lib" unless ($win32lib =~ /\\/);
+		&main::OutFormat(
+			" ",lc $win32lib
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -noentry',
+			' -shared'
+		);
+	}
+	elsif ($TrgType=~/^EXEXP$/o) {
+		&main::OutFormat(
+			"$BaseAddressFlag",
+			' -noentry',
+			' -shared'
+		);
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				' -m "?_E32Bootstrap@@YGXXZ"'
+			);
+		}
+	}
+	if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) {
+		&main::OutFormat(
+			' -subsystem console'
+		);
+	}
+	else {
+		&main::OutFormat(
+			' -subsystem windows'
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::OutFormat(
+			' -heapreserve=',RoundUp1k($HeapSize{Max}),' -heapcommit=',RoundUp1k($HeapSize{Min})
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		if ($Bld=~/DEB$/o) {
+			if($PlatName eq "VS6")
+			{
+				&main::OutFormat(
+					' -sym codeview'
+				);
+			}
+			else
+			{
+				&main::OutFormat(
+					' -sym codeview_new'
+				);
+			}
+			#mention the debug version of the runtime library
+			&main::OutFormat(
+				' -lMSL_All_MSE_Symbian_D.lib'
+				);
+		}
+		else
+		{
+			#mention the release version of the runtime library
+			&main::OutFormat(
+				' -lMSL_All_MSE_Symbian.lib'
+				);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my $EntrySymbol='';
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		my $Include="";
+		if ($BasicTrgType=~/^DLL$/o) {
+			$Include="-m __E32Dll";
+			$EntrySymbol='__E32Dll';
+		}
+		else {
+			$Include="-m __E32Startup";
+			$EntrySymbol='__E32Startup';
+		}
+		&main::Output(
+			"STAGE1_LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+			" -o \"\$(EPOCBLD$Bld)\\$Trg\"", 
+			' -export dllexport',
+			" $Include",
+			' -nocompactimportlib', 
+			" -implib \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"",
+			" -addcommand \"out:$Trg\" -warnings off",
+			"\n",
+		);
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	&main::Output(
+		"LINK_FLAGS$Bld= \$(COMMON_LINK_FLAGS$Bld) \$(LIBS$Bld) \\\n\t",
+		" -o \"$BLDTRGPATH$Trg\"" 
+	);
+	if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o) {
+		# Generate map file for release build executables
+		&main::Output(
+			" -map \"$BLDTRGPATH$Trg.map\"", 
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			" -f \"\$(EPOCBLD)\\$ExportLibrary.def\"",	# use generated .DEF file
+		);
+		if (&main::ExportUnfrozen) {
+			&main::Output(
+				" -implib \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"",
+				" -addcommand \"out:$Trg\" -warnings off"
+			);
+		}
+		else {
+			&main::Output(
+				' -noimplib'
+			);
+		}
+	}
+	else {
+		&main::Output(
+			' -noimplib'
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		&Generic_Quote("$BLDTRGPATH$Trg"), " : \$(LINK_OBJS$Bld) "
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			&Generic_Quote($DefFile)
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::Output(
+				" ", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$FirstLib")
+			);
+		}
+	}
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"\t\$(COMPILER_PATH)$MWLD -msgstyle gcc \$(STAGE1_LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+		);
+
+#		Generate an export info file
+		my $show_options = "names,verbose";
+		$show_options = "names,unmangled,verbose" if ($MWLD eq "mwldsym2.exe");
+		&main::Output(
+			"\t\$(COMPILER_PATH)$MWLD -msgstyle gcc -S -show only,$show_options -o \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+
+#		call makedef to reorder the export information
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\""
+		);
+		if (SysTrg()) {
+    			&main::Output( "\t\t-SystemTargetType \\\n" );
+	    	}		
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				" -Frzfile \"$DefFile\""
+			);
+		}
+		my $Export;
+		my $Ordinal=1;
+		foreach $Export (&main::Exports) {
+#				replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+			$Export=~s-\$-\$\$-go;
+			&main::Output(
+				" -$Ordinal $Export"
+			);
+			$Ordinal++;
+		}
+		&main::Output(
+			" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n",
+			"\t\$(ERASE) \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+	}
+
+#	Perform the final link step
+	&main::Output(
+		"\t\$(COMPILER_PATH)$MWLD -msgstyle gcc "
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"-library "
+		);
+	}
+	&main::Output(
+		"\$(LINK_FLAGS$Bld) -l \$(EPOCBLD$Bld) -search \$(notdir \$(LINK_OBJS$Bld))\n",
+	);
+
+	if (&main::Plat eq 'TOOLS') {
+		&main::Output(
+			"\tcopy \"BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+	}
+	if (&Winutl_CopyForStaticLinkage) {
+		&Generic_MakeWorkDir("MAKEWORK$Bld", "\$(EPOCTRG$Bld)");
+		&main::Output(
+			"\n",
+			&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ", 
+			&Generic_Quote("$BLDTRGPATH$Trg"), "\n",
+			"\t", &Generic_CopyAction(),
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if($PlatName eq "VS6") {
+		VS6Bld();
+	}
+	else
+	{
+		VS2003Bld();
+	}
+}
+
+sub VS6Bld(){
+
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my @BldList=&main::BldList;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $Trg=&main::Trg;
+
+
+	if ($Bld eq $BldList[0]) {
+		$DspText.=join('',
+			"!IF  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+	}
+	else {
+		$DspText.=join('',
+			"!ELSEIF  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+	}
+	$DspText.=join('',
+		"# PROP BASE Use_MFC 0\n"
+	);
+	if ($Bld=~/REL$/o) {
+		$DspText.=join('',
+			"# PROP BASE Use_Debug_Libraries 0\n",
+			"# PROP BASE Output_Dir \".\\Release\"\n",
+			"# PROP BASE Intermediate_Dir \".\\Release\"\n"
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		$DspText.=join('',
+			"# PROP BASE Use_Debug_Libraries 1\n",
+			"# PROP BASE Output_Dir \".\\Debug\"\n",
+			"# PROP BASE Intermediate_Dir \".\\Debug\"\n"
+		);
+	}
+
+	$DspText.=join('',
+		"# PROP BASE Cmd_Line \"NMAKE /f ",$BaseTrg,".mak \"\n",
+		"# PROP BASE Rebuild_Opt \"/a\"\n",
+		"# PROP BASE Target_File \"",$Trg,"\"\n",
+		"# PROP BASE Bsc_Name \"",$BaseTrg,".bsc\"\n",
+		"# PROP BASE Target_Dir \"\"\n"
+	);
+
+	$DspText.=join('',
+			"# PROP Use_MFC\n"
+	);
+	if ($Bld=~/REL$/o) {
+		$DspText.=join('',
+			"# PROP Use_Debug_Libraries 0\n"
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		$DspText.=join('',
+			"# PROP Use_Debug_Libraries 1\n"
+		);
+	}
+
+	$DspText.=join('',
+		"# PROP Output_Dir \"$ChopRelPath\"\n",
+		"# PROP Intermediate_Dir \"$ChopBldPath\"\n",
+		"# PROP Cmd_Line \"\"$ENV{EPOCROOT}epoc32\\tools\\MAKE.exe\" -r -f ",&main::BaseMak,"_$Bld.mak \"\n",
+		"# PROP Rebuild_Opt \"REBUILD\"\n",
+		"# PROP Target_File \"",$Trg,"\"\n"
+	);
+
+	if ($Bld=~/REL$/o) {
+		$DspText.=join('',
+			"# PROP Bsc_Name \"",$BaseTrg,".bsc\"\n"
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		$DspText.=join('',
+			"# PROP Bsc_Name \"\"\n"
+		);
+	}
+
+	$DspText.=join('',
+		"# PROP Target_Dir \"\"\n"
+	);
+
+	$DspText.=join('',
+		"\n"
+	);
+
+}
+
+sub VS2003Bld(){
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my @BldList=&main::BldList;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ChopRelPath=&main::Path_Chop(&main::Path_MakeRltToBase(&main::MakeFilePath, &main::RelPath));
+	my $Trg=&main::Trg;
+
+	$VcprojText.=join('',
+		"\t\t<Configuration\n",
+		"\t\t\tName=\"",$IdeBlds{$Bld},"\"\n",
+		"\t\t\tOutputDirectory=\"$ChopRelPath\"\n",
+		"\t\t\tIntermediateDirectory=\"$ChopBldPath\"\n",
+		"\t\t\tConfigurationType=\"0\"\n",
+		"\t\t\tUseOfMFC=\"0\"\n",
+		"\t\t\tATLMinimizesCRunTimeLibraryUsage=\"FALSE\">\n",
+		"\t\t\t<Tool\n",
+		"\t\t\t\tName=\"VCNMakeTool\"\n",
+		"\t\t\t\tBuildCommandLine=\"\&quot;$ENV{EPOCROOT}epoc32\\tools\\make.exe\&quot; -r -f ",&main::BaseMak,".mak $Bld\"\n",
+		"\t\t\t\tReBuildCommandLine=\"\&quot;$ENV{EPOCROOT}epoc32\\tools\\make.exe\&quot; -r -f ",&main::BaseMak,".mak CLEAN $Bld \"\n",
+		"\t\t\t\tCleanCommandLine=\"\&quot;$ENV{EPOCROOT}epoc32\\tools\\make.exe\&quot; -r -f ",&main::BaseMak,".mak CLEAN$Bld\"\n",
+		"\t\t\t\tOutput=\"$ChopRelPath\\$Trg\"/>\n",
+		"\t\t</Configuration>\n"
+		);
+
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+
+	if($PlatName eq "VS6") {
+		VS6StartSrcList();
+	}
+	else
+	{
+		VS2003StartSrcList();
+	}
+}
+
+sub VS6StartSrcList(){
+	my @BldList=&main::BldList;
+
+
+	$DspText.=join('',
+		"\n!ENDIF\n\n",
+		"# Begin Target\n",
+		"\n"
+	);
+	foreach (@BldList) {
+		$DspText.=join('',
+			"# Name \"".$IdeBlds{$_}."\"\n"
+		);
+	}
+	$DspText.=join('',
+		"# Begin Group \"Source Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90\"\n"
+	);
+
+}
+
+sub VS2003StartSrcList(){
+
+	$VcprojText.=join('',
+		"\t</Configurations>\n",
+		"\t<References>\n",
+		"\t</References>\n"
+	);
+
+	$VcprojText.=join('',
+		"\t<Files>\n",
+		"\t\t<Filter\n",
+		"\t\t\tName=\"Source Files\"\n",
+		"\t\t\tFilter=\"cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90\"\n",
+		"\t\t\tUniqueIdentifier=\"{4FC737F1-C7A5-4376-A066-2A32D752A2FF}\">\n"
+	);
+
+}
+
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $BitMapRef=&main::BitMapRef;
+
+	my $ChopTrgPath="";
+	if ($$BitMapRef{TrgPath}) {
+		$ChopTrgPath.="\\$$BitMapRef{TrgPath}";
+		chop $ChopTrgPath;
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$ChopTrgPath";
+		&main::Output(
+			&Generic_Quote("$path\\$$BitMapRef{Trg}"), " : ", 
+			&Generic_Quote("$$BitMapRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld; 
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $ResourceRef=&main::ResourceRef;
+	my @BldList=&main::BldList;
+
+	foreach my $Bld (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}"), " : ", 
+			&Generic_Quote("$$ResourceRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+
+	if($PlatName eq "VS6") {
+		VS6ResrcBld();
+	}
+	else
+	{
+		VS2003ResrcBld();
+	}
+
+}
+
+sub VS6ResrcBld() {
+
+	my $ResourceRef=&main::ResourceRef;
+	my @BldList=&main::BldList;
+
+	my $Resrc=ucfirst lc &main::Path_Split('File', $$ResourceRef{Source});
+	my $BaseResrc=&main::Path_Split('Base', $$ResourceRef{Source});
+	my $SrcPath=&main::Path_Split('Path', $$ResourceRef{Source});
+	my $TrgPath=&main::Path_Split('Path', $$ResourceRef{Trg});
+	my @LangList=($$ResourceRef{Lang});
+	
+	my $inputpath="$SrcPath$Resrc";
+	
+	$DspText.=join('',
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=$inputpath\n"
+	);
+
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my @DepList=&main::DepList;
+	my $PathBaseDsp=&main::MakeFilePath.&main::BaseMak;
+	my $RelPath=&main::RelPath;
+
+	$DspText.=join('',
+		"USERDEP__$BaseResrc="
+	);
+	my $Dep;
+	foreach $Dep (@DepList) {
+		$DspText.=join('',
+			"\"$Dep\"\t"
+		);
+	}
+	$DspText.=join('',
+		"\n"
+	);
+
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $ResrcTrgFullName="$RelPath$Bld\\$TrgPath$BaseResrc.r";
+		if ($Bld eq $BldList[0]) {
+			$DspText.=join('',
+				'!IF'
+			);
+		}
+		else {
+			$DspText.=join('',
+				'!ELSEIF'
+			);
+		}
+		$DspText.=join('',
+			"  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+		$DspText.=join('',
+			"# PROP Intermediate_Dir \"$ChopBldPath\"\n",
+			"# Begin Custom Build - Building resources from $Resrc\n",
+			"InputPath=$inputpath\n",
+			"\n",
+			"BuildCmds= \\\n",
+			"\tnmake -nologo -f \"${PathBaseDsp}.SUP.MAKE\"\\\n",
+			"  \"$ResrcTrgFullName\"\n"
+		);
+		my $Lang;
+		foreach $Lang (@LangList) {
+#			change again to avoid VC5 linking the resource
+			my $TmpLang=$Lang;
+			if ($TmpLang eq 'SC') {
+				$TmpLang.='.dummy';
+			}
+			$DspText.=join('',
+				"\n",
+				"\"$ResrcTrgFullName$TmpLang\" : \$(SOURCE) \"\$(INTDIR)\"\\\n",
+				" \"\$(OUTDIR)\"\n",
+				"   \$(BuildCmds)\n",
+			);
+		}
+		$DspText.=join('',
+			"# End Custom Build\n",
+			"\n"
+		);
+	}
+	$DspText.=join('',
+		"!ENDIF \n",
+		"\n",
+		"# End Source File\n"
+	);
+
+}
+
+sub VS2003ResrcBld() {
+
+}
+
+sub PMDoc {
+
+###### from PMDoc of VC6 
+	
+	if($PlatName eq "VS6") {
+		VS6Doc();
+	}
+	else
+	{
+		VS2003Doc();
+	}
+
+}
+
+sub VS6Doc() {
+
+	my $SrcPath=&main::SrcPath;
+
+	$DspText.=join('',
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=",$SrcPath,ucfirst lc &main::Doc,"\n",
+		"# PROP Exclude_From_Build 1\n",
+		"# End Source File\n"
+	);
+
+}
+sub VS2003Doc() {
+
+
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $AifRef=&main::AifRef;
+	my $TrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\\\$(TRGDIR)";
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$TrgDir";
+		&main::Output(
+			&Generic_Quote("$path\\$$AifRef{Trg}"), " : ",
+			&Generic_Quote("$$AifRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+
+	if($PlatName eq "VS6") {
+		VS6StartSrc();
+	}
+	else
+	{
+		VS2003StartSrc();
+	}
+
+}
+
+sub VS6StartSrc() {
+
+	$DspText.=join('',
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=",&main::SrcPath,ucfirst lc &main::Src,"\n",
+		"# End Source File\n"
+	);
+
+}
+
+sub VS2003StartSrc(){
+	$VcprojText.=join('',
+		"\t\t\t<File\n",
+		"\t\t\t\tRelativePath=\"",&main::Path_MakeRltToBase(&main::MakeFilePath, &main::SrcPath),ucfirst lc &main::Src,"\">\n",
+		"\t\t\t</File>\n"
+	);
+
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	# Generate user header list for this src, merge with list for all sources
+	foreach (&main::DepList) {
+		$PrjHdrs{$_}='unusedval';
+	}
+
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	$BaseSrc =~ s/\.UID/_UID_/i if ($BaseSrc eq $uidfile);
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=&main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext=&main::ExtSrc;
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -lang c++ -o \"\$\@\" -c \"$SrcPath$Src\"\n",
+			"\n",
+#			assembler listing target - uses implicit rule to do disassembly
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$Plat.lst"),
+			"\n"
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(CW$Bld) -o \"\$\@\" -c \"$SrcPath$Src\"\n",
+			"\n",
+#			assembler listing target - uses implicit rule to do disassembly
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$Plat.lst"),
+			"\n"
+		);
+	}
+
+
+
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	my $show_options = "source";
+	$show_options = "source,unmangled,comments" if ($MWLD eq "mwldsym2.exe");
+	
+	&main::Output(
+		"\n",
+		"# Implicit rule for generating .lis files\n",
+		"\n",
+		".SUFFIXES : .lis .o\n",
+		"\n",
+		".o.lis:\n",
+		"\t\$(COMPILER_PATH)$MWLD -msgstyle gcc -S -show $show_options \$< -o \$\@\n",
+		"\n",
+		"\n"
+	);
+
+	if ($Win32Resrc) {
+		my @BldList=&main::BldList;
+		my @DepList=&main::Deps_GenDependsL($Win32Resrc);
+
+		&main::Output(
+			"# Win32 Resource $Win32Resrc\n",
+			"\n",
+			"DEPEND="
+		);
+		foreach (@DepList) {
+			&main::Output(
+				" \\\n\t", &Generic_Quote($_)
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	
+		my $Bld;
+		my $resbase=&main::Path_Split('Base',$Win32Resrc);
+		my $respath=&main::Path_Chop(&main::Path_Split('Path',$Win32Resrc));
+		foreach $Bld (@BldList) {
+			&main::Output(
+				&Generic_Quote("\$(EPOCBLD$Bld)\\$resbase.res"), " : ",
+				&Generic_Quote($Win32Resrc), " \$(DEPEND)\n",
+				"\tmwwinrc -o \$\@ \"$Win32Resrc\"\n",
+				"\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+
+	my $BaseDsp=&main::BaseMak;
+	my $PathBaseDsp=&main::MakeFilePath.$BaseDsp;
+
+	&main::Path_DelFiles("$PathBaseDsp.MAK","$PathBaseDsp.MDP","$PathBaseDsp.NCB","$PathBaseDsp.OPT","$PathBaseDsp.PLG","$PathBaseDsp.SLN","$PathBaseDsp.VCPROJ","$PathBaseDsp.DSW","$PathBaseDsp.DSP","${PathBaseDsp}_UREL.MAK","${PathBaseDsp}_UDEB.MAK");
+
+	if($PlatName eq "VS6")
+	{
+		VS6EndSrcList();
+	}
+	elsif($PlatName eq "VS2003")
+	{
+		VS2003EndSrcList();
+	}
+}
+
+sub VS6EndSrcList() {
+
+	my $BaseDsp=&main::BaseMak;    
+	my $PathBaseDsp=&main::MakeFilePath.$BaseDsp;  
+	my $BaseTrg=&main::BaseTrg;
+
+	$DspText.=join('',
+		"# End Group\n",
+		"# Begin Group \"Resource Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe\"\n"
+	);
+	if ($Win32Resrc) {
+		$DspText.=join('',
+			"# Begin Source File\n",
+			"\n",
+			"SOURCE=",ucfirst lc $Win32Resrc,"\n",
+			"# End Source File\n"
+		);
+		# Generate user header list for this src, merge with list for all sources
+		foreach (&main::Deps_GenDependsL($Win32Resrc)) {
+			$PrjHdrs{$_}='unusedval';
+		}
+	}
+	$DspText.=join('',
+		"# End Group\n"
+	);
+
+	# Use the global %PrjHdrs Hash to produce user header listing
+	$DspText.=join('',
+		"# Begin Group \"Header Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"h;hpp;hxx;hm;inl;fi;fd\"\n"
+	);
+	foreach (keys %PrjHdrs) {
+		$DspText.=join('',
+			"# Begin Source File\n",
+			"\n",
+			"SOURCE=",&main::Path_Split('Path',$_),ucfirst lc &main::Path_Split('File',$_),"\n",
+			"# End Source File\n"
+		);
+	}
+
+
+	$DspText.=join('',
+		"# End Group\n",
+		"# Begin Group \"Make Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"mak;mk\"\n"
+	);
+	$DspText.=join('',
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=",ucfirst lc $PathBaseDsp,".mak\n",
+		"# End Source File\n"
+	);
+
+	$DspText.=join('',
+		"# End Group\n",
+		"# End Target\n",
+		"# End Project\n",
+	);
+
+
+	&main::CreateExtraFile("$PathBaseDsp.dsp",$DspText);
+
+	my $RelMakText=join('',
+		"\n",
+		"BLD: UREL\n",
+		"REBUILD : CLEANUREL UREL\n",
+		"\n",
+		"include ",&main::BaseMak,".mak\n",
+		"\n"
+	);
+
+	&main::CreateExtraFile("${PathBaseDsp}_UREL.mak",$RelMakText);
+
+
+	my $DebMakText=join('',
+		"\n",
+		"BLD: UDEB\n",
+		"REBUILD : CLEANUDEB UDEB\n",
+		"\n",
+		"include ",&main::BaseMak,".mak\n",
+		"\n"
+	);
+
+	&main::CreateExtraFile("${PathBaseDsp}_UDEB.mak",$DebMakText);
+
+	my $DswText=join(
+		"\n",
+		"Microsoft Developer Studio Workspace File, Format Version 6.00",
+		'# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!',
+		'',
+		'#'x79,
+		'',
+		"Project: \"$BaseDsp\"=.\\$BaseDsp.dsp - Package Owner=<4>",
+		'',
+		'Package=<5>',
+		'{{{',
+		'}}}',
+		'',
+		'Package=<4>',
+		'{{{',
+		'}}}',
+		'',
+		'#'x79,
+		'',
+		'Global:',
+		'',
+		'Package=<5>',
+		'{{{',
+		'}}}',
+		'',
+		'Package=<3>',
+		'{{{',
+		'}}}',
+		'',
+		'#'x79,
+		''
+	);
+
+	&main::CreateExtraFile("$PathBaseDsp.DSW",$DswText);
+
+
+}
+
+sub VS2003EndSrcList() {
+
+	my $BaseDsp=&main::BaseMak;    
+	my $PathBaseDsp=&main::MakeFilePath.$BaseDsp;  
+
+# Use the global %PrjHdrs Hash to produce user header listing
+	$VcprojText.=join('',
+		"\t\t</Filter>\n",
+		"\t\t<Filter\n",
+		"\t\t\tName=\"Header Files\"\n",
+		"\t\t\tFilter=\"h;hpp;hxx;hm;inl;fi;fd\"\n",
+		"\t\t\tUniqueIdentifier=\"{93995380-89BD-4b04-88EB-625FBE52EBFB}\">\n"
+	);
+
+	foreach (keys %PrjHdrs) {
+		$VcprojText.=join('',
+			"\t\t\t<File\n",
+			"\t\t\t\tRelativePath=\"",&main::Path_MakeRltToBase(&main::MakeFilePath, &main::Path_Split('Path',$_)) 
+							, &main::Path_Split('File',$_),"\">","\n",
+			"\t\t\t</File>\n"
+		);
+	}	
+	$VcprojText.=join('',
+		"\t\t</Filter>\n"
+	);
+
+	$VcprojText.=join('',
+		"\t\t<Filter\n",
+		"\t\t\tName=\"Resource Files\"\n",
+		"\t\t\tFilter=\"ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe\"\n",
+		"\t\t\tUniqueIdentifier=\"{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}\">\n"
+	);
+
+	if ($Win32Resrc) {
+		$VcprojText.=join('',
+			"\t\t\t<File\n",
+			"\t\t\t\tRelativePath=\"", &main::Path_MakeRltToBase(&main::MakeFilePath, $Win32Resrc),"\">\n",
+			"\t\t\t</File>\n"
+		);
+		# Generate user header list for this src, merge with list for all sources
+		foreach (&main::Deps_GenDependsL($Win32Resrc)) {
+			$PrjHdrs{$_}='unusedval';
+		}
+	}
+
+	$VcprojText.=join('',
+		"\t\t</Filter>\n",
+		"\t\t<Filter\n",
+		"\t\t\tName=\"Make Files\"\n",
+		"\t\t\tFilter=\"Mak;mk\">\n"
+	);
+
+	$VcprojText.=join('',
+		"\t\t\t<File\n",
+		"\t\t\t\tRelativePath=\"",&main::Path_MakeRltToBase(&main::MakeFilePath, $PathBaseDsp),".mak\">\n",
+		"\t\t\t</File>\n"
+	);
+
+	$VcprojText.=join('',
+		"\t\t</Filter>\n",
+		"\t</Files>\n",
+		"\t<Globals>\n",
+		"\t</Globals>\n",
+		"</VisualStudioProject>\n"
+	);
+
+	&main::CreateExtraFile("$PathBaseDsp.vcproj",$VcprojText);
+
+
+	my $SlnText=join(
+		"\n",
+		"Microsoft Visual Studio Solution File, Format Version 8.00",
+		"Project\(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\"\) = \"$BaseDsp\", \"$BaseDsp.vcproj\", \"{$guid}\"",
+		"\tProjectSection(ProjectDependencies) = postProject",
+		"\tEndProjectSection",
+		'EndProject',
+		'Global',
+		"\tGlobalSection(SolutionConfiguration) = preSolution",
+		"\t\tDebug = Debug",
+		"\t\tRelease = Release",
+		"\tEndGlobalSection",
+		"\tGlobalSection(ProjectConfiguration) = postSolution",
+		"\t\t{$guid}.Debug.ActiveCfg = Debug|Win32",
+		"\t\t{$guid}.Debug.Build.0 = Debug|Win32",
+		"\t\t{$guid}.Release.ActiveCfg = Release|Win32",
+		"\t\t{$guid}.Release.Build.0 = Release|Win32",
+		"\tEndGlobalSection",
+		"\tGlobalSection(ExtensibilityGlobals) = postSolution",
+		"\tEndGlobalSection",
+		"\tGlobalSection(ExtensibilityAddIns) = postSolution",
+		"\tEndGlobalSection",
+		'EndGlobal',
+		''
+	);
+
+	&main::CreateExtraFile("$PathBaseDsp.Sln",$SlnText);
+
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_win.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1265 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_win;
+
+# declare variables global for module
+my @Win32LibList=();
+my $Win32StdHeaders;
+my $BaseAddressFlag;
+my $Win32Resrc;
+
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use Winutl;
+use cl_generic;
+use Pathutl;
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+sub PMCheckPlatformL {
+	if ((&main::Plat eq 'TOOLS') and (&main::BasicTrgType ne 'EXE') and (&main::BasicTrgType ne 'LIB')) {
+		die "Can't specify anything but EXE or LIB targettypes for this platform\n";
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+	&Winutl_DoMmp(\@_, $ENV{INCLUDE});
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	$BaseAddressFlag=~s/^(.+$)$/ \/base:\"$1\"/o;
+	@Win32LibList=&Winutl_Win32LibList;
+	my $MSVCVer = &Winutl_MSVCVer;
+	push @Win32LibList, "kernel32.lib";
+	$Win32Resrc=&Winutl_Win32Resrc;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	die "Cannot generate $makecmd makefiles\n" if ($makecmd ne "nmake");
+	my $AifStructRef=&main::AifStructRef;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $LibPath=&main::LibPath;
+
+	my $MSVCVer = &Winutl_MSVCVer;
+
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my $defaultWarningLevel="/W4";
+	my $CompilerOption=&main::CompilerOption("MSVC");
+	my $LinkAs=&main::LinkAs;
+
+	&Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+	my $TrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\$(TRGDIR)\\";
+	}
+	if (&main::Plat eq "WINC") {	# target path ignored under WINC
+		$TrgDir="";
+	}
+	&main::Output(
+		"INCDIR  ="
+	);
+	if($VariantFile){
+        my $VariantFileFileName  = Path_Split('FILE',$VariantFile);
+        &main::Output(
+              " /FI \"$VariantFileFileName\"",
+              );
+
+	}
+
+	foreach (@ChopUserIncPaths,@ChopSysIncPaths) {
+		&main::Output(
+			" /I \"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	my $MSVCVer = &Winutl_MSVCVer;
+
+	&main::Output(
+		"CLFLAGS =",
+			" /nologo",			# suppress "sign-on" banner message
+			" /Zp4",			# packs structures on 4 byte boundaries
+			" /GF"				# Pools strings and places them in read-only memory 
+		);	
+
+	if ($MSVCVer >= 7) {
+		&main::Output(
+			" /wd4996",			# C4996: 'xxxx' was declared deprecated
+			" /wd4571"			# C4571: catch(...) blocks compiled with /EHs do not catch or re-throw Structured Exceptions
+		);	
+
+		if (&main::Plat ne 'TOOLS') {
+			&main::Output(
+				" /EHsc",			# Exceptions on
+				" /GR"				# RTTI on
+			);
+			if ($MSVCVer >= 8) {
+				&main::Output(
+					" /GS-"			# Buffer checking off
+				);
+			}
+		} else {
+			&main::Output(
+				" /EHsc",			# Exceptions on
+				" /GR",				# RTTI on
+				" /GS"				# Buffer checking on
+			);
+		}
+	} else {
+		if (&main::Plat ne 'TOOLS') {
+			&main::Output(
+				" /GX",				# Exceptions on
+				" /GR"				# RTTI on
+			);
+		}
+	}
+
+	if ($MSVCVer >= 8) {
+		&main::Output(
+			" /Zc:wchar_t-"				# Don't make wchar_t a built-in; breaks mangled names
+		);		
+	}
+
+	if (&main::Plat ne 'TOOLS') {
+		unless ($Win32StdHeaders) {
+			&main::Output(
+				" /X"			# ignore standard include directories
+			);
+		}
+	}
+	if ($CompilerOption !~ /\/W\d/) {
+		# Supply default warning level unless /Wn already specified via OPTION MSVC
+		&main::Output(
+			" $defaultWarningLevel"
+		);
+	}
+	&main::Output(
+		" $CompilerOption",		# user-supplied compiler options
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CLDEFS  ="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" /D \"$_\""
+		);
+	}
+	if (($BasicTrgType=~/^LIB$/o) and (&main::Plat eq 'TOOLS')) {
+		&main::Output(
+			" /D _MT"
+		); 
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CL$_ = cl.exe"
+		);
+		if ($BasicTrgType=~/^EXE$/o) {
+			&main::Output(
+				' /MT'			# Creates a multi-threaded executable file, using libcmt.lib
+			);
+			if (/DEB$/o) {
+				&main::Output(
+					'd'				# i.e. /MTd or /MLd, debug executable using debug version of LIB
+				);
+			}
+		}
+		elsif (($BasicTrgType=~/^(DLL|LIB)$/o) and (&main::Plat ne 'TOOLS')){
+			&main::Output(
+				' /MD'			# Creates a multithreaded DLL, using MSVCRT.LIB
+			);
+			if (/DEB$/o) {
+				&main::Output(
+					'd'				# i.e. /MDd, debug executable using debug version of LIB
+				);
+			}
+		}
+		if (/DEB$/o) {
+			&main::Output(
+				' /Zi',			# Generates complete debugging information
+				' /Od'			# Disables optimization
+			);
+#			euser change to apply inlining on the _NAKED functions
+			if ($BaseTrg=~/^EUSER$/oi) {
+				&main::Output(
+					' /Ob1'		# Specific control of expension of inline functions
+				);
+			}
+		}
+		elsif (/REL$/o) {
+			&main::Output(
+				' /O1'				# Creates small code
+			);
+			if ($MSVCVer >= 8) {
+				&main::Output(
+					' /fp:strict'		# Improves floating-point consistency
+				);
+			} else {
+				&main::Output(
+					' /Op'				# Improves floating-point consistency
+				);
+			}
+		}
+		&main::Output(
+			' $(CLFLAGS)'
+		);
+		if (/DEB$/o) {
+			&main::Output(
+				" /Fd\"\$(EPOCTRG$_)\\$TrgDir$BaseTrg.pdb\""
+			);
+		}
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" /D $_"
+			);
+		}
+		&main::Output(
+			" \$(CLDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			&main::Output (
+				" \\\n",
+				"\t\"\$(EPOCTRG$_)\\$TrgDir$Trg\""
+			);
+			unless (/REL$/o) {
+				&main::Output(
+					" \\\n",
+					"\t\"\$(EPOCTRG$_)\\$BaseTrg.bsc\""
+				);
+			}
+			if (&Winutl_CopyForStaticLinkage) {
+				&main::Output(
+					" \\\n",
+					"\t\"\$(EPOCTRG$_)\\$Trg\""
+				);
+			}
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+
+	foreach (@BldList) {
+		my $makework="MAKEWORK$_";
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : $makework"
+		);
+
+		my $BitMapRef;
+		foreach $BitMapRef (@$BitMapStructRef) {
+			my $file="\$(EPOCTRG$_)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t\"$file\""
+			);
+		}
+		undef $BitMapRef;
+
+		my $ResourceRef;
+		foreach $ResourceRef (@$ResourceStructRef) {
+			my $file="\$(EPOCTRG$_)\\$$ResourceRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(	# must come before main target because source for target will depend on the
+			" \\\n",		# *.rsg file in $EPOCIncPath
+			"\t", &Generic_Quote("$file")
+			);
+		}
+		undef $ResourceRef;
+
+		my $AifRef;
+		foreach $AifRef (@$AifStructRef) {
+			my $file="\$(EPOCTRG$_)\\$TrgDir$$AifRef{Trg}";
+			&Generic_MakeWorkFile($makework,$file);
+			&main::Output(
+				" \\\n",
+				"\t\"$file\""
+			);
+		}
+		undef $AifRef;
+
+		&main::Output(
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n"
+				);
+			} else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\".\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		} else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+		my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg;
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+			"\n",
+			"\"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\" : \"$DefFile\"\n",
+			"\tperl -S prepdef.pl \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+			"\tlib.exe /nologo /machine:i386 /nodefaultlib /name:\"$LibLinkAs\"    /def:\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" /out:\"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n",
+			"\tdel \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.exp\"\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE :\n"
+	);
+	if ($DefFile and $BasicTrgType !~ /^IMPLIB$/io) {
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n"
+		);
+	}
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UDEB");
+
+	&Generic_Releaseables;
+}
+
+sub PMBld {
+
+	my $AifStructRef=&main::AifStructRef;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $BitMapStructRef=&main::BitMapStructRef;
+	my $Bld=&main::Bld;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $RelPath=&main::RelPath;
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	my $MSVCVer = &Winutl_MSVCVer;
+	my $newlib = main::NewLib(); # Check if newlib has been set in the MMP file.
+
+
+    my $NewLib = 'scppnwdl.lib'; # This is where operator new and operator delete
+                                 # are defined for user side targets.
+
+    my $NewKernLib = 'scppnwdl_kern.lib'; # This is where operator new and operator delete
+                                 	  # are defined for kernel side targets.
+
+
+
+	my $WarningLevel='/WARN:3';
+	if (&main::Plat() eq 'TOOLS') {
+		$WarningLevel='/WARN:1';    # avoid LNK4005 warnings about unused libraries
+	}
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+	my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\";
+	my $BLDDATAPATH = "\$(EPOCTRG$Bld)\\";
+	if (&main::Plat ne "WINC") {	# target paths ignored under WINC
+		if (&Generic_Definition("TRGDIR") ne "") {
+			$BLDTRGPATH .= "\$(TRGDIR)\\";	    # handles TARGETPATH
+		}
+		$BLDDATAPATH .= "\$(DATADIR)\\";
+	}
+
+	my $Entry="";
+	my $EntrySymbol='';
+	my $Include="";
+	if ($BasicTrgType=~/^DLL$/o) {
+		$Entry="/noentry";
+		$Include="/include:\"__E32Dll\"";
+		$EntrySymbol='_E32Dll';
+	}
+	elsif ($TrgType=~/^EXEXP$/o) {
+		$Entry="/noentry";
+		$Include="/include:\"__E32Startup\"";
+		$EntrySymbol='_E32Startup';
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			$Entry="/entry:\"_E32Bootstrap\"";
+			$Include="/include:\"__E32Startup\"";
+		}
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releaseables;
+
+	unless (&main::Plat() eq 'TOOLS') {
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			push @releaseables, "$BLDTRGPATH$Trg";
+			if (&Winutl_CopyForStaticLinkage) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$Trg";
+			}
+			my $BitMapRef;
+			foreach $BitMapRef (@$BitMapStructRef) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$$BitMapRef{TrgPath}$$BitMapRef{Trg}";
+			}
+			my $ResourceRef;
+			foreach $ResourceRef (@$ResourceStructRef) {
+				push @releaseables, "\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}";
+			}
+			my $AifRef;
+			foreach $AifRef (@$AifStructRef) {
+				push @releaseables, "$BLDTRGPATH$$AifRef{Trg}";
+			}
+			if ($Bld=~/DEB$/o) {
+				push @releaseables,"$BLDTRGPATH$BaseTrg.PDB";
+			}
+		}
+		if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+			push @releaseables, "\$(EPOCLIB$Bld)\\$ExportLibrary.lib";
+		}
+	}
+	else {
+		my $toolspath=&main::EPOCToolsPath();
+		push @releaseables, "$toolspath$Trg";
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : CLEANILK$Bld\n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC CLEANILK$Bld\n",
+		"\n",
+		"CLEANILK$Bld :\n",
+		"\t-\$(ERASE) \"$BLDTRGPATH$BaseTrg.ILK\"\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", $BLDTRGPATH);
+
+	return if ($BasicTrgType =~ /^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if ($Bld=~/DEB$/o) {
+		&main::Output(
+			"BSC32_SBRS="
+		);
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n",
+				"\t\"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\""
+			);
+   		}
+		&main::Output(
+			"\n",
+			"\n",
+		"\"\$(EPOCTRG$Bld)\\$BaseTrg.bsc\" : \$(BSC32_SBRS)\n",
+		"\tbscmake.exe \@<<\n",
+		"\t/nologo /o\$\@ \$(BSC32_SBRS)\n",
+		"<<\n",
+		"\n",
+		"\n"
+		);
+	}
+
+	&main::Output(
+		"LIBS="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCSTATLINK$Bld)\\$_\""
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCLINK$Bld)\\$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_OBJS="
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n",
+			"\t\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\""
+   		);
+   	}
+	if ($Win32Resrc) {
+		&main::Output(
+			" \\\n",
+			"\t\"\$(EPOCBLD$Bld)\\",&main::Path_Split('Base',$Win32Resrc),".res\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::OutFormat(
+			"STAGE1_LINK_FLAGS="
+		);
+		&main::OutFormat(
+			"\"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+		);
+        
+        if (main::StdCppSupport())
+        {
+            unless ($newlib) {
+		    	if ( main::SystemTrg() ) {
+		    		# System targets are PDD, LDD, VAR, KEXT and KDLL.
+		    		&main::OutFormat(
+		    			"\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\""
+		    		);
+		    	}
+		    	else {
+		    		&main::OutFormat(
+		    			"\"\$(EPOCSTATLINK$Bld)\\$NewLib\""
+		    		);
+		    	}
+		    }
+	    	else {
+	    		&main::OutFormat(
+				    "\"\$(EPOCSTATLINK$Bld)\\$newlib\""
+			    );
+		    }    
+        }
+		
+		foreach (@Win32LibList) {
+			&main::OutFormat(
+				' ',lc $_
+			);
+		}
+		&main::OutFormat(
+			" \$(LIBS) /nologo$BaseAddressFlag $Entry /subsystem:windows /dll"
+		);
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' /debug'
+			);
+		}
+		&main::OutFormat(
+			" /incremental:no /machine:IX86"
+		);
+
+		if ($BasicTrgType=~/^EXE$/o) {
+			my $debug = '';
+			if ($Bld =~ /DEB$/o) {
+				$debug .= 'd';
+			}
+			&main::OutFormat(
+				" /nodefaultlib:libcmt$debug.lib"
+			);
+		}
+		&main::OutFormat(
+			" $Include /out:\"\$(EPOCBLD$Bld)\\$Trg\""
+		);
+
+		if ($MSVCVer < 7) {
+			&main::OutFormat(
+				" $WarningLevel"
+			);
+		}
+		&main::OutFormat(
+			" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"",
+			' /ignore:4089',		# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+			' /ignore:4005'			# LNK4005: no objects used from XXX
+		);
+		if ($MSVCVer >= 7) {
+			&main::OutFormat(
+				' /ignore:4210'		# LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
+			);
+		}
+
+
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	&main::OutFormat(
+		'LINK_FLAGS='
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+			);
+
+            if (main::StdCppSupport())
+            {
+                unless ($newlib) {
+			    	if ( main::SystemTrg() ) {
+				    	# System targets are PDD, LDD, VAR, KEXT and KDLL.
+
+					    &main::OutFormat(
+						    "\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\""
+					    );
+	    			}
+		    		else {
+			    		&main::OutFormat(
+				    		"\"\$(EPOCSTATLINK$Bld)\\$NewLib\""
+					    );
+    				}
+	    		}
+		    	else {
+			    	&main::OutFormat(
+				    	"\"\$(EPOCSTATLINK$Bld)\\$newlib\""
+    				);
+	    		}
+            }
+		}
+	}
+	foreach (@Win32LibList) {
+		&main::OutFormat(
+			' ',lc $_
+		);
+	}
+	&main::OutFormat(
+		' $(LIBS) /nologo'
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::OutFormat(
+				" /fixed:no $BaseAddressFlag"
+			);
+		}
+	}
+	&main::OutFormat(
+		" $Entry"
+	);
+	if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) {
+		&main::OutFormat(
+			' /subsystem:console'
+		);
+	}
+	else {
+		&main::OutFormat(
+			' /subsystem:windows'
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::OutFormat(
+			" /dll \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\""
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::OutFormat(
+			' /heap:',$HeapSize{Max},',',$HeapSize{Min}
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' /debug'
+			);
+		}
+		elsif ($Bld=~/REL$/o) {
+			&main::OutFormat(
+				' /incremental:no'
+			);
+		}
+	}
+	&main::OutFormat(
+		' /machine:IX86',
+		' /ignore:4089',	# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+		' /ignore:4005'		# LNK4005: no objects used from XXX
+	);
+	if ($MSVCVer >= 7) {
+		&main::OutFormat(
+			' /ignore:4210'		# LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
+		);
+	}
+	if (&main::Plat eq 'TOOLS') {
+	    if (length(&main::LinkerOption("MSVC")) > 0)
+	    {
+		&main::OutFormat( " " . &main::LinkerOption("MSVC"));
+	    } else {
+		&main::OutFormat(
+			' /ignore:4098'	# LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
+		);
+	    }
+	}
+	else
+	{
+		if ($BasicTrgType=~/^EXE$/o) {
+			my $debug = '';
+			if ($Bld =~ /DEB$/o) {
+				$debug .= 'd';
+			}
+			&main::OutFormat(
+				" /nodefaultlib:libcmt$debug.lib"
+			);
+		}
+		&main::OutFormat(
+			" $Include"
+		);
+	} 
+	&main::OutFormat(
+		" /out:\"$BLDTRGPATH$Trg\""
+	);
+	if ($BasicTrgType=~/^(DLL)$/o) {
+		if ($MSVCVer < 7) {
+			&main::OutFormat(
+				" $WarningLevel"
+			);
+		}
+		&main::OutFormat(
+			" /implib:\"$BLDTRGPATH$ExportLibrary.lib\""
+		);
+	} elsif ($BasicTrgType=~/^(EXE)$/o) {
+		if ($MSVCVer < 7) {
+			&main::OutFormat(
+				" $WarningLevel"
+			);
+		}
+		&main::OutFormat(
+			" /implib:\"$BLDTRGPATH$ExportLibrary.exe.lib\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"\"$BLDTRGPATH$Trg\" : \$(LINK_OBJS)"
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			" \"$DefFile\""
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::Output(
+				" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+			);
+			
+			if (main::StdCppSupport())
+			{
+			    unless ($newlib) {
+    				if ( main::SystemTrg() ) {
+	    				# System targets are PDD, LDD, VAR, KEXT and KDLL.
+    
+	    				&main::Output(
+		    				"\"\$(EPOCSTATLINK$Bld)\\$NewKernLib\""
+			    		);
+				    }
+    				else {
+	    				&main::Output(
+		    				"\"\$(EPOCSTATLINK$Bld)\\$NewLib\""
+			    		);
+				    }
+    			}
+	    		else {
+		    		&main::Output(
+			    		"\"\$(EPOCSTATLINK$Bld)\\$newlib\""
+				    );
+    			}		    
+			}
+		}
+	}
+	&main::Output(
+		" \$(LIBS)\n"
+	);
+
+
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"\tlink.exe \@<<\n",
+			"\t\t\$(STAGE1_LINK_FLAGS) \$(LINK_OBJS)\n",
+			"<<\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+		);
+
+#		Generate an export info file
+		&main::Output(
+			"\tdumpbin /exports /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+
+#		call makedef to reorder the export information
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\""
+		);
+		if (SysTrg()) {
+    			&main::Output( "\t\t-SystemTargetType \\\n" );
+    		}
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			&main::Output(
+				" -Frzfile \"$DefFile\""
+			);
+		}
+		# freeze ordinals, a maximum of 2, for polymorphic dlls
+		my $Ordinal;
+		my $Num=1;
+		foreach $Ordinal (&main::Exports) {
+#			replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+			$Ordinal=~s-\$-\$\$-go;
+			&main::Output(
+				" -$Num $Ordinal"
+			);
+			$Num++;
+		}
+		&main::Output(
+			" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n"
+		);
+
+		# create the export object from the .DEF file
+		&main::Output(
+			"\tlib.exe  /nologo /machine:i386 /nodefaultlib /name:\"$Trg\" /def:\"\$(EPOCBLD)\\$ExportLibrary.def\" /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+		if (&main::ExportUnfrozen) {
+			&main::Output(
+			"\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" \"\$(EPOCLIB)\\UDEB\\$ExportLibrary.lib\"\n"
+			);
+		}
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+		);
+	}
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"\tlink.exe \@<<\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tlib.exe \@<<\n"
+		);
+	}
+	&main::Output(
+		"\t\t\$(LINK_FLAGS) \$(LINK_OBJS)\n",
+		"<<\n"
+	);
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+		);
+	}
+
+	if (&main::Plat eq 'TOOLS') {
+		&main::Output(
+			"\tcopy \"$BLDTRGPATH$Trg\" \"",&main::EPOCToolsPath,"$Trg\"\n"
+		);
+	}
+	if (&Winutl_CopyForStaticLinkage) {
+		&Generic_MakeWorkDir("MAKEWORK$Bld", "\$(EPOCTRG$Bld)");
+		&main::Output(
+			"\n",
+			"\"\$(EPOCTRG$Bld)\\$Trg\" : \"$BLDTRGPATH$Trg\"\n",
+			"\tcopy \$\? \$\@\n"
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $BitMapRef=&main::BitMapRef;
+
+	my $ChopTrgPath="";
+	if ($$BitMapRef{TrgPath}) {
+		$ChopTrgPath.="\\$$BitMapRef{TrgPath}";
+		chop $ChopTrgPath;
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $path="\$(EPOCTRG$Bld)$ChopTrgPath";
+		&main::Output(
+			&Generic_Quote("$path\\$$BitMapRef{Trg}"), " : ", 
+			&Generic_Quote("$$BitMapRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $ResourceRef=&main::ResourceRef;
+	my @BldList=&main::BldList;
+
+	foreach my $Bld (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCTRG$Bld)\\$$ResourceRef{Trg}"), " : ", 
+			&Generic_Quote("$$ResourceRef{GenericTrg}"), "\n",
+			"\t", &Generic_CopyAction(),
+			"\n"
+		);
+	}
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+	# Need to copy generic resource into emulated Z drive
+
+	my $AifRef=&main::AifRef;
+	my $TrgDir="";
+	if (&Generic_Definition("TRGDIR") ne "") {
+		$TrgDir="\\\$(TRGDIR)";
+	}
+	if (&main::Plat eq "WINC") {	# target path ignored under WINC
+		$TrgDir="";
+	}
+
+	my @BldList=&main::BldList;
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $file="\$(EPOCTRG$Bld)$TrgDir\\$$AifRef{Trg}";
+		&main::Output(
+			"\"$file\" : \"$$AifRef{GenericTrg}\"\n",
+			"\tperl -S ecopyfile.pl \$? \$\@\n",
+			"\n"
+		);
+	}
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND="
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t\"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	foreach (@BldList) {
+		&main::Output(
+			"DEPEND$_=\$(DEPEND)\n",
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND$Bld="
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t\"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext=&main::ExtSrc;
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	if ($Cia) {
+		&main::Output(
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /TP /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n",
+			"\n",
+#		assembler listing target 
+			"LISTING$Bld$BaseSrc\_ : \"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\"\n",
+			"\tcopy \$? \"$SrcPath$BaseSrc\_.$Plat.lst\"\n",
+			"\n",
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /TP /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n",
+			"\n"
+		);
+	} else {
+		&main::Output(
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /Fo\"\$(EPOCBLD$Bld)/\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\" /c \"$SrcPath$Src\"\n",
+			"\n",
+#		assembler listing target 
+			"LISTING$Bld$BaseSrc : \"\$(EPOCBLD$Bld)\\$BaseSrc.lis\"\n",
+			"\tcopy \$? \"$SrcPath$BaseSrc.$Plat.lst\"\n",
+			"\n",
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)/\" /FR\"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" /c \"$SrcPath$Src\"\n",
+			"\n"
+		);
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+	if ($Win32Resrc) {
+		my @BldList=&main::BldList;
+		my @DepList=&main::Deps_GenDependsL($Win32Resrc);
+
+		&main::Output(
+			"# Win32 Resource $Win32Resrc\n",
+			"\n",
+			"DEPEND="
+		);
+		foreach (@DepList) {
+			&main::Output(
+				" \\\n\t\"$_\""
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	
+		my $Bld;
+		foreach $Bld (@BldList) {
+			&main::Output(
+				"\"\$(EPOCBLD$Bld)\\",&main::Path_Split('Base',$Win32Resrc),".res\" : \"$Win32Resrc\" \$(DEPEND)\n",
+				"\trc /l 0x809 /fo\$\@ /i \"",&main::Path_Chop(&main::Path_Split('Path',$Win32Resrc)),"\" \"$Win32Resrc\"\n",
+				"\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_x86.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,963 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_x86;
+
+# declare variables global for module
+
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+	
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+);
+
+use Winutl;
+use cl_generic;
+use Genutl;
+use Pathutl;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub PMCheckPlatformL {
+}
+
+sub PMPlatProcessMmp (@) {
+
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	die "Cannot generate $makecmd makefiles\n" if ($makecmd ne "nmake");
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $LinkAs=&main::LinkAs;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+	my $WarningLevel=&main::CompilerOption("MSVC");
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+	&Generic_Header(0,$makecmd);	# define standard things using absolute paths
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+	my $TrgDir="";
+
+	&main::Output(
+		"INCDIR  ="
+	);
+	if($VariantFile){
+        my $VariantFileFileName  = Path_Split('FILE',$VariantFile);
+        &main::Output(
+              " /FI \"$VariantFileFileName\"",
+              );
+
+	}
+
+	foreach (@ChopUserIncPaths,@ChopSysIncPaths) {
+		&main::Output(
+			" /I \"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CLFLAGS = /nologo /Zp4 $WarningLevel /Zm256"
+		);	
+	&main::Output(
+		" /X"
+		);
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"CLDEFS  ="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" /D \"$_\""
+		);
+	}
+	&main::Output(
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"CL$_ = cl.exe"
+		);
+		if (/DEB$/o) {
+			&main::Output(
+				' /Od /Gs0x10000 /Gy /GR- /GX-'
+			);
+#			euser change to apply inlining on the _NAKED functions
+			if ($BaseTrg=~/^EUSER$/oi) {
+				&main::Output(
+					' /Ob1'
+				);
+			}
+		}
+		elsif (/REL$/o) {
+#			euser change to prevent minimum size optimisation from disrupting the maths functions
+				&main::Output(
+					' /O1 /Op /Gs0x10000 /Gy /GF /GR- /GX-'
+				);
+		}
+		&main::Output(
+			' $(CLFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" /D $_"
+			);
+		}
+		&main::Output(
+			" \$(CLDEFS) \$(INCDIR)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+		if ($BasicTrgType !~ /^IMPLIB$/io) {
+			&main::Output (
+				" \\\n",
+				"\t\"\$(EPOCTRG$_)\\$TrgDir$Trg\""
+			);
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+
+	# Resource building is done entirely via cl_generic.pm
+	
+	foreach (@BldList) {
+		my $makework="MAKEWORK$_";
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : $makework"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" \"\$(EPOCLIB)\\UREL\\$PrimaryExportLibrary.LIB\"\n"
+				);
+			}
+			else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)\\UREL\\$PrimaryExportLibrary.LIB\".\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)UREL\\$PrimaryExportLibrary.LIB\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+			"\n",
+			"\"\$(EPOCLIB)\\UREL\\$ExportLibrary.LIB\" : \"$DefFile\"\n",
+			"\tperl -S prepdef.pl \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+			"\tlib.exe /nologo /machine:i386 /nodefaultlib /subsystem:native /name:\"$LinkAs\" /def:\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" /out:\"\$(EPOCLIB)\\UREL\\$ExportLibrary.LIB\"\n",
+			"\tdel \"\$(EPOCLIB)\\UREL\\$ExportLibrary.exp\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), "\n",
+				"\tcopy ", &Generic_Quote("\$(EPOCLIB)\\UREL\\$ExportLibrary.lib"), " \$@\n"
+			);
+		}
+	}
+	&main::Output(
+		"\n",
+		"\n",
+		"FREEZE :\n"
+	);
+	if ($DefFile and $BasicTrgType !~ /^IMPLIB$/io) {
+		&main::Output(
+#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			"\tperl -S efreeze.pl \$(EFREEZE_ALLOW_REMOVE) \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\UREL\\$ExportLibrary.LIB\"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.LIB\"\n"
+			);
+		}
+	}
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}UREL");
+
+	&Generic_Releaseables;
+}
+
+sub PMBld {
+
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LinkAs=&main::LinkAs;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $LibPath=&main::LibPath;
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+	my $HasExports=0;
+	if (-e $DefFile or scalar(&main::Exports)!=0) {
+		$HasExports=1;
+	}
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}
+
+	my $WarningLevel='/WARN:3';
+	$WarningLevel='/WARN:1';    # avoid LNK4005 warnings about unused libraries
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+#	set up $LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') {	# have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+	my $BLDTRGPATH = "\$(EPOCTRG$Bld)\\";
+	my $BLDDATAPATH = "\$(EPOCTRG$Bld)\\";
+	my $Entry="";
+	my $Include="";
+	my $EntrySymbol='';
+	if ($BasicTrgType=~/^DLL$/o) {
+		$Entry="_E32Dll";
+		$Include="/include:\"__E32Dll\"";
+		$EntrySymbol='_E32Dll';
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		$Entry="_E32Startup";
+		$Include="/include:\"__E32Startup\"";
+		$EntrySymbol='_E32Startup';
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+#	releasables
+	my @releasables;
+ 	push @releasables, "$RelPath$Trg" if ($BasicTrgType !~ /^IMPLIB$/io);
+   	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+ 		push @releasables, "$RelPath$Trg.MAP";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+ 		push @releasables, "$LibPath$ExportLibrary.LIB";
+ 		push @releasables, "$LibPath$ExtraExportLibrary.LIB" if ($ExtraExportLibrary);
+	}
+
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld\n",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\t-\$(ERASE) \"$BLDTRGPATH$BaseTrg.ILK\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+ 	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releasables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld", &main::BldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld", $BLDTRGPATH);
+
+ 	return if ($BasicTrgType =~ /^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LIBS="
+	);
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCSTATLINK$Bld)\\$_\""
+		);
+	}
+	foreach (@ASSPLibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCASSPLINK$Bld)\\$_\""
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t\"\$(EPOCLINK$Bld)\\$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LINK_OBJS="
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n",
+			"\t\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\""
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::OutFormat(
+			"STAGE1_LINK_FLAGS="
+		);
+		&main::OutFormat(
+			"\"\$(EPOCSTATLINK$Bld)\\$FirstLib\" /PDB:NONE"
+		);
+		if ($BasicTrgType=~/^(DLL)$/o) {	# Add the DLL stub
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB\""
+			);
+		}
+		&main::OutFormat(
+			" \$(LIBS) /nologo /entry:$Entry /subsystem:native"
+		);
+		if ($BasicTrgType=~/^DLL$/o) {
+			&main::OutFormat(
+				" /dll"
+			);
+		}
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' /debug'
+			);
+		}
+		&main::OutFormat(
+			" /incremental:no /machine:IX86 /nodefaultlib $Include /out:\"\$(EPOCBLD$Bld)\\$Trg\" $WarningLevel",
+			" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"",
+			' /ignore:4089',		# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+			' /ignore:4005'			# LNK4005: no objects used from XXX
+		);
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	&main::OutFormat(
+		'LINK_FLAGS='
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::OutFormat(
+			" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\" /PDB:NONE "
+		);
+		if ($BasicTrgType=~/^(DLL)$/o) {	# Add the DLL stub
+			&main::OutFormat(
+				" \"\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB\""
+			);
+		}
+	}
+	&main::OutFormat(
+		' $(LIBS) /nologo'
+	);
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::OutFormat(
+			" /fixed:no "
+		);
+		&main::OutFormat(
+			" /entry:$Entry"
+		);
+	}
+	&main::OutFormat(
+		' /subsystem:native'
+	);
+	if ($BasicTrgType=~/^DLL$/o) {
+		if ($HasExports) {
+			&main::OutFormat(
+				" /dll \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\""
+			);
+		} else {
+			&main::OutFormat(
+				" /dll"
+			);
+		}
+	} elsif ($TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::OutFormat(
+			" \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\""
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::OutFormat(
+			' /heap:',$HeapSize{Max},',',$HeapSize{Min}
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		if ($Bld=~/DEB$/o) {
+			&main::OutFormat(
+				' /debug'
+			);
+		}
+		elsif ($Bld=~/REL$/o) {
+			&main::OutFormat(
+				' /incremental:no'
+			);
+		}
+	}
+	&main::OutFormat(
+		' /machine:IX86',
+		' /ignore:4089',	# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+		' /ignore:4005'		# LNK4005: no objects used from XXX
+	);
+	&main::OutFormat(
+		" /nodefaultlib $Include"
+	);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::OutFormat(
+			" /out:\"\$(EPOCBLD$Bld)\\$Trg\"",
+			" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\""
+		);
+		&main::OutFormat(
+			" $WarningLevel"
+		);
+	} else {
+		&main::OutFormat(
+			" /out:\"$BLDTRGPATH$Trg\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"\"$BLDTRGPATH$Trg\" : \$(LINK_OBJS)"
+	);
+	if (-e $DefFile) { # effectively "if project frozen ..."
+		&main::Output(
+			" \"$DefFile\""
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\""
+		);
+	}
+	&main::Output(
+		" \$(LIBS)\n"
+	);
+
+
+#	Link by name first time round for dlls
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+		&main::Output(
+			"\techo $Entry>\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tlink.exe \@<<\n",
+			"\t\t\$(STAGE1_LINK_FLAGS) /order:@\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\" \$(LINK_OBJS)\n",
+			"<<\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n",
+#			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+		);
+
+	if ($HasExports) {
+	#		Generate an export info file
+			&main::Output(
+				"\tdumpbin /exports /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n",
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+
+	#		call makedef to reorder the export information
+			&main::Output(
+	#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+				"\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\""
+			);
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" -Frzfile \"$DefFile\""
+				);
+			}
+			# freeze ordinals, a maximum of 2, for polymorphic dlls
+			my $Ordinal;
+			my $Num=1;
+			foreach $Ordinal (&main::Exports) {
+#				replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+				$Ordinal=~s-\$-\$\$-go;
+				&main::Output(
+					" -$Num $Ordinal"
+				);
+				$Num++;
+			}
+			&main::Output(
+				" \"\$(EPOCBLD)\\$ExportLibrary.def\" \n",
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n"
+			);
+
+			# create the export object from the .DEF file
+			&main::Output(
+				"\tlib.exe  /nologo /machine:i386 /nodefaultlib /subsystem:native /name:\"$LinkAs\" /def:\"\$(EPOCBLD)\\$ExportLibrary.def\" /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+			if (&main::ExportUnfrozen) {
+				&main::Output(
+				"\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" \"\$(EPOCLIB)\\UREL\\$ExportLibrary.lib\"\n"
+				);
+				if ($ExtraExportLibrary) {
+					&main::Output(
+						"\n",
+						"\tcopy \"\$(EPOCLIB)\\UREL\\$ExportLibrary.lib\" ",
+						"\"\$(EPOCLIB)\\UREL\\$ExtraExportLibrary.lib\"",
+						"\n"
+					);						
+				}				
+			}
+			&main::Output(
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+		}
+	}
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"\techo $Entry>\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n",
+			"\tlink.exe /order:@\"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\" /MAPINFO:EXPORTS /MAP:\"$RelPath$Trg.MAP\" \@<<\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tlib.exe \@<<\n"
+		);
+	}
+	&main::Output(
+		"\t\t\$(LINK_FLAGS) \$(LINK_OBJS)\n",
+		"<<\n"
+	);
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.ord\"\n"
+		);
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($HasExports) {
+				&main::Output(
+					"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n"
+				);
+			}
+		}
+		&main::Output(
+			"\tperl -S findimp.pl \"$RelPath$Trg.MAP\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.imp\"\n"
+		);
+		&main::Output(
+			"\tpetran -x86imp=\"\$(EPOCBLD$Bld)\\$ExportLibrary.imp\" -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " \"\$(EPOCBLD$Bld)\\$Trg\" \$\@ \\\n",
+			"\t\t"
+		);
+		if (&main::AllowDllData) {
+			&main::Output(
+				' -allow'
+			);
+		}
+		if (not &main::CallDllEntryPoints) {
+			&main::Output(
+				' -nocall'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' -datalinkaddress ',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' -fixed'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' -heap ',$HeapSize{Min},' ',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' -priority ',&main::ProcessPriority
+			);
+		}
+		if (&main::SmpSafe) {
+			&main::Output(
+				' -smpsafe'
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' -stack ',&main::StackSize
+			);
+		}
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" -uid$i $_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' -vid ',&main::VendorId
+			);
+		}
+		&main::Output(
+			' -capability ',&main::Capability,
+		);
+		if (&main::CompressTarget)
+		    {
+		    &main::Output(
+		    " -nocompress"
+		    );
+		    }
+		else
+		    {
+		    if(&main::CompressTargetMode == NOCOMPRESSIONMETHOD)
+			{
+				# Do nothing
+			}
+		    elsif(&main::CompressTargetMode == INFLATECOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" -compressionmethod deflate"
+			);
+			}
+		    elsif(&main::CompressTargetMode == BYTEPAIRCOMPRESSIONMETHOD)
+			{
+			&main::Output(
+				" -compressionmethod bytepair"
+			);
+			}
+
+		    }
+		if (&main::CodePagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -codepaging unpaged'
+			);
+		}
+		elsif (&main::CodePagingTargetMode == PAGED) {
+			&main::Output(
+				' -codepaging paged'
+			);
+		}
+
+		if (&main::DataPagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -datapaging unpaged'
+			);
+		}
+		elsif (&main::DataPagingTargetMode == PAGED) {
+			&main::Output(
+				' -datapaging paged'
+			);
+		}
+		&main::Output("\n");
+		&main::Output(
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n"
+		);
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND="
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t\"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	foreach (@BldList) {
+		&main::Output(
+			"DEPEND$_=\$(DEPEND)\n",
+			"\n"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+
+	&main::Output(
+		"DEPEND$Bld="
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t\"$_\""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcBld {
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext=&main::ExtSrc;
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+
+	if ($Cia) {
+		&main::Output(
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc\_.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\tperl -S tranasm_x86.pl \"$SrcPath$Src\" \"\$(EPOCBLD$Bld)\\$BaseSrc\_.transd.cia\"\n",
+			"\t\$(CL$Bld) /I \"$SrcPath\.\" /TP /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /GF /c \"\$(EPOCBLD$Bld)\\$BaseSrc\_.transd.cia\"\n",
+			"\n",
+#			assembler listing target
+			"LISTING$Bld$BaseSrc\_ : \"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\"\n",
+			"\tcopy \$? \"$SrcPath$BaseSrc\_.$Plat.lst\"\n",
+			"\n",
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc\_.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /TP /FAsc /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)\\$BaseSrc\_.obj\" /GF /c \"$SrcPath$Src\"\n",
+			"\n"
+		);
+	} else {
+		&main::Output(
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc.obj\" \"\$(EPOCBLD$Bld)\\$BaseSrc.sbr\" : \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /Fo\"\$(EPOCBLD$Bld)/\" /GF /c \"$SrcPath$Src\"\n",
+			"\n",
+#			assembler listing target
+			"LISTING$Bld$BaseSrc : \"\$(EPOCBLD$Bld)\\$BaseSrc.lis\"\n",
+			"\tcopy \$? \"$SrcPath$BaseSrc.$Plat.lst\"\n",
+			"\n",
+			"\"\$(EPOCBLD$Bld)\\$BaseSrc.lis\": \"$SrcPath$Src\" \$(DEPEND$Bld)\n",
+			"\t\$(CL$Bld) /FAsc /Fa\"\$\@\" /Fo\"\$(EPOCBLD$Bld)/\" /GF /c \"$SrcPath$Src\"\n",
+			"\n"
+		);
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cl_x86gcc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1107 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+
+package Cl_x86gcc;
+
+
+my $GccPrefix='';
+my $ToolPrefix='';
+
+my $HelperLib='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+	'Entry'=>'--entry',
+	'Gcc'=>'',
+	'Ld'=>'',
+	'Petran'=>'',
+	'Optimize'=>'-O'
+);
+my $Dlltool;
+my $Archive;
+my $Link;
+my $Objcopy;
+
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMPlatProcessMmp
+
+	PMUnderlyingABI
+
+	PMStartBldList
+		PMBld
+	PMStartSrcList
+		PMBitMapBld
+		PMResrcBld
+		PMAifBld
+		PMStartSrc
+		PMSrcDepend
+			PMSrcBldDepend
+			PMEndSrcBld
+		PMEndSrc
+	PMEndSrcList
+	PMPrefixFile
+);
+
+use cl_generic;
+use Genutl;
+
+use constant NOCOMPRESSIONMETHOD => 0;
+use constant INFLATECOMPRESSIONMETHOD => 1;
+use constant BYTEPAIRCOMPRESSIONMETHOD => 2;
+
+use constant NOTPAGED => 0;
+use constant UNPAGED => 1;
+use constant PAGED => 2;
+
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+sub PMCheckPlatformL {
+}
+sub PMPlatProcessMmp (@) {
+	my $MMPFILE=&main::MmpFile;
+
+	# set up START MARM ... END block module variables
+	my @MmpWarn=();
+	my $Line;
+	LINE: foreach $Line (@_) {
+		my $LineInfo=shift @$Line;
+		$_=shift @$Line;
+		push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
+	}
+
+	undef $Line;
+	if (@MmpWarn) {
+		warn
+			"\nMMPFILE \"$MMPFILE\"\n",
+			"START .. END BLOCK WARNINGS(S)\n",
+			@MmpWarn,
+			"\n"
+		;
+	}
+	undef @MmpWarn;
+}
+
+
+sub SystemTarget() {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	# N.B. should get better way to detect kernel probably!!
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	
+	return 0;
+}
+
+
+
+
+
+sub PMUnderlyingABI($) {
+	my ($ABI) = @_;
+	if ($ABI eq 'X86gcc') {
+			return 'X86gcc';
+	}
+	return $ABI;
+}
+
+my $Makecmd;
+my %ABILibPath=();
+my $genDefFile;
+sub PMStartBldList($) {
+	($Makecmd) = @_;
+	my $ABI=&main::ABI;
+	my $UnderlyingABI=PMUnderlyingABI($ABI);
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @BldList=&main::BldList;
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DefFile=&main::DefFile;
+	my $EPOCPath=&main::EPOCPath;
+	my $LinkAs=&main::LinkAs;
+	my $LibPath=&main::LibPath;
+	my @MacroList=&main::MacroList();
+	my $VariantFile=&main::VariantFile();
+	my $Plat=&main::Plat;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;	
+	my $WarningLevel=&main::CompilerOption("GCC");
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $SystemTrg = SystemTarget();
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+#	set up dlltool flag hash
+	my %ABIDlltool=(
+		X86gcc=>' -m i386' 
+	);
+
+#	work out the flags for various platforms
+	if ($ABI eq 'X86gcc') {
+		$PlatOpt{Gcc}='-c  -masm=intel -B\\epoc32\\gcc_mingw\\_p';
+		$PlatOpt{Dlltool}=$ABIDlltool{X86gcc};
+	}
+
+
+	else {
+		&main::FatalError("Platform module - ABI \"$ABI\" unrecognised");
+	}
+	
+
+#	set up CompatibleABI lib path hash
+	my %ABIRTWLibPath=();
+	
+
+
+	$Dlltool=$ToolPrefix.'dlltool';
+	$Archive=$ToolPrefix.'ar';
+	$Link=$ToolPrefix.'ld';
+	$Objcopy=$ToolPrefix.'objcopy';
+
+	&Generic_Header(0,$Makecmd);	# define standard things using absolute paths
+
+	&main::Output(
+		"\n",
+		"# must set both PATH to make it work correctly\n",
+		"Path:=",&main::Path_Drive,$EPOCPath,"gcc_mingw\\bin;\$(Path)\n",
+		"PATH:=\$(Path)\n",
+		"\n"
+	);
+
+
+	&main::Output(
+		"INCDIR  ="
+	);
+
+	foreach (@ChopRTWUserIncPaths) {
+		&main::Output(
+			" -I \"$_\""
+		);
+	}
+	foreach (@ChopRTWSysIncPaths) {
+		&main::Output(
+			" -isystem \"$_\""
+		);
+	}
+
+	&main::Output(
+		"\\\n -include \"", $EPOCPath, "include\\gcc.h\"",
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCFLAGS=$PlatOpt{Gcc} \\\n",
+		"\n"
+	);
+
+	&main::Output(
+		"GCCDEFS ="
+	);
+	foreach(@MacroList) {
+		&main::Output(
+			" -D$_"
+		);
+	}
+	&main::Output(
+		" -D PRODUCT_INCLUDE=\"\\\"$VariantFile\\\"\"",
+		" \$(USERDEFS)\n",
+		"\n"
+	);
+
+	foreach (@BldList) {
+		&main::Output(
+			"GCC$_ = ${GccPrefix}g++"
+		);
+		if (/REL$/o) {
+			&main::Output(
+				      ' ',
+				      $PlatOpt{Optimize}
+			);
+		}
+		elsif (/DEB$/o) {
+			&main::Output(
+				' -g'
+			);
+			#unless (&main::SrcDbg) {
+			#   &main::Output(
+			#   	' ', $PlatOpt{Optimize}
+			#  );
+			#}
+		}
+		&main::Output(
+			' $(GCCFLAGS)'
+		);
+		foreach (&main::MacroList($_)) {
+			&main::Output(
+				" -D$_"
+			);
+		}
+		&main::Output(
+			" \$(GCCDEFS)\n"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	
+	foreach (@BldList) {
+		&main::Output(
+			"$_ :"
+		);
+
+		if ($BasicTrgType !~ /IMPLIB/io) {
+			&main::Output (
+				#" \\\n\t \"",
+				" \\\n\t ",
+				&Generic_Quote("\$(EPOCTRG$_)\\$Trg")
+				#"\""
+			);
+		}
+
+#		lib has to come after the main target so that a .DEF file will be generated if the project is not frozen
+		if ($DefFile and not &main::ExportUnfrozen) {
+			&main::Output(
+				" \\\n",
+				"\tLIBRARY\n"
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+	}
+
+	# Resource building is done entirely via cl_generic.pm
+	
+	foreach (@BldList) {
+		&main::Output(
+			"\n",
+			"RESOURCE$_ : MAKEWORK$_"
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n",
+	);
+
+	if (!-e $DefFile && scalar(&main::Exports)!=0)
+	{
+		# There are mandatory exports - generate a def file using the mandatory exports.
+		$genDefFile = "\$(EPOCBLD)\\$ExportLibrary.gen.def";
+	}
+	
+	if (-e $DefFile || defined($genDefFile)) { # effectively "if project frozen ..."
+		
+		#	Establish the entry point symbol
+		my $EntrySymbol;
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEDLL$/o ) {
+			$EntrySymbol = '_E32Dll';
+		}
+		elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o ) {
+			$EntrySymbol = '_E32Startup';
+		}
+				
+		&main::Output("\n", &Generic_Quote("\$(EPOCBLD)\\$ExportLibrary.prep.def"), " : ");
+		my $defFileToUse;
+		if (defined($genDefFile))
+		{
+			# The generated def file is not a dependency of the prep.def - don't add anyting after the ':' char
+			&main::Output("\n\tperl -S gendef.pl $genDefFile ", join(' ', &main::Exports), "\n");
+			$defFileToUse = $genDefFile;
+		}
+		else
+		{
+			&main::Output(&Generic_Quote($DefFile), "\n");
+			$defFileToUse = "\$<";
+		}
+		&main::Output("\tperl -S prepdef.pl $defFileToUse \$@ nodatasizes $EntrySymbol\n\n");
+		
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD)\\$ExportLibrary.lib.exp"), " : ", &Generic_Quote("\$(EPOCBLD)\\$ExportLibrary.prep.def"), "\n",
+			"\t$Dlltool $PlatOpt{Dlltool} --input-def \"\$<\"  --dllname \"$LinkAs\"  -e \"\$@\"  \n",			
+			"\t-\$(ERASE) \"\$(EPOCBLD)\\tmp.txt \"\n\n"
+		);
+	}
+	
+	&main::Output(
+		"LIBRARY : MAKEWORKLIBRARY"
+	);
+	if ($BasicTrgType=~/^LIB$/o) {
+#		code to ensure that the static libraries for all builds are built at the library stage
+		foreach (@BldList) {
+			&main::Output(
+				" $_"
+			);
+		}
+	}
+	elsif ($DefFile and !$NoExportLibrary) {
+		unless (&main::ExportUnfrozen) {
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				&main::Output(
+					" ", &Generic_Quote("\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib")
+				);
+				&main::Output(
+					"\n"
+				);
+			} else {
+				&main::Output(
+					"\n",
+					"\t\@echo WARNING: Not attempting to create any import libraries.\n",
+					"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+				);
+			}
+		}
+		else {
+			&main::Output(
+				"\n",
+				"\t\@echo Not attempting to create \"\$(EPOCLIB)\\LIB\\$PrimaryExportLibrary.lib\"\n",
+				"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+			);
+		}
+
+
+
+		&main::Output(
+			"\n",
+			"\n",
+			"# REAL TARGET - LIBRARY\n",
+		);
+		
+		&main::Output(
+			"\n",
+			&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), " : ",
+			&Generic_Quote("\$(EPOCBLD)\\$ExportLibrary.prep.def"), "\n",
+			"\t$Dlltool $PlatOpt{Dlltool} --input-def \"\$<\"  --dllname \"$LinkAs\"  --output-lib \"\$@\" \n",
+			"\t-\$(ERASE) \"\$(EPOCBLD)\\tmp.txt \"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\n",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib"), " : ",
+				&Generic_Quote("\$(EPOCLIB)\\LIB\\$ExportLibrary.lib"), "\n",
+				"\tcopy \$< \$@\n"
+			);
+		}
+	}
+
+
+	&main::Output(
+		"\n",
+		"CLEANLIBRARY :\n"
+	);
+	if ($DefFile and !$NoExportLibrary) {
+		&main::Output(
+			"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExportLibrary.lib \"\n"
+		);
+		if ($ExtraExportLibrary) {
+			&main::Output(
+				"\t-\$(ERASE) \"\$(EPOCLIB)\\LIB\\$ExtraExportLibrary.lib \"\n"
+			);
+		}
+
+	}
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+	&Generic_MakeWorkDir('MAKEWORKLIBRARY',"${LibPath}LIB");
+
+	&Generic_Releaseables;
+}
+
+
+sub PMBld {
+
+	my @ASSPLibList=&main::ASSPLibList;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $DefFile=&main::DefFile;
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my $LibPath=&main::LibPath;
+	my $LinkAs=&main::LinkAs;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my @StatLibList=&main::StatLibList;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $Trg=&main::Trg;
+	my $TrgType=&main::TrgType;
+	my @UidList=&main::UidList;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $SystemTrg = SystemTarget();
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+	}
+
+	if ($Bld =~ /DEB/) {
+		@LibList = &main::DebugLibList;
+	} else {
+		@LibList = &main::LibList;
+	}
+
+#	set up $LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') {	# have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+	
+
+
+
+
+	# REAL TARGETS
+	#-------------
+	&main::Output(
+		"# REAL TARGET - BUILD VARIANT $Bld\n",
+		"\n"
+	);
+
+
+#	releasables
+	my @releaseables;
+	
+
+	push @releaseables, "$RelPath$Trg" if ($BasicTrgType!~/^IMPLIB$/io);
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		push @releaseables, "$RelPath$Trg.MAP";
+	}
+	if (-e $DefFile and !$NoExportLibrary) { # effectively "if project frozen ..."
+		push @releaseables, "$LibPath$ExportLibrary.lib";
+		push @releaseables, "$LibPath$ExtraExportLibrary.lib" if ($ExtraExportLibrary);
+	}
+	
+	&main::Output(
+		"WHAT$Bld : WHATGENERIC\n",
+		"\n",
+		"CLEAN$Bld : CLEANBUILD$Bld CLEANRELEASE$Bld CLEANLIBRARY\n ",
+		"\n",
+		"CLEANBUILD$Bld : \n",
+		"\t\@perl -S ermdir.pl \"\$(EPOCBLD$Bld)\"\n",
+		"\n",
+		"CLEANRELEASE$Bld : CLEANGENERIC\n",
+		"\n"
+	);
+	&Generic_WhatCleanTargets($Bld, "WHAT$Bld", "CLEANRELEASE$Bld", @releaseables);
+
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopBldPath);
+	&Generic_MakeWorkDir("MAKEWORK$Bld",$ChopRelPath);
+
+	return if ($BasicTrgType=~/^IMPLIB$/io);
+
+	&main::Output(
+		"LISTING$Bld : MAKEWORK$Bld"
+	);
+	foreach (@SrcList) {
+		my $BaseSrc = &main::Path_Split('Base', $_);
+		my $Ext = &main::Path_Split('Ext', $_);
+		$BaseSrc.='_' if (lc($Ext) eq '.cia');
+   		&main::Output(
+			" \\\n\tLISTING$Bld$BaseSrc"
+   		);
+   	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+	&main::Output(
+		"LIBS$Bld="
+	);
+
+	
+	if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB")
+		);
+	}
+
+	
+	if ($HelperLib) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$HelperLib")
+		);
+	}
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_")
+		);
+	}
+
+
+	foreach (@ASSPLibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCASSPLINK$Bld)\\$_")
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t",
+			&Generic_Quote("\$(EPOCLINK)\\LIB\\$_")
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+
+	&main::Output(
+		"LINKLIBS$Bld="
+	);
+	
+	
+	if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+		&main::Output(
+			" \\\n\t \"",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\EDLLSTUB.LIB"),
+			" \""
+		);
+	}
+
+	
+	if ($HelperLib) {
+		&main::Output(
+			" \\\n\t \"",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$HelperLib"),
+			" \""
+		);
+	}
+	foreach (@StatLibList) {
+		&main::Output(
+			" \\\n\t \"",
+			&Generic_Quote("\$(EPOCSTATLINK$Bld)\\$_"),
+			" \""
+		);
+	}
+
+
+	foreach (@ASSPLibList) {
+		&main::Output(
+			" \\\n\t \"",
+			&Generic_Quote("\$(EPOCASSPLINK$Bld)\\$_"),
+			" \""
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \\\n\t \"",
+			&Generic_Quote("\$(EPOCLINK)\\LIB\\$_"),
+			" \""
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+
+#	Establish the entry point symbol
+	my $EntrySymbol;
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEDLL$/o ) {
+		$EntrySymbol = '_E32Dll';
+	}
+	elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o ) {
+		$EntrySymbol = '_E32Startup';
+	}
+	
+	&main::Output(
+		&Generic_Quote("\$(EPOCTRG$Bld)\\$Trg"), " : ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.in")
+	);
+	
+	if (-e $DefFile || defined($genDefFile)) { # effectively "if project frozen ..."
+		&main::Output(
+			" ", &Generic_Quote("\$(EPOCBLD)\\$ExportLibrary.lib.exp")
+		);
+	}
+	if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+		&main::Output(
+			" ", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$FirstLib")
+		);
+	}
+	
+	if ($TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			" ", &Generic_Quote("\$(EPOCSTATLINK$Bld)\\$FirstLib")
+		);
+	}
+	&main::Output(
+		" \$(LIBS$Bld)\n"
+	);
+
+
+
+
+	if ($BasicTrgType=~/^(DLL|EXE)/o) {
+
+
+#		call ld to link the target
+		&main::Output(
+			"\t$Link $PlatOpt{Ld}  -nostdlib   "
+		);
+
+
+
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if (-e $DefFile || defined($genDefFile)) {
+				&main::Output(
+				"\"\$(EPOCBLD)\\$ExportLibrary.lib.exp \" \\\n"
+				
+				);		
+			}		
+			if ($BasicTrgType=~/^DLL$/o) {
+				&main::Output(
+					"--dll $PlatOpt{Entry} _$EntrySymbol  \\\n"
+				);
+			}
+			else{
+				&main::Output(
+					" $PlatOpt{Entry} _$EntrySymbol  \\\n"
+				);
+						
+			}
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			&main::Output(
+				" $PlatOpt{Entry} _$EntrySymbol  \\\n"
+			);
+		}
+		
+#		--whole-archive is required here apparently because of a defect in the gcc toolchain
+#		the flag can probably be removed with a later version of gcc
+		&main::Output(
+			"\t\t-Map \"\$(EPOCTRG$Bld)\\$Trg.map \" -o \"\$(EPOCBLD$Bld)\\$Trg \" \\\n",
+			"\t\t\"\$(EPOCSTATLINK$Bld)\\$FirstLib \" --whole-archive \"\$(EPOCBLD$Bld)\\$BaseTrg.in \" \\\n",
+			"\t\t--no-whole-archive"
+		);
+		
+
+		&main::Output(
+			" \$(LINKLIBS$Bld) \$(USERLDFLAGS)\n"
+		);
+		
+
+		if (&main::CompressTarget) {
+			&main::Output(
+			"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " -nocompress " ,  " \"\$(EPOCBLD$Bld)\\$Trg\" \"\$\@\" \\\n",
+			"\t\t"
+			);
+		}
+		else {
+			if(&main::CompressTargetMode==NOCOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " \"\$(EPOCBLD$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+			elsif(&main::CompressTargetMode==INFLATECOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod deflate", " \"\$(EPOCBLD$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+			elsif(&main::CompressTargetMode==BYTEPAIRCOMPRESSIONMETHOD){
+				&main::Output(
+					"\tpetran $PlatOpt{Petran} -version ", &Genutl_VersionToUserString(%Version), " -sid ", &main::SecureId(), " ", "  -compressionmethod bytepair", " \"\$(EPOCBLD$Bld)\\$Trg\" \"\$\@\" \\\n",
+					"\t\t"
+				);
+			}
+		}
+
+# ALWAYS ALLOW WRITEABLE DATA... PART OF THE VTABLE IMPORT WORKAROUND
+#		if (&main::AllowDllData) {
+			&main::Output(
+				' -allow'
+			);
+#		}
+		if (not &main::CallDllEntryPoints) {
+			&main::Output(
+				' -nocall'
+			);
+		}
+		if (&main::DataLinkAddress) {
+			&main::Output(
+				' -datalinkaddress ',&main::DataLinkAddress
+			);
+		}
+		if (&main::FixedProcess) {
+			&main::Output(
+				' -fixed'
+			);
+		}
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			&main::Output(
+				' -heap ',$HeapSize{Min},' ',$HeapSize{Max}
+			);
+		}
+		if (&main::ProcessPriority) {
+			&main::Output(
+				' -priority ',&main::ProcessPriority
+			);
+		}
+		if (&main::SmpSafe) {
+			&main::Output(
+				' -smpsafe'
+			);
+		}
+		if (&main::StackSize) {
+			&main::Output(
+				' -stack ',&main::StackSize
+			);
+		}
+
+		if (&main::CodePagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -codepaging unpaged'
+			);
+		}
+		elsif (&main::CodePagingTargetMode == PAGED) {
+			&main::Output(
+				' -codepaging paged'
+			);
+		}
+
+		if (&main::DataPagingTargetMode == UNPAGED) {
+			&main::Output(
+				' -datapaging unpaged'
+			);
+		}
+		elsif (&main::DataPagingTargetMode == PAGED) {
+			&main::Output(
+				' -datapaging paged'
+			);
+		}
+
+		my $i=1;
+		foreach (@UidList) {
+			&main::Output(
+				" -uid$i $_"
+			);
+			$i++;
+		}
+		if(&main::VendorId) {
+			&main::Output(
+				' -vid ',&main::VendorId
+			);
+		}
+		&main::Output(
+			' -capability ',&main::Capability,
+		);
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"\tcopy \"\$(EPOCBLD$Bld)\\$BaseTrg.in\" \"\$(EPOCSTATLINK$Bld)\\$Trg\"\n"
+		);
+	}
+
+	&main::Output(
+		"\n"
+	);
+
+
+	# TARGET *.IN
+	#------------
+	if (scalar @SrcList >100) {
+		# deal with very long lists by splitting them into 150 file pieces, which allows
+		# about 200 bytes per filename if the underlying max size is 32K
+		#
+		my $counter1=100;	# i.e. trigger new variable immediately
+		my $counter2=0;
+		my @objvarlist=();
+		foreach (@SrcList) {
+			if ($counter1==100) {
+				$counter1=0;
+				$counter2++;
+				my $objvar = "OBJECTS$Bld$counter2";
+				push @objvarlist, " \$($objvar)";
+				&main::Output(
+					"\n",
+					"$objvar="
+				);
+			}
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+			);
+			$counter1++;
+		}
+		&main::Output(
+			"\n",
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.in"), " : ", @objvarlist,"\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n"
+		);
+		foreach (@objvarlist) {
+			# Add the files to the list in groups
+			&main::Output(
+				"\t$Archive cr \"\$\@ \" $_  \n"
+			);
+		}
+		&main::Output(
+			"\n\n"
+		);
+	} else {
+		# shorter lists remain unchanged
+		# 
+		&main::Output(
+			"OBJECTS$Bld="
+		);
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o")
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+		
+		##Version of object list with quotes
+		&main::Output(
+			"ARCHIVEOBJECTS$Bld="
+		);
+		foreach (@SrcList) {
+			my $BaseSrc = &main::Path_Split('Base', $_);
+			my $Ext = &main::Path_Split('Ext', $_);
+			$BaseSrc.='_' if (lc($Ext) eq '.cia');
+			&main::Output(
+				" \\\n\t \"", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"),
+				" \""
+			);
+		}
+		&main::Output(
+			"\n",
+			"\n"
+		);
+						
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseTrg.in"), " : \$(OBJECTS$Bld)\n",
+			"\tif exist \"\$\@\" del \"\$\@\"\n",
+			"\t$Archive cr \"\$\@ \" \$(ARCHIVEOBJECTS$Bld)  \n",
+			"\n\n"
+		);
+	}
+}
+
+
+sub PMStartSrcList {
+
+	&main::Output(
+		"# SOURCES\n",
+		"\n"
+	);
+}
+
+sub PMBitMapBld {
+
+	&Generic_BitMapBld;
+	
+}
+
+sub PMResrcBld {
+
+	&Generic_ResrcBld;
+
+}
+
+sub PMAifBld {
+
+	&Generic_AifBld;
+
+}
+
+sub PMStartSrc {
+	my $Src=&main::Src;
+
+	&main::Output(
+		"# Source $Src\n",
+		"\n"
+	);
+}
+
+sub PMSrcDepend {
+	my @BldList=&main::BldList;	
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	foreach (@BldList) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.lis"), " ",
+			&Generic_Quote("\$(EPOCBLD$_)\\$BaseSrc$cia.o"), " \\\n",
+		);
+	}
+	&main::Output(
+		":"
+	);
+	foreach (@DepList) {
+		&main::Output(
+		" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMSrcBldDepend {
+	my $Bld=&main::Bld;
+	my @DepList=&main::DepList;
+	my $BaseSrc=&main::BaseSrc;
+	my $ExtSrc=&main::ExtSrc;
+	my $cia = (lc($ExtSrc) eq '.cia') ? "_" : "";
+
+	return if (@DepList == 0);
+
+	&main::Output(
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.lis"), " ",
+		&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc$cia.o"), " :",
+	);
+	foreach (@DepList) {
+		&main::Output(
+			" \\\n\t", &Generic_Quote($_)
+		);
+	}
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub SelectLangOptions {
+	my ($Ext) = @_;
+	if ($Ext=~/^.c$/) {
+		return '-x c';
+	}
+	return '-fno-rtti -fno-exceptions -fcheck-new';
+}
+
+sub PMEndSrcBld {
+	my $ABI=&main::ABI;
+	my $BaseSrc=&main::BaseSrc;
+	my $Bld=&main::Bld;
+	my $Src=ucfirst lc &main::Src;
+	my $SrcPath=&main::SrcPath;
+	my $Ext = &main::Path_Split('Ext', $Src);
+	my $Cia = (lc($Ext) eq '.cia') ? 1 : 0;
+	my $LangOptions = &SelectLangOptions($Ext);
+
+	my $RTWSrcPath=&main::Path_Chop(&main::Path_RltToWork($SrcPath));
+
+	# Use GCC trick to get assembler source files preprocessed with CPP
+	$Src =~ s/\.s$/.S/i;
+
+	if ($Cia) {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(GCC$Bld) -fomit-frame-pointer -O1 -x c++  -D__CIA__ -I \"$RTWSrcPath\" \$(INCDIR)  -o \$\@ \"$RTWSrcPath\\$Src\"\n",
+			"\n",
+	#		generate an assembly listing target too
+			"LISTING$Bld$BaseSrc\_ : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc\_.$ABI.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc\_.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) -fomit-frame-pointer -O1 -x c++  -D__CIA__ -Wa,-adln -I \"$RTWSrcPath\" \$(INCDIR)  -o nul: \"$RTWSrcPath\\$Src\" > \$\@\n",
+			"\n"
+		);
+	} else {
+		&main::Output(
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.o"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\techo $Src\n",
+			"\t\$(GCC$Bld) $LangOptions -I \"$RTWSrcPath\" \$(INCDIR) -o \$\@ \"$RTWSrcPath\\$Src\"\n",
+			"\n",
+	#		generate an assembly listing target too
+			"LISTING$Bld$BaseSrc : ", &Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), "\n",
+			"\t", &Generic_CopyAction("$SrcPath$BaseSrc.$ABI.lst"),
+			"\n",
+			&Generic_Quote("\$(EPOCBLD$Bld)\\$BaseSrc.lis"), " : ",
+			&Generic_Quote("$SrcPath$Src"), "\n",
+			"\t\$(GCC$Bld) $LangOptions -Wa,-adln -I \"$RTWSrcPath\" \$(INCDIR)  -o nul: \"$RTWSrcPath\\$Src\" > \$\@\n",
+			"\n"
+		);
+	}
+}
+
+sub PMEndSrc {
+
+	&main::Output(
+		"\n",
+		"\n"
+	);
+}
+
+sub PMEndSrcList {
+
+	# Deal with accumulated MAKEDIRS etc.
+
+	&Generic_End;
+}
+
+sub PMPrefixFile 
+{ 
+    return &Generic_Quote(&main::Path_Drive.&main::EPOCIncPath."gcc.h");
+}
+
+1;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cw_link_descriptor_template.cwlink	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ -->
+<!--Sample XML file generated by XMLSPY v5 rel. 3 U (http://www.xmlspy.com)-->
+<template-file xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.metrowerks.com/schemas/2003/IDE/SymbianLinkDescriptor.xsd">
+	<template uuid="{AF9FEC09-7314-4940-9443-1644BD3648B5}">
+		<version>1</version>
+		<name>Symbian Link Descriptor</name>
+		<aliases>
+			<alias uuid="{AF9FEC10-7314-4940-9443-1644BD3648B5}">.</alias>
+		</aliases>
+		<setting uuid-alias="." entry="linkCommandSet">
+			<array inheritance="none"></array>
+		</setting>
+	</template>
+</template-file>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cw_link_descriptor_template_v2.cwlink	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,37 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ -->
+<!--Sample XML file generated by XMLSPY v5 rel. 3 U (http://www.xmlspy.com)-->
+<template-file xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://www.metrowerks.com/schemas/2003/IDE/SymbianLinkDescriptor.xsd">
+	<template uuid="{AF9FEC09-7314-4940-9443-1644BD3648B5}">
+		<version>1</version>
+		<name>Symbian Link Descriptor</name>
+		<aliases>
+			<alias uuid="{AF9FEC10-7314-4940-9443-1644BD3648B5}">.</alias>
+		</aliases>
+		<setting uuid-alias="." entry="linkCommandSet">
+			<array inheritance="none"></array>
+		</setting>
+		<setting uuid-alias="." entry="symbolDefinitions">
+			<array inheritance="none"></array>
+		</setting>
+		<setting uuid-alias="."  entry="textFileDumpDefinitions">
+			<array inheritance="none"></array>
+		</setting>
+	</template>
+</template-file>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cw_project_template_v3.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2653 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<!--
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ -->
+<?codewarrior exportversion="1.0.1" ideversion="5.0" ?>
+
+<!DOCTYPE PROJECT [
+<!ELEMENT PROJECT (TARGETLIST, TARGETORDER, GROUPLIST, DESIGNLIST?)>
+<!ELEMENT TARGETLIST (TARGET+)>
+<!ELEMENT TARGET (NAME, SETTINGLIST, FILELIST?, LINKORDER?, SEGMENTLIST?, OVERLAYGROUPLIST?, SUBTARGETLIST?, SUBPROJECTLIST?, FRAMEWORKLIST?)>
+<!ELEMENT NAME (#PCDATA)>
+<!ELEMENT USERSOURCETREETYPE (#PCDATA)>
+<!ELEMENT PATH (#PCDATA)>
+<!ELEMENT FILELIST (FILE*)>
+<!ELEMENT FILE (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?, ROOTFILEREF?, FILEKIND?, FILEFLAGS?)>
+<!ELEMENT PATHTYPE (#PCDATA)>
+<!ELEMENT PATHROOT (#PCDATA)>
+<!ELEMENT ACCESSPATH (#PCDATA)>
+<!ELEMENT PATHFORMAT (#PCDATA)>
+<!ELEMENT ROOTFILEREF (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT FILEKIND (#PCDATA)>
+<!ELEMENT FILEFLAGS (#PCDATA)>
+<!ELEMENT FILEREF (TARGETNAME?, PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT TARGETNAME (#PCDATA)>
+<!ELEMENT SETTINGLIST ((SETTING|PANELDATA)+)>
+<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>
+<!ELEMENT PANELDATA (NAME, VALUE)>
+<!ELEMENT VALUE (#PCDATA)>
+<!ELEMENT LINKORDER (FILEREF*)>
+<!ELEMENT SEGMENTLIST (SEGMENT+)>
+<!ELEMENT SEGMENT (NAME, ATTRIBUTES?, FILEREF*)>
+<!ELEMENT ATTRIBUTES (#PCDATA)>
+<!ELEMENT OVERLAYGROUPLIST (OVERLAYGROUP+)>
+<!ELEMENT OVERLAYGROUP (NAME, BASEADDRESS, OVERLAY*)>
+<!ELEMENT BASEADDRESS (#PCDATA)>
+<!ELEMENT OVERLAY (NAME, FILEREF*)>
+<!ELEMENT SUBTARGETLIST (SUBTARGET+)>
+<!ELEMENT SUBTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT SUBPROJECTLIST (SUBPROJECT+)>
+<!ELEMENT SUBPROJECT (FILEREF, SUBPROJECTTARGETLIST)>
+<!ELEMENT SUBPROJECTTARGETLIST (SUBPROJECTTARGET*)>
+<!ELEMENT SUBPROJECTTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT FRAMEWORKLIST (FRAMEWORK+)>
+<!ELEMENT FRAMEWORK (FILEREF, LIBRARYFILE?, VERSION?)>
+<!ELEMENT LIBRARYFILE (FILEREF)>
+<!ELEMENT VERSION (#PCDATA)>
+<!ELEMENT TARGETORDER (ORDEREDTARGET|ORDEREDDESIGN)*>
+<!ELEMENT ORDEREDTARGET (NAME)>
+<!ELEMENT ORDEREDDESIGN (NAME, ORDEREDTARGET+)>
+<!ELEMENT GROUPLIST (GROUP|FILEREF)*>
+<!ELEMENT GROUP (NAME, (GROUP|FILEREF)*)>
+<!ELEMENT DESIGNLIST (DESIGN+)>
+<!ELEMENT DESIGN (NAME, DESIGNDATA)>
+<!ELEMENT DESIGNDATA (#PCDATA)>
+]>
+
+<PROJECT>
+    <TARGETLIST>
+        <TARGET>
+            <NAME>WINSCW UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+		        <SETTING><NAME>SystemSearchPaths</NAME>
+		            <SETTING>
+		                <SETTING><NAME>SearchPath</NAME>
+		                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+		                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		                    <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+		                </SETTING>
+		                <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>WINSCW UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+        <SETTING><NAME>FileMappings</NAME>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+		        
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>E32Main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installation" panel -->
+		        <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE>epoc32\release\winscw\udeb</VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>ROOT</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>EPOCROOT</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>Compiler</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+		        <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>WINSCW UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+		        <SETTING><NAME>SystemSearchPaths</NAME>
+		            <SETTING>
+		                <SETTING><NAME>SearchPath</NAME>
+		                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+		                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		                    <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+		                </SETTING>
+		                <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>WINSCW UREL</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+        <SETTING><NAME>FileMappings</NAME>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>E32Main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installation" panel -->
+		        <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE>epoc32\release\winscw\udeb</VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>ROOT</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>EPOCROOT</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>Compiler</NAME><VALUE>ARM</VALUE></SETTING>
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+		        <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+
+        <TARGET>
+            <NAME>ARM4T UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+		        <SETTING><NAME>SystemSearchPaths</NAME>
+		            <SETTING>
+		                <SETTING><NAME>SearchPath</NAME>
+		                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+		                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		                    <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+		                </SETTING>
+		                <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARM4 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+        <SETTING><NAME>FileMappings</NAME>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installation" panel -->
+		        <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE>epoc32\release\winscw\udeb</VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>ROOT</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>EPOCROOT</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>Compiler</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+		        <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>ARM4T UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+		        <SETTING><NAME>SystemSearchPaths</NAME>
+		            <SETTING>
+		                <SETTING><NAME>SearchPath</NAME>
+		                    <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+		                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		                    <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+		                </SETTING>
+		                <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARM4 UREL</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+        <SETTING><NAME>FileMappings</NAME>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+		            </SETTING>
+		        </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installation" panel -->
+		        <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE>epoc32\release\winscw\udeb</VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>ROOT</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>EPOCROOT</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>Compiler</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+		        <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>Build All</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>Build All</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>MMPr</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+		            <SETTING>
+		                <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+		                <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+		                <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+		                <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+		                <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+		                <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+		            </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLs</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installation" panel -->
+		        <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+		            <SETTING><NAME>Path</NAME><VALUE>epoc32\release\winscw\udeb</VALUE></SETTING>
+		            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+		            <SETTING><NAME>PathRoot</NAME><VALUE>ROOT</VALUE></SETTING>
+		        </SETTING>
+		        <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>EPOCROOT</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>Compiler</NAME><VALUE>ARM</VALUE></SETTING>
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+		        <SETTING><NAME>canDebug</NAME><VALUE>false</VALUE></SETTING>
+		        <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+            <SUBTARGETLIST>
+                <SUBTARGET>
+                    <TARGETNAME>WINSCW UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>WINSCW UREL</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARM4 UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARM4 UREL</TARGETNAME>
+                </SUBTARGET>
+            </SUBTARGETLIST>
+        </TARGET>
+    </TARGETLIST>
+
+    <TARGETORDER>
+        <ORDEREDTARGET><NAME>WINSCW UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>WINSCW UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARM4 UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARM4 UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>Build All</NAME></ORDEREDTARGET>
+    </TARGETORDER>
+
+    <GROUPLIST>
+        <GROUP><NAME>Source</NAME>
+        </GROUP>
+        <GROUP><NAME>Link</NAME>
+        </GROUP>
+        <GROUP><NAME>Libraries</NAME>
+            <GROUP><NAME>WINSCW</NAME>
+            </GROUP>
+            <GROUP><NAME>ARM4</NAME>
+            </GROUP>
+        </GROUP>
+    </GROUPLIST>
+
+</PROJECT>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/cw_project_template_v4.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8394 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
+<!--
+ 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 "Eclipse Public License v1.0"
+ which accompanies this distribution, and is available
+ at the URL "http://www.eclipse.org/legal/epl-v10.html".
+
+ Initial Contributors:
+ Nokia Corporation - initial contribution.
+
+ Contributors:
+
+ Description:
+
+ -->
+<?codewarrior exportversion="1.0.1" ideversion="5.0" ?>
+
+<!DOCTYPE PROJECT [
+<!ELEMENT PROJECT (TARGETLIST, TARGETORDER, GROUPLIST, DESIGNLIST?)>
+<!ELEMENT TARGETLIST (TARGET+)>
+<!ELEMENT TARGET (NAME, SETTINGLIST, FILELIST?, LINKORDER?, SEGMENTLIST?, OVERLAYGROUPLIST?, SUBTARGETLIST?, SUBPROJECTLIST?, FRAMEWORKLIST?, PACKAGEACTIONSLIST?)>
+<!ELEMENT NAME (#PCDATA)>
+<!ELEMENT USERSOURCETREETYPE (#PCDATA)>
+<!ELEMENT PATH (#PCDATA)>
+<!ELEMENT FILELIST (FILE*)>
+<!ELEMENT FILE (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?, ROOTFILEREF?, FILEKIND?, FILEFLAGS?)>
+<!ELEMENT PATHTYPE (#PCDATA)>
+<!ELEMENT PATHROOT (#PCDATA)>
+<!ELEMENT ACCESSPATH (#PCDATA)>
+<!ELEMENT PATHFORMAT (#PCDATA)>
+<!ELEMENT ROOTFILEREF (PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT FILEKIND (#PCDATA)>
+<!ELEMENT FILEFLAGS (#PCDATA)>
+<!ELEMENT FILEREF (TARGETNAME?, PATHTYPE, PATHROOT?, ACCESSPATH?, PATH, PATHFORMAT?)>
+<!ELEMENT TARGETNAME (#PCDATA)>
+<!ELEMENT SETTINGLIST ((SETTING|PANELDATA)+)>
+<!ELEMENT SETTING (NAME?, (VALUE|(SETTING+)))>
+<!ELEMENT PANELDATA (NAME, VALUE)>
+<!ELEMENT VALUE (#PCDATA)>
+<!ELEMENT LINKORDER (FILEREF*)>
+<!ELEMENT SEGMENTLIST (SEGMENT+)>
+<!ELEMENT SEGMENT (NAME, ATTRIBUTES?, FILEREF*)>
+<!ELEMENT ATTRIBUTES (#PCDATA)>
+<!ELEMENT OVERLAYGROUPLIST (OVERLAYGROUP+)>
+<!ELEMENT OVERLAYGROUP (NAME, BASEADDRESS, OVERLAY*)>
+<!ELEMENT BASEADDRESS (#PCDATA)>
+<!ELEMENT OVERLAY (NAME, FILEREF*)>
+<!ELEMENT SUBTARGETLIST (SUBTARGET+)>
+<!ELEMENT SUBTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT SUBPROJECTLIST (SUBPROJECT+)>
+<!ELEMENT SUBPROJECT (FILEREF, SUBPROJECTTARGETLIST)>
+<!ELEMENT SUBPROJECTTARGETLIST (SUBPROJECTTARGET*)>
+<!ELEMENT SUBPROJECTTARGET (TARGETNAME, ATTRIBUTES?, FILEREF?)>
+<!ELEMENT FRAMEWORKLIST (FRAMEWORK+)>
+<!ELEMENT FRAMEWORK (FILEREF, DYNAMICLIBRARY?, VERSION?)>
+<!ELEMENT PACKAGEACTIONSLIST (PACKAGEACTION+)>
+<!ELEMENT PACKAGEACTION (#PCDATA)>
+<!ELEMENT LIBRARYFILE (FILEREF)>
+<!ELEMENT VERSION (#PCDATA)>
+<!ELEMENT TARGETORDER (ORDEREDTARGET|ORDEREDDESIGN)*>
+<!ELEMENT ORDEREDTARGET (NAME)>
+<!ELEMENT ORDEREDDESIGN (NAME, ORDEREDTARGET+)>
+<!ELEMENT GROUPLIST (GROUP|FILEREF)*>
+<!ELEMENT GROUP (NAME, (GROUP|FILEREF)*)>
+<!ELEMENT DESIGNLIST (DESIGN+)>
+<!ELEMENT DESIGN (NAME, DESIGNDATA)>
+<!ELEMENT DESIGNDATA (#PCDATA)>
+]>
+
+<PROJECT>
+    <TARGETLIST>
+        <TARGET>
+            <NAME>WINSCW UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>WINSCW UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pch++</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>E32Main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "x86 Exceptions" panel -->
+                <SETTING><NAME>MWDebugger_X86_Exceptions</NAME>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>Metrowerks x86 Compiler</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>WINSCW UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>WINSCW UREL</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pch++</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>E32Main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>1</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "x86 Exceptions" panel -->
+                <SETTING><NAME>MWDebugger_X86_Exceptions</NAME>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                    <SETTING><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>Metrowerks x86 Compiler</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>ARMV5_ABIV1 UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5_ABIV1 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>ARMV5_ABIV1 UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5_ABIV1 UREL</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+          <TARGET>
+            <NAME>GCCE UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>GCCE UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+            <TARGET>
+            <NAME>GCCE UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>GCCE UREL</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+              <TARGET>
+            <NAME>ARMV5 UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+           <TARGET>
+            <NAME>ARMV5 UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+		<TARGET>
+		    <NAME>ARMV5_ABIV2 UDEB</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5_ABIV2 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>ARMV5_ABIV2 UREL</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>Symbian Linker v2</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE>Symbian Installer v2</VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>ARMV5_ABIV2 UDEB</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>._ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.c</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cfg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cia</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cwlink</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.cxx</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.def</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.h</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.hrh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.i</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.iby</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ii</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inf</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ini</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.inl</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.loc</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ciacpp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmp</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.mmpi</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.pkg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.policy</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.ra</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.resources</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Resource v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>XML</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rh</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rls</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rss</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.rsg</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.s</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Compiler v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.script</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>TEXT</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.txt</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE>C/C++</VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>true</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.a</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.lib</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.dso</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                    <SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE>.o</VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE>Symbian Object Importer v2</VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>2</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE>Symbian MetroTrk</VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>32767</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE>ARM RVCT</VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE>-x c++ -D__CIA__</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+        </TARGET>
+        <TARGET>
+            <NAME>Build All</NAME>
+            <SETTINGLIST>
+
+                <!-- Settings for "Source Trees" panel -->
+                <SETTING><NAME>UserSourceTrees</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Access Paths" panel -->
+                <SETTING><NAME>AlwaysSearchUserPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>InterpretDOSAndUnixPaths</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RequireFrameworkStyleIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SourceRelativeIncludes</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UserSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+                <SETTING><NAME>SystemSearchPaths</NAME>
+                    <SETTING>
+                        <SETTING><NAME>SearchPath</NAME>
+                            <SETTING><NAME>Path</NAME><VALUE>:</VALUE></SETTING>
+                            <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                            <SETTING><NAME>PathRoot</NAME><VALUE>CodeWarrior</VALUE></SETTING>
+                        </SETTING>
+                        <SETTING><NAME>Recursive</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>FrameworkPath</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>HostFlags</NAME><VALUE>All</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Debugger Runtime" panel -->
+                <SETTING><NAME>MWRuntimeSettings_WorkingDirectory</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_CommandLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>MWRuntimeSettings_HostApplication</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>MWRuntimeSettings_EnvVars</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Target Settings" panel -->
+                <SETTING><NAME>Linker</NAME><VALUE>None</VALUE></SETTING>
+                <SETTING><NAME>PreLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>PostLinker</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Targetname</NAME><VALUE>Build All</VALUE></SETTING>
+                <SETTING><NAME>OutputDirectory</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Project</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SaveEntriesUsingRelativePaths</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "File Mappings" panel -->
+                <SETTING><NAME>FileMappings</NAME>
+                    <SETTING>
+                        <SETTING><NAME>FileType</NAME><VALUE>MMPr</VALUE></SETTING>
+                        <SETTING><NAME>FileExtension</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Compiler</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>EditLanguage</NAME><VALUE></VALUE></SETTING>
+                        <SETTING><NAME>Precompile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>Launchable</NAME><VALUE>true</VALUE></SETTING>
+                        <SETTING><NAME>ResourceFile</NAME><VALUE>false</VALUE></SETTING>
+                        <SETTING><NAME>IgnoredByMake</NAME><VALUE>false</VALUE></SETTING>
+                    </SETTING>
+                </SETTING>
+
+                <!-- Settings for "Build Extras" panel -->
+                <SETTING><NAME>CacheModDates</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>DumpBrowserInfo</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CacheSubprojects</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>UseThirdPartyDebugger</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>BrowserGenerator</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>DebuggerAppPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DebuggerCmdLineArgs</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DebuggerWorkingDir</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CodeCompletionPrefixFileName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeCompletionMacroFileName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Debugger Target" panel -->
+                <SETTING><NAME>ConsoleEncoding</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>LogSystemMessages</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>AutoTargetDLLsPopUp</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>StopAtWatchpoints</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>PauseWhileRunning</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>PauseInterval</NAME><VALUE>5</VALUE></SETTING>
+                <SETTING><NAME>PauseUIFlags</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>AltExePath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>StopAtTempBPOnLaunch</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>CacheSymbolics</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>TempBPFunctionName</NAME><VALUE>main</VALUE></SETTING>
+                <SETTING><NAME>TempBPType</NAME><VALUE>0</VALUE></SETTING>
+
+                <!-- Settings for "Remote Debug" panel -->
+                <SETTING><NAME>Enabled</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>ConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>DownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LaunchRemoteApp</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>RemoteAppPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CoreID</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>JTAGClockSpeed</NAME><VALUE>8000</VALUE></SETTING>
+                <SETTING><NAME>IsMultiCore</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>UseGlobalOSDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OSDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>OSDownloadPath</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>AltDownload</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>AltDownloadConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Auto-target" panel -->
+                <SETTING><NAME>OtherExecutables</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Analyzer Connections" panel -->
+                <SETTING><NAME>AnalyzerConnectionName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Custom Keywords" panel -->
+                <SETTING><NAME>CustomColor1</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor2</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor3</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>CustomColor4</NAME>
+                    <SETTING><NAME>Red</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Green</NAME><VALUE>0</VALUE></SETTING>
+                    <SETTING><NAME>Blue</NAME><VALUE>0</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>BraekPoinType_II</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>IDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>IDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDexecutable</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDinitialized</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>SDuninitialized</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>SDconstant</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>VerifyMemWrites</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ShowMPC107regs</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>BreakpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>WatchpointType</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>ByteOrderType</NAME><VALUE>0</VALUE></SETTING>
+                <PANELDATA><NAME>CodeTest SYMBIAN Instrumenter</NAME><VALUE>
+                    0200020000000100000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000433A5C0000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000637466696C657300000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000636F6465746573742E6964620000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    0000000000000000000000000000000000000000000000000000000000000000
+                    000000000000000000000000
+                </VALUE></PANELDATA>
+
+                <!-- Settings for "Symbian Installation" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Installer Panel v2" panel -->
+                <SETTING><NAME>SymbianInstallationOutputFilename</NAME><VALUE>Application.sis</VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationContentSearchLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianInstallationPassword</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianInstallationCreateStubFile</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Resource Panel" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Resources Panel v2" panel -->
+                <SETTING><NAME>SymbianResourcesMMPFileLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesBinaryOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>SymbianResourcesHeaderFileOutputLocation</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Remote Download" panel -->
+                <SETTING><NAME>FileList</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian ARM Debugger" panel -->
+                <SETTING><NAME>Processor</NAME><VALUE>Generic</VALUE></SETTING>
+                <SETTING><NAME>UseInitFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>UseConfigFile</NAME><VALUE>0</VALUE></SETTING>
+                <SETTING><NAME>ResetTarget</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>InitializationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>ConfigurationFile</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Generic</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>TargetOS</NAME><VALUE>1</VALUE></SETTING>
+                <SETTING><NAME>RTOSPluginName</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Common Panel" panel -->
+                <SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SymbianEpocToolsPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Compiler Panel" panel -->
+                <SETTING><NAME>PrefixFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerXMLDescriptor</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>Macros</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CodeTEST</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>EnableSWIC</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Arguments</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CIAArgs</NAME><VALUE></VALUE></SETTING>
+
+                <!-- Settings for "Symbian Debugging" panel -->
+                <SETTING><NAME>Parse Log File</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log File Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Symbian SDK Folder</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Log Unresolved Modules</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Log Unresolved Sym Files</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Non-XIP Executables</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Kernel Debugging" panel -->
+                <SETTING><NAME>Start Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Run From Start Address</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Download Image</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>OS Image Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Download Address</NAME><VALUE>0x00000000</VALUE></SETTING>
+                <SETTING><NAME>Ask First</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Debug Bootrom</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>Bootrom Sym File</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE></VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Linker Panel" panel -->
+                <SETTING><NAME>LinkOutputFile</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>LinkCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibrary</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>canDebug</NAME><VALUE>true</VALUE></SETTING>
+                <SETTING><NAME>canRun</NAME><VALUE>false</VALUE></SETTING>
+
+                <!-- Settings for "Symbian RomBuild Panel" panel -->
+                <SETTING><NAME>CommandLine</NAME><VALUE>buildrom -D_DEBUG devkit lubbock techview -olubbock_gui.img</VALUE></SETTING>
+                <SETTING><NAME>OutputPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>DisplayMessages</NAME><VALUE>true</VALUE></SETTING>
+
+                <!-- Settings for "Symbian Target" panel -->
+                <SETTING><NAME>TargetArchitecture</NAME><VALUE>WINSCW</VALUE></SETTING>
+                <SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>SuppressWarnings</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>GenerateSymbolics</NAME><VALUE>false</VALUE></SETTING>
+                <SETTING><NAME>CompilerPrefix</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>CompilerCmdLine</NAME><VALUE></VALUE></SETTING>
+                <SETTING><NAME>SymbianImportLibraryPath</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+
+                <!-- Settings for "Symbian Tools" panel -->
+                <SETTING><NAME>Gnu Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+                <SETTING><NAME>Epoc32 Tools Path</NAME>
+                    <SETTING><NAME>Path</NAME><VALUE>C:\</VALUE></SETTING>
+                    <SETTING><NAME>PathFormat</NAME><VALUE>Windows</VALUE></SETTING>
+                    <SETTING><NAME>PathRoot</NAME><VALUE>Absolute</VALUE></SETTING>
+                </SETTING>
+            </SETTINGLIST>
+            <FILELIST>
+            </FILELIST>
+            <LINKORDER>
+            </LINKORDER>
+            <SUBTARGETLIST>
+                <SUBTARGET>
+                    <TARGETNAME>WINSCW UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>WINSCW UREL</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARM4 UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARM4 UREL</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARMV5_ABIV1 UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARMV5_ABIV1 UREL</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>GCCE UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>GCCE UREL</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARMV5 UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARMV5 UREL</TARGETNAME>
+                </SUBTARGET>
+				<SUBTARGET>
+                    <TARGETNAME>ARMV5_ABIV2 UDEB</TARGETNAME>
+                </SUBTARGET>
+                <SUBTARGET>
+                    <TARGETNAME>ARMV5_ABIV2 UREL</TARGETNAME>
+                </SUBTARGET>
+            </SUBTARGETLIST>
+        </TARGET>
+    </TARGETLIST>
+
+    <TARGETORDER>
+        <ORDEREDTARGET><NAME>WINSCW UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>WINSCW UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARM4 UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARM4 UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARMV5 UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARMV5 UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>GCCE UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>GCCE UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARMV5_ABIV1 UDEB</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>ARMV5_ABIV1 UREL</NAME></ORDEREDTARGET>
+        <ORDEREDTARGET><NAME>Build All</NAME></ORDEREDTARGET>
+    </TARGETORDER>
+
+    <GROUPLIST>
+    </GROUPLIST>
+
+</PROJECT>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/default_plats.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+WINSCW
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/default_plats_v2.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+WINSCW
+ARMV5
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/e32plat.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,880 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Module providing platform details for platforms supported
+# by Symbian OS
+# all data is uppercase
+# 
+#
+
+package E32Plat;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	Plat_SetVerbose
+	Plat_Init
+	Plat_GetL
+	Plat_List
+	Plat_AssocIDE
+	Plat_Customizations
+	Plat_Customizes
+	Plat_Root
+	Plat_SupportsFeatureVariants
+);
+
+use Winutl;
+use RVCT_plat2set;
+use BPABIutl;
+use E32Variant;
+
+my $variantABIV2Keyword = &Variant_GetMacro();
+
+my %Mode=(
+	Verbose=>0
+);
+my $ModulePath;
+
+sub Plat_SetVerbose () {
+	$Mode{Verbose}=1;
+}
+
+my %BldLists=(
+	EPOC32=>['UREL','UDEB'],
+	WINS=>['UDEB','UREL'],
+	TOOLS=>['DEB','REL'],
+	TOOLS2=>['DEB','REL'],
+);
+
+my %BldMacros=(
+	DEB=>['_DEBUG'],
+	REL=>['NDEBUG'],
+	UDEB=>['_DEBUG','_UNICODE'],
+	UREL=>['NDEBUG','_UNICODE']
+);
+
+
+my @EpocMacros=('__SYMBIAN32__');
+
+my @BPABIPlats = &BPABIutl_Plat_List;
+
+my %Plat=(
+	ARM4=>{
+		ABI=>'ARM4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+	},
+	ARM4SMP=>{
+		ABI=>'ARM4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		SMP=>1,
+		StatLink=>'ARM4SMP',
+	},
+	ARM4T=>{
+		ABI=>'ARM4T',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+	},
+	ARMI=>{
+		ASSP=>'MARM',
+		Generic=>1,
+		ASSPABI=>'',
+	},
+	SARM4=>{
+		ABI=>'ARM4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		Single=>1,
+	},
+	SARMI=>{
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		Single=>1,
+	},
+	STHUMB=>{
+		ABI=>'THUMB',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		Single=>1,
+	},
+	THUMB=>{
+		ABI=>'THUMB',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+	},
+	TOOLS=>{
+		ABI=>'TOOLS',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'TOOLS',
+		OS=>'TOOLS',
+		MakeMod=>'Cl_win',
+		MakeCmd=>'nmake',
+	},
+	TOOLS2=>{
+		ABI=>'TOOLS2',
+		ASSPABI=>'',
+		Compiler=>'GCC32',
+		CPU=>'TOOLS2',
+		OS=>'TOOLS2',
+		MakeMod=>'Cl_mingw',
+		MakeCmd=>'make',
+	},
+	CWTOOLS=>{
+		ABI=>'TOOLS',
+		ASSPABI=>'',
+		Compiler=>'CW32',
+		CPU=>'TOOLS',
+		OS=>'TOOLS',
+		MakeMod=>'Cl_tools',
+		MakeCmd=>'make',
+	},
+	VC6TOOLS=>{
+		ABI=>'TOOLS',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'TOOLS',
+		Ext=>'.DSP',
+		MakeMod=>'Ide_vc6',
+		MakeCmd=>'nmake',
+		OS=>'TOOLS',
+		Real=>'TOOLS',
+		UsrHdrsOnly=>1,
+	},
+	WINS=>{
+		ABI=>'WINS',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'WINS',
+		MakeMod=>'Cl_win',
+		MakeCmd=>'nmake',
+		OS=>'WINS',
+	},
+	VC6=>{
+		ABI=>'WINS',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'WINS',
+		Ext=>'.DSP',
+		MakeMod=>'Ide_vc6',
+		MakeCmd=>'nmake',
+		OS=>'WINS',
+		Real=>'WINS',
+		UsrHdrsOnly=>1,
+	},
+	WINSCW=>{
+		ABI=>'WINSCW',
+		ASSPABI=>'',
+		Compiler=>'CW32',
+		CPU=>'WINS',
+		MakeMod=>'Cl_codewarrior',
+		OS=>'WINS',
+		DefFile=>'WINS',	# use the MSVC def files
+	},
+	CW_IDE=>{
+		ABI=>'WINSCW',
+		ASSPABI=>'',
+		Compiler=>'CW32',
+		CPU=>'WINS',
+		Ext=>'.xml',
+		MakeMod=>'Ide_cw',
+		MakeCmd=>'make',
+		OS=>'WINS',
+		Real=>'WINSCW',
+		DefFile=>'WINS',	# use the MSVC def files
+		UsrHdrsOnly=>1,
+		SupportsMultiplePlatforms=>1,	# supports more than one real platform
+	},
+	X86=>{
+		ABI=>'X86',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'X86',
+		MakeMod=>'Cl_x86',
+		MakeCmd=>'nmake',
+		OS=>'EPOC32',
+		DefFile=>'X86',
+		Generic=>1,
+	},
+	X86SMP=>{
+		ABI=>'X86',
+		ASSPABI=>'',
+		Compiler=>'VC32',
+		CPU=>'X86',
+		MakeMod=>'Cl_x86',
+		MakeCmd=>'nmake',
+		OS=>'EPOC32',
+		DefFile=>'X86',
+		Generic=>1,
+		SMP=>1,
+		StatLink=>'X86SMP',
+	},
+	X86GCC=>{
+		ABI=>'X86gcc',
+		ASSPABI=>'',
+		Compiler=>'X86GCC',
+		CPU=>'X86',
+		MakeMod=>'Cl_x86gcc',
+		OS=>'EPOC32',
+		DefFile=>'x86gcc',
+		Generic=>1,
+	},	
+	X86GMP=>{
+		ABI=>'X86gcc',
+		ASSPABI=>'',
+		Compiler=>'X86GCC',
+		CPU=>'X86',
+		MakeMod=>'Cl_x86gcc',
+		OS=>'EPOC32',
+		DefFile=>'x86gcc',
+		Generic=>1,
+		SMP=>1,
+		StatLink=>'X86GMP',
+	},	
+	ARMV4=>{
+		ABI=>'ARMV4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'Cl_arm',
+		Compiler=>'ARMCC',
+		DefFile=>'EABI',
+		EABI=>1,
+	},
+	ARMV4SMP=>{
+		ABI=>'ARMV4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'Cl_arm',
+		Compiler=>'ARMCC',
+		DefFile=>'EABI',
+		EABI=>1,
+		SMP=>1,
+		StatLink=>'ARMV4SMP',
+	},
+	ARMV5_ABIV1=>{
+		ABI=>'ARMV5',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'Cl_arm',
+		Compiler=>'ARMCC',
+		DefFile=>'EABI',
+		EABI=>1,
+		SupportsFeatureVariants=>1,
+	},
+	ABIV2=>{
+		ABI=>'ARMV5',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'Cl_bpabi',
+		DefFile=>'EABI',
+		EABI=>1,
+		SupportsFeatureVariants=>1,
+	},
+	GCCXML=>{
+		ABI=>'ARM4',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'cl_gccxml',
+	},
+	VS6=>{
+		ABI=>'WINSCW',
+		ASSPABI=>'',
+		Compiler=>'CW32',
+		CPU=>'WINS',
+		MakeMod=>'Cl_vscw',
+		OS=>'WINS',
+		Real=>'WINSCW',
+		DefFile=>'WINS',	# use the MSVC def files
+		Ext=>'.mak'		
+	},
+	VS2003=>{
+		ABI=>'WINSCW',
+		ASSPABI=>'',
+		Compiler=>'CW32',
+		CPU=>'WINS',
+		MakeMod=>'Cl_vscw',
+		OS=>'WINS',
+		Real=>'WINSCW',
+		DefFile=>'WINS',	# use the MSVC def files
+		Ext=>'.mak'
+	},
+	EDG=>{
+		ABI=>'ARMV5',
+		ASSP=>'MARM',
+		ASSPABI=>'',
+		Generic=>1,
+		MakeMod=>'cl_edg',
+	},
+
+	# ASSP platforms should be described using .ASSP files
+	# Do not add additional ASSP platforms to this file.
+);
+
+sub Set_Plat() 
+{
+	@BPABIPlats = &BPABIutl_Plat_List;
+	foreach my $Candidate (@BPABIPlats)
+	{
+# All BPABI platforms inherit from ABIV2 properties as listed in the platlist
+# and Platlist is updated to include the BPABI platforms.
+		my ( $key, $value);
+		while (($key, $value) = each %{$Plat{ABIV2}}) {
+			$Plat{$Candidate}{$key}=$value;
+		}
+	}
+}
+
+sub Plat_SupportsFeatureVariants($)
+	{
+	my ($plat) = @_;
+
+	# In a non-ABIV2 world, ARMV5 means ARMV5_ABIV1 within e32plat content
+	if (!$variantABIV2Keyword && $plat =~ /^ARMV5$/i)
+		{
+		$plat .= "_ABIV1";
+		}
+		
+	return ($plat && defined $Plat{$plat}{SupportsFeatureVariants}) ? $Plat{$plat}{SupportsFeatureVariants} : 0;
+	}
+
+sub Plat_Customizations($) {
+        my ($plat) = @_;
+	my @empty = ();
+	return @{$Plat{$plat}{'CUSTOMIZATIONS'}} if $Plat{$plat}{'CUSTOMIZATIONS'};
+	return @empty;
+      }
+
+sub Plat_Customizes($) {
+	my ($plat) = @_;
+	return $Plat{$plat}{'CUSTOMIZES'} ? $Plat{$plat}{'CUSTOMIZES'} : "";
+}
+
+sub Plat_Root($) {
+	my ($plat) = @_;
+
+	my $RootName = $Plat{$plat}{'ROOTPLATNAME'};
+
+	if ($RootName) {
+		return $RootName;
+	}
+	else {
+		# A non-BSF platform is its own root.
+		return $plat;
+	}
+}
+
+sub Init_BSFs($) {
+	my ($Path)=@_;  
+#	get a list of modules
+	opendir DIR, $Path;
+	my @BSFs=grep s/^([^\.].*)\.BSF$/$1/, map { uc $_ } sort readdir DIR;
+	closedir DIR;
+
+	my $BSF;
+	foreach $BSF (@BSFs) {
+		my $File=$Path.$BSF.'.bsf';
+#		check whether the assp is already defined
+		if (defined %{$Plat{$BSF}}) {
+			warn(
+				"$File : warning: Platform \"$BSF\" already defined\n",
+				" ... skipping this spec\n"
+			);
+			delete $Plat{$BSF};
+			next;
+		}
+#		open the module
+		unless (open FILE, $File) {
+			delete $Plat{$BSF};
+			warn "warning: Can't open BSF specification \"$File\"\n";
+			next;
+		}
+		my $line1 = <FILE>;
+		$line1 = uc($line1);
+		unless ($line1 =~ /^\#\<BSF\>\#/) {
+			warn "warning: \"$File\" Invalid BSF specification - missing #<bsf>#\n";
+			delete $Plat{$BSF};
+			close FILE;
+                  next;
+            }
+            my $custom;
+            while ($custom = <FILE>) {
+					#skip blank lines and comments
+			delete $Plat{$BSF};
+					last unless ($custom =~ /^$|^\#/);
+            }
+            $custom = uc $custom;
+            unless ($custom =~ /^\s*CUSTOMIZES\s+(\S+)/) {
+				warn "warning: \"$File\" Invalid BSF specification - 'customizes' missing\n";
+				delete $Plat{$BSF};
+				close FILE;
+			next;
+            }
+		my $root = $1;
+		my $platname = '';
+		my $CustomizedPlatName = '';		
+
+		# In v1 mode, ARMV5 platform implies ARMV5_ABIV1 platform listed in the platlist		
+		my $Armv5Flag = 0;
+		if (!$variantABIV2Keyword && $root =~ /^ARMV5$/i) {
+			$Armv5Flag = 1;
+		}
+
+		# Support for Hierarchy of Customizations (BSF file customization of another BSF file)
+		# 1. Check whether the BSF file customizes another BSF file.
+		# 2. If so, check whether the root BSF file has already been read.
+		# 3. If not read, then defer the current BSF file reading until the root file is read.
+		my $rootPlatFound = 0;
+		if (defined %{$Plat{$root}} || $Armv5Flag) 
+		{
+			# BSF platform customizes another valid BSF platform
+			if (defined $Plat{$root}{'CUSTOMIZES'}) 
+			{
+				$rootPlatFound = 1;
+				$platname = $root;
+				$CustomizedPlatName = $root;
+
+				# Set the root platform name which is same as of customizes platform
+				$Plat{$BSF}{'ROOTPLATNAME'} = $Plat{$root}{'ROOTPLATNAME'};
+			}
+			# BSF platform customizes to one of the existing ABI platforms
+			else
+			{
+				# All BPABI platforms inherits from ABIV2 platform listed in the platlist
+				if (grep /^$root$/i, @BPABIPlats) {
+					$platname = "ABIV2";
+				}
+				elsif ($Armv5Flag) {
+				# In v1 mode, ARMV5 platform implies ARMV5_ABIV1 platform listed in the platlist
+					$platname = "ARMV5_ABIV1";	
+				}
+				else {
+					$platname = $root;
+				}
+				
+				$CustomizedPlatName=$root;
+
+				# BSF File check Begins 
+				# The following check is included to handle the existing BSF files which has to behave in different manner
+				# in default v1 mode and v2 mode. The following code changes the BSF name and the custmoized platform name
+				# to the implied names. This is done to support switching between v1 and v2 modes by enabling the keyword in
+				# the variant configuration file.
+				# In v1 mode, the ARMV6_ABIV1 => ARMV6 platform and ARMV6 => ARMV6_ABIV2 platform.
+				if (!$variantABIV2Keyword) {
+					if ($BSF =~ /^ARMV6_ABIV1$/i) {
+						$BSF = "ARMV6";	
+						$CustomizedPlatName = "ARMV5";	
+					}
+					elsif ($BSF =~ /^ARMV6$/i) {
+						$BSF = "ARMV6_ABIV2";	
+						$CustomizedPlatName = "ARMV5_ABIV2";
+						$platname = "ABIV2";
+					}
+				}
+				# BSF File check Ends
+
+				# Set the root platform name
+				$Plat{$BSF}{'ROOTPLATNAME'} = $CustomizedPlatName;
+			}			
+		}
+		else
+		{
+			my $rootbsf = $Path.$root.".bsf";			
+			if ( -e $rootbsf ) {
+				# BSF file customizes another BSF file which has not been read yet.
+				# So defer current BSF file reading until the root BSF file is read.				
+				delete $Plat{$BSF};
+				push(@BSFs, $BSF);
+				next;		
+			}
+		}
+		# If the customizes platform is not a valid BSF platform or BPABI platorm or ARMV5 or ARMV5_ABIV1,
+		# then throw warning.
+		unless ($rootPlatFound || $root =~ /^ARMV5(_ABIV1)?$/ || (grep /^$root$/i, @BPABIPlats)) {
+			warn "warning: \"$File\" Invalid BSF specification - customization restricted to ARMV5, ABIv2 and valid BSF platforms\n";
+			close FILE;
+			delete $Plat{$BSF};
+			next;
+		}
+			
+		my ( $key, $value);
+		while (($key, $value) = each %{$Plat{$platname}}) {
+			$Plat{$BSF}{$key}=$value;
+		}
+		
+		push @{$Plat{$CustomizedPlatName}{'CUSTOMIZATIONS'}}, $BSF;
+		$Plat{$BSF}{'CUSTOMIZES'} = $CustomizedPlatName;
+		while (<FILE>) {
+			next if (/^$|^\#/);
+			if (/^\s*SMP\s*$/i) {
+				$Plat{$BSF}{'SMP'} = 1;
+				$Plat{$BSF}{'StatLink'} = lc $BSF;
+				next;
+			}
+			$Plat{$BSF}{'CUSTOMIZATION_DATA'} .= $_;
+		}
+		# BSF file statements will have newline character("\n") at the end, except for the last statement.
+		# So append "\n" for the last BSF file statement.
+		# "\n" will be used to split BSF statements to support hierarchy of customizations.
+		$Plat{$BSF}{'CUSTOMIZATION_DATA'} .= "\n";
+		close FILE;
+	}
+	1;
+}
+
+sub Plat_Init ($) { # takes path to ASSP modules
+	my ($Path)=@_;
+
+	my %PlatHashKeys=(
+		ABI=>1,
+		ASSPABI=>1,
+		SINGLE=>1,
+		Compiler=>1,
+		CPU=>1,
+		MakeMod=>1,
+		MakeCmd=>1,
+		OS=>1,
+		DefFile=>1,
+		ASSP=>1,
+	);
+
+#	Include the list of BPABI platforms
+	&Set_Plat;
+
+	Init_BSFs($Path);
+
+#	get a list of modules
+	opendir DIR, $Path;
+	my @_ASSPs=grep s/^([^\.].*)\.ASSP$/$1/, map { uc $_ } readdir DIR;
+	closedir DIR;
+
+	my @ASSPs;
+	foreach (@_ASSPs) {
+		if (!$ENV{USEARMCC} and /EDG$/i) {
+#			warn(
+#				"Note: ASSP \"$_\" disabled\n"
+#			);
+
+			next;
+		}
+		push @ASSPs, $_;
+	}
+
+#	open each module in turn, and add it to the array
+	my $ASSP;
+	foreach $ASSP (@ASSPs) {
+		my $File=$Path.$ASSP.'.assp';
+#		check whether the assp is already defined
+		if (defined %{$Plat{$ASSP}}) {
+			warn(
+				"$File : warning: ASSP \"$ASSP\" already defined\n",
+				" ... skipping this module\n"
+			);
+
+			next;
+		}
+#		open the module
+		unless (open FILE, $File) {
+			warn "warning: Can't open assp module \"$File\"\n";
+			next;
+		}
+		my %Data=();
+		my %SingleData=();
+		my $MatchingSingle="";
+		my @Errors=();
+		while (<FILE>) {
+#			strip comments
+			s/^([^#]*)#.*$/$1/o;
+#			skip blank lines
+			if (/^\s*$/o) {
+				next;
+			}
+#			get the key-value pair
+			unless (/^\s*(\w+)\s+(\w+)\s*$/o) {
+				push @Errors, "$File($.) : warning: syntax error - only key-value pairs allowed\n";
+				next;
+			}
+			my ($Key, $Val)=($1, $2);
+			if ($PlatHashKeys{$Key}!=1) {
+				push @Errors, "$File($.) : warning: unrecognized keyword - $Key\n";
+				next;
+			}
+			if ($Key eq "SINGLE") {
+				$SingleData{Single} = 1;
+				$SingleData{ASSP} = $ASSP;
+				$MatchingSingle = uc $2;
+			} else {
+				$Data{$Key}=$Val;
+				$SingleData{$Key}=$Val;
+			}
+		}
+		close FILE;
+		if (@Errors) {
+			warn(
+				@Errors,
+				" ... skipping this module\n"
+			);
+			next;
+		}
+# change -  Allow ASSPs to pick up all the options of the ABI they specify, 
+# in particular the compiler they need.
+			$Data{'ASSP'} = $ASSP unless $Data{'ASSP'};
+			if ($Plat{$Data{'ABI'}}) {
+			foreach (keys %{$Plat{$Data{'ABI'}}}) {
+			$Data{$_} = $Plat{$Data{'ABI'}}{$_} unless ($_ =~ /^GENERIC$/i) or $Data{$_};
+			}
+		}
+
+		%{$Plat{$ASSP}}=%Data;
+		if ($MatchingSingle ne "") {
+			foreach (keys %Data) {
+			$SingleData{$_} = $Data{$_} unless ($_ =~ /^GENERIC$/i) or $SingleData{$_};
+			}
+			%{$Plat{$MatchingSingle}}=%SingleData;
+		}			
+	}
+}
+
+sub Plat_GetL ($$$$) { # takes Platform name, ref to plat hash, ref to bldmacrohash, bldmake plat command notifier
+	my ($Candidate,$PlatHash_ref,$BldMacrosHash_ref,$platcommand)=@_;
+	$Candidate=uc $Candidate;
+
+# is platform in our list?
+	unless (defined $Plat{$Candidate}) {
+
+		# is platform BPABI compliant one?
+		if (!$variantABIV2Keyword && $Candidate eq 'ARMV5') {
+		}
+		elsif (not(grep /^$Candidate$/i, @BPABIPlats))
+		{
+			die "ERROR: Platform \"$Candidate\" not supported\n";
+		}
+	}
+
+	my $BPABIPlat;
+	my %PlatHash=();
+
+# check the data
+# All BPABI platforms inherit ABIV2 properties 
+	if (grep /^$Candidate$/i, @BPABIPlats) 
+	{
+		$BPABIPlat='ABIV2';
+		%PlatHash=%{$Plat{$BPABIPlat}};
+	}
+# In v1 mode, ARMV5 platform implies ARMV5_ABIV1 platform listed in the platlist
+	elsif (!$variantABIV2Keyword && $Candidate eq 'ARMV5') {
+		%PlatHash=%{$Plat{ARMV5_ABIV1}};
+	}
+	else {
+		%PlatHash=%{$Plat{$Candidate}};
+	}
+
+# set the defaults
+	$PlatHash{Name}=$Candidate;
+	$PlatHash{Real}=$PlatHash{Name} unless $PlatHash{Real};
+	$PlatHash{Ext}=".$PlatHash{Real}" unless $PlatHash{Ext};
+	$PlatHash{ASSP}=$PlatHash{Real} unless $PlatHash{ASSP};
+
+# Get the root platform name to support hierarchy of customizations
+	my $CustomizedPlat=$PlatHash{'ROOTPLATNAME'};
+
+	if ((defined($Candidate)  && ($Candidate =~ /^ARMV5/i)) || (defined($CustomizedPlat) && ($CustomizedPlat =~ /^ARMV5/i))) {
+# Compiler name should be set as ARMCC for all ARMV5 platforms
+		$PlatHash{Compiler}='ARMCC';
+		$PlatHash{Toolchain}='rvct22';
+	}
+	elsif ($BPABIPlat) {
+# Compiler name should be set as that of platform name for all BPABI platforms
+		$PlatHash{Compiler}=$Candidate;
+		$PlatHash{Toolchain}=$Candidate;
+	}
+	elsif ($CustomizedPlat) {
+# Compiler name should be set as that of the customized platform name incase of customization
+		$PlatHash{Compiler}=$CustomizedPlat;
+		$PlatHash{Toolchain}=$CustomizedPlat;
+	}
+
+	$PlatHash{Compiler}='GCC32' unless $PlatHash{Compiler};
+	$PlatHash{OS}='EPOC32' unless $PlatHash{OS};
+	$PlatHash{MakeMod}='Cl_gcc' unless $PlatHash{MakeMod};
+	$PlatHash{MakeCmd}='make' unless $PlatHash{MakeCmd};
+	$PlatHash{CPU}='MARM' unless $PlatHash{CPU};
+	$PlatHash{Single}=0 unless $PlatHash{Single};
+	$PlatHash{UsrHdrsOnly}=0 unless $PlatHash{UsrHdrsOnly};
+	$PlatHash{Generic}=0 unless $PlatHash{Generic}; # generic means "for a target device but no particular ASSP"
+	$PlatHash{SupportsMultiplePlatforms}=0 unless $PlatHash{SupportsMultiplePlatforms};
+
+	$PlatHash{ABI}='ARMI' unless $PlatHash{ABI};
+	$PlatHash{ASSPABI}='ARM4' unless defined $PlatHash{ASSPABI};
+
+	unless (defined $PlatHash{DefFile}) {
+		if ($PlatHash{Compiler} eq 'VC32') {
+			$PlatHash{DefFile}='WINS';
+		} else {
+			$PlatHash{DefFile}='MARM';
+		}
+	}
+	
+# .MMP macros - keeping the order is useful
+	@{$PlatHash{MmpMacros}}=$PlatHash{Compiler};
+	push @{$PlatHash{MmpMacros}}, $PlatHash{OS};
+	push @{$PlatHash{MmpMacros}}, $PlatHash{CPU} unless $PlatHash{CPU} eq $PlatHash{OS};
+	push @{$PlatHash{MmpMacros}}, $PlatHash{ASSP} unless $PlatHash{ASSP}=~/^($PlatHash{CPU}|$PlatHash{OS})$/;
+
+	if ($PlatHash{Single}) {
+		push @{$PlatHash{MmpMacros}}, 'SINGLE';
+	}
+	if ($PlatHash{SMP}) {
+		push @{$PlatHash{MmpMacros}}, 'SMP';
+	}
+	if ($PlatHash{EABI}) {
+		push @{$PlatHash{MmpMacros}}, 'EABI';
+	}
+	if ($PlatHash{Compiler} eq 'VC32') {
+		my $MSVCVer = &Winutl_MSVCVer($platcommand);
+		my $MSVCSubVer = &Winutl_MSVCSubVer($platcommand);
+		push @{$PlatHash{MmpMacros}}, 'MSVC'.$MSVCVer;
+		push @{$PlatHash{MmpMacros}}, 'MSVC'.$MSVCVer.$MSVCSubVer;
+		if ($MSVCVer > 6) {
+			push @{$PlatHash{MmpMacros}}, 'MSVCDOTNET';
+		}
+	}
+	if ($PlatHash{Compiler} eq 'ARMCC') {
+		my ($MajVer, $MinVer) = RVCT_plat2set::get_version_list($Candidate);
+		push @{$PlatHash{MmpMacros}}, 'ARMCC_'.$MajVer;
+		push @{$PlatHash{MmpMacros}}, 'ARMCC_'.$MajVer.'_'.$MinVer;
+	}
+	
+	if ($PlatHash{Compiler} eq 'X86GCC') {	
+			push @{$PlatHash{MmpMacros}}, 'GCC32';
+	}
+
+	## TOOLS2 Specific Macros ##
+	
+	if ($PlatHash{Compiler} eq 'GCC32') {
+		push @{$PlatHash{MmpMacros}}, 'MINGW32';
+		push @{$PlatHash{MmpMacros}}, '_STLP_LITTLE_ENDIAN';
+		
+	}
+
+    # add GCCXML to the mmp macro list, so we can filter out stuff in bld.inf files and mmps.
+    # note that this mean that __GCCXML__ is automacally routed to makefile, so we can take out explicit call. 
+    if( $PlatHash{Name} eq "GCCXML") {
+        push @{$PlatHash{MmpMacros}}, 'GCCXML';
+    }
+	
+# add specific platform macros for platforms customising others.
+	if (Plat_Customizes($PlatHash{Name})) {
+		push @{$PlatHash{MmpMacros}}, $PlatHash{Name} unless grep /$PlatHash{Name}/, @{$PlatHash{MmpMacros}};
+	}
+
+# compilation macros
+	@{$PlatHash{Macros}}=@EpocMacros;
+	foreach (@{$PlatHash{MmpMacros}}) {
+		## If STLP_LTTLE_ENDIAN is used, then dont append __ to the macro name ##
+		if ($_ =~ m/STLP_LITTLE_ENDIAN/) {
+			push @{$PlatHash{Macros}}, $_;
+		} else {
+		push @{$PlatHash{Macros}}, '__'.$_.'__';
+		}
+	}
+
+#	extra special .MMP macros which aren't applied for compilation
+	if ($PlatHash{Generic}) {
+		push @{$PlatHash{MmpMacros}}, "GENERIC_$PlatHash{CPU}";
+		if ($PlatHash{CPU} eq 'MARM') {
+#			we can't define this for ASSP platforms because we won't be sure what
+#			the ABI is until we've processed the .MMP file
+			push @{$PlatHash{MmpMacros}}, "MARM_$PlatHash{ABI}";
+		}
+	}
+
+# builds
+	@{$PlatHash{Blds}}=@{$BldLists{$PlatHash{OS}}};
+
+# output some information
+	if ($Mode{Verbose}) {
+		print
+			"Platform         $PlatHash{Name}\n",
+			"Real Name        $PlatHash{Real}\n",
+			"Compiler         $PlatHash{Compiler}\n",
+			"OS               $PlatHash{OS}\n",
+			"CPU              $PlatHash{CPU}\n",
+			"ASSP             $PlatHash{ASSP}\n",
+			"ABI              $PlatHash{ABI}\n",
+			"ASSPABI          $PlatHash{ASSPABI}\n",
+			"Makefile Module  $PlatHash{MakeMod}\n",
+			"Makefile Type    $PlatHash{MakeCmd}\n",
+			"MMP Macros       @{$PlatHash{MmpMacros}}\n",
+			"Macros           @{$PlatHash{Macros}}\n",
+			"Blds             @{$PlatHash{Blds}}\n"
+		;
+	}
+
+	%{$PlatHash_ref}=%PlatHash;
+	%{$BldMacrosHash_ref}=%BldMacros;
+}
+
+sub Plat_List () {
+
+#	Include the list of BPABI platforms
+	&Set_Plat;
+
+#	return list of supported platforms
+
+	#sort keys %Plat;
+	my @PlatList;
+	my $Key;
+	foreach $Key (keys %Plat) {
+		if (!$variantABIV2Keyword && $Key =~ /^armv5_abiv1$/i) {
+			$Key = 'ARMV5';
+		}
+		unless (grep /^$Key$/i, @PlatList) {
+			push @PlatList, $Key;
+		}
+	}
+	return @PlatList
+}
+
+sub Plat_AssocIDE ($$) {
+#	return the IDE associated with a "Real" platform if there is one
+	my ($Candidate, $AssocIDEs)=@_;
+
+	unless (defined $Plat{$Candidate}) {
+		die "ERROR: Platform \"$Candidate\" not supported\n";
+	}
+
+	my $Key;
+	foreach $Key (keys %Plat) {
+		if (${Plat{$Key}}{Real}) {
+			if (${Plat{$Key}}{Real} eq $Candidate) {
+				push @$AssocIDEs, $Key;
+			}
+		}
+	}
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/e32variant.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,156 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package E32Variant;
+
+require Exporter;
+
+@ISA = qw(Exporter);
+
+@EXPORT = qw(Variant_GetMacroList Variant_GetMacroHRHFile Variant_GetMacro);
+
+use Pathutl;
+
+# using $FindBin::Bin to figure out the location of the epoc32\tools directory as 
+# IDE doesn't understand env{EPOCROOT}
+
+my $PerlBinPath;	# fully qualified pathname of the directory containing this script
+
+BEGIN {
+	require 5.005_03;		# check user has a version of perl that will cope
+	$PerlBinPath = $FindBin::Bin;	# X:/epoc32/tools
+	$PerlBinPath =~ s/\//\\/g;	# X:\epoc32\tools
+}
+
+# get epocroot if it is set
+my $epocroot = $ENV{EPOCROOT};
+my $toolspath;
+
+#if epocroot is not set figure it out
+if(!$epocroot){
+    $epocroot = $PerlBinPath . "\\..\\..\\" ; #infer epocroot
+    $toolspath = $PerlBinPath;
+}else{
+    $toolspath = $epocroot . "epoc32\\tools\\";
+}
+
+$epocroot=~s/^(.:)//io;    # remove drive letter
+$epocroot=&Path_Strip($epocroot); # collapse
+
+my $cfgFile =  $toolspath . "variant\\variant.cfg"; # default location
+$cfgFile =~ /^(.:)/i; # match the drive
+my $MacroHRHLocation_Drive = lc($1); # save the drive 
+
+sub Variant_GetMacroHRHFile{
+    my $file;
+    if(-e $cfgFile){
+	open(FILE, $cfgFile) || die "\nCould not open: " . $cfgFile ."\n";
+	while (<FILE>) {
+	    # strip comments
+	    s/^([^#]*)#.*$/$1/o;
+	    # skip blank lines
+	    if (/^\s*$/o) {
+		next;
+	    }
+	    # get the hrh file
+	    if($_ =~ /\.hrh/xi){
+		$file = $_; 
+		last;
+	    }
+	}
+	close FILE;
+	die "\nERROR: No variant file specified in $cfgFile!\n" unless $file;
+	$file =~ s/\s+//g;
+	$file=~s/^(.:)//io;    # remove drive letter
+	my $paths_drive = lc($1);
+
+	$file = Path_MakeEAbs($epocroot."EPOC32\\", $epocroot, $file); # assume relative to EPOCROOT
+
+	if($paths_drive){
+	    die "\nERROR: Variant file specified in $cfgFile is not on the same drive as \\epoc32\\\n" 
+		unless ($paths_drive eq $MacroHRHLocation_Drive);
+	}
+	if(!(-e $file)) {
+	    die "\nERROR: $cfgFile specifies $file which doesn't exist!\n";
+	}
+
+	# make sure it is in dos syntax
+	$file=~ s/\//\\/g;
+    }
+    return $file;
+}
+
+
+# returns the variant specific macro definitions as a list
+sub Variant_GetMacroList{
+
+    my @macros = ();
+    my $vfile = Variant_GetMacroHRHFile();
+    
+    if($vfile)
+    {
+	my $VariantFilePath = Path_Split('Path',$vfile);
+	chop( $VariantFilePath );
+	$VariantFilePath = &Path_PrefixWithDriveAndQuote($VariantFilePath);
+	$vfile = &Path_PrefixWithDriveAndQuote($vfile);
+	my $e32Path = &Path_PrefixWithDriveAndQuote($epocroot."epoc32\\include");
+	
+	open CPPPIPE,"cpp -I $e32Path -I $VariantFilePath -undef -dM $vfile |" or die "ERROR: Can't invoke CPP.EXE\n";
+	while(<CPPPIPE>){
+	    if($_ =~ /(\#define)(\s+)(.+)/){
+		push @macros, $3;
+	    }
+	}
+	close CPPPIPE;
+    }
+    return @macros;
+}
+
+sub Variant_GetMacro{
+
+    my $file;
+    if(-e $cfgFile){
+	open(FILE, $cfgFile) || die "\nCould not open: " . $cfgFile ."\n";
+	while (<FILE>) {
+	    # strip comments
+	    s/^([^#]*)#.*$/$1/o;
+	    # skip blank lines
+	    if (/^\s*$/o) {
+		next;
+	    }
+	    # get the hrh file
+	    if($_ =~ /^ENABLE_ABIV2_MODE$/xi){
+		close FILE;
+		return 1;
+	    }
+	}
+	close FILE;
+    }
+    return 0;
+}
+
+1;
+
+
+
+
+
+
+
+
+
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/extractvars.make	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,44 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+
+include $(CONFIG_FILE)
+
+all:
+	echo PREFIXFILE=$(PREFIXFILE)
+	echo VFP2MODE_OPTION=$(VFP2MODE_OPTION)
+	echo UNDEFINED_SYMBOL_REF_OPTION=$(UNDEFINED_SYMBOL_REF_OPTION)
+	echo PREINCLUDE_OPTION=$(PREINCLUDE_OPTION)
+	echo PREINCLUDE_OPTION_FCLOGGER=$(PREINCLUDE_OPTION_FCLOGGER)
+	echo VFP2MODE_OPTION=$(VFP2MODE_OPTION)
+	echo TRANASM=$(TRANASM)
+	echo RUNTIME_LIBS_LIST=$(RUNTIME_LIBS_LIST)
+	echo COMPILER_INCLUDE_PATH=$(COMPILER_INCLUDE_PATH)
+	echo VERSION=$(VERSION)
+	echo VERSION_INFO=$(VERSION_INFO)
+	echo COMPILER_PLAT=$(COMPILER_PLAT)
+	echo FC_LOGGER_INCLUDE_OPTION=$(FC_LOGGER_INCLUDE_OPTION)
+	echo FC_LOGGER_DICTIONARY_FILE_NAME=$(FC_LOGGER_DICTIONARY_FILE_NAME)
+	echo FC_LOGGER_GENERATED_C_FILE_NAME=$(FC_LOGGER_GENERATED_C_FILE_NAME)
+	echo COMMANDFILE_OPTION=$(COMMANDFILE_OPTION)
+	echo VIA_FILE_PREFIX=$(VIA_FILE_PREFIX)
+	echo VIA_FILE_SUFFIX=$(VIA_FILE_SUFFIX)
+	echo STATIC_LIBS_LIST=$(STATIC_LIBS_LIST)
+	echo STATIC_LIBRARY_PATH=$(STATIC_LIBRARY_PATH)
+	echo STATIC_LIBS=$(STATIC_LIBS)
+	echo OE_EXE_LIBS=$(OE_EXE_LIBS)
+	echo OE_EXE_LIBS_WCHAR=$(OE_EXE_LIBS_WCHAR)
+	echo OE_IMPORT_LIBS=$(OE_IMPORT_LIBS)
+	echo OPTION_PREFIX=$(OPTION_PREFIX)
+	echo CCFLAGS=$(CCFLAGS)
+	echo SYM_NEW_LIB=$(SYM_NEW_LIB)
+	echo OE_NEW_LIB=$(OE_NEW_LIB)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/fcloggerutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,55 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# FC_LOGGER.PM
+# 
+#
+
+package FCLoggerUTL;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	PMCheckFCLoggerVersion
+);
+
+#Function Call Logger
+sub PMCheckFCLoggerVersion() {
+	my $exe=$ENV{EPOCROOT}."epoc32\\tools\\fc_logger\\edgcpfe.exe";
+	#Check if file exists
+	if (not -e $exe) {
+		print "WARNING: File doesn't exist $exe \n";
+		return 0;
+	}
+
+	open FCLPIPE, "$exe -v 2>&1 |";
+	# Read all output from file into array
+	my @lines=<FCLPIPE>;
+	chomp @lines;
+	# combine into single string with each line starting with a :
+	my $line=join(":", "", @lines);
+	close FCLPIPE;
+
+	if ($line =~ m/version\s([0-9\.]+)/) {
+		my $Version      = $1;
+		$Version		 =~ m/(\d+)\.(\d+)\.?([\d+])?/;
+		my $MajorVersion = $1;
+		my $MinorVersion = $2;
+		my $PatchLevel   = $3;
+		if ($MajorVersion<3 or $MinorVersion<7) {
+			print "WARNING: $exe version is less than 3.7.1. The -logfc option will be ignored.\n";
+			return 0;
+		}
+	}
+	return 1;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/filenamepolicyexclusions.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,69 @@
+OMX_Audio.h
+OMX_Component.h
+OMX_ContentPipe.h
+OMX_Core.h
+OMX_Image.h
+OMX_Index.h
+OMX_IVCommon.h
+OMX_Loader.h
+OMX_Other.h
+OMX_Types.h
+OMX_Video.h
+EGL
+EGL/egl.h
+EGL/egltypes.h
+EGL/egluids.hrh
+EGL/eglext.h
+WF
+WF/wfc.h
+WF/wfcext.h
+WF/wfcplatform.h
+WF/openwfcuids.hrh
+KHR/khrplatform.h
+GLES
+GLES/egldisplayproperty.h
+GLES/egldisplaypropertydef.h
+GLES/egltypes.h
+GLES/legacy_egl_1_1/egl.h
+GLES/legacy_egl_1_1/egltypes.h
+GLES/gl.h
+GLES/glext.h
+GLES/glplatform.h
+GLES/glextplatform.h
+GLES/openglesuids.hrh
+GLES/egl.h
+GLES/egldisplayproperty.h
+GLES/egldisplaypropertydef.h
+GLES2
+GLES2/gl2.h
+GLES2/gl2ext.h
+GLES2/gl2platform.h
+GLES2/gl2extplatform.h
+GLES2/openglesuids.hrh
+VG
+VG/openvg.h
+VG/vgu.h
+VG/openvguids.hrh
+VG/1.0/openvg.h
+VG/1.0/vgu.h
+VG/1.1/openvg.h
+VG/1.1/vgu.h
+libEGL.dll
+libEGL.lib
+libGLESv1.dll
+libGLESv1.lib
+libGLESv2.dll
+libGLESv2.lib
+libGLES_CM.dll
+libGLES_CM.lib
+libGLES_CM10.dll
+libGLES_CM10.lib
+libGLESv1_CM.dll
+libGLESv1_CM.lib
+libOpenVG.dll
+libOpenVG.lib
+libOpenVGU.dll
+libOpenVGU.lib
+libWFC.lib
+libWFC.dll
+libWFCu.def
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/findimp.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,77 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+my $argc=scalar(@ARGV);
+$argc==2 or die "findimp <map file> <output file>\n";
+my $infile=@ARGV[0];
+my $outfile=@ARGV[1];
+
+my @imp_dll_names;
+my @imp_dll_ordinal_lists;
+my $i=0;
+open INFILE, $infile or die "Can't open input file $infile\n";
+while (<INFILE>) {
+	if (/^\s*(\d+)\:(([0-9|a-f|A-F])+)\s+__imp_(\S+)\s+(([0-9|a-f|A-F])+)\s+(\S+?)\:(.*?)\s*$/) {
+		my $section_num=$1;
+		my $section_offset=hex $2;
+		my $import_name="__imp_$4";
+		my $addr=$5;
+		my $dllname=$8;
+		my $implist;
+		for ($i=0; $i<scalar(@imp_dll_names); ++$i) {
+			if ($imp_dll_names[$i] eq $dllname) {
+				$implist=$imp_dll_ordinal_lists[$i];
+				push @$implist, $section_offset;				
+				last;
+			}
+		}
+		if ($i==scalar(@imp_dll_names)) {
+			my @new_list;
+			push @new_list, $section_offset;
+			push @imp_dll_names, $dllname;
+			push @imp_dll_ordinal_lists, \@new_list;
+		}
+	}
+}
+close INFILE;
+my $noffset=4;
+my $n_imp_dlls=scalar(@imp_dll_names);
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	$noffset+=8;
+	my $implist=$imp_dll_ordinal_lists[$i];
+	foreach (@$implist) {
+		$noffset+=4;
+	}
+}
+open OUTFILE, ">$outfile" or die "Can't open output file $outfile\n";
+binmode OUTFILE;
+printf OUTFILE "%c%c%c%c",$n_imp_dlls&0xff,($n_imp_dlls>>8)&0xff,($n_imp_dlls>>16)&0xff,$n_imp_dlls>>24;
+$i=0;
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	my $nlen=length $imp_dll_names[$i];
+	printf OUTFILE "%c%c%c%c",$noffset&0xff,($noffset>>8)&0xff,($noffset>>16)&0xff,$noffset>>24;
+	$noffset+=$nlen + 1;
+	my $implist=$imp_dll_ordinal_lists[$i];
+	my $nimp=scalar(@$implist);
+	printf OUTFILE "%c%c%c%c",$nimp&0xff,($nimp>>8)&0xff,($nimp>>16)&0xff,$nimp>>24;
+	foreach (@$implist) {
+		printf OUTFILE "%c%c%c%c",$_&0xff,($_>>8)&0xff,($_>>16)&0xff,$_>>24;
+	}
+}
+for ($i=0; $i<$n_imp_dlls; ++$i) {
+	print OUTFILE $imp_dll_names[$i];
+	printf OUTFILE "%c",0;
+}
+close OUTFILE;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ide_cw.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4517 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Makmake-module for creating XML files which can be imported as CodeWarrior IDE projects
+# 
+#
+
+package Ide_cw;
+
+my $CW_minimum_supported_version = 2.8;
+
+# declare variables global for module
+my $BaseAddress="";
+my %IdeBlds=();
+my %PrjHdrs=();
+my @Win32LibList=();
+my $Win32Resrc;
+my $Win32StdHeaders;
+
+my $ExtraFilesPath="";
+my @KnownRoots=();
+
+my @addedFiles=();
+my $addHeaders = 1;
+my $addDocuments = 1;
+
+my %processedPlatforms;
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+
+	PMStartBldList
+		PMBld
+			PMResrcBld
+
+	PMEndSrcList
+);
+
+require Cl_bpabi;
+use BPABIutl;
+use E32Variant;
+use E32Plat; 
+use Winutl;
+use Armutl;
+use Pathutl;
+use Win32API::Registry qw( :ALL );
+use Preprocessor;
+use RVCT_plat2set;
+
+sub PMHelp_Mmp {
+	&Winutl_Help_Mmp;
+}
+
+my $RVCTMajorVersion = Armutl_RVCTMajorVersion();
+my $RVCTMinorVersion = Armutl_RVCTMinorVersion();
+my $RVCTVersion = "${RVCTMajorVersion}_${RVCTMinorVersion}";
+
+my $oP = "--";
+$oP = "-" if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2);
+
+my $cfgMacro = &Variant_GetMacro();
+
+use FindBin;
+use lib $FindBin::Bin."\\perllib";
+
+#use the DOM xml module
+use XML::DOM;
+
+my $projectTemplate;
+my $linkDescriptorTemplate;
+
+my $xmlParser;
+my $xmlProjectDoc;
+my $xmlLinkDescriptorDoc;
+my $xmlLinkDescriptorCommandParent;
+my $xmlLinkDescriptorSymbolParent;
+my $xmlLinkDescriptorDumpFileParent;
+
+my $xmlLinkOrder;		# for accumulating the link order
+my $xmlFileList;		# for accumulating the file list
+my $xmlSourceGroup;		# for accumulating the source
+my $xmlHeadersGroup;	# for accumulating local header files
+my $xmlRootGroup;		# for accumulating files to be added outside of project groups
+my $xmlLinkGroup;		# for accumulating the link descriptor files
+my $xmlLibGroup;		# for accumulating the libraries
+my $xmlResourcesGroup;	# for accumulating resource related files
+my $xmlDocumentsGroup;	# for accumulating supported files specified with DOCUMENT in the .mmp file
+
+my $MmpFile;
+my $VariantFile;
+my $PrefixFile;
+
+my $CW_major_version;
+my $CW_minor_version;
+my $CW_libpath;
+my @CW_librarypath;
+my @ToolChainLibList;
+
+# Hash to store configuration makefile data for furthur processing
+my %configdata;
+
+sub RoundUp1k($) {
+	# Accept C hexadecimal number (0xNNN).  Convert argument to Kb
+	# rounded up to the next 1kb boundary.
+	use integer;
+	return (hex($_[0]) + 1023) / 1024;
+}
+
+use Genutl;
+use cl_generic;
+
+my $ToolPrefix='';
+my $HelperLib='';
+my %PlatOpt=(
+	'Dlltool'=>'',
+	'Entry'=>'-e',
+	'Gcc'=>'',
+	'Ld'=>'',
+	'Petran'=>'',
+	'Optimize'=>'-O'
+);
+my $Dlltool;
+my $Archive;
+my $Link;
+my $Objcopy;
+
+my %CompatibleABIs=(
+	ARMI=>['ARM4', 'THUMB'],
+	ARM4=>['ARMI'],
+	THUMB=>['ARMI'],
+	ARMV5=>['ARMV5_ABIV1'],
+	GCCE=>['GCCE'],
+	BPABI=>['ARMV5_ABIV2']
+);
+my @CompatibleABIs;
+
+my $Makecmd;
+my %ABILibPath=();
+
+sub SystemTarget() {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	# N.B. should get better way to detect kernel probably!!
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	
+	return 0;
+}
+
+sub SysTrg () {
+	return 1 if &main::SystemTrg;
+	my $ExportLibrary=&main::ExportLibrary;
+	return 1 if ($ExportLibrary =~ /EKERN/i);
+	my $Trg=&main::Trg;
+	return 1 if ($Trg =~ /KSRT/i);
+	return 0;
+}
+
+sub PMUnderlyingABI($) {
+	my ($ABI) = @_;
+	if ($ABI eq 'ARM4T') {
+		if (&main::BuildAsARM) {
+			return 'ARMI';
+		}
+		elsif (SystemTarget()) {
+			return 'ARM4';
+		}
+		else {
+			return 'ARMV4';
+		}
+	}
+	return $ABI;
+}
+
+##### ARMV5 specific options #####
+my $diag_suppressions;
+my $diag_warnings;
+my $diag_errors;
+
+#The options here are handcoded for ABIV1 mode.
+my $contingentOptions;
+my $exceptions = ' --exceptions --exceptions_unwind';
+my $thumbOptions = '--thumb ';
+my $armOptions = '--arm ';
+my $kernelOptions = '--arm --no_exceptions --no_exceptions_unwind';
+my $invariantOptions = 
+  '--cpu 5T --enum_is_int -Ono_known_library --fpmode ieee_no_fenv --export_all_vtbl --no_vfe --apcs /inter';
+$invariantOptions .= ' --dllimport_runtime' unless ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2);  
+# specify floating point model here
+my $floatingpointmodel = "softvfp";
+if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i)) {
+	$floatingpointmodel = "vfpv2";
+}
+my $floatingpoint = ' --fpu '.$floatingpointmodel.'';
+
+# Set compiler settings
+$diag_suppressions = '--diag_suppress 66,161,611,654,997,1152,1300,1464,1488,6318,6331';
+$diag_warnings = '';
+$diag_errors = '--diag_error 1267';
+my $commonOptions = "$diag_suppressions $diag_warnings $diag_errors";  
+# variables added to fetch the options from the BSF files
+my @commonOptions;
+my @thumbOptions;
+my @armOptions;
+my @kernelOptions;
+my @invariantOptions;
+my @linkerOptions;
+my @archiverOptions;
+
+my $linkCommand = "";		
+# variables to process and store the default and BSF file options
+my $invopts = $invariantOptions;
+my $linkeropts;
+my $archiveropts;
+#varible to store the BSF add options
+my $bsfaddoptions = undef;
+#variable to store the compiler flags, defs and other options
+my $CCFLAGS = undef;
+my $CCDEFS = undef;
+my $CCUREL = undef;
+my $CCUDEB = undef;
+
+
+#GCCE specific OPIONS
+
+my $GCCE_CompilerOption = '-march=armv5t -mthumb-interwork -mapcs';
+$GCCE_CompilerOption .= " -msoft-float -fexceptions -pipe -nostdinc -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas";
+#Flag to check for the customized GCCE platform
+my $CustGCCE=0;
+#Variable to fetch the Customized platform
+my %CustPlat=&main::PlatRec;
+#Flags to read the options
+my $kernelOption=0;
+my $buildAsArmOption=0;
+my $thumbOption=0;
+
+
+my $ArmIncDir;
+my @ArmLibList;
+my $ArmRT;
+
+my %BSF_keywords = (
+		    COMMON_OPTIONS => 1,
+		    THUMB_OPTIONS => 1,
+		    ARM_OPTIONS => 1,
+		    KERNEL_OPTIONS => 1,
+		    INVARIANT_OPTIONS => 1,
+			LD_OPTIONS => 1,
+			AR_OPTIONS => 1
+		   );
+sub PMStartBldList($) 
+{
+	($Makecmd) = @_;
+	my @BldList=&main::BldList;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $ABI=&main::ABI;
+	my $kernelOption=0;
+	my $buildAsArmOption=0;
+	my $thumbOption=0;
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__ ";
+	my %plat = &main::PlatRec();
+
+	$CCFLAGS = "";
+	$CCDEFS = "";
+	$CCUREL = "";
+	$CCUDEB = "";
+	
+	$VariantFile=&main::VariantFile();	
+
+	#read the configuration make file into the hash for only the BPABI platforms
+	my $config_file = BPABIutl_Config_Path(&main::Plat);
+	if ($config_file) {
+		collect_config_data($config_file);
+	}
+		
+	Read_BSF_Options() if ($plat{'CUSTOMIZES'});
+
+	if (SysTrg()) {
+		$kernelOption=1;
+	} elsif (main::BuildAsARM() or ($ABI eq 'ARMV4')) {
+		$buildAsArmOption=1;
+	} else {
+		$thumbOption=1;
+	}
+
+	my $OtherOpts = undef;
+	my $toolchain = $configdata{COMPILER_PLAT};
+	
+	$OtherOpts = &main::CompilerOption($toolchain);
+	
+	if($kernelOption==1)
+	{
+		if(@kernelOptions) {
+# Kernel options as read from BSF file (KERNEL_OPTIONS keyword)
+			Set_BSF_Options('KERNEL_OPTIONS',\@kernelOptions);
+		}
+		$OtherOpts .= " ".fetch_config_data($configdata{KERNEL_OPTIONS});
+	}
+	elsif($buildAsArmOption==1)
+	{	
+		if(@armOptions) {
+# Arm options as read from BSF file (ARM_OPTIONS keyword)
+			Set_BSF_Options('ARM_OPTIONS',\@armOptions);
+		}
+		$OtherOpts .= " ".fetch_config_data($configdata{ARM_OPTIONS});	
+	}
+	elsif($thumbOption==1)
+	{
+		if(@thumbOptions) {
+# Thumb options as read from BSF file (THUMB_OPTIONS keyword)
+			Set_BSF_Options('THUMB_OPTIONS',\@thumbOptions);
+		}
+		$OtherOpts .= " ".fetch_config_data($configdata{THUMB_OPTIONS});
+	}
+	
+	if($thumbOption==1 || $buildAsArmOption==1)
+	{
+		if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i))
+		{
+			$OtherOpts .= "	".$configdata{VFP2MODE_OPTION};
+		}
+		else
+		{
+			$OtherOpts .= "	".$configdata{SOFTVFPMODE_OPTION};
+		}
+	}
+
+	if ($thumbOption==1)
+	{
+		$OtherOpts .= "	".$configdata{COMPILER_THUMB_DEFINES};
+	}
+	
+	$OtherOpts .= "	".$configdata{COMPILER_INTERWORK_DEFINES};
+	
+	if((&main::Plat eq "ARMV5_ABIV1") || (&main::Plat eq "ARMV5" && !$cfgMacro)
+	|| ($CustPlat{'CUSTOMIZES'} 
+	&& (($CustPlat{'ROOTPLATNAME'} eq "ARMV5_ABIV1" && $cfgMacro) 
+	|| ($CustPlat{'ROOTPLATNAME'} eq "ARMV5" && !$cfgMacro)))) {
+		ComputeCompilerOpts();
+	}
+	elsif($config_file) {
+		$CCFLAGS = &Cl_bpabi::getConfigVariable('CCFLAGS');
+	}
+	$CCFLAGS .= $OtherOpts;
+
+	if(@invariantOptions)
+	{
+	# Invariant options as read from BSF file (INVARIANT_OPTIONS keyword)
+		Set_BSF_Options('INVARIANT_OPTIONS',\@invariantOptions);
+	}
+	if(@commonOptions)
+	{
+	# Common options as read from BSF file (COMMON_OPTIONS keyword)
+		Set_BSF_Options('COMMON_OPTIONS',\@commonOptions);
+	}
+	if(@linkerOptions)
+	{
+	# Invariant options as read from BSF file (LD_OPTIONS keyword)
+		Set_BSF_Options('LD_OPTIONS',\@linkerOptions);
+	}
+	if ($BasicTrgType=~/^LIB$/o) {
+		if(@archiverOptions)
+		{
+		# Invariant options as read from BSF file (AR_OPTIONS keyword)
+			Set_BSF_Options('AR_OPTIONS',\@archiverOptions);
+		}	
+	}
+
+	if($bsfaddoptions)
+	{
+		fixbsfoptions($bsfaddoptions);
+	}
+	$CCFLAGS .= $bsfaddoptions;
+	$CCDEFS = $configdata{COMPILER_DEFINES};
+	$CCDEFS .= printlist("-D", @MacroList);
+	$CCDEFS .= $configdata{PLATFORM_DEFINES};
+
+	if($kernelOption==1)
+	{
+		$CCDEFS .= -D__KERNEL_MODE__;
+	}
+	
+	if($VariantFile) { 
+		$CCDEFS .= " -D__PRODUCT_INCLUDE__="."\\\"".&main::Path_Split('File',$VariantFile)."\\\"";
+	}
+	
+	foreach (@BldList) 
+	{
+		if($kernelOption == 0)
+		{
+			if (/DEB$/o) {
+				$CCUDEB .= " ".$configdata{EXCEPTIONS};
+			}
+			else {
+				$CCUREL .= " ".$configdata{EXCEPTIONS};
+			}
+		}
+		#collect the options and macro's depending on the whether it is a UREL or UDEB		
+		my @ml = &main::MacroList($_);
+		if (/DEB$/o) {
+			$CCUDEB .= " ".$CCFLAGS;
+			$CCUDEB .= printlist("-D", @ml);
+			$CCUDEB .= " ".$CCDEFS;
+		}
+		else {
+			$CCUREL .= " ".$CCFLAGS;
+			$CCUREL .= printlist("-D", @ml);
+			$CCUREL .= " ".$CCDEFS;
+		}
+	}
+}
+
+sub ComputeCompilerOpts() {
+	my %plat = &main::PlatRec();
+	my $ABI=&main::ABI;
+	my $TrgType=&main::TrgType;
+
+	if (SysTrg()) {
+	        $contingentOptions = $kernelOptions;
+        } elsif (main::BuildAsARM() or ($ABI eq 'ARMV4')) {
+	        $contingentOptions = $armOptions.$floatingpoint.$exceptions;
+	    } else {
+			$contingentOptions = $thumbOptions.$floatingpoint.$exceptions.' -D__MARM_THUMB__';	
+	}
+	# change support for ARMV4
+	if ($ABI eq 'ARMV4') {
+		$invopts =~ s/5T/4/;
+		$invopts =~ s/inter/nointer/;
+	} else {
+		$contingentOptions .= ' -D__MARM_INTERWORK__';
+	}
+	$CCFLAGS = $commonOptions.' '.$contingentOptions.' '.$invopts.' -c '.' '.&main::CompilerOption("ARMCC");
+}
+
+sub GetMajorVersion ($)
+	{
+	my ($versionString) = @_;
+
+	if ($versionString =~ /^\d\.\d\.\d$/)
+		{
+		$versionString =~ s/\.\d$//;
+		}
+
+	return $versionString;
+	}
+
+sub GetMinorVersion ($)
+	{
+	my ($versionString) = @_;
+
+	if ($versionString =~ /^\d\.\d\.\d$/)
+		{
+		$versionString =~ s/^\d\.\d\.//;
+		}
+	else
+		{
+		$versionString = 0;
+		}
+
+	return $versionString;
+	}
+
+sub PMCheckPlatformL {
+
+	# check version of CodeWarrior for Symbian OS
+
+	my @compatibleCWInstallations;
+
+	$CW_major_version = 0;
+	$CW_minor_version = 0;
+
+	my $minimumMajorVersion = GetMajorVersion ($CW_minimum_supported_version);
+	my $minimumMinorVersion = GetMinorVersion ($CW_minimum_supported_version);
+
+	if (defined $ENV{CW_SYMBIAN_VERSION})
+		{
+		# CW_SYMBIAN_VERSION is set - either MAKMAKE is being executed by an IDE's .mmp Importer,
+		# or the user is specifying a specific CW version to target from the command line.
+		# Either way, we've been given a single version to target, so we attempt to do just that.
+
+		$CW_major_version = GetMajorVersion ($ENV{CW_SYMBIAN_VERSION});
+		$CW_minor_version = GetMinorVersion ($ENV{CW_SYMBIAN_VERSION});
+		
+		push @compatibleCWInstallations, $ENV{CW_SYMBIAN_VERSION};
+		}
+	else
+		{
+		# CW_SYMBIAN_VERSION isn't set - either MAKMAKE is being executed by a pre-OEM3.0 IDE .mmp
+		# Importer or from the command line.  Either way, we delve into the registry and attempt to
+		# target the latest CW for Symbian OS installed, recording all CW for Symbian OS installations
+		# too.
+
+		my $regKeyHandle;
+		my $topLevelKey = HKEY_LOCAL_MACHINE;
+		my $productVersionKey = 'SOFTWARE\\Metrowerks\\CodeWarrior\\Product Versions';
+
+		if (!RegOpenKeyEx($topLevelKey, $productVersionKey, 0, KEY_READ, $regKeyHandle))
+			{		    		
+			die "Can't read \"HKEY_LOCAL_MACHINE\\$productVersionKey\" : ", regLastError(), "\n";
+		    }
+
+		my $subKeyIndex = 0;
+		my $subKeySize = 0;
+		my $subKeyName;
+
+		my @installedCWForSymbianKeys;
+
+		while (RegEnumKeyEx($regKeyHandle, $subKeyIndex, $subKeyName, $subKeySize, [], [], [], []))
+			{
+			push (@installedCWForSymbianKeys, $productVersionKey."\\".$subKeyName) unless ($subKeyName !~ /Symbian/);
+			$subKeyIndex++;
+			}
+
+		RegCloseKey($regKeyHandle) || print STDERR "WARNING: Could not close registry key.";
+
+		my $versionType;
+		my $versionValue;
+
+		foreach my $installedCWForSymbianKey (@installedCWForSymbianKeys)
+			{
+			if (!RegOpenKeyEx($topLevelKey, $installedCWForSymbianKey, 0, KEY_READ, $regKeyHandle))
+				{		    		
+				die "Can't read \"HKEY_LOCAL_MACHINE\\$installedCWForSymbianKey\" : ", regLastError(), "\n";
+			    }
+
+			if (!RegQueryValueEx($regKeyHandle, "VERSION", [], $versionType, $versionValue, []))
+				{
+				die "Can't read \"HKEY_LOCAL_MACHINE\\$installedCWForSymbianKey\\VERSION\" : ", regLastError(), "\n";
+				}
+
+			my $temp_major_version = GetMajorVersion ($versionValue);
+			my $temp_minor_version = GetMinorVersion ($versionValue);
+
+			if (($temp_major_version > $CW_major_version) ||
+				(($temp_minor_version > $CW_minor_version) &&
+				   ($temp_major_version >= $CW_major_version)))
+				{
+				$CW_major_version = $temp_major_version;
+				$CW_minor_version = $temp_minor_version;
+				}
+			
+			if (($temp_major_version > $minimumMajorVersion) ||
+				(($temp_minor_version > $minimumMinorVersion) &&
+				   ($temp_major_version >= $minimumMajorVersion)))
+				{
+				push @compatibleCWInstallations, $versionValue;
+				}
+
+			RegCloseKey($regKeyHandle);
+			}
+		}
+
+	# We've determined a CW version to target, now we validate if we actually support this
+
+	if (!$CW_major_version ||
+		($CW_major_version < $minimumMajorVersion) ||
+		(($CW_major_version >= $minimumMajorVersion) && ($CW_minor_version < $minimumMinorVersion)))
+		{
+		if (defined $ENV{CW_SYMBIAN_VERSION})
+			{
+			die "Error: CW_SYMBIAN_VERSION is set to $ENV{CW_SYMBIAN_VERSION}.\n       The minimum version supported by these tools is $CW_minimum_supported_version.\n";
+			}
+		else
+			{
+			die "ERROR: Unable to identify a compatible CodeWarrior for Symbian OS installation.\n";
+			}
+		}
+
+	if (@compatibleCWInstallations > 1)
+		{
+		my $targetVersion = $CW_major_version;
+		$targetVersion .= ".$CW_minor_version" if $CW_minor_version;
+			
+		print ("Info: More than one compatible CodeWarrior for Symbian OS installation has been detected.\n");
+		print ("      The generated project will target $targetVersion - to override this, set the CW_SYMBIAN_VERSION\n");
+		print ("      environment variable to the version number you wish to target and re-run this command.\n");
+		print ("      Supported version numbers detected : @compatibleCWInstallations.\n");
+		}
+	else
+		{
+		print ("Info: Detected CodeWarrior Version Major=$CW_major_version Minor=$CW_minor_version\n");
+		}
+
+	# CW version has been validated, tailor generated projects on this basis
+
+	$CW_libpath = 'Symbian_Support\Win32-x86 Support\Libraries\Win32 SDK';
+ 	push @CW_librarypath,$CW_libpath;
+ 	# Lib path to support the Carbide runtime libraries
+ 	$CW_libpath = 'Symbian_Support\Runtime\Runtime_x86\Runtime_Win32\Libs';
+ 	push @CW_librarypath,$CW_libpath;
+		
+	if ($CW_major_version == 2.8)
+		{
+		$projectTemplate = "CW_project_template_v3.xml";
+		$linkDescriptorTemplate = "cw_link_descriptor_template.cwlink";
+		}
+	else
+		{
+		$projectTemplate = "CW_project_template_v4.xml";
+		$linkDescriptorTemplate = "cw_link_descriptor_template_v2.cwlink";		
+		}
+		
+	$xmlParser = new XML::DOM::Parser; 
+	$xmlProjectDoc = $xmlParser->parsefile ($FindBin::Bin."\\$projectTemplate");
+}
+
+# Check if a platform is a customization
+sub IsCustomization($) {
+	my ($plat) = @_;
+	return 1 if (Plat_Customizes($plat));
+	return 0;
+}
+
+sub PMPlatProcessMmp (@) {
+	
+	my $currentPlat=&main::Plat;
+
+	return if ($processedPlatforms{$currentPlat});
+	$processedPlatforms{$currentPlat}=1;
+	@ToolChainLibList = &GetLibList;
+	my $TrgType=&main::TrgType;
+	if ($CustPlat{'CUSTOMIZES'} && ($CustPlat{'ROOTPLATNAME'} eq "GCCE"))
+	{
+		$CustGCCE=1;
+	}
+
+	if ($currentPlat =~ /^WINSCW$/)
+		{	
+		my $includes = $ENV{MWCWinx86Includes};
+		&Winutl_DoMmp_Parse(\@_, $includes);
+		@Win32LibList=&Winutl_Win32LibList;
+		$Win32Resrc=&Winutl_Win32Resrc;
+		$Win32StdHeaders=&Winutl_Win32StdHeaders;
+		$BaseAddress=&Winutl_BaseAddress unless ($TrgType eq 'EXE');
+		}
+	elsif ($currentPlat =~ /^ARMV5/ || IsCustomization($currentPlat))
+		{	
+		&Armutl_DoMmp(@_);
+		$ArmIncDir = &Armutl_ArmIncDir;
+		&main::SetStdIncPaths($ArmIncDir);
+		@ArmLibList = &Armutl_ArmLibList;
+		$ArmRT = &Armutl_ArmRT;
+		}
+
+	my $BaseTrg=&main::BaseTrg;
+	my $MakeFilePath=&main::MakeFilePath;
+	$MmpFile=&main::MmpFile;
+	$VariantFile=&main::VariantFile();		
+
+	# Set up the list of known roots
+
+	my $epocroot=&main::Path_Drive . &main::EPOCPath;
+	$epocroot =~ s/EPOC32\\$//i;
+
+	if ($currentPlat eq "GCCE" || $CustGCCE)
+	{
+		$PrefixFile=$epocroot.'epoc32\\include\\gcce\\gcce.h';
+	}
+	else
+	{
+		$PrefixFile=$epocroot.'epoc32\\include\\rvct'.$RVCTVersion.'\\rvct'.$RVCTVersion.'.h';
+	}
+	my $mmproot = &main::Path_Drive . &main::Path_Split('Path',$MmpFile);
+	my $mmprootname = "MMPDir";
+	my $mmpisglobal = 0;
+
+	if (defined $ENV{CW_ROOT_NAME})
+		{
+		# generate KnownRoots suitable for the IDE MMP importer
+		# This has a global source tree for EPOCROOT, and puts the
+		# project next to the MMP file
+
+		addKnownRoot($ENV{CW_ROOT_NAME}, 1, $epocroot, "");
+		$mmprootname = "Project";
+		$mmpisglobal = 1;
+		}
+	else
+		{
+		# generate KnownRoots suitable for command-line generated XML files
+		# We will add a user source tree for MMPDir and EPOCROOT, but can't use
+		# EPOCROOT for the OutputDirectory
+
+		addKnownRoot("EPOCROOT", 0, $epocroot, "");
+		}
+	addKnownRoot($mmprootname, $mmpisglobal, $mmproot, "");
+
+	# Allow for MMP files in component subdirectories by matching multiple levels
+	# up to get {MMPDir}..\whatever paths. Stop one level down from the root,
+	# since "everything on this drive" seems a bit extreme
+	#
+	my $tmppath = $mmproot;
+	my $dotdots = '';
+	while ($tmppath =~ /^(.:.+\\)[^\\]+\\$/i)
+		{
+		$tmppath = $1;
+		$dotdots .= "..\\";
+		addKnownRoot($mmprootname, $mmpisglobal, $tmppath, $dotdots);
+		}
+}
+
+sub findTarget($$$) {
+	my ($name,$platbld,$abibld) = @_;
+
+	my @targets = $xmlProjectDoc->getElementsByTagName("TARGET",1); 
+
+	foreach my $target (@targets)
+		{
+		
+		my $element = $target->getElementsByTagName("NAME",0)->item(0);
+		$element = $element->getFirstChild;
+		
+	#   here we want to get the plat build that is specified in the cw project tempalte
+	#   and not the abi build - there are more platbuilds than abibuilds so other targets
+	#   (e.g. GCCE) can get the wrong tempalte "NAME" (i.e. it will be ARMV5 rather than GCCE, which is not want we want)
+		if ($element->getData() =~ /$platbld$/)
+			{
+			
+			my $newtarget=$target->cloneNode(1);
+			$target->getParentNode()->appendChild($newtarget);
+			$element = $newtarget->getElementsByTagName("NAME",0)->item(0);
+			$element = $element->getFirstChild;
+			$element->setData("$platbld");
+			
+			# remember name as an attribute: this is removed before
+			# writing out the project.
+			$newtarget->setAttribute("NAME", "$platbld");
+			return $newtarget;
+			}
+			else
+			{
+				my $newtarget=$target->cloneNode(1);
+				my $newplat=&main::Plat." ".&main::Bld;
+				$target->getParentNode()->appendChild($newtarget);
+				$element = $newtarget->getElementsByTagName("NAME",0)->item(0);
+				$element = $element->getFirstChild;
+				$element->setData("$newplat");
+	 			
+				# remember name as an attribute: this is removed before
+				# writing out the project.
+				$newtarget->setAttribute("NAME", "$newplat");
+				return $newtarget;
+			}
+		}
+	return undef;
+}
+
+sub newList($$$) {
+	my ($target, $tag, $replace) = @_;
+
+	my $newlist = new XML::DOM::Element($xmlProjectDoc,$tag);
+	if ($replace==1)
+		{
+		my $elements = $target->getElementsByTagName($tag,0);
+		my $element = $elements->item(0);
+		$target->replaceChild($newlist, $element);
+		}
+	else
+		{
+		$target->appendChild($newlist);
+		}
+	return $newlist;
+}
+
+sub changeValue($$) {
+	my ($setting, $replacement) = @_;
+	my $value = $setting->getElementsByTagName("VALUE",0)->item(0);
+
+	if (defined $value)
+		{
+		if ($value->hasChildNodes)
+			{
+			$value->getFirstChild->setData($replacement);
+			}
+		else
+			{
+			$value->addText($replacement);
+			}
+		}
+}
+
+sub textSetting($$$$) {
+	my ($element,$name,$value,$insertionpoint)=@_;
+
+	my $setting = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+	&textElement($setting, "NAME", $name);
+	&textElement($setting, "VALUE", $value);
+	$element->insertBefore($setting, $insertionpoint);
+	$element->addText("\n");
+}
+
+sub addKnownRoot($$$$) {
+	my ($rootname, $global, $rootpath, $pathprefix) = @_;
+	$rootpath=&main::Path_Chop($rootpath);
+	push @KnownRoots, [$rootname, $global, quotemeta($rootpath), $pathprefix];
+}
+
+sub addRootedPath($$$) {
+	my ($setting,$needglobal,$path) = @_;
+	my $root = "Absolute";
+
+	if ($path =~ /^\\/)
+		{
+		$path = &main::Path_Drive . $path;	# ensure it has a drive letter
+		}
+
+	foreach (@KnownRoots)
+		{
+		my ($rootname, $global, $rootpath, $pathprefix) = @{$_};
+
+		next if ($needglobal && !$global);
+		if ($path =~ /^$rootpath\\/i)
+			{			
+			$path =~ s/^$rootpath\\/$pathprefix/i;
+			$root = $rootname;
+			last;
+			}
+		}
+	$path=&main::Path_Chop($path);
+	if ($root eq "Absolute" && $path =~ /^(.:)$/)
+		{
+		$path .= "\\";
+		}
+
+	&textSetting($setting, "Path", $path);
+	&textSetting($setting, "PathFormat", "Windows");
+	&textSetting($setting, "PathRoot", $root);
+}
+
+sub changePathSetting($$$) {	
+	my ($setting,$global,$value) = @_;
+
+	my @oldstuff = $setting->getElementsByTagName("SETTING",0);
+	foreach my $old (@oldstuff)
+		{
+		&removeNode($old);
+		}
+
+	&addRootedPath($setting,$global,$value);
+}
+
+sub addSourceTrees($) {
+	my ($node) = @_;
+
+	my $element = $node->getElementsByTagName("VALUE",0)->item(0);
+	&removeNode($element) if (defined $element);
+
+	if (defined $ENV{CW_ROOT_NAME})
+		{
+		return;	# paths were converted to be relative to global source trees
+		}
+
+	my $sourcepath = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+	$sourcepath->addText("\n");
+	&textSetting($sourcepath, "Name", "EPOCROOT");
+	&textSetting($sourcepath, "Kind", "AbsolutePath");
+
+	my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+	&textElement($pathdata, "NAME", "Path"); 
+	$pathdata->addText("\n");
+
+	my $epocroot=&main::EPOCPath;
+	$epocroot =~ s/\\EPOC32\\$/\\/i;
+
+	&addRootedPath($pathdata, 1, $epocroot);
+
+	$sourcepath->appendChild($pathdata);
+	$node->appendChild($sourcepath);
+
+	my $mmproot = &main::Path_Split('Path',$MmpFile);
+	my $sourcepath2 = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+	$sourcepath2->addText("\n");
+	&textSetting($sourcepath2, "Name", "MMPDir");
+	&textSetting($sourcepath2, "Kind", "AbsolutePath");
+
+	my $pathdata2 = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+	&textElement($pathdata2, "NAME", "Path"); 
+	$pathdata2->addText("\n");
+	&addRootedPath($pathdata2, 1, $mmproot);
+
+	$sourcepath2->appendChild($pathdata2);
+	$node->appendChild($sourcepath2);
+
+}
+
+sub addUserSearchPaths($) {
+	my ($node) = @_;
+
+	my @elements = $node->getElementsByTagName("SETTING",0);
+	foreach (@elements)
+		{
+		&removeNode($_);
+		}
+
+	my %ordereddirs;
+	my @ordereddirlist=();
+	foreach my $dir (&main::UserIncPaths)
+		{
+		next if (!defined $dir);
+		$dir = &main::Path_Chop($dir)."\\";
+		my $key = uc $dir;
+		if (! defined($ordereddirs{$key}))
+			{
+			$ordereddirs{$key}=1;
+			push @ordereddirlist, $dir;
+			}
+		}
+
+	# now add the directories used to find source files
+	
+	my %dirs;
+	my $SourceStructRef=&main::SourceStructRef;
+	foreach my $SourceRef (@$SourceStructRef)
+		{
+		 $dirs{$$SourceRef{SrcPath}}=1;
+		}
+	my $DefFile = &main::DefFile;
+	if ($DefFile)
+		{			
+		$DefFile = &main::Path_Split('Path',$DefFile);
+		$dirs{$DefFile}=1;
+		}
+
+	my $MmpFilePath = &main::Path_Split('Path',$MmpFile);
+	$dirs{$MmpFilePath}=1;
+		
+	$dirs{$ExtraFilesPath}=1;
+		
+
+	foreach my $srcdir (sort keys %dirs)
+		{
+		if (!defined($ordereddirs{uc $srcdir}))
+			{
+			push @ordereddirlist, $srcdir;
+			}
+		}
+		
+	foreach my $srcdir (@ordereddirlist)
+		{
+		my $accesspath = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		$accesspath->addText("\n");
+		my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		&textElement($pathdata, "NAME", "SearchPath"); 
+		$pathdata->addText("\n");
+		&addRootedPath($pathdata, 0, $srcdir);
+
+		$accesspath->appendChild($pathdata);
+		&textSetting($accesspath, "Recursive", "false");
+		&textSetting($accesspath, "FrameworkPath", "false");
+		&textSetting($accesspath, "HostFlags", "All");
+		$node->appendChild($accesspath);
+		}
+}
+
+sub addSystemSearchPaths($) {
+	my ($node) = @_;
+
+	my @elements = $node->getElementsByTagName("SETTING",0);
+	foreach (@elements)
+		{
+		&removeNode($_);
+		}
+
+	my $ASSPLinkPath;
+	$ASSPLinkPath = &main::ASSPLinkPath if (&main::ASSPLibList);
+
+	my @extraIncPaths=();
+	push @extraIncPaths, $ArmIncDir if $ArmIncDir;
+
+	my %ordereddirs;
+	my @ordereddirlist=();
+	
+	foreach my $dir (&main::SysIncPaths, @extraIncPaths, &main::StatLinkPath, $ASSPLinkPath, &main::LinkPath)
+		{
+		next if (!defined $dir);
+		$dir = &main::Path_Chop($dir)."\\";
+		my $key = uc $dir;
+		if (! defined($ordereddirs{$key}))
+			{
+			$ordereddirs{$key}=1;
+			push @ordereddirlist, $dir;
+			}
+		}
+
+	my %dirs;
+
+	if ($VariantFile)
+		{
+		my $VariantFilePath = &main::Path_Split('Path',$VariantFile);
+		$dirs{$VariantFilePath}=1;
+		}
+
+	if (((&main::Plat =~ /^ARMV5/) || (&main::Plat =~ /^GCCE$/) ||(IsCustomization(&main::Plat))) && $PrefixFile) 
+		{
+		my $PrefixFilePath = &main::Path_Split('Path',$PrefixFile);
+		$dirs{$PrefixFilePath}=1;
+		}
+
+	foreach my $srcdir (sort keys %dirs)
+		{
+		if (!defined($ordereddirs{uc $srcdir}))
+			{
+			push @ordereddirlist, $srcdir;
+			}
+		}
+		
+	foreach my $srcdir (@ordereddirlist)
+		{
+		my $accesspath = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		$accesspath->addText("\n");
+		my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		&textElement($pathdata, "NAME", "SearchPath"); 
+		$pathdata->addText("\n");
+		&addRootedPath($pathdata, 0, $srcdir);
+
+		$accesspath->appendChild($pathdata);
+		&textSetting($accesspath, "Recursive", "false");
+		&textSetting($accesspath, "FrameworkPath", "false");
+		&textSetting($accesspath, "HostFlags", "All");
+		$node->appendChild($accesspath);
+		}
+	
+	if (&main::Plat =~ /^WINSCW$/)
+	{
+ 		my $lpath;
+ 		foreach $lpath (@CW_librarypath)
+ 		{
+ 			# only add Win32 SDK for WINSCW system access paths	
+ 			my $accesspath = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+ 			$accesspath->addText("\n");
+ 			my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+ 			&textElement($pathdata, "NAME", "SearchPath"); 
+ 			$pathdata->addText("\n");
+ 			
+ 			&textSetting($pathdata, "Path", $lpath);
+ 			&textSetting($pathdata, "PathFormat", "Windows");
+ 			&textSetting($pathdata, "PathRoot", "CodeWarrior");
+ 			$accesspath->appendChild($pathdata);
+ 			&textSetting($accesspath, "Recursive", "false");
+ 			&textSetting($accesspath, "FrameworkPath", "false");
+ 			&textSetting($accesspath, "HostFlags", "All");
+ 			$node->appendChild($accesspath);
+ 		}
+	}
+	if ($CustPlat{'CUSTOMIZES'} && ($CustPlat{'ROOTPLATNAME'} eq "GCCE"))
+	{
+		$CustGCCE=1;
+	}
+	if (&main::Plat =~ /^GCCE$/ || $CustGCCE)
+	{
+		my $accesspath = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		$accesspath->addText("\n");
+		my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		&textElement($pathdata, "NAME", "SearchPath"); 
+		$pathdata->addText("\n");
+		
+		my $GCCE_IncludePath = GetGCCELibPath("-print-libgcc-file-name");
+		$GCCE_IncludePath .= '\\include';
+		&textSetting($pathdata, "Path", $GCCE_IncludePath);
+		
+		&textSetting($pathdata, "PathFormat", "Windows");
+		&textSetting($pathdata, "PathRoot", "Absolute");
+		$accesspath->appendChild($pathdata);
+		&textSetting($accesspath, "Recursive", "false");
+		&textSetting($accesspath, "FrameworkPath", "false");
+		&textSetting($accesspath, "HostFlags", "All");
+		$node->appendChild($accesspath);
+	}
+	
+}
+
+sub addDownloadFileList($) {
+	my ($node, @DownloadList) = @_;
+	
+	my @elements = $node->getElementsByTagName("SETTING",0);
+	foreach (@elements)
+		{
+		&removeNode($_);
+		}
+
+	my $epocdata = &main::EPOCPath . "data\\";
+	foreach my $srcfile (@DownloadList)
+		{
+		my $targetpath = $srcfile;
+		$targetpath =~ s/^Z\\/C:\\/i;
+		
+		my $download = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		$download->addText("\n");
+		my $pathdata = new XML::DOM::Element($xmlProjectDoc,"SETTING");
+		&textElement($pathdata, "NAME", "HostFilePath"); 
+		$pathdata->addText("\n");
+		&addRootedPath($pathdata, 0, "$epocdata$srcfile");
+
+		$download->appendChild($pathdata);
+		&textSetting($download, "TargetFilePath", $targetpath);
+		$node->appendChild($download);
+		}
+	}
+
+sub kitRelativePath ($) {
+	my ($kitRootBasedPath) = @_;
+		
+	my $kitRoot = &main::EPOCPath;
+	$kitRoot =~ s/EPOC32\\$//i;
+	$kitRoot = quotemeta (&main::Path_Chop($kitRoot));
+
+	$kitRootBasedPath =~ s/^$kitRoot//i;
+
+	$kitRootBasedPath;
+}
+	
+sub PMBld() {
+
+	my %changedsettings;
+
+	my $ABI=&main::ABI;
+	my $Bld=&main::Bld;
+	my $Plat=&main::Plat;
+	my $BaseName=&main::BaseMak;
+	my @SrcList=&main::SrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my $DefFile=&main::DefFile;
+	my $FirstLib=&main::FirstLib;
+	# IsCustomDllUseCase() subroutine is called to check if the given executable 
+	# is a custom dll or not.
+	my $IsCustomDll = Cl_bpabi::IsCustomDllUseCase();
+	# ABI flags set depending on the ENABLE_ABIV2_MODE macro set in the variant file.
+	my $ABIV1 = 0;
+	my $ABIV2 = 0;
+	if (($Plat eq "ARMV5_ABIV1" && $cfgMacro) || ($Plat eq "ARMV5" && !$cfgMacro)
+	|| ($CustPlat{'CUSTOMIZES'} 
+	&& (($CustPlat{'ROOTPLATNAME'} eq "ARMV5_ABIV1" && $cfgMacro) || ($CustPlat{'ROOTPLATNAME'} eq "ARMV5" && !$cfgMacro))))
+	{
+		$ABIV1=1;
+	}
+	elsif (($Plat eq "ARMV5_ABIV2" && !$cfgMacro) || ($Plat eq "ARMV5" && $cfgMacro)
+	|| ($CustPlat{'CUSTOMIZES'} 
+	&& (($CustPlat{'ROOTPLATNAME'} eq "ARMV5_ABIV2" && !$cfgMacro) || ($CustPlat{'ROOTPLATNAME'} eq "ARMV5" && $cfgMacro))))
+	{
+		$ABIV2=1;
+	}
+	
+	if ($CustPlat{'CUSTOMIZES'} && ($CustPlat{'ROOTPLATNAME'} eq "GCCE"))
+	{
+		$CustGCCE=1;
+	}
+
+ 	if ($ABIV1 && ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2)) {
+	        # Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+		# Rename FirstLib.lib static lib used with RVCT2.1 as FirstLib2_1.lib
+		if ($FirstLib=~/^\s*(\S+)(\.lib)$/io) {
+		        if ($1!~/$RVCTVersion/i) {
+				$FirstLib=$1.$RVCTVersion.".lib";
+			}
+		}
+	}	
+
+	my $BasicTrgType=&main::BasicTrgType;
+	my @LibList;
+	my @StatLibList=&main::StatLibList;
+	if ($ABIV1 && ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2)) {
+	        # Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+		# Rename all the static libs used with RVCT2.1 as libname2_1.lib
+		for (my $i =0; $i < scalar(@StatLibList); $i++) {
+		        if ($StatLibList[$i]=~/^\s*(\S+)(\.lib)$/io) {
+			        if ($1!~/$RVCTVersion/i) {
+				        $StatLibList[$i]=$1.$RVCTVersion.".lib";
+				}
+			}
+		}
+	}
+	
+
+	my @ASSPLibList = &main::ASSPLibList;
+	my $Trg=&main::Trg;
+	if ($ABIV1 && ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2)) {
+		if ($BasicTrgType=~/^LIB$/o) {
+			# Temporary Workaround for RVCT2.1 static libs problem with RVCT2.2 builds
+			# Rename all the static libs produced with RVCT2.1 as {libname}2_1.lib
+		        if ($Trg=~/^\s*(\S+)(\.lib)$/io) {
+			        if ($1!~/$RVCTVersion/i) {
+				        $Trg=$1.$RVCTVersion.".lib";
+				}
+			}
+			if ($BaseTrg!~/$RVCTVersion/i) {
+			        $BaseTrg .= $RVCTVersion;
+			}
+		}
+	}
+
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	my $epocroot=&main::Path_Drive . &main::EPOCPath;
+	$epocroot =~ s/EPOC32\\$//i;
+	my $UIDFile;
+
+	$ExtraFilesPath = &main::MakeFilePath;
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+	my $xmlTarget;
+	if ($ABI =~ /BPABI/)
+	{
+		$ABI = "GCCE";
+	}
+	
+	if ($Plat eq "GCCE" || $CustGCCE || $ABIV2) {
+	
+		if ($CW_major_version < 3.1) {
+			die "FATAL ERROR: Target $Plat requires CodeWarrior for Symbian release 3.1 at minimum.\n";
+		}
+	}
+	
+	if ($ABIV2 && ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2))
+	{
+		die "FATAL ERROR: Target ARMV5_ABIV2 requires RVCT version 2.2 and greater. Detected RVCT $RVCTMajorVersion.$RVCTMinorVersion.\n";
+	}
+	
+	if (($RVCTMajorVersion == 2 && $RVCTMinorVersion >= 2) && $CW_major_version < 3.1 && $ABIV2)
+	{
+		die "FATAL ERROR: Detected RVCT Version $RVCTMajorVersion.$RVCTMinorVersion and CodeWarrior version $CW_major_version. RVCT 2.2 and greater requies CodeWarrior version 3.1 at minimum.\n";
+	}
+	
+    $xmlTarget = findTarget($BaseName, "$Plat $Bld", "$ABI $Bld");
+		
+	return if (!defined($xmlTarget));
+	
+	my $targetname = $xmlTarget->getAttribute("NAME");
+
+	my $UnderlyingABI=PMUnderlyingABI($ABI);
+	my @ChopRTWSysIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::SysIncPaths));
+	my @ChopRTWUserIncPaths=&main::Path_Chop(&main::Path_RltToWork(&main::UserIncPaths));
+	my $EPOCPath=&main::EPOCPath;
+	my $LinkAs=&main::LinkAs;
+	my $LibPath=&main::LibPath;
+	my @UidList=&main::UidList;	
+	my $WarningLevelGCC=&main::CompilerOption("GCC");
+	my $ExportLibrary=&main::ExportLibrary;
+	my $NoExportLibrary=&main::NoExportLibrary;
+	my $SystemTrg = SystemTarget();
+	my %Version = &main::Version();
+	my $ExtraExportLibrary;
+	my $PrimaryExportLibrary = $ExportLibrary;
+	unless ($Version{explicit}) {
+		$ExtraExportLibrary = $ExportLibrary;
+		$ExtraExportLibrary =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+		$PrimaryExportLibrary = $ExtraExportLibrary;
+	}
+
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $EPOCIncPath=&main::EPOCIncPath;
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $RelPath=&main::RelPath;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $ParentPlat;
+	
+# 	Check if a platform is customization, if yes find the parent platform.
+	my $IsPlatCustomization=IsCustomization($Plat);
+	if ($IsPlatCustomization) {
+		$ParentPlat = Plat_Customizes($Plat);
+	}
+	
+	my @RTLibList;
+	if ($ABIV1) {
+	    @RTLibList = ('dfpaeabi.lib', "dfprvct${RVCTVersion}.lib", 'drtaeabi.lib', 'drtaeabi.lib(VtblExports.o)');
+	    if ($RVCTMajorVersion == 2 && $RVCTMinorVersion >= 2) {
+		# The scppnwdl.lib should come before drtrvct2_2.lib
+		push @RTLibList, "scppnwdl.lib";
+		push @RTLibList, "drtrvct${RVCTVersion}.lib";
+	    }
+	    else
+	    {
+		push @RTLibList, "dfprvct${RVCTVersion}-thunk.lib";
+		push @RTLibList, "drtrvct${RVCTVersion}.lib";
+	    }    
+	}
+	elsif ($ABIV2)
+	{
+		@RTLibList = ('drtaeabi.dso', 'dfpaeabi.dso', "dfprvct${RVCTVersion}.dso");
+	    if ($RVCTMajorVersion == 2 && $RVCTMinorVersion >= 2) {
+		# The scppnwdl.lib should come before drtrvct2_2.lib
+		push @RTLibList, "scppnwdl.dso";
+		push @RTLibList, "drtrvct${RVCTVersion}.dso";
+	    }
+	}
+	
+	my @compatibleDOCUMENTExtensions = ("cfg", "h", "hrh", "iby", "inf", "ini", "loc", "mmpi", "policy", "ra", "rh", "rls", "rss", "script", "txt");
+	my @DocList = &main::DocList;
+	@addedFiles=();
+
+
+#	set up LinkAs
+	$UidList[2]=~/^0x(.*)$/o;
+	if ($1 ne '00000000') { # have to make sure than series of noughts in brackets doesn't appear in name for null uids
+		$LinkAs=join '', &main::Path_Split('Base',$LinkAs),"[$1]",&main::Path_Split('Ext',$LinkAs);
+	}
+
+#	set up dlltool flag hash
+	my %ABIDlltool=(
+		ARMI=>'-m arm_interwork',
+		ARM4=>'-m arm',
+		THUMB=>'-m thumb'
+	);
+
+#	work out the flags for various platforms
+	if ($ABI eq 'ARMI') {
+		$PlatOpt{Gcc}='-march=armv4t -mthumb-interwork';
+		$PlatOpt{Dlltool}=$ABIDlltool{ARMI};
+	}
+	elsif ($ABI eq 'ARM4T') {
+		if (&main::BuildAsARM) {
+			$PlatOpt{Gcc}='-march=armv4t -mthumb-interwork';
+			$PlatOpt{Dlltool}=$ABIDlltool{ARMI};
+		}
+		elsif ($SystemTrg) {
+			$PlatOpt{Gcc}='-march=armv4';
+#			allow thumb for ARM4 ABI where necessary
+			unless (&main::PlatABI eq 'ARM4') {
+				$PlatOpt{Gcc}.='t';
+			}
+			$PlatOpt{Dlltool}=$ABIDlltool{ARM4};
+		}
+		else {
+			$PlatOpt{Gcc}='-mthumb-interwork -D__MARM_THUMB__';
+			$PlatOpt{Dlltool}=$ABIDlltool{THUMB};
+		}
+	}
+	elsif ($ABI eq 'ARM4') {
+		$PlatOpt{Gcc}='-march=armv4';
+#		allow thumb for ARM4 ABI where necessary
+		unless (&main::PlatABI eq 'ARM4') {
+			$PlatOpt{Gcc}.='t';
+		}
+		$PlatOpt{Dlltool}=$ABIDlltool{ARM4};
+	}
+	elsif ($ABI eq 'THUMB') {
+		$PlatOpt{Gcc}='-mthumb-interwork';
+		$PlatOpt{Dlltool}=$ABIDlltool{THUMB};
+	}
+	
+	elsif ($Plat ne 'WINSCW' && $Plat ne 'ARMV5' && !$IsPlatCustomization && $Plat ne 'GCCE' && $Plat ne 'ARMV5_ABIV2' && $Plat ne 'ARMV5_ABIV1') { 
+		&main::FatalError("Platform module - ABI \"$ABI\" unrecognised");
+	}
+	
+	if ($Plat ne 'WINSCW') {
+		@CompatibleABIs=@{$CompatibleABIs{$UnderlyingABI}};
+	}
+
+#	set up CompatibleABI lib path hash
+	foreach (@CompatibleABIs) {
+		$ABILibPath{$_}=&main::Path_Strip("$LibPath..\\..\\$_\\");
+	}
+
+	$Dlltool=$ToolPrefix.'dlltool.exe';
+	$Archive=$ToolPrefix.'ar.exe';
+	$Link=$ToolPrefix.'ld.exe';
+	$Objcopy=$ToolPrefix.'objcopy.exe';
+
+	my $WarningLevelCW=&main::CompilerOption("CW");
+
+	$xmlFileList = newList($xmlTarget,"FILELIST",1);
+	$xmlFileList->addText("\n");
+
+	$xmlLinkOrder = newList($xmlTarget,"LINKORDER",1);
+	$xmlLinkOrder->addText("\n");
+
+	# Create temporary sublists, which will be
+	# removed during finaliseProject
+
+	$xmlSourceGroup = newList($xmlTarget,"SOURCEGROUP",0);
+	$xmlSourceGroup->setAttribute("TARGET", $targetname);
+	$xmlSourceGroup->addText("\n");
+
+	$xmlHeadersGroup = newList($xmlTarget,"HEADERSGROUP",0);
+	$xmlHeadersGroup->setAttribute("TARGET", $targetname);
+	$xmlHeadersGroup->addText("\n");
+
+	$xmlRootGroup = newList($xmlTarget,"ROOTGROUP",0);
+	$xmlRootGroup->setAttribute("TARGET", $targetname);
+	$xmlRootGroup->addText("\n");
+		
+	$xmlLinkGroup = newList($xmlTarget,"LINKGROUP",0);
+	$xmlLinkGroup->setAttribute("TARGET", $targetname);
+	$xmlLinkGroup->addText("\n");
+
+	$xmlLibGroup = newList($xmlTarget,"LIBGROUP",0);
+	$xmlLibGroup->setAttribute("TARGET", $targetname);
+	$xmlLibGroup->setAttribute("PLAT", $Plat);
+	$xmlLibGroup->addText("\n");
+
+	$xmlResourcesGroup = newList($xmlTarget,"RESOURCESGROUP",0);
+	$xmlResourcesGroup->setAttribute("TARGET", $targetname);
+	$xmlResourcesGroup->addText("\n");
+
+	$xmlDocumentsGroup = newList($xmlTarget,"DOCUMENTSGROUP",0);
+	$xmlDocumentsGroup->setAttribute("TARGET", $targetname);
+	$xmlDocumentsGroup->addText("\n");
+
+	my $debug="";
+	$debug="Debug" if ($Bld =~ /DEB$/);
+
+	my @RuntimeLibs = ();	# add platform-specific runtime libraries here
+	if (&main::PlatCompiler eq "GCC32")
+		{
+		if ($BasicTrgType=~/^DLL$/o) 
+			{ # Add the DLL stub library
+			push @RuntimeLibs, "EDLLSTUB.LIB";
+			}
+		if ($BasicTrgType=~/^(DLL|EXE)/o) 
+			{ # Add the GCC helper fns
+			push @RuntimeLibs, "EGCC.LIB";
+			}
+		}
+	
+	if ($Plat eq "GCCE" || $CustGCCE)
+		{
+			push @RuntimeLibs, "usrt2_2.lib";    # UDEB/UREL Specific
+			push @RuntimeLibs, "dfpaeabi.dso";
+			push @RuntimeLibs, "dfprvct2_2.dso";
+			push @RuntimeLibs, "drtaeabi.dso"; 
+			push @RuntimeLibs, "scppnwdl.dso"; 
+			push @RuntimeLibs, "drtrvct2_2.dso";
+			if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+				push @RuntimeLibs, "EDLLSTUB.LIB";   # UDEB/UREL Specific
+				}
+		}
+
+	addFile(&main::Path_Split('File',$MmpFile), "Text", "", "", "Root");
+
+	# Create the uid.cpp file	
+	if ($Plat eq "WINSCW" && $BasicTrgType=~/^(EXE|DLL)$/oi)
+		{
+		my @UidList=&main::UidList;
+		
+		# create the UID source file
+		my $priority = "EPriorityForeground";
+		if (&main::ProcessPriority) {
+			$priority="EPriority".&main::ProcessPriority;
+		}
+
+		my $UidText=join(
+			"\n",
+			'// Makmake-generated uid source file',
+			'#include <e32cmn.h>',
+			'#pragma data_seg(".SYMBIAN")',
+			'__EMULATOR_IMAGE_HEADER2('
+		);
+		foreach (@UidList) {
+			$UidText.="$_,";
+		}
+		my $vstr = "0x".&Genutl_VersionToHexString(&main::Version);
+		my $vid = &main::VendorId;
+		if(!$vid) { $vid="0"; }
+		$UidText.="$priority,".(&main::CapabilityFlags)[0]."u,".(&main::CapabilityFlags)[1]."u,".&main::SecureId.",".$vid.",$vstr,";	# second capability word always 0 for now
+		if (&main::AllowDllData) {
+			$UidText.="1,";
+		} else {
+			$UidText.="0,";
+		}
+		chop $UidText;
+		$UidText.=")\n";
+		$UidText.="#pragma data_seg()\n";
+
+		$UIDFile = $BaseTrg.'_UID_.cpp';
+		&main::CreateExtraFile("${ExtraFilesPath}$UIDFile", $UidText);
+		}
+
+
+	if (-e $DefFile)
+		{
+		addFile(&main::Path_Split('File',$DefFile), "Text", "", &main::DefFileType."\\");
+		}
+
+	# Add resources: rsc files, mbm files and aif files
+
+	my $mmpdir = &main::Path_Split('Path',$MmpFile);
+	$changedsettings{"SymbianResourcesMMPFileLocation"} = "{0}$mmpdir";
+	my $ResourcesText="";
+	my @ResourceDownloadList=();
+	
+	# --- MBM files
+	
+	my $BitMapStructRef = &main::BitMapStructRef();
+	my $BitMapRef;
+	
+	foreach my $BitMapRef (@$BitMapStructRef) {
+		my $trgfile = $$BitMapRef{Trg};
+# change - only use colour resource files
+		next if ($trgfile =~ /\.MBW$/i);	# ignore greyscale MBM files
+		$trgfile =~ s/\.MCL$/.MBM/;			# convert MCL to MBM for immediate use
+		my $entry = "  <mbm targetfile = \"$trgfile\"";
+		$entry .= " targetpath = \"".&main::Path_Chop($$BitMapRef{TrgPath})."\"";
+		push @ResourceDownloadList, $$BitMapRef{TrgPath}.$trgfile;
+		if (defined $$BitMapRef{Hdr})
+			{
+			$entry .= " header = \"true\"";
+			}
+		else
+			{
+			$entry .= " header = \"false\"";
+			}
+		$entry .= ">\n";
+		foreach my $SrcRef (@{$$BitMapRef{Source}}) {
+			$entry .= "    <bmp bpp = \"$$SrcRef{ClDepth}\"";
+			my $bmpfile = &main::Path_Split('File',$$SrcRef{Src});
+			my $bmppath = &main::Path_Split('Path',$$SrcRef{Src});
+			my $sourcepath = &main::Path_Chop(&main::Path_MakeRltToBase($mmpdir,$bmppath));
+			$entry .= " sourcepath = \"$sourcepath\"";
+			$entry .= " sourcefile = \"$bmpfile\"/>\n";
+		}
+		$ResourcesText .= $entry . "  </mbm>\n";
+	}
+	
+	# --- AIF files
+
+	my $AifStructRef = &main::AifStructRef();
+	my $AifRef;
+
+	foreach $AifRef (@$AifStructRef) {
+# regression change - workaround lack of AIF directory
+		my $trgpath=&main::TrgPath;
+		my $trgfile=&main::Path_Split('File',$$AifRef{Trg});
+		my $path=&main::Path_Split('Path',"$trgpath$$AifRef{Trg}");
+		$path=&main::Path_Chop($path);  
+# change - only use colour resource files
+		next if ($trgfile =~ /\.ABW$/i);	# ignore greyscale AIF files
+		$trgfile =~ s/\.ACL$/.AIF/;			# convert ACL to AIF for immediate use
+ 		my $rssfile = &main::Path_Split('File',$$AifRef{Source});
+ 		my $rsspath = &main::Path_Split('Path',$$AifRef{Source});
+ 		my $sourcepath=&main::Path_Chop(&main::Path_MakeRltToBase($mmpdir,$rsspath));
+ 		my $entry = "  <aif sourcefile = \"$rssfile\"";
+   		$entry .= " sourcepath = \"$sourcepath\"";
+   		$entry .= " targetfile = \"$trgfile\" targetpath = \"$path\">\n";
+   		push @ResourceDownloadList, "$path\\$trgfile";
+ 		foreach my $BitmapRef (@{$$AifRef{BitMaps}}) {
+ 			$entry .= "    <bmp bpp = \"$$BitmapRef{ClDepth}\"";
+ 			my $bmpfile = &main::Path_Split('File',$$BitmapRef{Src});
+ 			my $bmppath = &main::Path_Split('Path',$$BitmapRef{Src});
+ 			$sourcepath = &main::Path_Chop(&main::Path_MakeRltToBase($mmpdir,$bmppath));
+ 			$entry .= " sourcepath = \"$sourcepath\"";
+ 			$entry .= " sourcefile = \"$bmpfile\"/>\n";
+		}
+   		$ResourcesText .= $entry . "  </aif>\n";
+
+   	}
+
+	
+	# --- RSC files, which must come after .MBM files since they may use the .MBG header files
+	
+	my $ResourceStructRef=&main::ResourceStructRef;
+	my @resourcefiles;
+	my %resourcetargets;
+
+	# NOTE: An <rsc/> block is now created for each START RESOURCE blocks LANG entries.  This
+	# shouldn't be necessary as <rsc/> blocks support multiple <language/> tags, and the generation
+	# of separate localised binaries should be dealt with by the Symbian Resources IDE plugin.
+	# However, a defect in the plugin's processing of <rsc/> "targetfile" attributes means that is
+	# doesn't correctly generate separate localised binaries with per-LANG extensions.
+
+	my %headerProcessed;
+
+	foreach my $ResourceRef (@$ResourceStructRef) {
+		my $fullsource=$$ResourceRef{Source};
+		my $rssfile=&main::Path_Split('File', $fullsource);
+		my $rsspath=&main::Path_Split('Path', $fullsource);
+		my $entry = "  <rsc sourcefile = \"$rssfile\"";
+		$entry .= " targetpath = \"".&main::Path_Chop($$ResourceRef{TrgPath})."\"";
+		
+		#############################################################
+		# if CW version is 3.1 or greater, add TARGET file if present
+		# tkelly 4-May-05
+		if ($CW_major_version >= 3.1)
+		{
+			my $trgfile=&main::Path_Split('File',$$ResourceRef{Trg}); 
+			$entry .= " targetfile = \"$trgfile\"\n"; #tk
+		}
+		##############################################################
+		if ((defined $$ResourceRef{Hdr}) && (!$headerProcessed{$fullsource}))
+			{
+			$entry .= " header = \"true\"";
+			$headerProcessed{$fullsource} = 1;
+			}
+		else
+			{
+			$entry .= " header = \"false\"";
+			}
+		my $sourcepath=&main::Path_Chop(&main::Path_MakeRltToBase($mmpdir,$rsspath));
+		$entry .= " sourcepath = \"$sourcepath\">\n";
+		# ignore the UidList for now..
+		$resourcetargets{$fullsource} = $$ResourceRef{TrgPath}.&main::Path_Split('Base', $rssfile);
+
+		$entry .= "    <language id = \"$$ResourceRef{Lang}\"/>\n";
+		push @resourcefiles, $entry;
+		push @ResourceDownloadList, $resourcetargets{$fullsource}.".R".$$ResourceRef{Lang};
+	}
+
+ 	foreach my $resourceEntry (@resourcefiles) {	
+ 			$ResourcesText .= $resourceEntry . "  </rsc>\n";
+ 			}
+
+	# --- If required, generate .resources file per platform
+	
+	if ($ResourcesText ne "")
+		{
+		my $resourcesfile = "$BaseTrg$Plat.resources";
+		&main::CreateExtraFile("${ExtraFilesPath}$resourcesfile", "<resources>\n$ResourcesText</resources>\n");
+		addFile($resourcesfile, "Text", "", "", "Resources");
+		}
+		
+	# Build the rest of the file list
+
+	if ($BasicTrgType!~/^LIB$/o)
+		{
+		addFile($FirstLib, "Library", $debug, "$Bld\\");	# static library, build-specific
+		}
+	
+	my $file;
+	foreach $file (@SrcList)
+		{
+		# ensure the case of the extension is what GCC expects
+		$file =~ s/\.CPP$/.cpp/i;
+		$file =~ s/\.C$/.c/i;
+		$file =~ s/\.s$/.S/i;
+		my $srcfile=&main::Path_Split('File',$file);
+		addFile($srcfile, "Text", $debug, "");
+		}
+
+	# If required, add the uid.cpp file so that it appears after all other source files in the link order
+	if (defined $UIDFile)
+		{
+		addFile($UIDFile, "Text", "", "");
+		}
+	
+	if ($Plat ne "GCCE" && !$CustGCCE)
+	{
+	# linking with GCCE, Runtime libs need to be at the end to match with make, otherwise evalid can fail.
+	foreach $file (@RuntimeLibs)
+		{
+		next if ( $file eq $FirstLib );		#skip if file equals FirstLib.
+		addFile($file, "Library", $debug, "$Bld\\"); # static library, build specific
+		}
+	}
+				
+	foreach $file (@StatLibList)
+		{
+		next if ( $file eq $FirstLib );		#skip if file equals FirstLib.
+		addFile($file, "Library", $debug, "$Bld\\"); # static library, build specific
+		}
+	foreach $file (@ASSPLibList, @LibList)
+		{
+		next if ( $file eq $FirstLib );		#skip if file equals FirstLib.
+		if ($Plat eq "GCCE" or $ABIV2 or $CustGCCE) {
+			$file =~ s/\.LIB$/.DSO/;
+			$file =~ s/\.lib$/.dso/;
+			}
+		addFile($file, "Library", $debug, "");
+		}
+		
+	if ($Plat eq "GCCE" || $CustGCCE)
+	{
+		foreach $file (@RuntimeLibs)
+		{
+			next if ( $file eq $FirstLib );		#skip if file equals FirstLib.
+			
+			#change to prevent multiple libs being listed when they are shared between targets.
+			if ($file eq "usrt2_2.lib" || $file eq "EDLLSTUB.LIB") {
+				addFile($file, "Library", $debug, "$Bld\\"); # static library, build specific
+			}
+			else {
+				addFile($file, "Library", $debug, ""); # static library, build non-specific
+			}
+		}
+	}
+		
+	if ($Plat eq "WINSCW")
+		{
+		my $defaults = $ENV{'MWSym2LibraryFiles'};
+		# look out for paths?
+		foreach $file (@Win32LibList)
+			{
+			# skip default libs and FirstLib
+			next if ( ($defaults =~ /;$file/) || ($file eq $FirstLib) );
+			addFile($file, "Library", $debug, "");
+			}
+		}
+
+	
+	# Update the project settings
+
+	$changedsettings{"UserSourceTrees"} = "{}";
+	$changedsettings{"UserSearchPaths"} = "{}";
+	$changedsettings{"SystemSearchPaths"} = "{}";
+	$changedsettings{"Targetname"} = $targetname;
+
+	my $outputdir = $RelPath;
+	if ($Plat eq "WINSCW")
+		{
+		my $trgpath = &main::TrgPath;
+		&Winutl_AdjustTargetPath(\$trgpath);
+		$outputdir .= $trgpath;
+		}
+	$changedsettings{"OutputDirectory"} = "{1}".&main::Path_Chop($outputdir);
+	$changedsettings{"SymbianInstallationContentSearchLocation"} = "{0}".&main::Path_Chop($RelPath);
+
+	$changedsettings{"SymbianResourcesHeaderFileOutputLocation"} = "{0}".&main::Path_Chop(&main::EPOCIncPath());
+	if ($Plat eq "WINSCW")
+		{
+		$changedsettings{"SymbianResourcesBinaryOutputLocation"} = "{0}".&main::Path_Chop($RelPath);
+		}
+	else
+		{
+		$changedsettings{"SymbianResourcesBinaryOutputLocation"} = "{0}".&main::Path_Chop(&main::EPOCDataPath());
+		}
+		
+	if ($Plat eq "WINSCW")
+		{
+		if ($TrgType eq "EXE")
+			{	
+			# IDE would do the right thing, but we might as well make sure...
+			$changedsettings{"MWRuntimeSettings_HostApplication"} = "{0}$outputdir$Trg";
+			}
+		else
+			{
+			$changedsettings{"MWRuntimeSettings_HostApplication"} = "{0}${RelPath}epoc.exe";
+			}
+		}
+
+
+	$changedsettings{"SymbianEpocToolsPath"} = "{0}${epocroot}";
+
+	if ($Plat ne "WINSCW")
+		{
+		my $downloadpath = &main::TrgPath;
+		if (&main::EPOCSecurePlatform && $downloadpath !~ /^Z\\sys\\bin\\/)
+			{
+			my @hrhMacros = &Variant_GetMacroList;
+			if (grep /^SYMBIAN_IGNORE_BIN_TARGETPATH\s*$/, @hrhMacros)
+				{
+				$downloadpath = "Z\\sys\\bin\\";
+				}
+			}
+		$downloadpath =~ s/^Z\\/C:\\/i;
+		$changedsettings{"DownloadPath"} = $downloadpath;
+		$changedsettings{"FileList"} = "{}";
+		}
+
+	my @MacroList;
+
+	@MacroList = &main::MacroList();			
+		
+	push @MacroList, "__${Plat}__" if ($Plat ne $ABI);
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__" if ($Plat eq "WINSCW");
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__" if (($Plat eq "ARMV5") || ($Plat eq "ARMV5_ABIV2") || ($Plat eq "ARMV5_ABIV1") || ($Plat eq "GCCE") || $IsPlatCustomization);
+
+	# Symbian Compiler Panel
+			
+	my $compiler="";
+	my $compilerargs="";
+	my $macros="";
+
+	if ((($Plat eq "ARMV5") || ($Plat eq "ARMV5_ABIV2") || ($Plat eq "ARMV5_ABIV1") || ($Plat eq "GCCE") || $IsPlatCustomization) && $VariantFile)
+		{
+		push @MacroList, '__PRODUCT_INCLUDE__=\\"'.&main::Path_Split('File',$VariantFile).'\\"' if $VariantFile;
+		}
+
+	foreach (@MacroList)
+		{
+		$_ =~ s/\s+$//;
+		$_ =~ s/^\s+//;
+		$macros .= "$_,";
+		}
+
+###############################
+# WINSCW compilation settings #
+###############################
+
+	if ($Plat eq "WINSCW")
+		{
+		$compiler = "WINSCW";
+		$compilerargs .= "-wchar_t off -align 4 -warnings on -w nohidevirtual, nounusedexpr -msgstyle gcc -enum int -str pool ";
+		$compilerargs .= "-exc ms ";
+		$compilerargs .= "-trigraphs on ";
+
+		if ($Bld =~ /DEB/)
+			{
+			$compilerargs .= "-O0 ";
+
+			# euser change to apply inlining on the _NAKED functions
+			if ($BaseTrg !~ /^EUSER$/oi)
+				{
+				$compilerargs .= "-inline off ";
+				}
+			}
+		else
+			{
+			$compilerargs .= "-O4,s ";
+			}
+			
+		if ($Win32StdHeaders || $Win32Resrc ) 
+			{
+			$macros .= "WIN32,_WINDOWS,";
+			# Callisto defect workaround
+			# NOTE: persisting with this for consistency
+			$compilerargs .= "-stdinc ";
+			}
+		else
+			{
+			$compilerargs .= "-nostdinc ";
+			}
+				
+		$compilerargs .= &main::CompilerOption("CW");
+		$changedsettings{"Macros"} = $macros;
+		if ($VariantFile)
+			{
+			$changedsettings{"PrefixFile"} = &main::Path_Split('File',$VariantFile);
+			}			
+		}
+
+#############################
+# RVCT compilation settings #
+#############################
+		
+	elsif ((($Plat eq "ARMV5") || ($Plat eq "ARMV5_ABIV2") || ($Plat eq "ARMV5_ABIV1") || $ABIV1 || $ABIV2) && ($CW_major_version >= 3)) #|| $IsPlatCustomization
+		{
+		
+		if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+			$changedsettings{"CompilerXMLDescriptor"} = "ARM RVCT";
+		}
+		else {
+			if(($CW_major_version == 3))
+			{ 
+				$changedsettings{"CompilerXMLDescriptor"} = "ARM RVCT";
+			}
+			else
+			{
+				# RVCT 2.2
+				$changedsettings{"CompilerXMLDescriptor"} = "ARM RVCT2_2";
+			}
+		}	
+		if ($Bld =~ /REL$/)
+			{
+				$compilerargs .= $configdata{"REL_OPTIMISATION"}." ".$configdata{"RUNTIME_SYMBOL_VISIBILITY_OPTION"}.$CCUREL;		
+			}
+		else
+			{
+			unless (&main::SrcDbg)
+				{
+					$compilerargs .= $configdata{"DEBUG_OPTIMISATION"}." ".$configdata{"RUNTIME_SYMBOL_VISIBILITY_OPTION"}.$CCUDEB;		
+				}
+			}
+		$changedsettings{"PrefixFile"} = &main::Path_Split('File',$PrefixFile);
+		}
+
+############################
+# GCC compilation settings #
+############################
+		
+	elsif ($Plat eq "ARM4")
+		{
+		$compiler = "ARM";
+			
+		if ($Bld =~ /REL$/)
+			{
+			$compilerargs .= "-s -fomit-frame-pointer -O "
+			}
+		else
+			{
+			unless (&main::SrcDbg)
+				{
+				$compilerargs .= "-O ";
+				}
+			}
+		
+		if ($ABI eq "ARMI")
+			{
+			$compilerargs .= "-march=armv4t -mthumb-interwork";
+			}
+		elsif ($ABI eq "ARM4T")
+			{
+			if (&main::BuildAsARM)
+				{
+				$compilerargs .= "-march=armv4t -mthumb-interwork";
+				}
+			elsif ($SystemTrg)
+				{
+				$compilerargs .= "-march=armv4";
+
+				unless (&main::PlatABI eq "ARM4")
+					{
+					$compilerargs .= "t";
+					}
+				}
+			else
+				{
+				$compiler = "THUMB";
+				$compilerargs .= "-mthumb-interwork";
+				$macros .= "__MARM_THUMB__,";
+				}
+			}
+		elsif ($ABI eq "ARM4")
+			{
+			$compilerargs .= "-march=armv4";
+
+			unless (&main::PlatABI eq "ARM4")
+				{
+				$compilerargs .= "t";
+				}
+			}
+		elsif ($ABI eq "THUMB")
+			{
+			$compiler = "THUMB";
+			$compilerargs .= "-mthumb-interwork";
+			}
+	
+		if ($VariantFile)
+			{
+			$changedsettings{"PrefixFile"} = &main::Path_Split('File',$VariantFile);
+			}
+		}
+
+############################
+# GCCE BPABI compilation settings #
+############################
+
+		
+	elsif ((($Plat eq "GCCE") || $CustGCCE)) # || $IsPlatCustomization) && ($CW_major_version >= 3)) 
+		{
+		$compiler = "ARM GCCE";
+		#Change setting CompilerXMLDescriptor is only good for CW 3.0 and greater.
+		$changedsettings{"CompilerXMLDescriptor"} = "ARM GCCE";	
+		
+		if ($Bld =~ /REL$/)
+		{
+			$compilerargs .= $configdata{"REL_OPTIMISATION"}." ".$configdata{"RUNTIME_SYMBOL_VISIBILITY_OPTION"}.$CCUREL;
+		}
+		else
+		{
+			unless (&main::SrcDbg)
+			{
+				$compilerargs .= $configdata{"DEBUG_OPTIMISATION"}." ".$configdata{"RUNTIME_SYMBOL_VISIBILITY_OPTION"}.$CCUDEB
+			}
+		}
+		$changedsettings{"PrefixFile"} = &main::Path_Split('File',$PrefixFile);
+		}
+####################
+# General settings #
+####################
+
+	$macros =~ s/,$//;
+	$compilerargs =~ s/ $//;
+
+	$changedsettings{"Compiler"} = $compiler; # in CW 3.0, "Compiler" no longer exists. This line has no effect on those versions
+	$changedsettings{"Arguments"} = $compilerargs;
+
+	# Symbian Linker Panel
+	$changedsettings{"LinkOutputFile"} = $Trg;
+	
+	if ($Plat eq "GCCE" || $CustGCCE || $ABIV2) {
+		$changedsettings{"SymbianImportLibrary"} = $ExportLibrary.'.dso';
+	}
+	else {
+		$changedsettings{"SymbianImportLibrary"} = $ExportLibrary.'.lib';
+	}
+	
+	# Template defaults for canDebug/canRun are both "true"
+	if ($Bld =~ /REL/)
+		{
+		$changedsettings{"canDebug"} = "false";
+		}
+
+	if ($Plat eq "WINSCW")
+		{
+		if ($TrgType ne "APP" && $TrgType ne "EXE" && $TrgType ne "EXEDLL" && $TrgType ne "EPOCEXE")
+			{
+			$changedsettings{"canDebug"} = "false";
+			$changedsettings{"canRun"} = "false";
+			}
+		}
+	else
+		{
+		$changedsettings{"canRun"} = "false";
+
+		if ($TrgType eq "LIB" || $TrgType eq "KLIB")
+			{
+			$changedsettings{"canDebug"} = "false";
+			}
+		}
+		
+		
+	$xmlLinkDescriptorDoc = $xmlParser->parsefile ($FindBin::Bin."\\$linkDescriptorTemplate");
+	$xmlLinkDescriptorCommandParent = $xmlLinkDescriptorDoc->getElementsByTagName("array",1)->item(0);
+
+	if ($CW_major_version >= 3)
+		{
+		$xmlLinkDescriptorSymbolParent = $xmlLinkDescriptorDoc->getElementsByTagName("array",1)->item(1);
+		$xmlLinkDescriptorDumpFileParent = $xmlLinkDescriptorDoc->getElementsByTagName("array",1)->item(2);
+		}
+	
+	my $linkDescriptorFile = "$BaseTrg$Plat$Bld.cwlink";
+
+	my $copyCommand = 'perl.exe -S ecopyfile.pl ';
+	my $deleteCommand = 'cmd.exe /C del ';
+
+	my $tempFilenameRoot = '${var:IMPORT_LIBRARY_NO_EXT}';
+
+	if ($CW_major_version < 3)
+		{
+		$tempFilenameRoot = $ExportLibrary;
+		}	
+
+	my $exportUnfrozenWarningMessage = 'Created "${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}" '.
+										'from "${target.data}\\'.$tempFilenameRoot.'.def" as EXPORTUNFROZEN specified.';
+
+
+
+############################################
+# WINSCW library generation and link stage #
+############################################
+
+	if ($Plat eq "WINSCW")
+		{
+		# Generate library
+		if ($DefFile and !$NoExportLibrary)
+			{
+			unless (&main::ExportUnfrozen)
+				{
+					my $LibLinkAs = ($BasicTrgType=~/^IMPLIB$/io) ? $LinkAs : $Trg;
+
+					$linkCommand = 'perl.exe -S prepdef.pl "${var:DEF_FILE}" "${target.data}\\'.$tempFilenameRoot.'.prep.def"';
+					addLinkDescriptorCommand ($linkCommand);
+
+					$linkCommand = 'mwldsym2.exe "${target.data}\\'.$tempFilenameRoot.'.prep.def" -importlib -o "'.
+									'${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}" -addcommand "out:'.$LibLinkAs.'" -warnings off';
+					addLinkDescriptorCommand ($linkCommand);
+				}
+			}
+
+		if ((2.8 == $CW_major_version) && (0 == $CW_minor_version))
+			{
+			# For OEM2.8, create a file containing all objects required in the link.  This is used in all
+			# calls to mwldsym2 in order to avoid exceeding the Windows command line
+			# length in projects containing a large amount of source files
+			$linkCommand ='cmd.exe /C echo ${var:LINK_OBJS}>"${target.data}\${output.file.root}.lst"';
+			addLinkDescriptorCommand ($linkCommand);
+			}
+			
+		my $stage1linkflags = "";
+		my $linkflags = "";
+		my $commonLinkFlags = '-msgstyle gcc -stdlib';
+		my $libPath = "epoc32\\release\\winscw\\".lc $Bld;
+		if ($SystemTrg){
+			$commonLinkFlags .=" ${libPath}\\scppnwdl_kern.lib";
+		}
+		else{
+			$commonLinkFlags .=" ${libPath}\\scppnwdl.lib";
+		}
+		if ($BasicTrgType=~/^(EXE|DLL)$/o) {
+					$commonLinkFlags .= ' ${var:FIRST_LIB} '
+			}
+
+		foreach my $lib (@Win32LibList)
+			{
+			my $win32lib = $lib;
+			$win32lib = "-l$win32lib" unless ($win32lib =~ /\\/);
+			$commonLinkFlags .= " ". lc $win32lib;
+			}
+
+		if ($BasicTrgType =~ /^DLL$/o || $TrgType =~ /^EXEXP$/o)
+			{
+			if ($BaseAddress ne "")
+				{
+				$commonLinkFlags .= " -imagebase $BaseAddress";
+				}
+			
+			$commonLinkFlags .= ' -noentry -shared';
+			}
+		elsif ($BasicTrgType =~ /^EXE$/o)
+			{
+			$commonLinkFlags .= ' -m "?_E32Bootstrap@@YGXXZ"';
+			}
+
+		$commonLinkFlags .= ' -subsystem windows';
+
+		if (&main::HeapSize)
+			{
+			my %HeapSize = &main::HeapSize;
+			$commonLinkFlags .= ' -heapreserve='.RoundUp1k($HeapSize{Max}).' -heapcommit='.RoundUp1k($HeapSize{Min}); 
+			}
+
+		if ($BasicTrgType =~ /^(DLL|EXE)$/o)
+			{
+			if ($Bld =~ /DEB$/o)
+				{
+				$commonLinkFlags .= ' -g';
+				}
+			}
+			
+		my $EntrySymbol='';
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o)
+			{
+			my $Include="";
+			if ($BasicTrgType=~/^DLL$/o)
+				{
+				$Include="-m __E32Dll";
+				$EntrySymbol='__E32Dll';
+				}
+			else
+				{
+				$Include="-m __E32Startup";
+				$EntrySymbol='__E32Startup';
+				}
+				
+			$stage1linkflags = $commonLinkFlags.' ${var:LIBS}'.
+				' -o "${target.data}\\${output.file.name}"'. 
+				' -export dllexport '.
+				$Include.
+				' -nocompactimportlib'. 
+				' -implib "${target.data}\\${var:IMPORT_LIBRARY}"'.
+				' -addcommand "out:${output.file.name}"'.
+				' -warnings off';
+			}
+				
+		my $AbsentSubst = "";
+		if ($EntrySymbol)
+			{
+			$AbsentSubst = " -absent $EntrySymbol";
+			}
+
+		$linkflags = $commonLinkFlags.' ${var:LIBS}'.
+			' -o "${output}\\${output.file.name}"';
+			
+		if ($Bld=~/REL$/o && $BasicTrgType!~/^LIB$/o)
+			{
+			# Generate map file for release build executables
+			$linkflags .= ' -map "${output}\\${output.file.name}.map"';
+			}
+		
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o)
+			{
+			$linkflags .= ' -f "${target.data}\\'.$tempFilenameRoot.'.def"';
+			
+			if (&main::ExportUnfrozen)
+				{
+				$linkflags .= ' -implib "${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}"'.
+					' -addcommand "out:${output.file.name}" -warnings off';
+				}
+			else
+				{
+				$linkflags .= ' -noimplib ';
+				}
+			}
+			else
+			{
+			$linkflags .= ' -noimplib ';
+			}
+
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o)
+			{
+			if (($CW_major_version >= 3) ||
+				((2.8 == $CW_major_version) && ($CW_minor_version >= 1)))
+				{
+				# For OEM2.8.1 onwards, make use of ${var:LINK_OBJS_NO_PATH} in order to reduce link
+				# command line lengths
+				$linkCommand = 'mwldsym2.exe '.$stage1linkflags.' ${var:COMMON_LINK_FLAGS} -l "${target.data}\\ObjectCode" -search ${var:LINK_OBJS_NO_PATH}';				
+				}
+			else
+				{
+				$linkCommand = 'mwldsym2.exe '.$stage1linkflags.' ${var:COMMON_LINK_FLAGS} @"${target.data}\${output.file.root}.lst"';
+				}
+
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+				
+			$linkCommand = $deleteCommand.'"${target.data}\\${output.file.name}"';
+			addLinkDescriptorCommand ($linkCommand);
+
+			my $show_options = 'names,unmangled,verbose';
+			$linkCommand = 'mwldsym2.exe -S -show only,'.$show_options.' -o "${target.data}\\'.$tempFilenameRoot.'.inf" "${target.data}\\${var:IMPORT_LIBRARY}"';
+			addLinkDescriptorCommand ($linkCommand);
+
+			$linkCommand = 'perl.exe -S makedef.pl '.$AbsentSubst.' -Inffile "${target.data}\\'.$tempFilenameRoot.'.inf"';
+			if (-e $DefFile)
+				{
+				$linkCommand .= ' -Frzfile "'.$DefFile.'"';
+				}
+				
+			my $Export;
+			my $Ordinal=1;
+			foreach $Export (&main::Exports)
+				{
+				$linkCommand .= " -$Ordinal $Export";
+				$Ordinal++;
+				}					
+
+			$linkCommand .= ' "${target.data}\\'.$tempFilenameRoot.'.def"';					
+			addLinkDescriptorCommand ($linkCommand);
+			
+			$linkCommand = $deleteCommand.'"${target.data}\\'.$tempFilenameRoot.'.inf"';
+			addLinkDescriptorCommand ($linkCommand);
+			
+			$linkCommand = $deleteCommand.'"${target.data}\\${var:IMPORT_LIBRARY}"';
+			addLinkDescriptorCommand ($linkCommand);
+			}
+
+		$linkCommand = "mwldsym2.exe ";
+
+		if ($BasicTrgType =~/^LIB$/o)
+			{
+			$linkCommand .= '-library ';
+			}
+
+		if (($CW_major_version >= 3) ||
+			((2.8 == $CW_major_version) && ($CW_minor_version >= 1)))
+			{
+			# For OEM2.8.1 onwards, make use of ${var:LINK_OBJS_NO_PATH} in order to reduce link
+			# command line lengths
+			$linkCommand .= $linkflags.' ${var:COMMON_LINK_FLAGS} -l "${target.data}\\ObjectCode" -search ${var:LINK_OBJS_NO_PATH}';	
+			}
+		else
+			{
+			$linkCommand .= $linkflags.'${var:COMMON_LINK_FLAGS} @"${target.data}\${output.file.root}.lst"';				
+			}
+
+		my $warningMessage;
+		
+		if (&main::ExportUnfrozen)
+			{
+			$warningMessage = $exportUnfrozenWarningMessage;
+			}
+
+		if ($BasicTrgType =~/^LIB$/o)
+			{				
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef, $warningMessage);
+			}
+		else
+			{
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib, $warningMessage);
+			}
+
+		if (&Winutl_CopyForStaticLinkage)
+			{
+			$linkCommand = $copyCommand.
+							'"${output}\\${output.file.name}" '.
+							'"${var:KIT_EPOCROOT}'.kitRelativePath($RelPath).'${output.file.name}"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+			}
+		}
+
+##########################################
+# RVCT library generation and link stage #
+##########################################
+
+	elsif ($ABIV1 && ($CW_major_version >= 3)) 
+		{
+		my $InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+			
+		# Generate library
+
+		if ($DefFile and !$NoExportLibrary)
+			{
+			unless (&main::ExportUnfrozen)
+				{
+				$linkCommand = 'perl.exe -S prepdef.pl "${var:DEF_FILE}" "${target.data}\\'.$tempFilenameRoot.'.prep.def"';
+				addLinkDescriptorCommand ($linkCommand);
+
+				$linkCommand = 'def2dll.bat --path="${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'\\" --bldpath="${target.data}" --import='.$tempFilenameRoot.' '.
+					'--deffile="${target.data}\\'.$tempFilenameRoot.'.prep.def" --linkAs='.$LinkAs.' '.$InterWorking;
+				addLinkDescriptorCommand ($linkCommand);
+
+				if ($ExtraExportLibrary)
+					{
+					$linkCommand = $copyCommand.'"${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}" '.
+									'"${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).$ExtraExportLibrary.'.lib"';
+					addLinkDescriptorCommand ($linkCommand,"false", "false");
+					}
+				}
+			}
+
+		return if ($BasicTrgType=~/^IMPLIB$/io);
+		
+
+		# Create custom symbols only required in RVCT builds
+		my $implibs_no_path_vtblexport = "";
+
+		foreach my $lib (@LibList)
+			{
+			$implibs_no_path_vtblexport.="$lib(VtblExports.o) ";
+			}
+
+		addLinkDescriptorSymbol ('${var:IMPLIBS_NO_PATH_VTBLEXPORT}', $implibs_no_path_vtblexport);
+
+		my $AbsentSubst = '';
+		my $EntrySymbol;
+		my $Link = '';
+
+		if ($BasicTrgType=~/^DLL$/o) {
+			$EntrySymbol = '_E32Dll';
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			$EntrySymbol = '_E32Startup';
+		}
+		if ($EntrySymbol) {
+			$AbsentSubst = " -absent $EntrySymbol";
+		}
+
+		$Link = 'armlink '.$oP.'diag_suppress 6331,6780'.$linkeropts.' ';
+
+		if ($Bld =~ /DEB$/o)
+			{
+			$Link .= ' '.$oP.'debug';
+			}
+
+
+	    # TARGET *.IN
+	    #------------
+
+		# Create "via" file containing all link objects in order to reduce link
+		# command line length
+		addLinkDescriptorDumpFile ('${var:LINK_OBJS}', '${target.data}\\${output.file.root}_'.$Bld.'_objects.via');
+		
+		if ($BasicTrgType!~/^LIB$/o) {
+			$linkCommand = $Link .' '.$oP.'partial -o ${var:COMMON_LINK_FLAGS} "${target.data}\\${output.file.root}.in" '.$oP.'via "${target.data}\\${output.file.root}_'.$Bld.'_objects.via"';
+			addLinkDescriptorCommand ($linkCommand);
+		}
+
+		# Perform link
+
+	    if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+	#		reorder the .DEF file taking frozen exports into account if there are any
+
+			$linkCommand = 'perl -S elf2inf.pl -o "${target.data}\\'.$tempFilenameRoot.'.inf" "${target.data}\\${output.file.root}.in"';
+			addLinkDescriptorCommand ($linkCommand);
+
+			$linkCommand = 'perl -S makedef.pl '.$AbsentSubst.' -Inf "${target.data}\\'.$tempFilenameRoot.'.inf"';
+
+	    	if (!$DefFile || $NoExportLibrary) {    			
+	    		$linkCommand .= ' -ignore_unfrozen_noncallable ';
+	    	}
+		if (SysTrg()) {
+	    		$linkCommand .= ' -SystemTargetType ';
+	    	}		
+		
+		    if (-e $DefFile) {	# effectively "if project frozen ..."
+		        $linkCommand .= " -Frzfile \"".'${var:DEF_FILE}'."\"";
+		    }
+		    # freeze ordinals, a maximum of 2, for polymorphic dlls
+		    my $Ordinal;
+		    my $Num=1;
+		    foreach $Ordinal (&main::Exports) {
+		    	$linkCommand .= " -$Num $Ordinal";
+			    $Num++;
+		    }
+
+		    $linkCommand.= ' "${target.data}\\'.$tempFilenameRoot.'.def"';
+		    addLinkDescriptorCommand ($linkCommand);
+    
+		    my $theDefFile = '"${target.data}\\'.$tempFilenameRoot.'.def"';
+		    $theDefFile = '"${var:DEF_FILE}"' if (-e $DefFile && !&main::ExportUnfrozen);
+
+			$linkCommand = 'def2dll.bat'.$AbsentSubst.' --path="${target.data}" --bldpath="${target.data}" --export='.$tempFilenameRoot.' --deffile='.$theDefFile.' --linkAs='.$LinkAs.' '.$InterWorking;
+			addLinkDescriptorCommand ($linkCommand);
+	    }
+
+        if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+#		generate an export object from the ordered .DEF file
+		if (&main::ExportUnfrozen) {
+			$linkCommand = 'def2dll.bat --path="${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'\\" --bldpath="${target.data}" --import='.$tempFilenameRoot.
+				' --deffile="${target.data}\\'.$tempFilenameRoot.'.def" --linkAs='.$LinkAs.' '.$InterWorking;
+		    addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef, $exportUnfrozenWarningMessage);
+			}
+        }
+
+#       get rid of any -symbols produced .map file
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+			$linkCommand = $deleteCommand.'"${output}\\${output.file.name}.map"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false", undef, undef, undef, undef, (0,1));
+		}
+
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+	        my $datalinkbase = "0x400000";
+	        $datalinkbase = &main::DataLinkAddress if (&main::DataLinkAddress);
+		
+	        $linkCommand = "$Link ".$oP.'shl '.$oP.'reloc '.$oP.'split '.$oP."rw-base $datalinkbase ".$oP.'noscanlib '."$PlatOpt{Ld}";
+	        
+	        if ($BasicTrgType=~/^DLL$/o) {
+	            # get the right object file for the entry point
+	            my $ObjFile = "UC_DLL_.o";
+	            if ($FirstLib =~ /EDEV/i) {
+		            $ObjFile = "D_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EKLL/i) {
+		            $ObjFile = "L_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EEXT/i) {
+		            $ObjFile = "X_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EVAR/i) {
+		            $ObjFile = "V_ENTRY_.o";
+	            }
+
+#		    If platform is a customization, take libs from parent directory.		   
+			$linkCommand .= $oP.'entry _E32Dll "'.$FirstLib.'('.$ObjFile.')"';
+		    if($IsCustomDll)
+		    {
+				$linkCommand .=	' "${target.data}\\'.$tempFilenameRoot.'.exp"';
+			}
+		    
+	        } elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o) {
+			    # get the right object file for the entry point
+			    my $ObjFile = "UC_EXE_.o" ;
+			    if ($FirstLib =~ /KC_EXE/i) {
+					$ObjFile = "K_ENTRY_.o";
+			    }
+
+			if($IsPlatCustomization) 
+			{
+				$linkCommand .= $oP.'entry _E32Startup "'.$FirstLib.'('.$ObjFile.')"';
+			} 
+			else
+			{
+			    	$linkCommand .= $oP.'entry _E32Startup "'.$FirstLib.'('.$ObjFile.')"';
+			}
+		    
+			    if ($TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+					$linkCommand .= ' "${target.data}\\'.$tempFilenameRoot.'.exp"';
+				}
+			}
+
+			$linkCommand .= ' -o "${target.data}\\${output.file.name}"';
+
+			$linkCommand .= ' '.$oP.'symbols '.$oP.'list "${output}\\${output.file.name}.map"';
+			$linkCommand .= ' "${target.data}\\${output.file.root}.in"';
+
+
+			if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+				if($IsPlatCustomization) 
+				{
+				if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB'.$RVCTVersion.'.LIB"';
+				}
+				else {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB.LIB"';
+				}
+				}
+				else
+				{
+				if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB'.$RVCTVersion.'.LIB"';
+				}
+				else {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB.LIB"';
+				}
+				}
+			}
+
+			$linkCommand .= ' ${var:LIBS}';
+			
+			
+			my $runtimeLibs = "";
+			my $StaticRTLib = "usrt".$RVCTVersion;
+			
+			# use ksrt for system code and for user ARM code
+			$StaticRTLib = "ksrt".$RVCTVersion if ($SystemTrg);
+			$runtimeLibs .= $StaticRTLib.".lib" unless ($Trg =~ /(U|K)SRT/i || ($BasicTrgType=~/^LIB$/o));
+		
+			unless ($ArmRT || ($BasicTrgType=~/^LIB$/o)) {
+				my $TargLib = "$ExportLibrary.lib";
+				$TargLib =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+				unless ($SystemTrg) {
+					foreach (@RTLibList) {
+						$runtimeLibs .= " ".$_ unless ($_ =~ /$TargLib/i);
+					}
+			    }
+			}
+
+			foreach (@ArmLibList)
+				{
+				$runtimeLibs.= " ".$_;
+				}
+			
+			addLinkDescriptorSymbol ('${var:RUNTIME_LIBS}', $runtimeLibs);
+				
+			if($IsPlatCustomization) 
+			{
+			     $linkCommand .= ' --userlibpath "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\\'.$ParentPlat.'\\'.$Bld.'","${var:KIT_EPOCROOT}\\EPOC32\RELEASE\\'.$ParentPlat.'\LIB" ${var:RUNTIME_LIBS} ${var:IMPLIBS_NO_PATH_VTBLEXPORT}';
+			}
+			else
+				{
+				addLinkDescriptorSymbol ('${var:RUNTIME_LIBS}', 'usrt'.$RVCTVersion.'.lib dfpaeabi.lib dfprvct'.$RVCTVersion.'.lib dfprvct'.$RVCTVersion.'-thunk.lib drtaeabi.lib drtaeabi.lib(VtblExports.o) drtrvct'.$RVCTVersion.'.lib');
+				}
+				
+			$linkCommand .= ' --userlibpath "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'","${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\LIB" ${var:RUNTIME_LIBS} ${var:IMPLIBS_NO_PATH_VTBLEXPORT}';
+			
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+
+	    	if ($Bld=~/^U?DEB$/o) {
+			$linkCommand = $copyCommand. ' "${target.data}\\${output.file.name}" "${output}\\${output.file.root}.sym"'; 
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+	    	}
+	
+			$linkCommand = 'elftran -version '. &Genutl_VersionToUserString(%Version).' -sid '. &main::SecureId(); 
+			if (&main::CompressTarget) {
+				$linkCommand .= ' -nocompress ';
+			}
+			# change - exexps are allowed data, but they look like dlls to elftran....
+			if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+				$linkCommand.=' -allow';
+			}
+			if (not &main::CallDllEntryPoints ) {
+				$linkCommand.=' -nocall';
+			}
+			if (&main::DataLinkAddress) {
+				$linkCommand.=' -datalinkaddress '.&main::DataLinkAddress;
+			}
+			if (&main::FixedProcess) {
+				$linkCommand.=' -fixed';
+			}
+			if (&main::HeapSize) {
+				my %HeapSize=&main::HeapSize;
+				$linkCommand.=' -heap '.$HeapSize{Min}.' '.$HeapSize{Max};
+			}
+			if (&main::ProcessPriority) {
+				$linkCommand.=' -priority '.&main::ProcessPriority;
+			}
+			if (&main::StackSize) {
+				$linkCommand.=' -stack '.&main::StackSize;
+			}
+
+			my $i=1;
+			foreach (@UidList) {
+				$linkCommand.=" -uid$i $_";
+				$i++;
+			}
+			if(&main::VendorId) {
+				$linkCommand.=' -vid '.&main::VendorId;
+			}
+
+			$linkCommand.=' -fpu '.$floatingpointmodel;
+
+			$linkCommand.=' -capability '.&main::Capability. ' "${target.data}\\${output.file.name}" "${output}\\${output.file.name}"';
+		
+			addLinkDescriptorCommand ($linkCommand, "false");
+        	}
+        elsif ($BasicTrgType=~/^LIB$/o) {
+			$linkCommand = 'armar '.$oP.'create "${output}\\${output.file.name}" '.$oP.'via "${target.data}\\${output.file.root}_'.$Bld.'_objects.via"'.' '.$archiveropts;
+			addLinkDescriptorCommand ($linkCommand);
+			}
+		}
+
+##############################################
+# BPABI library generation and link stage    #
+# Assumes use of RVCT 2.2					 #
+##############################################
+
+	elsif ($ABIV2 && ($CW_major_version >= 3.1)) {
+		
+		# prolly don't need this...
+		my $InterWorking = ($ABI eq 'ARMV4') ? "" : "--inter";
+			
+		return if ($BasicTrgType=~/^IMPLIB$/io);
+		
+		if ($BasicTrgType=~/^LIB$/o) {
+			$linkCommand = 'armar --create ${output}\\${output.file.name} ${var:LINK_OBJS} ${var:LIBS}'.' '.$archiveropts;
+	        addLinkDescriptorCommand ($linkCommand);
+         }
+		else
+		{
+		my $AbsentSubst = '';
+		my $EntrySymbol;
+		my $Link = '';
+
+		if ($BasicTrgType=~/^DLL$/o) {
+			$EntrySymbol = '_E32Dll';
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			$EntrySymbol = '_E32Startup';
+		}
+		if ($EntrySymbol) {
+			$AbsentSubst = " -absent $EntrySymbol";
+		}
+
+		$Link = 'armlink '.$oP.'diag_suppress 6331,6780'.$linkeropts.' ';
+
+		if ($Bld =~ /DEB$/o)
+			{
+			$Link .= ' '.$oP.'debug';
+			}
+
+
+	    # TARGET *.IN
+	    #------------
+
+		# Create "via" file containing all link objects in order to reduce link
+		# command line length
+		addLinkDescriptorDumpFile ('${var:LINK_OBJS}', '${target.data}\\${output.file.root}_'.$Bld.'_objects.via');
+		
+		if ($BasicTrgType!~/^LIB$/o) {
+			$linkCommand = $Link .' '.$oP.'partial -o ${var:COMMON_LINK_FLAGS} "${target.data}\\${output.file.root}.in" '.$oP.'via "${target.data}\\${output.file.root}_'.$Bld.'_objects.via"';
+
+		}
+
+
+#       get rid of any -symbols produced .map file
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+			$linkCommand = $deleteCommand.'"${output}\\${output.file.name}.map"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false", undef, undef, undef, undef, (0,1));
+		}
+
+        if ($BasicTrgType=~/^(DLL|EXE)/o) {
+	        my $datalinkbase = "0x400000";
+			my $librarylist;
+			my $expr;
+			@ToolChainLibList = &GetLibList;
+
+			foreach $expr (@ToolChainLibList) {
+				$librarylist .= $expr.' ';
+			}
+	        
+  	        $datalinkbase = &main::DataLinkAddress if (&main::DataLinkAddress);
+	        $linkCommand = "$Link ".$oP.'bpabi '.$oP.'reloc '.$oP.'split '.$oP.'no_scanlib '.$oP.'datacompressor=off '.$oP."rw-base $datalinkbase "."$PlatOpt{Ld}";
+			$linkCommand .= ' --dll --symver_soname --soname '.$LinkAs.' ';
+			
+			
+	        if ($BasicTrgType=~/^DLL$/o) {
+	            # get the right object file for the entry point
+	            my $ObjFile = "UC_DLL_.o";
+	            if ($FirstLib =~ /EDEV/i) {
+		            $ObjFile = "D_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EKLL/i) {
+		            $ObjFile = "L_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EEXT/i) {
+		            $ObjFile = "X_ENTRY_.o";
+	            }
+	            if ($FirstLib =~ /EVAR/i) {
+		            $ObjFile = "V_ENTRY_.o";
+	            }
+
+#		    If platform is a customization, take libs from parent directory.		   
+		    if($IsCustomDll)
+		    {
+		    
+			$linkCommand .= $oP.'entry _E32Dll "'.$FirstLib.'('.$ObjFile.')"'.
+					' "${target.data}\\'.$tempFilenameRoot.'.exp"';
+			    
+		    }
+		    else
+		    {
+		    # ARMV5 hardcoded here...
+		    $linkCommand .= $oP.'entry _E32Dll "'.$FirstLib.'('.$ObjFile.')"';
+		    }
+
+	        } elsif ($BasicTrgType=~/^EXE$/o || $TrgType=~/^EXEXP$/o) {
+			    # get the right object file for the entry point
+			    my $ObjFile = "UC_EXE_.o" ;
+			    if ($FirstLib =~ /KC_EXE/i) {
+					$ObjFile = "K_ENTRY_.o";
+			    }
+
+		    # Should this use $ParentPlat rather than hardcoded ARMV5 dir?
+		   $linkCommand .= $oP.'entry _E32Startup "'.$FirstLib.'('.$ObjFile.')"';
+		
+			}
+
+			$linkCommand .= ' -o "${target.data}\\${output.file.name}"';
+
+			if ($BasicTrgType=~/^DLL$/o) { # Add the DLL stub library
+				if($IsPlatCustomization) 
+				{
+				if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\\'.$ParentPlat.'\\'.$Bld.'\EDLLSTUB'.$RVCTVersion.'.LIB"';
+				}
+				else {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\\'.$ParentPlat.'\\'.$Bld.'\EDLLSTUB.LIB"';
+				}
+				}
+				else
+				{
+				if ($RVCTMajorVersion == 2 && $RVCTMinorVersion < 2) {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB'.$RVCTVersion.'.LIB"';
+				}
+				else {
+				   $linkCommand .= ' "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'\EDLLSTUB.LIB"';
+				}
+				}
+			}
+
+			$linkCommand .= ' ${var:LIBS}';
+			
+			
+			my $runtimeLibs = "";
+			my $StaticRTLib = "usrt".$RVCTVersion;
+			
+			# use ksrt for system code and for user ARM code
+			$StaticRTLib = "ksrt".$RVCTVersion if ($SystemTrg);
+			$runtimeLibs .= $StaticRTLib.".lib" unless ($Trg =~ /(U|K)SRT/i || ($BasicTrgType=~/^LIB$/o));
+		
+			unless ($ArmRT || ($BasicTrgType=~/^LIB$/o)) {
+				my $TargLib = "$ExportLibrary.lib";
+				$TargLib =~ s/\{(\d|a|b|c|d|e|f){8}\}//i;
+				unless ($SystemTrg) {
+					foreach (@RTLibList) {
+						$runtimeLibs .= " ".$_ unless ($_ =~ /$TargLib/i);
+					}
+			    }
+			}
+
+			foreach (@ArmLibList)
+				{
+				$runtimeLibs.= " ".$_;
+				}
+			
+			addLinkDescriptorSymbol ('${var:RUNTIME_LIBS}', $runtimeLibs);
+				
+			$linkCommand .= ' --userlibpath "${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\\'.$Bld.'","${var:KIT_EPOCROOT}\\EPOC32\RELEASE\ARMV5\LIB" '.$oP.'via "${target.data}\\${output.file.root}_'.$Bld.'_objects.via" ${var:RUNTIME_LIBS} '.$librarylist.' ';
+			
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+
+		}
+		
+		#### Create the .sym file
+		$linkCommand = 'cmd.exe /C copy "${target.data}\\${output.file.name}" "${output}\\${output.file.root}.sym"';
+		addLinkDescriptorCommand ($linkCommand);
+		
+		#### copy the project .def file for prep
+		if ($DefFile and !$NoExportLibrary)
+		{
+			unless (&main::ExportUnfrozen)
+			{
+        	$linkCommand = 'cmd.exe /C copy "${var:DEF_FILE}" "${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.prep.def"';
+			addLinkDescriptorCommand ($linkCommand);
+			}
+		}
+		
+		
+		#### ELF2E32 POST-LINK COMMAND ####
+		# Section needs to be generic for BPABI (e.g. GCCE & ARMV5_ABIV2)
+		$linkCommand  = '${var:KIT_EPOCROOT}\\epoc32\\tools\\elf2e32.exe ';		
+		
+		# Change - exexps are allowed data, but they look like dlls to elftran....
+		if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			$linkCommand .= ' --dlldata';
+		}
+
+		if (&main::DataLinkAddress) {
+			$linkCommand .= ' --datalinkaddress=',&main::DataLinkAddress;
+		}
+		if (&main::FixedProcess) {
+			$linkCommand .=	' --fixedaddress';
+		}
+		
+		$linkCommand .= ' --sid='.&main::SecureId();
+		$linkCommand .= ' --version='. &Genutl_VersionToUserString(%Version);
+		
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			$linkCommand.=' --heap '.$HeapSize{Min} .','.$HeapSize{Max};
+		}
+		
+		if (&main::ProcessPriority) {
+			$linkCommand .=	' --priority='.&main::ProcessPriority;
+		}
+		
+		if (&main::StackSize) {
+			$linkCommand .= ' --stack='.&main::StackSize;
+		}
+		
+		my $i=1;
+		foreach (@UidList) {
+			$linkCommand .= " --uid$i=$_";
+			$i++;
+		}
+		if (&main::VendorId) {
+			$linkCommand .= ' --vid='.&main::VendorId;
+		}
+		
+		$linkCommand .= ' --capability='.&main::Capability;
+
+		# ARMFPU only currently supported for RVCT BPABI builds
+		if (&main::ARMFPU && (&main::ARMFPU =~ /^VFPV2$/i)) {
+			$linkCommand .= ' --fpu=vfpv2'
+		}
+		else {
+			$linkCommand .= ' --fpu=softvfp'
+		}
+		
+	
+		if(($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/ ) || $TrgType=~/^EXEXP/) {
+	 		$linkCommand .= ' --targettype='.$TrgType;
+ 		}
+ 		else {
+ 			$linkCommand .= ' --targettype='.$BasicTrgType;
+ 		}
+		
+		$linkCommand .= ' --output="${output}\\${output.file.name}"';
+		
+		my $warningMessage;
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($DefFile and !$NoExportLibrary) {
+				$linkCommand .= ' --definput="${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.prep.def"';
+			}
+			$linkCommand .= ' --dso=';
+			$linkCommand .= '"${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${var:IMPORT_LIBRARY}"';
+				
+			$linkCommand .= ' --defoutput=';
+			$linkCommand .= '"${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.def"';
+				
+			if (&main::ExportUnfrozen) {
+				$warningMessage = $exportUnfrozenWarningMessage;
+				$linkCommand .= ' --unfrozen';
+			}
+		}
+		
+		$linkCommand .= ' --elfinput="${target.data}\\${output.file.name}"';
+		$linkCommand .= ' --linkas='.$LinkAs;
+		#Change - LIB path is hardcoded here...
+		$linkCommand .= ' --libpath="${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB"';
+		
+        if ($BasicTrgType=~/^DLL$/o && $TrgType!~/^DLL/){
+			my $Export;
+			my $Ordinal=1;
+			foreach $Export (&main::Exports)
+				{
+				if ($Ordinal eq 1) {
+					$linkCommand .= ' --sysdef=';
+				}
+				elsif ($Ordinal ne 1) {
+					$linkCommand .= ';';
+					}
+					
+				$linkCommand .= "$Export,".$Ordinal;
+				$Ordinal++;
+				}
+		}
+		
+		addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef, $warningMessage);
+		
+		}
+		
+		# copy def file output
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			$linkCommand = 'cmd.exe /C copy  "${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.def" "${Project}\${var:IMPORT_LIBRARY_NO_EXT}.def"';
+			addLinkDescriptorCommand($linkCommand);
+		}
+		
+		# copy the import lib (dso) created
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($DefFile and !$NoExportLibrary) {
+				$linkCommand = 'cmd.exe /C copy ${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${var:IMPORT_LIBRARY} ${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${output.file.root}.dso';
+			}
+			addLinkDescriptorCommand($linkCommand);
+		}
+	
+	}
+			
+#########################################
+# GCC library generation and link stage #
+#########################################
+
+	elsif ($Plat eq "ARM4")
+		{
+		# Generate library
+
+		if ($DefFile and !$NoExportLibrary)
+			{
+			unless (&main::ExportUnfrozen)
+				{
+				$linkCommand = 'perl.exe -S prepdef.pl "${var:DEF_FILE}" "${target.data}\\'.$tempFilenameRoot.'.prep.def"';
+				addLinkDescriptorCommand ($linkCommand);
+
+				$linkCommand = "$Dlltool $PlatOpt{Dlltool}".' --output-lib "${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}" --def "'.
+						'${target.data}\\'.$tempFilenameRoot.'.prep.def" --dllname "'.$LinkAs.'"';
+				addLinkDescriptorCommand ($linkCommand);
+
+				if ($ExtraExportLibrary)
+					{
+					$linkCommand = $copyCommand.'"${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}" '.
+									'"${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).$ExtraExportLibrary.'.lib"';
+					addLinkDescriptorCommand ($linkCommand,"false", "false");
+					}
+
+				foreach (@CompatibleABIs)
+					{
+					$linkCommand = "$Dlltool $ABIDlltool{$_}".' --output-lib "${var:KIT_EPOCROOT}'.kitRelativePath($ABILibPath{$_}).'UREL\\${var:IMPORT_LIBRARY}" --def "'.
+							'${target.data}\\'.$tempFilenameRoot.'.prep.def" --dllname "'.$LinkAs.'"';
+					addLinkDescriptorCommand ($linkCommand);
+
+					if ($ExtraExportLibrary)
+						{
+						$linkCommand = $copyCommand.'"${var:KIT_EPOCROOT}'.kitRelativePath($ABILibPath{$_}).'UREL\\${var:IMPORT_LIBRARY}" '.
+										'"${var:KIT_EPOCROOT}'.kitRelativePath($ABILibPath{$_}).'UREL\\'.$ExtraExportLibrary.'.lib"';
+						addLinkDescriptorCommand ($linkCommand,"false", "false");
+						}
+					}
+				}
+			}
+
+
+		# TARGET *.IN
+		#------------
+		$linkCommand = $deleteCommand.'"${target.data}\\${output.file.root}.in"';
+		addLinkDescriptorCommand ($linkCommand, "false", "false", undef, undef, undef, undef, (0,1));
+				
+		$linkCommand = 'ar.exe cr "${target.data}\\${output.file.root}.in" ${var:LINK_OBJS}';
+		addLinkDescriptorCommand ($linkCommand);
+		
+
+		# Perform Link
+
+	#	Establish the entry point symbol
+		my $EntrySymbol;
+		if ($BasicTrgType=~/^DLL$/o) {
+			$EntrySymbol = '_E32Dll';
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			$EntrySymbol = '_E32Startup';
+		}
+		my $AbsentSubst = '';
+		if ($EntrySymbol) {
+			$AbsentSubst = " -absent $EntrySymbol";
+		}
+
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+
+	#		generate a .DEF file from the objects and static libraries
+			$linkCommand = "$Dlltool $PlatOpt{Dlltool} --output-def ".'"${target.data}\\'.$tempFilenameRoot.'.inf" "${target.data}\\${output.file.root}.in"';
+
+			foreach (@StatLibList) {
+				$linkCommand .= ' "${var:KIT_EPOCROOT}'.kitRelativePath($StatLinkPath).$_.'"';
+			}
+
+			addLinkDescriptorCommand ($linkCommand);
+
+	#		reorder the .DEF file taking frozen exports into account if there are any
+	#			call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+			$linkCommand = 'perl.exe -S makedef.pl -Deffile "${target.data}\\'.$tempFilenameRoot.'.inf" '.$AbsentSubst;
+			if (-e $DefFile) { # effectively "if project frozen ..."
+				$linkCommand .= " -Frzfile \"".'${var:DEF_FILE}'."\"";
+			}
+			# freeze ordinals, a maximum of 2, for polymorphic dlls
+			my $Ordinal;
+			my $Num=1;
+			foreach $Ordinal (&main::Exports) {
+				$linkCommand .= " -$Num $Ordinal";
+				$Num++;
+			}
+			$linkCommand .= ' "${target.data}\\'.$tempFilenameRoot.'.def"';
+			addLinkDescriptorCommand ($linkCommand);
+
+	#		delete the unordered definition file
+			$linkCommand = $deleteCommand.'"${target.data}\\'.$tempFilenameRoot.'.inf"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+
+	#		generate an export object from the ordered .DEF file
+			$linkCommand = "$Dlltool $PlatOpt{Dlltool} --def".' "${target.data}\\'.$tempFilenameRoot.'.def"'.
+				' --output-exp "${target.data}\\'.$tempFilenameRoot.'.exp"'.
+				" --dllname \"$LinkAs\"";
+
+			my $warningMessage;
+				
+			if (&main::ExportUnfrozen) {
+				$warningMessage = $exportUnfrozenWarningMessage;
+				$linkCommand .= ' --output-lib "${var:KIT_EPOCROOT}'.kitRelativePath($LibPath).'${var:IMPORT_LIBRARY}"';
+			}
+			
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef, $warningMessage);
+		}
+
+	#	call ld to do base relocations (and dll exports)
+		if ($BasicTrgType=~/^(DLL|EXE)/o) {
+			$linkCommand = "$Link $PlatOpt{Ld} -s";	
+			if ($BasicTrgType=~/^DLL$/o) {
+				$linkCommand .= " $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol ".'"${target.data}\\'.$tempFilenameRoot.'.exp" --dll ';
+			}
+			elsif ($BasicTrgType=~/^EXE$/o) {
+				$linkCommand .= " $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol ";
+			}
+	#		--whole-archive is required here apparently because of a defect in the gcc toolchain
+	#		the flag can probably be removed with a later version of gcc
+
+			$linkCommand .= '--base-file "${target.data}\\${output.file.root}.bas" -o "${target.data}\\${output.file.name}" '.
+				'${var:FIRST_LIB} --whole-archive "${target.data}\\${output.file.root}.in" '.
+				"--no-whole-archive";
+			$linkCommand .= ' ${var:COMMON_LINK_FLAGS} ${var:LIBS}';
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+
+	#		delete temporary files
+			if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+				$linkCommand = $deleteCommand.'"${target.data}\\'.$tempFilenameRoot.'.exp"';
+				addLinkDescriptorCommand ($linkCommand, "false", "false", undef, undef, undef, undef, (0,1));
+			}
+			$linkCommand = $deleteCommand.'"${target.data}\\${output.file.name}"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+
+	#		call dlltool to do base relocations (and dll exports)
+			$linkCommand = "$Dlltool $PlatOpt{Dlltool} ";
+			if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+				$linkCommand .= '--def "${target.data}\\'.$tempFilenameRoot.'.def" '.
+					"--dllname \"$LinkAs\" ";
+			}
+			$linkCommand .= '--base-file "${target.data}\\${output.file.root}.bas" '.
+				'--output-exp "${target.data}\\'.$tempFilenameRoot.'.exp" ';
+			addLinkDescriptorCommand ($linkCommand);
+
+	#		delete temporary files
+			$linkCommand = $deleteCommand.'"${target.data}\\${output.file.root}.bas"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+
+	#		call ld to link the target
+			$linkCommand = "$Link $PlatOpt{Ld}";
+			if ($Bld=~/^U?REL$/o) {
+				$linkCommand .= " -s";
+			}
+			if ($BasicTrgType=~/^DLL$/o) {
+				$linkCommand .= " $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol --dll ";
+			}
+			elsif ($BasicTrgType=~/^EXE$/o) {
+				$linkCommand .= " $PlatOpt{Entry} $EntrySymbol -u $EntrySymbol ";
+			}
+	#		--whole-archive is required here apparently because of a defect in the gcc toolchain
+	#		the flag can probably be removed with a later version of gcc
+			$linkCommand .= '"${target.data}\\'.$tempFilenameRoot.'.exp" '.
+				'-Map "${output}\\${output.file.name}.map" -o "${target.data}\\${output.file.name}" '.
+				'${var:FIRST_LIB} --whole-archive "${target.data}\\${output.file.root}.in" '.
+				"--no-whole-archive";
+			$linkCommand .= ' ${var:LIBS}';
+
+			if ($BasicTrgType=~/^LIB$/o) {				
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef);
+			}
+			else {
+			addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+			}
+
+	#		delete temporary files
+			$linkCommand = $deleteCommand.'"${target.data}\\'.$tempFilenameRoot.'.exp"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+
+			if ($Bld=~/DEB$/o) {
+				$linkCommand = $Objcopy.' -X "${target.data}\\${output.file.name}" "${output}\\${output.file.root}.sym"';
+				addLinkDescriptorCommand ($linkCommand);
+			}
+
+			$linkCommand = "petran.exe $PlatOpt{Petran} -version ". &Genutl_VersionToUserString(%Version). " -sid ". &main::SecureId(). ' "${target.data}\\${output.file.name}" "${output}\\${output.file.name}" ';
+
+			if (&main::CompressTarget) {
+				$linkCommand .= ' -nocompress';
+			}
+			if (&main::AllowDllData) {
+				$linkCommand .= ' -allow';
+			}
+			if (not &main::CallDllEntryPoints) {
+				$linkCommand .= ' -nocall';
+			}
+			if (&main::DataLinkAddress) {
+				$linkCommand .= ' -datalinkaddress '.&main::DataLinkAddress;
+			}
+			if (&main::FixedProcess) {
+				$linkCommand .= ' -fixed';
+			}
+			if (&main::HeapSize) {
+				my %HeapSize=&main::HeapSize;
+				$linkCommand .= ' -heap '.$HeapSize{Min}.' '.$HeapSize{Max};
+			}
+			if (&main::ProcessPriority) {
+				$linkCommand .= ' -priority '.&main::ProcessPriority;
+			}
+			if (&main::StackSize) {
+				$linkCommand .= ' -stack '.&main::StackSize;
+			}
+			my $i=1;
+			foreach (@UidList) {
+				$linkCommand .= " -uid$i $_";
+				$i++;
+			}
+				
+			$linkCommand .= ' -capability '.&main::Capability;
+			
+			if (&main::VendorId) {
+			$linkCommand .= ' -vid '.&main::VendorId;
+			}
+		
+			addLinkDescriptorCommand ($linkCommand, "false");
+			
+			$linkCommand = $deleteCommand.'"${target.data}\\${output.file.name}"';
+			addLinkDescriptorCommand ($linkCommand, "false", "false");
+		}
+		elsif ($BasicTrgType=~/^LIB$/o) {
+			$linkCommand = $copyCommand.'"${target.data}\\${output.file.root}.in" "${var:KIT_EPOCROOT}'.kitRelativePath($StatLinkPath).'${output.file.name}"';
+			addLinkDescriptorCommand ($linkCommand,"false", "false");
+		}
+	}
+	
+###############################################
+# GCCE library generation and link stage      #
+# GCCE only supported for CW 3.1 and greater #
+###############################################
+
+	elsif ($Plat eq "GCCE" || $CustGCCE)
+	{	
+	
+        if ($BasicTrgType=~/^LIB$/o) {
+	        $linkCommand = 'ar cr ${output}\\${output.file.name} ${var:LINK_OBJS} ${var:LIBS}';
+	        addLinkDescriptorCommand ($linkCommand);
+         }
+         
+		elsif ($BasicTrgType=~/^(DLL|EXE)/o) {
+        
+        $linkCommand = 'arm-none-symbianelf-ld';
+        my $GCCE_LibGCCPath = ' -L';
+        $GCCE_LibGCCPath .= '"'.GetGCCELibPath("-print-file-name=libsupc++.a").'"';
+        $GCCE_LibGCCPath .= ' -L';
+        $GCCE_LibGCCPath .= '"'.GetGCCELibPath("-print-libgcc-file-name").'"';
+		$linkCommand .= $GCCE_LibGCCPath;
+		$linkCommand .=	' ${var:COMMON_LINK_FLAGS}';
+		$linkCommand .= ' --target1-abs --no-undefined -nostdlib -Ttext 0x8000 -Tdata 0x400000';
+		$linkCommand .= ' -shared --default-symver -soname '.$LinkAs." ";
+		
+		if ($Bld=~/REL$/o) {
+			$linkCommand .= ' -Map "${output}\\${output.file.name}.map"';
+		}
+		
+		if ($BasicTrgType=~/^DLL$/o)
+			{
+			$linkCommand .= ' --entry _E32Dll -u _E32Dll';
+			}
+		elsif ($BasicTrgType=~/^EXE$/o)
+			{
+			$linkCommand .= ' --entry _E32Startup -u _E32Startup';
+			}		
+
+		$linkCommand .= ' ${var:FIRST_LIB}';
+		$linkCommand .= ' -o "${target.data}\\${output.file.name}" ${var:LINK_OBJS} ${var:LIBS}';
+		$linkCommand .= ' -lsupc++ -lgcc'.' '.$linkeropts; 
+		addLinkDescriptorCommand ($linkCommand, undef, undef, undef, $FirstLib);
+		
+		
+		$linkCommand = 'cmd.exe /C copy "${target.data}\\${output.file.name}" "${output}\\${output.file.root}.sym"';
+		addLinkDescriptorCommand ($linkCommand);
+		
+		# copy the project .def file for prep
+		if ($DefFile and !$NoExportLibrary)
+		{
+			unless (&main::ExportUnfrozen)
+			{
+        	$linkCommand = 'cmd.exe /C copy "${var:DEF_FILE}" "${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.prep.def"';
+			addLinkDescriptorCommand ($linkCommand);
+			}
+		}
+		
+		$linkCommand  = '${var:KIT_EPOCROOT}\\epoc32\\tools\\elf2e32.exe ';		
+		
+		# Change - exexps are allowed data, but they look like dlls to elftran....
+		if (&main::AllowDllData || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			$linkCommand .= ' --dlldata';
+		}
+
+		if (&main::DataLinkAddress) {
+			$linkCommand .= ' --datalinkaddress=',&main::DataLinkAddress;
+		}
+		if (&main::FixedProcess) {
+			$linkCommand .=	' --fixedaddress';
+		}
+		
+		$linkCommand .= ' --sid='.&main::SecureId();
+		
+		if (&main::HeapSize) {
+			my %HeapSize=&main::HeapSize;
+			$linkCommand.=' --heap '.$HeapSize{Min} .','.$HeapSize{Max};
+		}
+		
+		if (&main::ProcessPriority) {
+			$linkCommand .=	' --priority='.&main::ProcessPriority;
+		}
+		
+		if (&main::StackSize) {
+			$linkCommand .= ' --stack='.&main::StackSize;
+		}
+		
+		my $i=1;
+		foreach (@UidList) {
+			$linkCommand .= " --uid$i=$_";
+			$i++;
+		}
+		if (&main::VendorId) {
+			$linkCommand .= ' --vid='.&main::VendorId;
+		}
+		
+		$linkCommand .= ' --capability='.&main::Capability;
+		
+	
+		if(($BasicTrgType=~/^DLL/ && $TrgType!~/^DLL/ ) || $TrgType=~/^EXEXP/) {
+	 		$linkCommand .= ' --targettype='.$TrgType;
+ 		}
+ 		else {
+ 			$linkCommand .= ' --targettype='.$BasicTrgType;
+ 		}
+		
+		$linkCommand .= ' --output="${output}\\${output.file.name}"';
+		
+		my $warningMessage;
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($DefFile and !$NoExportLibrary) {
+				$linkCommand .= ' --definput="${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.prep.def"';
+			}
+			$linkCommand .= ' --dso=';
+			$linkCommand .= '"${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${var:IMPORT_LIBRARY}"';
+				
+			$linkCommand .= ' --defoutput=';
+			$linkCommand .= '"${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.def"';
+				
+			if (&main::ExportUnfrozen) {
+				$warningMessage = $exportUnfrozenWarningMessage;
+				$linkCommand .= ' --unfrozen';
+			}
+		}
+		
+		$linkCommand .= ' --elfinput="${target.data}\\${output.file.name}"';
+		$linkCommand .= ' --linkas='.$LinkAs;
+		#Change - LIB path is hardcoded here...
+		$linkCommand .= ' --libpath="${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB"';
+		
+        if ($BasicTrgType=~/^DLL$/o && $TrgType!~/^DLL/){
+			my $Export;
+			my $Ordinal=1;
+			foreach $Export (&main::Exports)
+				{
+				if ($Ordinal eq 1) {
+					$linkCommand .= ' --sysdef=';
+				}
+				elsif ($Ordinal ne 1) {
+					$linkCommand .= ';';
+					}
+					
+				$linkCommand .= "$Export,".$Ordinal;
+				$Ordinal++;
+				}
+		}
+		
+		addLinkDescriptorCommand ($linkCommand, undef, undef, undef, undef, $warningMessage);
+				
+		} # end...elsif if ($BasicTrgType=~/^(DLL|EXE)/o)
+		
+		# copy def file output
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			$linkCommand = 'cmd.exe /C copy  "${target.data}\\${var:IMPORT_LIBRARY_NO_EXT}.def" "${Project}\${var:IMPORT_LIBRARY_NO_EXT}.def"';
+			addLinkDescriptorCommand($linkCommand);
+		}
+		
+		# copy the import lib (dso) created
+		if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o || $TrgType=~/^EXEDLL$/o) {
+			if ($DefFile and !$NoExportLibrary) {
+				$linkCommand = 'cmd.exe /C copy ${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${var:IMPORT_LIBRARY} ${var:KIT_EPOCROOT}\\EPOC32\\RELEASE\\ARMV5\\LIB\\${output.file.root}.dso';
+			}
+			addLinkDescriptorCommand($linkCommand);
+		}
+		
+	
+	} # end  GCCE link stage... elsif ($Plat eq "GCCE")
+	
+	
+	if ($addHeaders)
+		{
+		# Ideally we would do this for all targets, both UREL and UDEB.  This would,
+		# however, be very slow - so we just do it for the first target we come to.
+		my $cpp = &PreprocessorToUseExe();
+		my $cppCommandLine = "$cpp.EXE -M -MG -nostdinc ";
+		my $preInclude = "";
+
+		if (($Plat eq "ARMV5" || $Plat eq "ARMV5_ABIV2" || $Plat eq "ARMV5_ABIV1" || $Plat eq "GCCE" || $IsPlatCustomization) && $PrefixFile)
+			{
+			$preInclude = $PrefixFile;
+			$preInclude =~ s/^.*://;
+			}
+		elsif($VariantFile)
+			{	    
+		    $preInclude = $VariantFile;
+			}
+
+		$cppCommandLine .= '-include '.Path_RltToWork($preInclude).' ' if $preInclude;
+
+		foreach (&main::UserIncPaths, &main::SysIncPaths)
+			{
+			$cppCommandLine .= '-I '.&Path_Chop(&Path_RltToWork($_)).' ';
+			}
+
+		foreach (@MacroList)
+			{
+			#ARMCC requires escaped '"', but CPP doesn't like them
+			s/\\\"/\"/g if /^__PRODUCT_INCLUDE__/; 
+			
+			$cppCommandLine .= '-D'.$_.' ';
+			}
+		
+		my $SourceStructRef=&main::SourceStructRef;
+		my %localIncludes;
+
+		foreach my $SourceRef (@$SourceStructRef)
+	   		{
+			$file = Path_RltToWork(($$SourceRef{SrcPath}.$$SourceRef{CurFile}));
+
+			# ensure the case of the extension is what GCC expects
+			$file =~ s/\.CPP$/.cpp/i;
+			$file =~ s/\.C$/.c/i;
+			$file =~ s/\.s$/.S/i;
+
+			open CPPPIPE,$cppCommandLine.$file." |" or die "ERROR: Can't invoke CPP.EXE\n";
+
+			while (<CPPPIPE>)
+				{
+				#convert any Unix slashes found in CPP output to DOS slashes
+				s/\//\\/g;	
+				while (/\.(\.\\|\\){1}\S+\.(hrh|h|inl){1}/gi)
+					{
+					my $file = $&;
+					my $filePath = &main::Path_Split('Path',$file);
+						
+					# Ignore files that are clearly not local to the project
+					next if ($filePath =~ /\\epoc32\\/i);
+
+					# Ignore files that are #included with intermediate directories -
+					# we can't guarantee these will be on an Access Path.
+					next if ($filePath =~ /\w+\\\.\./);
+
+					# Finally confirm that the file we have is definitely on an Access Path
+					my $presentOnAccessPath = 0;
+					foreach my $accessPath (&main::UserIncPaths, &main::SysIncPaths)
+						{
+						my $accessPathCompare = $accessPath;
+						$accessPathCompare =~ s/\\/_/g;
+
+						my $filePathCompare = $filePath;
+						$filePathCompare =~ s/(\.\\|\.\.\\)//g;
+						$filePathCompare =~ s/\\/_/g;
+
+						$presentOnAccessPath = 1 if ($accessPathCompare =~ /$filePathCompare$/i);
+						}
+					next if (!$presentOnAccessPath);
+
+					# Maintain availability of original case of filename using a lc keyed hash
+					my $localInclude = &main::Path_Split('Base',$file).&main::Path_Split('Ext',$file);					
+					$localIncludes{lc ($localInclude)} = $localInclude unless (!-e $file);
+					}
+				}
+			}
+
+		foreach my $localInclude (sort keys %localIncludes)
+			{
+			addFile($localIncludes{$localInclude}, "Text", 0, "", "Headers");
+			}
+
+		$addHeaders = 0;
+		}
+
+
+	# Add DOCUMENT specified files that we know we can add - we only add these for one target,
+	# as they should be identical through-out
+
+	if ($addDocuments)
+		{
+		foreach my $document (@DocList)
+			{
+			# Only add files as Documents if they haven't already been added to
+			# the target (it's not possible to have duplicate entries) and if they
+			# have an extension we know about.
+
+			next if (grep (/$document/i, @addedFiles));
+
+			my $extension = $document;
+			$extension =~ s/^.*\.//;
+
+			next if (!grep (/$extension/i, @compatibleDOCUMENTExtensions));
+			
+			addFile($document, "Text", "", "", "Documents");
+			}
+
+		$addDocuments = 0;
+		}
+
+
+	# Create the link descriptor file
+
+	$xmlLinkDescriptorCommandParent->addText("\n\t\t\t");
+
+	if ($CW_major_version >= 3)
+		{
+		$xmlLinkDescriptorDumpFileParent->addText("\n\t\t\t");
+		}
+
+	&main::CreateExtraFile("${ExtraFilesPath}$linkDescriptorFile", $xmlLinkDescriptorDoc->toString);
+	addFile($linkDescriptorFile, "Text", "", "", "Link");	
+	
+	# Apply the changed settings
+
+	my $settinglist = $xmlTarget->getElementsByTagName("SETTINGLIST",0)->item(0);
+	my @settingnodes = $settinglist->getElementsByTagName("SETTING",0);
+	foreach my $setting (@settingnodes)
+		{
+		my $element = $setting->getElementsByTagName("NAME",0)->item(0);
+		my $settingname = $element->getFirstChild->getData();
+		my $replacement = $changedsettings{$settingname};
+		if (defined $replacement) 
+			{
+			if ($replacement eq "{}")
+				{
+				if ($settingname eq "UserSearchPaths")
+					{
+					&addUserSearchPaths($setting);
+					}
+				elsif ($settingname eq "SystemSearchPaths")
+					{
+					&addSystemSearchPaths($setting);
+					}
+				elsif ($settingname eq "UserSourceTrees")
+					{
+					&addSourceTrees($setting);
+					}
+				elsif ($settingname eq "FileList")
+					{
+					&addDownloadFileList($setting, @ResourceDownloadList);
+					}
+				}
+			elsif ($replacement =~ /^{(.+)}(.+)$/)
+				{					
+				&changePathSetting($setting,$1,$2);
+				}
+			else
+				{
+				&changeValue($setting,$replacement);
+				}
+			}
+		}
+	}
+
+
+sub addLinkDescriptorCommand($$;$;$;$;$;$;$;) {		
+	my ($linkCommand, $parseStdOut, $parseStdErr, $outputParser, $firstLibProcessing,
+	    $linkWarning, $linkInformation, @successCodes) = @_;
+
+	my $structIndent = "\n\t\t\t\t";
+	my $settingIndent = "$structIndent\t";
+	my $simpleIndent = "$settingIndent\t";
+	my $successCodeArrayIndent = $simpleIndent;
+	my $successCodeSimpleIndent = "$successCodeArrayIndent\t";
+
+	my $structElement = new XML::DOM::Element($xmlLinkDescriptorDoc,"struct");
+	$xmlLinkDescriptorCommandParent->addText("$structIndent");
+	$xmlLinkDescriptorCommandParent->appendChild ($structElement);
+
+	my $settingElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"setting");
+	$settingElementTemplate->setAttribute("uuid-alias", ".");
+	my $simpleElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"simple");
+
+	my $settingElement;
+	my $simpleElement;
+
+	$settingElement = $settingElementTemplate->cloneNode(0);
+	$simpleElement = $simpleElementTemplate->cloneNode(0);
+	
+	$settingElement->setAttribute ("entry", "linkCommand");
+	$structElement->addText ($settingIndent);
+	$structElement->appendChild ($settingElement);
+
+	$simpleElement->addText ($linkCommand);
+
+	$settingElement->addText ($simpleIndent);
+	$settingElement->appendChild ($simpleElement);
+	$settingElement->addText($settingIndent);
+	
+	if (defined $parseStdOut)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "parseStdOut");
+		$simpleElement->addText($parseStdOut);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+	
+	if (defined $parseStdErr)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "parseStdErr");
+		$simpleElement->addText($parseStdErr);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+
+	if (defined $outputParser)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "outputParser");
+		$simpleElement->addText($outputParser);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+
+	if (defined $firstLibProcessing)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "firstLibProcessing");
+		$simpleElement->addText($firstLibProcessing);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+
+	if (defined $linkWarning)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "linkWarning");
+		$simpleElement->addText($linkWarning);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+
+	if (defined $linkInformation)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$simpleElement = $simpleElementTemplate->cloneNode(0);
+
+		$settingElement->setAttribute("entry", "linkInformation");
+		$simpleElement->addText($linkInformation);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+
+		$settingElement->addText ($simpleIndent);
+		$settingElement->appendChild ($simpleElement);
+		$settingElement->addText($settingIndent);
+		}
+
+	if (@successCodes)
+		{
+		$settingElement = $settingElementTemplate->cloneNode(0);
+		$settingElement->setAttribute("entry", "successCodes");
+
+		my $arrayElement = new XML::DOM::Element($xmlLinkDescriptorDoc,"array");
+		$arrayElement->setAttribute("inheritance", "none");
+		
+		foreach my $successCode (@successCodes)
+			{
+			$simpleElement = $simpleElementTemplate->cloneNode(0);
+			$simpleElement->addText($successCode);
+			$arrayElement->addText ($successCodeSimpleIndent);
+			$arrayElement->appendChild ($simpleElement);
+			}
+
+		$arrayElement->addText ($successCodeArrayIndent);
+
+		$settingElement->addText ($successCodeArrayIndent);
+		$settingElement->appendChild ($arrayElement);
+		$settingElement->addText($settingIndent);
+
+		$structElement->addText ($settingIndent);
+		$structElement->appendChild ($settingElement);
+		}
+
+	$structElement->addText($structIndent);
+}
+
+
+sub addLinkDescriptorSymbol ($$) {
+	my ($symbolName, $symbolValue) = @_;
+	
+	my $structIndent = "\n\t\t\t\t";
+	my $settingIndent = "$structIndent\t";
+	my $simpleIndent = "$settingIndent\t";
+
+	my $structElement = new XML::DOM::Element($xmlLinkDescriptorDoc,"struct");
+	$xmlLinkDescriptorSymbolParent->addText("$structIndent");
+	$xmlLinkDescriptorSymbolParent->appendChild ($structElement);
+
+	my $settingElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"setting");
+	$settingElementTemplate->setAttribute("uuid-alias", ".");
+	my $simpleElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"simple");
+
+	my $symbolNameSettingElement;
+	my $symbolNameSimpleElement;
+	my $symbolValueSettingElement;
+	my $symbolValueSimpleElement;
+
+	$symbolNameSettingElement = $settingElementTemplate->cloneNode(0);
+	$symbolNameSimpleElement = $simpleElementTemplate->cloneNode(0);
+	$symbolValueSettingElement = $settingElementTemplate->cloneNode(0);
+	$symbolValueSimpleElement = $simpleElementTemplate->cloneNode(0);
+
+	$symbolNameSettingElement->setAttribute("entry", "symbolName");
+	$symbolNameSimpleElement->addText ($symbolName);
+	$symbolValueSettingElement->setAttribute("entry", "symbolValue");
+	$symbolValueSimpleElement->addText ($symbolValue);
+
+	$symbolNameSettingElement->addText ($simpleIndent);
+	$symbolNameSettingElement->appendChild ($symbolNameSimpleElement);
+	$symbolNameSettingElement->addText($settingIndent);
+	$symbolValueSettingElement->addText ($simpleIndent);
+	$symbolValueSettingElement->appendChild ($symbolValueSimpleElement);
+	$symbolValueSettingElement->addText ($settingIndent);
+
+	$structElement->addText ($settingIndent);
+	$structElement->appendChild ($symbolNameSettingElement);
+	$structElement->addText ($settingIndent);
+	$structElement->appendChild ($symbolValueSettingElement);
+	$structElement->addText ($structIndent);
+	}
+
+
+sub addLinkDescriptorDumpFile ($$) {
+	my ($dumpFileContent, $dumpFileName) = @_;
+	
+	my $structIndent = "\n\t\t\t\t";
+	my $settingIndent = "$structIndent\t";
+	my $simpleIndent = "$settingIndent\t";
+
+	my $structElement = new XML::DOM::Element($xmlLinkDescriptorDoc,"struct");
+	$xmlLinkDescriptorDumpFileParent->addText("$structIndent");
+	$xmlLinkDescriptorDumpFileParent->appendChild ($structElement);
+
+	my $settingElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"setting");
+	$settingElementTemplate->setAttribute("uuid-alias", ".");
+	my $simpleElementTemplate = new XML::DOM::Element($xmlLinkDescriptorDoc,"simple");
+
+	my $dumpFileContentSettingElement;
+	my $dumpFileContentSimpleElement;
+	my $dumpFileNameSettingElement;
+	my $dumpFileNameSimpleElement;
+
+	$dumpFileContentSettingElement = $settingElementTemplate->cloneNode(0);
+	$dumpFileContentSimpleElement = $simpleElementTemplate->cloneNode(0);
+	$dumpFileNameSettingElement = $settingElementTemplate->cloneNode(0);
+	$dumpFileNameSimpleElement = $simpleElementTemplate->cloneNode(0);
+
+	$dumpFileContentSettingElement->setAttribute("entry", "dumpFileContent");
+	$dumpFileContentSimpleElement->addText ($dumpFileContent);
+	$dumpFileNameSettingElement->setAttribute("entry", "dumpFileName");
+	$dumpFileNameSimpleElement->addText ($dumpFileName);
+
+	$dumpFileContentSettingElement->addText ($simpleIndent);
+	$dumpFileContentSettingElement->appendChild ($dumpFileContentSimpleElement);
+	$dumpFileContentSettingElement->addText($settingIndent);
+	$dumpFileNameSettingElement->addText ($simpleIndent);
+	$dumpFileNameSettingElement->appendChild ($dumpFileNameSimpleElement);
+	$dumpFileNameSettingElement->addText ($settingIndent);
+
+	$structElement->addText ($settingIndent);
+	$structElement->appendChild ($dumpFileContentSettingElement);
+	$structElement->addText ($settingIndent);
+	$structElement->appendChild ($dumpFileNameSettingElement);
+	$structElement->addText ($structIndent);
+	}
+
+
+sub ExtraPlat($) {
+
+# Call PmBld again after reprocessing the MMP file and tweaking various main:: variables
+
+	my ($Plat) = @_;
+	
+	&main::SetVarsFromMmp($Plat);
+	&main::InitLinkPaths();
+
+	foreach (&main::BldList) {
+		&main::SetCurBld($_);
+		&PMPlatProcessMmp(&main::PlatTxt2D);
+		&PMStartBldList;
+		&PMBld;
+	}
+
+}
+
+sub disconnectNode($) {
+
+# Remove a node from its parent, also removing the following text node (if any)
+# The text node is assumed to contain whitespace for file formatting.
+ 
+	my ($node)=@_;
+
+	my $parent = $node->getParentNode;
+	my $sibling = $node->getNextSibling;
+	$parent->removeChild($node);
+	if (defined $sibling && $sibling->getNodeType == TEXT_NODE)
+		{
+		$parent->removeChild($sibling);
+		}
+	return $node;
+}
+
+sub removeNode($) {
+
+# disconnect the node and dispose of it
+
+	my ($node) = @_;
+	&disconnectNode($node);
+	$node->dispose;		# setAttribute("disposed",1);
+}
+
+sub textElement($$$$) {
+	my ($element,$name,$value,$insertionpoint)=@_;
+
+	my $subElement = new XML::DOM::Element($xmlProjectDoc,$name);
+	$subElement->appendChild($xmlProjectDoc->createTextNode($value));
+	$element->insertBefore($subElement, $insertionpoint);
+}
+
+sub addFile($$$$;$) {    
+
+	my ($src, $kind, $debug, $shared, $group) = @_;
+
+	my $linkElement = new XML::DOM::Element($xmlProjectDoc,"FILEREF");
+
+	&textElement($linkElement, "PATHTYPE",   "Name");
+	&textElement($linkElement, "PATH",       $src);
+	&textElement($linkElement, "PATHFORMAT", "Windows");
+
+	my $fileElement = $linkElement->cloneNode(1);
+	$fileElement->setTagName("FILE");
+	&textElement($fileElement, "FILEKIND",   $kind);
+	&textElement($fileElement, "FILEFLAGS",  "Debug") if ($debug);
+
+	$xmlLinkOrder->appendChild($linkElement);
+	$xmlFileList->appendChild($fileElement);
+
+	$xmlLinkOrder->addText("\n");
+	$xmlFileList->addText("\n");
+
+	# Accumulate source group information
+
+	my $groupfile = $linkElement->cloneNode(1);
+	$groupfile->setAttribute("NAME", "$shared$src");			# convenience - remove this later!
+
+	push (@addedFiles, $src) unless ($kind eq "Documents");
+
+	if ($kind eq "Library")
+		{
+		$xmlLibGroup->appendChild($groupfile);
+		$xmlLibGroup->addText("\n");
+		}
+	elsif (defined $group)
+		{
+		if ($group eq "Link")
+			{
+			$xmlLinkGroup->appendChild($groupfile);
+			$xmlLinkGroup->addText("\n");
+			}
+		elsif ($group eq "Resources")
+			{
+			$xmlResourcesGroup->appendChild($groupfile);
+			$xmlResourcesGroup->addText("\n");
+			}
+		elsif ($group eq "Root")
+			{
+			$xmlRootGroup->appendChild($groupfile);
+			$xmlRootGroup->addText("\n");
+			}
+		elsif ($group eq "Headers")
+			{
+			$xmlHeadersGroup->appendChild($groupfile);
+			$xmlHeadersGroup->addText("\n");
+			}
+		elsif ($group eq "Documents")
+			{
+			$xmlDocumentsGroup->appendChild($groupfile);
+			$xmlDocumentsGroup->addText("\n");
+			}
+		}
+	else
+		{
+		$xmlSourceGroup->appendChild($groupfile);
+		$xmlSourceGroup->addText("\n");
+		}
+}
+
+sub addGroup($$) {
+	my ($grouplist,$name)=@_;
+
+	my $group = new XML::DOM::Element($xmlProjectDoc,"GROUP");
+	$grouplist->appendChild($group);
+	$grouplist->addText("\n");
+
+	&textElement($group, "NAME", $name);
+	$group->addText("\n");
+	return $group;
+}
+
+sub addSubTarget($$) {
+	my ($subtargetlist,$name)=@_;
+
+	my $subtarget = new XML::DOM::Element($xmlProjectDoc,"SUBTARGET");
+	$subtargetlist->appendChild($subtarget);
+	$subtargetlist->addText("\n");
+
+	&textElement($subtarget, "TARGETNAME", $name);
+}
+
+sub addOrderedTarget($$) {
+	my ($targetorder,$name)=@_;
+
+	my $orderedtarget = new XML::DOM::Element($xmlProjectDoc,"ORDEREDTARGET");
+	$targetorder->appendChild($orderedtarget);
+	$targetorder->addText("\n");
+
+	&textElement($orderedtarget, "NAME", $name);
+}
+
+sub finaliseProject {
+
+	# Run through the project, removing all unused targets
+	# and build up the TARGETORDER list and the "Build All" target
+
+	my $target;
+	my $targetname;
+
+	my $xmlSubTargetList = new XML::DOM::Element($xmlProjectDoc,"SUBTARGETLIST");
+
+	my $xmlTargetOrder = new XML::DOM::Element($xmlProjectDoc,"TARGETORDER");
+	$xmlTargetOrder->addText("\n");
+
+	my @targets = $xmlProjectDoc->getElementsByTagName("TARGET",1);
+	my @emulatortargetnames;
+	my @othertargetnames;
+	
+	foreach $target (@targets)
+		{			
+		$targetname = $target->getAttribute("NAME");
+
+		if ($targetname eq "")
+			{
+			&removeNode($target);
+			}
+		else
+			{
+			$target->removeAttribute("NAME");
+
+			if ($targetname =~ /^WINSCW/)
+				{
+				push (@emulatortargetnames, $targetname);
+				}
+			else
+				{
+				push (@othertargetnames, $targetname);
+				}
+			}
+		}
+
+	foreach $targetname ((sort @emulatortargetnames), (sort @othertargetnames))
+		{
+		&addSubTarget($xmlSubTargetList, $targetname);
+		&addOrderedTarget($xmlTargetOrder, $targetname);
+		}
+
+	# Build the GROUPLIST
+	
+	my $xmlGroupList = new XML::DOM::Element($xmlProjectDoc,"GROUPLIST");
+
+	# Build the "Root" group
+
+	my %rootfiles;
+	my @rootgroups = $xmlProjectDoc->getElementsByTagName("ROOTGROUP",1);
+	foreach my $group (@rootgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			my $name = $file->getAttribute("NAME");
+			if (!defined $rootfiles{$name})
+				{
+				# first occurrence - add to list
+				$rootfiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);					
+				$xmlGroupList->appendChild($file);
+				$xmlGroupList->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+	# Build the "Source" group
+
+	my $xmlSourceGroup = &addGroup($xmlGroupList,"Source");
+	my %sourcefiles;
+	my @sourcegroups = $xmlProjectDoc->getElementsByTagName("SOURCEGROUP",1);
+	foreach my $group (@sourcegroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			my $name = $file->getAttribute("NAME");
+			if (!defined $sourcefiles{$name})
+				{
+				# first occurrence - add to list
+				$sourcefiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+				$xmlSourceGroup->appendChild($file);
+				$xmlSourceGroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+
+	# Build the "Headers" group
+			
+	my $xmlHeadersGroup;
+	my %headerfiles;
+	my @headersgroups = $xmlProjectDoc->getElementsByTagName("HEADERSGROUP",1);
+	foreach my $group (@headersgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			# Only create the "Headers" group if there are some files to add to it
+			if (!defined $xmlHeadersGroup)
+				{
+				$xmlHeadersGroup = &addGroup($xmlGroupList,"Headers");
+				}
+				
+			my $name = $file->getAttribute("NAME");
+			if (!defined $headerfiles{$name})
+				{
+				# first occurrence - add to list
+				$headerfiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+				$xmlHeadersGroup->appendChild($file);
+				$xmlHeadersGroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+
+	# Build the "Resources" group
+			
+	my $xmlResourcesGroup;
+	my %resourcesfiles;
+	my @resourcesgroups = $xmlProjectDoc->getElementsByTagName("RESOURCESGROUP",1);
+	foreach my $group (@resourcesgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			# Only create the main "Resources" groups if there are some files to add
+			# to them
+			if (!defined $xmlResourcesGroup)
+				{
+				$xmlResourcesGroup = &addGroup($xmlGroupList,"Resources");
+				}
+				
+			my $name = $file->getAttribute("NAME");
+			if (!defined $resourcesfiles{$name})
+				{
+				# first occurrence - add to list
+				$resourcesfiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+
+				$xmlResourcesGroup->appendChild($file);
+				$xmlResourcesGroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+		
+	# Build the "Link" group
+			
+	my $xmlLinkGroup = &addGroup($xmlGroupList,"Link");
+	my %linkfiles;
+	my @linkgroups = $xmlProjectDoc->getElementsByTagName("LINKGROUP",1);
+	foreach my $group (@linkgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			my $name = $file->getAttribute("NAME");
+			if (!defined $linkfiles{$name})
+				{
+				# first occurrence - add to list
+				$linkfiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+				$xmlLinkGroup->appendChild($file);
+				$xmlLinkGroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+
+	# Build the "Documents" group
+			
+	my $xmlDocumentsGroup;
+	my %documentfiles;
+	my @documentgroups = $xmlProjectDoc->getElementsByTagName("DOCUMENTSGROUP",1);
+	foreach my $group (@documentgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{				
+			# Only create the "Documents" group if there are some files to add to it
+			if (!defined $xmlDocumentsGroup)
+				{
+				$xmlDocumentsGroup = &addGroup($xmlGroupList,"Documents");
+				}
+
+			my $name = $file->getAttribute("NAME");
+
+			
+			if (!defined $documentfiles{$name})
+				{
+				# first occurrence - add to list
+				$documentfiles{$name}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+				$xmlDocumentsGroup->appendChild($file);
+				$xmlDocumentsGroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+
+	# Build the "Lib" group and its subgroups
+
+	my $xmlLibGroup = &addGroup($xmlGroupList, "Libraries");
+	my %libplats;
+	my @libgroups = $xmlProjectDoc->getElementsByTagName("LIBGROUP",1);
+	foreach my $group (@libgroups)
+		{
+		$targetname = $group->getAttribute("TARGET");
+		my $plat = $group->getAttribute("PLAT");
+		if (!defined $libplats{$plat})
+			{
+			$libplats{$plat} = &addGroup($xmlLibGroup, $plat);
+			}
+		my $platgroup = $libplats{$plat};
+		my @files = $group->getElementsByTagName("FILEREF",0);
+		foreach my $file (@files)
+			{
+			my $name = $file->getAttribute("NAME");
+			if (!defined $sourcefiles{"$plat\\$name"})
+				{
+				# first occurrence - add to list
+				$sourcefiles{"$plat\\$name"}=1;
+				&textElement($file, "TARGETNAME", $targetname, $file->getFirstChild);
+				$file->removeAttribute("NAME");
+				&disconnectNode($file);
+				$platgroup->appendChild($file);
+				$platgroup->addText("\n");
+				}
+			}
+		&removeNode($group);
+		}
+
+	# Replace the GROUPLIST & TARGETORDER in the template document
+
+	my $node = $xmlProjectDoc->getElementsByTagName("GROUPLIST",1)->item(0);
+	$node->getParentNode->replaceChild($xmlGroupList, $node);
+
+	$node = $xmlProjectDoc->getElementsByTagName("TARGETORDER",1)->item(0);
+	$node->getParentNode->replaceChild($xmlTargetOrder, $node);
+
+	# Insert the "Build All" target
+
+	my $xmlBuildAll = new XML::DOM::Element($xmlProjectDoc,"TARGET");
+	$xmlBuildAll->addText("\n");
+	&textElement($xmlBuildAll, "NAME", "Build All");
+	my $settinglist = new XML::DOM::Element($xmlProjectDoc,"SETTINGLIST");
+	&textSetting($settinglist, "Linker", "None");
+	&textSetting($settinglist, "Targetname", "Build All");
+	$xmlBuildAll->appendChild($settinglist);
+	$xmlBuildAll->addText("\n");
+	&textElement($xmlBuildAll, "FILELIST", "");
+	$xmlBuildAll->addText("\n");
+	&textElement($xmlBuildAll, "LINKORDER", "");
+	$xmlBuildAll->addText("\n");
+	$xmlBuildAll->appendChild($xmlSubTargetList);
+
+	&addOrderedTarget($xmlTargetOrder, "Build All");
+
+	$node = $xmlProjectDoc->getElementsByTagName("TARGETLIST",1)->item(0);
+	$node->appendChild($xmlBuildAll);
+
+	# Output the result
+
+	&main::Output(
+		$xmlProjectDoc->toString
+	);
+
+}
+
+sub PMEndSrcList {
+
+	my @PlatList=&main::PlatOverrideList();
+	
+	if (scalar @PlatList == 0)
+		{
+		@PlatList = ("WINSCW", "ARM4", "ARMV5");
+
+		if ($CW_major_version >= 3)
+			{
+			push @PlatList, "ARMV5_ABIV1";
+			}
+		}
+
+	shift @PlatList;	# we've already done the first one in the list
+	foreach (@PlatList)
+		{
+		ExtraPlat($_);
+		}
+
+	&finaliseProject();
+
+}
+
+sub GetGCCELibPath($) {
+	my $gnulibgccPath;
+	open PIPE, "arm-none-symbianelf-g++ $_[0] 2>&1 | ";
+	while(<PIPE>){
+		$gnulibgccPath = $_;
+		$gnulibgccPath =~ s/\//\\/g;
+	}
+	close PIPE;
+	my $SearchlibgccDir = &main::Path_Chop(&main::Path_Split('Path', $gnulibgccPath));
+
+	return $SearchlibgccDir;
+}
+
+sub Read_BSF_Options() {
+        my %plat = (main::PlatRec());
+		my @Customization_Data = split(/\n/,$plat{'CUSTOMIZATION_DATA'});
+	foreach my $option (@Customization_Data) {
+			next if ($option =~ /^$/);
+	        warn "Unrecognized BSF syntax: $option.\n"
+		        unless ($option =~ /\s*(\S+)\s+(.+)$/);
+		my $key = uc $1;
+		my $val = $2;
+	        warn "Unrecognized BSF keyword: $key.\n"
+		        unless ($BSF_keywords{$key});
+		if ($key =~ /COMMON_OPTIONS/) {
+		        push @commonOptions, $val;
+			next;
+		}
+		if ($key =~ /THUMB_OPTIONS/) {
+		        push @thumbOptions, $val;
+			next;
+		}
+		if ($key =~ /ARM_OPTIONS/) {
+		        push @armOptions, $val;
+			next;
+		}
+		if ($key =~ /KERNEL_OPTIONS/) {
+		        push @kernelOptions, $val;
+			next;
+		}
+		if ($key =~ /INVARIANT_OPTIONS/) {
+		        push @invariantOptions, $val;
+			next;
+		}
+		if ($key =~ /LD_OPTIONS/) {
+		        push @linkerOptions, $val;
+			next;
+		}
+		if ($key =~ /AR_OPTIONS/) {
+		        push @archiverOptions, $val;
+			next;
+		}
+
+	}
+}
+
+# Set the options passed from BSF file 
+# @param OptionName    - BSF Keyword using which the options would be overridden in the BSF file
+# @param Options       - List of options read from the BSF keyword
+sub Set_BSF_Options($$)
+{
+	my ($OptionName,$Options) = @_;
+	my @Fragments=();
+	
+	if ($CustPlat{'CUSTOMIZES'} && ($CustPlat{'ROOTPLATNAME'} eq "GCCE"))
+	{
+		$CustGCCE=1;
+	}
+	foreach my $val (@{$Options})
+	{		
+		# Check if the value of BSF option is to be set or added/removed.
+		if($val =~ /\+\[.*\]\+|\-\[.*\]\-/)
+		{
+			if (@Fragments = Cl_bpabi::Split_BSF_Options($val,'RemoveOptions'))
+			{
+				foreach my $Opt (@Fragments) 
+				{
+					# Remove trailing white spaces
+					$Opt =~ s/\s+$//;
+					# Substitute '=' with '%' which is a wild card character in makefile.
+					# This is required for cases where option to be removed contains '=' (e.g.'-march=armv5t').
+					# When such options are to be removed, "$(INVARIANT_OPTIONS:-march=armv5t=)" is written in the makefile.
+					# However, because of the occurence of '=', pattern match fails in the makefile and such options are not removed. 
+					# To resolve this, '=' is replaced with '%'  in the makefile so that the substitution pattern looks like 
+					# "$(INVARIANT_OPTIONS:-march%armv5t=)" in makefile (e.g."$(INVARIANT_OPTIONS:-march%armv5t=)").
+					$Opt =~ s/=/%/;
+					if((($OptionName =~ /COMMON_OPTIONS/)
+					|| ($OptionName =~ /THUMB_OPTIONS/)
+					|| ($OptionName =~ /ARM_OPTIONS/)
+					|| ($OptionName =~ /KERNEL_OPTIONS/)
+					|| ($OptionName =~ /INVARIANT_OPTIONS/))
+					&& ($CustGCCE))
+					{
+						$GCCE_CompilerOption = RemoveBsfOptions($Opt,$GCCE_CompilerOption);
+					}
+					elsif($OptionName =~ /COMMON_OPTIONS/)
+					{
+						$CCFLAGS = RemoveBsfOptions($Opt,$CCFLAGS);
+					}
+					elsif(($OptionName =~ /THUMB_OPTIONS/)
+					|| ($OptionName =~ /ARM_OPTIONS/)
+					|| ($OptionName =~ /KERNEL_OPTIONS/))
+					{
+						$CCFLAGS = RemoveBsfOptions($Opt,$CCFLAGS);
+					}
+					elsif($OptionName =~ /INVARIANT_OPTIONS/)
+					{
+						$CCFLAGS = RemoveBsfOptions($Opt,$CCFLAGS);
+					}
+					elsif($OptionName =~ /LD_OPTIONS/)
+					{
+						$linkeropts = RemoveBsfOptions($Opt,$Link);
+						$linkCommand = RemoveBsfOptions($Opt,$Link);
+					}
+					elsif($OptionName =~ /AR_OPTIONS/)
+					{
+						$archiveropts = RemoveBsfOptions($Opt,$linkCommand);
+					}
+				}					
+				@Fragments=();
+			}
+			
+			if (@Fragments = Cl_bpabi::Split_BSF_Options($val,'AddOptions')) 
+			{
+				my $v;
+				foreach $v (@Fragments)
+				{
+					if((($OptionName =~ /COMMON_OPTIONS/)
+					|| ($OptionName =~ /THUMB_OPTIONS/)
+					|| ($OptionName =~ /ARM_OPTIONS/)
+					|| ($OptionName =~ /KERNEL_OPTIONS/)
+					|| ($OptionName =~ /INVARIANT_OPTIONS/))
+					&& ($CustGCCE))
+					{
+						$GCCE_CompilerOption .= ' '.$v.' ';
+					}
+					elsif($OptionName =~ /COMMON_OPTIONS/)
+					{
+						$bsfaddoptions .= ' '.$v.' '; 						
+					}
+					elsif(($OptionName =~ /THUMB_OPTIONS/)
+					|| ($OptionName =~ /ARM_OPTIONS/)
+					|| ($OptionName =~ /KERNEL_OPTIONS/))
+					{
+						$bsfaddoptions .= ' '.$v.' ';	
+					}
+					elsif($OptionName =~ /INVARIANT_OPTIONS/)
+					{
+						$bsfaddoptions .= ' '.$v.' ';
+					}
+					elsif($OptionName =~ /LD_OPTIONS/)
+					{
+						$linkeropts .= ' '.$v.' ';
+					}
+					elsif($OptionName =~ /AR_OPTIONS/)
+					{
+						$archiveropts .= ' '.$v.' ';
+					}
+				}
+				@Fragments=();
+			}
+		}
+		else
+		{
+			if((($OptionName =~ /COMMON_OPTIONS/)
+			|| ($OptionName =~ /THUMB_OPTIONS/)
+			|| ($OptionName =~ /ARM_OPTIONS/)
+			|| ($OptionName =~ /KERNEL_OPTIONS/)
+			|| ($OptionName =~ /INVARIANT_OPTIONS/))
+			&& ($CustGCCE))
+			{
+				$GCCE_CompilerOption .= ' '.$val.' ';
+			}
+			elsif($OptionName =~ /COMMON_OPTIONS/)
+			{
+				$bsfaddoptions .= ' '.$val.' ';
+			}
+			elsif(($OptionName =~ /THUMB_OPTIONS/)
+			|| ($OptionName =~ /ARM_OPTIONS/)
+			|| ($OptionName =~ /KERNEL_OPTIONS/))
+			{
+				$bsfaddoptions .= ' '.$val.' ';
+			}
+			elsif($OptionName =~ /INVARIANT_OPTIONS/)
+			{
+				$bsfaddoptions .= ' '.$val.' ';
+			}
+			elsif($OptionName =~ /LD_OPTIONS/)
+			{
+				$linkeropts .= ' '.$val.' ';
+			}
+			elsif($OptionName =~ /AR_OPTIONS/)
+			{
+				$archiveropts .= ' '.$val.' ';
+			}
+		}	
+	}
+}
+
+sub RemoveBsfOptions($$)
+{
+	my ($Opt_to_replace,$Opt_replaced_in) = @_;
+	
+	$Opt_replaced_in =~ s/$Opt_to_replace//g;
+	return $Opt_replaced_in;
+}
+
+# function to expand the macro as pass with appropriate options
+sub printlist {
+	my $option =shift @_;
+	my @list = @_,
+	my $data;
+	my $finalval=undef;
+	
+	foreach $data (@list)
+	{
+		if($option =~ "-D") {
+			$finalval .= " ".$option.$data;	
+		}
+		else {
+			$finalval .= " ".$option." ".$data;
+		}
+	}
+	return $finalval;
+}
+
+#read the configuration make file into the HASH and use them for further processing
+sub collect_config_data {
+	my($configfile) = @_;
+	open(DATA, "<$configfile");
+	while(<DATA>) 
+	{	
+		my $line = $_;
+		if($line =~ /=/)
+		{
+			if ($line =~ /(.*):=(.*)/)
+			{ 
+				$configdata{$1}=$2;
+			}
+			elsif ($line =~ /(.*)=(.*=.*)/)
+			{ 
+				$configdata{$1}=$2;
+			}
+			elsif ($line =~ /(.*)=(.*)/)
+			{ 
+				$configdata{$1}=$2;
+			}
+		}
+	}
+	close(DATA)
+}
+
+#function is ti fetch the contents of the config data which is read from the configuration make file, 
+# for ex: KERNEL_OPTIONS=$(ARM_INSTRUCTION_SET) $(NO_EXCEPTIONS), this function extracts the value for ARM_INSTRUCTION_SET & NO_EXCEPTIONS
+sub fetch_config_data {
+	my($list) = @_;
+	my $op;
+	my $op1;
+	my $finaldata = undef;
+	
+	my @ip_options = split(/\s+/, $list);	
+	foreach $op (@ip_options)
+	{
+		$op =~ s/\)//g;
+		$op =~ s/\$\(//g;
+		if($op =~ /-/) {
+			$finaldata .= " ".$op;
+		}
+		else {
+			$finaldata .= " ".$configdata{$op};
+		}
+	}
+	return $finaldata;
+}
+
+# function to fix the bsf options, if the bsf option is already present in the CCFLAGS then remove from it so that it can be added from bsf,
+# this is to avoid the duplication of the options passed to the compiler.
+sub fixbsfoptions {
+	my ($options) = @_;
+	my $ccflgs = $CCFLAGS;
+	my $d;
+	my $Pattern = '-{1,2}\S+\s*(?!-)\S*';
+	my @list = $options =~ /$Pattern/g;
+	foreach $d (@list) {
+		if($ccflgs =~ /$d/) {
+				$ccflgs =~ s/$d//g;	
+		}
+		else {
+			if($d =~ /(.*)\s+(.*)/) {
+				my $a = $1;
+				if($ccflgs =~ /$a\s+\S+/) {
+					$ccflgs =~ s/$a\s+\S+//g;
+				}
+			}
+		}
+	}
+	$CCFLAGS = $ccflgs;
+}
+
+# funtion to get the list if the libraries to be linked during linking
+sub GetLibList() {
+	my @LibList;
+	my @StaticLibList;
+	my $Plat=&main::Plat;
+	unless(defined($ENV{RVCT_VER_MAJOR})){
+		my ($rvct_M, $rvct_m, $rvct_b) = RVCT_plat2set::get_version_list($Plat);
+		$ENV{RVCT_VER_MAJOR}=$rvct_M;
+	}
+	&Cl_bpabi::getVariableForNewPlat();
+	my $list = &Cl_bpabi::getConfigVariable('STATIC_LIBS_LIST') ;
+	
+	if (length($list) >0)
+	{
+		@StaticLibList = split(/\s+/, $list);
+	}
+	if($Plat eq "ARMV5" || $Plat eq "ARMV5_ABIV2" || IsCustomization($Plat)) {
+		@LibList=&Armutl_ArmLibList;
+		if(@LibList==0) {
+			my $LibDir = Armutl_ArmLibDir();
+			if (@StaticLibList) {
+				foreach my $lib (@StaticLibList) {
+					push @LibList, ("$LibDir\\$lib");
+				}
+			}
+		}
+	}
+	else
+	{
+		@LibList = ('$(STATIC_LIBS_LIST)');
+	}
+	return @LibList;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/ide_vc6.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1262 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Makmake-module for creating MAKMAKE MSVC6 IDE makefiles shared by windows platform modules
+# 
+#
+
+package Ide_vc6;
+
+# declare variables global for module
+my $BaseAddressFlag;
+my @CppCall;
+my %IdeBlds=();
+my %PrjHdrs=();
+my @Win32LibList=();
+my $Win32Resrc;
+my $Win32StdHeaders;
+my $MSVCVer;
+
+my $SupText='';
+
+
+require Exporter;
+@ISA=qw(Exporter);
+
+@EXPORT=qw(
+	PMHelp_Mmp
+
+	PMCheckPlatformL
+
+	PMPlatProcessMmp
+
+	PMStartBldList
+		PMBld
+	PMEndBldList
+	PMStartSrcList
+			PMResrcBld
+			PMDoc
+			PMStartSrc
+			PMSrcDepend
+	PMEndSrcList
+);
+
+use Winutl;
+use Pathutl;
+
+sub PMHelp_Mmp {
+# get the windows help from WINUTL
+	&Winutl_Help_Mmp;
+}
+
+sub PMCheckPlatformL {
+	if ((&main::Plat eq 'TOOLS') and (&main::BasicTrgType ne 'EXE') and (&main::BasicTrgType ne 'LIB')) {
+		die "Can't specify anything but EXE or LIB targettypes for this platform\n";
+	}
+}
+
+sub PMPlatProcessMmp (@) {
+
+	# get WINUTL to do the windows mmp file processing
+	&Winutl_DoMmp(\@_, $ENV{INCLUDE});
+	$BaseAddressFlag=&Winutl_BaseAddress;
+	$BaseAddressFlag=~s/^(.+$)$/ \/base:\"$1\"/o;
+	@Win32LibList=&Winutl_Win32LibList;
+	my $MSVCVer = &Winutl_MSVCVer;
+	push @Win32LibList, "kernel32.lib";
+	$Win32Resrc=&Winutl_Win32Resrc;
+	$Win32StdHeaders=&Winutl_Win32StdHeaders;
+}
+
+sub PMStartBldList($) {
+	my ($makecmd) = @_;
+	die "Cannot generate $makecmd makefiles\n" if ($makecmd ne "nmake");
+	my $BaseTrg=&main::BaseTrg;
+	my @BldList=&main::BldList;
+	my $BldPath=&main::BldPath;
+	my $ChopDataPath=&main::Path_Chop(&main::DataPath);
+	my $ChopTrgPath=&main::Path_Chop(&main::TrgPath);
+	my $DefFile=&main::DefFile;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $ExportLibrary=&main::ExportLibrary;
+	my $LibPath=&main::LibPath;
+
+	my $MSVCVer = &Winutl_MSVCVer;
+
+	my $LinkPath=&main::LinkPath;
+	my $Plat=&main::Plat;
+	my $RelPath=&main::RelPath;
+	my $Trg=&main::Trg;
+	my $StatLinkPath=&main::StatLinkPath;
+	my $TrgType=&main::TrgType;
+
+
+	# set up global IDE builds variable
+	%IdeBlds= (
+		UREL=> "$BaseTrg - Win32 Uni Release",
+		UDEB=> "$BaseTrg - Win32 Uni Debug",
+	);
+	if (&main::Plat eq 'TOOLS') {
+		%IdeBlds= (
+			REL=> "$BaseTrg - Win32 Release",
+			DEB=> "$BaseTrg - Win32 Debug",
+		);
+	}
+	
+
+#	Start the supplementary makefile
+
+	$SupText.=join('',
+		"\n",
+#			need to set path here because MSDEV might be set up so that
+#			it does not take account of the PATH environment variable
+		"PATH=$ENV{PATH}\n",
+		"\n",
+		"# EPOC DEFINITIONS\n",
+		"\n",
+		"EPOCBLD = $BldPath #\n",
+		"EPOCTRG = $RelPath #\n",
+		"EPOCLIB = $LibPath #\n",
+		"EPOCLINK = $LinkPath #\n",
+		"EPOCSTATLINK = $StatLinkPath #\n",
+		"\n"
+	);
+			
+	if ($BasicTrgType eq 'DLL' || $TrgType eq 'EXEXP') {
+		foreach (@BldList) {
+			$SupText.=join('',
+				"EPOCBLD$_ = \$(EPOCBLD)$_\n",
+				"EPOCTRG$_ = \$(EPOCTRG)$_\n",
+				"EPOCLIB$_ = \$(EPOCLIB)UDEB\n",
+				"EPOCLINK$_ = \$(EPOCLINK)UDEB\n",
+				"EPOCSTATLINK$_ = \$(EPOCSTATLINK)$_\n",
+				"\n"
+			);
+		}
+		$SupText.="\nTRGDIR = ";
+		if ($Plat!~/^WINC$/o && $ChopTrgPath) {	# target path not allowed under WINC
+			$SupText.=$ChopTrgPath;
+		}
+		else {
+			$SupText.=".\\";
+		}
+		$SupText.="\n\nDATADIR = $ChopDataPath\n\n";
+
+
+#		commands for creating the import library
+		$SupText.="LIBRARY :";
+		if ($DefFile) {
+			unless (&main::ExportUnfrozen) {
+				if (-e $DefFile) { # effectively "if project frozen ..."
+					$SupText.=" \"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\"\n";
+				}
+				else {
+					$SupText.=join('',
+						"\n",
+						"\t\@echo WARNING: Not attempting to create \"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\".\n",
+						"\t\@echo When exports are frozen in \"$DefFile\", regenerate Makefile.\n"
+					);
+				}
+			}
+			else {
+				$SupText.=join('',
+					"\n",
+					"\t\@echo Not attempting to create \"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\"\n",
+					"\t\@echo from frozen .DEF file, since EXPORTUNFROZEN specified.\n"
+				);
+			}
+			$SupText.=join('',
+				"\n",
+				"\n",
+				"# REAL TARGET - IMPORT LIBRARY\n",
+				"\n",
+				"\"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\" : \"$DefFile\" MAKEWORKLIBRARY\n",
+				"\tperl -S prepdef.pl \"$DefFile\" \"\$(EPOCBLD)\\$ExportLibrary.prep.def\"\n",
+				"\tlib.exe /nologo /machine:i386 /nodefaultlib /name:\"$Trg\" /def:\"\$(EPOCBLD)\\$ExportLibrary.prep.def\" /out:\"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\"\n",
+				"\tdel \"\$(EPOCLIB)UDEB\\$ExportLibrary.exp\"\n"
+			);
+		}
+		$SupText.=join('',
+			"\n",
+			"\n",
+			"MAKEWORKLIBRARY : \"${LibPath}UDEB\"\n",
+			"\n",
+			"\"${LibPath}UDEB\" :\n"
+		);
+		$SupText.="\t\@perl -S emkdir.pl \"${LibPath}UDEB\"\n\n\n";
+	}
+
+
+
+	&main::Output(
+		"# Microsoft Developer Studio Project File - Name=\"$BaseTrg\" - Package Owner=<4>\n",
+		"# Microsoft Developer Studio Generated Build File, Format Version 6.00\n",
+		"# ** DO NOT EDIT **\n",
+		"\n"
+	);
+
+	if ($BasicTrgType=~/^DLL$/o) {
+		&main::Output(
+			"# TARGTYPE \"Win32 (x86) Dynamic-Link Library\" 0x0102\n"
+		);
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		if (not &main::Plat=~/^(WINC|TOOLS)$/o) {
+			&main::Output(
+				"# TARGTYPE \"Win32 (x86) Application\" 0x0101\n"
+			);
+		}
+		else {
+			&main::Output(
+				"# TARGTYPE \"Win32 (x86) Console Application\" 0x0103\n"
+			);
+		}
+	}
+	elsif ($BasicTrgType=~/^(LIB)$/o) {
+		&main::Output(
+			"# TARGTYPE \"Win32 (x86) Static Library\" 0x0104\n"
+		);
+	}
+	
+	&main::Output(
+		"\n",
+		"CFG=",$IdeBlds{$BldList[0]},"\n",
+		"!MESSAGE This is not a valid makefile. To build this project using NMAKE,\n",
+		"!MESSAGE use the Export Makefile command and run\n",
+		"!MESSAGE \n",
+		"!MESSAGE NMAKE /f \"",$BaseTrg,".mak\".\n",
+		"!MESSAGE \n",
+		"!MESSAGE You can specify a configuration when running NMAKE\n",
+		"!MESSAGE by defining the macro CFG on the command line. For example:\n",
+		"!MESSAGE \n",
+		"!MESSAGE NMAKE /f \"",$BaseTrg,".mak\" CFG=\"".$IdeBlds{$BldList[0]}."\"\n",
+		"!MESSAGE \n",
+		"!MESSAGE Possible choices for configuration are:\n",
+		"!MESSAGE \n"
+	);
+	&main::OutSetLength(79);
+	if ($BasicTrgType=~/^DLL$/o) {
+		foreach (reverse @BldList) { # reverse because VC6 takes last as the default
+			&main::OutFormat(
+				"!MESSAGE \"",$IdeBlds{$_},"\" (based on \"Win32 (x86) Dynamic-Link Library\")"
+			);
+			&main::Output();
+		}
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		if (not &main::Plat=~/^(WINC|TOOLS)$/o) {
+			foreach (reverse @BldList) {
+				&main::OutFormat(
+					"!MESSAGE \"",$IdeBlds{$_},"\" (based on \"Win32 (x86) Application\")"
+				);
+				&main::Output();
+			}
+		}
+		else {
+			foreach (reverse @BldList) {
+				&main::OutFormat(
+					"!MESSAGE \"",$IdeBlds{$_},"\" (based on \"Win32 (x86) Console Application\")"
+				);
+				&main::Output();
+			}
+		}
+	}
+	elsif ($BasicTrgType=~/^(LIB)$/o) {
+		foreach (@BldList) {
+			&main::OutFormat(
+				"!MESSAGE \"",$IdeBlds{$_},"\" (based on \"Win32 (x86) Static Library\")"
+			);
+			&main::Output();
+		}
+	}
+	&main::OutSetLength();
+	&main::Output(
+		"!MESSAGE \n",
+		"\n"
+	);
+
+	# BEGIN THE PROJECT
+	#------------------
+	&main::Output(
+		"# Begin Project\n",
+		"# PROP Scc_ProjName \"\"\n",
+		"# PROP Scc_LocalPath \"\"\n",
+		"CPP=cl.exe\n",
+		"MTL=midl.exe\n",
+		"RSC=rc.exe\n",
+		"\n"
+	);
+}
+
+sub PMBld {
+
+	my @BaseSrcList=&main::BaseSrcList;
+	my $BaseTrg=&main::BaseTrg;
+	my $Bld=&main::Bld;
+	my @BldList=&main::BldList;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my $ChopLinkPath=&main::Path_Chop(&main::LinkPath);
+	my $ChopRelPath=&main::Path_Chop(&main::RelPath);
+	my $ChopStatLinkPath=&main::Path_Chop(&main::StatLinkPath);
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $ExportLibrary=&main::ExportLibrary;
+	my $DefFile=&main::DefFile;
+	my $FirstLib=&main::FirstLib;
+	my $BasicTrgType=&main::BasicTrgType;
+	my @MacroList=&main::MacroList();
+	push @MacroList, "__SUPPORT_CPP_EXCEPTIONS__";
+    my $VariantFile=&main::VariantFile();
+
+
+	my @LibList;
+	my $PathBaseDsp=&main::MakeFilePath.&main::BaseMak;
+	my @StatLibList=&main::StatLibList;
+	my $Trg=&main::Trg;
+	my $TrgPath=&main::TrgPath;
+	my $TrgType=&main::TrgType;
+	
+	my $newlib = main::NewLib(); # Check if newlib has been set in the MMP file.
+	my $NewLib = 'scppnwdl.lib'; # This is where operator new and operator delete
+                                 # are defined for user side targets.
+	my $NewKernLib = 'scppnwdl_kern.lib'; # This is where operator new and operator delete
+                                 	  # are defined for kernel side targets.
+
+
+	if ($Bld =~ /DEB/) {
+		@LibList=&main::DebugLibList;
+	} else {
+		@LibList=&main::LibList;
+	}
+
+	my $NotUseWin32LibsFlag="";
+	unless ($Win32StdHeaders or &main::Plat eq 'TOOLS') {
+		$NotUseWin32LibsFlag=" /X"; # this flag suppresses searching of the standard directories for header files
+	}
+
+
+	if ($Bld eq $BldList[0]) {
+		&main::Output(
+			"!IF  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+	}
+	else {
+		&main::Output(
+			"!ELSEIF  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+	}
+	&main::Output(
+		"# PROP BASE Use_MFC 0\n"
+	);
+	if ($Bld=~/REL$/o) {
+		&main::Output(
+			"# PROP BASE Use_Debug_Libraries 0\n",
+			"# PROP BASE Output_Dir \".\\Win32_Un\"\n",
+			"# PROP BASE Intermediate_Dir \".\\Win32_Un\"\n"
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		&main::Output(
+			"# PROP BASE Use_Debug_Libraries 1\n",
+			"# PROP BASE Output_Dir \".\\Win32_U0\"\n",
+			"# PROP BASE Intermediate_Dir \".\\Win32_U0\"\n"
+		);
+	}
+	&main::Output(
+			"# PROP Use_MFC 0\n"
+	);
+	if ($Bld=~/REL$/o) {
+		&main::Output(
+			"# PROP Use_Debug_Libraries 0\n"
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		&main::Output(
+			"# PROP Use_Debug_Libraries 1\n"
+		);
+	}
+	&main::Output(
+		"# PROP Output_Dir \"$ChopRelPath\"\n",
+		"# PROP Intermediate_Dir \"$ChopBldPath\"\n",
+	);
+
+	&main::Output(
+		"# ADD CPP",
+		" /nologo",		# suppress "sign-on" banner message
+		" /Zp4"	,		# packs structures on 4 byte boundaries
+		" /GF"			# Pools strings and places them in read-only memory 
+	);
+
+	$MSVCVer = &Winutl_MSVCVer;
+
+	if ($MSVCVer >= 7) {
+		&main::Output(
+			" /wd4996",			# C4996: 'xxxx' was declared deprecated
+			" /wd4571"			# C4571: catch(...) blocks compiled with /EHs do not catch or re-throw Structured Exceptions
+		);	
+
+		if (&main::Plat ne 'TOOLS') {
+			&main::Output(
+				" /EHsc",			# Exceptions on
+				" /GR"				# RTTI on
+			);
+			if ($MSVCVer >= 8) {
+				&main::Output(
+					" /GS-"			# Buffer checking off
+				);
+			}
+		} else {
+			&main::Output(
+				" /EHsc",			# Exceptions on
+				" /GR",				# RTTI on
+				" /GS"				# Buffer checking on
+			);
+		}
+	} else {
+		if (&main::Plat ne 'TOOLS') {
+			&main::Output(
+					" /GX",				# Exceptions on
+					" /GR"				# RTTI on
+			);
+		}
+	}
+
+	if ($BasicTrgType=~/^EXE$/o) {
+		&main::Output(
+			' /MT'			# Creates a multi-threaded executable file, using libcmt.lib
+		);
+		if ($Bld=~/DEB$/o) {
+			&main::Output(
+				"d"			# i.e. /MTd, debug executable using debug version of libcmt
+			);
+		}
+	}
+	elsif (($BasicTrgType=~/^(DLL|LIB)$/o) and (&main::Plat ne 'TOOLS')) {
+		&main::Output(
+			" /MD"			# Creates a multithreaded DLL, using MSVCRT.LIB
+		);
+		if ($Bld=~/DEB$/o) {
+			&main::Output(
+				"d"			# i.e. /MDd, debug executable using debug version of msvcrt
+			);
+		}
+	}
+
+	if ($MSVCVer >= 8) {
+		&main::Output(
+			" /Zc:wchar_t-"				# Don't make wchar_t a built-in; breaks mangled names
+		);		
+	}
+
+	if (($MSVCVer >= 7) || (&main::Plat ne 'TOOLS')) {
+		&main::Output(
+			" /W4"
+		);
+	}
+
+	if ($Bld=~/DEB$/o) {
+		&main::Output(
+			" /Zi",		# Generates complete debugging information
+			" /Od"		# Disables optimization
+		);
+#		euser change to apply inlining on the _NAKED functions
+		if ($BaseTrg=~/^EUSER$/oi) {
+			&main::Output(
+				' /Ob1'	# Specific control of expension of inline functions
+			);
+		}
+	}
+	elsif ($Bld=~/REL$/o) {
+		&main::Output(
+			' /O1'				# Creates small code
+		);
+		if ($MSVCVer >= 8) {
+			&main::Output(
+				' /fp:strict'		# Improves floating-point consistency
+			);
+		} else {
+			&main::Output(
+				' /Op'				# Improves floating-point consistency
+			);
+		}
+
+	}
+	&main::Output(
+		"$NotUseWin32LibsFlag"
+	);
+	my @incList=();
+	my $candidate;
+	INCLOOP: foreach $candidate (@ChopUserIncPaths,@ChopSysIncPaths) {
+		my $accepted;	# remove duplicates
+		foreach $accepted (@incList) {
+			if ($candidate eq $accepted) {
+				next INCLOOP;
+			}
+		}
+		push @incList, $candidate;
+		&main::Output(
+			" /I \"$candidate\""
+		);
+	}
+	foreach (@MacroList) {
+		&main::Output(
+			" /D \"$_\""
+		);
+	}
+
+
+   if($VariantFile){
+        my $VariantFileFileName  = Path_Split('FILE',$VariantFile);
+        &main::Output(
+              " /FI\"$VariantFileFileName\""
+              );
+	}
+
+	if ($Bld=~/DEB$/o) {
+		&main::Output(
+			" /FR /Fd\"$ChopRelPath\\$TrgPath$BaseTrg.PDB\""
+		);
+	}
+	&main::Output(
+		" /c\n",
+	);
+
+	if ($BasicTrgType=~/^DLL$/o) {
+		&main::Output(
+			"# ADD MTL /nologo"
+		);
+		if ($Bld=~/REL$/o) {
+			&main::Output(
+				" /mktyplib203 /D"
+			);
+		}
+		elsif ($Bld=~/DEB$/o) {
+			&main::Output(
+				" /D \"_DEBUG\" /mktyplib203"
+			);
+		}
+		&main::Output(
+			" /win32\n"
+		);
+	}
+
+	&main::Output(
+		"# ADD BASE RSC /l 0x809\n",
+		"# ADD RSC /l 0x809 /d"
+	);
+	if ($Bld=~/REL$/o) {
+		&main::Output(
+			" \"NDEBUG\""
+		);
+	}
+	elsif ($Bld=~/DEB$/o) {
+		&main::Output(
+			" \"_DEBUG\""
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+
+	&main::Output(
+		"BSC32=bscmake.exe\n",
+		"# ADD BSC32 /nologo\n",
+	);
+
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			"LINK32=link.exe\n",
+			"# ADD BASE LINK32 /machine:IX86\n",
+			"# ADD LINK32"
+		);
+		unless (&main::Plat eq 'TOOLS') {
+			&main::Output(
+				" \"$ChopStatLinkPath\\$FirstLib\""
+			);
+			
+			unless ($newlib) {
+				if ( main::SystemTrg() ) {
+					# System targets are PDD, LDD, VAR, KEXT and KDLL.
+
+					&main::Output(
+						" \"$ChopStatLinkPath\\$NewKernLib\""
+					);
+				}
+				else {
+					&main::Output(
+						" \"$ChopStatLinkPath\\$NewLib\""
+					);
+				}
+			}
+			else {
+				&main::Output(
+					" \"$ChopStatLinkPath\\$newlib\""
+				);
+			}
+		}
+	}
+	elsif ($BasicTrgType=~/^LIB$/o) {
+		&main::Output(
+			"LIB32=link.exe -lib\n",
+			"# ADD BASE LIB32 /machine:IX86\n",
+			"# ADD LIB32"
+		);
+	}
+	foreach (@Win32LibList) {
+		&main::Output(
+			" \"",lc $_,"\""
+		);
+	}
+	foreach (@StatLibList) {
+		&main::Output(
+			" \"$ChopStatLinkPath\\",lc $_,"\""
+		);
+	}
+	foreach (@LibList) {
+		&main::Output(
+			" \"$ChopLinkPath\\",lc $_,"\""
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			" \"$ChopBldPath\\$ExportLibrary.exp\""
+		);
+	}
+	&main::Output(' /nologo');
+	if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+		&main::Output(
+			" /fixed:no $BaseAddressFlag"
+		);
+	}
+	if (&main::HeapSize) {
+		my %HeapSize=&main::HeapSize;
+		&main::Output(
+			' /heap:',$HeapSize{Max},',',$HeapSize{Min}
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			' /noentry /dll'
+		);
+	}
+	elsif ($BasicTrgType=~/^EXE$/o) {
+		unless (&main::Plat eq 'TOOLS') {
+			&main::Output(
+				' /entry:"?_E32Bootstrap@@YGXXZ"'
+			);
+		}
+	}
+	if (&main::Plat=~/^(WINC|TOOLS)$/o && $BasicTrgType=~/^EXE$/o) { # shouldn't really have WINC mentioned here
+		&main::Output(
+			' /subsystem:console'
+		);
+	}
+	else {
+		&main::Output(
+			' /subsystem:windows'
+		);
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o && $Bld=~/DEB$/o) {
+		&main::Output(
+#			pdb needs specifying here to be the same as the default applied in command-line builds
+			" /pdb:\"$ChopRelPath\\$TrgPath$BaseTrg.pdb\" /debug"
+		);
+	}
+	&main::Output(
+		' /machine:IX86',
+		' /ignore:4089',		# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+		' /ignore:4005'			# LNK4005: no objects used from XXX
+	);
+
+	if ($MSVCVer >= 7) {
+		&main::Output(
+			' /ignore:4210'	# LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
+		);
+	}
+
+	my $EntrySymbol='';
+	unless (&main::Plat eq 'TOOLS') {
+		if ($BasicTrgType=~/^EXE$/o) {
+			my $debug = '';
+			if ($Bld =~ /DEB$/o) {
+				$debug .= 'd';
+			}
+			&main::Output(
+				" /nodefaultlib:libcmt$debug.lib"
+			);
+		}
+		if ($BasicTrgType=~/^DLL$/o) {
+			&main::Output(
+				" /include:\"__E32Dll\""
+			);
+			$EntrySymbol='_E32Dll';
+		}
+		elsif ($BasicTrgType=~/^EXE$/o) {
+			&main::Output(
+				" /include:\"__E32Startup\""
+			);
+			$EntrySymbol='_E32Startup';
+		}
+	} else {
+		&main::Output(
+			' /ignore:4098'	# LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library
+		);
+	}
+	my $AbsentSubst = '';
+	if ($EntrySymbol) {
+		$AbsentSubst = " -absent $EntrySymbol";
+	}
+	&main::Output(
+		" /out:\"$ChopRelPath\\$TrgPath$Trg\""
+	);
+	if ($MSVCVer <= 7) {
+		if ($BasicTrgType=~/^(DLL|EXE)$/o) {
+			&main::Output(
+				' /WARN:3'
+			);
+		}
+	}
+	if ($BasicTrgType=~/^(DLL|EXE)$/o && $Bld=~/DEB$/o) {
+		&main::Output(
+			"\n",
+			"# SUBTRACT LINK32 /pdb:none"
+		);
+	}
+	&main::Output(
+		"\n"
+	);
+	if (&main::Plat eq 'TOOLS' and $BasicTrgType eq 'EXE') {
+		&main::Output(
+			"# Begin Special Build Tool\n",
+			"PostBuild_Cmds=copy \"$ChopRelPath\\$TrgPath$Trg\" \"",&main::EPOCToolsPath,"$Trg\" \n",
+			"# End Special Build Tool\n"
+		);
+	}
+	if ($BasicTrgType=~/^DLL$/o || $TrgType=~/^EXEXP$/o) {
+		&main::Output(
+			"# Begin Special Build Tool\n",
+			"SOURCE=\$(InputPath)\n",
+			"PreLink_Cmds=echo Doing first-stage link by name\\\n"
+		);
+		&main::Output(
+			"\tnmake -nologo -f \"${PathBaseDsp}.SUP.MAKE\" PRELINK$Bld\\\n",
+			"\tif errorlevel 1 nmake -nologo -f \"${PathBaseDsp}.SUP.MAKE\" STOPLINK$Bld \n",
+			"PostBuild_Cmds=nmake -nologo -f \"${PathBaseDsp}.SUP.MAKE\" POSTBUILD$Bld\n",
+			"# End Special Build Tool\n"
+		);
+
+
+#		append to the supplementary makefile for each build
+		$SupText.=join('',
+			"# BUILD - $Bld\n",
+			"\n",
+			"LIBS="
+		);
+		foreach (@StatLibList) {
+			$SupText.=" \\\n\t\"\$(EPOCSTATLINK$Bld)\\$_\"";
+		}
+		foreach (@LibList) {
+			$SupText.=" \\\n\t\"\$(EPOCLINK$Bld)\\$_\"";
+		}
+		$SupText.="\n\nLINK_OBJS=";
+		foreach (@BaseSrcList) {
+			$SupText.=" \\\n\t\"\$(EPOCBLD$Bld)\\$_.obj\"";
+		}
+		if ($Win32Resrc) {
+			$SupText.=" \\\n\t\"\$(EPOCBLD$Bld)\\".&main::Path_Split('Base',$Win32Resrc).".res\"";
+		}
+		$SupText.="\n\nSTAGE1_LINK_FLAGS=\"\$(EPOCSTATLINK$Bld)\\$FirstLib\"";
+		
+		unless ($newlib) {
+			if ( main::SystemTrg() ) {
+				# System targets are PDD, LDD, VAR, KEXT and KDLL.
+
+				$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$NewKernLib\"";
+			}
+			else {
+				$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$NewLib\"";
+			}
+		}
+		else {
+			$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$newlib\"";
+		}
+		
+		foreach (@Win32LibList) {
+			$SupText.=' ';
+			$SupText.=lc $_;
+		}
+		$SupText.=" \\\n \$(LIBS) /nologo$BaseAddressFlag /noentry /dll /subsystem:windows";
+		if ($Bld=~/DEB$/o) {
+			$SupText.=' /debug';
+		}
+		$SupText.=" \\\n /incremental:no /machine:IX86 /ignore:4089";
+		if ($BasicTrgType=~/^EXE$/o) {
+			my $debug = '';
+			if ($Bld =~ /DEB$/o) {
+				$debug .= 'd';
+			}
+			$SupText .= " /nodefaultlib:libcmt$debug.lib";
+		}
+		if ($MSVCVer >= 7) {
+			$SupText .=  " /ignore:4210";
+		}
+		if ($BasicTrgType=~/^DLL$/o) {
+			$SupText.=" /include:\"__E32Dll\"";
+		}
+		else {
+			$SupText.=" /include:\"__E32Startup\"";
+		}
+		if ($BasicTrgType=~/^(DLL)$/o) {
+			$SupText.=" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"";
+		} elsif ($BasicTrgType=~/^(EXE)$/o) {
+			$SupText.=" /implib:\"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.lib\"";
+		}
+		$SupText.=join('',
+			' /ignore:4089',		# LNK4089: all references to "dynamic-link library" discarded by /OPT:REF
+			' /ignore:4005'			# LNK4005: no objects used from XXX
+		);
+		if ($MSVCVer >= 7) {
+			$SupText.=" /ignore:4210";		# LNK4210: .CRT section exists; there may be unhandled static initializers or terminators
+		}
+		$SupText.=" /out:\"\$(EPOCBLD$Bld)\\$Trg\"";
+		if ($MSVCVer < 7) {
+			$SupText .= " /WARN:3";
+		}
+		$SupText.="\n\n";
+		$SupText.="PRELINK$Bld : \$(LINK_OBJS)";
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			$SupText.=" \"$DefFile\"";
+		}
+		unless (&main::Plat eq 'TOOLS') {
+			$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$FirstLib\"";
+			
+			unless ($newlib) {
+				if ( main::SystemTrg() ) {
+					# System targets are PDD, LDD, VAR, KEXT and KDLL.
+
+					$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$NewKernLib\"";
+				}
+				else {
+					$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$NewLib\"";
+				}
+			}
+			else {
+				$SupText.=" \"\$(EPOCSTATLINK$Bld)\\$newlib\"";
+			}
+		}
+		$SupText.=" \$(LIBS)\n";
+
+#		Link by name first time round for dlls
+		$SupText.=join('',
+			"\tlink.exe \@<<\n",
+			"\t\t\$(STAGE1_LINK_FLAGS) \$(LINK_OBJS)\n",
+			"<<\n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$Trg\"\n"
+		);
+
+		if ($BasicTrgType=~/^(DLL)$/o) {
+			$SupText.="\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n";
+		} elsif ($BasicTrgType=~/^(EXE)$/o) {
+			$SupText.="\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.exp\"\n";
+		}
+
+#		Generate an export info file
+		if ($BasicTrgType=~/^(DLL)$/o) {
+			$SupText.=join('',
+				"\tdumpbin /exports /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n",
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n"
+			);
+		} elsif ($BasicTrgType=~/^(EXE)$/o) {
+			$SupText.=join('',
+				"\tdumpbin /exports /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\" \"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.lib\"\n",
+				"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.lib\"\n"
+			);
+		}
+
+#		call makedef to reorder the export information
+#		call perl on the script here so nmake will die if there are errors - this doesn't happen if calling perl in a batch file
+		$SupText.="\tperl -S makedef.pl $AbsentSubst -Inffile \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"";
+		if (-e $DefFile) { # effectively "if project frozen ..."
+			$SupText.=" -Frzfile \"$DefFile\"";
+		}
+		# freeze ordinals, a maximum of 2, for polymorphic dlls
+		my $Ordinal;
+		my $Num=1;
+		foreach $Ordinal (&main::Exports) {
+#			replace "$" with "$$" so that NMAKE doesn't think there's a macro in the function name
+			$Ordinal=~s-\$-\$\$-go;
+			$SupText.=" -$Num $Ordinal";
+			$Num++;
+		}
+		$SupText.=join('',
+			" \"\$(EPOCBLD)$ExportLibrary.def\" \n",
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.inf\"\n"
+		);
+
+		# create the export object from the .DEF file
+		$SupText.="\tlib.exe  /nologo /machine:i386 /nodefaultlib /name:\"$Trg\" /def:\"\$(EPOCBLD)$ExportLibrary.def\" /out:\"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n";
+		if (&main::ExportUnfrozen) {
+			$SupText.="\tcopy \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\" \"\$(EPOCLIB)UDEB\\$ExportLibrary.lib\"\n";
+		}
+		$SupText.=join('',
+			"\tdel \"\$(EPOCBLD$Bld)\\$ExportLibrary.lib\"\n",
+			"\t\@echo First-stage link successful\n",
+			"\n",
+			"\n",
+			"STOPLINK$Bld : DELEXPOBJ$Bld\n",
+			"\t\@echo Stopped the build by removing the export object,\n",
+			"\t\@echo if present, because the pre-link stage failed\n",
+			"\n",
+			"\n",
+			"POSTBUILD$Bld : DELEXPOBJ$Bld"
+		);
+		if ($DefFile and not &main::ExportUnfrozen) {
+			$SupText.=" LIBRARY";
+		}
+		$SupText.=join('',
+			"\n",
+			"\n",
+			"\n",
+			"DELEXPOBJ$Bld :\n"
+		);
+
+		if ($BasicTrgType=~/^(DLL)$/o) {
+			$SupText.="\tif exist \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\" del \"\$(EPOCBLD$Bld)\\$ExportLibrary.exp\"\n";
+		} elsif ($BasicTrgType=~/^(EXE)$/o) {
+			$SupText.="\tif exist \"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.exp\" del \"\$(EPOCBLD$Bld)\\$ExportLibrary.exe.exp\"\n";
+		}
+
+		$SupText.=join('',
+			"\n",
+			"\n",
+			"\n"
+		);
+	}
+
+	&main::Output(
+		"\n"
+	);
+}
+
+sub PMEndBldList {
+
+	# CLOSE THE !IF ... !ENDIF LOOP
+	#------------------------------
+	&main::Output(
+		"!ENDIF \n",
+		"\n"
+	);
+}
+
+sub PMStartSrcList {
+
+	my @BldList=&main::BldList;
+
+	&main::Output(
+		"# Begin Target\n",
+		"\n"
+	);
+	foreach (@BldList) {
+		&main::Output(
+			"# Name \"".$IdeBlds{$_}."\"\n"
+		);
+	}
+	&main::Output(
+		"# Begin Group \"Source Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"cpp;c;cxx;rc;def;r;odl;hpj;bat;for;f90\"\n"
+	);
+}
+
+sub PMResrcBld {
+
+	my $ResourceRef=&main::ResourceRef;
+	my $Resrc=ucfirst lc &main::Path_Split('File', $$ResourceRef{Source});
+	my $BaseResrc=&main::Path_Split('Base', $$ResourceRef{Source});
+	my $SrcPath=&main::Path_Split('Path', $$ResourceRef{Source});
+	my $TrgPath=&main::Path_Split('Path', $$ResourceRef{Trg});
+	my @LangList=($$ResourceRef{Lang});
+	
+	my $inputpath="$SrcPath$Resrc";
+	
+	&main::Output(
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=$inputpath\n"
+	);
+
+	my @BldList=&main::BldList;
+	my $ChopBldPath=&main::Path_Chop(&main::BldPath);
+	my @ChopSysIncPaths=&main::Path_Chop(&main::SysIncPaths);
+	my @ChopUserIncPaths=&main::Path_Chop(&main::UserIncPaths);
+	my $DataPath=&main::DataPath;
+	my @DepList=&main::DepList;
+	my $PathBaseDsp=&main::MakeFilePath.&main::BaseMak;
+	my $PerlLibPath=&main::PerlLibPath;
+	my $RelPath=&main::RelPath;
+	my $ChopSrcPath=&main::Path_Chop($SrcPath);
+
+	my $ResrcHdr=join '', &main::EPOCIncPath(), $BaseResrc, '.RSG';
+
+	&main::OutFormat(
+		"USERDEP__$BaseResrc="
+	);
+	$SupText.="DEPEND=";
+	my $Dep;
+	foreach $Dep (@DepList) {
+		&main::OutFormat(
+			"\"$Dep\"\t"
+		);
+		$SupText.=" \\\n\t\"$Dep\"";
+	}
+	&main::Output(
+		"\n"
+	);
+	$SupText.="\n\n";
+
+	my $Bld;
+	foreach $Bld (@BldList) {
+		my $ResrcTrgFullName="$RelPath$Bld\\$TrgPath$BaseResrc.r";
+		if ($Bld eq $BldList[0]) {
+			&main::Output(
+				'!IF'
+			);
+		}
+		else {
+			&main::Output(
+				'!ELSEIF'
+			);
+		}
+		&main::Output(
+			"  \"\$(CFG)\" == \"$IdeBlds{$Bld}\"\n",
+			"\n"
+		);
+		&main::Output(
+			"# PROP Intermediate_Dir \"$ChopBldPath\"\n",
+			"# Begin Custom Build - Building resources from $Resrc\n",
+			"InputPath=$inputpath\n",
+			"\n",
+			"BuildCmds= \\\n",
+			"\tnmake -nologo -f \"${PathBaseDsp}.SUP.MAKE\"\\\n",
+			"  \"$ResrcTrgFullName\"\n"
+		);
+		$SupText.="\"$ResrcTrgFullName\" :";
+		my $Lang;
+		foreach $Lang (@LangList) {
+			if ($Lang eq 'SC') {
+#				change to put dummy file in dependency list
+				$SupText.=" \"$ResrcTrgFullName$Lang.dummy\"";
+				next;
+			}
+			$SupText.=" \"$ResrcTrgFullName$Lang\"";
+		}
+		$SupText.="\n\n";
+		foreach $Lang (@LangList) {
+#			change to put dummy file in dependency list
+			if ($Lang eq 'SC') {
+				$SupText.="\"$ResrcTrgFullName$Lang.dummy\"";
+			}
+			else {
+				$SupText.="\"$ResrcTrgFullName$Lang\"";
+			}
+			$SupText.=" : \"$SrcPath$Resrc\" \$(DEPEND)\n";
+			$SupText.="\tperl -S epocrc.pl -I \"$ChopSrcPath\"";
+			foreach (@ChopUserIncPaths) {
+				$SupText.=" -I \"$_\"";
+			}
+			$SupText.=" -I-";
+			foreach (@ChopSysIncPaths) {
+				$SupText.=" -I \"$_\"";
+			}
+			$SupText.=" -DLANGUAGE_$Lang -u \"$SrcPath$Resrc\"";
+			$SupText.=" -o\"$ResrcTrgFullName$Lang\" -h\"$SrcPath$BaseResrc.rs~\" -t\"\$(EPOCBLD$Bld)\"\n";
+# 			change because if a .RSC file is output then VC5 tries to link it to the main target as a Win32 resource file
+			if ($Lang eq 'SC') {
+				$SupText.="\techo this is a dummy output file > \"$ResrcTrgFullName$Lang.dummy\"\n";
+			}
+			$SupText.=join('',
+				"\tperl -S ecopyfile.pl \"$SrcPath$BaseResrc.rs~\" \"$ResrcHdr\"\n",
+				"\tdel \"$SrcPath$BaseResrc.rs~\"\n",
+				"\n"
+			);
+		}
+
+		foreach $Lang (@LangList) {
+#			change again to avoid VC5 linking the resource
+			my $TmpLang=$Lang;
+			if ($TmpLang eq 'SC') {
+				$TmpLang.='.dummy';
+			}
+			&main::Output(
+				"\n",
+				"\"$ResrcTrgFullName$TmpLang\" : \$(SOURCE) \"\$(INTDIR)\"\\\n",
+				" \"\$(OUTDIR)\"\n",
+				"   \$(BuildCmds)\n",
+			);
+		}
+		&main::Output(
+			"# End Custom Build\n",
+			"\n"
+		);
+	}
+	&main::Output(
+		"!ENDIF \n",
+		"\n",
+		"# End Source File\n"
+	);
+}
+
+sub PMDoc {    
+
+	my $SrcPath=&main::SrcPath;
+
+	&main::Output(
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=",$SrcPath,ucfirst lc &main::Doc,"\n",
+		"# PROP Exclude_From_Build 1\n",
+		"# End Source File\n"
+	);
+}
+
+sub PMStartSrc {    
+
+	&main::Output(
+		"# Begin Source File\n",
+		"\n",
+		"SOURCE=",&main::SrcPath,ucfirst lc &main::Src,"\n",
+		"# End Source File\n"
+	);
+}
+
+sub PMSrcDepend {
+
+	# Generate user header list for this src, merge with list for all sources
+	foreach (&main::DepList) {
+		$PrjHdrs{$_}='unusedval';
+	}
+}
+
+sub PMEndSrcList {
+
+	my $BaseDsp=&main::BaseMak;
+	my $PathBaseDsp=&main::MakeFilePath.$BaseDsp;
+
+	&main::Output(
+		"# End Group\n",
+		"# Begin Group \"Resource Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"ico;cur;bmp;dlg;rc2;rct;bin;cnt;rtf;gif;jpg;jpeg;jpe\"\n"
+	);
+	if ($Win32Resrc) {
+		&main::Output(
+			"# Begin Source File\n",
+			"\n",
+			"SOURCE=",ucfirst lc $Win32Resrc,"\n",
+			"# End Source File\n"
+		);
+		# Generate user header list for this src, merge with list for all sources
+		foreach (&main::Deps_GenDependsL($Win32Resrc)) {
+			$PrjHdrs{$_}='unusedval';
+		}
+	}
+	&main::Output(
+		"# End Group\n"
+	);
+
+	# Use the global %PrjHdrs Hash to produce user header listing
+	&main::Output(
+		"# Begin Group \"Header Files\"\n",
+		"\n",
+		"# PROP Default_Filter \"h;hpp;hxx;hm;inl;fi;fd\"\n"
+	);
+	foreach (keys %PrjHdrs) {
+		&main::Output(
+			"# Begin Source File\n",
+			"\n",
+			"SOURCE=",&main::Path_Split('Path',$_),ucfirst lc &main::Path_Split('File',$_),"\n",
+			"# End Source File\n"
+		);
+	}	
+	&main::Output(
+		"# End Group\n",
+		"# End Target\n",
+		"# End Project\n",
+	);
+
+	&main::Path_DelFiles("$PathBaseDsp.MAK","$PathBaseDsp.MDP","$PathBaseDsp.NCB","$PathBaseDsp.OPT","$PathBaseDsp.PLG");
+
+#	Add target to supplementary makefile to recreate the workspace
+#
+#	This target is intended for use as a custom tool within the MSVC IDE, for regenerating
+#	workspace once the .MMP file has been edited within the IDE.  To install the target as
+#	a custom tool in the IDE, select Tools->Customise...->Tools, and choose a name for the
+#	tool, e.g. "Recreate Workspace".  Next, type "nmake.exe" as the command and
+#	"-nologo -f $(WkspDir)\$(WkspName).sup.make recreateworkspace" as the program arguments.
+#	Leave the "initial directory" field blank, and tick the "Close window on exiting" checkbox.
+#	Having edited the .MMP file for a project, select the new tool from the tools menu to
+#	recreate the workspace.  If the commands have run correctly, you will be prompted to
+#	reload the workspace.
+	$SupText.=join('',
+		"\n",
+		"RECREATEWORKSPACE :\n",
+		'	cd ', &main::Path_Chop(&main::Path_WorkPath), "\n",
+		'	perl -S makmake.pl -D ', &main::MmpFile, ' ', &main::PlatName, "\n",
+		"\n"
+	);
+
+#	Create the supplementary makefile
+	
+	&main::CreateExtraFile(&main::MakeFilePath.&main::BaseMak.'.SUP.MAKE', $SupText);
+
+
+# create the .DSW file
+	my $DswText=join(
+		"\n",
+		"Microsoft Developer Studio Workspace File, Format Version 6.00",
+		'# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!',
+		'',
+		'#'x79,
+		'',
+		"Project: \"$BaseDsp\"=.\\$BaseDsp.dsp - Package Owner=<4>",
+		'',
+		'Package=<5>',
+		'{{{',
+		'}}}',
+		'',
+		'Package=<4>',
+		'{{{',
+		'}}}',
+		'',
+		'#'x79,
+		'',
+		'Global:',
+		'',
+		'Package=<5>',
+		'{{{',
+		'}}}',
+		'',
+		'Package=<3>',
+		'{{{',
+		'}}}',
+		'',
+		'#'x79,
+		''
+	);
+
+	&main::CreateExtraFile("$PathBaseDsp.DSW",$DswText);
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/lockit_info.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,346 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+package lockit_info;
+use File::Copy;
+use File::Path;
+use File::Basename;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Check_Epocroot
+	Setup_LockitPath
+	Lockit_Releasables
+	Copy_Files
+	WriteTo_Info
+	LineExists
+	Lockit_SrcFile
+	Open_InfoFile
+	Close_InfoFile
+);
+
+use Pathutl;
+my $epocroot;
+my $epocPath;
+
+sub Check_Epocroot 
+	{
+	$epocroot = $ENV{EPOCROOT};
+	die "ERROR: Must set the EPOCROOT environment variable\n" if (!defined($epocroot));
+	$epocroot =~ s-/-\\-go;	# for those working with UNIX shells
+	die "ERROR: EPOCROOT must not include a drive letter\n" if ($epocroot =~ /^.:/);
+	die "ERROR: EPOCROOT must be an absolute path without a drive letter\n" if ($epocroot !~ /^\\/);
+	die "ERROR: EPOCROOT must not be a UNC path\n" if ($epocroot =~ /^\\\\/);
+	die "ERROR: EPOCROOT must end with a backslash\n" if ($epocroot !~ /\\$/);
+	die "ERROR: EPOCROOT must specify an existing directory\n" if (!-d $epocroot);
+
+	$epocroot=~ s-\\$--;		# chop trailing \\
+	$epocPath = "$epocroot\\epoc32\\localisation";
+	}
+
+
+## main function which handles all lockit-related function
+sub Lockit_SrcFile()
+{
+	my ($ResrcFile, $RppFile,$Resrc_Options, $FileType, $Bitmaps, $RscTarget, $lang);
+	
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		($ResrcFile, $RppFile,$Resrc_Options, $FileType, $Bitmaps, $RscTarget, $lang)= @_;
+	}
+	else {
+
+		($ResrcFile, $RppFile,$Resrc_Options, $FileType, $Bitmaps, $RscTarget)= @_;
+	}
+	$RscTarget=Path_Split('File', $RscTarget);
+	my ($Tgtdir, $CWDir) = split(/:/, $Resrc_Options);
+	$Tgtdir =~s-^(.*)\\$-$1-o; # remove terminating backslash
+	$Tgtdir=~s-^\\--o; # remove leading backslash
+	
+	Check_Epocroot();
+	my $FilePath;
+
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		$FilePath = Setup_LockitPath($CWDir, $ResrcFile, $FileType, $lang);
+
+		# update rppfile in epoc32\localisation if -l option specified and generating resource
+			
+		copy("$RppFile", "$FilePath\\");
+	}
+	else {
+		$FilePath = Setup_LockitPath($CWDir, $ResrcFile, $FileType);
+
+		# update rppfile in epoc32\localisation if -l option specified and generating resource
+		copy("$RppFile", "$FilePath\\$ResrcFile.rpp");
+	}
+
+	# update bitmaps in epoc32\localisation if -l option and bitmaps specified
+	if ($CWDir && ($Bitmaps ne ""))
+	{
+		my $BmpRef;
+		$Bitmaps =~ s/ +|\t/ /g; # replace tabs and more spaces with single space
+		$Bitmaps =~s/^ //g; # remove leading space
+		$Bitmaps =~s/ $//g; # remove trailing space
+
+		my (@AifBitmaps) = split(/ /, $Bitmaps);
+		foreach $BmpRef (@AifBitmaps) {
+			$BmpRef =~ /^([^\\]+)(\\.*)$/;
+			my $CDepth = $1;
+			my $bmp = $2;
+			Copy_Files($bmp, $FilePath);
+			my $file_base= basename($bmp);
+			chmod (0666,"$FilePath\\$file_base");
+		}
+	}
+
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		if (LineExists($ResrcFile.$lang, $RscTarget) == 0)
+		{
+			Open_InfoFile($ResrcFile . $lang);
+
+			WriteTo_Info ( "\n\\$Tgtdir\\$RscTarget :" );
+
+			if($FileType =~ /RSC/i && $RppFile ne "") {
+				WriteTo_Info (
+					 " $ResrcFile$lang.rpp"
+				)
+			}
+
+			elsif ($RppFile ne "") {
+				WriteTo_Info (
+					 " $ResrcFile$lang.text $ResrcFile$lang.struct"
+				)
+			}
+
+			if($Bitmaps ne "")
+			{
+				my $BmpRef;
+				my (@AifBitmaps) = split(/ /, $Bitmaps);
+				foreach $BmpRef (@AifBitmaps) {
+					$BmpRef =~ /^([^\\]+)(\\.*)$/;
+					my $CDepth = $1;
+					my $bmp = $2;
+					my $file_base= basename($bmp);
+					WriteTo_Info (
+						 " $CDepth\\$file_base"
+					);
+				}
+			}
+
+			Close_InfoFile($ResrcFile . $lang);
+		}
+	}
+	else {
+		if (LineExists($ResrcFile, $RscTarget) == 0)
+		{
+			Open_InfoFile($ResrcFile);
+
+			WriteTo_Info ( "\n\\$Tgtdir\\$RscTarget :" );
+
+			if($FileType =~ /RSC/i && $RppFile ne "") {
+				WriteTo_Info (
+					 " $ResrcFile.rpp"
+				)
+			}
+
+			elsif ($RppFile ne "") {
+				WriteTo_Info (
+					 " $ResrcFile.text $ResrcFile.struct"
+				)
+			}
+
+			if($Bitmaps ne "")
+			{
+				my $BmpRef;
+				my (@AifBitmaps) = split(/ /, $Bitmaps);
+				foreach $BmpRef (@AifBitmaps) {
+					$BmpRef =~ /^([^\\]+)(\\.*)$/;
+					my $CDepth = $1;
+					my $bmp = $2;
+					my $file_base= basename($bmp);
+					WriteTo_Info (
+						 " $CDepth\\$file_base"
+					);
+				}
+			}
+
+			Close_InfoFile($ResrcFile);
+
+		}
+	}
+}
+
+
+## copy source files
+sub Copy_Files ()
+	{
+	my ($SourceName, $TargetName) = @_;
+
+	copy($SourceName, $TargetName);
+	}
+
+## create necessary directories
+sub Create_InfoFile ()
+	{
+	my ($CreateLockitPath, $CreateInfoFile, $Datadir) = @_;
+	if ( !-e "$CreateLockitPath") { mkpath($CreateLockitPath); }
+	if ( !-e "$epocPath\\group") { mkpath("$epocPath\\group"); }
+	if ( !-e "$epocPath\\group\\$CreateInfoFile.info") {	
+		open INFO,">$epocPath\\group\\$CreateInfoFile.info" or die "ERROR: Can not create file \"$CreateInfoFile\"\n"; 
+		print INFO "DATADIR: $Datadir\n";
+		close INFO;
+	}
+}
+
+## open INFO file to write source information
+sub Open_InfoFile ($)
+	{
+	my $FileToOpen = $_[0];
+	open INFO,">>$epocPath\\group\\$FileToOpen.INFO" or die "ERROR: Can not open  \"$epocPath\\group\\$FileToOpen\"\n";
+	}
+
+
+## write source filename to INFO file
+sub WriteTo_Info ($) 
+	{
+	my $Text = $_[0];
+	print INFO "$Text";
+	}
+
+
+## check whether source filename is written to INFO file
+sub LineExists ()
+	{
+	my $FileToOpen = $_[0];
+	my $LineCheck = $_[1];
+	my $exists = 0;
+
+	open INFO,"$epocPath\\group\\$FileToOpen.info" or die "ERROR: Can not open \"$FileToOpen\"\n";
+		while(<INFO>) {
+			if (/$LineCheck/i) { $exists = 1; return $exists; } 
+		}
+		close INFO;
+	return $exists;
+	}
+	
+
+#determine Components pathname and create INFO files
+sub Setup_LockitPath
+	{
+	my ($ComponentSrcPath, $Resrc, $FileType, $lang);
+
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		($ComponentSrcPath, $Resrc, $FileType, $lang) = @_;
+	}
+	else {
+		($ComponentSrcPath, $Resrc, $FileType) = @_;
+	}
+	my ($temp, $CWDir) = split(/\\/, $ComponentSrcPath);
+	my $FilePath = $epocPath;
+
+	if($FileType =~ /RSS/i) { $FileType = "rsc"; }
+	if($FileType =~ /^acl|abw|aif|a[0-9]/i) {
+		$FilePath .= "\\aif";
+	}
+	
+## change added to support cnf file generation
+	if ($FileType =~ /CNF/i) { 
+		$FilePath .= "\\cnf"; 
+	}
+
+	my $WorkPath = ""; 
+
+	if($Resrc !~ /^$CWDir$/i) {
+		$WorkPath = "$Resrc"; 
+	}
+
+	$FilePath .= "\\$WorkPath\\$FileType";
+
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		&Create_InfoFile("$FilePath", "$Resrc$lang", "\\$WorkPath");
+	}
+	else {
+		&Create_InfoFile("$FilePath", "$Resrc", "\\$WorkPath");
+	}
+
+	return $FilePath;
+	}
+
+
+## accumulate list of Lockit releasables
+sub Lockit_Releasables
+{
+	my ($ComponentSrcPath, $ResrcFile, $href, $Bitmaps, $lang);
+	my $Resrc;
+	my ($BaseResrc,$FileType);
+	my $LockitInfoPath;
+	my $LockitPath;
+	my %Files;
+
+	if (defined $ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} &&  ($ENV{ABLD_TOOLSMOD_COMPATIBILITY_MODE} eq 'alpha')) {
+		($ComponentSrcPath, $ResrcFile, $href, $Bitmaps, $lang) = @_;
+
+		$Resrc = basename($ResrcFile);
+		($BaseResrc,$FileType) = split(/\./, $Resrc);
+		Check_Epocroot();
+	
+		$LockitInfoPath = "$epocPath\\group\\$BaseResrc$lang.info";
+
+		$LockitPath = Setup_LockitPath($ComponentSrcPath, $BaseResrc, $FileType, "");
+		%Files = %$href;
+
+		if($FileType =~ /RSS|ACL|ABW|AIF|A[0-9]/i && $Bitmaps eq ""){
+			$LockitPath .= "\\$BaseResrc$lang.rpp";
+		}
+		else {
+			$LockitPath .= "\\$Bitmaps";
+		}
+
+	}
+	else {
+		($ComponentSrcPath, $ResrcFile, $href, $Bitmaps) = @_;
+
+		$Resrc = basename($ResrcFile);
+		($BaseResrc,$FileType) = split(/\./, $Resrc);
+		Check_Epocroot();
+		$LockitInfoPath = "$epocPath\\group\\$BaseResrc.info";
+
+		$LockitPath = Setup_LockitPath($ComponentSrcPath, $BaseResrc, $FileType);
+		%Files = %$href;
+
+		if($FileType =~ /RSS|ACL|ABW|AIF|A[0-9]/i && $Bitmaps eq ""){
+			$LockitPath .= "\\$BaseResrc.rpp";
+		}
+		else {
+			$LockitPath .= "\\$Bitmaps";
+		}
+	}
+
+	my %loggedFiles;
+	$loggedFiles{lc($_)} = 1 foreach keys (%Files);
+	
+	$Files{$LockitPath} = 1 if !($loggedFiles{lc($LockitPath)});
+	$Files{$LockitInfoPath} = 1 if !($loggedFiles{lc($LockitInfoPath)});
+	
+	return %Files;
+}
+
+sub Close_InfoFile ($)
+	{
+	my $FileToClose = $_[0];
+	close INFO;
+	}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/sym_lkup_util.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,257 @@
+#!/usr/bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+use FindBin;		# for FindBin::Bin
+use Getopt::Long;
+
+BEGIN {
+# check user has a version of perl that will cope
+	require 5.005_03;
+# establish the path to the Perl libraries: currently the same directory as this script
+	$PerlLibPath = $FindBin::Bin;	# X:/epoc32/tools
+	if ($^O eq "MSWin32")
+	{
+		$PerlLibPath =~ s/\//\\/g;	# X:\epoc32\tools
+		$PerlLibPath .= "\\";
+	}
+}
+
+use lib $PerlLibPath;
+
+my $IgnoreExportDir = 0;
+my $ImportSymFile;
+my $CppFile;
+my $mapFile;
+my $SegmentContentSz = 0;
+my $nSyms = 0;
+my $nImports = 0;
+my %Symbols = ();
+my @Imports = ();
+
+# Version
+my $MajorVersion = 1;
+my $MinorVersion = 1;
+my $PatchVersion = 0;
+
+
+{
+	unless (GetOptions(\%Options, 'sym=s', 'o=s', 'map=s', 'ignore_export_dir')) {
+		exit 1;
+	}
+	$ImportSymFile = $Options{sym};
+	$CppFile = $Options{o};
+	$mapFile = $Options{map};
+	$IgnoreExportDir = $Options{ignore_export_dir};
+
+	unless($ImportSymFile)
+	{
+		print(
+			 "\n",
+			 "SYM_LKUP_UTIL symbol process tool V$MajorVersion.$MinorVersion.$PatchVersion\n",
+			 "\n",
+			 "options:\n",
+			 " -sym symbol file\n",
+			 " -o   output file\n",
+			 " -map  map file\n",
+			 "\n"
+		);
+		exit 1;
+	}
+
+	ReadSymFile() if $ImportSymFile;
+	ReadMapFile() if $mapFile;
+	
+	GenNamedSegment();
+}
+
+sub ReadMapFile() {
+	open FILE, $mapFile or die "Error :SymLookup: Cannot open map file $mapFile\n";
+
+	my $GlbSyms = 0;
+	while(<FILE>) {
+		if($_ =~ /Public Symbols/) {
+			$GlbSyms = 1;
+		}
+		elsif( !$GlbSyms ) {
+			next;
+		}
+		if($_ =~ /([0-9a-fA-F]{8})\s+(\S+)\s+_?(\S+)\s/){
+			$addr = $1;
+			$module = $2;
+			$name = $3;
+			if( defined $Symbols{$name} ) {
+				$Symbols{$name} = $addr;
+			}
+		}
+	}
+#	Remove symbols not found in map file
+	foreach my $sym (keys %Symbols){
+		if( !$Symbols{$sym} ){
+			delete $Symbols{$sym};
+		}
+	}
+
+}
+
+sub ReadSymFile() {
+	open FILE, $ImportSymFile or die "Error :SymLookup: Cannot open file $ImportSymFile\n";
+	
+	my $ImportDirSeen = 0;
+	my $ExportDirSeen = 0;
+	my $ExportNameTblSeen = 0;
+	my $numOfExportNames = 0;
+	my $nameCount = 0;
+	while (<FILE>) {
+# Ignore export table(s) if the flag '$IgnoreExportDir' is set. This flag is set for stddlls, as symbol listing 
+# is not required for them. The windows API GetProcAddr can be used directly. While for stdexe, the symbol names
+# are filtered out and then looked up in the map file for their addresses.
+
+		if($_ =~ /\*\*\* EXPORT DIRECTORY \*\*\*/){
+			next if($IgnoreExportDir);
+			$ExportDirSeen = 1;
+		}
+		elsif($_ =~ /\*\*\* Export Name Pointer Table \*\*\*/){
+			next if($IgnoreExportDir);
+			$ExportNameTblSeen = 1;
+		}
+		elsif($_ =~ /\*\*\* IMPORT DIRECTORY \*\*\*/) {
+			$ImportDirSeen = 1;
+		}
+
+		if($ExportDirSeen){
+			if($_ =~ /numberofnames\s+=\s+0x(\S+)/){
+				$numOfExportNames = hex($1);
+# Reset the flag once done with the export table
+				$ExportDirSeen = 0;
+			}
+		}
+		elsif($ExportNameTblSeen && $numOfExportNames){
+			if($_ =~ /\d+\s+0x[0-9a-fA-F]+\s+(\S+)/){
+				$Symbols{$1}=0;
+# Keep track of the symbols seen in "Export Name Pointer Table"
+				$nameCount++;
+			}
+			if($nameCount == $numOfExportNames){
+# Reset the flag once done with the name table
+				$ExportNameTblSeen = 0;
+			}
+		}
+		elsif($ImportDirSeen) {
+			if($_ =~ /^DLL name\s+=\s+\S+\s+\((\S+)\)/) {
+				my $dllname = $1;
+				push @Imports, $dllname;
+				$ImportDirSeen = 0;
+			}
+		}
+	}
+}
+
+sub GenNamedSegment() {
+
+	my $SegContents = "";
+	
+	&Header(\$SegContents);
+
+	&SymAddrTbl(\$SegContents);
+
+	&SymNames(\$SegContents);
+
+	&Footer(\$SegContents);
+
+	open OUTFILE, ">$CppFile" or die "Error :SymLookup:Cannot open file $CppFile\n";
+	print OUTFILE $SegContents;
+}
+
+sub Header(){
+	my $SegContentsRef = shift @_;
+	
+	$$SegContentsRef .= "\/\* $CppFile\n";
+	$$SegContentsRef .= " \* Copyright (c) 2004-2009 Nokia Corporation and/or its subsidiary(-ies).  All rights reserved.\n";
+	$$SegContentsRef .= " \* Makmake-generated source file for named symbol lookup\n";
+	$$SegContentsRef .= " \*\/\n";
+	$$SegContentsRef .= "#pragma data_seg(\".expdata\")";
+
+	$$SegContentsRef .= "\n\n";
+}
+
+sub Footer() {
+	my $SegContentsRef = shift @_;
+	$$SegContentsRef .= "\n#pragma data_seg()\n";
+	$$SegContentsRef .= "\n";
+}
+
+sub SymAddrTbl(){
+	my $SegContentsRef = shift @_;
+	$nSyms = keys %Symbols;
+	$nImports = @Imports;
+	$$SegContentsRef .= "int NSymbols = $nSyms;\n";
+	$$SegContentsRef .= "int NImports = $nImports;\n";
+
+	if(!$nSyms) {
+		return;
+	}
+	$$SegContentsRef .= "int addresses[] = {\n";
+	
+	foreach $key (sort keys %Symbols) {
+		if($Symbols{$key}){
+			$$SegContentsRef .= "\t0x".$Symbols{$key}.",\n";
+		}
+	}
+	$$SegContentsRef .= "};\n";
+}
+
+sub SymNames() {
+	if(!$nImports && !$nSyms){
+		return;
+	}
+	my $SegContentsRef = shift @_;
+	$$SegContentsRef .= "\nchar data[] = {\n";
+
+	my $symnames ;
+	my $colCnt ;
+	foreach $symnames (sort keys %Symbols) {
+		next if( $Symbols{$symnames} == 0);
+		my @chars = split(//,$symnames);
+		$$SegContentsRef .= "\t";
+		$colCnt =0;
+		foreach $aChar (@chars) {
+			if($colCnt >= 80) {
+				$$SegContentsRef .= "\\\n\t";
+				$colCnt = 0;
+			}
+			$$SegContentsRef .= "\'$aChar\',";
+			$colCnt += 4;
+		}
+		$$SegContentsRef .= "0,\n";
+	}
+
+	foreach my $dll (@Imports) {
+		my @chars = split(//,$dll);
+		$$SegContentsRef .= "\t";
+		$colCnt =0;
+		foreach $aChar (@chars) {
+			if($colCnt >= 80) {
+				$$SegContentsRef .= "\\\n\t";
+				$colCnt = 0;
+			}
+			$$SegContentsRef .= "\'$aChar\',";
+			$colCnt += 4;
+		}
+		$$SegContentsRef .= "0,\n";
+	}
+	$$SegContentsRef .= "\n};\n";
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/platform/winutl.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,354 @@
+
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# this package does various ancillary things for windows modules
+# 
+#
+
+package Winutl;
+
+my $BaseAddress='';
+my @Win32LibList=();
+my $Win32Resrc='';
+my $CopyForStaticLinkage=0;
+my $Win32StdHeaders=0;
+my $MSVCVer=0;
+my $MSVCSubVer=0;
+
+require Exporter;
+@ISA=qw(Exporter);
+@EXPORT=qw(
+	Winutl_Help_Mmp
+
+	Winutl_DoMmp_Parse
+	Winutl_DoMmp
+
+	Winutl_BaseAddress
+	Winutl_Win32LibList
+	Winutl_Win32Resrc
+	Winutl_CopyForStaticLinkage
+	Winutl_Win32StdHeaders
+
+	Winutl_AdjustTargetPath
+
+	Winutl_MSVCVer
+	Winutl_MSVCSubVer
+
+	Winutl_CheckSourceMMPMetaData
+);
+
+use Genutl;
+use E32Variant;
+use CheckSource;
+use Pathutl;
+use Cwd;
+
+my %CheckSourceMMPMetaData;
+
+sub Winutl_Help_Mmp {
+# provide the help text for START <windows platforms> END blocks
+
+	print
+		"BASEADDRESS    [base address for dll loading]\n",
+		"WIN32_LIBRARY  [win32 libraries]\n",
+		"WIN32_RESOURCE  [win32 resource]\n",
+		"COPY_FOR_STATIC_LINKAGE   // copy dll from emulated Z drive\n",
+		"WIN32_HEADERS // instruct compiler to look into standard header directories\n",
+		"              // (implied by WIN32_LIBRARY)\n"
+	;
+}
+
+sub Winutl_DoMmp_Parse ($$) {
+	# takes reference to platform text and semicolon-separated list
+	# of compiler-specific include directories
+	my @PlatTxt=@{$_[0]};
+	my $CompilerIncPaths=$_[1];
+
+# process the START <windows platforms> END blocks
+
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $MakeFilePath=&main::MakeFilePath;
+	my $MMPFILE=&main::MmpFile;
+
+	# set up START WINS ... END block module variables
+	my @MmpWarn=();
+	my $Line;
+	LINE: foreach $Line (@PlatTxt) {
+		my $LineInfo=shift @$Line;
+
+		$LineInfo =~ /^(.+)\((\d+)\)$/;
+		my $CurFile = $1;
+		my $LineNum = $2;
+		my $BldInfDir = cwd;
+		$BldInfDir =~ s/\//\\/g;
+		$BldInfDir =~ s/^\w+://;
+		$BldInfDir .= "\\";
+		
+		$_=shift @$Line;
+		
+		if (/^BASEADDRESS$/oi) {
+			if (@$Line) {
+				$BaseAddress=shift @$Line;
+				$BaseAddress=~s/X/x/o;
+				next LINE;
+			}
+			push @MmpWarn, "$LineInfo : No base address specified for keyword BASEADDRESS\n";
+			next LINE;
+		}
+		if (/^WIN32_LIBRARY$/oi) {
+			if (@$Line)
+				{
+				$Win32StdHeaders = 1;
+
+				foreach (@$Line)
+					{
+					if (/^\./)
+						{
+						# local - check for UNIX slash and physical consistency of file as it exists relative to the bld.inf
+						CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum, $CheckSource_PhysicalCheck, $BldInfDir);
+						}
+					else
+						{
+						# global - check for UNIX slash and assume that it must be lower case
+						CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_LIBRARY", $_, $LineNum);
+						}
+					$_ = &Path_Norm($_);
+					push @Win32LibList, $_;
+					}
+				}
+			else
+				{
+				push @MmpWarn, "$LineInfo : No libraries specified for keyword WIN32_LIBRARY\n";
+				}
+			next LINE;
+		}
+		if (/^WIN32_RESOURCE$/oi) {
+			if (@$Line) {
+				$Win32Resrc=shift @$Line;
+
+				CheckSource_MetaData(%CheckSourceMMPMetaData, $CurFile, "WIN32_RESOURCE", $Win32Resrc, $LineNum, $CheckSource_PhysicalCheck);
+				$Win32Resrc = &Path_Norm($Win32Resrc);
+				
+				$Win32Resrc=&main::Path_MakeAbs($MMPFILE, $Win32Resrc);
+				next LINE;
+			}
+			push @MmpWarn, "$LineInfo : No resource specified for keyword WIN32_RESOURCE\n";
+			next LINE;
+		}
+		if (/^COPY_FOR_STATIC_LINKAGE$/oi) {
+			if ($BasicTrgType!~/^DLL$/oi) {
+				push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE only applies to DLLs\n";
+				next LINE;
+			}
+			if (&main::TrgPath eq "") {
+				push @MmpWarn, "$LineInfo : COPY_FOR_STATIC_LINKAGE requires TARGETPATH\n";
+				next LINE;
+			}
+			$CopyForStaticLinkage=1;
+			next LINE;
+		}
+		if (/^WIN32_HEADERS$/oi) {
+			$Win32StdHeaders = 1;
+			next LINE;
+		}
+		
+		push @MmpWarn, "$LineInfo : Unrecognised Keyword \"$_\"\n";
+	}
+
+	undef $Line;
+	if (@MmpWarn) {
+		warn
+			"\nMMPFILE \"",$MMPFILE,"\"\n",
+			"START .. END BLOCK WARNINGS(S)\n",
+			@MmpWarn,
+			"\n"
+		;
+	}
+	undef @MmpWarn;
+
+	# if Win32 Libraries required - set the Windows standard include paths
+	if ($Win32StdHeaders || $Win32Resrc || &main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS'
+		|| &main::Plat eq 'TOOLS2')
+	{	# show where to find win32 libraries
+		# include env variable takes everything between ';', including spaces and '"', as part of path
+		my @StdIncPaths=split ';', $CompilerIncPaths;
+		my $path;
+		foreach $path (@StdIncPaths) {
+			$path =~ s-/-\\-go;	# for those working with UNIX shells
+			if ($path =~ /^\+/) {
+				# expand CodeWarrior "recursive" entries
+				$path =~ s-^\+--go;		# remove the + from the current entry
+				if (opendir DIR, $path) {
+					my @list = grep !/^\.\.?$/, readdir DIR;
+					closedir DIR;
+					foreach (@list) {
+						my $newpath="$path\\$_";
+						if (-d $newpath) {
+							push @StdIncPaths,"+$newpath";	# add subdirs for later expansion
+						}
+					}
+				}
+			}
+		}
+		&main::SetStdIncPaths(@StdIncPaths);
+		&main::AddPlatMacros('WIN32','_WINDOWS');
+	}
+}
+
+sub Winutl_DoMmp ($$) {
+	# takes reference to platform text and semicolon-separated list
+	# of compiler-specific include directories
+	my @PlatTxt=@{$_[0]};
+	my $CompilerIncPaths=$_[1];
+
+	my $Plat=&main::Plat;
+	if ($Plat ne "WINSCW" and $Plat ne "CWTOOLS" and $Plat ne "TOOLS2") {
+		#	check that we're using VC6 SP3
+		&Winutl_MSVCVer();
+	}
+
+	&Winutl_DoMmp_Parse(\@PlatTxt, $CompilerIncPaths);
+	
+	my $BaseTrg=&main::BaseTrg;
+	my $BasicTrgType=&main::BasicTrgType;
+	my $MakeFilePath=&main::MakeFilePath;
+	my $MMPFILE=&main::MmpFile;
+	my @UidList=&main::UidList;
+	
+	if ($BasicTrgType=~/^(EXE|DLL)$/oi) {
+		# create the UID source file
+		my $priority = "EPriorityForeground";
+		if (&main::ProcessPriority) {
+			$priority="EPriority".&main::ProcessPriority;
+		}
+
+		my $UidText=join(
+			"\n",
+			'// Makmake-generated uid source file',
+			'#include <e32cmn.h>',
+			'#pragma data_seg(".SYMBIAN")',
+			'__EMULATOR_IMAGE_HEADER2('
+		);
+		foreach (@UidList) {
+			$UidText.="$_,";
+		}
+		my $vstr = "0x".&Genutl_VersionToHexString(&main::Version);
+		my $vid = &main::VendorId;
+		if(!$vid) { $vid="0"; }
+		$UidText.="$priority,".(&main::CapabilityFlags)[0]."u,".(&main::CapabilityFlags)[1]."u,".&main::SecureId.",".$vid.",$vstr,";	# second capability word always 0 for now
+		if (&main::AllowDllData) {
+			$UidText.="1,";
+		} else {
+			$UidText.="0,";
+		}
+		chop $UidText;
+		$UidText.=")\n";
+		$UidText.="#pragma data_seg()\n";
+		unless (&main::Plat eq 'TOOLS' || &main::Plat eq 'CWTOOLS' || &main::Plat eq 'TOOLS2' ) {
+			&main::AddSrc("$MakeFilePath$BaseTrg.UID.CPP", $UidText);
+		};
+	}
+
+}
+
+sub Winutl_BaseAddress () {
+	$BaseAddress;
+}
+
+sub Winutl_Win32LibList () {
+	@Win32LibList;
+}
+
+sub Winutl_Win32Resrc () {
+	$Win32Resrc;
+}
+
+sub Winutl_CopyForStaticLinkage () {
+	$CopyForStaticLinkage;
+}
+
+sub Winutl_Win32StdHeaders () {
+	$Win32StdHeaders;
+}
+
+sub Winutl_AdjustTargetPath () {
+	my ($TrgPathRef) = @_;
+
+	if (&main::EPOCSecurePlatform) {
+
+		my $plan=1;
+		my @macros = &Variant_GetMacroList;
+		foreach my $macro (@macros) {
+			if ($macro =~ m/^SYMBIAN_IGNORE_BIN_TARGETPATH.*/) {
+				$plan = 2;
+				last;
+			}
+		}
+
+		if ($plan == 1) {
+			# Intermediate step: TARGETPATH => COPY_FOR_STATIC_LINKAGE
+			$CopyForStaticLinkage = 1 if ($$TrgPathRef ne "");
+		} else {
+			# Finally: Ignore TARGETPATH and COPY_FOR_STATIC_LINKAGE
+			# unless it's a subdir of sys\bin
+			if (&main::TrgPath !~ /^Z\\sys\\bin\\.+/i) {
+				$$TrgPathRef = "";
+				$CopyForStaticLinkage = 0;
+			}
+		}
+	}
+}
+
+sub Winutl_MSVCVer ($) {
+	my $platcommand=shift;
+	if(!defined $platcommand) {
+		$platcommand=0; }
+	open PIPE, "LINK.EXE 2>&1 |" or die "ERROR: Can't invoke LINK.EXE\n";
+	my $DoneCheck=0;
+	while (<PIPE>) {
+		unless ($DoneCheck) {
+			if (/^.+\s+Version\s+(\d)\.(\d{2})\.((\d{4})|(\d{5})(.\d{2}))\s*$/o) {
+				if (($1<6) or ($1==6 and $2<0) or ($1==6 and $2==0 and $3<8447)) {
+					warn "WARNING: Should install MSVC6 Service Pack 3\n";
+				}
+				$MSVCVer = $1;
+				$MSVCSubVer = $2;
+				$DoneCheck=1;
+			}
+		}
+	}
+	close PIPE;
+	# Do not throw any error when link.exe not present  while displaying
+	# a list of the supported platforms using bldmake plat command.
+	if (!$DoneCheck && !$platcommand) {
+		# Couldn't find version information? Might not have link.exe at all
+		die "ERROR: failed to find version information for LINK.EXE\n";
+	}
+
+	$MSVCVer;
+}
+
+sub Winutl_MSVCSubVer ($) {
+	my $platcommand=@_;
+	&Winutl_MSVCVer($platcommand);
+
+	$MSVCSubVer;
+}
+
+sub Winutl_CheckSourceMMPMetaData () {
+	%CheckSourceMMPMetaData;
+}
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/cw_ide_test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,418 @@
+#!perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Script to build specified MMP files with both command line and IDE, then
+# use EVALID to compare the results.
+# Inspired by "buildall.pl", written by Cuong Phan
+# 
+#
+
+use strict;
+use File::Basename;		# for fileparse()
+use File::Path;			# for mkpath
+use Cwd;				# for cwd
+use OLE;
+use Getopt::Long;
+
+sub Usage ($) 
+	{
+	my ($message) = @_;
+	print <<ENDHERESTRING;
+$message
+
+Usage : perl cw_ide_test.pl [-v] -f mmplist platform1 [platform2 ...]
+
+Builds specified MMP files with both the command line and the CodeWarrior IDE,
+storing the build products in zip files and comparing them with EVALID.
+The output can be summarised using scanlog.pl.
+
+All of the specified MMP files are build for all of the specified platforms.
+If -v is specified, the detailed build commands are included in the output.
+
+ENDHERESTRING
+
+	exit 1;
+	}
+
+my %Options=();
+GetOptions(\%Options, "v", "f=s");
+
+&Usage("No platforms specified") if (@ARGV < 1);
+&Usage("Must specify list of mmp files using -f") if (!defined($Options{"f"}));
+
+my @mmplist=();
+my $specifiedCWD;
+open FILELIST, "<$Options{f}" or &Usage("Cannot open $Options{f}");
+while (<FILELIST>)
+	{
+	$specifiedCWD = "";
+		
+	if (/#.*cwd:/i)
+		{
+		$specifiedCWD = $_;
+		$specifiedCWD =~ s/^.*cwd:/cwd:/i;
+		$specifiedCWD =~ s/\).*$//;
+		$specifiedCWD =~ s/\s*//g;
+		$specifiedCWD =~ s/\//\\/g;
+		$specifiedCWD .="?";
+		}
+		
+	s/#.*$//;		# remove comments
+	s/\s*$//;		# remove trailing ws
+	s/^\s*//;		# remove leading ws
+	s/\//\\/g;		# convert / to \
+	next if ($_ eq "");
+	push @mmplist, $specifiedCWD.$_;
+	}
+close FILELIST;
+
+&Usage("No MMP files?") if (@mmplist == 0);
+
+# create an instance of CodeWarrior
+my $CW = CreateObject OLE  "CodeWarrior.CodeWarriorApp";
+if (!defined($CW))
+	{
+	print "Failed to start CodeWarrior\n";
+	exit(1);
+	}
+
+# turn on autoflush, to get stdout in the right place...
+# These runes come from perlfaq5
+
+my $old_fh = select(STDOUT);
+$| = 1;
+select($old_fh);
+
+foreach my $mmpfile (@mmplist)
+	{
+	$specifiedCWD = "";
+
+	if ($mmpfile =~ /^cwd:/)
+		{
+		$specifiedCWD = $mmpfile;
+		$specifiedCWD =~ s/^cwd://;
+		$specifiedCWD =~ s/\?.*$//;
+		$mmpfile =~ s/^cwd:.*\?//;
+		}
+
+	if (!-f $mmpfile)
+		{
+		print "MISSING: $mmpfile\n";
+		next;
+		}
+	
+	foreach my $platform (@ARGV)
+		{
+		$platform = uc $platform;
+		my ($mmpname, $mmpdir, $mmpext) = fileparse($mmpfile,'\..*');
+		my $phasename = $mmpname."_".$platform;
+		
+		my $origdir = cwd;
+
+		if ($specifiedCWD)
+			{
+			print ("chdir $specifiedCWD\n");			
+			chdir ($specifiedCWD);
+
+			# Workaround for Base components, where GENEXEC.MKE needs to be executed to export the required headers for a build
+			do_system ("bldmake bldfiles");
+			do_system ("abld makefile $platform");
+			}
+		else
+			{
+			print ("chdir $mmpdir\n");
+			chdir ($mmpdir);
+			}
+
+		my $time = localtime;
+		print "===-------------------------------------------------\n";
+		print "=== $phasename\n";
+		print "===-------------------------------------------------\n";
+		print "=== $phasename started $time\n";
+
+		if ($specifiedCWD)
+			{
+			$mmpdir = "\\".$mmpdir;
+			}
+		else
+			{
+			$mmpdir = "";
+			}
+
+		&do_one_mmp_file($phasename, $mmpname, $platform, $mmpdir);
+
+		$time = localtime;
+		print "=== $phasename finished $time\n";
+
+		chdir($origdir);
+		print ("chdir $origdir\n");
+		}
+	}
+
+$CW->Quit(0);
+exit(0);
+
+sub do_system($)
+	{
+	my ($cmd) = @_;
+	print "    $cmd\n";
+	return system($cmd);
+	}
+
+sub zip_and_check($$$)
+	{
+	my ($zipname, $releaseref, $complain) = @_;
+	
+	unlink($zipname) if (-f $zipname);
+	
+	my @ziplist;
+	foreach (sort keys %$releaseref)
+		{
+		if (-f $_)
+			{
+			push @ziplist,$_;	# add to zip archive
+			}
+		else
+			{
+			print "MISSING: $_\n" if ($complain);
+			}
+		}
+	
+	if (scalar @ziplist ==0 && $complain)
+		{
+		print "Can't create empty archive $zipname\n";
+		return;
+		}
+	
+	# Make the non-empty archive
+	
+	open ZIP, "| zip -q $zipname -@";
+	print ZIP
+	 join("\n",@ziplist,"");
+	close ZIP;
+	print "Created $zipname\n";
+	}
+	
+sub do_one_mmp_file($$$)
+	{
+	my ($phasename, $mmpname, $platform, $mmpdir) = @_;
+
+	print "=== $phasename == $mmpname.mmp\n";
+
+	# use MAKMAKE to generate the makefile
+	# make CLEAN to remove any existing build results
+	# make ALL to build everything
+	# make WHAT to get the releaseables, as per abld.pl
+	# check the releaseables and zip up the ones which do exist
+	# make CLEAN again to get ready for the IDE build...
+		
+	my $makefile = "$mmpname.$platform";
+	my %allreleaseables=();		# complete list, for putting back afterwards
+	my %releaseables=();		# just things we expect the IDE to build
+	my %uncheckedreleaseables=();
+	my $makecmd = "make -s";
+	$makecmd = "make" if ($Options{"v"});
+	
+	unlink $makefile if (-f $makefile);
+	&do_system("perl -S makmake.pl $mmpdir$mmpname $platform");
+	return if (!-f $makefile);
+	
+	open PIPE,"make -s -r -f $makefile WHAT |";
+	while (<PIPE>) 
+		{
+		next if (/Nothing to be done for \S+\.$/o);
+#		releasables split on whitespace - quotes possible -stripped out
+		while (/("([^"\t\n\r\f]+)"|([^ "\t\n\r\f]+))/go) 
+			{
+			my $file = ($2 ? $2 : $3);
+			$allreleaseables{$file}=1;
+			next if ($file =~ /epoc32\\localisation\\/i);
+			next if ($file =~ /epoc32\\data/i && $platform =~ /winscw/i);
+			$releaseables{$file}=1;
+			}
+		}
+	close PIPE;
+	&zip_and_check("$mmpname.orig.$platform.zip", \%allreleaseables, 0);
+	
+	&do_system("$makecmd -r -f $makefile CLEAN");
+	&do_system("$makecmd -r -f $makefile ALL");
+	&zip_and_check("$mmpname.cmd.$platform.zip", \%releaseables, 1);
+
+	&do_system("$makecmd -r -f $makefile CLEAN");
+	
+	print "=== $phasename == $mmpname.mcp\n";
+
+	# Remove the remnants of previous projects
+	# use MAKMAKE to generate the importable .xml
+	# import the xml to create the .mcp
+	# build the relevant targets
+	# extract the contents of the "Errors & Warnings" window
+	# check against the commandline list of releasables, zip up the ones which exist
+	
+	my $currentdir = cwd;
+	$currentdir =~ s/\//\\/g;
+	my $xmlfile = "$currentdir\\$mmpname.xml";
+	my $mcpfile = "$currentdir\\$mmpname.mcp";
+	my $mcpdata = "$currentdir\\${mmpname}_Data";
+	
+	&do_system("rmdir /s/q $mcpdata") if (-d $mcpdata);
+	unlink $mcpfile if (-f $mcpfile);
+	unlink $xmlfile if (-f $xmlfile);
+
+	&do_system("perl -S makmake.pl $mmpdir$mmpname CW_IDE:$platform");
+	if (-f $xmlfile)
+		{
+		&fixup_XML($xmlfile) if ($Options{"v"});
+		my $project = $CW->ImportProject($xmlfile, $mcpfile, 'true');
+		if (defined($project))
+			{
+			my $success = &BuildTargets($project->Targets,$platform);
+			$project->Close();
+			return if (!$success);
+			&zip_and_check("$mmpname.ide.$platform.zip", \%releaseables, 1);
+			}
+		else
+			{
+			print "ERROR: failed to import $xmlfile\n";
+			return;
+			}
+		}
+	else
+		{
+		print "ERROR: failed to create $xmlfile\n";
+		return;
+		}
+
+	print "=== $phasename == $mmpname.evalid\n";
+
+	# remove & recreate a clean temporary directory for unzipping
+	# unzip the saved results of the cmd and ide builds
+	# use EVALID to compare the releaseables
+		
+	my $evaliddir = "c:\\temp\\evalid";
+	&do_system("rmdir /s/q $evaliddir") if (-d $evaliddir);
+	mkpath([$evaliddir]);
+	
+	if (   &do_system("unzip -q $mmpname.cmd.$platform.zip -d $evaliddir\\cmd")==0
+		&& &do_system("unzip -q $mmpname.ide.$platform.zip -d $evaliddir\\ide")==0)
+		{
+		open EVALID,"perl -S evalid.pl $evaliddir\\ide $evaliddir\\cmd -c |";
+		while (<EVALID>)
+			{
+			print $_ if (/^(PROBLEM|Failed)/);
+			print $_ if (/^OK/ && $Options{"v"});
+			if (/^FAILED/)
+				{
+				if (/\.map\t/i)
+					{
+					print "WARNING(S): $_";
+					}
+				else
+					{
+					print "FATAL ERROR(S): $_";
+					}
+				}
+			}
+		close EVALID;
+		}
+	else
+		{
+		print "FATAL ERROR(S): problems unpacking zip files\n";
+		}
+	&do_system("rmdir /s/q $evaliddir") if (-d $evaliddir);
+	
+	# Restore original files, if any
+	if (-e "$mmpname.orig.$platform.zip")
+		{
+		&do_system("unzip -q -o $mmpname.orig.$platform.zip -d \\");
+		}
+	}
+
+sub fixup_XML($)
+	{
+	my ($xmlfile) = @_;
+	open XML,"<$xmlfile" or return;
+	my @lines = <XML>;
+	close XML;
+	
+	foreach (@lines)
+		{
+		# Insist that build commands are logged to the output window, irrespective of CW version
+		s-<SETTING><NAME>LogMessages</NAME><VALUE>false</VALUE></SETTING>-<SETTING><NAME>LogMessages</NAME><VALUE>true</VALUE></SETTING>-;
+		s-<SETTING><NAME>ShowCommandLine</NAME><VALUE>false</VALUE></SETTING>-<SETTING><NAME>ShowCommandLine</NAME><VALUE>true</VALUE></SETTING>-;
+
+		# Remove generation of Browse info by Language Parser (temporary workaround for crashes in automated IDE builds)
+		s-<SETTING><NAME>BrowserGenerator</NAME><VALUE>2</VALUE></SETTING>-<SETTING><NAME>BrowserGenerator</NAME><VALUE>0</VALUE></SETTING>-;		
+		}
+		
+	open XML,">$xmlfile" or return;
+	print XML @lines;
+	close XML;
+	}
+	
+sub BuildTargets($$)
+	{
+	my ($targets,$platform) = @_;
+
+	for (my $item=0; $item<$targets->Count; $item++ ) 
+		{
+		my $target = $targets->Item($item);
+	    my $targetName = $target->name;
+	    # Skip platforms we aren't interested in...
+	    next if ($targetName !~ /$platform /i);
+
+		print "Building $targetName...\n";
+		     
+	    $target->RemoveObjectCode( 'true' );
+
+		my $buildMessages = $target->BuildAndWaitToComplete();
+		if (!defined($buildMessages))
+			{
+			printf "FATAL ERROR(S): build aborted? (%s)\n", $target->LastError();
+			return 0;
+			}
+			
+		my $messageList = $buildMessages->Informations;
+		&printMessages("",$messageList) if defined($messageList);
+		
+		my $warningCount = $buildMessages->WarningCount;
+		my $errorCount = $buildMessages->ErrorCount;    
+		print "Completed $targetName with $errorCount errors and $warningCount warnings\n";
+
+		if ($errorCount > 0)
+			{
+			$messageList = $buildMessages->Errors;
+			&printMessages("FATAL ERROR(S): ", $messageList);
+			}
+		if ($warningCount > 0)
+			{
+			$messageList = $buildMessages->Warnings;
+			&printMessages("WARNING: ", $messageList);
+			}
+		} 
+	return 1;
+	}
+
+sub	printMessages ($$)
+	{
+    my ($prefix,$messageList) = @_;
+
+	# traverse through the list of messages
+	for (my $item = 0; $item < ($messageList->Count); $item++)
+		{
+        my $message = $messageList->Item($item);
+		print $prefix,$message->MessageText,"\n";
+		}
+	}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/a.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,25 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "a.h"
+
+#ifdef ADEF
+int a = 1;
+#else
+int a = 0;
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/b.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,26 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#include "b.h"
+
+#ifdef BDEF
+int b = 1;
+#else
+int b = 0;
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/featnames.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+NOEL
+JACK
+
+ADEF
+BDEF
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/fred.dll	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+fred DLL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/inc_jack/a.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifdef JACK
+int a_jack(int);
+#else
+int a_jill(int);
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/inc_jack/b.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifdef JACK
+int b_jack(int);
+#else
+int b_jill(int);
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/inc_noel/a.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifdef NOEL
+int a_noel(int);
+#else
+int a_xmas(int);
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/inc_noel/b.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#ifdef NOEL
+int b_noel(int);
+#else
+int b_xmas(int);
+#endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/jack.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#define JACK
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/jack2.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#define JACK
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/john.12345678901234567890123456789012.dll	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+john DLL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/john.dll.vmap	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+FEATUREVARIANT
+12345678901234567890123456789012	myvar
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/noel.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+/*
+* 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 "Eclipse Public License v1.0"
+* which accompanies this distribution, and is available
+* at the URL "http://www.eclipse.org/legal/epl-v10.html".
+*
+* Initial Contributors:
+* Nokia Corporation - initial contribution.
+*
+* Contributors:
+*
+* Description:
+*
+*/
+
+
+#define NOEL
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantmap/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,261 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# unit tests for featurevariantmap.pm
+
+use strict;
+use Test;
+use File::Basename;
+use File::Spec;
+use lib "../../e32util";	# run from e32toolp/test/featuervariantmap
+use lib "../e32util";		# run from e32toolp/test
+use featurevariantmap;
+use File::Copy;
+use Digest::MD5;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 56 }
+
+# where is the test data
+my $dir = File::Spec->rel2abs(dirname($0));
+print "# running in $dir\n";
+
+# Copy the features lists needed for this test to the right place
+mkdir("$ENV{EPOCROOT}epoc32/include/variant/featurelists/");
+unlink "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt";
+copy("$dir/featnames.txt", "$ENV{EPOCROOT}epoc32/include/variant/featurelists/featnames.txt");
+
+###############################################################################
+# tests for Find                                                              #
+###############################################################################
+
+# we wont find a non-existent file
+ok(featurevariantmap->Find("non-existant-file", "myvar"), "");
+
+# we will find a real file (with no vmap)
+ok(featurevariantmap->Find("$dir/fred.dll", "myvar"), "$dir/fred.dll");
+
+# we wont find a non-existent feature variant
+print "# expect an ERROR from this test\n";
+ok(featurevariantmap->Find("$dir/john.dll", "not-a-variant"), "");
+
+# we will find a real feature variant
+ok(featurevariantmap->Find("$dir/john.dll", "myvar"),
+   "$dir/john.12345678901234567890123456789012.dll");
+
+# the feature variant name should not depend on case
+ok(featurevariantmap->Find("$dir/john.dll", "MyVar"),
+   "$dir/john.12345678901234567890123456789012.dll");
+
+###############################################################################
+# tests for Save                                                              #
+###############################################################################
+
+# create a .vmap from scratch
+unlink("$dir/tony.dll.vmap"); 
+
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", "a_phone", "features_for_a"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+
+# add to an existing .vmap file
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", "b_phone", "features_for_b1"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb","b_phone","features_for_b1"));
+
+# change an entry in an existing .vmap file
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "babababababababababababababababa", "b_phone", "features_for_b2"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "babababababababababababababababa","b_phone","features_for_b2"));
+
+# change with one case and check with another
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba", "B_PhOnE", "features_for_b3"));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
+
+# add an entry and a hint to an existing .vmap file
+my @hints = ("FEATUREVARIANT");
+ok(! featurevariantmap->Save("$dir/tony.dll", 
+     "cccccccccccccccccccccccccccccccc", "c_phone", "features_for_c", \@hints));
+
+ok(check("$dir/tony.dll.vmap", "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa","a_phone","features_for_a"));
+ok(check("$dir/tony.dll.vmap", "abbbbbbbbbbbbbbbbbbbbbbbbbbbbbba","b_phone","features_for_b3"));
+ok(check("$dir/tony.dll.vmap", "cccccccccccccccccccccccccccccccc","c_phone","features_for_c"));
+ok(check("$dir/tony.dll.vmap", "FEATUREVARIANT"));
+
+###############################################################################
+# tests for Hash                                                              #
+###############################################################################
+
+# test the hash key for an invalid feature variant
+my @src = ("$dir/a.cpp", "$dir/b.cpp");
+my %var = ('NAME' => 'something', 'VALID' => 0);
+
+ok(featurevariantmap->Hash(\@src, \%var), "");
+ok(featurevariantmap->HashAndFeatures(\@src, \%var), "");
+
+# test the hash key for a valid feature variant with missing headers
+$var{'VALID'} = 1;
+ok(featurevariantmap->Hash(\@src, \%var), qr/^[0-9a-f]{32}$/);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined');
+
+# test the hash key for a working feature variant
+$var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
+my $h1 = featurevariantmap->Hash(\@src, \%var);
+ok($h1, qr/^[0-9a-f]{32}$/);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=undefined');
+
+# test the hash key for a different working feature variant
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel", "$dir/inc_fake"];
+my $h2 = featurevariantmap->Hash(\@src, \%var);
+ok($h2, qr/^[0-9a-f]{32}$/);
+ok($h1 ne $h2);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=undefined');
+
+# test the hash key for a working feature variant with a pre-include
+$var{'PREINCLUDE'} = "$dir/jack.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_jack"];
+my $h3 = featurevariantmap->Hash(\@src, \%var);
+ok($h3, qr/^[0-9a-f]{32}$/);
+ok($h3 ne $h2);
+ok($h3 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
+
+# test that we get the same hash value when we should (jack2.hrh ~ jack.hrh)
+$var{'PREINCLUDE'} = "$dir/jack2.hrh";
+my $h3a = featurevariantmap->Hash(\@src, \%var);
+ok($h3a, $h3);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,JACK=defined');
+
+# test the hash key for a different working feature variant with a pre-include
+$var{'PREINCLUDE'} = "$dir/noel.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
+my $h4 = featurevariantmap->Hash(\@src, \%var);
+ok($h4, qr/^[0-9a-f]{32}$/);
+ok($h4 ne $h3);
+ok($h4 ne $h2);
+ok($h4 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=undefined,BDEF=undefined,NOEL=defined');
+
+# test the hash key for a different working feature variant with extra macros
+$var{'PREINCLUDE'} = "$dir/noel.hrh";
+$var{'BUILD_INCLUDES'} = ["$dir/inc_noel"];
+$var{'MACROS'} = ["ADEF"];
+my $h5 = featurevariantmap->Hash(\@src, \%var);
+ok($h5, qr/^[0-9a-f]{32}$/);
+ok($h5 ne $h4);
+ok($h5 ne $h3);
+ok($h5 ne $h2);
+ok($h5 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=undefined,NOEL=defined');
+
+$var{'MACROS'} = ["ADEF", "BDEF"];
+my $h6 = featurevariantmap->Hash(\@src, \%var);
+ok($h6, qr/^[0-9a-f]{32}$/);
+ok($h6 ne $h5);
+ok($h6 ne $h4);
+ok($h6 ne $h3);
+ok($h6 ne $h2);
+ok($h6 ne $h1);
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
+
+# test verbose mode
+$featurevariantmap::verbose = 1;
+print "# this test is verbose\n";
+my $h7 = featurevariantmap->Hash(\@src, \%var);
+ok($h7, $h6);
+print "# this test is verbose\n";
+ok(CompareHashAndFeatures(featurevariantmap->HashAndFeatures(\@src, \%var)), 'ADEF=\'1\',BDEF=\'1\',NOEL=defined');
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# utility functions
+
+sub check
+{
+	my $file = shift;
+	my $arg1 = shift;
+	my $arg2 = shift;
+	my $feat = shift;
+	
+	if ($arg2)
+	{
+		return checkHash($file, $arg1, $arg2, $feat);
+	}
+	return checkHint($file, $arg1);
+}
+
+sub checkHash
+{
+	my $file = shift;
+	my $hash = shift;
+	my $name = shift;
+	my $feat = shift;
+	
+	open(FILE, $file) or return 0;
+	my $hit = 0;	# found hash with the right name
+	my $bad = 0;	# found hash with the wrong name
+	while (<FILE>)
+	{
+		if (/^$hash\s+(\w+)\s+$feat$/)
+		{
+			if (uc($1) eq uc($name))
+			{
+				$hit = 1;
+			}
+			else
+			{
+				$bad = 1;
+			}
+		}
+	}
+	close(FILE);
+	return ($hit && !$bad);
+}
+
+sub checkHint
+{
+	my $file = shift;
+	my $hint = shift;
+
+	open(FILE, $file) or return 0;
+	while (<FILE>)
+	{
+		if (/^$hint\s*$/)
+		{
+			close(FILE);
+			return 1;
+		}
+	}
+	close(FILE);
+	return 0;
+}
+
+# Check hash and feature list matches
+sub CompareHashAndFeatures
+{
+	return if !$_[0] || !$_[1];
+	return $_[1] if $_[0] eq Digest::MD5::md5_hex($_[1]);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/a1.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,12 @@
+# A1.var
+
+VARIANT A1
+EXTENDS          groupA
+
+VIRTUAL
+
+BUILD_INCLUDE     append	 /epoc32/include/A1/build
+BUILD_INCLUDE   prepend 	/prepend/include/A1
+ROM_INCLUDE prepend /epoc32/include/A1/rom
+
+VARIANT_HRH /epoc32/include/e32std.h
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/a2.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+VARIANT A2
+
+EXTENDS groupA
+VIRTUAL
+
+BUILD_INCLUDE set /epoc32/include/A2/build
+BUILD_INCLUDE append /epoc32/include/A2/build2
+ROM_INCLUDE set /epoc32/include/A2/rom
+VARIANT_HRH /epoc32/include/e32std.h
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/b1a.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+# b1a.var
+
+EXTENDS A1
+VARIANT B1A
+BUILD_INCLUDE append epoc32\include\B1\build
+BUILD_INCLUDE prepend  /prepend/include/B1
+
+ROM_INCLUDE prepend /epoc32/include/B1/rom
+VARIANT_HRH \epoc32/include/e32cmn.inl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/b1b.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+# B1b.var
+
+EXTENDS A1
+VARIANT B1B
+VIRTUAL
+
+BUILD_INCLUDE append /epoc32/include/B1/build
+BUILD_INCLUDE prepend  /prepend/include/B1
+
+ROM_INCLUDE prepend /epoc32/include/B1/rom
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/b2.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+# B2.var
+
+EXTENDS A2
+VARIANT B2
+BUILD_INCLUDE append /epoc32/include/B1/build
+BUILD_INCLUDE prepend  /prepend/include/B1
+
+ROM_INCLUDE prepend /epoc32/include/B1/rom
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/default.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+
+VIRTUAL
+
+VARIANT default      
+
+BUILD_INCLUDE set /epoc32/include/build
+ROM_INCLUDE set /epoc32/include/rom         
+VARIANT_HRH		\epoc32\include\variant\Symbian_OS.hrh
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/groupa.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+VARIANT groupA
+EXTENDS default      
+
+# grouping node
+VIRTUAL
+
+# Add to parent paths
+BUILD_INCLUDE append /epoc32/include/groupA/build
+
+# Append ROM_INCLUDE to parent
+ROM_INCLUDE append /epoc32/include/groupA/rom
+
+VARIANT_HRH /epoc32/include/e32std.h
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/featurevariantparser/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,168 @@
+#
+# Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# Unit tests for Feature Variant Parser (featurevariantparser.pm)
+# Will only work with EPOCROOT = \, due to some hard coded paths in the VAR files
+# To use a custom EPOCROOT, update the VAR files to reflect the correct paths
+# This test script can either be called on its own, or run through the test harness under ../unittest.pl
+
+use strict;
+use Test;
+use lib "../../e32util";
+use lib "../e32util";
+use featurevariantparser;
+use File::Spec;
+use File::Basename;
+
+BEGIN { plan tests => 18 }
+
+# Current Working Directory
+my $dir = dirname($0);
+
+my @buildincludes;
+my $buildincs;
+my $romincs;
+my @romincludes;
+my @parentnodes;
+my $parents;
+my @childnodes;
+my $children;
+
+# Uncommenting the next line will enable verbose mode
+#$featurevariantparser::verbose=1;
+
+# Load first variant file
+my %variant1 = featurevariantparser->GetVariant( "default", "$dir" );
+
+#1
+print "\nCheck the NAME of the variant:\n";
+ok( 'default', $variant1{'NAME'} );
+
+#2
+print "\nCheck the FULL PATH:\n";
+ok( File::Spec->rel2abs("$dir\\default.var"), $variant1{'FULLPATH'} );
+
+#3
+print "\nCheck if variant is VALID:\n";
+ok( $variant1{'VALID'} );
+
+#4
+print "\nCheck if this is a VIRTUAL node:\n";
+ok( $variant1{'VIRTUAL'} );
+
+#5
+my $tmp = "$ENV{EPOCROOT}epoc32\\include\\variant\\Symbian_OS.hrh";
+print "\nTest the VARIANT_HRH:\n";
+ok( File::Spec->canonpath($tmp), $variant1{'VARIANT_HRH'} );
+
+#6
+print "\nTesting the BUILD_INCLUDES with 'append' keyword:\n";
+@buildincludes = ("$ENV{EPOCROOT}epoc32/include/build");
+$buildincs     = $variant1{'BUILD_INCLUDES'};
+ok( File::Spec->canonpath("@buildincludes"), "@$buildincs" );
+
+#7
+print "\nTesting the ROM_INCLUDES:\n";
+@romincludes = ("$ENV{EPOCROOT}epoc32\\include\\rom");
+$romincs     = $variant1{'ROM_INCLUDES'};
+ok( File::Spec->canonpath("@romincludes"), "@$romincs" );
+
+# Load Second Variant File
+my %variant2 = featurevariantparser->GetVariant( "a1", "$dir" );
+
+#8
+print "\nTesting PARENT NODES:\n";
+@parentnodes = ("groupA default");
+$parents     = $variant2{'PARENTS'};
+ok( "@parentnodes", "@$parents" );
+
+#9
+print "\nTesting CHILD NODES:\n";
+@childnodes = ( "b1a", "b1b" );
+$children = $variant2{'CHILDREN'};
+ok( "@childnodes", "@$children" );
+
+#10
+print "\nTesting BUILD_INCLUDES of a child variant with 'prepend' keyword:\n";
+@buildincludes = (
+    "$ENV{EPOCROOT}prepend/include/A1",
+    "$ENV{EPOCROOT}epoc32/include/build",
+    "$ENV{EPOCROOT}epoc32/include/groupA/build",
+    "$ENV{EPOCROOT}epoc32/include/A1/build"
+);
+$buildincs = $variant2{'BUILD_INCLUDES'};
+ok( File::Spec->canonpath("@buildincludes"), "@$buildincs" );
+
+#11
+print "\nTesting ROM_INCLUDES of a child variant:\n";
+@romincludes = (
+    "$ENV{EPOCROOT}epoc32/include/A1/rom",
+    "$ENV{EPOCROOT}epoc32/include/rom",
+    "$ENV{EPOCROOT}epoc32/include/groupA/rom"
+);
+$romincs = $variant2{'ROM_INCLUDES'};
+ok( File::Spec->canonpath("@romincludes"), "@$romincs" );
+
+
+#12
+print "\nTesting Invalid Variant file (Missing HRH location). Expect an error from this test\n";
+# Load third Variant File
+my %variant3 = featurevariantparser->GetVariant( "b2", "$dir" );
+ok( !$variant3{'VALID'} );
+
+#13
+my %info4 = featurevariantparser->GetVariant( "a2", "$dir" );
+print "\nTesting the BUILD_INCLUDES of a child node with 'set' keyword:\n";
+@buildincludes = (
+    "$ENV{EPOCROOT}epoc32/include/A2/build",
+    "$ENV{EPOCROOT}epoc32/include/A2/build2"
+);
+$buildincs = $info4{'BUILD_INCLUDES'};
+ok( File::Spec->canonpath("@buildincludes"), "@$buildincs" );
+
+#14 
+print "\nTesting for function which searches for default variant file in a given directory\n";
+ok(featurevariantparser->DefaultExists("$dir"));
+
+
+#15 
+print "\nTesting for function which searches for default variant file in the default directory\n";
+if ( -e "$ENV{EPOCROOT}epoc32/tools/variant/default.var" ) {
+	ok(featurevariantparser->DefaultExists());
+}
+else {
+	ok(!featurevariantparser->DefaultExists());
+}
+
+
+#16
+print "\nTesting GetBuildableFeatureVariants(). Ignore the generated errors\n";
+my @list =featurevariantparser->GetBuildableFeatureVariants($dir);
+my $validlist = "b1a";
+ok($list[0],$validlist);
+
+
+#17
+print "\nTesting ResolveFeatureVariant().Ignore the generated errors\n";
+my @list2 = featurevariantparser->ResolveFeatureVariant("default",$dir);
+my @validlist2 = ("b1a");
+ok(@list2,@validlist2);
+
+#18
+print "\nTesting GetValidVariant().Ignore the generated errors\n";
+my @list3 = featurevariantparser->GetValidVariants($dir);
+my @validlist3 = ("a1","a2","b1a","default","groupa");
+ok("@list3","@validlist3");
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/fixeabidefs.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,561 @@
+@rem
+@rem Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+@rem All rights reserved.
+@rem This component and the accompanying materials are made available
+@rem under the terms of "Eclipse Public License v1.0"
+@rem which accompanies this distribution, and is available
+@rem at the URL "http://www.eclipse.org/legal/epl-v10.html".
+@rem
+@rem Initial Contributors:
+@rem Nokia Corporation - initial contribution.
+@rem
+@rem Contributors:
+@rem
+@rem Description:
+@rem
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+goto endofperl
+@rem ';
+#!perl
+#line 14
+
+use strict;
+use Getopt::Long;
+
+my $toolVersion = 1.0;
+my $RVCTVersion = 2.1;
+my $RVCTBuild = 416;
+my @redundantExportsRegEx = (qr/^_ZTI/, qr/^_ZTV/);
+
+
+# 1. Check arguments, output help etc.
+
+if (@ARGV == 0)
+	{
+	print (STDERR "\nFIXEABIDEFS.BAT - Version $toolVersion for RVCT$RVCTVersion b$RVCTBuild\n");
+
+	print STDERR << 'END_OF_HELP';
+
+Usage: fixeabidefs.bat [-analyse|-list|-update] build_log.log 
+
+Parses the output from build_log.log and locates all MAKEDEF errors where ARMV5 built
+object files do not include exports specified in the current, frozen, EABI .def file.
+Where this has occurred, the tool checks against an internal list to determine
+whether these are redundant exports that are no longer required.
+
+-analyse  Process MAKEDEF errors and warnings list .def files that cannot be updated by this tool.
+-list     Lists all .def files that will be updated by the tool.
+-update   Creates updated .def files with redundant exports removed.
+
+Updated .def files have redundant exports removed by "back-filling" from unfrozen exports
+flagged against the same .def file.  If no unfrozen exports are available, the "ABSENT"
+export placeholder is used to effectively remove the export, but maintain a degree of BC.
+
+NOTE: The tool assumes that the original build source layout is replicated on the drive
+where it is being executed.
+
+Redundant exports processed on the following regex:
+END_OF_HELP
+
+	foreach my $redundantExportRegEx (@redundantExportsRegEx)
+		{
+		print ("\t$redundantExportRegEx\n");
+		}
+
+	exit(1);
+	}
+
+my $list = 0;
+my $update = 0;
+my $analyse = 0;
+
+GetOptions ('list' => \$list, 'update' => \$update, 'analyse' => \$analyse);
+
+
+# 2. Parse the log and record the detail of all relevant MAKEDEF errors and warnings
+
+my $BUILD_LOG = $ARGV[0];
+open BUILD_LOG, "< $BUILD_LOG" or die "\nCan't read $BUILD_LOG!\n\n";
+
+my $line;
+my @buildLog;
+
+while ($line = <BUILD_LOG>)
+	{
+	push @buildLog, $line;
+	}
+
+close BUILD_LOG;
+
+my $defFile;
+my $export;
+my $processExport;
+my $variant;
+
+# All hashes keyed on fully pathed .def file
+my %impactedDefFiles;
+my %missingURELExports;
+my %missingUDEBExports;
+my %unfrozenURELExports;
+my %unfrozenUDEBExports;
+
+my $parseWarning = 0;
+my $parseError = 0;
+
+my @exports;
+
+
+# Scan the log and build up UREL and UDEB lists of unfrozen and missing exports
+
+foreach $line (@buildLog)
+	{
+	if (($line !~ /^  /))
+		{
+		if ($parseError)
+			{
+			$variant =~ /UREL/ ? push @{$missingURELExports{$defFile}}, [@exports] : push @{$missingUDEBExports{$defFile}}, [@exports];
+			$parseError = 0;
+			$impactedDefFiles{$defFile} = 1;
+			}
+		elsif ($parseWarning)
+			{
+			$variant =~ /UREL/ ? push @{$unfrozenURELExports{$defFile}}, [@exports] : push @{$unfrozenUDEBExports{$defFile}}, [@exports];
+			$parseWarning = 0;
+			$impactedDefFiles{$defFile} = 1;
+			}
+		
+		@exports = ();
+		}
+		
+	if ($line =~ /^  make.* CFG\=/)
+		{
+		$variant = $line;
+		$variant =~ s/^.*CFG\=//;
+		$variant =~ s/ .*$//;
+		$variant =~ s/\s//g;
+		next;
+		}
+		
+	if ($line =~ /MAKEDEF WARNING:.*not yet Frozen in/)
+		{			
+		$parseError = 0;
+		$parseWarning = 1;
+
+		$defFile = $line;
+		$defFile =~ s/^.*not yet Frozen in//;
+		$defFile =~ s/:$//;
+		$defFile =~ s/\s//g;
+		$defFile = lc $defFile;
+		next;
+		}
+	
+	if ($line =~ /MAKEDEF ERROR:/)
+		{
+		$parseError = 1;
+		$parseWarning = 0;
+		next;
+		}
+
+	if (($line =~ /^  /) && ($parseError || $parseWarning))
+		{			
+		$export = $line;
+		$export =~ s/^.* : //;
+		$export =~ s/ .*$//;
+		$export =~ s/\s//g;
+
+		if ($parseError)
+			{
+			$defFile = $line;
+			$defFile =~ s/\(.*$//;
+			$defFile =~ s/\s//g;
+			$defFile = lc $defFile;
+			}
+
+		push @exports, $export;
+		
+		next;
+		}
+	}
+
+
+my %validDefFiles = %impactedDefFiles;
+
+my %missingExportDifferences;
+my %unfrozenExportDifferences;
+
+my %sharedDifferences;
+
+my $redundantExportRegEx;
+my %invalidExports;
+my $validExport;
+
+my $URELelements;
+my $UDEBelements;
+my $index1;
+my $index2;
+
+foreach $defFile (sort keys %impactedDefFiles)
+	{
+	if ($missingURELExports{$defFile})
+		{			
+		$URELelements = @{$missingURELExports{$defFile}};
+		$UDEBelements = @{$missingUDEBExports{$defFile}};
+
+		for ($index1 = 0; $index1 < $URELelements; $index1++)
+			{
+			foreach $export (@{@{$missingURELExports{$defFile}}[$index1]})
+				{
+				for ($index2 = 0; $index2 < $UDEBelements; $index2++)
+					{
+					if (!grep (/$export/, @{@{$missingUDEBExports{$defFile}}[$index2]}))
+						{
+						if (!$index1 && !$index2)
+							{
+							$missingExportDifferences{$defFile} = 1;
+							}
+						else
+							{
+							$sharedDifferences{$defFile} = 1;
+							}
+
+						delete $validDefFiles{$defFile};
+						}
+					}
+
+				$validExport = 0;
+			
+				foreach $redundantExportRegEx (@redundantExportsRegEx)
+					{
+					if ($export =~ /$redundantExportRegEx/)
+						{
+						$validExport = 1;
+						}
+					}
+
+				if (!$validExport)
+					{
+					${$invalidExports{$defFile}}{$export} = 1;
+					delete $validDefFiles{$defFile};
+					}
+				}
+			}
+
+		for ($index1 = 0; $index1 < $URELelements; $index1++)
+			{
+			foreach $export (@{@{$missingUDEBExports{$defFile}}[$index1]})
+				{
+				for ($index2 = 0; $index2 < $URELelements; $index2++)
+					{
+					if (!grep (/$export/, @{@{$missingURELExports{$defFile}}[$index2]}))
+						{
+						if (!$index1 && !$index2)
+							{
+							$missingExportDifferences{$defFile} = 1;
+							}
+						else
+							{
+							$sharedDifferences{$defFile} = 1;
+							}
+							
+						delete $validDefFiles{$defFile};
+						}
+					}
+
+				$validExport = 0;
+			
+				foreach $redundantExportRegEx (@redundantExportsRegEx)
+					{
+					if ($export =~ /$redundantExportRegEx/)
+						{
+						$validExport = 1;
+						}
+					}
+
+				if (!$validExport)
+					{
+					${$invalidExports{$defFile}}{$export} = 1;
+					delete $validDefFiles{$defFile};
+					}
+				}
+			}
+		}
+
+	if (!$unfrozenURELExports{$defFile} && $unfrozenUDEBExports{$defFile})
+		{
+		$unfrozenExportDifferences{$defFile}  = 1;
+		}
+	elsif ($unfrozenURELExports{$defFile})
+		{
+		$URELelements = @{$unfrozenURELExports{$defFile}};
+		$UDEBelements = @{$unfrozenUDEBExports{$defFile}};
+
+		for ($index1 = 0; $index1 < $URELelements; $index1++)
+			{
+			foreach $export (@{@{$unfrozenURELExports{$defFile}}[$index1]})
+				{
+				for ($index2 = 0; $index2 < $UDEBelements; $index2++)
+					{
+					if (!grep (/$export/, @{@{$unfrozenUDEBExports{$defFile}}[$index2]}))
+						{
+						if (!$index1 && !$index2)
+							{
+							$unfrozenExportDifferences{$defFile} = 1;
+							}
+						else
+							{
+							delete $validDefFiles{$defFile};
+							$sharedDifferences{$defFile} = 1;
+							}
+						}
+					}
+				}
+			}
+
+		for ($index1 = 0; $index1 < $URELelements; $index1++)
+			{
+			foreach $export (@{@{$unfrozenUDEBExports{$defFile}}[$index1]})
+				{
+				for ($index2 = 0; $index2 < $URELelements; $index2++)
+					{
+					if (!grep (/$export/, @{@{$unfrozenURELExports{$defFile}}[$index2]}))
+						{
+						if (!$index1 && !$index2)
+							{
+							$unfrozenExportDifferences{$defFile} = 1;
+							}
+						else
+							{
+							delete $validDefFiles{$defFile};
+							$sharedDifferences{$defFile} = 1;
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+
+if ($analyse)
+	{
+	if (%missingExportDifferences)
+		{
+		print ("\nThe following .def files differ in the number of missing exports between UREL and UDEB builds.\n");
+		print ("These files will not be treated by this tool.\n\n");
+		
+		foreach $defFile (sort keys %missingExportDifferences)
+			{
+			print ("\t$defFile\n");
+			}
+		}
+
+	if (%unfrozenExportDifferences)
+		{	
+		print ("\nThe following .def files differ in the number of unfrozen exports between UREL and UDEB builds.\n");
+		print ("These files will be or were back-filled with regard to any UREL unfrozen exports available.");
+		print ("If no UREL unfrozen exports are available, the classes in question have to be marked non-sharable.\n\n");
+				
+		foreach $defFile (sort keys %unfrozenExportDifferences)
+			{
+			print ("\t$defFile\n");
+			}
+		}
+
+	if (%sharedDifferences)
+		{
+		print ("\nThe following .def files are shared between multiple components, and differ in exports\n");
+		print ("between either UDEB or UREL builds, or between the build of the components from which they are used.\n");
+		print ("These files will not be treated by this tool.\n\n");
+		
+		foreach $defFile (sort keys %sharedDifferences)
+			{
+			print ("\t$defFile\n");
+			}
+		}
+
+	if (%invalidExports)
+		{
+		print ("\nThe following .def files contain missing exports that cannot be resolved by this tool.\n");
+
+		foreach $defFile (sort keys %invalidExports)
+			{
+			print ("\n\t$defFile\n");
+
+			foreach $export (sort keys %{$invalidExports{$defFile}})
+				{
+				print ("\t\t$export\n");
+				}
+			}
+		}
+
+	if (!%missingExportDifferences && !%unfrozenExportDifferences && !%sharedDifferences && !%invalidExports)
+		{
+		print ("\nAll MAKEDEF ERRORs and WARNINGs in the specified log can be treated by this tool.\n");
+		}
+	}
+
+
+if ($list)
+	{
+	foreach $defFile (sort keys %validDefFiles)
+		{
+		print ("$defFile\n");
+		}
+	}
+
+
+if ($update)
+	{
+	my %updatedDefFiles;
+	my $missingExport;
+	my $unfrozenExport;
+
+	foreach $defFile (keys %validDefFiles)
+		{
+		if (!open DEF_FILE, "< $defFile")
+			{
+			print "Can't read $defFile!\n";
+			next;
+			}
+
+		while ($line = <DEF_FILE>)
+		 	{
+		 		
+# Either Back-fill or make 'ABSENT' any missing exports
+
+			if ($missingURELExports{$defFile})
+				{
+				foreach $missingExport (@{@{$missingURELExports{$defFile}}[0]})
+					{
+					if ($line =~ /$missingExport/)
+						{
+						$unfrozenExport = "";
+
+						if ($unfrozenURELExports{$defFile})
+							{
+							$unfrozenExport = pop @{@{$unfrozenURELExports{$defFile}}[0]};
+							}
+
+						if ($unfrozenExport)
+							{
+							$line =~ s/$missingExport/$unfrozenExport/;
+
+							# If there's an existing comment section, then update it appropriately
+
+							my $commentUpdate = '';
+					
+							if ($unfrozenExport =~ /^_ZTV/)
+								{
+								$commentUpdate = '; #<VT>#';
+								}
+							elsif ($unfrozenExport =~ /^_ZTI/)
+								{
+								$commentUpdate = '; #<TI>#';
+								}
+					
+							$line =~ s/;.*$/$commentUpdate/;
+							}
+						else
+							{
+							if ($line =~ / \;/)
+								{
+								$line =~ s/ \;/ ABSENT \;/;
+								}
+							else
+								{
+								$line.= ' ABSENT';
+								}
+							}
+
+						$line .= "\n" unless ($line =~ /\n$/);
+							
+						last;
+						}
+					}
+			 	}
+
+			push (@{$updatedDefFiles{$defFile}}, $line);
+			}
+		close DEF_FILE;
+		}
+
+
+# Resolve any remaining unfrozen exports in the standard way
+
+	my $lastExportIndex;
+	my $lastExportOrdinal;
+
+	foreach $defFile (keys %updatedDefFiles)
+		{
+		if ($unfrozenURELExports{$defFile} && @{@{$unfrozenURELExports{$defFile}}[0]})
+			{
+			$lastExportIndex = @{$updatedDefFiles{$defFile}}-1;
+
+			while (@{$updatedDefFiles{$defFile}}[$lastExportIndex] =~ /^\s$/)
+				{
+				pop @{$updatedDefFiles{$defFile}};
+				$lastExportIndex--;
+				}
+
+			@{$updatedDefFiles{$defFile}}[$lastExportIndex] .= "\n" unless (@{$updatedDefFiles{$defFile}}[$lastExportIndex] =~ /\n$/);
+
+			$lastExportOrdinal = @{$updatedDefFiles{$defFile}}[$lastExportIndex];
+			$lastExportOrdinal =~ s/^.*@\s+//;
+			$lastExportOrdinal =~ s/ .*$//;
+			$lastExportOrdinal =~ s/\s//g;
+
+			foreach $unfrozenExport (@{@{$unfrozenURELExports{$defFile}}[0]})
+				{
+				$lastExportOrdinal++;
+
+				my $comment = '';
+		
+				if ($unfrozenExport =~ /^_ZTV/)
+					{
+					$comment = ' ; #<VT>#';
+					}
+				elsif ($unfrozenExport =~ /^_ZTI/)
+					{
+					$comment = ' ; #<TI>#';
+					}
+				
+				push (@{$updatedDefFiles{$defFile}}, "\t$unfrozenExport @ $lastExportOrdinal NONAME$comment\n");
+				}
+			
+			push (@{$updatedDefFiles{$defFile}}, "\n");
+			}
+		}
+
+
+# Create the new .def files
+
+	foreach $defFile (sort keys %updatedDefFiles)
+		{		
+		if (!open NEW_DEF_FILE, ">$defFile")
+			{
+			print ("ERROR : Can\'t create \"$defFile\"\n");
+			next;
+			}
+
+		foreach $line (@{$updatedDefFiles{$defFile}})
+			{
+			print (NEW_DEF_FILE $line);
+			}
+
+		close NEW_DEF_FILE;
+
+		print ("Created : \"$defFile\"\n");
+		}
+
+	}
+
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/mmp_testlist.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,133 @@
+# List of MMP files which provide examples of all MMP features
+#
+# This list is for use in short regression tests. It should be
+# regularly processed with mmpscan.pl -f mmp_testlist.txt to
+# ensure that the MMP files still exist and still cover everything.
+
+# wins/winsgui.mmp gets a lot of things
+src/cedar/generic/base/wins/winsgui.mmp											# 					(WINSCW only)
+
+# TARGETTYPE  
+# Need two where emulator and target device don't overlap, e.g. VAR
+#
+##src/common/generic/base/e32/kernel/ekll.mmp									#KLIB
+##src/common/generic/base/e32/euser/edll.mmp									#LIB
+
+src/common/generic/graphics/wserv/group/ANIMDLL.MMP								#ANI
+src/common/generic/app-framework/clock/group/CLOCKA.MMP
+src/common/generic/comms-infras/nifman/group/cs_daemon.mmp						#ECOMIIC
+src/common/generic/app-services/worldserver/group/WorldServer.mmp				#EPOCEXE
+src/common/generic/app-engines/cntmodel/cntsrv/CNTSRV.MMP
+src/cedar/generic/base/f32test/group/t_dirs.mmp									#EXE
+src/common/techview/misc/cctlcolscheme/group/CCtlColScheme.mmp
+src/common/techview/toolkit/shell/group/SHELL.MMP
+src/cedar/generic/base/f32/group/efile.mmp										#EFILE
+src/cedar/generic/base/f32/group/efat.mmp										#FSY				(WINSCW only)
+src/cedar/generic/base/f32/group/elffs.mmp
+src/cedar/generic/base/e32/euser/emulator.mmp									#KDLL				(WINSCW only)
+src/cedar/generic/base/omap/h2/fpga.mmp											#					(not WINSCW)
+src/cedar/generic/base/e32/kernel/edev.mmp										#KLIB
+src/cedar/generic/base/e32/kernel/evar.mmp
+src/cedar/generic/base/e32test/group/d_ldd.mmp									#LDD
+src/common/generic/comms-infras/rootserver/group/bindmgr.mmp					#LIB
+src/common/generic/syslibs/stdlib/BMMP/ECRT0.MMP
+src/common/generic/Multimedia/MMF/MMPFiles/Recognizer/RecMmf.mmp				#MDL
+src/common/generic/app-framework/emime/rec/RECTXT.MMP
+src/common/techview/networking/agentnotifier/group/agentnotifier.mmp			#NOTIFIER2
+src/common/techview/Apps/secui/secdlg/secdlg.mmp
+src/cedar/generic/base/wins/dasnwins.mmp										#PDD 				(WINSCW only)
+src/cedar/generic/base/lubbock/dasnla.mmp										# 					(not WINSCW)
+src/common/generic/graphics/printdrv/group/GENERAL.MMP							#PDL
+src/common/generic/graphics/pdrstore/tps/PRINTDRV.MMP
+src/common/generic/app-engines/convert/WORD/WORD.MMP							#PLUGIN
+src/common/generic/app-services/chtmltocrtconv/group/CHtmlToCrtConverter.mmp
+src/common/generic/j2me/misc/recog/build/MIDP2RecognizerRdl.mmp
+src/cedar/generic/base/e32test/group/textnotifier2.mmp							#TEXTNOTIFIER2
+src/common/generic/networking/dialog/agentnotifier/group/agentshellnotifier.mmp
+src/cedar/generic/base/wins/vwins.mmp											#VAR - emulator		(WINSCW only) winmm.lib
+src/cedar/generic/base/lubbock/vcotla.mmp										#VAR - target		(not WINSCW)
+src/common/generic/syslibs/ecom/ongoing/Framework/MMPFiles/ecomexample12.mmp    #PLUGIN3
+
+# ASSPLIBRARY
+# - removed.  Cedar builds are ASSP generic.
+
+# ASSPABI
+# - none
+
+# COPY_FOR_STATIC_LINKAGE
+src/common/generic/syslibs/pwrcli/group/shutdownsrv.mmp
+src/common/generic/syslibs/bafl/group/Baksrv.mmp
+
+# DEBUG_LIBRARY
+src/common/generic/app-framework/cone/group/CONE.MMP
+src/common/techview/toolkit/eikstd/console/CONSOLE.MMP
+
+# EPOCALLDLLENTRYPOINTS
+# - none
+
+# EPOCFIXEDPROCESS
+src/cedar/generic/base/e32test/group/cpumeter.mmp								# 					(not WINSCW)
+src/cedar/generic/base/e32test/group/t_semutx2.mmp
+
+# EPOCHEAPSIZE
+src/cedar/generic/base/e32test/group/t_ipccpy.mmp
+
+# EPOCPROCESSPRIORITY
+src/cedar/generic/base/e32test/group/crash.mmp
+src/common/techview/MessagingUi/msginit/Group/MsgInit.MMP
+
+# EXPORTLIBRARY
+src/cedar/generic/base/integrator/logic/lmxx600/exvarl1.mmp						#					(not WINSCW)
+
+# EXPORTUNFROZEN
+src/common/generic/app-framework/form/test/ttextview.mmp
+src/common/generic/telephony/mmtsy/test/TS_Sms/TS_sms.mmp
+
+# FIRSTLIB
+src/cedar/generic/base/e32/euser/epoc.mmp										# 					(WINSCW only)
+src/cedar/generic/base/e32/kernel/ekern.mmp										#					(not WINSCW, cwd:src/cedar/generic/base/lubbock)
+src/cedar/generic/base/e32/kernel/ekern.mmp										#					(WINSCW only, cwd:src/cedar/generic/base/wins)
+
+# MCW/MCL
+src/common/techview/CommsUI/bluetoothui/BTSharedUI/BTSharedUI.mmp
+
+# NOEXPORTLIBRARY
+src/cedar/generic/base/lubbock/hal/hal.mmp										#					(not WINSCW, cwd:src/cedar/generic/base/lubbock)
+src/cedar/generic/base/wins/hal/hal.mmp											#					(WINSCW only, cwd:src/cedar/generic/base/wins)
+src/cedar/generic/base/cotulla/dma.mmp											# 					(not WINSCW, cwd:src/cedar/generic/base/lubbock)
+src/cedar/generic/base/integrator/integratorap/kaintap.mmp						# 					(not WINSCW, cwd:src/cedar/generic/base/integrator/core/cm1136)
+
+# OPTION
+src/cedar/generic/base/e32test/group/t_lex.mmp
+
+# SID
+src/cedar/generic/base/e32test/group/t_ver2_1_0.mmp								# 					(not WINSCW)
+src/cedar/generic/base/e32test/group/t_ver2_1_1.mmp								# 					(not WINSCW)
+
+# SRCDBG
+src/common/generic/app-services/versit/tsrc/TBugFix.MMP
+src/common/generic/application-protocols/http/group/httpclient.mmp
+
+# START BITMAP
+src/common/techview/toolkit/extras/group/extras.mmp
+
+# START RESOURCE
+src/common/generic/app-engines/sheng/group/SHENG.MMP
+
+# STATICLIBRARY
+src/common/generic/syslibs/stdlib/TSTLIB/THELLO.MMP
+src/common/generic/syslibs/stdlib/TSTLIB/FINGER.MMP
+
+# STRICTDEPEND
+src/cedar/generic/base/f32/group/estart.mmp
+
+# WIN32_HEADERS
+src/cedar/generic/base/e32/kernel/exstart.mmp
+src/cedar/generic/base/e32utils/d_exc/minkda.mmp
+
+
+# Miscellaneous
+# Assorted files which have caused problems in the past
+
+# - baseaddress for EXE
+src/common/generic/graphics/fbserv/group/FBSERV.MMP
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/mmpscan.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,253 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Perl script to scan tree looking for MMP files with particular keywords
+# 
+#
+
+use strict;
+use File::Find;			# for find()
+use File::Basename;		# for fileparse()
+use Cwd;				# for getcwd()
+
+use Getopt::Long;
+my %Options=();
+GetOptions(\%Options, "f=s");
+
+my @patterns = (
+
+'START\s+BITMAP.*\.MCL',
+'START\s+BITMAP.*\.MBW',
+'START\s+BITMAP',
+'START\s+RESOURCE',
+'ALWAYS_BUILD_AS_ARM',
+'ASSPABI',
+'ASSPEXPORTS',
+'ASSPLIBRARY',
+'CAPABILITY',
+'COMPRESSTARGET',
+'DEFFILE',
+'DOCUMENT',
+'EPOCALLOWDLLDATA',
+'EPOCCALLDLLENTRYPOINTS',
+'EPOCDATALINKADDRESS',
+'EPOCFIXEDPROCESS',
+'EPOCHEAPSIZE',
+'EPOCPROCESSPRIORITY',
+'EPOCSTACKSIZE',
+'EXPORTLIBRARY',
+'EXPORTUNFROZEN',
+'FIRSTLIB',
+'LANG',
+# 'LIBRARY',
+'DEBUGLIBRARY',
+'LINKAS',
+'MACRO\s+__SECURE_API__',
+'MACRO',
+'NOCOMPRESSTARGET',
+'NOEXPORTLIBRARY',
+'NOSTRICTDEF',
+'OPTION',
+'RAMTARGET',
+'RESOURCE',
+'ROMTARGET',
+'SECUREID',
+'SRCDBG',
+# 'SOURCE',
+# 'SOURCEPATH',
+'STATICLIBRARY',
+'STRICTDEPEND',
+'SYSTEMINCLUDE',
+'SYSTEMRESOURCE',
+# 'TARGET',
+'TARGETPATH',
+'TARGETTYPE\s+ANI',
+'TARGETTYPE\s+APP',
+'TARGETTYPE\s+CTL',
+'TARGETTYPE\s+DLL',
+'TARGETTYPE\s+ECOMIIC',
+'TARGETTYPE\s+EPOCEXE',
+'TARGETTYPE\s+EXEDLL',
+'TARGETTYPE\s+EXEXP',		# must precede TARGETTYPE EXE
+'TARGETTYPE\s+EXE',
+'TARGETTYPE\s+FSY',
+'TARGETTYPE\s+IMPLIB',
+'TARGETTYPE\s+KDLL',
+'TARGETTYPE\s+KEXT',
+'TARGETTYPE\s+KLIB',
+'TARGETTYPE\s+LDD',
+'TARGETTYPE\s+LIB',
+'TARGETTYPE\s+MDA',
+'TARGETTYPE\s+MDL',
+'TARGETTYPE\s+NOTIFIER2',
+'TARGETTYPE\s+NOTIFIER',
+'TARGETTYPE\s+PDD',
+'TARGETTYPE\s+PDL',
+'TARGETTYPE\s+PLUGIN',
+'TARGETTYPE\s+PLUGIN3',
+'TARGETTYPE\s+RDL',
+'TARGETTYPE\s+TEXTNOTIFIER2',
+'TARGETTYPE\s+VAR',
+'UID',
+'USERINCLUDE',
+'VENDORID',
+'VERSION',
+
+# from START WINS ... END
+'START\s+WINS',
+'BASEADDRESS',
+'WIN32_LIBRARY',
+'WIN32_RESOURCE',
+'COPY_FOR_STATIC_LINKAGE',
+'WIN32_HEADERS',
+
+# count some unmatched things
+'AIF',
+'SOURCE\s.*\.CIA',			# CIA files
+'TARGETTYPE\s+(other)?',	# a trick to catch unsupported targettypes
+'TARGET\s.*DUMMY',			# who doesn't really want a TARGET
+'#IF',
+'#INCLUDE_FAILURE',			# unresolved #include directives
+'#INCLUDE',
+
+);
+
+my %instances = ();
+my %patternsbyfile = ();
+my $mmpcount = 0;
+
+sub read_mmp($$$)
+	{
+	my ($top,$name,$lines) =@_;
+	open MMP, "<$name" or print "error: $name $top\n" and return 0;
+	my @mmplines=<MMP>;
+	close MMP;
+	
+	foreach my $line (@mmplines)
+		{
+		push @$lines, $line;
+		if ($line =~/^\#include\s+(\"|\<)([^"<]+)(\"|\>)/)
+			{
+			my $currentdir = getcwd();
+			my $includename = $2;
+			if (-f $2)
+				{
+				# name exists relative to current directory
+				}
+			elsif (-f "$ENV{EPOCROOT}epoc32/include/$includename")
+				{
+				$includename = "$ENV{EPOCROOT}epoc32/include/$includename";
+				}
+			else
+				{
+				print "Can't locate $2 from $currentdir/$name $top\n";
+				push @$lines, "#INCLUDE_FAILURE";
+				next;
+				}
+			my ($newname, $newdir, $newext) = fileparse($includename, '\..*');
+			chdir($newdir);
+			read_mmp("from $name $top", "$newname$newext", $lines);
+			chdir($currentdir);
+			}
+		}
+	return 1;
+	}
+	
+sub mmpgrep 
+	{
+	my $fullname = $File::Find::name;
+	return if (defined($patternsbyfile{$fullname}));
+
+	my ($name,$dir,$ext) = fileparse($fullname,'\..*');
+	return unless (lc($ext) eq '.mmp');
+	
+	my %found = ();
+	my @lines = ();
+	return if (read_mmp("", "$name$ext", \@lines)==0);
+	
+	$mmpcount++;
+	my $line;
+	LINE: foreach $line (@lines)
+		{
+		$line = uc $line;
+		foreach (@patterns)
+			{
+			if ($line =~/^\s*$_/)
+				{
+				$found{$_} = 1;
+				next LINE;
+				}
+			}
+		}
+	close MMP;
+	foreach (keys %found)
+		{
+		@{$instances{$_}} = () if (!defined $instances{$_});
+		push @{$instances{$_}}, $fullname;
+		}
+	@{$patternsbyfile{$fullname}} = sort keys %found;
+	}
+
+# Scan the tree, processing each filename with mmpgrep
+
+my @scanlist = ();
+if ($Options{f})
+	{
+	open FILELIST, "<$Options{f}" or die "Cannot open $Options{f}\n";
+	my $line;
+	while ($line = <FILELIST>)
+		{
+		$line =~ s/#.*$//;		# remove comments
+		$line =~ s/\s*$//;		# remove trailing ws
+		$line =~ s/^\s*//;		# remove leading ws
+		next if ($line eq "");
+		push @scanlist, $line;
+		}
+	close FILELIST;
+	}
+push @scanlist, @ARGV;
+find (\&mmpgrep,@scanlist);
+
+# Report the results
+
+print "$mmpcount mmp files processed\n";
+
+my $pattern;
+print "\nSummary by pattern\n";
+foreach $pattern (@patterns)
+	{
+	my $count=0;
+	my $list = $instances{$pattern};
+	$count = scalar @{$list} if (defined $list);
+	printf "%-30s %5d\n", $pattern, $count;
+	}
+	
+print "\nDetail\n";
+foreach $pattern (sort keys %instances)
+	{
+	my $list = $instances{$pattern};
+	my $title = $pattern;
+	$title =~ s/\\s\+/ /;
+	print "\n$title:\n";
+	foreach my $file (@{$list})
+		{
+		print "  $file\n";
+		}
+	}
+
+foreach (sort keys %patternsbyfile)
+	{
+	print "\n$_ :  ", join(" ",@{$patternsbyfile{$_}});
+	}
+
+print "\n";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/test/unittest.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,30 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# run unit tests for e32toolp
+
+use strict;
+use Test::Harness;
+$Test::Harness::Verbose = 1;
+
+my @all = ( 
+'featurevariantparser/test.pl' ,
+'featurevariantmap/test.pl'
+);
+
+runtests(@all);
+exit 0;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/toolinfo/gcce_plat2set.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This module provides a mapping from build platforms (e.g. GCCE) to the
+# corresponding GCC-E environment settings.
+# Currently this module only provides very simple functionality. The intention is
+# that if we're going to support different GCC-E versions for different build
+# platforms (as we do for RVCT) this module should be extended to provide similar
+# functionality to rvct_plat2set.
+# 
+#
+
+package gcce_plat2set;
+
+
+# Returns the GCCE version corresponding to the given build platform. The first
+# function returns the data as a string (e.g. "4.2.3"); the second function
+# returns the data as a list (e.g. [4,2,3]).
+sub get_version_string($);
+sub get_version_list($);
+
+# Returns true if a GCC-E version for the given platform exists.
+sub compiler_exists($);
+
+
+my $g_version;
+
+
+sub get_version_string($)
+{
+    return $g_version;
+}
+
+sub get_version_list($)
+{
+    return split(/\./, $g_version);
+}
+
+sub compiler_exists($)
+{
+    if ($g_version)
+    {
+        return 1;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+BEGIN
+{
+    my $vers = qx/arm-none-symbianelf-gcc -dumpversion 2>&1/;
+
+    if ($vers =~ /^\s*(\d+\.\d+.\d+)\s*$/)
+    {
+        $g_version = "$1";
+    }
+}
+
+
+1;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/toolinfo/rvct_plat2set.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,395 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This module provides a mapping from build platforms (e.g. ARMV5) to the
+# corresponding RVCT environment settings. The information is obtained from an INI
+# file pointed to by the environment variable ABLD_PLAT_INI. The file can have two
+# different formats. The first format (Format 1) is:
+# [Symbian_OS_v9.5]
+# ARMV5 = RVCT 2.2.616
+# ARMV6 = RVCT 2.2.616
+# ARMV7 = RVCT 3.1.700
+# [Symbian_OS_v9.6]
+# ARMV5 = RVCT 3.1.862
+# ARMV7 = RVCT 4.0.100
+# [Symbian_OS_vFuture]
+# ARMV5 = RVCT 4.1.812
+# ARMV7 = RVCT 4.0.100
+# This format matches the tuple <OS version, build platform> onto a RVCT version.
+# The build system will look up the OS version in "\epoc32\data\buildinfo.txt".
+# The second format (Format 2) is:
+# ARMV5 = RVCT 2.2.616
+# ARMV6 = RVCT 2.2.616
+# ARMV7 = RVCT 3.1.700
+# This format doesn't take the OS version into account and is mostly intended for
+# the Integration team.
+# If ABLD_PLAT_INI is not set, or if the INI file doesn't contain any data for the
+# given platform, whatever RVCT version is found in the path will be used.
+# 
+#
+
+package RVCT_plat2set;
+
+use RVCT_ver2set;
+
+#
+# PUBLIC FUNCTIONS
+#
+
+# Returns the RVCT version corresponding to the given build platform. The first
+# function returns the data as a string (e.g. "2.2.616"); the second function
+# returns the data as a list (e.g. [2,2,616]).
+sub get_version_string($);
+sub get_version_list($);
+
+# Returns true if an RVCT version corresponding to the given platform exists.
+sub compiler_exists($);
+
+# Given a build platform, returns what the name and value of the RVCT??BIN variable
+# would be. 
+sub get_bin_name($);
+sub get_bin_path($);
+
+# Given a build platform, returns what the name and value of the RVCT??INC variable
+# would be. 
+sub get_inc_name($);
+sub get_inc_path($);
+
+# Given a build platform, returns what the name and value of the RVCT??LIB variable
+# variable would be. 
+sub get_lib_name($);
+sub get_lib_path($);
+
+# Given a build platform and the name of an RVCT library, returns the full path to
+# that library.
+sub find_lib($$);
+
+#
+# PRIVATE HELPER FUNCTIONS
+#
+
+sub _get_something(@);
+sub _err_and_die(@);
+sub _get_os_version();
+sub _parse_section_data($@);
+
+
+#
+# GLOBAL DATA
+#
+
+my %g_data;
+
+
+sub get_version_string($)
+{
+    return _get_something(@_, 'version');
+}
+
+sub get_version_list($)
+{
+    my $tmp = _get_something(@_, 'version');
+
+    return split(/\./, $tmp);
+}
+
+sub compiler_exists($)
+{
+    my $plat = shift;
+
+    if ( $g_data{$plat}->{version} || $g_data{0}->{version} )
+    {
+        return 1;
+    }
+    else
+    {
+        return 0;
+    }
+}
+
+sub get_bin_name($)
+{
+    return _get_something(@_, 'bin_name');
+}
+
+sub get_bin_path($)
+{
+    return _get_something(@_, 'bin_path');
+}
+
+sub get_inc_name($)
+{
+    return _get_something(@_, 'inc_name');
+}
+
+sub get_inc_path($)
+{
+    return _get_something(@_, 'inc_path');
+}
+
+sub get_lib_name($)
+{
+    return _get_something(@_, 'lib_name');
+}
+
+sub get_lib_path($)
+{
+    return _get_something(@_, 'lib_path');
+}
+
+sub find_lib($$)
+{
+    my $plat = shift;
+    my $lib  = shift;
+
+    my $p = get_lib_path($plat);
+
+    my $f1 = "$p\\armlib\\$lib";
+    my $f2 = "$p\\cpplib\\$lib";
+
+    return "$p\\armlib\\$lib" if -f $f1;
+    return "$p\\cpplib\\$lib" if -f $f2;
+
+    _err_and_die("could not find $lib for platform $plat.");
+}
+
+sub _get_something(@)
+{
+    my $plat = shift;
+    my $what = shift;
+    
+    my $data = $g_data{$plat}->{$what};
+
+    if (!$data)
+    {
+        $data = $g_data{0}->{$what};
+    }
+
+    return $data;
+}
+
+sub _err_and_die(@)
+{
+    if ( defined(&main::FatalError) )
+    {
+        main::FatalError(@_);
+    }
+    else
+    {
+        print STDERR "error: @_\n";
+    }
+
+    exit 1;
+}
+
+sub _get_os_version()
+{
+    my $fname = "/epoc32/data/buildinfo.txt";
+    
+    my $os_ver = "";
+
+    open (my $in,  "<",  $fname) or _err_and_die("couldn't open $fname.");
+
+    while (<$in>)
+    {
+        chomp;
+
+        if ( $_ =~ /^\s*ManufacturerSoftwareBuild\s+M\d\d\d\d\d_(\S+)\s*$/i )
+        {
+            $os_ver = $1;
+            last
+        }
+    }
+
+    close $in or _err_and_die("couldn't close $fname.");
+
+    _err_and_die("couldn't read OS version in $fname") unless $os_ver;
+
+    return $os_ver;
+}
+
+sub _parse_section_data($@)
+{
+    my ($fname, @lines) = @_;
+
+    for (@lines)
+    {
+        if ( $_ =~ /^\s*(\w+)\s*=\s*RVCT\s+(\d+\.\d+\.\d+)\s*$/i )
+        {
+            my $plat = uc($1);
+            my $vers = $2;
+
+            _err_and_die("$fname: platform $plat already defined.") if $g_data{$plat};
+            _err_and_die("$fname: RVCT $vers doesn't exist.") unless RVCT_ver2set::compiler_exists($vers);
+
+            $g_data{$plat}->{version} = $vers;
+
+            $g_data{$plat}->{bin_name} = RVCT_ver2set::get_bin_name($vers);
+            $g_data{$plat}->{bin_path} = RVCT_ver2set::get_bin_path($vers);
+
+            $g_data{$plat}->{inc_name} = RVCT_ver2set::get_inc_name($vers);
+            $g_data{$plat}->{inc_path} = RVCT_ver2set::get_inc_path($vers);
+
+            $g_data{$plat}->{lib_name} = RVCT_ver2set::get_lib_name($vers);
+            $g_data{$plat}->{lib_path} = RVCT_ver2set::get_lib_path($vers);
+        }
+        else
+        {
+            _err_and_die("$fname: invalid field: $_.");
+        }
+    }
+}
+
+
+# initialize module
+{
+    # Initialise platform "0", wich represents the RVCT version found in the path.
+    my $vsnworked = 0; # Flag to check if --vsn command worked
+    # clear --licretry from RVCT22_CCOPT
+    my $key;
+    my %RVCT_CCOPT;
+    foreach $key (keys %ENV) {
+        if($key =~ /RVCT\d+_CCOPT/i ) {
+            $RVCT_CCOPT{$key} = $ENV{$key};
+            $ENV{$key} =~ s/--licretry//i;
+        }
+    }
+    my @lines = qx/armcc --vsn 2>&1/;
+
+    foreach (@lines)
+    {
+        if ($_ =~ /\bRVCT(\d)\.(\d)\s+\[Build (\d+)\]/ )
+        {
+	    $vsnworked = 1;
+            my ($bin, $inc, $lib) = ("RVCT$1$2BIN", "RVCT$1$2INC", "RVCT$1$2LIB");
+
+            $g_data{0}->{version} = "$1.$2.$3";
+
+            $g_data{0}->{bin_name} = $bin;
+            $g_data{0}->{bin_path} = $ENV{$bin};
+
+            $g_data{0}->{inc_name} = $inc;
+            $g_data{0}->{inc_path} = $ENV{$inc};
+
+            $g_data{0}->{lib_name} = $lib;
+            $g_data{0}->{lib_path} = $ENV{$lib};
+
+            last;
+        }
+    }
+    # In case --vsn doesn't work, call --version_number and setup environment variables
+    if ($vsnworked == 0)
+    {
+	    my @lines = qx/armcc --version_number 2>&1/;
+	    foreach (@lines) 
+	    {
+		    if ($_ =~ /^(\d{1})(\d{1})\d{1}(\d{3})$/) 
+		    {
+			    my ($bin, $inc, $lib) = ("RVCT$1$2BIN", "RVCT$1$2INC", "RVCT$1$2LIB");
+			    $g_data{0}->{version} = "$1.$2.$3";
+			    
+			    $g_data{0}->{bin_name} = $bin;
+			    $g_data{0}->{bin_path} = $ENV{$bin};
+
+			    $g_data{0}->{inc_name} = $inc;
+		            $g_data{0}->{inc_path} = $ENV{$inc};
+
+		            $g_data{0}->{lib_name} = $lib;
+		            $g_data{0}->{lib_path} = $ENV{$lib};
+
+            		    last;
+	   		 }
+    	    }
+    }
+
+    # restore RVCT22_CCOPT
+    foreach $key (keys %RVCT_CCOPT) {
+        $ENV{$key} = $RVCT_CCOPT{$key};
+    }
+    # Initialise all platforms defined in the INI file, if that file exists.
+
+    my $fname = $ENV{ABLD_PLAT_INI};
+
+    if ($fname) # The environment variable is set.
+    {
+        _err_and_die("ABLD_PLAT_INI doesn't point to a file.") unless -f $fname;
+
+        open (my $in,  "<",  $fname) or _err_and_die("couldn't open ABLD_PLAT_INI = $fname.");
+
+        my @lines = ();
+        my $format1 = 0;
+
+        while (<$in>)
+        {
+            chomp;
+
+            next if /^\s*;/ ;
+            next if /^\s*#/ ;
+            next if /^\s*$/ ;
+
+            if ($_ =~ /^\s*\[/i)
+            {
+                # This must be the start of an INI section so We treat the file as
+                # format 1.
+                $format1 = 1;
+            }
+
+            push @lines, $_;
+        }
+
+
+        close $in or _err_and_die("couldn't close ABLD_PLAT_INI = $fname.");
+        _err_and_die("$fname contains no data") unless @lines;
+
+        if ($format1)
+        {
+            my $os_ver = _get_os_version();
+            my @lines2 = ();
+
+            while (@lines)
+            {
+                my $line = shift @lines;
+                
+                if ( $line =~ /^\s*\[$os_ver\]/i)
+                {
+                    last;
+                }
+            }
+
+            while (@lines)
+            {
+                my $line = shift @lines;
+
+                if ( $line =~ /^\s*\[/i)
+                {
+                    last;
+                }
+            
+                push @lines2, $line;
+            }
+
+            _parse_section_data($fname, @lines2);
+        }
+        else # Format 2.
+        {
+            # The file is one big section without header.
+            _parse_section_data($fname, @lines);
+        }
+
+    } # if ($fname)
+}
+
+
+1;
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/abld/toolinfo/rvct_ver2set.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,217 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This module provides a mapping from RVCT versions to the corresponding environment
+# settings. The information is obtained from a configuration file pointed to by the
+# environment variable ABLD_RVCT_INI. The following example shows the file's
+# structure:
+# [2.2.616]
+# bin=C:\Apps\ARM-RVCT\2.2.616\bin
+# inc=C:\Apps\ARM-RVCT\2.2.616\inc
+# lib=C:\Apps\ARM-RVCT\2.2.616\lib
+# [3.1.700]
+# bin=C:\Apps\ARM-RVCT\3.1.700\bin
+# inc=C:\Apps\ARM-RVCT\3.1.700\inc
+# lib=C:\Apps\ARM-RVCT\3.1.700\lib
+# If the file is used, it must contain at least one section.
+# 
+#
+
+
+package RVCT_ver2set;
+
+#
+# PUBLIC FUNCTIONS
+#
+
+# Returns a list of available RVCT versions, for example ["2.2.435", "2.2.616"].
+sub get_versions();
+
+# Returns true if the given RVCT version exists.
+sub compiler_exists($);
+
+# Given an RVCT version, returns what the name and value of the RVCT??BIN
+# variable would be. 
+sub get_bin_name($);
+sub get_bin_path($);
+
+# Given an RVCT version, returns what the name and value of the RVCT??INC
+# variable would be. 
+sub get_inc_name($);
+sub get_inc_path($);
+
+# Given an RVCT version, returns what the name and value of the RVCT??LIB
+# variable would be. 
+sub get_lib_name($);
+sub get_lib_path($);
+
+
+#
+# PRIVATE HELPER FUNCTIONS
+#
+
+# Prints an error message and then terminates.
+sub _err_and_die(@);
+
+
+#
+# GLOBAL DATA
+#
+
+# Contains all the information read from the configuration file.
+my %g_data;
+
+
+sub get_versions()
+{
+    return sort(keys %g_data);
+}
+
+sub compiler_exists($)
+{
+    my $vers = shift;
+    return ( $g_data{$vers} ); 
+}
+
+sub get_bin_name($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{bin_name}; 
+}
+
+sub get_bin_path($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{bin_path}; 
+}
+
+sub get_inc_name($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{inc_name}; 
+}
+
+sub get_inc_path($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{inc_path}; 
+}
+
+sub get_lib_name($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{lib_name}; 
+}
+
+sub get_lib_path($)
+{
+    my $vers = shift;
+    return $g_data{$vers}->{lib_path}; 
+}
+
+sub _err_and_die(@)
+{
+    print STDERR "error: @_\n";
+    exit 1;
+}
+
+
+# initialize module
+{
+    my $fname = $ENV{ABLD_RVCT_INI};
+
+    if ($fname) # The environment varaible is set.
+    {
+        _err_and_die("ABLD_RVCT_INI doesn't point to a file.") unless -f $fname;
+
+        open (my $in,  "<",  $fname) or _err_and_die("couldn't open ABLD_RVCT_INI = $fname.");
+
+        my @lines = ();
+
+        while (<$in>)
+        {
+            chomp;
+
+            next if /^\s*;/ ;
+            next if /^\s*#/ ;
+            next if /^\s*$/ ;
+
+            push @lines, $_;
+        }
+
+        close $in or _err_and_die("couldn't close ABLD_RVCT_INI = $fname.");
+
+        while (@lines)
+        {
+            my $ver = shift @lines;
+            my $kv1 = shift @lines;
+            my $kv2 = shift @lines;
+            my $kv3 = shift @lines;
+
+            my $Mm = "";
+
+            if ( $ver =~ /^\s*\[(\d+)\.(\d+)\.(\d+)\]\s*$/ )
+            {
+                _err_and_die("$fname: duplicate section: $ver.") if $g_data{$1};
+                $ver = "$1.$2.$3";
+                $Mm  = "$1$2";
+            }
+            else
+            {
+                _err_and_die("$fname: invalid section header: $ver.");
+            }
+
+            my %kv = ();
+
+            for ($kv1, $kv2, $kv3)
+            {
+                _err_and_die("$fname: not enough data in section $ver.") unless $_;
+
+                if ( $_ =~ /^\s*(bin|inc|lib)\s*=(.*)$/i )
+            {
+                    my $key = uc($1);
+                    my $val = $2;
+
+                    $val =~ s/^\s+//;
+                    $val =~ s/\s+$//;
+
+                    _err_and_die("$fname: in section $ver: \"$key\" doesn't point to a directory.") unless -d $val;
+                    _err_and_die("$fname: in section $ver: duplicate key \"$key\".") if $kv{$key};
+
+                    $kv{$key} = $val;
+                }
+                else
+                {
+                    _err_and_die("$fname: in section $ver: invalid line \"$_\".");
+                }
+            }
+
+            $g_data{$ver}->{bin_name} = "RVCT${Mm}BIN";
+            $g_data{$ver}->{bin_path} = "$kv{BIN}";
+            $g_data{$ver}->{inc_name} = "RVCT${Mm}INC";
+            $g_data{$ver}->{inc_path} = "$kv{INC}";
+            $g_data{$ver}->{lib_name} = "RVCT${Mm}LIB";
+            $g_data{$ver}->{lib_path} = "$kv{LIB}";
+        }
+
+    }
+    else
+    {
+        # ABLD_RVCT_INI isn't set. This is not an error. All public functions will
+        # return NULL.
+    }
+}
+
+1;
+
+
Binary file sbsv1/buildsystem/bin/java/symbianant.jar has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/buildstubsis.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stub .sis building extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	app-services
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/buildstubsis.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Build Stub SIS file
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/system/install
+
+ifeq ($(PLATFORM),WINS) 
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+else
+ifeq ($(PLATFORM),WINSCW)
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+endif
+endif
+
+$(TARGETDIR) :
+	$(call createdir,"$(TARGETDIR)") 
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+	$(EPOCROOT)epoc32/tools/makesis -s $? $@
+
+do_nothing :
+	echo do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+	-$(ERASE) $(SISFILE)
+
+RELEASABLES :
+	@echo $(SISFILE)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/buildupgradesis.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for upgrade sis building extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	app-services
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/buildupgradesis.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Build Upgrade SIS file
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/private/$(UID_DIR)
+ifeq ($(PLATFORM),WINS) 
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/$(UID_DIR)
+else
+ifeq ($(PLATFORM),WINSCW)
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/$(UID_DIR)
+endif
+endif
+
+$(TARGETDIR) :
+	@$(call createdir,"$(TARGETDIR)") 
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+	$(EPOCROOT)epoc32/tools/makesis -d$(EXTENSION_ROOT)/$(SRCDIR) $? $@
+
+
+do_nothing :
+# do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+	-$(ERASE) $(SISFILE)
+
+RELEASABLES :
+	@echo $(SISFILE)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/tzlocaltestserver.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stub .sis building extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	app-services
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/tzlocaltestserver.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,62 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# TzLocalTestServer - makefile for TimeZoneLocalization test data
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+MBSDIR = $(EPOCROOT)epoc32/tools/shell
+include $(MBSDIR)/$(notdir $(basename $(SHELL))).mk
+
+
+# Erase resources command
+erase_res  = $(ERASE) $(EPOCROOT)epoc32$/release$/$(PLATFORM)$/$(CFG)$/z$/resource$/timezonelocalization
+erase_data = $(ERASE) $(EPOCROOT)epoc32$/data$/z$/resource$/timezonelocalization
+do_nothing : 
+
+RESOURCE :
+	-$(erase_res)$/$(TZ_RSC)
+	-$(erase_data)$/$(TZ_RSC)
+	-$(erase_res)$/$(TZ_R01)
+	-$(erase_data)$/$(TZ_R01)
+	-$(erase_res)$/$(TZ_R02)
+	-$(erase_data)$/$(TZ_R02)
+	-$(erase_res)$/$(TZ_GRP_RSC)
+	-$(erase_data)$/$(TZ_GRP_RSC)
+	-$(erase_res)$/$(TZ_GRP_R01)
+	-$(erase_data)$/$(TZ_GRP_R01)
+	-$(erase_res)$/$(TZ_GRP_R02)
+	-$(erase_data)$/$(TZ_GTP_R02)
+
+BLD : do_nothing
+
+MAKMAKE :  do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+CLEAN : do_nothing
+
+FINAL : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASEABLES : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/wlddatabasekit_sec.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the word database kit extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	app-services
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/app-services/wlddatabasekit_sec.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,76 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Builds the World Database
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/resource/worldserver
+
+ifeq ($(PLATFORM), WINS)
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/worldserver
+else
+ifeq ($(PLATFORM), WINSCW)
+        TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/worldserver
+endif
+endif
+
+$(TARGETDIR) :
+	@$(call createdir,"$(TARGETDIR)")
+
+WLDCOMP=$(EPOCROOT)epoc32/release/winc/udeb/wldcomp.exe
+DATABASE=$(TARGETDIR)/$(TARGET)
+
+# We don't build multiple languages - that's a problem
+# for someone else...
+
+$(DATABASE) :  $(EXTENSION_ROOT)/$(SOURCES) $(WLDCOMP)
+	$(WLDCOMP) $(EXTENSION_ROOT)/$(SOURCES) $(DATABASE) -locale-01
+
+do_nothing :
+# do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : do_nothing
+
+BLD : $(TARGETDIR) $(DATABASE)
+
+SAVESPACE : BLD
+
+CLEAN :
+	-$(ERASE) $(DATABASE)
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+RELEASABLES : 
+	@echo $(DATABASE)
+
+ROMFILE : do_nothing
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/application-protocols/buildstubsis.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stub .sis building extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	application-protocols
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/application-protocols/buildstubsis.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# buildstubsis.mk - Build Stub SIS file
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Select appropriate directory and ensure it exists
+
+TARGETDIR=$(EPOCROOT)epoc32/data/z/system/install
+
+ifeq ($(PLATFORM),WINS) 
+	TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+else
+ifeq ($(PLATFORM),WINSCW)
+	TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/install
+endif
+endif
+
+$(TARGETDIR) :
+	$(call createdir,"$(TARGETDIR)") 
+
+# Build stub SIS file
+
+SISFILE= $(TARGETDIR)/$(SISNAME).sis
+
+$(SISFILE) : $(EXTENSION_ROOT)/$(SRCDIR)/$(SISNAME).pkg
+	$(EPOCROOT)epoc32/tools/makesis -s $? $@
+
+do_nothing :
+	echo do_nothing
+
+# The targets invoked by abld
+
+MAKMAKE : do_nothing
+
+RESOURCE : $(TARGETDIR) $(SISFILE)
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN :
+	-$(ERASE) $(SISFILE)
+
+RELEASABLES :
+	@echo $(SISFILE)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/base_rvct_common.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,69 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Some functions that are commonly used by base FLM
+
+define base__compile
+$(1) : $(2) : $(3)
+	$(call startrule,base__compile) \
+	$(CC) $(ARMCCFLAGS) $$< -o $$@ \
+	$(call endrule,base__compile)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__h2inc
+$(1) : $(2)
+	$(call startrule,base__h2inc) \
+ 	$(PERL) $(EPOCROOT)/epoc32/tools/h2inc.pl $$< $$@ ARMASM \
+	$(call endrule,base__h2inc)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__asm
+$(1) : $(2) : $(3)
+	$(call startrule,base__asm) \
+	$(ASM) $(AFLAGS) -o $$@ --LIST $(join $(basename $(1)),.lst) $$< \
+	$(call endrule,base__asm)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1) $(join $(basename $(1)),.lst)
+endef
+
+define base__link
+$(1) : $(2)
+	$(call startrule,base__link) \
+	$(LD) $(LFLAGS) -o $$@ $(FULLOBJECTS) \
+	$(call endrule,base__link)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__strip
+$(1) : $(2)
+	$(call startrule,base__strip) \
+	$(FROMELF) --bin --output $$@ $$< \
+	$(call endrule,base__strip)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
+define base__omapsig
+$(1) : $(2)
+	$(call startrule,base__omapsig) \
+	$(PERL) $(EPOCROOT)/epoc32/tools/omapsig.pl $(LINKBASE) $$< $$@ \
+	$(call endrule,base__omapsig)
+
+CLEANTARGETS := $(CLEANTARGETS) $(1)
+endef
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/bootstrap.flm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,195 @@
+# Copyright (c) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
+# All rights reserved.
+# This component and the accompanying materials are made available
+# under the terms of "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+ifeq ($($(NAME)_$(PLATFORM_PATH)_bootstrap_flm),)
+$(NAME)_$(PLATFORM_PATH)_bootstrap_flm := 1 
+
+E32PATH := $(EXTENSION_ROOT)/$(E32PATH)
+SOURCES := $(foreach S,$(SOURCES),$(addprefix $(EXTENSION_ROOT)/,$(S)))
+INCLUDES2:=$(addprefix $(EXTENSION_ROOT)/,$(INCLUDES))
+EXTRA_INC_PATH := $(foreach S,$(EXTRA_INC_PATH),$(addprefix $(EXTENSION_ROOT)/,$(S)))
+GENINCLUDES_HEADERS := $(foreach H,$(GENINCLUDES_HEADERS),$(addprefix $(EXTENSION_ROOT)/,$(H)))
+
+ifndef LINKBASE
+LINKBASE := 0x00000000
+endif
+
+UNIQ:=$(E32PATH)$(PLATFORM_PATH)$(NAME)$(MEMMODEL)$(SOURCES)$(ASM_MACROS)
+UNIQ:=$(word 1,$(shell echo $(UNIQ) | $(GNUMD5SUM)))
+
+# Make the output build directory name unique, starting with NAME of the binary being built
+EPOCBLDABS := $(EPOCBLD)/$(NAME)_$(UNIQ)
+
+EPOCINC := $(EPOCROOT)/epoc32/include
+EPOCKERNINC := $(EPOCINC)/kernel
+EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
+EPOCTRG := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+TRG := $(EPOCTRG)/$(NAME).bin
+TEMPTRG := $(EPOCBLDABS)/$(NAME).bin
+ASMINCPATH := 
+ASM_MACROS :=
+CLEANTARGETS :=
+
+CLEANTARGETS := $(CLEANTARGETS) $(TRG) $(TEMPTRG) $(join $(basename $(TRG)),.sym)
+
+ifneq ($(EXTRA_INC_PATH),)
+ASMINCPATH := $(EXTRA_INC_PATH)
+endif
+
+ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC) $(EXTRA_EPOC32_INC_PATH) $(E32PATH)/eka/include/kernel/$(CPU)
+
+ifeq ($(MEMMODEL),)
+$(error MEMMODEL parameter not specified)
+endif
+
+# Convert MEMMODEL parameter to lower case
+MEMMODEL := $(shell echo $(MEMMODEL) | tr A-Z a-z)
+
+ifeq ($(MEMMODEL),direct)
+CFG_MM := CFG_MMDirect
+HEADERS_MM :=
+endif
+ifeq ($(MEMMODEL),flexible)
+CFG_MM := CFG_MMFlexible
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/flexible/$(CPU)/mmboot.h
+endif
+ifeq ($(MEMMODEL),moving)
+CFG_MM := CFG_MMMoving
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/moving/$(CPU)/mmboot.h
+endif
+ifeq ($(MEMMODEL),multiple)
+CFG_MM := CFG_MMMultiple
+HEADERS_MM := $(E32PATH)/eka/include/memmodel/epoc/multiple/$(CPU)/mmboot.h
+endif
+ifndef CFG_MM
+$(error '$(MEMMODEL)' memory model unknown)
+endif
+
+ASM_MACROS := $(ASM_MACROS) $(CFG_MM)
+ifneq ($(SMP),)
+ASM_MACROS := $(ASM_MACROS) SMP
+endif
+
+ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+ASM_MACROS := $(ASM_MACROS) USE_CXSF
+      
+INCEXT := inc
+ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--predefine "$(macro) SETL {TRUE}")
+AFLAGS := -g --keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+LFLAGS := --ro-base $(LINKBASE) --entry $(LINKBASE) --map
+SYMOPT := --symdefs
+
+define bootstrap_asm
+$(1) : $(2) : $(3)
+	$(call startrule,bootstrap_rvct_asm) \
+	$(ASM) $(AFLAGS) -o $$@ --LIST $$(join $$(basename $$@),.lst) $$< \
+	$(call endrule,bootstrap_rvct_asm)
+endef
+
+define bootstrap_link
+$(EPOCBLDABS)/$(NAME).in : $(LINKOBJECTS) $(LINKFILE) | $(EPOCBLDABS)
+	$(call startrule,bootstrap_rvct_link) \
+	$(LD) $(LFLAGS) $(SYMOPT) $$(join $$(basename $$@),.sym) -o $$@ $$(filter %.o,$$^); \
+	$(GNUCP) $$@ $$(join $$(basename $(TRG)),.sym) \
+	$(call endrule,bootstrap_rvct_link)	
+endef
+
+define bootstrap_strip
+$(TRG) : $(EPOCBLDABS)/$(NAME).in
+	$(call startrule,bootstrap_strip) \
+	$(FROMELF) --bin --output $$@ $$< \
+	$(call endrule,bootstrap_rvct_strip)
+endef
+
+define bootstrap_h2inc
+# How to translate the .h files to .inc
+$(1) : $(2)
+	$(call startrule,bootstrap_h2inc) \
+	$(PERL) $(EPOCROOT)/epoc32/tools/h2inc.pl $$< $$@ ARMASM \
+	$(call endrule, bootsrap_h2inc)
+endef
+
+# Joins two lists with a 1:1 mapping, separated by a ->
+# $(call bootstrap_joinlists,a b c,d e f) returns a->d b->e c->f
+define bootstrap_joinlists
+$(join $(1),$(addprefix ->,$(2)))
+endef
+
+# Path for generic source files
+BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
+
+# Generic source files
+BASESOURCES := $(foreach S,$(BASESOURCES_NAMES),$(addprefix $(BASESRCPATH)/,$(S)))
+
+HEADERS:= $(E32PATH)/eka/include/kernel/kernboot.h $(E32PATH)/eka/include/kernel/arm/bootdefs.h $(E32PATH)/eka/include/e32rom.h $(GENINCLUDES_HEADERS) $(HEADERS_MM)
+
+# Generated include files
+BOOTSTRAP_GENINCLUDES := $(foreach f,$(HEADERS),$(basename $(notdir $(f))).$(INCEXT))
+
+# Non-generated generic include files
+ifeq ($(BASEINCLUDES),)
+BASEINCLUDES := $(E32PATH)/eka/include/kernel/$(CPU)/bootcpu.inc $(E32PATH)/eka/include/kernel/$(CPU)/bootmacro.inc
+endif
+INCLUDES2 := $(foreach f,$(INCLUDES2),$(basename $(f)).$(INCEXT))
+
+# Generic object files
+FULLBASEOBJECTS := $(foreach src, $(BASESOURCES_NAMES), $(addprefix $(EPOCBLDABS)/,$(basename $(src)).o))
+
+# Platform specific object files
+FULLOBJECTS := $(foreach src, $(SOURCES), $(addprefix $(EPOCBLDABS)/,$(basename $(notdir $(src))).o))
+
+LINKOBJECTS := $(FULLBASEOBJECTS) $(FULLOBJECTS)
+
+# Generated include files with paths
+FULLGENINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BOOTSTRAP_GENINCLUDES))
+
+CLEANTARGETS := $(CLEANTARGETS) $(FULLBASEOBJECTS) $(FULLOBJECTS) $(LINKOBJECTS) $(FULLGENINCLUDES) 
+
+CLEANTARGETS := $(CLEANTARGETS) $(EPOCBLDABS)/$(NAME).in $(join $(basename $(EPOCBLDABS)/$(NAME).in),.sym)
+
+JOINED_INC := $(call bootstrap_joinlists,$(FULLGENINCLUDES),$(HEADERS))
+$(foreach J,$(JOINED_INC),$(eval $(call bootstrap_h2inc,$(word 1,$(subst ->, ,$(J))),$(word 2,$(subst ->, ,$(J))) | $(EPOCBLDABS))))
+
+# How to strip linked object to binary
+$(eval $(call bootstrap_strip,$(TRG),$(EPOCBLDABS)/$(NAME).in))
+
+LISTFILE := $(foreach f,$(FULLBASEOBJECTS),$(join $(basename $(f)),.lst)) $(foreach f,$(FULLOBJECTS),$(join $(basename $(f)),.lst))
+CLEANTARGETS := $(CLEANTARGETS) $(LISTFILE)
+
+JOINED_BASEOBJECTS := $(call bootstrap_joinlists,$(FULLBASEOBJECTS),$(BASESOURCES))
+
+$(foreach J,$(JOINED_BASEOBJECTS),$(eval $(call bootstrap_asm,$(word 1,$(subst ->, ,$(J))),$(EPOCBLDABS)/%.o,$(word 2,$(subst ->, ,$(J))) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES2) | $(EPOCBLDABS))))
+
+JOINED_OBJECTS := $(call bootstrap_joinlists,$(FULLOBJECTS),$(SOURCES))
+
+$(foreach J,$(JOINED_OBJECTS),$(eval $(call bootstrap_asm,$(word 1,$(subst ->, ,$(J))),$(EPOCBLDABS)/%.o,$(word 2,$(subst ->, ,$(J))) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES2) |$(EPOCBLDABS))))
+
+# How to link the object files
+$(eval $(bootstrap_link))
+
+# Hook into global targets
+TARGET :: $(TRG)
+
+#############################################
+
+# --what to show releasables
+$(eval $(call whatmacro,$(TRG),USERFLM))
+# create directory
+CREATABLEPATHS := $(EPOCBLDABS) $(EPOCTRG)
+$(call makepath,$(CREATABLEPATHS))
+# clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/bootstrap.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the boot strap extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/bootstrap.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,391 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+ifndef CPU
+CPU := arm
+endif
+
+ifndef LINKBASE
+LINKBASE := 0x00000000
+endif
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+PROCEED:=build
+ifneq "$(PBUILDPID)" ""
+        ifneq "$(CFG)" "UREL"
+                PROCEED:=skip
+        endif
+endif
+
+COPY := $(call ecopy)
+
+ifeq "$(CPU)" "x86"
+        ifeq "$(MEMMODEL)" "direct"
+                BLDSGL:=s
+        else
+                ifeq "$(MEMMODEL)" "flexible"
+                        BLDSGL:=f
+                else
+                        BLDSGL:=
+                endif
+        endif
+        ifdef SMP
+                BLDSMP:=smp
+        else
+                BLDSMP:=
+        endif
+        EPOCROOT:=$(subst /,\,$(EPOCROOT))
+        EPOCBLDABS := $(EPOCROOT)epoc32\build\tasm$(PBUILDPID)\$(BLDSGL)$(VNAME)$(BLDSMP)
+else
+        DRIVELETTER := $(shell cd 2>NUL)
+        DRIVELETTER_2 := $(word 1,$(subst \, ,$(DRIVELETTER)))
+        EPOCBLDABS_1 := $(subst $(TO_ROOT),,$(EPOCBLD))
+        EPOCBLDABS_2 := $(subst $(DRIVELETTER_2),,$(EPOCBLDABS_1))
+        
+        EPOCBLDABS := $(call epocbldabs,$(DRIVELETTER_2),$(EPOCBLDABS_2))/$(NAME)
+endif
+
+EPOCINC := $(INC_PATH)
+EPOCKERNINC := $(EPOCINC)/kernel
+EPOCCPUINC := $(EPOCKERNINC)/$(CPU)
+EPOCMMINC := $(INC_PATH)/memmodel/epoc/$(MEMMODEL)/$(CPU)
+EPOCTRG := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TRG := $(EPOCTRG)/$(NAME).bin
+TEMPTRG := $(EPOCBLDABS)/$(NAME).bin
+
+ifdef EXTRA_INC_PATH
+ASMINCPATH := $(EXTRA_INC_PATH)
+endif
+
+ifeq "$(CPU)" "arm"
+ASMINCPATH := . $(EPOCBLDABS) $(ASMINCPATH) $(EXTENSION_ROOT) $(EPOCCPUINC)
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT_6 := $(word 6,$(ARMASM_OUT))
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+endif
+ifeq "$(ARMASM_OUT_6)" "2.37"
+        TOOLVER := 211
+endif
+endif
+
+ifeq "$(MEMMODEL)" "direct"
+CFG_MM := CFG_MMDirect
+endif
+ifeq "$(MEMMODEL)" "moving"
+CFG_MM := CFG_MMMoving
+endif
+ifeq "$(MEMMODEL)" "multiple"
+CFG_MM := CFG_MMMultiple
+endif
+ifeq "$(MEMMODEL)" "flexible"
+CFG_MM := CFG_MMFlexible
+endif
+ifndef CFG_MM
+$(error Memory model unknown)
+endif
+
+ASM_MACROS += $(CFG_MM)
+ifdef SMP
+        ASM_MACROS += SMP
+endif
+
+ifeq "$(CPU)" "x86"
+        ifndef BASEINCLUDES
+                BASEINCLUDES := bootcpu.inc bootmacr.inc
+        endif
+        ifndef BASESOURCES
+                BASESOURCES := bootmain.asm bootcpu.asm bootutil.asm
+        endif
+        GENINCLUDES := $(GENINCLUDES) x86boot.h
+        ASMINCPATH := . 
+        ASM := tasm
+        LINK := tlink
+        EXE2BIN := exe2bin
+        SRCEXT := asm
+        INCEXT := inc
+        OBJEXT := obj
+        EXEEXT := exe
+        
+        ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join /i,$(call slash2generic,$(dir))))   
+        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),/d$(macro)=1)
+        AFLAGS := /l /m3 /ML /W-PDC $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+        LFLAGS := /m /s /n /3 /c
+        ASMTYP := TASM
+        LINKFILE :=
+        define do_asm
+                cd $(EPOCBLDABS) && $(CP) $(call slash2generic,$<) .
+                cd $(EPOCBLDABS) && $(ASM) $(AFLAGS) $(notdir $<)
+        endef
+        define do_link
+                cd $(EPOCBLDABS) && $(LINK) $(LFLAGS) $(filter %.$(OBJEXT),$(foreach obj,$^,$(notdir $(obj)))), temp.exe
+                cd $(EPOCBLDABS) && $(COPY) temp.exe $@
+                cd $(EPOCBLDABS) && $(ERASE) temp.exe
+        endef
+        define do_strip
+                cd $(EPOCBLDABS) && $(COPY) $< temp.exe
+                cd $(EPOCBLDABS) && $(EXE2BIN) temp.exe temp.bin
+                cd $(EPOCBLDABS) && $(COPY) temp.bin $@
+                cd $(EPOCBLDABS) && $(ERASE) temp.exe temp.bin
+        endef
+endif
+ifeq "$(CPU)" "arm"
+        ifeq "$(TOOLVER)" "211"
+                ASM := armasm
+                LINK := armlink
+                SRCEXT := s
+                INCEXT := inc
+                OBJEXT := o
+                EXEEXT := in
+                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),-predefine "$(macro) SETL {TRUE}")
+                AFLAGS := $(ASM_ARM211_VARIANTFLAGS) -apcs 3/32bit/nosw -Length 0 -Width 200 $(ASM_MACRO_CMD) $(ASMINCPATHCMD)
+                LFLAGS := -Base $(LINKBASE) -Data 0xf0000000 -Entry $(LINKBASE) -Bin -map
+                SYMOPT := -symbols
+                ASMTYP := ARMASM
+                LINKFILE :=
+                define do_asm
+                        $(ASM) $(AFLAGS) -o $@ -LIST $(join $(basename $@),.lst) $<
+                endef
+                define do_link
+                        $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
+                endef
+                define do_strip
+                        @if exist $@ $(ERASE) $(call slash2generic,$@) 
+                        $(COPY) $< $@
+                endef
+        endif
+        ifeq "$(TOOLVER)" "RVCT"
+                ASM_MACROS += USE_CXSF
+                ASM := armasm
+                LINK := armlink
+                FROMELF := fromelf
+                SRCEXT := s
+                INCEXT := inc
+                OBJEXT := o
+                EXEEXT := in
+                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+                AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(ASM_RVCT_VARIANTFLAGS)
+                LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
+                SYMOPT := $(OP)symdefs
+                ASMTYP := ARMASM
+                LINKFILE :=
+                define do_asm
+                        $(ASM) $(AFLAGS) -o $@ $(OP)LIST $(join $(basename $@),.lst) $<
+                endef
+                define do_link
+                        $(LINK) $(LFLAGS) $(SYMOPT) $(join $(basename $@),.sym) -o $@ $(filter %.$(OBJEXT),$^)
+                        $(COPY) $@ $(join $(basename $(TRG)),.sym)
+                endef
+                define do_strip
+                        $(FROMELF) $(OP)bin $(OP)output $@ $<
+                endef
+        endif
+        ifeq "$(TOOLVER)" "GCC"
+                ASM_MACROS += USE_CXSF GNU_ASM
+                ASM := as
+                LINK := ld
+                STRIP := strip
+                SRCEXT := s
+                INCEXT := ginc
+                OBJEXT := o
+                EXEEXT := in
+                ASMINCPATHCMD := $(foreach dir,$(ASMINCPATH),$(join -I ,$(dir)))
+                ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),--defsym $(macro)=1 )
+                AFLAGS := -mapcs-32 -R -n $(ASM_MACRO_CMD) -I- $(ASMINCPATHCMD)
+                LFLAGS := -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
+                SYMOPT := -symdefs
+                ASMTYP := AS
+                PROCESS_INCLUDES := 1
+                ifndef LINKFILE
+                        LINKFILE := bootstrap.lnk
+                endif
+                define do_asm
+                        perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.ss)
+                        $(ASM) $(AFLAGS) -acdhlms=$(join $(basename $@),.lst) -o $@ $(join $(basename $@),.ss)
+                endef
+                define do_link
+                        if exist $(join $(basename $@),.lnk) $(ERASE) $(call slash2generic,$(join $(basename $@),.lnk)) 
+                        $(COPY) $(subst /,\,$(filter %.lnk,$^)) $(join $(basename $@),.lnk)
+                        $(LINK) -M -o $@ $(filter %.$(OBJEXT),$^) $(LFLAGS) --script=$(join $(basename $@),.lnk) >$(join $(basename $@),.map)
+                endef
+                define do_strip
+                        $(STRIP) -O binary -o $(TEMPTRG) $<
+                        $(COPY) $(TEMPTRG) $@
+                        $(ERASE) $(call slash2generic,$(TEMPTRG)) 
+                endef
+        endif
+endif
+
+
+
+# Generic source files
+ifndef BASESOURCES
+BASESOURCES := bootmain.s bootcpu.s bootutils.s
+endif
+
+# Path for generic source files
+ifndef BASESRCPATH
+BASESRCPATH := $(E32PATH)/eka/kernel/$(CPU)
+endif
+
+
+# Generated include files
+GENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+GENINCLUDES := $(GENINCLUDES) e32rom.$(INCEXT) kernboot.$(INCEXT)
+GENINCLUDES := $(GENINCLUDES) bootdefs.$(INCEXT)
+ifneq "$(MEMMODEL)" "direct"
+GENINCLUDES := $(GENINCLUDES) mmboot.$(INCEXT)
+endif
+
+# Headers from which GENINCLUDES are generated
+GENHEADERS = $(foreach inc,$(GENINCLUDES),$(basename $(inc)).h)
+
+# Non-generated generic include files
+ifndef BASEINCLUDES
+BASEINCLUDES := bootcpu.inc bootmacro.inc
+endif
+BASEINCLUDES := $(foreach f,$(BASEINCLUDES),$(basename $(f)).$(INCEXT))
+INCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+
+# Generic object files
+BASEOBJECTS = $(foreach src, $(BASESOURCES), $(basename $(src)).$(OBJEXT))
+
+# Platform specific object files
+OBJECTS = $(foreach src, $(SOURCES), $(basename $(src)).$(OBJEXT))
+
+# Object files with paths
+FULLBASEOBJECTS = $(addprefix $(EPOCBLDABS)/,$(BASEOBJECTS))
+FULLOBJECTS = $(addprefix $(EPOCBLDABS)/,$(OBJECTS))
+LINKOBJECTS = $(FULLBASEOBJECTS) $(FULLOBJECTS)
+
+# Generated include files with paths
+FULLGENINCLUDES = $(addprefix $(EPOCBLDABS)/,$(GENINCLUDES))
+
+# Tell make where to look for things
+vpath %.h . $(EXTRA_INC_PATH) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC)
+vpath %.inc . $(EXTRA_INC_PATH) $(EXTENSION_ROOT) $(EPOCINC) $(EPOCKERNINC) $(EPOCCPUINC) $(EPOCMMINC) $(EPOCBLDABS)
+vpath %.ginc $(EPOCBLDABS)
+vpath %.$(SRCEXT) . $(EXTRA_SRC_PATH) $(EXTENSION_ROOT) $(BASESRCPATH)
+vpath %.$(OBJEXT) $(EPOCBLDABS)
+vpath %.lnk . $(EXTENSION_ROOT) $(EPOCCPUINC)
+
+# How to link the object files 
+$(EPOCBLDABS)/$(NAME).$(EXEEXT): $(LINKOBJECTS) $(LINKFILE) $(call pipe,$(EPOCBLDABS)) 
+	$(do_link)
+
+# How to strip linked object to binary
+$(TRG): $(EPOCBLDABS)/$(NAME).$(EXEEXT)
+	$(do_strip)
+
+# How to assemble the source files
+ifdef PROCESS_INCLUDES
+FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
+FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
+
+$(FULLBASEINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
+	perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+
+$(FULLINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.inc $(call pipe,$(EPOCBLDABS))
+	perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+
+$(FULLBASEOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
+	$(do_asm)
+
+$(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLINCLUDES) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(call pipe,$(EPOCBLDABS))
+	$(do_asm)
+
+else
+
+ifeq "$(CPU)" "x86"
+FULLBASEINCLUDES := $(addprefix $(EPOCBLDABS)/,$(BASEINCLUDES))
+FULLINCLUDES := $(addprefix $(EPOCBLDABS)/,$(INCLUDES))
+
+$(FULLBASEINCLUDES) $(FULLINCLUDES) : $(EPOCBLDABS)/%.inc : %.inc
+	$(CP) $(call slash2generic,$<) $(call slash2generic,$@) 
+
+$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(FULLBASEINCLUDES) $(FULLGENINCLUDES) $(FULLINCLUDES)
+	$(do_asm)
+
+else
+$(FULLBASEOBJECTS) $(FULLOBJECTS) : $(EPOCBLDABS)/%.$(OBJEXT) : %.$(SRCEXT) $(BASEINCLUDES) $(FULLGENINCLUDES) $(INCLUDES) $(call pipe,$(EPOCBLDABS))
+	$(do_asm)
+
+endif
+endif
+
+# How to translate the .h files to .inc
+$(FULLGENINCLUDES) : $(EPOCBLDABS)/%.$(INCEXT) : %.h $(call pipe,$(EPOCBLDABS))
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ $(ASMTYP)
+
+
+# How to make the working directories
+$(EPOCBLDABS) $(EPOCTRG) :
+	$(call ifnotexistd,$(call slash2generic,$@))
+
+# Makmake targets
+.PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
+.PHONY : build skip
+
+MAKMAKE :
+	echo Nothing to do
+	echo $(BASESRCPATH)
+
+FREEZE :
+	echo Nothing to do
+	echo $(BASESRCPATH)
+
+LIB :
+	echo Nothing to do
+	echo $(BASESRCPATH)
+
+CLEANLIB :
+	echo Nothing to do
+	echo $(BASESRCPATH)
+
+RESOURCE :
+	echo Nothing to do
+	echo $(BASESRCPATH)
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(PROCEED)
+
+RELEASABLES :
+	@echo $(TRG)
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(TRG)) 
+	-$(ERASE) $(call slash2generic,$(EPOCBLDABS)/*.*) 
+
+build: $(EPOCTRG) $(EPOCBLDABS) $(TRG)
+	echo Bootstrap built for $(PLATFORM) $(CFG)
+
+skip:
+	echo Bootstrap build skipped for $(PLATFORM) $(CFG)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/bootstrap.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+<?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 build/2_0.xsd">
+
+<!-- Extension interfaces : replacements for Template Extension Makefiles 
+-->
+
+<interface name="base.bootstrap" extends="Symbian.KernelFLM" flm="bootstrap.flm">
+		<param name="E32PATH" />
+		<param name="NAME" />
+		<param name="MEMMODEL" />
+		<param name="EXTRA_INC_PATH" default=''/>
+		<param name="EXTRA_EPOC32_INC_PATH" default=''/>
+		<param name="SOURCES" />
+		<param name="INCLUDES" />
+		<param name="ASM_MACROS" default='' />
+		<param name="GENINCLUDES_HEADERS" default=''/>
+		<param name="CPU" default='arm'/>
+		<param name="SMP" default=''/>
+		<param name="LINKBASE" default='0x00000000'/>
+		<param name="BASESOURCES_NAMES" default="bootmain.s bootcpu.s bootutils.s"/>
+		<param name="INC_PATH" default=''/>
+	</interface>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/config.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the config extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/config.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,65 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not. 
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifndef HALPATH
+HALPATH := ..
+endif
+
+ifndef SOURCE
+SOURCE := hal
+endif
+
+#MDIR := $(call generated,generatedcpp/hal) # abld
+#MDIR := $(call generated,base/lubbock) # raptor
+MDIR := $(call generatedcpp)
+
+MAKMAKE : $(MDIR)/$(PREFIX)values.cpp $(MDIR)/$(PREFIX)config.cpp
+
+FREEZE :
+
+LIB :
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(MDIR)/$(PREFIX)values.cpp $(MDIR)/$(PREFIX)config.cpp
+
+RELEASABLES :
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(MDIR)/$(PREFIX)values.cpp) 
+	-$(ERASE) $(call slash2generic,$(MDIR)/$(PREFIX)config.cpp) 
+#	-$(ERASE) $(MDIR)/$(PREFIX)values.cpp
+#	-$(ERASE) $(MDIR)/$(PREFIX)config.cpp
+
+$(MDIR)/$(PREFIX)values.cpp : $(SOURCE)/values.hda $(EPOCROOT)epoc32/include/platform/hal_data.h
+	-$(call createdir,"$(MDIR)")
+	perl $(HALPATH)/hal/halcfg.pl $(EPOCROOT)epoc32/include/platform/hal_data.h $(SOURCE)/values.hda $(MDIR)/$(PREFIX)values.cpp
+
+$(MDIR)/$(PREFIX)config.cpp : $(SOURCE)/config.hcf $(EPOCROOT)epoc32/include/platform/hal_data.h
+	-$(call createdir,"$(MDIR)")
+	perl $(HALPATH)/hal/halcfg.pl -x $(EPOCROOT)epoc32/include/platform/hal_data.h $(SOURCE)/config.hcf $(MDIR)/$(PREFIX)config.cpp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/copy_default.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the copy_default extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/copy_default.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,48 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+SOURCE_COPY=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/$(SOURCES)
+TARGET_COPY=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/$(TARGET)
+
+$(TARGET_COPY) : $(SOURCE_COPY)
+	$(call cpfeature,"$(SOURCE_COPY)","$(TARGET_COPY)")
+#	perl $(EPOCROOT)epoc32/tools/copyfeaturevariants.pl "$(SOURCE_COPY)" "$(TARGET_COPY)"
+#	$(CP) "$?" "$@"
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE BLD SAVESPACE FREEZE LIB CLEANLIB RESOURCE :
+	@echo Nothing to do for "$@"
+
+CLEAN : 
+	-$(ERASE) $(TARGET_COPY)
+
+RELEASABLES : 
+	@echo $(TARGET_COPY)
+
+# we have to wait until the SOURCE_COPY is built before we can copy it...
+#
+FINAL : $(TARGET_COPY)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/genexec.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the genexec extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/genexec.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,71 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)
+XINCKDIR := $(INC_PATH)/kernel
+
+PROCEED:=all
+ifneq "$(PBUILDPID)" ""
+	ifneq "$(PLATFORM)" "$(__firstplat)"
+		PROCEED:=skip
+	endif
+endif
+
+.PHONY : MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL BLD SAVESPACE RELEASABLES CLEAN
+.PHONY : all skip
+
+MAKMAKE : $(PROCEED)
+
+FREEZE :
+
+LIB : $(PROCEED)
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(PROCEED)
+
+RELEASABLES :
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/exec_enum.h) 
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/exec_user.h) 
+	-$(ERASE) $(call slash2generic,$(XINCKDIR)/exec_kernel.h) 
+
+all: $(XINCDIR)/exec_enum.h $(XINCDIR)/exec_user.h $(XINCKDIR)/exec_kernel.h
+
+$(XINCDIR)/exec_enum.h : $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+	perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+$(XINCDIR)/exec_user.h : $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+	perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+$(XINCKDIR)/exec_kernel.h :  $(EXTRA_SRC_PATH)/execs.txt $(EXTRA_SRC_PATH)/genexec.pl
+	perl $(EXTRA_SRC_PATH)/genexec.pl -i $(EXTRA_SRC_PATH)/execs.txt -e $(XINCDIR)/exec_enum.h -u $(XINCDIR)/exec_user.h -k $(XINCKDIR)/exec_kernel.h
+
+
+skip:
+	echo GENEXEC skipped for $(PLATFORM) $(CFG)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h2_genbootinc.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h2_genbootinc extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h2_genbootinc.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,64 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Generate assembler inc files from header files
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/h2
+XINCDIR2 := $(INC_PATH)/assp/omap1610
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+	@echo $(XINCDIR)/h2const.inc
+	@echo $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/omapconst.inc
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/h2const.inc) 
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc) 
+#	-$(ERASE) $(XINCDIR)/h2const.inc
+#	-$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/omapconst.inc
+
+all: $(XINCDIR)/h2const.inc $(XINCDIR)/nand_fbr_offset.inc $(XINCDIR2)/omapconst.inc
+
+$(XINCDIR)/h2const.inc : $(XINCDIR)/h2const.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/h2const.h $(XINCDIR)/h2const.inc ARMASM
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/omapconst.inc : $(XINCDIR2)/omapconst.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/omapconst.h $(XINCDIR2)/omapconst.inc ARMASM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h2_restricted_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h2_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h2_restricted_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,384 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Code execute address set in the linker file
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+  
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        USE_MMU := TRUE
+else
+        DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+        USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+        WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph2bsp/h2/nandboot/coreldr
+PLATSRCDIR := $(EXTENSION_ROOT)/../omaph2bsp/shared/bootstrap
+
+VARIANTINC := $(EXTENSION_ROOT)/../omaph2bsp/h2/inc
+ARMDIR := $(INC_PATH)/kernel/arm
+
+GENINC1 := $(INC_PATH) /epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+H2BLDDIR := $(EXTENSION_ROOT)/../omaph2bsp/h2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(H2BLDDIR) $(PLATSRCDIR)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h2/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/omap/h2/specific/unistore2/nandboot/coreldr/$(PLATFORM_PATH)/$(CFG_PATH)
+BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/h2_un2_coreldr.bin
+TMPTARGET = $(BUILDLOC)/coreldr.tmp
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR) $(GENSRCDIR)
+vpath %.inc . $(SPECSRCDIR)  $(VARIANTINC) $(EPOCINCDIR) $(BLDDIR) $(ARMDIR) $(PLATSRCDIR) $(GENSRCDIR) $(H2BLDDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES := nand_macro.inc
+
+VHEADERS := nanddevice.h 
+BUILTINCLUDES := nanddevice.inc
+BUILTINCLUDES2 := nand_plat.inc
+BLDINCLUDES := config.inc
+PLATINCLUDES := 16xx_common.inc general.inc
+GENINCLUDES := armcpudefs.inc
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp 
+XSRCPPSOURCE := coreldrxsr.cpp
+ifeq "$(USE_MMU)" "TRUE"
+        GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which binary is loaded and started from
+LINKBASE = 0x20000C00
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC 
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+        ASM_TRUE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+        ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+        ASM_FALSE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+        ASM_FALSE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+        ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_TRUE_MACROS += USE_CXSF
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        CPP := armcc
+
+        OBJEXT := o
+        INCEXT := inc
+
+        ARMCCFLAGS := --arm -c -Otime --cpp
+        ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+        ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+
+        ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+        ifeq "$(CFG)" "UDEB"
+        ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+        endif
+        
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+        ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+        AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map        
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+
+        define do_compile
+                $(CPP) $(ARMCCFLAGS) $< -o $@
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+        endef
+        define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+        endef
+        define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+        endef
+        define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+        endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+        ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+        LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+        GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+        GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+        ifeq "$(CFG)" "UDEB"
+        GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+        else
+        GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+        endif
+
+        LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+        OBJEXT := o
+        INCEXT := ginc
+
+        PROCESS_INCLUDES := 1
+        define do_compile
+                $(GCC) -o $@ $<
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+        endef 
+        define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@ 
+        endef
+        define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+                $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+        endef
+        define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+        
+		$(ERASE) $(call slash2generic,"$(TMPTARGET)") 
+        #	$(ERASE) "$(TMPTARGET)"
+		echo Built $(TARGET)
+        endef
+        define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+        endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2) 
+	$(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link 
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_genbootinc.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h4_genbootinc extension template
+#
+
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_genbootinc.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,58 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Generate assembler inc files from header files
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/omap_hrp/h4
+XINCDIR2 := $(INC_PATH)/omap_hrp/assp/omap24xx
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+	@echo $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/omap24xxconst.inc
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc) 
+#	-$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/omap24xxconst.inc
+
+all: $(XINCDIR2)/omap24xxconst.inc $(XINCDIR)/nand_fbr_offset.inc 
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/omap24xxconst.inc : $(XINCDIR2)/omap24xxconst.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/omap24xxconst.h $(XINCDIR2)/omap24xxconst.inc ARMASM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,388 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+  
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        USE_MMU := TRUE
+else
+        DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+        USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+        WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph4bsp/h4/nandboot/coreldr_smallblk
+
+VARIANTINC := $(INC_PATH)/omap_hrp/h4
+VARIANTINC2 := $(EXTENSION_ROOT)/../omaph4bsp/shared/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../omaph4bsp/h4/nand
+
+GENINC1 := $(INC_PATH)
+GENINC3 := $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h4/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+EPOCINCDIR = $(INC_PATH)/omap_hrp/h4
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+#BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)  # Error as $(EPOCBLD) include platform 
+BUILDLOC = $(EPOCBLD)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/h4hrp_un2_sb_coreldr.bin
+TMPTARGET = $(BUILDLOC)/h4hrp_un2_sb_coreldr.elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_smallblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+ifeq "$(USE_MMU)" "TRUE"
+        GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+#ARMASM_OUT := $(shell armasm 2>&1)
+#ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+ARMASM_OUT := $(wordlist 2, 4, $(shell armasm --vsn 2>&1))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+#RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+RVCTSTR := $(strip $(findstring RVCT,$(ARMASM_OUT)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+        ASM_TRUE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+        ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+        ASM_FALSE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+        ASM_FALSE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+        ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_TRUE_MACROS += USE_CXSF
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        CPP := armcc
+
+        OBJEXT := o
+        INCEXT := inc
+
+        ARMCCFLAGS := --arm -c -Otime --cpp
+        ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+        ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+        ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+        ifeq "$(CFG)" "UDEB"
+        ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+        endif
+
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+        ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+        AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+
+        define do_compile
+                $(CPP) $(ARMCCFLAGS) $< -o $@
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+        endef
+        define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+        endef
+        define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+        endef
+        define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+        endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+        ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+        LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+        GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+        GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+        ifeq "$(CFG)" "UDEB"
+        GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+        else
+        GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+        endif
+
+        LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+        OBJEXT := o
+        INCEXT := ginc
+
+        PROCESS_INCLUDES := 1
+        define do_compile
+                $(GCC) -o $@ $<
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+        endef
+        define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+        endef
+        define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+                $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+        endef
+        define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+                echo Built $(TARGET)
+        endef
+        define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+        endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+	$(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_on_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_on_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,355 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+  
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+	USE_MMU := TRUE
+else
+	DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+	USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+	WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/UTIL/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/LLD/DNandO
+SPECSRCDIR := $(EXTENSION_ROOT)/../omaph4bsp/h4/nandboot/coreldr_onenand
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/drivers/h4ons
+
+VARIANTINC := $(INC_PATH)/omap_hrp/h4
+VARIANTINC2 := $(EXTENSION_ROOT)/../omaph4bsp/shared/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../omaph4bsp/h4/nand  $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/assp $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/inc $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/assp $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/interrupt $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/interrupt $(EXTENSION_ROOT)/../omaph4bsp/shared/gpio $(EXTENSION_ROOT)/../omaph4bsp/shared/mcspi $(EXTENSION_ROOT)/../omaph4bsp/assp/omap24xx/gpio $(EXTENSION_ROOT)/../omaph4bsp/assp/shared $(EXTENSION_ROOT)/../omaph4bsp/shared/cirq $(EXTENSION_ROOT)/../omaph4bsp/shared/dma $(EXTENSION_ROOT)/../omaph4bsp/assp/shared/dma
+
+GENINC1 := $(INC_PATH)
+GENINC3 := $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel  $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/INC
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC) $(GENINC3)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../unref/orphan/cedgen/shared/nandboot
+VINCDIR = ../../../unref/orphan/cedgen/h4/inc
+GINCDIR = ../../../unref/orphan/cedgen/shared/inc
+EPOCINCDIR = $(INC_PATH)/omap_hrp/h4
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/h4hrp_un2_on_coreldr.bin
+TMPTARGET = $(BUILDLOC)$/h4hrp_un2_on_coreldr.elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+VHEADERS := NandDevice.h
+BUILTINCLUDES := NandDevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_onenand.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONbl2.cpp
+XSRCPPSOURCE1 := OSLessOAM.cpp
+XSRCPPSOURCE2 := onld.cpp
+SPECXSRCPPSOURCE := pam.cpp
+
+XSRLIB := $(EPOCROOT)epoc32/release/armv5/$(CFG)/nbl2.lib
+
+ifeq "$(USE_MMU)" "TRUE"
+	GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+# HEADERS := inflate.h coreldr.h
+HEADERS := 
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+	TOOLVER := RVCT
+	OP := --
+	OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+	ASM_TRUE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+	ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+	ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+	ASM_FALSE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+	ASM_FALSE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+	ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+CPP := armcc
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DSYMBIAN_SUPPORT_UNISTORE2 
+
+	ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+	ifeq "$(CFG)" "UDEB"
+	ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+	endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+define do_compile
+$(CPP) $(ARMCCFLAGS) $< -o $@
+endef
+define do_h2inc
+perl -S $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+endef
+define do_asm
+$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+define do_link
+$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+define do_strip
+$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+	$(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+XSRCPPOBJECTS2 := $(foreach f,$(XSRCPPSOURCE2),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS2 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS2))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLXSRCPPOBJECTS2) $(FULLSPECXSRCPPOBJECTS) $(XSRLIB)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLBLCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS2) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR2)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+	@echo BLD
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)")
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_on_miniboot.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h4_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/h4_restricted_on_miniboot.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,149 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+# WRITE_TIMINGS := TRUE
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+        WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/xsr/util/ONBL1
+SPECSRCDIR := $(EXTENSION_ROOT)/nandboot/miniboot_onenand
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/omap_hrp/h4_restricted/unistore2/nandboot/miniboot/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/h4hrp_un2_on_miniboot.bin
+TMPTARGET = $(BUILDLOC)$/h4hrp_un2_on_miniboot.elf
+
+#Rules
+vpath %.s . $(GENSRCDIR) $(SPECSRCDIR) 
+
+GENASMSOURCE := onbl1.s
+ASMSOURCE := miniboot_onenand.s
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+#TOOLVER := RVCT
+OP := --
+OB := o
+
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+	ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+	ASM_FALSE_MACROS += WRITE_TIMINGS
+endif 
+
+#Arm RVCT tools
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := $(OP)entry BootEntry $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+
+define do_asm
+	$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+
+define do_link
+	$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+
+define do_strip
+	$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS)
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+   
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+	
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)")
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/integrator_lmnand2_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the integrator_lmnand2_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/integrator_lmnand2_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,291 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Code execute address set in the linker file
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+#Set the directories
+BLDINFDIR := ../../../unref/orphan/cedgen/base/integrator/.
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/nandboot/coreldr
+VARIANTINC := $(EXTENSION_ROOT)/inc
+DRIVERDIR := $(EXTENSION_ROOT)/drivers
+EPOCINCDIR = $(EPOCROOT)epoc32/include/integrator/logic/lmnand2
+
+
+GENINC1 := $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(EPOCROOT)epoc32/include/drivers
+GENINC2 := $(EPOCROOT)epoc32/include/drivers/unistore2
+GENINC3 := $(EPOCROOT)epoc32/include/integrator/logic/lmnand2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3)
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/integrator/logic/lmnand2/nandboot/coreldr/$(PLATFORM_PATH)/$(CFG_PATH)
+BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/_lmnand2_coreldr.bin
+TMPTARGET = $(BUILDLOC)/coreldr.tmp
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(DRIVERDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES := nand.inc
+DRIVERINCLUDES := nand_fbr_offset.h
+
+VHEADERS := nanddevice.h 
+BUILTINCLUDES := nanddevice.inc
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp 
+XSRCPPSOURCE := coreldrxsr.cpp
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+
+#Execution address
+LINKBASE = 0x1F00000
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_MACROS += USE_CXSF
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        CPP := armcc
+        
+        OBJEXT := o
+        INCEXT := inc
+        
+        ARMCCFLAGS := --arm -c -Otime --cpp 
+        
+        ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        
+        ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2 -DEKA2
+
+        ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+        ifeq "$(CFG)" "UDEB"
+        ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+        endif
+        
+        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) -I$(BUILDLOC)
+        LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map	
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+        
+        define do_compile
+                $(CPP) $(ARMCCFLAGS) $< -o $@
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+        endef
+        define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+        endef
+        define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+        endef
+        define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+        endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+        GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+        GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+        ifeq "$(CFG)" "UDEB"
+        GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+        else
+        GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+        endif
+
+        LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+        OBJEXT := o
+        INCEXT := ginc
+
+        PROCESS_INCLUDES := 1
+        define do_compile
+                $(GCC) -o $@ $<
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+        endef 
+        define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@ 
+        endef
+        define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+                $(AS) $(AFLAGS) -o $@ $(join $(basename $@),.s)
+        endef
+        define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+                $(ERASE) $(call slash2generic,"$(TMPTARGET)") 
+	#	$(ERASE) "$(TMPTARGET)"
+                echo Built $(TARGET)
+        endef
+        define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+        endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+FULLDRIVERINCLUDES := $(foreach f,$(DRIVERINCLUDES),$(basename $(f)).$(INCEXT))
+FULLDRIVERINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLDRIVERINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+$(FULLDRIVERINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLDRIVERINCLUDES:= $(addprefix $(DRIVERDIR)/,$(DRIVERINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link 
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS) $(FULLDRIVERINCLUDES)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+
+#Asm objects
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/integrator_lmnand2_miniboot.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the integrator_lmnand2_miniboot extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/integrator_lmnand2_miniboot.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,215 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## Set the source directory
+BLDINFDIR := ../../../unref/orphan/cedgen/base/integrator/.
+SRCDIR = $(EXTENSION_ROOT)/nandboot/miniboot
+SPECSRCDIR = $(EXTENSION_ROOT)/../integratormotherboard/nandboot/miniboot
+TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+EPOCINCDIR = $(EPOCROOT)epoc32/include/integrator/logic/lmnand2
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SRCDIR) $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+
+# Build directory (EPOCBLD too long)
+#BUILDLOC = $(EPOCROOT)epoc32/build/integrator/logic/lmnand2/nandboot/miniboot/$(PLATFORM_PATH)/$(CFG_PATH)
+BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)
+
+## Set the target name
+INCLUDES := nand.inc
+SPECINCLUDES := arm.inc
+EPOCINCLUDES := nand_fbr_offset.inc
+
+SRC := miniboot.s arm.s
+TARGET = $(TARGETDIR)/_lmnand2_miniboot.bin
+TMPTARGET = $(BUILDLOC)/miniboot.exe
+
+# Set the code and data base addresses 
+LINKBASE = 0x0000000
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif 
+
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_MACROS += USE_CXSF
+
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        OBJEXT := o
+        INCEXT := inc
+
+        ASMINCPATHCMD := $(foreach dir,$(SRCDIR),$(join -I ,$(dir))) $(foreach dir,$(EPOCINCDIR),$(join -I ,$(dir)))
+        SPECASMINCPATHCMD := $(foreach dir,$(SPECSRCDIR),$(join -I ,$(dir)))
+        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(SPECASMINCPATHCMD)
+        
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+        define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+        endef
+        
+        LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
+
+        define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(filter %.$(OBJEXT),$^)
+        endef
+
+        define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+        endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        LINKFLAGS = -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
+        OBJEXT := o
+        INCEXT := ginc
+        LINKFILE = $(SRCDIR)/miniboot.lnk
+        define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+        endef
+        define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s) 
+                $(AS) $(AFLAGS) -o $@ $(join $(basename $@),.s)
+        endef
+        define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+        endef
+        define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+                $(ERASE) $(call slash2generic,"$(TMPTARGET)") 
+	#	$(ERASE) "$(TMPTARGET)"
+                echo Built $(TARGET)
+        endef
+        PROCESS_INCLUDES := 1
+endif
+
+
+OBJECTS := $(foreach f,$(SRC),$(basename $(f)).$(OBJEXT))
+
+FULLOBJECTS := $(addprefix $(BUILDLOC)/,$(OBJECTS))
+
+
+#Include processing
+
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+SPECFULLINCLUDES := $(foreach f,$(SPECINCLUDES),$(basename $(f)).$(INCEXT))
+SPECFULLINCLUDES := $(addprefix $(BUILDLOC)/,$(SPECFULLINCLUDES))
+
+EPOCFULLINCLUDES := $(foreach f,$(EPOCINCLUDES),$(basename $(f)).$(INCEXT))
+EPOCFULLINCLUDES := $(addprefix $(BUILDLOC)/,$(EPOCFULLINCLUDES))
+
+#Creation of headers
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+$(SPECFULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+$(EPOCFULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+
+#Armasm sytax specifc asm rule goes here
+FULLINCLUDES := $(addprefix $(SRCDIR)/,$(INCLUDES))
+SPECFULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(SPECINCLUDES))
+EPOCFULLINCLUDES:= $(addprefix $(EPOCINCDIR)/,$(EPOCINCLUDES))
+
+endif
+ 
+
+#Strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#Link	
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#Objects
+$(FULLOBJECTS): $(BUILDLOC)/%.$(OBJEXT): %.s $(FULLINCLUDES) $(SPECFULLINCLUDES)  $(EPOCFULLINCLUDES)
+	$(do_asm)
+
+# make directories
+$(TARGETDIR):
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC):
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lab_restricted_miniboot.flm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,84 @@
+# lab_restricted_miniboot.flm
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+
+ifeq ($(lab_restricted_miniboot_flm),)
+lab_restricted_miniboot_flm := 1
+
+# Set the directories
+SRCDIR := $(EXTENSION_ROOT)/../../lab_restricted/unistore2/nandboot/miniboot_largeblk
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/lab_restricted_miniboot_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/lab_miniboot.bin
+TMPTARGET := $(BUILDLOC)/lab_miniboot.elf
+TMPTARGET2 := $(BUILDLOC)/lab_miniboot.bin
+
+# Set the Load Address for the miniboot
+# This is currently set to the beginning of SRAM
+LINKBASE := 0x40200000
+
+# Rules
+vpath %.s . $(SRCDIR)
+
+ASMSOURCE := miniboot_largeblk.s
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := USE_CXSF
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := --ro-base $(LINKBASE) --entry BootEntry --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+
+# Include base commonly used functions
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS)
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+# Strip
+$(eval $(call base__strip,$(TMPTARGET2),$(TMPTARGET)))
+# Omapsig
+$(eval $(call base__omapsig,$(BINTARGET),$(TMPTARGET2)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(BINTARGET) $(TARGETDIR) $(BUILDLOC) 
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lab_restricted_miniboot.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+# Meta information for the lab_restricted_miniboot extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lab_restricted_miniboot.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,141 @@
+# lab_restricted_miniboot.mk
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+#Set the directories
+SRCDIR := $(EXTENSION_ROOT)/../../lab_restricted/unistore2/nandboot/miniboot_largeblk
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/lab_restricted/unistore2/nandboot/miniboot/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/lab_miniboot.bin
+TMPTARGET = $(BUILDLOC)$/lab_miniboot.elf
+TMPTARGET2 = $(BUILDLOC)$/lab_miniboot.bin
+
+# Set the Load Address for the miniboot
+# This is currently set to the beginning of SRAM
+LINKBASE=0x40200000
+
+#Rules
+vpath %.s . $(SRCDIR)
+
+ASMSOURCE := miniboot_largeblk.s
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+#TOOLVER := RVCT
+OP := --
+OB := o
+
+#Arm RVCT tools
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+
+OBJEXT := o
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) -I$(BUILDLOC)
+LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry BootEntry $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+
+define do_asm
+	$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+
+define do_link
+	$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+
+define do_strip
+	$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+
+define do_omapsig
+	perl -S $(EPOCROOT)epoc32/tools/omapsig.pl $(LINKBASE) $< $@
+endef
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS)
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TMPTARGET2) : $(TMPTARGET)
+	$(do_strip)
+
+#omapsig
+$(TARGET) : $(TMPTARGET2)
+	$(do_omapsig)
+
+#Asm objects
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+   
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+	
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)")
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lab_restricted_miniboot.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,9 @@
+<?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 build/2_0.xsd">
+
+<!--  Extension interfaces : replacements for Template Extension Makefiles  --> 
+
+ <interface name="base.lab_restricted_miniboot" extends="Symbian.KernelFLM" flm="lab_restricted_miniboot.flm">
+ </interface>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lubbock_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the lubbock_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lubbock_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,286 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Code execute address also set in the linker file
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../e32utils/nandboot/coreldr
+SPECSRCDIR := $(EXTENSION_ROOT)/nandboot/coreldr
+VARIANTINC := $(EXTENSION_ROOT)/inc
+DRIVERDIR := $(VARIANTINC)
+EPOCINCDIR = $(EPOCROOT)epoc32/include/lubbock/nand
+GENINC1 := $(EPOCROOT)epoc32/include
+GENINC2 := $(EPOCROOT)epoc32/include/lubbock/nand
+GENDRIVERINC := $(EPOCROOT)epoc32/include/drivers
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(VARIANTINC) $(GENINC1) $(GENDRIVERINC)
+ASMINCPATH := $(GENINC2)
+
+# Build directory = EPOCBLD
+BUILDLOC = $(EPOCBLD)$(call sbsadd,/$(PLATFORM_PATH)/$(CFG_PATH))
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/lubbock_coreldr.bin
+TMPTARGET = $(BUILDLOC)/coreldr.tmp
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(VARIANTINC) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES := nand.inc
+DRIVERINCLUDES := nand_fbr_offset.h
+
+VHEADERS := nanddevice.h 
+BUILTINCLUDES := nanddevice.inc
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp 
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+#Execution address (top 1M of Lubbock RAM)
+LINKBASE = 0xA3F00000
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_MACROS += USE_CXSF
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        CPP := armcc
+
+        OBJEXT := o
+        INCEXT := inc
+
+        ARMCCFLAGS := --arm -c -Otime --cpp
+
+        ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+
+        ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+
+        ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+
+ifeq "$(CFG)" "UDEB"
+        ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+endif
+        
+        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) -I$(BUILDLOC) -I$(ASMINCPATH)
+        LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map	
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+
+define do_compile
+                $(CPP) $(ARMCCFLAGS) $< -o $@
+endef
+define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+endef
+define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+        GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+        GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2
+ifeq "$(CFG)" "UDEB"
+        GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+        else
+        GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+endif
+
+        LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+        OBJEXT := o
+        INCEXT := ginc
+
+        PROCESS_INCLUDES := 1
+define do_compile
+                $(GCC) -o $@ $<
+endef
+define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+endef 
+define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+endef
+define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+                $(AS) $(AFLAGS) -o $@ $(join $(basename $@),.s)
+endef
+define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+                $(ERASE) $(call slash2generic,"$(TMPTARGET)") 
+                echo Built $(TARGET)
+endef
+define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS)) 
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS)) 
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+FULLDRIVERINCLUDES := $(foreach f,$(DRIVERINCLUDES),$(basename $(f)).$(INCEXT))
+FULLDRIVERINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLDRIVERINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc $(call pipe,$(BUILDLOC))
+	$(do_includes)
+
+$(FULLDRIVERINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc $(call pipe,$(BUILDLOC))
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLDRIVERINCLUDES:= $(addprefix $(DRIVERDIR)/,$(DRIVERINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link 
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+
+#Asm objects
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLDRIVERINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	@$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	@$(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+ifneq "$(PLATFORM)" "GCCXML"
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
+else
+
+BLD SAVESPACE :
+	echo Nothing to do
+
+RELEASABLES :
+
+CLEAN :
+	echo Nothing to do
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lubbock_miniboot.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the lubbock_miniboot extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/lubbock_miniboot.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,212 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Set the source directory
+SRCDIR = $(EXTENSION_ROOT)/nandboot/miniboot
+TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+EPOCINCDIR = $(EPOCROOT)epoc32/include/lubbock/nand
+
+#Rules
+vpath %.s $(SRCDIR)
+vpath %.inc $(SRCDIR) $(EPOCINCDIR)
+vpath %.ginc $(BUILDLOC)
+
+# Build directory
+BUILDLOC = $(EPOCBLD)$(call sbsadd,/base/lubbock)
+
+## Set the target name
+INCLUDES := nand.inc lubbock.inc
+EPOCINCLUDES := nand_fbr_offset.inc
+SRC := miniboot.s lubbock.s
+TARGET=$(TARGETDIR)/lubbock_miniboot.bin
+TMPTARGET = $(BUILDLOC)/miniboot.exe
+
+# Set the code and data base addresses 
+# Since miniboot is PIC this is just to placate the linker
+LINKBASE = 0x0000000
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+# Use GCC toolchain if no other is available
+# NB! Need to keep updating/extending allowable range of RVCT versions!!
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif 
+
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_MACROS += USE_CXSF
+
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        OBJEXT := o
+        INCEXT := inc
+
+        ASMINCPATHCMD := $(foreach dir,$(SRCDIR),$(join -I ,$(dir))) $(foreach dir,$(EPOCINCDIR),$(join -I ,$(dir)))
+        ASMINCFBRPATH := $(foreach fir,$(EPOCINCDIR),$(join -I ,$(fir)))
+        ASM_MACRO_CMD := $(foreach macro,$(ASM_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        AFLAGS := -g $(OP)keep $(ASM_MACRO_CMD) $(ASMINCPATHCMD) $(ASMINCFBRPATH)
+        
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+define do_asm
+        $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+        
+        LFLAGS := $(OP)ro-base $(LINKBASE) $(OP)entry $(LINKBASE) $(OP)map
+
+define do_link
+        $(LINK) $(LFLAGS) -$(OB) $@ $(filter %.$(OBJEXT),$^)
+endef
+
+define do_strip
+        $(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        LINKFLAGS = -n -x --section-alignment 4 --file-alignment 2 -no-whole-archive
+        OBJEXT := o
+        INCEXT := ginc
+        LINKFILE = $(SRCDIR)/miniboot.lnk
+define do_headers
+        perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+endef
+define do_asm
+        perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s) 
+        $(AS) $(AFLAGS) -o $@ $(join $(basename $@),.s)
+endef
+define do_link
+        ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+endef
+define do_strip
+        strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+        $(ERASE) $(call slash2generic,"$(TMPTARGET)") 
+        echo Built $(TARGET)
+endef
+        PROCESS_INCLUDES := 1
+endif
+
+
+OBJECTS := $(foreach f,$(SRC),$(basename $(f)).$(OBJEXT))
+
+FULLOBJECTS := $(addprefix $(BUILDLOC)/,$(OBJECTS))
+
+
+#Include processing
+FULLINCLUDES := $(addprefix $(SRCDIR)/,$(INCLUDES))
+#Object processing
+FULLSRC := $(addprefix $(SRCDIR)/,$(SRC))
+
+ifdef PROCESS_INCLUDES
+GCCSRC := $(addprefix $(EPOCBLD)/,$(SRC))
+FULLINCLUDES := $(foreach f,$(FULLINCLUDES),$(basename $(f)).$(INCEXT))
+
+EPOCFULLINCLUDES := $(foreach f,$(EPOCINCLUDES),$(basename $(f)).$(INCEXT))
+EPOCFULLINCLUDES := $(addprefix $(BUILDLOC)/,$(EPOCFULLINCLUDES))
+
+
+#Creation of headers
+$(FULLINCLUDES) : $(SRCDIR)/%.$(INCEXT) : %.inc
+	$(do_headers)
+$(EPOCFULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_headers)
+
+else
+
+#Armasm sytax specifc asm rule goes here
+
+EPOCFULLINCLUDES:= $(addprefix $(EPOCINCDIR)/,$(EPOCINCLUDES))
+endif
+
+
+#Strip
+$(call abldquote,$(TARGET)) : $(call abldquote,$(TMPTARGET)) $(call pipe,$(TARGETDIR) $(BUILDLOC)) 
+	$(do_strip)
+
+#Link	
+$(call abldquote,$(TMPTARGET)) : $(FULLOBJECTS)
+	$(do_link)
+
+#Objects
+$(FULLOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : %.s $(FULLINCLUDES) $(EPOCFULLINCLUDES) $(call pipe,$(BUILDLOC))
+	$(do_asm)
+
+# make directories
+$(call abldquote,$(TARGETDIR)) :
+	@$(call ifnotexistd,"$(TARGETDIR)")
+	
+$(call abldquote,$(BUILDLOC)) :
+	@$(call ifnotexistd,"$(BUILDLOC)")
+	
+$(EPOCBLD) :
+	@$(call ifnotexistd,"$(EPOCBLD)")
+
+
+MAKMAKE :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+FREEZE :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+LIB :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+CLEANLIB :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+RESOURCE :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+FINAL :
+	echo Nothing to do
+	echo $(BUILDLOC)
+
+
+
+BLD SAVESPACE : $(call abldquote,$(TARGETDIR)) $(EPOCBLD) $(call abldquote,$(TARGET)) $(call sbsadd,$(BUILDLOC))
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(EPOCBLD)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(EPOCBLD)/*.*"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/nand_fbr_offset.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the nand_fbr_offset extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/nand_fbr_offset.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,85 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EXTENSION_ROOT)/drivers
+
+## Set the target name
+SRC := $(SRCDIR)/nand_fbr_offset.h
+TARGET = $(TARGETDIR)/nand_fbr_offset.inc
+
+
+
+#Include processing
+FULLINCLUDES := $(addprefix $(SRCDIR)/,$(INCLUDES))
+#Object processing
+FULLSRC := $(addprefix $(SRCDIR)/,$(SRC))
+
+ifdef PROCESS_INCLUDES
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+FULLINCLUDES := $(foreach f,$(FULLINCLUDES),$(basename $(f)).$(INCEXT))
+#Creation of headers
+$(FULLINCLUDES) : $(SRCDIR)/%.$(INCEXT) : %.inc
+	$(do_headers)
+else
+#Armasm sytax specifc asm rule goes here
+endif
+
+
+#Rules
+#vpath %.inc . $(SRCDIR) 
+
+
+MAKMAKE :
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(SRC) $(TARGET) ARMASM
+#	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+
+
+BLD SAVESPACE : 
+	echo Nothing to do
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/$(TARGET)") 
+#	-$(ERASE) "$(TARGET)")
+#	-$(ERASE) "$(BUILDLOC)/$(TARGET)")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_genbootinc.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the h4_genbootinc extension template
+#
+
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_genbootinc.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,54 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# h4_genbootinc.mk
+# Generate assembler inc files from header files
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+XINCDIR := $(INC_PATH)/assp/naviengine
+XGENDIR := $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+	@echo $(XGENDIR)/naviengine.inc
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(XGENDIR)/naviengine.inc) 
+	@echo $(XGENDIR)/naviengine.inc
+
+all: $(XGENDIR)/naviengine.inc
+
+$(XGENDIR)/naviengine.inc : $(XINCDIR)/naviengine.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/naviengine.h $(XGENDIR)/naviengine.inc ARMASM
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_restricted_coreldr.flm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,281 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# ne1_tb_restricted_coreldr.flm
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+# 
+#
+
+ifeq ($($(NAME)_ne1_tb_resricted_coreldr_flm),)
+$(NAME)_ne1_tb_resricted_coreldr_flm := 1
+
+## THESE MACROS NEED TO BE SET EXPLICITLY TO TRUE OR BLANK
+
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+  
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+WRITE_TIMINGS :=
+# Timer is not implemented for Naviengine. Do not enable!
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+DUMP_PAGE_TABLES :=
+# Page tables cannot be dumped on Naviengine due to the NANDController used. Do not enable!
+
+# This macro enables the MMU enabled version of the coreldr to call RestartAuxiliaryCores
+# before it runs the core image.  This function should be defined in the variant, to 
+# restart the auxiliary cores, which it should have paused on startup.
+RUNS_WITH_SMP := TRUE
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+  USE_MMU := TRUE
+else
+  DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+  USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+  WRITE_TIMINGS := FALSE
+endif
+
+# Set the directories; based on calling bld.inf
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+# Generic drivers
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/UTIL/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/LLD/DNandO
+# Coreloader ASM...
+SPECSRCDIR := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nandboot
+# PAM - Platform specific Version
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/pam
+SPECXSRSRCDIR1 := $(EXTENSION_ROOT)/lld
+
+# Platform Variant includes
+VARIANTINC := $(INC_PATH)/ne1_tb
+VARIANTINC2 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nand  $(EXTENSION_ROOT)/../navienginebsp/naviengine_assp  $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+# Generic driver file includes
+GENINC1 := $(INC_PATH) $(EPOCROOT)/epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel  $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/INC
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(SPECXSRSRCDIR1) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC)
+
+
+# Set the source/include/target directories
+
+# epoc32 folder for exported header files
+EPOCINCDIR := $(INC_PATH)/ne1_tb
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/ne1_tb_restricted_coreldr_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/$(NAME).bin
+TMPTARGET := $(BUILDLOC)/$(NAME).elf
+
+# Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+
+# from base/e32/include/drivers/...
+VHEADERS := nanddevice.h
+# the following .inc files get built as part of the process
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+#
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONbl2.cpp
+XSRCPPSOURCE1 := OSLessOAM.cpp
+SPECXSRCPPSOURCE := pam.cpp
+SPECXSRCPPSOURCE1 := pnl.cpp  
+
+XSRLIB := $(EPOCROOT)/epoc32/release/armv5/$(CFG)/nbl2.lib
+
+# Only link in the MMU stuff if required
+GENASMSOURCE :=
+ifeq "$(USE_MMU)" "TRUE"
+  GENASMSOURCE := coreldrmmu.s
+endif
+
+HEADERS := 
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On NaviEngine this number is base of ram + 208MB (permitting 208MB core images)
+# this number is pretty arbitrary
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE := 0x8D000000
+
+# Build up logical TRUE defines
+ASM_TRUE_MACROS :=
+
+ifeq "$(USE_MMU)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) DUMP_PAGE_TABLES
+endif 
+
+ifeq "$(RUNS_WITH_SMP)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) RUNS_WITH_SMP
+endif
+
+# Build up logical FALSE defines
+ASM_FALSE_MACROS :=
+
+ifeq "$(USE_MMU)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) WRITE_TIMINGS
+endif
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) DUMP_PAGE_TABLES
+endif 
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_CXSF
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp --enum_is_int
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DDEFERED_CHK -DSYMBIAN_SUPPORT_UNISTORE2
+
+ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)/epoc32/include/rvct/rvct.h
+
+ifeq "$(CFG)" "UDEB"
+ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := --predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := --entry BootEntry --ro-base $(LINKBASE) --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+# include base commonly used functions
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+# Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+# do h2inc
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES),$(FULLVHEADERS)))
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+# do h2inc
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES2),$(FULLVHEADERS2)))
+
+# object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+SPECXSRCPPOBJECTS1 := $(foreach f,$(SPECXSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS1))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLSPECXSRCPPOBJECTS) $(FULLSPECXSRCPPOBJECTS1) $(XSRLIB)
+
+
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+
+# Strip
+$(eval $(call base__strip,$(BINTARGET),$(TMPTARGET)))
+
+# CPP objects
+$(eval $(call base__compile,$(FULLGENCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLBLCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLXSRCPPOBJECTS1),$(BUILDLOC)/%.$(OBJEXT),$(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLSPECXSRCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLSPECXSRCPPOBJECTS1),$(BUILDLOC)/%.$(OBJEXT),$(SPECXSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLGENASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(TARGETDIR) $(BUILDLOC) $(BINTARGET)
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_restricted_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the Navi_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_restricted_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,398 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# ne1_tb_restricted_coreldr.mk
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU := TRUE
+  
+# This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+# Timer is not implemented for Naviengine. Do not enable!
+
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+# DUMP_PAGE_TABLES := TRUE
+# Page tables cannot be dumped on Naviengine due to the NANDController used. Do not enable!
+
+# This macro enables the MMU enabled version of the coreldr to call RestartAuxiliaryCores
+# before it runs the core image.  This function should be defined in the variant, to 
+# restart the auxiliary cores, which it should have paused on startup.
+RUNS_WITH_SMP := TRUE
+
+# Macro used to enable support for Shadowed Memory Regions feature in loader
+# See also varaint\config.inc to enable in bootstrap
+SUPPORTS_SMR := TRUE
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+	USE_MMU := TRUE
+else
+	DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+	USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+	WRITE_TIMINGS := FALSE
+endif
+
+ifneq "$(SUPPORTS_SMR)" "TRUE"
+	SUPPORTS_SMR := FALSE
+endif
+
+#Set the directories; based on calling bld.inf
+GENSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+#Generic drivers
+BLSRCDIR := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/UTIL/ONBL2
+XSRSRCDIR1 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/OAM/OSLess
+XSRSRCDIR2 := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/LLD/DNandO
+#Coreloader ASM...
+SPECSRCDIR := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nandboot
+#PAM - Platform specific Version
+SPECXSRSRCDIR := $(EXTENSION_ROOT)/pam
+SPECXSRSRCDIR1 := $(EXTENSION_ROOT)/lld
+
+#Platform Variant includes
+VARIANTINC := $(INC_PATH)/ne1_tb
+VARIANTINC2 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../navienginebsp/ne1_tb/nand  $(EXTENSION_ROOT)/../navienginebsp/naviengine_assp  $(INC_PATH)/assp/naviengine/$(MEMMODEL)
+
+#Generic driver file includes
+GENINC1 := $(INC_PATH) $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2 $(INC_PATH)/memmodel/epoc $(INC_PATH)/kernel  $(INC_PATH)/kernel/arm $(INC_PATH)/nkern $(INC_PATH)/nkern/arm
+GENXSRINC := $(EXTENSION_ROOT)/../../../kernelhwsrv/kernel/eka/drivers/unistore2/srca/XSR/INC
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR1) $(XSRSRCDIR2) $(SPECXSRSRCDIR) $(SPECXSRSRCDIR1) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(GENINC1) $(GENDRIVERINC) $(GENINC2) $(GENINC3) $(GENINC4) $(GENXSRINC)
+
+
+# Set the source/include/target directories
+
+#epoc32 folder for exported header files
+EPOCINCDIR = $(INC_PATH)/ne1_tb
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/bsp/hwip_nec_naviengine/ne1_tb_restricted/unistore2/nandboot/coreldr/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)$/$(NAME).bin
+TMPTARGET = $(BUILDLOC)$/$(NAME).elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+
+# from base/e32/include/drivers/...
+VHEADERS := nanddevice.h
+# the following .inc files get built as part of the process
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+
+
+ASMSOURCE := coreldrasm.s
+GENCPPSOURCE := inflate.cpp
+BLCPPSOURCE := ONbl2.cpp
+XSRCPPSOURCE1 := OSLessOAM.cpp
+SPECXSRCPPSOURCE := pam.cpp
+SPECXSRCPPSOURCE1 := pnl.cpp  
+
+XSRLIB := $(EPOCROOT)epoc32/release/armv5/$(CFG)/nbl2.lib
+
+ifeq "$(USE_MMU)" "TRUE"
+	#generic version found in base/e32utils/nandboot/coreldr/...
+	GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := 
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On NaviEngine this number is base of ram + 208MB (permitting 208MB core images)
+# this number is pretty arbitrary
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x8D000000
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+	TOOLVER := RVCT
+	OP := --
+	OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+	ASM_TRUE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+	ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(SUPPORTS_SMR)" "TRUE"
+	ASM_TRUE_MACROS += SUPPORTS_SMR
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+	ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+ifeq "$(RUNS_WITH_SMP)" "TRUE"
+	ASM_TRUE_MACROS += RUNS_WITH_SMP
+endif
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+	ASM_FALSE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+	ASM_FALSE_MACROS += WRITE_TIMINGS
+endif
+ 
+ifeq "$(SUPPORTS_SMR)" "FALSE"
+	ASM_FALSE_MACROS += SUPPORTS_SMR
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+	ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+ASM_TRUE_MACROS += USE_CXSF
+ASM := armasm
+LINK := armlink
+FROMELF := fromelf
+CPP := armcc
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DXSR_NBL2 -DREAL_TARGET -DDEFERED_CHK -DSYMBIAN_SUPPORT_UNISTORE2
+  
+
+ifeq "$(SUPPORTS_SMR)" "TRUE"
+    ARMCCFLAGS := $(ARMCCFLAGS) -DSUPPORTS_SMR
+endif    
+
+
+
+	ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+	ifeq "$(CFG)" "UDEB"
+	ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+	endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+SYMOPT := $(OP)symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+define do_compile
+$(CPP) $(ARMCCFLAGS) $< -o $@
+endef
+define do_h2inc
+perl -S $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+endef
+define do_asm
+$(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+endef
+define do_link
+$(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+endef
+define do_strip
+$(FROMELF) $(OP)bin $(OP)output $@ $<
+endef
+endif
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+	$(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+BLCPPOBJECTS := $(foreach f,$(BLCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLBLCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(BLCPPOBJECTS))
+
+XSRCPPOBJECTS1 := $(foreach f,$(XSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS1))
+
+SPECXSRCPPOBJECTS := $(foreach f,$(SPECXSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS))
+
+SPECXSRCPPOBJECTS1 := $(foreach f,$(SPECXSRCPPSOURCE1),$(basename $(f)).$(OBJEXT))
+FULLSPECXSRCPPOBJECTS1 := $(addprefix $(BUILDLOC)/,$(SPECXSRCPPOBJECTS1))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLBLCPPOBJECTS) $(FULLXSRCPPOBJECTS1) $(FULLSPECXSRCPPOBJECTS) $(FULLSPECXSRCPPOBJECTS1) $(XSRLIB)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLBLCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(BLSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLSPECXSRCPPOBJECTS1) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECXSRSRCDIR1)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+	@echo BLD
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)")
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*")
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/ne1_tb_restricted_coreldr.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,13 @@
+<?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 build/2_0.xsd">
+
+<!--  Extension interfaces : replacements for Template Extension Makefiles  --> 
+
+ <interface name="base.ne1_tb_restricted_coreldr" extends="Symbian.KernelFLM" flm="ne1_tb_restricted_coreldr.flm">
+  <param name="NAME" />
+  <param name="MEMMODEL" />	
+  <param name="INCLUDES" default='' />
+  <param name="INC_PATH" />
+ </interface>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_genbootinc.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the omap3_genbootinc extension template
+#
+
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_genbootinc.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,59 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Generate assembler inc files from header files
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# This will need to change when the directory gets renamed
+XINCDIR := $(INC_PATH)/tiomap3/variant/common
+XINCDIR2 := $(INC_PATH)/tiomap3/assp/common
+
+
+MAKMAKE : all
+
+FREEZE :
+
+LIB : all
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : all
+
+RELEASABLES :
+	@echo $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/customrestartreasons.inc
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(XINCDIR)/nand_fbr_offset.inc) 
+#	-$(ERASE) $(XINCDIR)/nand_fbr_offset.inc
+	@echo $(XINCDIR2)/customrestartreasons.inc
+
+all: $(XINCDIR2)/customrestartreasons.inc $(XINCDIR)/nand_fbr_offset.inc 
+
+$(XINCDIR)/nand_fbr_offset.inc : $(XINCDIR)/nand_fbr_offset.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR)/nand_fbr_offset.h $(XINCDIR)/nand_fbr_offset.inc ARMASM
+
+$(XINCDIR2)/customrestartreasons.inc : $(XINCDIR2)/customrestartreasons.h
+	perl $(EPOCROOT)epoc32/tools/h2inc.pl $(XINCDIR2)/customrestartreasons.h $(XINCDIR2)/customrestartreasons.inc ARMASM
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_restricted_coreldr.flm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,244 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+#
+
+ifeq ($($(NAME)_omap3_resricted_coreldr_flm),)
+$(NAME)_omap3_resricted_coreldr_flm := 1
+
+## THESE MACROS NEED TO BE SET EXPLICITLY TO TRUE OR BLANK
+
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+USE_MMU :=
+
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+WRITE_TIMINGS :=
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+DUMP_PAGE_TABLES :=
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+  USE_MMU := TRUE
+else
+  DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+  USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+  WRITE_TIMINGS := FALSE
+endif
+
+# Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../../../assp/common/nandboot/coreldr_largeblk
+
+VARIANTINC := $(INC_PATH)/tiomap3/variant/$(VARIANT_PATH)
+VARIANTINC2 := $(EXTENSION_ROOT)/../../../assp/common/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../../34xx_sdp/nand
+VARIANTINC4 := $(INC_PATH)/tiomap3/variant/common
+
+GENINC1 := $(INC_PATH) $(EPOCROOT)/epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH := $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(VARIANTINC4) $(GENINC1) $(GENDRIVERINC) $(GENINC2)
+
+# Set the source/include/target directories
+GSRCDIR := ../../../assp/common/nandboot
+VINCDIR := ../../../h4/inc
+GINCDIR := ../../../shared/inc
+EPOCINCDIR := $(INC_PATH)/tiomap3/variant/34xx_sdp
+
+# Build directory
+BUILDLOC := $(EPOCBLD)/omap3_restricted_coreldr_flm/$(PLATFORM_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)
+BINTARGET := $(TARGETDIR)/$(NAME).bin
+TMPTARGET := $(BUILDLOC)/$(NAME).elf
+
+# Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_largeblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+# Only link in the MMU stuff if required
+GENASMSOURCE :=
+ifeq "$(USE_MMU)" "TRUE"
+  GENASMSOURCE := coreldrmmu.s 
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE := 0x83000000
+
+# Build up logical TRUE defines
+ASM_TRUE_MACROS :=
+
+ifeq "$(USE_MMU)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+  ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) DUMP_PAGE_TABLES
+endif 
+
+# Build up logical FALSE defines
+ASM_FALSE_MACROS :=
+
+ifeq "$(USE_MMU)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+  ASM_FALSE_MACROS := $(ASM_FALSE_MACROS) DUMP_PAGE_TABLES
+endif 
+
+
+# Arm RVCT tools
+ASM_TRUE_MACROS := $(ASM_TRUE_MACROS) USE_CXSF 
+
+OBJEXT := o
+INCEXT := inc
+
+ARMCCFLAGS := --arm -c -Otime --cpp --enum_is_int
+ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)/epoc32/include/rvct/rvct.h
+
+ifdef MACRO
+ARMCCFLAGS := $(ARMCCFLAGS) -D$(MACRO)
+endif
+
+ifeq "$(CFG)" "UDEB"
+ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+endif
+
+ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--predefine "$(macro) SETL {TRUE}")
+ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--predefine "$(macro) SETL {FALSE}")
+ASM_LINKBASE_MACRO := --predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+AFLAGS := -g --keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+LFLAGS := --entry BootEntry --ro-base $(LINKBASE) --FIRST BootEntry --map
+SYMOPT := --symdefs
+ASMTYP := ARMASM
+LINKFILE :=
+
+# Include base commonly used functions with RVCT toolchain
+include $(EPOCROOT)/epoc32/tools/makefile_templates/base/base_rvct_common.mk
+
+
+# CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+# Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES),$(FULLVHEADERS)))
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+
+$(eval $(call base__h2inc,$(FULLBUILTINCLUDES2),$(FULLVHEADERS2)))
+
+# Object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+
+FULLINCLUDES := $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES := $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES := $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES := $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+
+# Link
+$(eval $(call base__link,$(TMPTARGET),$(FULLOBJECTS)))
+
+# Strip
+$(eval $(call base__strip,$(BINTARGET),$(TMPTARGET)))
+
+# CPP objects
+$(eval $(call base__compile,$(FULLGENCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+$(eval $(call base__compile,$(FULLXSRCPPOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)))
+
+# Asm objects
+$(eval $(call base__asm,$(FULLGENASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+$(eval $(call base__asm,$(FULLASMOBJECTS),$(BUILDLOC)/%.$(OBJEXT),$(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)))
+
+#
+TARGET :: $(TARGETDIR) $(BUILDLOC) $(BINTARGET) 
+
+# --what to show releasables
+$(eval $(call whatmacro,$(BINTARGET),USERFLM))
+# Create directory
+CREATABLEPATHS := $(TARGETDIR) $(BUILDLOC)
+$(call makepath,$(CREATABLEPATHS))
+# Clean up
+$(eval $(call GenerateStandardCleanTarget,$(CLEANTARGETS),$(BUILDLOC)))
+
+endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_restricted_coreldr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the omap3_restricted_coreldr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	base
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_restricted_coreldr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,391 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# #  NB! LINKBASE :  Code execute address also set coreldr.lnk file 
+# #  MUST REFLECT CORELOADER ADDRESS RELOCATION IN BOTH FILES!!
+# 
+#
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1. 
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+## If any of these macros are changed, then execute "abld clean coreldr" from this directory
+## Use this macro if it is required to use the MMU
+## if the MMU is not require either comment it out or set it FALSE
+## USE_MMU := TRUE
+  
+## This macro enables benchmarking code. Comment out or set FALSE if not required
+#WRITE_TIMINGS := TRUE
+
+## This macro causes the page tables to be output. Comment out or set FALSE if not required
+## If this option is selected then the MMU code will be enabled
+#DUMP_PAGE_TABLES := TRUE
+
+
+## Make sure all 3 macros are either TRUE or FALSE
+# Enforce USE_MMU if page table is to be dumped
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        USE_MMU := TRUE
+else
+        DUMP_PAGE_TABLES := FALSE
+endif
+
+ifneq "$(USE_MMU)" "TRUE"
+        USE_MMU := FALSE
+endif
+
+ifneq "$(WRITE_TIMINGS)" "TRUE"
+        WRITE_TIMINGS := FALSE
+endif
+
+#Set the directories
+GENSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr
+XSRSRCDIR := $(EXTENSION_ROOT)/../../../../../../kernelhwsrv/kerneltest/e32utils/nandboot/coreldr/unistore2
+SPECSRCDIR := $(EXTENSION_ROOT)/../../../assp/common/nandboot/coreldr_largeblk
+
+VARIANTINC := $(INC_PATH)/tiomap3/variant/$(VARIANT_PATH)
+VARIANTINC2 := $(EXTENSION_ROOT)/../../../assp/common/bootstrap
+VARIANTINC3 := $(EXTENSION_ROOT)/../../34xx_sdp/nand
+VARIANTINC4 := $(INC_PATH)/tiomap3/variant/common
+
+GENINC1 := $(INC_PATH) $(EPOCROOT)epoc32/include
+GENDRIVERINC := $(INC_PATH)/drivers
+GENINC2 := $(INC_PATH)/drivers/unistore2
+GENINCPATH:= $(GENSRCDIR) $(SPECSRCDIR) $(XSRSRCDIR) $(VARIANTINC) $(VARIANTINC2) $(VARIANTINC3) $(VARIANTINC4) $(GENINC1) $(GENDRIVERINC) $(GENINC2)
+
+# Set the source/include/target directories
+GSRCDIR = ../../../assp/common/nandboot
+VINCDIR = ../../../h4/inc
+GINCDIR = ../../../shared/inc
+EPOCINCDIR = $(INC_PATH)/tiomap3/variant/34xx_sdp
+
+# Build directory (EPOCBLD too long)
+BUILDLOC = $(EPOCROOT)epoc32/build/tiomap3/$(VARIANT_PATH)_restricted/unistore2/nandboot/coreldr/$(PLATFORM)
+#BUILDLOC = $(EPOCROOT)epoc32/build/tiomap3/34xx_sdp_restricted/unistore2/nandboot/coreldr/$(PLATFORM)
+#BUILDLOC = $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG)  # Error as $(EPOCBLD) include platform 
+#BUILDLOC = $(EPOCBLD)/$(CFG_PATH)
+
+# Set the target name
+TARGETDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+TARGET = $(TARGETDIR)/$(NAME).bin
+TMPTARGET = $(BUILDLOC)/$(NAME).elf
+
+#Rules
+vpath %.s . $(SPECSRCDIR) $(SRCDIR)
+vpath %.inc . $(SPECSRCDIR) $(EPOCINCDIR)
+vpath %.ginc . $(BUILDLOC)
+
+INCLUDES :=
+
+VHEADERS := nanddevice.h
+BUILTINCLUDES := nanddevice.inc config.inc
+BUILTINCLUDES2 := nand_plat.inc
+
+ASMSOURCE := coreldrasm_largeblk.s
+GENCPPSOURCE := coreldr.cpp inflate.cpp
+XSRCPPSOURCE := coreldrxsr.cpp
+
+ifeq "$(USE_MMU)" "TRUE"
+        GENASMSOURCE := coreldrmmu.s # only link in the MMU stuff if required
+endif
+
+HEADERS := inflate.h coreldr.h
+SPECHEADERS := nand_plat.h
+
+## Address at which coreloader binary is loaded and then started from
+#
+# On H4 this number is base of ram + 48MB (permitting 48MB core images)
+# this number is pretty arbitrary and may be raised higher into ram
+# if necessary as long as the corresponding change is also made to
+# KCoreLoaderAddress in variant_bootstrap.inc
+#
+LINKBASE = 0x83000000
+
+
+
+ARMASM_OUT := $(shell armasm 2>&1)
+ARMASM_OUT_4 := $(word 4,$(ARMASM_OUT))
+
+# Select the toolchain: ARM RVCT, then GCC
+
+# Use GCC toolchain if no other is available
+TOOLVER := GCC
+RVCTSTR := $(strip $(findstring RVCT, $(ARMASM_OUT_4)))
+ifeq "$(RVCTSTR)" "RVCT"
+        TOOLVER := RVCT
+        OP := --
+        OB := o
+endif
+
+# Build up logical TRUE defines
+ifeq "$(USE_MMU)" "TRUE"
+        ASM_TRUE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "TRUE"
+        ASM_TRUE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "TRUE"
+        ASM_TRUE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+# Build up logical FALSE defines
+ifeq "$(USE_MMU)" "FALSE"
+        ASM_FALSE_MACROS += USE_MMU
+endif 
+
+ifeq "$(WRITE_TIMINGS)" "FALSE"
+        ASM_FALSE_MACROS += WRITE_TIMINGS
+endif 
+
+ifeq "$(DUMP_PAGE_TABLES)" "FALSE"
+        ASM_FALSE_MACROS += DUMP_PAGE_TABLES
+endif 
+
+#Arm RVCT tools
+ifeq "$(TOOLVER)" "RVCT"
+        ASM_TRUE_MACROS += USE_CXSF
+        ASM := armasm
+        LINK := armlink
+        FROMELF := fromelf
+        CPP := armcc
+
+        OBJEXT := o
+        INCEXT := inc
+
+        ARMCCFLAGS := --arm -c -Otime --cpp
+        ARMCCFLAGS := $(ARMCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        ARMCCFLAGS := $(ARMCCFLAGS) -DEKA2
+        ARMCCFLAGS := $(ARMCCFLAGS) -DSYMBIAN_SUPPORT_UNISTORE2
+
+        ARMCCFLAGS := $(ARMCCFLAGS) --preinclude $(EPOCROOT)epoc32/include/rvct/rvct.h
+
+	  ifdef MACRO
+	  ARMCCFLAGS := $(ARMCCFLAGS) -D$(MACRO)
+	  endif
+	  
+        ifeq "$(CFG)" "UDEB"
+        ARMCCFLAGS := $(ARMCCFLAGS) -D_DEBUG
+        endif
+
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),$(OP)predefine "$(macro) SETL {TRUE}")
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),$(OP)predefine "$(macro) SETL {FALSE}")
+        ASM_LINKBASE_MACRO := $(OP)predefine "_LINKBASE_ SETA $(LINKBASE)"
+
+        AFLAGS := -g $(OP)keep $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -I$(BUILDLOC) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        LFLAGS := $(OP)entry BootEntry $(OP)ro-base $(LINKBASE) $(OP)FIRST BootEntry $(OP)map
+        SYMOPT := $(OP)symdefs
+        ASMTYP := ARMASM
+        LINKFILE :=
+
+        define do_compile
+                $(CPP) $(ARMCCFLAGS) $< -o $@
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ ARMASM
+        endef
+        define do_asm
+                $(ASM) $(AFLAGS) -$(OB) $@ $(OP)LIST $(join $(basename $@),.lst) $<
+        endef
+        define do_link
+                $(LINK) $(LFLAGS) -$(OB) $@ $(FULLOBJECTS)
+        endef
+        define do_strip
+                $(FROMELF) $(OP)bin $(OP)output $@ $<
+        endef
+endif
+
+
+#GCC build options
+ifeq "$(TOOLVER)" "GCC"
+        ASM := as
+        AFLAGS := -mapcs-32 -R -n -I$(BUILDLOC)
+
+        ASM_TRUE_MACRO_CMD := $(foreach macro,$(ASM_TRUE_MACROS),--defsym $(macro)=1)
+        ASM_FALSE_MACRO_CMD := $(foreach macro,$(ASM_FALSE_MACROS),--defsym $(macro)=0)
+        ASM_LINKBASE_MACRO := --defsym _LINKBASE_=$(LINKBASE)
+
+        LINKFLAGS = -n --section-alignment 4 --file-alignment 2 -no-whole-archive
+        GCCFLAGS=-march=armv4 -nostdinc -pipe -c -Wall -Wno-ctor-dtor-privacy -Wno-unknown-pragmas
+        GCCFLAGS := $(GCCFLAGS) $(foreach dir,$(GENINCPATH),$(join -I, $(dir)))
+        GCCDEFS = -D__SYMBIAN32__ -D__GCC32__ -D__EPOC32__ -D__MARM__ -D__MARM_ARM4__ -DEKA2 -DSYMBIAN_SUPPORT_UNISTORE2
+        ifeq "$(CFG)" "UDEB"
+        GCC = gcc -x c++ -g -O2 $(GCCFLAGS) -D_DEBUG -D_UNICODE $(GCCDEFS)
+        else
+        GCC = gcc -x c++ -s -fomit-frame-pointer -O2 $(GCCFLAGS) -DNDEBUG -D_UNICODE $(GCCDEFS)
+        endif
+
+        LINKFILE = $(SPECSRCDIR)/coreldr.lnk
+        OBJEXT := o
+        INCEXT := ginc
+
+        PROCESS_INCLUDES := 1
+        define do_compile
+                $(GCC) -o $@ $<
+        endef
+        define do_h2inc
+                perl $(EPOCROOT)epoc32/tools/h2inc.pl $< $@ AS
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $@ $(join $(basename $@),.ginc)
+        endef
+        define do_includes
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $@
+        endef
+        define do_asm
+                perl $(EPOCROOT)epoc32/tools/armasm2as.pl $< $(join $(basename $@),.s)
+                $(AS) $(AFLAGS) $(ASM_TRUE_MACRO_CMD) $(ASM_FALSE_MACRO_CMD) $(ASM_LINKBASE_MACRO) -o $@ $(join $(basename $@),.s)
+        endef
+        define do_strip
+                strip -O binary -o "$(TARGET)" "$(TMPTARGET)"
+                echo Built $(TARGET)
+        endef
+        define do_link
+                ld -o "$(TMPTARGET)"  --start $(FULLOBJECTS) --script=$(LINKFILE)
+        endef
+endif
+
+
+#CPP source processing
+FULLCPPSOURCE := $(addprefix $(GENSRCDIR)/,$(GENCPPSOURCE))
+
+#Header processing
+FULLHEADERS := $(addprefix $(GENSRCDIR)/,$(HEADERS))
+FULLSPECHEADERS := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+
+FULLVHEADERS := $(addprefix $(GENDRIVERINC)/,$(VHEADERS))
+FULLBUILTINCLUDES := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES))
+$(FULLBUILTINCLUDES) : $(FULLVHEADERS)
+	$(do_h2inc)
+
+FULLVHEADERS2 := $(addprefix $(VARIANTINC)/,$(SPECHEADERS))
+FULLBUILTINCLUDES2 := $(addprefix $(BUILDLOC)/,$(BUILTINCLUDES2))
+$(FULLBUILTINCLUDES2) : $(FULLVHEADERS2)
+	$(do_h2inc)
+
+#object names
+GENCPPOBJECTS := $(foreach f,$(GENCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(GENCPPOBJECTS))
+
+XSRCPPOBJECTS := $(foreach f,$(XSRCPPSOURCE),$(basename $(f)).$(OBJEXT))
+FULLXSRCPPOBJECTS := $(addprefix $(BUILDLOC)/,$(XSRCPPOBJECTS))
+
+ASMOBJECTS := $(foreach f,$(ASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLASMOBJECTS := $(addprefix $(BUILDLOC)/,$(ASMOBJECTS))
+
+GENASMOBJECTS := $(foreach f,$(GENASMSOURCE),$(basename $(f)).$(OBJEXT))
+FULLGENASMOBJECTS := $(addprefix $(BUILDLOC)/,$(GENASMOBJECTS))
+
+FULLOBJECTS := $(FULLASMOBJECTS) $(FULLGENASMOBJECTS) $(FULLGENCPPOBJECTS) $(FULLXSRCPPOBJECTS)
+
+ifdef PROCESS_INCLUDES
+
+GCCSRC := $(addprefix $(BUILDLOC)/,$(SRC))
+
+#Creation of headers
+FULLINCLUDES := $(foreach f,$(INCLUDES),$(basename $(f)).$(INCEXT))
+FULLINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLINCLUDES))
+
+$(FULLINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLBLDINCLUDES := $(foreach f,$(BLDINCLUDES),$(basename $(f)).$(INCEXT))
+FULLBLDINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLBLDINCLUDES))
+$(FULLBLDINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLPLATINCLUDES := $(foreach f,$(PLATINCLUDES),$(basename $(f)).$(INCEXT))
+FULLPLATINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLPLATINCLUDES))
+$(FULLPLATINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+FULLGENINCLUDES := $(foreach f,$(GENINCLUDES),$(basename $(f)).$(INCEXT))
+FULLGENINCLUDES := $(addprefix $(BUILDLOC)/,$(FULLGENINCLUDES))
+$(FULLGENINCLUDES) : $(BUILDLOC)/%.$(INCEXT) : %.inc
+	$(do_includes)
+
+else
+FULLINCLUDES:= $(addprefix $(SPECSRCDIR)/,$(INCLUDES))
+FULLPLATINCLUDES:= $(addprefix $(PLATSRCDIR)/,$(PLATINCLUDES))
+FULLGENINCLUDES:= $(addprefix $(GENSRCDIR)/,$(GENINCLUDES))
+FULLBLDINCLUDES:= $(addprefix $(H2BLDDIR)/,$(BLDINCLUDES))
+
+#Arm RVCT specifics here
+
+endif
+
+
+#Link
+$(TMPTARGET) : $(FULLOBJECTS)
+	$(do_link)
+
+#strip
+$(TARGET) : $(TMPTARGET)
+	$(do_strip)
+
+#CPP objects
+$(FULLGENCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+$(FULLXSRCPPOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(XSRSRCDIR)/%.cpp $(FULLHEADERS) $(FULLSPECHEADERS)
+	$(do_compile)
+
+#Asm objects
+$(FULLGENASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(GENSRCDIR)/$(GENASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBUILTINCLUDES3) $(FULLDRIVERINCLUDES) $(FULLARMINCLUDES) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+$(FULLASMOBJECTS) : $(BUILDLOC)/%.$(OBJEXT) : $(SPECSRCDIR)/$(ASMSOURCE) $(FULLINCLUDES) $(FULLBUILTINCLUDES) $(FULLBUILTINCLUDES2) $(FULLBLDINCLUDES) $(FULLGENINCLUDES) $(FULLPLATINCLUDES)
+	$(do_asm)
+
+# make the work directories
+$(TARGETDIR) :
+	$(call ifnotexistd,"$(TARGETDIR)")
+
+$(BUILDLOC) :
+	$(call ifnotexistd,"$(BUILDLOC)")
+
+
+
+MAKMAKE :
+	echo Nothing to do
+
+FREEZE :
+	echo Nothing to do
+
+LIB :
+	echo Nothing to do
+
+CLEANLIB :
+	echo Nothing to do
+
+RESOURCE :
+	echo Nothing to do
+
+FINAL :
+	echo Nothing to do
+
+BLD SAVESPACE : $(TARGETDIR) $(BUILDLOC) $(TARGET)
+
+RELEASABLES :
+	@echo "$(TARGET)"
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,"$(TARGET)") 
+	-$(ERASE) $(call slash2generic,"$(BUILDLOC)/*.*") 
+#	-$(ERASE) "$(TARGET)"
+#	-$(ERASE) "$(BUILDLOC)/*.*"
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/base/omap3_restricted_coreldr.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,15 @@
+<?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 build/2_0.xsd">
+
+<!--  Extension interfaces : replacements for Template Extension Makefiles 
+  --> 
+
+ <interface name="base.omap3_restricted_coreldr" extends="Symbian.KernelFLM" flm="omap3_restricted_coreldr.flm">
+  <param name="VARIANT_PATH" />
+  <param name="NAME" />
+  <param name="INC_PATH" />
+  <param name="MACRO" default=''/>
+  <param name="INCLUDES" default='' />
+ </interface>
+
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/converged-comms/createcommdbs.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for PDR generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	converged-comms
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/converged-comms/createcommdbs.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,50 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Envoke CED to create correct CommDB
+# 
+#
+
+do_nothing :
+
+
+#
+# The targets invoked by abld 
+#
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : 
+	perl $(EXTENSION_ROOT)/createcommdbs.pl --command=build --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+
+CLEAN : 
+	perl $(EXTENSION_ROOT)/createcommdbs.pl --command=clean --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+
+RELEASABLES : 
+	@perl $(EXTENSION_ROOT)/createcommdbs.pl --command=releasables --platform=$(PLATFORM) --variant=$(CFG) --sourceDir=$(EXTENSION_ROOT)/$(SRCDIR) --platsec
+	
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/converged-comms/installdefaultcommdb.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for PDR generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	converged-comms
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/converged-comms/installdefaultcommdb.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,48 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Envoke CED to install correct CommDB
+#
+
+do_nothing :
+	rem do_nothing
+
+#
+# The targets invoked by abld 
+#
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+SAVESPACE : BLD
+
+BLD : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : 
+	perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=build --platform=$(PLATFORM) --variant=$(CFG) --platsec
+
+CLEAN : 
+	perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=clean --platform=$(PLATFORM) --variant=$(CFG) --platsec
+
+RELEASABLES : 
+	@perl $(EXTENSION_ROOT)/installdefaultcommdb.pl --command=releasables --platform=$(PLATFORM) --variant=$(CFG) --platsec
+	
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/gen_khronos_cpp_from_hdr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the gen_khronos_cpp_from_hdr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	graphics
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/gen_khronos_cpp_from_hdr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,46 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+SOURCE_HDR=$(SOURCES)
+TARGET_CPP=$(TARGET)
+CONVERSION_SCRIPT = $(EPOCROOT)epoc32$/tools$/conv_khronos_hdr_to_cpp.pl
+
+MAKMAKE : $(TARGET_CPP)
+
+FREEZE :
+
+LIB :
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(TARGET_CPP)
+
+RELEASABLES :
+
+CLEAN :
+	perl $(CONVERSION_SCRIPT) $(SOURCE_HDR) $(TARGET_CPP) delete
+
+$(TARGET_CPP): $(SOURCE_HDR)
+	perl $(CONVERSION_SCRIPT) $(SOURCE_HDR) $(TARGET_CPP) create
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/gen_khronos_openvg_cpp_from_hdr.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the gen_khronos_openvg_cpp_from_hdr extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	graphics
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/gen_khronos_openvg_cpp_from_hdr.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,46 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+SOURCE_HDR=$(SOURCES)
+TARGET_CPP=$(TARGET)
+CONVERSION_SCRIPT = $(EPOCROOT)epoc32$/tools$/conv_khronos_openvg_hdr_to_cpp.pl
+
+MAKMAKE : $(TARGET_CPP)
+
+FREEZE :
+
+LIB :
+
+CLEANLIB :
+
+RESOURCE :
+
+FINAL :
+
+BLD SAVESPACE : $(TARGET_CPP)
+
+RELEASABLES :
+
+CLEAN :
+	perl $(CONVERSION_SCRIPT) $(SOURCE_HDR) $(TARGET_CPP) delete
+
+$(TARGET_CPP): $(SOURCE_HDR)
+	perl $(CONVERSION_SCRIPT) $(SOURCE_HDR) $(TARGET_CPP) create
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/genpdrs.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for PDR generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	graphics
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/graphics/genpdrs.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Build PDR files
+# 
+#
+
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifeq ($(PLATFORM),WINS) 
+        TARGETDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/printers
+else
+ifeq ($(PLATFORM),WINSCW)
+        TARGETDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/printers
+else
+        TARGETDIR:=$(EPOCROOT)epoc32/data/z/resource/printers
+endif
+endif
+
+$(TARGETDIR) :
+	$(call createdir,"$(TARGETDIR)")
+
+PDR=$(TARGETDIR)/$(PRINTER).pdr
+
+$(PDR) : $(EXTENSION_ROOT)/../$(PRINTER_DIR)/$(PRINTER).PD
+	$(EPOCROOT)epoc32/tools/pdrtran '$<' '$@'
+
+do_nothing:
+# do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : do_nothing
+
+BLD : $(TARGETDIR) $(PDR)
+
+SAVESPACE : BLD
+
+RESOURCE : BLD
+
+CLEAN :
+	-$(ERASE) $(PDR)
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+RELEASABLES : 
+	@echo $(PDR)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/security/upsserver.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the GNU ups server extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	security
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/security/upsserver.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ZDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z
+
+ifeq "$(PLATFORM)" "WINSCW"
+COPIED_EXE=$(ZDIR)/sys/bin/upsserver.exe
+endif
+
+
+do_nothing:
+	
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : do_nothing
+
+BLD : do_nothing
+
+ifdef COPIED_EXE
+#
+# Rules to create and package winscw Z drive upsserver.exe copy
+#
+.PHONY: FINAL
+FINAL : $(COPIED_EXE)
+
+$(COPIED_EXE) : $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/upsserver.exe
+	echo Copying upsserver.exe to emulator Z drive so the UPS romstub works.
+	$(CP)  $(call slash2generic,$<) $(call slash2generic,$@)
+
+CLEAN : 
+	-$(ERASE)  $(COPIED_EXE) 
+
+RELEASABLES : 
+	 echo $(COPIED_EXE)
+
+else
+
+FINAL : do_nothing
+CLEAN : do_nothing
+RELEASABLES : do_nothing
+
+endif
+
+SAVESPACE : BLD
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/conversiontable.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for conversiontable use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/conversiontable.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,75 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+BUILD_DIR = $(call generated,generated/fatcharsetconv)
+	
+
+SOURCE_DIR = $(EXTENSION_ROOT)/../unicodeTables
+
+TARGET= $(BUILD_DIR)/cp950.cpp \
+	$(BUILD_DIR)/cp949.cpp \
+	$(BUILD_DIR)/cp936.cpp \
+	$(BUILD_DIR)/cp932.cpp \
+	$(BUILD_DIR)/cp874.cpp \
+	$(BUILD_DIR)/cp1258.cpp \
+	$(BUILD_DIR)/cp1257.cpp \
+	$(BUILD_DIR)/cp1256.cpp \
+	$(BUILD_DIR)/cp1255.cpp \
+	$(BUILD_DIR)/cp1254.cpp \
+	$(BUILD_DIR)/cp1253.cpp \
+	$(BUILD_DIR)/cp1252.cpp \
+	$(BUILD_DIR)/cp1251.cpp \
+	$(BUILD_DIR)/cp1250.cpp
+
+$(BUILD_DIR):
+	$(call createdir,$(BUILD_DIR)) 
+
+$(TARGET):$(BUILD_DIR)/cp%.cpp : $(SOURCE_DIR)/CP%.txt $(BUILD_DIR)
+	perl $(EXTENSION_ROOT)/FatConversionTable.pl $< $@
+
+
+do_nothing:
+	@echo do nothing
+
+
+MAKMAKE : $(TARGET)
+
+BLD : do_nothing
+
+SAVESPACE : do_nothing
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB: do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+# Do not echo 'do nothing'.
+# Do not specify any 'epoc32/build' files, unless they are built into the CBR. 
+RELEASABLES :
+
+CLEAN :
+	-$(ERASE) $(TARGET)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/fm_copyfile_to_winscw_zdrive.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# fm_copyfiles_to_winscw_zdrive.meta
+#
+
+platform	winscw
+makefile	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/fm_copyfile_to_winscw_zdrive.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,71 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# fm_copyfiles_to_winscw_zdrive.mk
+# Arguments to makefile are:
+# option FILE_TO_COPY <src/dest_filename_without_any_path>
+# option SRC_PATH     <epocroot_starting_path>
+# option DEST_PATH    <emulator_zdrive_path_starting_with_a_z>
+# Job of the this makefile is to copy the specified file to 
+# the epoc32/release/winscw/CFG/z/... folder for the current config e.g. UREL or
+# UDEB.
+# 
+#
+
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+ 
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+SOURCE_FILE=$(SRC_PATH)/$(FILE_TO_COPY)
+TARGET_DIR=$(EPOCROOT)epoc32/release/winscw/$(CFG_PATH)/$(DEST_PATH)
+TARGET_FILE=$(TARGET_DIR)/$(FILE_TO_COPY)
+
+DO_NOTHING : 
+	@echo do nothing
+
+$(TARGET_DIR) : 
+	$(MKDIR) $(call slash2generic,$(TARGET_DIR))
+	
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN : 
+	@echo Erasing $(call slash2generic,$(TARGET_FILE))
+	-$(ERASE) $(call slash2generic,$(TARGET_FILE))
+
+RELEASABLES : 
+	@echo $(TARGET_FILE)
+
+FINAL : $(TARGET_DIR)
+	@echo Copying $(call slash2generic,$(SOURCE_FILE)) to $(call slash2generic,$(TARGET_FILE))
+	$(CP) $(call slash2generic,$(SOURCE_FILE)) $(call slash2generic,$(TARGET_FILE))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/generate_cpp.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for cnvtool invocation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/generate_cpp.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,112 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifneq ($(FIRST_PASS),completed)
+
+FIRST_PASS=completed
+
+SOURCE_DIRECTORY=$(EXTENSION_ROOT)/../data
+
+TOOLS=\
+$(EPOCROOT)epoc32/tools/PARSER.pm \
+$(EPOCROOT)epoc32/tools/WRITER.pm \
+$(EPOCROOT)epoc32/tools/cnvtool.pl
+
+TARGET_DIRECTORY:=$(call generated,generatedcpp/charconv)
+TARGET_DIRECTORY2:=$(EPOCROOT)epoc32/tools/charconv
+
+endif
+
+
+ifeq ($(TYPE),dat)
+
+TARGET_FILES2=$(patsubst %,$(TARGET_DIRECTORY2)/%.dat,$(STEMS))
+
+$(TARGET_FILES2) : $(TARGET_DIRECTORY2)/%.dat: $(SOURCE_DIRECTORY)/%.txt $(SOURCE_DIRECTORY)/%$(CTL_EXT).ctl $(EXTRA_DEP) $(TOOLS)
+	@$(call createdir,"$(TARGET_DIRECTORY2)")
+	perl $(EPOCROOT)epoc32/tools/cnvtool.pl $(subst .txt,$(CTL_EXT).ctl,$<) $< $@  -flattenHashAndSave $(foreach PARAM,$(EXTRA_PARAMS),"$(PARAM)" )
+
+else
+
+# This is required by parellel build
+
+TARGET_FILES=$(patsubst %,$(TARGET_DIRECTORY)/g_%.cpp,$(STEMS)) 
+
+$(TARGET_FILES) : $(TARGET_DIRECTORY)/g_%.cpp: $(SOURCE_DIRECTORY)/%.txt $(SOURCE_DIRECTORY)/%$(CTL_EXT).ctl $(EXTRA_DEP) $(TOOLS)
+	@$(call createdir,"$(TARGET_DIRECTORY)")
+	@$(call createdir,"$(TARGET_DIRECTORY2)")
+	perl $(EPOCROOT)epoc32/tools/cnvtool.pl $(subst .txt,$(CTL_EXT).ctl,$<) $< $@ -generateSourceCode $(foreach PARAM,$(EXTRA_PARAMS),"$(PARAM)" )
+
+endif
+
+
+
+ifneq ($(TYPE),all)
+
+DO_NOTHING :
+# do nothing
+
+  # the targets below are the public ones
+
+MAKMAKE : $(TARGET_FILES2) $(TARGET_FILES)
+
+BLD : $(TARGET_FILES2) $(TARGET_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+	
+RESOURCE : DO_NOTHING
+
+CLEAN :
+	-$(ERASE) $(TARGET_FILES2) $(TARGET_FILES)
+
+RELEASABLES : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+endif
+
+
+
+ifeq ($(TYPE),dat)
+
+RELEASABLES : 
+	$(call formatreleasables,$(TARGET_FILES2))
+
+endif
+
+
+
+ifeq ($(TYPE),all)
+
+TYPE=dat
+TARGET_FILES2=$(TARGET_FILES)
+
+include $(call include)
+
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/generate_snm.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for snmtool use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/generate_snm.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,77 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# basic_snm.mk
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifeq ($(PLATFORM),WINS) 
+        TARGET_DIRECTORY := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else 
+ifeq ($(PLATFORM),WINSCW)
+        TARGET_DIRECTORY := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else
+        TARGET_DIRECTORY := $(EPOCROOT)epoc32/data/z/resource/charconv
+endif
+endif
+
+SOURCE_DIRECTORY=$(EXTENSION_ROOT)
+
+TARGET_FILE=\
+        $(TARGET_DIRECTORY)/$(TARGET)
+
+TOOLS=\
+        $(EPOCROOT)epoc32/tools/PARSER.pm \
+        $(EPOCROOT)epoc32/tools/WRITER.pm \
+        $(EPOCROOT)epoc32/tools/snmtool.pl
+
+$(TARGET_DIRECTORY) :
+	@$(call createdir,"$@")
+
+$(TARGET_DIRECTORY)/basic.snm : $(SOURCE_DIRECTORY)/$(SOURCES) $(TOOLS)
+	perl $(EPOCROOT)epoc32/tools/snmtool.pl $(SOURCE_DIRECTORY)/$(SOURCES) $@
+
+DO_NOTHING :
+	@echo do nothing
+
+# the targets below are the public ones
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILE)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN : 
+	-$(ERASE) $(TARGET_FILE)
+
+RELEASABLES : 
+	@echo $(TARGET_FILE)
+
+FINAL : DO_NOTHING
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/bafl_copytestfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for bafl_copytestfiles use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/bafl_copytestfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy test files to test sortbytable functionality.
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+EPOCDATADIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+EPOCDATADIR=$(EPOCROOT)epoc32/data
+endif
+
+TARGETDIR=$(EPOCDATADIR)/z/system/documents/baflsortbytabletest
+SOURCEDIR=$(EXTENSION_ROOT)/../tsrc
+	
+COPYFILES :
+	$(CP) $(call slash2generic,$(SOURCEDIR)/ADDCERT.RSC $(TARGETDIR)/addcert.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/HELP.RSC $(TARGETDIR)/help.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/MSGEDITOR.RSC $(TARGETDIR)/msgeditor.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/SMLPROGRESS.RSC $(TARGETDIR)/smlprogress.rsc)
+
+$(TARGETDIR) :
+	$(call createdir,"$@")
+	
+DO_NOTHING :
+	@echo do nothing
+	
+#
+# The targets invoked by bld...
+#
+
+BLD : $(TARGETDIR) COPYFILES
+
+CLEAN :  
+	-$(ERASE) $(call slash2generic,$(TARGETDIR)/addcert.rsc)
+	-$(ERASE) $(call slash2generic,$(TARGETDIR)/help.rsc)
+	-$(ERASE) $(call slash2generic,$(TARGETDIR)/msgeditor.rsc)
+	-$(ERASE) $(call slash2generic,$(TARGETDIR)/smlprogress.rsc)
+	
+RELEASABLES :
+	@echo $(TARGETDIR)/addcert.rsc
+	@echo $(TARGETDIR)/help.rsc
+	@echo $(TARGETDIR)/msgeditor.rsc
+	@echo $(TARGETDIR)/smlprogress.rsc
+ 
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/bafl_resource_files.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for t_copytestfiles use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/bafl_resource_files.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,205 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy test files to test sortbytable functionality.
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+TARGET_DIRECTORY=$(EPOCROOT)epoc32/release/$(PLATFORM)/$(CFG)/z/system/data
+else
+TARGET_DIRECTORY=$(EPOCROOT)epoc32/data/z/system/data
+endif
+
+SOURCEDIR=$(EXTENSION_ROOT)/../tsrc
+
+$(TARGET_DIRECTORY) :
+	$(call createdir,"$@")
+
+TARGET_FILES=\
+	$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32\include\T_COMPRESSED_UNICODE_1.RSG \
+	$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32\include\T_COMPRESSED_UNICODE_2.RSG \
+	$(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc \
+	$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc \
+	$(TARGET_DIRECTORY)/t_notrscfile.rsc \
+	$(TARGET_DIRECTORY)/rscheader.bin \
+	$(TARGET_DIRECTORY)/newrscformat.rsc \
+
+$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc : $(SOURCEDIR)/T_COMPRESSED_UNICODE_1.RPP
+	@RCOMP.EXE -s$? -o$@ -h$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_1.RSG -u -{0x000eb205,*}
+$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_1.RSG : $(SOURCEDIR)/T_COMPRESSED_UNICODE_1.RPP
+	@RCOMP.EXE -s$? -o$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc -h$@ -u -{0x000eb205,*}
+
+$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc : $(SOURCEDIR)/T_COMPRESSED_UNICODE_2.RPP
+	@RCOMP.EXE -s$? -o$@ -h$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_2.RSG -u
+$(EPOCROOT)epoc32/include/T_COMPRESSED_UNICODE_2.RSG : $(SOURCEDIR)/T_COMPRESSED_UNICODE_2.RPP
+	@RCOMP.EXE -s$? -o$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc -h$@ -u
+
+$(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc : $(SOURCEDIR)/T_GENERATE_DICTIONARY_COMPRESSED_VERSION_OF_2.PL
+	@perl -w $(SOURCEDIR)/T_GENERATE_DICTIONARY_COMPRESSED_VERSION_OF_2.PL $(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc
+
+$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc : $(SOURCEDIR)/T_CALYPSO_COMPILED_RESOURCE_FILE_1.RSC
+	$(CP) $(call slash2generic,$(SOURCEDIR)/T_CALYPSO_COMPILED_RESOURCE_FILE_1.RSC $(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc)
+
+$(TARGET_DIRECTORY)/t_notrscfile.rsc  : $(SOURCEDIR)/T_NotRscFile.RSC
+	$(CP) $(call slash2generic,$(SOURCEDIR)/T_NotRscFile.RSC $(TARGET_DIRECTORY)/t_notrscfile.rsc)
+	
+$(TARGET_DIRECTORY)/rscheader.bin : 
+	$(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin $(TARGET_DIRECTORY)/rscheader.bin)
+
+$(TARGET_DIRECTORY)/newrscformat.rsc :  $(SOURCEDIR)/RscHeader.Bin  $(SOURCEDIR)/RLETest.BMP $(TARGET_DIRECTORY)/TRSC.rsc
+	@BMCONV.EXE  $(SOURCEDIR)/16RAMC.MBM /c16$(SOURCEDIR)/RLETest.BMP
+	$(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin)/b + $(call slash2generic,$(TARGET_DIRECTORY)/TRSC.rsc)/b + $(call slash2generic,$(SOURCEDIR)/16RAMC.MBM) /b $(call slash2generic,$(TARGET_DIRECTORY)/newrscformat.rsc)
+
+COPYFILES :
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv1.RSC $(TARGET_DIRECTORY)/trsc_inv1.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv2.RSC $(TARGET_DIRECTORY)/trsc_inv2.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv3.RSC $(TARGET_DIRECTORY)/trsc_inv3.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv4.RSC $(TARGET_DIRECTORY)/trsc_inv4.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv5.RSC $(TARGET_DIRECTORY)/trsc_inv5.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv6.RSC $(TARGET_DIRECTORY)/trsc_inv6.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv7.RSC $(TARGET_DIRECTORY)/trsc_inv7.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv8.RSC $(TARGET_DIRECTORY)/trsc_inv8.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRSC_Inv9.RSC $(TARGET_DIRECTORY)/trsc_inv9.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv10.RSC $(TARGET_DIRECTORY)/trsccalypso_inv10.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv11.RSC $(TARGET_DIRECTORY)/trsccalypso_inv11.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv12.RSC $(TARGET_DIRECTORY)/trsccalypso_inv12.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv13.RSC $(TARGET_DIRECTORY)/trsccompru_inv13.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv14.RSC $(TARGET_DIRECTORY)/trsccompru_inv14.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscComprU_Inv15.RSC $(TARGET_DIRECTORY)/trsccompru_inv15.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv16.RSC $(TARGET_DIRECTORY)/trsccalypso_inv16.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/TRscCalypso_Inv17.RSC $(TARGET_DIRECTORY)/trsccalypso_inv17.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/RscHeader.Bin)/b + $(call slash2generic,$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc)/b $(call slash2generic,$(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom.spi $(TARGET_DIRECTORY)/spi_ecom.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc1.RSC $(TARGET_DIRECTORY)/spi_ecomrsc1.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc2.RSC $(TARGET_DIRECTORY)/spi_ecomrsc2.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_EComRsc3.RSC $(TARGET_DIRECTORY)/spi_ecomrsc3.rsc)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/ECom-1-0.spi $(TARGET_DIRECTORY)/ecom-1-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/ECom-1-0.s02 $(TARGET_DIRECTORY)/ecom-1-0.s02)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/ECom-2-0.spi $(TARGET_DIRECTORY)/ecom-2-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/ECom-2-0.s02 $(TARGET_DIRECTORY)/ecom-2-0.s02)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom-0-0.spi $(TARGET_DIRECTORY)/spi_ecom-0-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom-1-0.spi $(TARGET_DIRECTORY)/spi_ecom-1-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/CECom-0-0.spi $(TARGET_DIRECTORY)/cecom-0-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/CECom-1-0.spi $(TARGET_DIRECTORY)/cecom-1-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom_Case-0-0.spi $(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/Spi_ECom_Case-1-0.spi $(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi)
+
+
+DO_NOTHING :
+	@echo do nothing
+
+# the targets below are the public ones
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILES) COPYFILES
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN : 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_1.rsg)
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_2.rsg)
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/t_notrscfile.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/rscheader.bin) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/newrscformat.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv1.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv2.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv3.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv4.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv5.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv6.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv7.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv8.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsc_inv9.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv10.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv11.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv12.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv13.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv14.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccompru_inv15.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv16.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trsccalypso_inv17.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc1.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc2.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecomrsc3.rsc) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-1-0.spi)  
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-1-0.s02) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-2-0.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/ecom-2-0.s02) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom-0-0.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom-1-0.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/cecom-0-0.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/cecom-1-0.spi)
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi) 
+	-$(ERASE) $(call slash2generic,$(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi)
+
+RELEASABLES : 
+	@echo $(TARGET_DIRECTORY)/t_compressed_unicode_1.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_1.rsg 
+	@echo $(TARGET_DIRECTORY)/t_compressed_unicode_2.rsc $(EPOCROOT)epoc32/include/t_compressed_unicode_2.rsg 
+	@echo $(TARGET_DIRECTORY)/t_dictionary_compressed_versio_of_2.rsc 
+	@echo $(TARGET_DIRECTORY)/t_calypso_test_resource_file_1.rsc 
+	@echo $(TARGET_DIRECTORY)/t_notrscfile.rsc 
+	@echo $(TARGET_DIRECTORY)/rscheader.bin 
+	@echo $(TARGET_DIRECTORY)/newrscformat.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv1.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv2.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv3.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv4.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv5.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv6.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv7.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv8.rsc 
+	@echo $(TARGET_DIRECTORY)/trsc_inv9.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccalypso_inv10.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccalypso_inv11.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccalypso_inv12.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccompru_inv13.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccompru_inv14.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccompru_inv15.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccalypso_inv16.rsc 
+	@echo $(TARGET_DIRECTORY)/trsccalypso_inv17.rsc 
+	@echo $(TARGET_DIRECTORY)/trscromcalypsocomprnewfmt.rsc 
+	@echo $(TARGET_DIRECTORY)/spi_ecom.spi 
+	@echo $(TARGET_DIRECTORY)/spi_ecomrsc1.rsc 
+	@echo $(TARGET_DIRECTORY)/spi_ecomrsc2.rsc 
+	@echo $(TARGET_DIRECTORY)/spi_ecomrsc3.rsc 
+	@echo $(TARGET_DIRECTORY)/ecom-1-0.spi  
+	@echo $(TARGET_DIRECTORY)/ecom-1-0.s02 
+	@echo $(TARGET_DIRECTORY)/ecom-2-0.spi 
+	@echo $(TARGET_DIRECTORY)/ecom-2-0.s02 
+	@echo $(TARGET_DIRECTORY)/spi_ecom-0-0.spi 
+	@echo $(TARGET_DIRECTORY)/spi_ecom-1-0.spi 
+	@echo $(TARGET_DIRECTORY)/cecom-0-0.spi
+	@echo $(TARGET_DIRECTORY)/cecom-1-0.spi
+	@echo $(TARGET_DIRECTORY)/spi_ecom_case-0-0.spi 
+	@echo $(TARGET_DIRECTORY)/spi_ecom_case-1-0.spi 
+	
+FINAL : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copydatfile.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for centrep_copydatfile use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copydatfile.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,70 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	EPOCDATADIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+	EPOCDATADIR=$(EPOCROOT)epoc32/data
+endif
+
+TARGETDIR = $(EPOCDATADIR)/z/resource
+SOURCEDIR = $(EXTENSION_ROOT)/../data/certstore
+
+FILE = swicertstore.dat
+
+$(TARGETDIR) : 
+	$(call createdir, "$@")
+
+COPYFILES : $(FILE)
+	
+	$(call forcecopy,$(SOURCEDIR)/$^,$(TARGETDIR)/$^)
+
+$(FILE) :
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD :	$(TARGETDIR) COPYFILES
+
+CLEAN :
+	$(call forceremove,$(TARGETDIR)/swicertstore.dat)
+
+RELEASABLES :
+	@echo $(TARGETDIR)/swicertstore.dat
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copyincentrepsrv.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for centrep_copyincentrepsrv use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copyincentrepsrv.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+CENTREPSRVSRCDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+CENTREPSRVTGTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/sys/bin
+
+FILE = centralrepositorysrv.exe
+
+$(CENTREPSRVTGTDIR) :
+	$(call createdir, "$(CENTREPSRVTGTDIR)")
+
+COPYFILE : $(FILE)
+	$(call forcecopy,$(CENTREPSRVSRCDIR)/$^,$(CENTREPSRVTGTDIR))
+
+$(FILE):
+endif
+
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+BLD : $(CENTREPSRVTGTDIR) $(CENTREPSRVSRCDIR) COPYFILE
+
+CLEAN : $(FILE)
+	$(call forceremove,$(CENTREPSRVTGTDIR)/$^)
+
+RELEASABLES : $(FILE)
+	@echo $(CENTREPSRVTGTDIR)/$^
+
+else
+BLD : DO_NOTHING
+
+CLEAN : DO_NOTHING
+
+RELEASABLES : DO_NOTHING
+endif
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copypctestfile.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for centrep_copypctestfile use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copypctestfile.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,203 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	EPOCDATADIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+	EPOCDATADIR = $(EPOCROOT)epoc32/data
+endif
+
+SECURETARGETDIR = $(EPOCDATADIR)/z/private/10202BE9
+
+PCCENREPSOURCE = $(EXTENSION_ROOT)/../test
+PCCENREPDATADIR = $(EPOCROOT)epoc32/winscw/c/private/00000000
+PCCENREPTESTDIR = $(EPOCROOT)epoc32/winscw/c
+PCCENREPPCTESTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+
+$(SECURETARGETDIR) :
+	$(call createdir, "$@")
+
+$(PCCENREPDATADIR) :
+	$(call createdir, "$@")
+
+COPYFILES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+	
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(SECURETARGETDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(SECURETARGETDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(SECURETARGETDIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(SECURETARGETDIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(SECURETARGETDIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)	
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPDATADIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPDATADIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPDATADIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPDATADIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwcre.cre,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.cre,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/copy000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPDATADIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPDATADIR)/copy000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPDATADIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPDATADIR)/copy00022222.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPTESTDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPTESTDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPTESTDIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPTESTDIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPTESTDIR)/copy00022222.cre)
+endif
+
+else
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPPCTESTDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.cre,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPPCTESTDIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.cre,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwcre.cre,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.cre,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPPCTESTDIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPPCTESTDIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPPCTESTDIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.cre,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+	
+endif
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(SECURETARGETDIR) $(PCCENREPDATADIR) $(PCCENREPTESTDIR) $(PCCENREPSOURCE) $(PCCENREPPCTESTDIR) COPYFILES
+
+CLEAN :
+
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+
+	$(call forceremove,$(SECURETARGETDIR)/000001ff.txt)
+	$(call forceremove,$(SECURETARGETDIR)/00001fff.cre)
+	$(call forceremove,$(SECURETARGETDIR)/000002ff.cre)
+	$(call forceremove,$(SECURETARGETDIR)/88888880.txt)
+	$(call forceremove,$(SECURETARGETDIR)/88888881.cre)
+	$(call forceremove,$(SECURETARGETDIR)/00022222.txt)
+	
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	$(call forceremove,$(PCCENREPDATADIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/000002ff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/88888880.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/88888881.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/copy000001ff.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/copy000002ff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/copy00022222.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPTESTDIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPTESTDIR)/copy00022222.cre)
+
+endif
+
+else
+	$(call forceremove,$(PCCENREPPCTESTDIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/000002ff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/88888880.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/88888881.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+	
+endif
+
+RELEASABLES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+	
+	@echo $(SECURETARGETDIR)/000001ff.txt
+	@echo $(SECURETARGETDIR)/00001fff.cre
+	@echo $(SECURETARGETDIR)/000002ff.cre
+	@echo $(SECURETARGETDIR)/88888880.txt
+	@echo $(SECURETARGETDIR)/88888881.cre
+	@echo $(SECURETARGETDIR)/00022222.txt
+	
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)	
+	@echo $(PCCENREPDATADIR)/000001ff.txt
+	@echo $(PCCENREPDATADIR)/00001fff.cre
+	@echo $(PCCENREPDATADIR)/000002ff.cre
+	@echo $(PCCENREPDATADIR)/88888880.txt
+	@echo $(PCCENREPDATADIR)/88888881.cre
+	@echo $(PCCENREPDATADIR)/ref_winscwcre.cre
+	@echo $(PCCENREPDATADIR)/ref_winscwtxt.cre
+	@echo $(PCCENREPDATADIR)/copy000001ff.txt
+	@echo $(PCCENREPDATADIR)/copy00001fff.cre
+	@echo $(PCCENREPDATADIR)/copy000002ff.cre
+	@echo $(PCCENREPDATADIR)/00022222.txt
+	@echo $(PCCENREPDATADIR)/copy00022222.cre
+	@echo $(PCCENREPTESTDIR)/000001ff.txt
+	@echo $(PCCENREPTESTDIR)/00001fff.cre
+	@echo $(PCCENREPTESTDIR)/copy00001fff.cre
+	@echo $(PCCENREPTESTDIR)/00022222.txt
+	@echo $(PCCENREPTESTDIR)/copy00022222.cre
+
+endif
+
+else
+	@echo $(PCCENREPPCTESTDIR)/000001ff.txt
+	@echo $(PCCENREPPCTESTDIR)/00001fff.cre
+	@echo $(PCCENREPPCTESTDIR)/copy000001ff.txt
+	@echo $(PCCENREPPCTESTDIR)/copy00001fff.cre
+	@echo $(PCCENREPPCTESTDIR)/000002ff.cre
+	@echo $(PCCENREPPCTESTDIR)/copy000002ff.cre
+	@echo $(PCCENREPPCTESTDIR)/ref_winscwcre.cre
+	@echo $(PCCENREPPCTESTDIR)/ref_winscwtxt.cre
+	@echo $(PCCENREPPCTESTDIR)/88888880.txt
+	@echo $(PCCENREPPCTESTDIR)/88888881.cre
+	@echo $(PCCENREPPCTESTDIR)/00022222.txt
+	@echo $(PCCENREPPCTESTDIR)/copy00022222.cre
+endif
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copypctestfilev2.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# centrep_copypctestfile.meta
+# Meta information for centrep_copypctestfile use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/centrep_copypctestfilev2.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,238 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# centrep_copypctestfile.mk
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	EPOCDATADIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+	EPOCDATADIR = $(EPOCROOT)epoc32/data
+endif
+
+SECURETARGETDIR = $(EPOCDATADIR)/z/private/10202BE9
+
+PCCENREPSOURCE = $(EXTENSION_ROOT)/../test
+PCCENREPDATADIR = $(EPOCROOT)epoc32/winscw/c/private/00000000
+PCCENREPTESTDIR = $(EPOCROOT)epoc32/winscw/c
+PCCENREPPCTESTDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+
+$(SECURETARGETDIR) :
+	$(call createdir, "$@")
+
+$(PCCENREPDATADIR) :
+	$(call createdir, "$@")
+
+COPYFILES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(SECURETARGETDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(SECURETARGETDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(SECURETARGETDIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(SECURETARGETDIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(SECURETARGETDIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(SECURETARGETDIR)/00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)	
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPDATADIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPDATADIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPDATADIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPDATADIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwcre.crev2,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.crev2,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPDATADIR)/copy000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPDATADIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPDATADIR)/copy000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPDATADIR)/00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPDATADIR)/copy00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPDATADIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPDATADIR)/copy00022222.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPTESTDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPTESTDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPTESTDIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPTESTDIR)/00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPTESTDIR)/copy00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPTESTDIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPTESTDIR)/copy00022222.cre)
+# Shared files between the t_cenreppc (WINSCW) and testsymcenrep (TOOLS2) tests.
+	$(call forcecopy,$(PCCENREPSOURCE)/common_crc.txt,$(PCCENREPTESTDIR)/common_crc.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/common_ref_00022222.cre,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+# TOOLS2
+else
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPPCTESTDIR)/00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPPCTESTDIR)/00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000001ff.txt,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00001fff.crev2,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00004fff.cre,$(PCCENREPPCTESTDIR)/copy00004fff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPPCTESTDIR)/000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/000002ff.crev2,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwcre.crev2,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/winscwtxt.crev2,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888880.txt,$(PCCENREPPCTESTDIR)/88888880.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/88888881.cre,$(PCCENREPPCTESTDIR)/88888881.cre)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.txt,$(PCCENREPPCTESTDIR)/00022222.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/00022222.crev2,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+# Shared files between the t_cenreppc (WINSCW) and testsymcenrep (TOOLS2) tests.
+	$(call forcecopy,$(PCCENREPSOURCE)/common_crc.txt,$(PCCENREPTESTDIR)/common_crc.txt)
+	$(call forcecopy,$(PCCENREPSOURCE)/common_ref_00022222.cre,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : $(SECURETARGETDIR) $(PCCENREPDATADIR) $(PCCENREPTESTDIR) $(PCCENREPSOURCE) $(PCCENREPPCTESTDIR) COPYFILES
+
+CLEAN :
+
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+	$(call forceremove,$(SECURETARGETDIR)/000001ff.txt)
+	$(call forceremove,$(SECURETARGETDIR)/00001fff.cre)
+	$(call forceremove,$(SECURETARGETDIR)/000002ff.cre)
+	$(call forceremove,$(SECURETARGETDIR)/88888880.txt)
+	$(call forceremove,$(SECURETARGETDIR)/88888881.cre)
+	$(call forceremove,$(SECURETARGETDIR)/00004fff.cre)
+	$(call forceremove,$(SECURETARGETDIR)/00022222.txt)
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	$(call forceremove,$(PCCENREPDATADIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/000002ff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/88888880.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/88888881.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/ref_winscwcre.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/ref_winscwtxt.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/copy000001ff.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/copy000002ff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/00004fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/copy00004fff.cre)
+	$(call forceremove,$(PCCENREPDATADIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/copy00022222.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPTESTDIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/00004fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/copy00004fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPTESTDIR)/copy00022222.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/common_crc.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+endif
+
+
+# TOOLS2
+else
+	$(call forceremove,$(PCCENREPPCTESTDIR)/000001ff.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/00001fff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/00004fff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy000001ff.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy00001fff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/000002ff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy000002ff.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwcre.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/ref_winscwtxt.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/88888880.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/88888881.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/00022222.txt)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy00022222.cre)
+	$(call forceremove,$(PCCENREPPCTESTDIR)/copy00004fff.cre)
+	$(call forceremove,$(PCCENREPTESTDIR)/common_crc.txt)
+	$(call forceremove,$(PCCENREPDATADIR)/common_ref_00022222.cre)
+
+endif
+
+RELEASABLES :
+ifneq ($(findstring TOOLS2,$(PLATFORM)),TOOLS2)
+	@echo $(SECURETARGETDIR)/000001ff.txt
+	@echo $(SECURETARGETDIR)/00001fff.cre
+	@echo $(SECURETARGETDIR)/000002ff.cre
+	@echo $(SECURETARGETDIR)/88888880.txt
+	@echo $(SECURETARGETDIR)/88888881.cre
+	@echo $(SECURETARGETDIR)/00004fff.cre
+	@echo $(SECURETARGETDIR)/00022222.txt
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	@echo $(PCCENREPDATADIR)/000001ff.txt
+	@echo $(PCCENREPDATADIR)/00001fff.cre
+	@echo $(PCCENREPDATADIR)/000002ff.cre
+	@echo $(PCCENREPDATADIR)/88888880.txt
+	@echo $(PCCENREPDATADIR)/88888881.cre
+	@echo $(PCCENREPDATADIR)/ref_winscwcre.cre
+	@echo $(PCCENREPDATADIR)/ref_winscwtxt.cre
+	@echo $(PCCENREPDATADIR)/copy000001ff.txt
+	@echo $(PCCENREPDATADIR)/copy00001fff.cre
+	@echo $(PCCENREPDATADIR)/copy000002ff.cre
+	@echo $(PCCENREPDATADIR)/00004fff.cre
+	@echo $(PCCENREPDATADIR)/copy00004fff.cre
+	@echo $(PCCENREPDATADIR)/00022222.txt
+	@echo $(PCCENREPDATADIR)/copy00022222.cre
+	@echo $(PCCENREPTESTDIR)/000001ff.txt
+	@echo $(PCCENREPTESTDIR)/00001fff.cre
+	@echo $(PCCENREPTESTDIR)/copy00001fff.cre
+	@echo $(PCCENREPTESTDIR)/00004fff.cre
+	@echo $(PCCENREPTESTDIR)/copy00004fff.cre
+	@echo $(PCCENREPTESTDIR)/00022222.txt
+	@echo $(PCCENREPTESTDIR)/copy00022222.cre
+	@echo $(PCCENREPTESTDIR)/common_crc.txt
+	@echo $(PCCENREPDATADIR)/common_ref_00022222.cre
+endif
+
+# TOOLS2
+else 
+	@echo $(PCCENREPPCTESTDIR)/000001ff.txt
+	@echo $(PCCENREPPCTESTDIR)/00001fff.cre
+	@echo $(PCCENREPPCTESTDIR)/copy000001ff.txt
+	@echo $(PCCENREPPCTESTDIR)/copy00001fff.cre
+	@echo $(PCCENREPPCTESTDIR)/000002ff.cre
+	@echo $(PCCENREPPCTESTDIR)/copy000002ff.cre
+	@echo $(PCCENREPPCTESTDIR)/ref_winscwcre.cre
+	@echo $(PCCENREPPCTESTDIR)/ref_winscwtxt.cre
+	@echo $(PCCENREPPCTESTDIR)/88888880.txt
+	@echo $(PCCENREPPCTESTDIR)/88888881.cre
+	@echo $(PCCENREPPCTESTDIR)/00022222.txt
+	@echo $(PCCENREPPCTESTDIR)/copy00022222.cre
+	@echo $(PCCENREPPCTESTDIR)/copy00004fff.cre
+	@echo $(PCCENREPTESTDIR)/common_crc.txt
+	@echo $(PCCENREPDATADIR)/common_ref_00022222.cre
+
+endif
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+ROMFILE : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_testpostbuild.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# charconv_tiso8859x_generate_cpp.meta
+# Meta information for charconv_tiso8859x_generate_cpp use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_testpostbuild.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This postbuild script is only called when a Test Build is done.  It deletes the KDDI/AU versions of the shiftjis and j5 plugin RSC file, so
+# that only the Docomo versions remain.  This removed ambiguity over which one will load during tests - a seperate version of the KDDI/AU
+# plugins is created for test build, with a unique UID number so they may coexist for test purposes.
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# Only remove files on emulator build - for hardware, iby file selects correct plugin.
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/plugins
+
+	TARGET_FILES = \
+	$(TARGETDIR)/shiftjis_kddiau.rsc \
+	$(TARGETDIR)/j5_kddiau.rsc \
+	$(TARGETDIR)/eucjp_packed_2.rsc \
+	$(TARGETDIR)/iso2022jp_2.rsc \
+	$(TARGETDIR)/iso2022jp1_2.rsc \
+	$(TARGETDIR)/j5_kddiau_2.rsc \
+	$(TARGETDIR)/jis_2.rsc\
+	$(TARGETDIR)/shiftjis_kddiau_2.rsc
+	
+	TARGET_FILES:=$(subst /,\,$(TARGET_FILES))
+endif
+
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+BLD :	
+	@echo Below rsc files will be deleted to remove ambiguity in testing:
+	@echo $(TARGET_FILES)
+	-$(ERASE) $(TARGET_FILES)	
+else
+BLD : DO_NOTHING
+endif
+
+RELEASABLES : DO_NOTHING
+
+MAKMAKE : DO_NOTHING
+
+CLEAN : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_tiso8859x_generate_cpp.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for charconv_tiso8859x_generate_cpp use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_tiso8859x_generate_cpp.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,73 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+TARGET_DIRECTORY = $(EXTENSION_ROOT)/../test/rtest/tsrc/main
+
+TEXT_FILE_DIRECTORY = $(EXTENSION_ROOT)/../data
+
+TARGET_CPP_FILES = $(TARGET_DIRECTORY)/g_tiso8859x.cpp
+
+TOOLS = $(EXTENSION_ROOT)/../test/rtest/tsrc/main/tiso8859x_generate_cpp.pl
+
+$(TARGET_DIRECTORY) :
+
+$(TARGET_DIRECTORY)/g_tiso8859x.cpp : $(TOOLS) \
+	$(TEXT_FILE_DIRECTORY)/iso88592.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88593.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88594.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88595.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88596.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88597.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88598.txt \
+	$(TEXT_FILE_DIRECTORY)/iso88599.txt \
+	$(TEXT_FILE_DIRECTORY)/iso885910.txt \
+	$(TEXT_FILE_DIRECTORY)/iso885913.txt \
+	$(TEXT_FILE_DIRECTORY)/iso885914.txt \
+	$(TEXT_FILE_DIRECTORY)/iso885915.txt
+	@perl -w $(call slash2generic, $(EXTENSION_ROOT)/../test/rtest/tsrc/main/tiso8859x_generate_cpp.pl '$(EXTENSION_ROOT)')
+
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : $(TARGET_DIRECTORY) $(TARGET_CPP_FILES)
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_CPP_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN : 
+	-$(ERASE) $(TARGET_CPP_FILES)
+
+RELEASABLES : 
+	@echo $(TARGET_CPP_FILES)
+
+FINAL : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_tsnmdata.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for charconv_tsnmdata use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/charconv_tsnmdata.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,68 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGET_DIRECTORY = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/charconv
+else
+	TARGET_DIRECTORY = $(EPOCROOT)epoc32/data/z/resource/charconv
+endif
+
+TARGET_FILES = $(TARGET_DIRECTORY)/tsnm.snm
+
+SOURCE_DIRECTORY = $(EXTENSION_ROOT)/../test/data/main
+
+TOOLS = \
+	$(EPOCROOT)epoc32/tools/PARSER.PM \
+	$(EPOCROOT)epoc32/tools/WRITER.PM \
+	$(EPOCROOT)epoc32/tools/snmtool.pl
+
+$(TARGET_DIRECTORY) :
+	$(call createdir,"$@")
+
+$(TARGET_FILES) : $(SOURCE_DIRECTORY)/tsnm.txt $(TOOLS)
+	perl $(EPOCROOT)epoc32/tools/snmtool.pl $(SOURCE_DIRECTORY)/tsnm.txt $@
+DO_NOTHING :
+	@echo do nothing
+	
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGET_DIRECTORY) $(TARGET_FILES)
+
+SAVESPACE : BLD
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN : 
+	-$(ERASE) $(TARGET_FILES)
+
+RELEASABLES : 
+	@echo $(TARGET_FILES)
+
+FINAL : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/dbms_copytestdbscfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for dbms_copytestdbscfiles use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/dbms_copytestdbscfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,132 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Build DBMS test files
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/100012a5/policy
+	TARGETDIR2 = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/100012a5
+	TARGETDIR3 = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/test
+else
+	TARGETDIR = $(EPOCROOT)epoc32/data/z/private/100012a5/policy
+	TARGETDIR2 = $(EPOCROOT)epoc32/data/z/private/100012a5
+	TARGETDIR3 = $(EPOCROOT)epoc32/data/z/system/test
+endif
+
+TARGET_FILES = \
+	$(TARGETDIR)/11335577.spd \
+	$(TARGETDIR)/11335578.spd \
+	$(TARGETDIR)/11335579.spd \
+	$(TARGETDIR)/1133557a.spd \
+	$(TARGETDIR)/12344321.spd \
+	$(TARGETDIR2)/dbs_11335578_a.db \
+	$(TARGETDIR2)/dbs_11335578_b.db \
+	$(TARGETDIR2)/dbs_11335578_z.db \
+	$(TARGETDIR2)/dbs_11335579_testdb.db \
+	$(TARGETDIR2)/dbs_1133557a_zzz.db \
+	$(TARGETDIR2)/dbs_12344321_1234567890123456789012345678901234567890123456789012345678901234567890.db\
+	$(TARGETDIR3)/11335577.txt\
+	$(TARGETDIR3)/11335578.txt\
+	$(TARGETDIR3)/11335579.txt\
+	$(TARGETDIR3)/1133557A.txt\
+	$(TARGETDIR3)/t_dbperf1.sql\
+	$(TARGETDIR3)/t_script.txt\
+	$(TARGETDIR3)/typetextktests44.dat\
+	$(TARGETDIR3)/typetextktests46.dat\
+	$(TARGETDIR3)/typetextktests47.dat
+
+
+$(TARGETDIR) :
+	$(call createdir, "$@")
+
+$(TARGETDIR2) :
+	$(call createdir, "$@")
+	
+$(TARGETDIR3) :
+	$(call createdir, "$@")
+
+COPYFILES :
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335577.spd,$(TARGETDIR)/11335577.spd)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335578.spd,$(TARGETDIR)/11335578.spd)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335579.spd,$(TARGETDIR)/11335579.spd)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/1133557A.spd,$(TARGETDIR)/1133557a.spd)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/12344321.spd,$(TARGETDIR)/12344321.spd)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_11335578_A.DB,$(TARGETDIR2)/dbs_11335578_a.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_11335578_B.DB,$(TARGETDIR2)/dbs_11335578_b.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_11335578_Z.DB,$(TARGETDIR2)/dbs_11335578_z.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_11335579_TESTDB.DB,$(TARGETDIR2)/dbs_11335579_testdb.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_1133557A_ZZZ.DB,$(TARGETDIR2)/dbs_1133557a_zzz.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/dbs_12344321_1234567890123456789012345678901234567890123456789012345678901234567890.DB,$(TARGETDIR2)/dbs_12344321_1234567890123456789012345678901234567890123456789012345678901234567890.db)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335577.txt,$(TARGETDIR3)/11335577.txt)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335578.txt,$(TARGETDIR3)/11335578.txt)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/11335579.txt,$(TARGETDIR3)/11335579.txt)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/1133557A.txt,$(TARGETDIR3)/1133557A.txt)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/t_dbperf1.sql,$(TARGETDIR3)/t_dbperf1.sql)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/t_script.txt,$(TARGETDIR3)/t_script.txt)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/typetextktests44.dat,$(TARGETDIR3)/typetextktests44.dat)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/typetextktests46.dat,$(TARGETDIR3)/typetextktests46.dat)
+		$(call forcecopy,$(EXTENSION_ROOT)/../TDBMS/typetextktests47.dat,$(TARGETDIR3)/typetextktests47.dat)
+		
+DO_NOTHING :
+	@echo do nothing
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) $(TARGETDIR2) $(TARGETDIR3) COPYFILES
+
+CLEAN : 
+	$(call forceremove,$(TARGET_FILES))
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(TARGETDIR)/11335577.spd
+	@echo $(TARGETDIR)/11335578.spd
+	@echo $(TARGETDIR)/11335579.spd
+	@echo $(TARGETDIR)/1133557a.spd
+	@echo $(TARGETDIR)/12344321.spd
+	@echo $(TARGETDIR2)/dbs_11335578_a.db
+	@echo $(TARGETDIR2)/dbs_11335578_b.db
+	@echo $(TARGETDIR2)/dbs_11335578_z.db
+	@echo $(TARGETDIR2)/dbs_11335579_testdb.db
+	@echo $(TARGETDIR2)/dbs_1133557a_zzz.db
+	@echo $(TARGETDIR2)/dbs_12344321_1234567890123456789012345678901234567890123456789012345678901234567890.db
+	@echo $(TARGETDIR3)/11335577.txt
+	@echo $(TARGETDIR3)/11335578.txt
+	@echo $(TARGETDIR3)/11335579.txt
+	@echo $(TARGETDIR3)/1133557A.txt
+	@echo $(TARGETDIR3)/t_dbperf1.sql
+	@echo $(TARGETDIR3)/t_script.txt
+	@echo $(TARGETDIR3)/typetextktests44.dat
+	@echo $(TARGETDIR3)/typetextktests46.dat
+	@echo $(TARGETDIR3)/typetextktests47.dat
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_buildsis.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the ecom3_buildsis extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_buildsis.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,60 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Params:
+# SOURCES - list of .pkg files
+# TARGET - not used
+# OPTION OUTDIR - mandatory, it is tef_ecomswi
+# OPTION INDIR - mandatory, path relative to bld.inf containing the 
+# .pkg files.
+# OPTION CERTPEM - mandatory
+# OPTION CERTKEY - mandatory
+# OPTION STUBLIST - mandatory, identify stubs in $(SOURCES)
+# OPTION SCRIPTNAME - mandatory, perl script to build SIS. Must be in
+# same dir as .pkg files.
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+CERTPEM := $(subst /,$(/),$(CERTPEM))
+CERTKEY := $(subst /,$(/),$(CERTKEY))
+OUTDIR := $(subst /,$(/),$(OUTDIR))
+INDIR := $(subst /,$(/),$(INDIR))
+BASEDIR := $(EXTENSION_ROOT)/$(INDIR)
+
+TARGETS := $(shell perl $(BASEDIR)/$(SCRIPTNAME) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -outdir $(OUTDIR) -maketrgt RELEASABLES -sources "$(SOURCES)" -stublist "$(STUBLIST)")
+EXTRA := $(shell perl $(BASEDIR)/$(SCRIPTNAME) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -outdir $(OUTDIR) -maketrgt EXTRATARGET -sources "$(SOURCES)" -stublist "$(STUBLIST)")
+
+
+$(TARGETS) :
+	@perl $(call slash2generic, $(BASEDIR)/$(SCRIPTNAME)) -basedir $(BASEDIR) -platform $(PLATFORM_PATH) -cfg $(CFG_PATH) -certpem $(CERTPEM) -certkey $(CERTKEY) -maketrgt FINAL $@
+
+#
+# The targets invoked by abld...
+#
+FINAL : $(TARGETS)
+
+BLD MAKMAKE SAVESPACE FREEZE LIB CLEANLIB RESOURCE :
+	@echo do nothing
+
+CLEAN : 
+	-$(ERASE) $(TARGETS) $(EXTRA)
+
+RELEASABLES : 
+	@echo $(TARGETS) $(EXTRA)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_postbuild.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for ecom3_postbuild use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_postbuild.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,353 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z
+RAMONLYTARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/ramonly
+SOURCEDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+SOURCEDIR2=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/plugins
+else
+TARGETDIR=$(EPOCROOT)epoc32/data/z
+RAMONLYTARGETDIR=$(EPOCROOT)epoc32/data/z/ramonly
+SOURCEDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+SOURCEDIR2=$(EPOCROOT)epoc32/data/z/resource/plugins
+endif
+
+DO_NOTHING:
+	@echo do_nothing
+	
+$(RAMONLYTARGETDIR) :
+	$(call createdir,"$@")
+
+COPYFILES :
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/HeapTestImpl.dll $(TARGETDIR)/heaptestimpl.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/HeapTestImpl.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample5.dll $(RAMONLYTARGETDIR)/ecomexample5.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample5.dll $(RAMONLYTARGETDIR)/invalidsidplugin.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample5.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12.dll $(RAMONLYTARGETDIR)/ecomexample12.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12Upgraded.dll $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12Upgraded.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample12Downgraded.dll $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample12Downgraded.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample14.dll $(RAMONLYTARGETDIR)/ecomexample14.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample14.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample14Upgraded.dll $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample14Upgraded.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample15.dll $(RAMONLYTARGETDIR)/ecomexample15.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample15.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData.dll	$(RAMONLYTARGETDIR)/ecomexamplebaddata.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData1.dll $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData1.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExampleBadData2.dll	$(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExampleBadData2.dll)
+				$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample3.dll $(RAMONLYTARGETDIR)/ecomexample3.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample2.dll $(RAMONLYTARGETDIR)/ecomexample2.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample.dll $(RAMONLYTARGETDIR)/ecomexample.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComNullExample.dll $(RAMONLYTARGETDIR)/ecomnullexample.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomOnlyExampleOnC.dll $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComRomOnlyExampleOnC.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnC.dll $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnC.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComRomRslvrExampleOnZ.dll $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/T_PlatSecResolverC.dll $(RAMONLYTARGETDIR)/t_platsecresolverc.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/T_PlatSecResolverC.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/T_PlatSecEcom4.dll $(RAMONLYTARGETDIR)/t_platsececom4.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/T_PlatSecEcom4.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample1.dll $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample1.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample2.dll $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample3.dll $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeExample3.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample1.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample1.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample2.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample3.dll $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EcomUpgradeROExample3.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/DefectPlugin.dll $(RAMONLYTARGETDIR)/defectplugin.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/DefectPlugin.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample7.dll $(RAMONLYTARGETDIR)/ecomexample7.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample7.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComExample8.dll $(RAMONLYTARGETDIR)/ecomexample8.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComExample8.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComCR629Example1.dll	$(RAMONLYTARGETDIR)/ecomcr629example1.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComCR629Example1.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComCR629Example2.dll	$(RAMONLYTARGETDIR)/ecomcr629example2.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComCR629Example2.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/LanguagePlugin.dll $(RAMONLYTARGETDIR)/languageplugin.dll)
+		-$(ERASE) $(call slash2generic $(SOURCEDIR)/LanguagePlugin.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComHashExample.dll $(RAMONLYTARGETDIR)/ecomhashexample.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComHashExample.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/EComSwiExample.dll $(RAMONLYTARGETDIR)/ecomswiexample.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/EComSwiExample.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/exampleNine.dll $(RAMONLYTARGETDIR)/examplenine.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/exampleNine.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR)/dummycustomresolver1.dll $(RAMONLYTARGETDIR)/dummycustomresolver1.dll)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR)/dummycustomresolver1.dll)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc $(TARGETDIR)/heaptestimpl.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc $(RAMONLYTARGETDIR)/invalidsidplugin.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/HeapTestImpl.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample5.RSC $(RAMONLYTARGETDIR)/ecomexample5.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample5.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12.RSC $(RAMONLYTARGETDIR)/ecomexample12.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12Upgraded.RSC $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12Upgraded.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample12Downgraded.RSC $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample12Downgraded.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample14.RSC $(RAMONLYTARGETDIR)/ecomexample14.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample14.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample14Upgraded.RSC $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample14Upgraded.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample15.RSC $(RAMONLYTARGETDIR)/ecomexample15.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExample15.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData1.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData1.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData2.RSC $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComExampleBadData2.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample3.RSC $(RAMONLYTARGETDIR)/ecomexample3.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample2.RSC $(RAMONLYTARGETDIR)/ecomexample2.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample.RSC $(RAMONLYTARGETDIR)/ecomexample.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomOnlyExampleOnC.RSC $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComRomOnlyExampleOnC.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnC.RSC $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnC.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComRomRslvrExampleOnZ.RSC $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/T_PlatSecResolverC.RSC $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/T_PlatSecResolverC.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/T_PlatSecEcom4.RSC $(RAMONLYTARGETDIR)/t_platsececom4.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/T_PlatSecEcom4.RSC)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomNullExample.RSC $(RAMONLYTARGETDIR)/ecomnullexample.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample1.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample1.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample2.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample3.rsc $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeExample3.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample1.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample1.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample2.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample3.rsc $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EcomUpgradeROExample3.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/DefectPlugin.rsc $(RAMONLYTARGETDIR)/defectplugin.rsc)
+		-$(ERASE) $(SOURCEDIR2)/DefectPlugin.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample7.rsc $(RAMONLYTARGETDIR)/ecomexample7.rsc)
+		-$(ERASE) $(SOURCEDIR2)/EComExample7.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComExample8.rsc $(RAMONLYTARGETDIR)/ecomexample8.rsc)
+		-$(ERASE) $(SOURCEDIR2)/EComExample8.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComCR629Example1.rsc	$(RAMONLYTARGETDIR)/ecomcr629example1.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComCR629Example1.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComCR629Example2.rsc	$(RAMONLYTARGETDIR)/ecomcr629example2.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComCR629Example2.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.rsc $(RAMONLYTARGETDIR)/languageplugin.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r01 $(RAMONLYTARGETDIR)/languageplugin.r01)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r01)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r02 $(RAMONLYTARGETDIR)/languageplugin.r02)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r02)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r03 $(RAMONLYTARGETDIR)/languageplugin.r03)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/LanguagePlugin.r03)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComHashExample.rsc $(RAMONLYTARGETDIR)/ecomhashexample.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComHashExample.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/EComSwiExample.rsc $(RAMONLYTARGETDIR)/ecomswiexample.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/EComSwiExample.rsc)
+		$(CP) /B $(call slash2generic, $(SOURCEDIR2)/dummycustomresolver1.rsc $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc)
+		-$(ERASE) $(call slash2generic, $(SOURCEDIR2)/dummycustomresolver1.rsc)
+		
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(RAMONLYTARGETDIR) COPYFILES
+
+CLEAN : 
+		-$(ERASE) $(call slash2generic, $(TARGETDIR)/heaptestimpl.dll)
+		-$(ERASE) $(call slash2generic, $(TARGETDIR)/heaptestimpl.rsc )
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample5.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample15.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample3.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample2.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample.rsc )
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc)  
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample5.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample15.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample3.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample2.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/invalidsidplugin.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/invalidsidplugin.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsecresolverc.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc )
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsececom4.dll )
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/t_platsececom4.rsc)
+		
+
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomnullexample.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomnullexample.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/defectplugin.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/defectplugin.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample7.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample7.rsc )
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample8.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomexample8.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example1.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example1.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example2.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomcr629example2.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r01) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r02) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/languageplugin.r03) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomhashexample.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomhashexample.rsc) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomswiexample.dll) 
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/ecomswiexample.rsc)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/examplenine.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/dummycustomresolver1.dll)
+		-$(ERASE) $(call slash2generic, $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc)
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+		@echo $(TARGETDIR)/heaptestimpl.dll
+		@echo $(TARGETDIR)/heaptestimpl.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample5.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample12.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample12Upgraded.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample12Downgraded.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample14.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample14Upgraded.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample15.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata1.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata2.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample3.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample2.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample.rsc 
+		@echo $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample5.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample12.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample12Upgraded.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample12Downgraded.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample14.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample14Upgraded.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample15.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata1.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexamplebaddata2.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample3.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample2.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample.dll
+		@echo $(RAMONLYTARGETDIR)/ecomromonlyexampleonc.dll
+		@echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonc.dll
+		@echo $(RAMONLYTARGETDIR)/ecomromrslvrexampleonz.dll
+		@echo $(RAMONLYTARGETDIR)/invalidsidplugin.rsc 
+		@echo $(RAMONLYTARGETDIR)/invalidsidplugin.dll 
+		@echo $(RAMONLYTARGETDIR)/t_platsecresolverc.dll
+		@echo $(RAMONLYTARGETDIR)/t_platsecresolverc.rsc 
+		@echo $(RAMONLYTARGETDIR)/t_platsececom4.dll
+		@echo $(RAMONLYTARGETDIR)/t_platsececom4.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomnullexample.dll
+		@echo $(RAMONLYTARGETDIR)/ecomnullexample.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample1.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample1.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample2.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample2.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample3.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgradeexample3.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample1.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample1.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample2.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample2.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample3.dll
+		@echo $(RAMONLYTARGETDIR)/ecomupgraderoexample3.rsc
+		@echo $(RAMONLYTARGETDIR)/defectplugin.dll
+		@echo $(RAMONLYTARGETDIR)/defectplugin.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample7.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample7.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomexample8.dll
+		@echo $(RAMONLYTARGETDIR)/ecomexample8.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomcr629example1.dll
+		@echo $(RAMONLYTARGETDIR)/ecomcr629example1.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomcr629example2.dll
+		@echo $(RAMONLYTARGETDIR)/ecomcr629example2.rsc
+		@echo $(RAMONLYTARGETDIR)/languageplugin.dll
+		@echo $(RAMONLYTARGETDIR)/languageplugin.rsc
+		@echo $(RAMONLYTARGETDIR)/languageplugin.r01
+		@echo $(RAMONLYTARGETDIR)/languageplugin.r02
+		@echo $(RAMONLYTARGETDIR)/languageplugin.r03
+		@echo $(RAMONLYTARGETDIR)/ecomhashexample.dll
+		@echo $(RAMONLYTARGETDIR)/ecomhashexample.rsc
+		@echo $(RAMONLYTARGETDIR)/ecomswiexample.dll
+		@echo $(RAMONLYTARGETDIR)/ecomswiexample.rsc
+		@echo $(RAMONLYTARGETDIR)/examplenine.dll
+		@echo $(RAMONLYTARGETDIR)/dummycustomresolver1.dll
+		@echo $(RAMONLYTARGETDIR)/dummycustomresolver1.rsc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_relocatetarget.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the ecom3_relocatetarget extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/ecom3_relocatetarget.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,74 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Different from ecom3_postbuild.mk in that on armv5 the RAMONLYTARGETDIR
+# is not \epoc32\data\z\ramonly. It is \epoc32\release\armv5\<CFG>\z\ramonly.
+# This template has to preserve the udeb/urel targets.
+# Params:
+# SOURCES - list of .exe and .dll files to relocate
+# TARGET - not used
+# OPTION TARGETDIR - mandatory, it is "ramonly" for ecom testing.
+# OPTION TARGETBASE - optional, overrides \epoc32\release\<platform>\<cfg>\z 
+# OPTION SOURCEDIR -  optional, overrides \epoc32\release\<platform>\<cfg> 
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# $(/) is actually back slash in Windows environment. Since bld.inf are written
+# with forward slashes and $(CP) is "copy", this substitution is important.
+TARGETDIR := $(subst /,$(/),$(TARGETDIR))
+
+ifdef TARGETBASE
+TARGETBASE := $(subst PLATFORM,$(PLATFORM_PATH),$(TARGETBASE))
+TARGETBASE := $(subst CFG,$(CFG_PATH),$(TARGETBASE))
+TARGETBASE := $(subst /,$(/),$(TARGETBASE))
+DESTDIR:=$(TARGETBASE)/$(TARGETDIR)
+else
+DESTDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/$(TARGETDIR)
+endif
+
+ifdef SOURCEDIR
+SOURCEDIR := $(subst PLATFORM,$(PLATFORM_PATH),$(SOURCEDIR))
+SOURCEDIR := $(subst CFG,$(CFG_PATH),$(SOURCEDIR))
+SOURCEDIR := $(subst /,$(/),$(SOURCEDIR))
+else
+SOURCEDIR := $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+endif
+
+TARGET_COPY := $(foreach f,$(SOURCES),$(DESTDIR)/$(f) )
+
+$(DESTDIR) :
+	$(call createdir,"$@")
+
+$(TARGET_COPY) :
+	$(CP) $(call slash2generic, $(SOURCEDIR)/$(notdir $@) $@)
+	-$(ERASE) $(call slash2generic, $(SOURCEDIR)/$(notdir $@))
+
+#
+# The targets invoked by abld...
+#
+BLD : $(DESTDIR) $(TARGET_COPY)
+
+MAKMAKE SAVESPACE FREEZE LIB CLEANLIB RESOURCE FINAL :
+	@echo do nothing
+
+CLEAN : 
+	-$(ERASE) $(TARGET_COPY)
+
+RELEASABLES : 
+	@echo $(TARGET_COPY)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/featmgr_moveplugin.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# template.meta
+# Meta information for template use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/featmgr_moveplugin.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,162 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	EPOCDATADIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+else
+	EPOCDATADIR:=$(EPOCROOT)epoc32/data
+endif
+
+BINSOURCEDIR:=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+RESOURCESOURCEDIR:=$(EPOCDATADIR)/z/resource/plugins
+
+FILE1:=normal_plugin.dll
+FILE2:=hanging_plugin.dll
+FILE3:=corrupt_plugin.dll
+FILE4:=reconciliation_plugin.dll
+FILE5:=ab_normal_plugin.dll
+FILE6:=bc_enhanced_plugin.dll
+FILE7:=slowstart_plugin.dll
+FILE8:=invalid_plugin.dll
+FILE9:=normal_plugin.rsc
+FILE10:=hanging_plugin.rsc
+FILE11:=corrupt_plugin.rsc
+FILE12:=reconciliation_plugin.rsc
+FILE13:=ab_normal_plugin.rsc
+FILE14:=bc_enhanced_plugin.rsc
+FILE15:=slowstart_plugin.rsc
+FILE16:=invalid_plugin.rsc
+
+TARGETDIR:=$(EPOCDATADIR)/z/test/efm/plugins
+# we copy the normal plugin files to the resource folder on C: drive for the plugin ignoring test
+PLUGINTARGETDIR:=$(EPOCROOT)epoc32/winscw/c/sys/bin
+RESOURCETARGETDIR:=$(EPOCROOT)epoc32/winscw/c/resource/plugins
+
+$(TARGETDIR) :
+	$(call createdir,"$@")
+
+$(PLUGINTARGETDIR) :
+	$(call createdir,"$@")
+
+$(RESOURCETARGETDIR) :
+	$(call createdir,"$@")
+
+COPYFILES : $(TARGETDIR) $(PLUGINTARGETDIR) $(RESOURCETARGETDIR) 
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE1),$(TARGETDIR)/$(FILE1))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE1),$(PLUGINTARGETDIR)/$(FILE1))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE2),$(TARGETDIR)/$(FILE2))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE3),$(TARGETDIR)/$(FILE3))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE4),$(TARGETDIR)/$(FILE4))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE5),$(TARGETDIR)/$(FILE5))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE6),$(TARGETDIR)/$(FILE6))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE7),$(TARGETDIR)/$(FILE7))
+	$(call forcecopy,$(BINSOURCEDIR)/$(FILE8),$(TARGETDIR)/$(FILE8))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE9),$(TARGETDIR)/$(FILE9))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE9),$(RESOURCETARGETDIR)/$(FILE9))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE10),$(TARGETDIR)/$(FILE10))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE11),$(TARGETDIR)/$(FILE11))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE12),$(TARGETDIR)/$(FILE12))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE13),$(TARGETDIR)/$(FILE13))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE14),$(TARGETDIR)/$(FILE14))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE15),$(TARGETDIR)/$(FILE15))
+	$(call forcecopy,$(RESOURCESOURCEDIR)/$(FILE16),$(TARGETDIR)/$(FILE16))
+
+ERASEFILES : $(call slash2generic,$(foreach FILE, $(FILE1) $(FILE2) $(FILE3) $(FILE4) $(FILE5) $(FILE6) $(FILE7) $(FILE8), $(TARGETDIR)/$(FILE)) $(PLUGINTARGETDIR)/$(FILE1))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE1))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE2))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE3))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE4))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE5))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE6))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE7))
+	$(call forceremove,$(BINSOURCEDIR)/$(FILE8))
+	
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+BLD : DO_NOTHING
+
+CLEAN :
+	$(call forceremove,$(TARGETDIR)/$(FILE1))
+	$(call forceremove,$(PLUGINTARGETDIR)/$(FILE1))
+	$(call forceremove,$(TARGETDIR)/$(FILE2))
+	$(call forceremove,$(TARGETDIR)/$(FILE3))
+	$(call forceremove,$(TARGETDIR)/$(FILE4))
+	$(call forceremove,$(TARGETDIR)/$(FILE5))
+	$(call forceremove,$(TARGETDIR)/$(FILE6))
+	$(call forceremove,$(TARGETDIR)/$(FILE7))
+	$(call forceremove,$(TARGETDIR)/$(FILE8))
+	$(call forceremove,$(TARGETDIR)/$(FILE9))
+	$(call forceremove,$(RESOURCETARGETDIR)/$(FILE9))
+	$(call forceremove,$(TARGETDIR)/$(FILE10))
+	$(call forceremove,$(TARGETDIR)/$(FILE11))
+	$(call forceremove,$(TARGETDIR)/$(FILE12))
+	$(call forceremove,$(TARGETDIR)/$(FILE13))
+	$(call forceremove,$(TARGETDIR)/$(FILE14))
+	$(call forceremove,$(TARGETDIR)/$(FILE15))
+	$(call forceremove,$(TARGETDIR)/$(FILE16))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE9))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE10))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE11))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE12))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE13))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE14))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE15))
+	$(call forceremove,$(RESOURCESOURCEDIR)/$(FILE16))
+
+RELEASABLES :
+	@echo $(TARGETDIR)/$(FILE1)
+	@echo $(PLUGINTARGETDIR)/$(FILE1)
+	@echo $(TARGETDIR)/$(FILE2)
+	@echo $(TARGETDIR)/$(FILE3)
+	@echo $(TARGETDIR)/$(FILE4)
+	@echo $(TARGETDIR)/$(FILE5)
+	@echo $(TARGETDIR)/$(FILE6)
+	@echo $(TARGETDIR)/$(FILE7)
+	@echo $(TARGETDIR)/$(FILE8)
+	@echo $(TARGETDIR)/$(FILE9)
+	@echo $(RESOURCETARGETDIR)/$(FILE9)
+	@echo $(TARGETDIR)/$(FILE10)
+	@echo $(TARGETDIR)/$(FILE11)
+	@echo $(TARGETDIR)/$(FILE12)
+	@echo $(TARGETDIR)/$(FILE13)
+	@echo $(TARGETDIR)/$(FILE14)
+	@echo $(TARGETDIR)/$(FILE15)
+	@echo $(TARGETDIR)/$(FILE16)
+
+MAKMAKE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : COPYFILES ERASEFILES
+
+ROMFILE : DO_NOTHING
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/logeng_copytestfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for logeng_copytestfiles use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/logeng_copytestfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,85 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy logeng test dat file(s)
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/data
+	TARGETDIR2= $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/101f401d
+else
+	TARGETDIR = $(EPOCROOT)epoc32/data/z/system/data
+	TARGETDIR2=$(EPOCROOT)epoc32/data/z/private/101f401d
+endif
+
+TARGET_FILES = $(TARGETDIR)/oldLogdbu.dat \
+			   $(TARGETDIR)/corruptLogdbu.dat \
+			   $(TARGETDIR)/corruptDamagedLogdbu.dat \
+			   $(TARGETDIR)/101f401d.txt \
+			   $(TARGETDIR2)/CntModel.ini \
+			   $(TARGETDIR2)/SQLite__Contacts.cdb
+			   
+
+$(TARGETDIR)/oldLogdbu.dat : $(EXTENSION_ROOT)/../test/src/oldLogdbu.dat $(TARGETDIR)
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/src/oldLogdbu.dat,$(TARGETDIR)/oldLogdbu.dat)
+$(TARGETDIR)/corruptLogdbu.dat : $(EXTENSION_ROOT)/../test/src/corruptLogdbu.dat
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/src/corruptLogdbu.dat,$(TARGETDIR)/corruptLogdbu.dat)
+$(TARGETDIR)/corruptDamagedLogdbu.dat : $(EXTENSION_ROOT)/../test/src/corruptDamagedLogdbu.dat
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/src/corruptDamagedLogdbu.dat,$(TARGETDIR)/corruptDamagedLogdbu.dat)
+$(TARGETDIR)/101f401d.txt : $(EXTENSION_ROOT)/../test/101f401d.txt
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/101f401d.txt,$(TARGETDIR)/101f401d.txt)
+$(TARGETDIR2)/CntModel.ini : $(EXTENSION_ROOT)/../test/src/CntModel.ini $(TARGETDIR2)
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/src/CntModel.ini,$(TARGETDIR2)/CntModel.ini)
+$(TARGETDIR2)/SQLite__Contacts.cdb : $(EXTENSION_ROOT)/../test/src/SQLite__Contacts.cdb $(TARGETDIR2)
+	$(call forcecopy,$(EXTENSION_ROOT)/../test/src/SQLite__Contacts.cdb,$(TARGETDIR2)/SQLite__Contacts.cdb)
+
+
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+BLD : $(TARGET_FILES)
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+CLEAN :
+	$(call forceremove,$(TARGET_FILES))
+
+RELEASABLES :
+	@echo $(TARGETDIR)/oldLogdbu.dat
+	@echo $(TARGETDIR)/corruptLogdbu.dat
+	@echo $(TARGETDIR)/corruptDamagedLogdbu.dat
+	@echo $(TARGETDIR)/101f401d.txt
+	@echo $(TARGETDIR2)/CntModel.ini
+	@echo $(TARGETDIR2)/SQLite__Contacts.cdb
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sql_copyperfsqltestfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# sql_copyperfsqltestfile.meta
+# Meta information for sql_copyperfsqltestfile
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sql_copyperfsqltestfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,213 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy SQL test files
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/testdata
+else
+TARGETDIR=$(EPOCROOT)epoc32/data/z/testdata
+endif
+
+SOURCEDIR = $(EXTENSION_ROOT)/../SCRIPT
+SOURCEDIR2= $(EXTENSION_ROOT)/../TESTDATA
+
+$(TARGETDIR):
+	$(call createdir, "$@")
+
+COPYFILES :
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Config.script,$(TARGETDIR)/sqldb_config.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_BaseDatabase.script,$(TARGETDIR)/sqldb_basedatabase.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_CreateTable.script,$(TARGETDIR)/sqldb_measurement_createtable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_CreateTable.script,$(TARGETDIR)/sqldb_performance_createtable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_insert.script,$(TARGETDIR)/sqldb_measurement_insert.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_insert.script,$(TARGETDIR)/sqldb_performance_insert.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_droptable.script,$(TARGETDIR)/sqldb_measurement_droptable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_droptable.script,$(TARGETDIR)/sqldb_performance_droptable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_delete.script,$(TARGETDIR)/sqldb_measurement_delete.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_delete.script,$(TARGETDIR)/sqldb_performance_delete.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_altertable.script,$(TARGETDIR)/sqldb_measurement_altertable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_altertable.script,$(TARGETDIR)/sqldb_performance_altertable.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_update.script,$(TARGETDIR)/sqldb_measurement_update.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_update.script,$(TARGETDIR)/sqldb_performance_update.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Concurrency.script,$(TARGETDIR)/sqldb_measurement_concurrency.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Concurrency.script,$(TARGETDIR)/sqldb_performance_concurrency.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Select1.script,$(TARGETDIR)/sqldb_measurement_select1.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Select1.script,$(TARGETDIR)/sqldb_performance_select1.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Select2.script,$(TARGETDIR)/sqldb_measurement_select2.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Select2.script,$(TARGETDIR)/sqldb_performance_select2.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Trigger.script,$(TARGETDIR)/sqldb_measurement_trigger.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Trigger.script,$(TARGETDIR)/sqldb_performance_trigger.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Commit.script,$(TARGETDIR)/sqldb_measurement_transaction_commit.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Commit_Index.script,$(TARGETDIR)/sqldb_measurement_transaction_commit_index.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Commit_Mixed.script,$(TARGETDIR)/sqldb_measurement_transaction_commit_mixed.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Commit.script,$(TARGETDIR)/sqldb_performance_transaction_commit.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Commit_Index.script,$(TARGETDIR)/sqldb_performance_transaction_commit_index.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Commit_Mixed.script,$(TARGETDIR)/sqldb_performance_transaction_commit_mixed.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Rollback.script,$(TARGETDIR)/sqldb_measurement_transaction_rollback.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Rollback_Index.script,$(TARGETDIR)/sqldb_measurement_transaction_rollback_index.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Transaction_Rollback_Mixed.script,$(TARGETDIR)/sqldb_measurement_transaction_rollback_mixed.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Rollback.script,$(TARGETDIR)/sqldb_performance_transaction_rollback.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Rollback_Index.script,$(TARGETDIR)/sqldb_performance_transaction_rollback_index.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Transaction_Rollback_Mixed.script,$(TARGETDIR)/sqldb_performance_transaction_rollback_mixed.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_AttachDB.script,$(TARGETDIR)/sqldb_measurement_attachdb.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_AttachDB.script,$(TARGETDIR)/sqldb_performance_attachdb.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Measurement_Apps.script,$(TARGETDIR)/sqldb_measurement_apps.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps.script,$(TARGETDIR)/sqldb_performance_apps.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps_Create.script,$(TARGETDIR)/sqldb_performance_apps_create.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps_Delete.script,$(TARGETDIR)/sqldb_performance_apps_delete.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps_Modify.script,$(TARGETDIR)/sqldb_performance_apps_modify.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps_Select.script,$(TARGETDIR)/sqldb_performance_apps_select.script)
+	$(call forcecopy,$(SOURCEDIR)/SqlDB_Performance_Apps_Add.script,$(TARGETDIR)/sqldb_performance_apps_add.script)
+	$(call forcecopy,$(SOURCEDIR2)/TestsqlDB_comparec0.db,$(TARGETDIR)/testsqldb_comparec0.db)
+	$(call forcecopy,$(SOURCEDIR2)/TestsqlDB_comparec1.db,$(TARGETDIR)/testsqldb_comparec1.db)
+	$(call forcecopy,$(SOURCEDIR2)/TestsqlDB_comparec2.db,$(TARGETDIR)/testsqldb_comparec2.db)
+	$(call forcecopy,$(SOURCEDIR2)/TestsqlDB_comparec3.db,$(TARGETDIR)/testsqldb_comparec3.db)
+	$(call forcecopy,$(SOURCEDIR2)/TestsqlDB_comparef.db,$(TARGETDIR)/testsqldb_comparef.db)
+	$(call forcecopy,$(SOURCEDIR2)/SqlDB_testexecute.ini,$(TARGETDIR)/sqldb_testexecute.ini)
+	$(call forcecopy,$(SOURCEDIR2)/TestSqlDB_Stress.ini,$(TARGETDIR)/testsqldb_stress.ini)
+	$(call forcecopy,$(SOURCEDIR2)/TestSqlDB_Stress_view.ini,$(TARGETDIR)/testsqldb_stress_view.ini)
+
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) COPYFILES
+
+CLEAN : 
+	$(call forceremove,$(TARGETDIR)/sqldb_config.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_basedatabase.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_createtable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_createtable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_insert.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_insert.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_droptable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_droptable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_delete.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_delete.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_altertable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_altertable.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_update.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_update.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_concurrency.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_concurrency.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_select1.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_select1.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_select2.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_select2.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_trigger.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_trigger.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_commit.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_commit_index.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_commit_mixed.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_transaction_commit.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_transaction_commit_mixed.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_rollback.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_rollback_index.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_transaction_rollback_mixed.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_transaction_rollback.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_transaction_rollback_index.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_transaction_rollback_mixed.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_attachdb.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_attachdb.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_measurement_apps.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps_create.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps_delete.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps_modify.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps_select.script)
+	$(call forceremove,$(TARGETDIR)/sqldb_performance_apps_add.script)
+	$(call forceremove,$(TARGETDIR)/testsqldb_comparec0.db)
+	$(call forceremove,$(TARGETDIR)/testsqldb_comparec1.db)
+	$(call forceremove,$(TARGETDIR)/testsqldb_comparec2.db)
+	$(call forceremove,$(TARGETDIR)/testsqldb_comparec3.db)
+	$(call forceremove,$(TARGETDIR)/testsqldb_comparef.db)
+	$(call forceremove,$(TARGETDIR)/sqldb_testexecute.ini)
+	$(call forceremove,$(TARGETDIR)/testsqldb_stress.ini)
+	$(call forceremove,$(TARGETDIR)/testsqldb_stress_view.ini)
+
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(TARGETDIR)/sqldb_config.script
+	@echo $(TARGETDIR)/sqldb_basedatabase.script
+	@echo $(TARGETDIR)/sqldb_measurement_createtable.script
+	@echo $(TARGETDIR)/sqldb_performance_createtable.script
+	@echo $(TARGETDIR)/sqldb_measurement_insert.script
+	@echo $(TARGETDIR)/sqldb_performance_insert.script
+	@echo $(TARGETDIR)/sqldb_measurement_droptable.script
+	@echo $(TARGETDIR)/sqldb_performance_droptable.script
+	@echo $(TARGETDIR)/sqldb_measurement_delete.script
+	@echo $(TARGETDIR)/sqldb_performance_delete.script
+	@echo $(TARGETDIR)/sqldb_measurement_altertable.script
+	@echo $(TARGETDIR)/sqldb_performance_altertable.script
+	@echo $(TARGETDIR)/sqldb_measurement_update.script
+	@echo $(TARGETDIR)/sqldb_performance_update.script
+	@echo $(TARGETDIR)/sqldb_measurement_concurrency.script
+	@echo $(TARGETDIR)/sqldb_performance_concurrency.script
+	@echo $(TARGETDIR)/sqldb_measurement_select1.script
+	@echo $(TARGETDIR)/sqldb_performance_select1.script
+	@echo $(TARGETDIR)/sqldb_measurement_select2.script
+	@echo $(TARGETDIR)/sqldb_performance_select2.script
+	@echo $(TARGETDIR)/sqldb_measurement_trigger.script
+	@echo $(TARGETDIR)/sqldb_performance_trigger.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_commit.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_commit_index.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_commit_mixed.script
+	@echo $(TARGETDIR)/sqldb_performance_transaction_commit.script
+	@echo $(TARGETDIR)/sqldb_performance_transaction_commit_mixed.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_rollback.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_rollback_index.script
+	@echo $(TARGETDIR)/sqldb_measurement_transaction_rollback_mixed.script
+	@echo $(TARGETDIR)/sqldb_performance_transaction_rollback.script
+	@echo $(TARGETDIR)/sqldb_performance_transaction_rollback_index.script
+	@echo $(TARGETDIR)/sqldb_performance_transaction_rollback_mixed.script
+	@echo $(TARGETDIR)/sqldb_measurement_attachdb.script
+	@echo $(TARGETDIR)/sqldb_performance_attachdb.script
+	@echo $(TARGETDIR)/sqldb_measurement_apps.script
+	@echo $(TARGETDIR)/sqldb_performance_apps.script
+	@echo $(TARGETDIR)/sqldb_performance_apps_create.script
+	@echo $(TARGETDIR)/sqldb_performance_apps_delete.script
+	@echo $(TARGETDIR)/sqldb_performance_apps_modify.script
+	@echo $(TARGETDIR)/sqldb_performance_apps_select.script
+	@echo $(TARGETDIR)/sqldb_performance_apps_add.script
+	@echo $(TARGETDIR)/testsqldb_comparec0.db
+	@echo $(TARGETDIR)/testsqldb_comparec1.db
+	@echo $(TARGETDIR)/testsqldb_comparec2.db
+	@echo $(TARGETDIR)/testsqldb_comparec3.db
+	@echo $(TARGETDIR)/testsqldb_comparef.db
+	@echo $(TARGETDIR)/sqldb_testexecute.ini
+	@echo $(TARGETDIR)/testsqldb_stress.ini
+	@echo $(TARGETDIR)/testsqldb_stress_view.ini
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sql_copysqltestfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for sql_copysqltestfiles
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sql_copysqltestfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,146 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy SQL test files
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/test
+	TARGETDIR2=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10281e17
+	TARGETDIR3=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/21212124
+else
+	TARGETDIR=$(EPOCROOT)epoc32/data/z/system/test
+	TARGETDIR2=$(EPOCROOT)epoc32/data/z/private/10281e17
+	TARGETDIR3=$(EPOCROOT)epoc32/data/z/private/21212124
+
+endif
+
+SOURCEDIR = $(EXTENSION_ROOT)/../TEST
+
+$(TARGETDIR):
+	$(call createdir, "$@")
+$(TARGETDIR2):
+	$(call createdir, "$@")
+$(TARGETDIR3):	
+	$(call createdir, "$@")
+
+COPYFILES :
+	$(call forcecopy,$(SOURCEDIR)/TestDb1.db,$(TARGETDIR)/testdb1.db)
+	$(call forcecopy,$(SOURCEDIR)/CorruptDb.db,$(TARGETDIR)/corruptdb.db)
+	$(call forcecopy,$(SOURCEDIR)/contacts_schema_to_vendors.sql,$(TARGETDIR)/contacts_schema_to_vendors.sql)
+	$(call forcecopy,$(SOURCEDIR)/add_simple_contacts.sql,$(TARGETDIR)/add_simple_contacts.sql)
+	$(call forcecopy,$(SOURCEDIR)/t_SqlShortNonDb.db,$(TARGETDIR)/t_sqlshortnondb.db)
+	$(call forcecopy,$(SOURCEDIR)/contacts_startup_time.sql,$(TARGETDIR)/contacts_startup_time.sql)
+	$(call forcecopy,$(SOURCEDIR)/t_inc095412.db,$(TARGETDIR)/t_inc095412.db)
+	$(call forcecopy,$(SOURCEDIR)/{21212122}AADb2.db,$(TARGETDIR2)/[21212122]aadb2.db)
+	$(call forcecopy,$(SOURCEDIR)/{21212122}BBDb2.db,$(TARGETDIR2)/[21212122]bbdb2.db)
+	$(call forcecopy,$(SOURCEDIR)/{21212125}T_AB.db,$(TARGETDIR2)/[21212125]t_ab.db)
+	$(call forcecopy,$(SOURCEDIR)/{1111CCCC}T_AB.db,$(TARGETDIR2)/[1111CCCC]t_ab.db)
+	$(call forcecopy,$(SOURCEDIR)/{21212125}T_OneDefPolicy.db,$(TARGETDIR2)/[21212125]t_onedefpolicy.db)
+#	$(call forcecopy,$(SOURCEDIR)/SqlServer.cfg,$(TARGETDIR2)/sqlserver.cfg)
+	$(call forcecopy,$(SOURCEDIR)/t_sqldb1.db,$(TARGETDIR3)/t_sqldb1.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_2defaultpolicies.db,$(TARGETDIR2)/[98765432]t_2defaultpolicies.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_emptysettings.db,$(TARGETDIR2)/[98765432]t_emptysettings.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_invobject.db,$(TARGETDIR2)/[98765432]t_invobject.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_invversion.db,$(TARGETDIR2)/[98765432]t_invversion.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_longcollation.db,$(TARGETDIR2)/[98765432]t_longcollation.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_nocollation.db,$(TARGETDIR2)/[98765432]t_nocollation.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_nodefaultpolicy.db,$(TARGETDIR2)/[98765432]t_nodefaultpolicy.db)
+	$(call forcecopy,$(SOURCEDIR)/{98765432}t_nosettings.db,$(TARGETDIR2)/[98765432]t_nosettings.db)
+	$(call forcecopy,$(SOURCEDIR)/default_avacon.dbSQL,$(TARGETDIR)/default_avacon.dbSQL)
+	$(call forcecopy,$(SOURCEDIR)/t_sqlbur_backup_ver0.bak,$(TARGETDIR)/t_sqlbur_backup_ver0.bak)
+	$(call forcecopy,$(SOURCEDIR)/t_sqlperformance4.sql,$(TARGETDIR)/t_sqlperformance4.sql)
+
+	
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) $(TARGETDIR2) $(TARGETDIR3) $(SOURCEDIR) COPYFILES
+
+CLEAN : 
+	$(call forceremove,$(TARGETDIR)/testdb1.db)
+	$(call forceremove,$(TARGETDIR)/corruptdb.db)
+	$(call forceremove,$(TARGETDIR)/contacts_schema_to_vendors.sql)
+	$(call forceremove,$(TARGETDIR)/add_simple_contacts.sql)
+	$(call forceremove,$(TARGETDIR)/t_sqlshortnondb.db)
+	$(call forceremove,$(TARGETDIR)/contacts_startup_time.sql)
+	$(call forceremove,$(TARGETDIR)/t_inc095412.db)
+	$(call forceremove,$(TARGETDIR2)/[21212122]aadb2.db)
+	$(call forceremove,$(TARGETDIR2)/[21212122]bbdb2.db)
+	$(call forceremove,$(TARGETDIR2)/[21212125]t_ab.db)
+	$(call forceremove,$(TARGETDIR2)/[1111CCCC]t_ab.db)
+	$(call forceremove,$(TARGETDIR2)/[21212125]t_onedefpolicy.db)
+#	$(call forceremove,$(TARGETDIR2)/sqlserver.cfg)
+	$(call forceremove,$(TARGETDIR3)/t_sqldb1.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_2defaultpolicies.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_emptysettings.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_invobject.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_invversion.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_longcollation.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_nocollation.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_nodefaultpolicy.db)
+	$(call forceremove,$(TARGETDIR2)/[98765432]t_nosettings.db)
+	$(call forceremove,$(TARGETDIR)/default_avacon.dbSQL)
+	$(call forceremove,$(TARGETDIR)/t_sqlbur_backup_ver0.bak)
+	$(call forceremove,$(TARGETDIR)/t_sqlperformance4.sql)
+	
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES : 
+	@echo $(TARGETDIR)/testdb1.db
+	@echo $(TARGETDIR)/corruptdb.db
+	@echo $(TARGETDIR)/contacts_schema_to_vendors.sql
+	@echo $(TARGETDIR)/add_simple_contacts.sql
+	@echo $(TARGETDIR)/t_sqlshortnondb.db
+	@echo $(TARGETDIR)/contacts_startup_time.sql
+	@echo $(TARGETDIR)/t_inc095412.db
+	@echo $(TARGETDIR2)/[21212122]aadb2.db
+	@echo $(TARGETDIR2)/[21212122]bbdb2.db
+	@echo $(TARGETDIR2)/[21212125]t_ab.db
+	@echo $(TARGETDIR2)/[1111CCCC]t_ab.db
+	@echo $(TARGETDIR2)/[21212125]t_onedefpolicy.db
+#	@echo $(TARGETDIR2)/sqlserver.cfg
+	@echo $(TARGETDIR3)/t_sqldb1.db
+	@echo $(TARGETDIR2)/[98765432]t_2defaultpolicies.db
+	@echo $(TARGETDIR2)/[98765432]t_emptysettings.db
+	@echo $(TARGETDIR2)/[98765432]t_invobject.db
+	@echo $(TARGETDIR2)/[98765432]t_invversion.db
+	@echo $(TARGETDIR2)/[98765432]t_longcollation.db
+	@echo $(TARGETDIR2)/[98765432]t_nocollation.db
+	@echo $(TARGETDIR2)/[98765432]t_nodefaultpolicy.db
+	@echo $(TARGETDIR2)/[98765432]t_nosettings.db
+	@echo $(TARGETDIR)/default_avacon.dbSQL
+	@echo $(TARGETDIR)/t_sqlbur_backup_ver0.bak
+	@echo $(TARGETDIR)/t_sqlperformance4.sql
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sqlite3_copysqlite3testfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for sqlite3_copysqlite3testfiles
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sqlite3_copysqlite3testfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1277 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy SQLITE3 test files
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10285A82
+else
+	TARGETDIR=$(EPOCROOT)epoc32/data/z/private/10285A82
+endif
+
+SOURCEDIR = $(EXTENSION_ROOT)/../TEST/TCLSCRIPT
+
+TARGET_FILES = \
+	$(TARGETDIR)/speed1p.explain \
+	$(TARGETDIR)/speed4p.explain \
+	$(TARGETDIR)/fuzz_common.tcl \
+	$(TARGETDIR)/malloc_common.tcl \
+	$(TARGETDIR)/tester.tcl \
+	$(TARGETDIR)/thread_common.tcl \
+	$(TARGETDIR)/trans2.test.gz \
+	$(TARGETDIR)/aggerror.test \
+	$(TARGETDIR)/alias.test \
+	$(TARGETDIR)/all.test \
+	$(TARGETDIR)/alter.test \
+	$(TARGETDIR)/alter2.test \
+	$(TARGETDIR)/alter3.test \
+	$(TARGETDIR)/altermalloc.test \
+	$(TARGETDIR)/analyze.test \
+	$(TARGETDIR)/async.test \
+	$(TARGETDIR)/async2.test \
+	$(TARGETDIR)/async3.test \
+	$(TARGETDIR)/attach.test \
+	$(TARGETDIR)/attach2.test \
+	$(TARGETDIR)/attach3.test \
+	$(TARGETDIR)/attachmalloc.test \
+	$(TARGETDIR)/auth.test \
+	$(TARGETDIR)/auth2.test \
+	$(TARGETDIR)/autoinc.test \
+	$(TARGETDIR)/autovacuum.test \
+	$(TARGETDIR)/autovacuum_ioerr2.test \
+	$(TARGETDIR)/avtrans.test \
+	$(TARGETDIR)/badutf.test \
+	$(TARGETDIR)/between.test \
+	$(TARGETDIR)/bigfile.test \
+	$(TARGETDIR)/bigrow.test \
+	$(TARGETDIR)/bind.test \
+	$(TARGETDIR)/bindxfer.test \
+	$(TARGETDIR)/bitvec.test \
+	$(TARGETDIR)/blob.test \
+	$(TARGETDIR)/busy.test \
+	$(TARGETDIR)/cache.test \
+	$(TARGETDIR)/capi2.test \
+	$(TARGETDIR)/capi3.test \
+	$(TARGETDIR)/capi3b.test \
+	$(TARGETDIR)/capi3c.test \
+	$(TARGETDIR)/capi3d.test \
+	$(TARGETDIR)/cast.test \
+	$(TARGETDIR)/check.test \
+	$(TARGETDIR)/collate1.test \
+	$(TARGETDIR)/collate2.test \
+	$(TARGETDIR)/collate3.test \
+	$(TARGETDIR)/collate4.test \
+	$(TARGETDIR)/collate5.test \
+	$(TARGETDIR)/collate6.test \
+	$(TARGETDIR)/collate7.test \
+	$(TARGETDIR)/collate8.test \
+	$(TARGETDIR)/collate9.test \
+	$(TARGETDIR)/collateA.test \
+	$(TARGETDIR)/colmeta.test \
+	$(TARGETDIR)/colname.test \
+	$(TARGETDIR)/conflict.test \
+	$(TARGETDIR)/corrupt.test \
+	$(TARGETDIR)/corrupt2.test \
+	$(TARGETDIR)/corrupt3.test \
+	$(TARGETDIR)/corrupt4.test \
+	$(TARGETDIR)/corrupt5.test \
+	$(TARGETDIR)/corrupt6.test \
+	$(TARGETDIR)/corrupt7.test \
+	$(TARGETDIR)/corrupt8.test \
+	$(TARGETDIR)/corrupt9.test \
+	$(TARGETDIR)/corruptA.test \
+	$(TARGETDIR)/crash.test \
+	$(TARGETDIR)/crash2.test \
+	$(TARGETDIR)/crash3.test \
+	$(TARGETDIR)/crash4.test \
+	$(TARGETDIR)/crash5.test \
+	$(TARGETDIR)/crash6.test \
+	$(TARGETDIR)/crash7.test \
+	$(TARGETDIR)/createtab.test \
+	$(TARGETDIR)/cse.test \
+	$(TARGETDIR)/date.test \
+	$(TARGETDIR)/default.test \
+	$(TARGETDIR)/delete.test \
+	$(TARGETDIR)/delete2.test \
+	$(TARGETDIR)/delete3.test \
+	$(TARGETDIR)/descidx1.test \
+	$(TARGETDIR)/descidx2.test \
+	$(TARGETDIR)/descidx3.test \
+	$(TARGETDIR)/diskfull.test \
+	$(TARGETDIR)/distinctagg.test \
+	$(TARGETDIR)/enc.test \
+	$(TARGETDIR)/enc2.test \
+	$(TARGETDIR)/enc3.test \
+	$(TARGETDIR)/eval.test \
+	$(TARGETDIR)/exclusive.test \
+	$(TARGETDIR)/exclusive2.test \
+	$(TARGETDIR)/exec.test \
+	$(TARGETDIR)/expr.test \
+	$(TARGETDIR)/filectrl.test \
+	$(TARGETDIR)/filefmt.test \
+	$(TARGETDIR)/fkey1.test \
+	$(TARGETDIR)/format4.test \
+	$(TARGETDIR)/fts1a.test \
+	$(TARGETDIR)/fts1b.test \
+	$(TARGETDIR)/fts1c.test \
+	$(TARGETDIR)/fts1d.test \
+	$(TARGETDIR)/fts1e.test \
+	$(TARGETDIR)/fts1f.test \
+	$(TARGETDIR)/fts1i.test \
+	$(TARGETDIR)/fts1j.test \
+	$(TARGETDIR)/fts1k.test \
+	$(TARGETDIR)/fts1l.test \
+	$(TARGETDIR)/fts1m.test \
+	$(TARGETDIR)/fts1n.test \
+	$(TARGETDIR)/fts1o.test \
+	$(TARGETDIR)/fts1porter.test \
+	$(TARGETDIR)/fts2.test \
+	$(TARGETDIR)/fts2a.test \
+	$(TARGETDIR)/fts2b.test \
+	$(TARGETDIR)/fts2c.test \
+	$(TARGETDIR)/fts2d.test \
+	$(TARGETDIR)/fts2e.test \
+	$(TARGETDIR)/fts2f.test \
+	$(TARGETDIR)/fts2g.test \
+	$(TARGETDIR)/fts2h.test \
+	$(TARGETDIR)/fts2i.test \
+	$(TARGETDIR)/fts2j.test \
+	$(TARGETDIR)/fts2k.test \
+	$(TARGETDIR)/fts2l.test \
+	$(TARGETDIR)/fts2m.test \
+	$(TARGETDIR)/fts2n.test \
+	$(TARGETDIR)/fts2o.test \
+	$(TARGETDIR)/fts2p.test \
+	$(TARGETDIR)/fts2q.test \
+	$(TARGETDIR)/fts2r.test \
+	$(TARGETDIR)/fts2token.test \
+	$(TARGETDIR)/fts3.test \
+	$(TARGETDIR)/fts3aa.test \
+	$(TARGETDIR)/fts3ab.test \
+	$(TARGETDIR)/fts3ac.test \
+	$(TARGETDIR)/fts3ad.test \
+	$(TARGETDIR)/fts3ae.test \
+	$(TARGETDIR)/fts3af.test \
+	$(TARGETDIR)/fts3ag.test \
+	$(TARGETDIR)/fts3ah.test \
+	$(TARGETDIR)/fts3ai.test \
+	$(TARGETDIR)/fts3aj.test \
+	$(TARGETDIR)/fts3ak.test \
+	$(TARGETDIR)/fts3al.test \
+	$(TARGETDIR)/fts3am.test \
+	$(TARGETDIR)/fts3an.test \
+	$(TARGETDIR)/fts3ao.test \
+	$(TARGETDIR)/fts3atoken.test \
+	$(TARGETDIR)/fts3b.test \
+	$(TARGETDIR)/fts3c.test \
+	$(TARGETDIR)/fts3d.test \
+	$(TARGETDIR)/fts3e.test \
+	$(TARGETDIR)/fts3near.test \
+	$(TARGETDIR)/func.test \
+	$(TARGETDIR)/fuzz.test \
+	$(TARGETDIR)/fuzz2.test \
+	$(TARGETDIR)/fuzz_malloc.test \
+	$(TARGETDIR)/hook.test \
+	$(TARGETDIR)/icu.test \
+	$(TARGETDIR)/in.test \
+	$(TARGETDIR)/in2.test \
+	$(TARGETDIR)/in3.test \
+	$(TARGETDIR)/incrblob.test \
+	$(TARGETDIR)/incrblob2.test \
+	$(TARGETDIR)/incrblob_err.test \
+	$(TARGETDIR)/incrvacuum.test \
+	$(TARGETDIR)/incrvacuum2.test \
+	$(TARGETDIR)/incrvacuum_ioerr.test \
+	$(TARGETDIR)/index.test \
+	$(TARGETDIR)/index2.test \
+	$(TARGETDIR)/index3.test \
+	$(TARGETDIR)/insert.test \
+	$(TARGETDIR)/insert2.test \
+	$(TARGETDIR)/insert3.test \
+	$(TARGETDIR)/insert4.test \
+	$(TARGETDIR)/insert5.test \
+	$(TARGETDIR)/interrupt.test \
+	$(TARGETDIR)/intpkey.test \
+	$(TARGETDIR)/io.test \
+	$(TARGETDIR)/ioerr.test \
+	$(TARGETDIR)/ioerr2.test \
+	$(TARGETDIR)/ioerr3.test \
+	$(TARGETDIR)/ioerr4.test \
+	$(TARGETDIR)/ioerr5.test \
+	$(TARGETDIR)/join.test \
+	$(TARGETDIR)/join2.test \
+	$(TARGETDIR)/join3.test \
+	$(TARGETDIR)/join4.test \
+	$(TARGETDIR)/join5.test \
+	$(TARGETDIR)/journal1.test \
+	$(TARGETDIR)/jrnlmode.test \
+	$(TARGETDIR)/lastinsert.test \
+	$(TARGETDIR)/laststmtchanges.test \
+	$(TARGETDIR)/like.test \
+	$(TARGETDIR)/like2.test \
+	$(TARGETDIR)/limit.test \
+	$(TARGETDIR)/loadext.test \
+	$(TARGETDIR)/loadext2.test \
+	$(TARGETDIR)/lock.test \
+	$(TARGETDIR)/lock2.test \
+	$(TARGETDIR)/lock3.test \
+	$(TARGETDIR)/lock4.test \
+	$(TARGETDIR)/lock5.test \
+	$(TARGETDIR)/lookaside.test \
+	$(TARGETDIR)/main.test \
+	$(TARGETDIR)/malloc.test \
+	$(TARGETDIR)/malloc3.test \
+	$(TARGETDIR)/malloc4.test \
+	$(TARGETDIR)/malloc5.test \
+	$(TARGETDIR)/malloc6.test \
+	$(TARGETDIR)/malloc7.test \
+	$(TARGETDIR)/malloc8.test \
+	$(TARGETDIR)/malloc9.test \
+	$(TARGETDIR)/mallocA.test \
+	$(TARGETDIR)/mallocAll.test \
+	$(TARGETDIR)/mallocB.test \
+	$(TARGETDIR)/mallocC.test \
+	$(TARGETDIR)/mallocD.test \
+	$(TARGETDIR)/mallocE.test \
+	$(TARGETDIR)/mallocF.test \
+	$(TARGETDIR)/mallocG.test \
+	$(TARGETDIR)/mallocH.test \
+	$(TARGETDIR)/mallocI.test \
+	$(TARGETDIR)/manydb.test \
+	$(TARGETDIR)/memdb.test \
+	$(TARGETDIR)/memleak.test \
+	$(TARGETDIR)/memsubsys1.test \
+	$(TARGETDIR)/memsubsys2.test \
+	$(TARGETDIR)/minmax.test \
+	$(TARGETDIR)/minmax2.test \
+	$(TARGETDIR)/minmax3.test \
+	$(TARGETDIR)/misc1.test \
+	$(TARGETDIR)/misc2.test \
+	$(TARGETDIR)/misc3.test \
+	$(TARGETDIR)/misc4.test \
+	$(TARGETDIR)/misc5.test \
+	$(TARGETDIR)/misc6.test \
+	$(TARGETDIR)/misc7.test \
+	$(TARGETDIR)/misuse.test \
+	$(TARGETDIR)/mutex1.test \
+	$(TARGETDIR)/mutex2.test \
+	$(TARGETDIR)/nan.test \
+	$(TARGETDIR)/notnull.test \
+	$(TARGETDIR)/null.test \
+	$(TARGETDIR)/openv2.test \
+	$(TARGETDIR)/pager.test \
+	$(TARGETDIR)/pager2.test \
+	$(TARGETDIR)/pager3.test \
+	$(TARGETDIR)/pageropt.test \
+	$(TARGETDIR)/pagesize.test \
+	$(TARGETDIR)/pcache.test \
+	$(TARGETDIR)/permutations.test \
+	$(TARGETDIR)/pragma.test \
+	$(TARGETDIR)/pragma2.test \
+	$(TARGETDIR)/printf.test \
+	$(TARGETDIR)/progress.test \
+	$(TARGETDIR)/ptrchng.test \
+	$(TARGETDIR)/quick.test \
+	$(TARGETDIR)/quote.test \
+	$(TARGETDIR)/rdonly.test \
+	$(TARGETDIR)/reindex.test \
+	$(TARGETDIR)/rollback.test \
+	$(TARGETDIR)/rowid.test \
+	$(TARGETDIR)/rtree.test \
+	$(TARGETDIR)/safety.test \
+	$(TARGETDIR)/schema.test \
+	$(TARGETDIR)/schema2.test \
+	$(TARGETDIR)/select1.test \
+	$(TARGETDIR)/select2.test \
+	$(TARGETDIR)/select3.test \
+	$(TARGETDIR)/select4.test \
+	$(TARGETDIR)/select5.test \
+	$(TARGETDIR)/select6.test \
+	$(TARGETDIR)/select7.test \
+	$(TARGETDIR)/select8.test \
+	$(TARGETDIR)/select9.test \
+	$(TARGETDIR)/selectA.test \
+	$(TARGETDIR)/selectB.test \
+	$(TARGETDIR)/server1.test \
+	$(TARGETDIR)/shared.test \
+	$(TARGETDIR)/shared2.test \
+	$(TARGETDIR)/shared3.test \
+	$(TARGETDIR)/shared4.test \
+	$(TARGETDIR)/shared_err.test \
+	$(TARGETDIR)/shortread1.test \
+	$(TARGETDIR)/sidedelete.test \
+	$(TARGETDIR)/soak.test \
+	$(TARGETDIR)/softheap1.test \
+	$(TARGETDIR)/sort.test \
+	$(TARGETDIR)/speed1.test \
+	$(TARGETDIR)/speed1p.test \
+	$(TARGETDIR)/speed2.test \
+	$(TARGETDIR)/speed3.test \
+	$(TARGETDIR)/speed4.test \
+	$(TARGETDIR)/speed4p.test \
+	$(TARGETDIR)/sqllimits1.test \
+	$(TARGETDIR)/subquery.test \
+	$(TARGETDIR)/subselect.test \
+	$(TARGETDIR)/substr.test \
+	$(TARGETDIR)/sync.test \
+	$(TARGETDIR)/table.test \
+	$(TARGETDIR)/tableapi.test \
+	$(TARGETDIR)/tclsqlite.test \
+	$(TARGETDIR)/tempdb.test \
+	$(TARGETDIR)/temptable.test \
+	$(TARGETDIR)/thread001.test \
+	$(TARGETDIR)/thread002.test \
+	$(TARGETDIR)/thread003.test \
+	$(TARGETDIR)/thread1.test \
+	$(TARGETDIR)/thread2.test \
+	$(TARGETDIR)/tkt1435.test \
+	$(TARGETDIR)/tkt1443.test \
+	$(TARGETDIR)/tkt1444.test \
+	$(TARGETDIR)/tkt1449.test \
+	$(TARGETDIR)/tkt1473.test \
+	$(TARGETDIR)/tkt1501.test \
+	$(TARGETDIR)/tkt1512.test \
+	$(TARGETDIR)/tkt1514.test \
+	$(TARGETDIR)/tkt1536.test \
+	$(TARGETDIR)/tkt1537.test \
+	$(TARGETDIR)/tkt1567.test \
+	$(TARGETDIR)/tkt1644.test \
+	$(TARGETDIR)/tkt1667.test \
+	$(TARGETDIR)/tkt1873.test \
+	$(TARGETDIR)/tkt2141.test \
+	$(TARGETDIR)/tkt2192.test \
+	$(TARGETDIR)/tkt2213.test \
+	$(TARGETDIR)/tkt2251.test \
+	$(TARGETDIR)/tkt2285.test \
+	$(TARGETDIR)/tkt2332.test \
+	$(TARGETDIR)/tkt2339.test \
+	$(TARGETDIR)/tkt2391.test \
+	$(TARGETDIR)/tkt2409.test \
+	$(TARGETDIR)/tkt2450.test \
+	$(TARGETDIR)/tkt2640.test \
+	$(TARGETDIR)/tkt2643.test \
+	$(TARGETDIR)/tkt2686.test \
+	$(TARGETDIR)/tkt2767.test \
+	$(TARGETDIR)/tkt2817.test \
+	$(TARGETDIR)/tkt2820.test \
+	$(TARGETDIR)/tkt2822.test \
+	$(TARGETDIR)/tkt2832.test \
+	$(TARGETDIR)/tkt2854.test \
+	$(TARGETDIR)/tkt2920.test \
+	$(TARGETDIR)/tkt2927.test \
+	$(TARGETDIR)/tkt2942.test \
+	$(TARGETDIR)/tkt3080.test \
+	$(TARGETDIR)/tkt3093.test \
+	$(TARGETDIR)/tkt3121.test \
+	$(TARGETDIR)/tkt3201.test \
+	$(TARGETDIR)/tkt3292.test \
+	$(TARGETDIR)/tkt3298.test \
+	$(TARGETDIR)/tkt3334.test \
+	$(TARGETDIR)/tokenize.test \
+	$(TARGETDIR)/trace.test \
+	$(TARGETDIR)/trans.test \
+	$(TARGETDIR)/trans2.test \
+	$(TARGETDIR)/trigger1.test \
+	$(TARGETDIR)/trigger2.test \
+	$(TARGETDIR)/trigger3.test \
+	$(TARGETDIR)/trigger4.test \
+	$(TARGETDIR)/trigger5.test \
+	$(TARGETDIR)/trigger6.test \
+	$(TARGETDIR)/trigger7.test \
+	$(TARGETDIR)/trigger8.test \
+	$(TARGETDIR)/trigger9.test \
+	$(TARGETDIR)/triggerA.test \
+	$(TARGETDIR)/triggerB.test \
+	$(TARGETDIR)/types.test \
+	$(TARGETDIR)/types2.test \
+	$(TARGETDIR)/types3.test \
+	$(TARGETDIR)/unique.test \
+	$(TARGETDIR)/update.test \
+	$(TARGETDIR)/utf16align.test \
+	$(TARGETDIR)/vacuum.test \
+	$(TARGETDIR)/vacuum2.test \
+	$(TARGETDIR)/vacuum3.test \
+	$(TARGETDIR)/varint.test \
+	$(TARGETDIR)/veryquick.test \
+	$(TARGETDIR)/view.test \
+	$(TARGETDIR)/vtab1.test \
+	$(TARGETDIR)/vtab2.test \
+	$(TARGETDIR)/vtab3.test \
+	$(TARGETDIR)/vtab4.test \
+	$(TARGETDIR)/vtab5.test \
+	$(TARGETDIR)/vtab6.test \
+	$(TARGETDIR)/vtab7.test \
+	$(TARGETDIR)/vtab8.test \
+	$(TARGETDIR)/vtab9.test \
+	$(TARGETDIR)/vtabA.test \
+	$(TARGETDIR)/vtabB.test \
+	$(TARGETDIR)/vtabC.test \
+	$(TARGETDIR)/vtab_alter.test \
+	$(TARGETDIR)/vtab_err.test \
+	$(TARGETDIR)/vtab_shared.test \
+	$(TARGETDIR)/where.test \
+	$(TARGETDIR)/where2.test \
+	$(TARGETDIR)/where3.test \
+	$(TARGETDIR)/where4.test \
+	$(TARGETDIR)/where5.test \
+	$(TARGETDIR)/where6.test \
+	$(TARGETDIR)/zeroblob.test
+
+
+$(TARGETDIR):
+	$(call createdir, "$@")
+	
+COPYFILES :
+	$(call forcecopy,$(SOURCEDIR)/speed1p.explain,$(TARGETDIR)/speed1p.explain)
+	$(call forcecopy,$(SOURCEDIR)/speed4p.explain,$(TARGETDIR)/speed4p.explain)
+	$(call forcecopy,$(SOURCEDIR)/fuzz_common.tcl,$(TARGETDIR)/fuzz_common.tcl)
+	$(call forcecopy,$(SOURCEDIR)/malloc_common.tcl,$(TARGETDIR)/malloc_common.tcl)
+	$(call forcecopy,$(SOURCEDIR)/tester.tcl,$(TARGETDIR)/tester.tcl)
+	$(call forcecopy,$(SOURCEDIR)/thread_common.tcl,$(TARGETDIR)/thread_common.tcl)
+	$(call forcecopy,$(SOURCEDIR)/trans2.test.gz,$(TARGETDIR)/trans2.test.gz)
+	$(call forcecopy,$(SOURCEDIR)/aggerror.test,$(TARGETDIR)/aggerror.test)
+	$(call forcecopy,$(SOURCEDIR)/alias.test,$(TARGETDIR)/alias.test)
+	$(call forcecopy,$(SOURCEDIR)/all.test,$(TARGETDIR)/all.test)
+	$(call forcecopy,$(SOURCEDIR)/alter.test,$(TARGETDIR)/alter.test)
+	$(call forcecopy,$(SOURCEDIR)/alter2.test,$(TARGETDIR)/alter2.test)
+	$(call forcecopy,$(SOURCEDIR)/alter3.test,$(TARGETDIR)/alter3.test)
+	$(call forcecopy,$(SOURCEDIR)/altermalloc.test,$(TARGETDIR)/altermalloc.test)
+	$(call forcecopy,$(SOURCEDIR)/analyze.test,$(TARGETDIR)/analyze.test)
+	$(call forcecopy,$(SOURCEDIR)/async.test,$(TARGETDIR)/async.test)
+	$(call forcecopy,$(SOURCEDIR)/async2.test,$(TARGETDIR)/async2.test)
+	$(call forcecopy,$(SOURCEDIR)/async3.test,$(TARGETDIR)/async3.test)
+	$(call forcecopy,$(SOURCEDIR)/attach.test,$(TARGETDIR)/attach.test)
+	$(call forcecopy,$(SOURCEDIR)/attach2.test,$(TARGETDIR)/attach2.test)
+	$(call forcecopy,$(SOURCEDIR)/attach3.test,$(TARGETDIR)/attach3.test)
+	$(call forcecopy,$(SOURCEDIR)/attachmalloc.test,$(TARGETDIR)/attachmalloc.test)
+	$(call forcecopy,$(SOURCEDIR)/auth.test,$(TARGETDIR)/auth.test)
+	$(call forcecopy,$(SOURCEDIR)/auth2.test,$(TARGETDIR)/auth2.test)
+	$(call forcecopy,$(SOURCEDIR)/autoinc.test,$(TARGETDIR)/autoinc.test)
+	$(call forcecopy,$(SOURCEDIR)/autovacuum.test,$(TARGETDIR)/autovacuum.test)
+	$(call forcecopy,$(SOURCEDIR)/autovacuum_ioerr2.test,$(TARGETDIR)/autovacuum_ioerr2.test)
+	$(call forcecopy,$(SOURCEDIR)/avtrans.test,$(TARGETDIR)/avtrans.test)
+	$(call forcecopy,$(SOURCEDIR)/badutf.test,$(TARGETDIR)/badutf.test)
+	$(call forcecopy,$(SOURCEDIR)/between.test,$(TARGETDIR)/between.test)
+	$(call forcecopy,$(SOURCEDIR)/bigfile.test,$(TARGETDIR)/bigfile.test)
+	$(call forcecopy,$(SOURCEDIR)/bigrow.test,$(TARGETDIR)/bigrow.test)
+	$(call forcecopy,$(SOURCEDIR)/bind.test,$(TARGETDIR)/bind.test)
+	$(call forcecopy,$(SOURCEDIR)/bindxfer.test,$(TARGETDIR)/bindxfer.test)
+	$(call forcecopy,$(SOURCEDIR)/bitvec.test,$(TARGETDIR)/bitvec.test)
+	$(call forcecopy,$(SOURCEDIR)/blob.test,$(TARGETDIR)/blob.test)
+	$(call forcecopy,$(SOURCEDIR)/busy.test,$(TARGETDIR)/busy.test)
+	$(call forcecopy,$(SOURCEDIR)/cache.test,$(TARGETDIR)/cache.test)
+	$(call forcecopy,$(SOURCEDIR)/capi2.test,$(TARGETDIR)/capi2.test)
+	$(call forcecopy,$(SOURCEDIR)/capi3.test,$(TARGETDIR)/capi3.test)
+	$(call forcecopy,$(SOURCEDIR)/capi3b.test,$(TARGETDIR)/capi3b.test)
+	$(call forcecopy,$(SOURCEDIR)/capi3c.test,$(TARGETDIR)/capi3c.test)
+	$(call forcecopy,$(SOURCEDIR)/capi3d.test,$(TARGETDIR)/capi3d.test)
+	$(call forcecopy,$(SOURCEDIR)/cast.test,$(TARGETDIR)/cast.test)
+	$(call forcecopy,$(SOURCEDIR)/check.test,$(TARGETDIR)/check.test)
+	$(call forcecopy,$(SOURCEDIR)/collate1.test,$(TARGETDIR)/collate1.test)
+	$(call forcecopy,$(SOURCEDIR)/collate2.test,$(TARGETDIR)/collate2.test)
+	$(call forcecopy,$(SOURCEDIR)/collate3.test,$(TARGETDIR)/collate3.test)
+	$(call forcecopy,$(SOURCEDIR)/collate4.test,$(TARGETDIR)/collate4.test)
+	$(call forcecopy,$(SOURCEDIR)/collate5.test,$(TARGETDIR)/collate5.test)
+	$(call forcecopy,$(SOURCEDIR)/collate6.test,$(TARGETDIR)/collate6.test)
+	$(call forcecopy,$(SOURCEDIR)/collate7.test,$(TARGETDIR)/collate7.test)
+	$(call forcecopy,$(SOURCEDIR)/collate8.test,$(TARGETDIR)/collate8.test)
+	$(call forcecopy,$(SOURCEDIR)/collate9.test,$(TARGETDIR)/collate9.test)
+	$(call forcecopy,$(SOURCEDIR)/collateA.test,$(TARGETDIR)/collateA.test)
+	$(call forcecopy,$(SOURCEDIR)/colmeta.test,$(TARGETDIR)/colmeta.test)
+	$(call forcecopy,$(SOURCEDIR)/colname.test,$(TARGETDIR)/colname.test)
+	$(call forcecopy,$(SOURCEDIR)/conflict.test,$(TARGETDIR)/conflict.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt.test,$(TARGETDIR)/corrupt.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt2.test,$(TARGETDIR)/corrupt2.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt3.test,$(TARGETDIR)/corrupt3.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt4.test,$(TARGETDIR)/corrupt4.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt5.test,$(TARGETDIR)/corrupt5.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt6.test,$(TARGETDIR)/corrupt6.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt7.test,$(TARGETDIR)/corrupt7.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt8.test,$(TARGETDIR)/corrupt8.test)
+	$(call forcecopy,$(SOURCEDIR)/corrupt9.test,$(TARGETDIR)/corrupt9.test)
+	$(call forcecopy,$(SOURCEDIR)/corruptA.test,$(TARGETDIR)/corruptA.test)
+	$(call forcecopy,$(SOURCEDIR)/crash.test,$(TARGETDIR)/crash.test)
+	$(call forcecopy,$(SOURCEDIR)/crash2.test,$(TARGETDIR)/crash2.test)
+	$(call forcecopy,$(SOURCEDIR)/crash3.test,$(TARGETDIR)/crash3.test)
+	$(call forcecopy,$(SOURCEDIR)/crash4.test,$(TARGETDIR)/crash4.test)
+	$(call forcecopy,$(SOURCEDIR)/crash5.test,$(TARGETDIR)/crash5.test)
+	$(call forcecopy,$(SOURCEDIR)/crash6.test,$(TARGETDIR)/crash6.test)
+	$(call forcecopy,$(SOURCEDIR)/crash7.test,$(TARGETDIR)/crash7.test)
+	$(call forcecopy,$(SOURCEDIR)/createtab.test,$(TARGETDIR)/createtab.test)
+	$(call forcecopy,$(SOURCEDIR)/cse.test,$(TARGETDIR)/cse.test)
+	$(call forcecopy,$(SOURCEDIR)/date.test,$(TARGETDIR)/date.test)
+	$(call forcecopy,$(SOURCEDIR)/default.test,$(TARGETDIR)/default.test)
+	$(call forcecopy,$(SOURCEDIR)/delete.test,$(TARGETDIR)/delete.test)
+	$(call forcecopy,$(SOURCEDIR)/delete2.test,$(TARGETDIR)/delete2.test)
+	$(call forcecopy,$(SOURCEDIR)/delete3.test,$(TARGETDIR)/delete3.test)
+	$(call forcecopy,$(SOURCEDIR)/descidx1.test,$(TARGETDIR)/descidx1.test)
+	$(call forcecopy,$(SOURCEDIR)/descidx2.test,$(TARGETDIR)/descidx2.test)
+	$(call forcecopy,$(SOURCEDIR)/descidx3.test,$(TARGETDIR)/descidx3.test)
+	$(call forcecopy,$(SOURCEDIR)/diskfull.test,$(TARGETDIR)/diskfull.test)
+	$(call forcecopy,$(SOURCEDIR)/distinctagg.test,$(TARGETDIR)/distinctagg.test)
+	$(call forcecopy,$(SOURCEDIR)/enc.test,$(TARGETDIR)/enc.test)
+	$(call forcecopy,$(SOURCEDIR)/enc2.test,$(TARGETDIR)/enc2.test)
+	$(call forcecopy,$(SOURCEDIR)/enc3.test,$(TARGETDIR)/enc3.test)
+	$(call forcecopy,$(SOURCEDIR)/eval.test,$(TARGETDIR)/eval.test)
+	$(call forcecopy,$(SOURCEDIR)/exclusive.test,$(TARGETDIR)/exclusive.test)
+	$(call forcecopy,$(SOURCEDIR)/exclusive2.test,$(TARGETDIR)/exclusive2.test)
+	$(call forcecopy,$(SOURCEDIR)/exec.test,$(TARGETDIR)/exec.test)
+	$(call forcecopy,$(SOURCEDIR)/expr.test,$(TARGETDIR)/expr.test)
+	$(call forcecopy,$(SOURCEDIR)/filectrl.test,$(TARGETDIR)/filectrl.test)
+	$(call forcecopy,$(SOURCEDIR)/filefmt.test,$(TARGETDIR)/filefmt.test)
+	$(call forcecopy,$(SOURCEDIR)/fkey1.test,$(TARGETDIR)/fkey1.test)
+	$(call forcecopy,$(SOURCEDIR)/format4.test,$(TARGETDIR)/format4.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1a.test,$(TARGETDIR)/fts1a.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1b.test,$(TARGETDIR)/fts1b.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1c.test,$(TARGETDIR)/fts1c.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1d.test,$(TARGETDIR)/fts1d.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1e.test,$(TARGETDIR)/fts1e.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1f.test,$(TARGETDIR)/fts1f.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1i.test,$(TARGETDIR)/fts1i.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1j.test,$(TARGETDIR)/fts1j.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1k.test,$(TARGETDIR)/fts1k.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1l.test,$(TARGETDIR)/fts1l.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1m.test,$(TARGETDIR)/fts1m.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1n.test,$(TARGETDIR)/fts1n.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1o.test,$(TARGETDIR)/fts1o.test)
+	$(call forcecopy,$(SOURCEDIR)/fts1porter.test,$(TARGETDIR)/fts1porter.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2.test,$(TARGETDIR)/fts2.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2a.test,$(TARGETDIR)/fts2a.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2b.test,$(TARGETDIR)/fts2b.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2c.test,$(TARGETDIR)/fts2c.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2d.test,$(TARGETDIR)/fts2d.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2e.test,$(TARGETDIR)/fts2e.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2f.test,$(TARGETDIR)/fts2f.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2g.test,$(TARGETDIR)/fts2g.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2h.test,$(TARGETDIR)/fts2h.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2i.test,$(TARGETDIR)/fts2i.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2j.test,$(TARGETDIR)/fts2j.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2k.test,$(TARGETDIR)/fts2k.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2l.test,$(TARGETDIR)/fts2l.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2m.test,$(TARGETDIR)/fts2m.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2n.test,$(TARGETDIR)/fts2n.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2o.test,$(TARGETDIR)/fts2o.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2p.test,$(TARGETDIR)/fts2p.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2q.test,$(TARGETDIR)/fts2q.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2r.test,$(TARGETDIR)/fts2r.test)
+	$(call forcecopy,$(SOURCEDIR)/fts2token.test,$(TARGETDIR)/fts2token.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3.test,$(TARGETDIR)/fts3.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3aa.test,$(TARGETDIR)/fts3aa.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ab.test,$(TARGETDIR)/fts3ab.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ac.test,$(TARGETDIR)/fts3ac.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ad.test,$(TARGETDIR)/fts3ad.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ae.test,$(TARGETDIR)/fts3ae.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3af.test,$(TARGETDIR)/fts3af.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ag.test,$(TARGETDIR)/fts3ag.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ah.test,$(TARGETDIR)/fts3ah.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ai.test,$(TARGETDIR)/fts3ai.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3aj.test,$(TARGETDIR)/fts3aj.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ak.test,$(TARGETDIR)/fts3ak.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3al.test,$(TARGETDIR)/fts3al.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3am.test,$(TARGETDIR)/fts3am.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3an.test,$(TARGETDIR)/fts3an.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3ao.test,$(TARGETDIR)/fts3ao.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3atoken.test,$(TARGETDIR)/fts3atoken.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3b.test,$(TARGETDIR)/fts3b.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3c.test,$(TARGETDIR)/fts3c.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3d.test,$(TARGETDIR)/fts3d.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3e.test,$(TARGETDIR)/fts3e.test)
+	$(call forcecopy,$(SOURCEDIR)/fts3near.test,$(TARGETDIR)/fts3near.test)
+	$(call forcecopy,$(SOURCEDIR)/func.test,$(TARGETDIR)/func.test)
+	$(call forcecopy,$(SOURCEDIR)/fuzz.test,$(TARGETDIR)/fuzz.test)
+	$(call forcecopy,$(SOURCEDIR)/fuzz2.test,$(TARGETDIR)/fuzz2.test)
+	$(call forcecopy,$(SOURCEDIR)/fuzz_malloc.test,$(TARGETDIR)/fuzz_malloc.test)
+	$(call forcecopy,$(SOURCEDIR)/hook.test,$(TARGETDIR)/hook.test)
+	$(call forcecopy,$(SOURCEDIR)/icu.test,$(TARGETDIR)/icu.test)
+	$(call forcecopy,$(SOURCEDIR)/in.test,$(TARGETDIR)/in.test)
+	$(call forcecopy,$(SOURCEDIR)/in2.test,$(TARGETDIR)/in2.test)
+	$(call forcecopy,$(SOURCEDIR)/in3.test,$(TARGETDIR)/in3.test)
+	$(call forcecopy,$(SOURCEDIR)/incrblob.test,$(TARGETDIR)/incrblob.test)
+	$(call forcecopy,$(SOURCEDIR)/incrblob2.test,$(TARGETDIR)/incrblob2.test)
+	$(call forcecopy,$(SOURCEDIR)/incrblob_err.test,$(TARGETDIR)/incrblob_err.test)
+	$(call forcecopy,$(SOURCEDIR)/incrvacuum.test,$(TARGETDIR)/incrvacuum.test)
+	$(call forcecopy,$(SOURCEDIR)/incrvacuum2.test,$(TARGETDIR)/incrvacuum2.test)
+	$(call forcecopy,$(SOURCEDIR)/incrvacuum_ioerr.test,$(TARGETDIR)/incrvacuum_ioerr.test)
+	$(call forcecopy,$(SOURCEDIR)/index.test,$(TARGETDIR)/index.test)
+	$(call forcecopy,$(SOURCEDIR)/index2.test,$(TARGETDIR)/index2.test)
+	$(call forcecopy,$(SOURCEDIR)/index3.test,$(TARGETDIR)/index3.test)
+	$(call forcecopy,$(SOURCEDIR)/insert.test,$(TARGETDIR)/insert.test)
+	$(call forcecopy,$(SOURCEDIR)/insert2.test,$(TARGETDIR)/insert2.test)
+	$(call forcecopy,$(SOURCEDIR)/insert3.test,$(TARGETDIR)/insert3.test)
+	$(call forcecopy,$(SOURCEDIR)/insert4.test,$(TARGETDIR)/insert4.test)
+	$(call forcecopy,$(SOURCEDIR)/insert5.test,$(TARGETDIR)/insert5.test)
+	$(call forcecopy,$(SOURCEDIR)/interrupt.test,$(TARGETDIR)/interrupt.test)
+	$(call forcecopy,$(SOURCEDIR)/intpkey.test,$(TARGETDIR)/intpkey.test)
+	$(call forcecopy,$(SOURCEDIR)/io.test,$(TARGETDIR)/io.test)
+	$(call forcecopy,$(SOURCEDIR)/ioerr.test,$(TARGETDIR)/ioerr.test)
+	$(call forcecopy,$(SOURCEDIR)/ioerr2.test,$(TARGETDIR)/ioerr2.test)
+	$(call forcecopy,$(SOURCEDIR)/ioerr3.test,$(TARGETDIR)/ioerr3.test)
+	$(call forcecopy,$(SOURCEDIR)/ioerr4.test,$(TARGETDIR)/ioerr4.test)
+	$(call forcecopy,$(SOURCEDIR)/ioerr5.test,$(TARGETDIR)/ioerr5.test)
+	$(call forcecopy,$(SOURCEDIR)/join.test,$(TARGETDIR)/join.test)
+	$(call forcecopy,$(SOURCEDIR)/join2.test,$(TARGETDIR)/join2.test)
+	$(call forcecopy,$(SOURCEDIR)/join3.test,$(TARGETDIR)/join3.test)
+	$(call forcecopy,$(SOURCEDIR)/join4.test,$(TARGETDIR)/join4.test)
+	$(call forcecopy,$(SOURCEDIR)/join5.test,$(TARGETDIR)/join5.test)
+	$(call forcecopy,$(SOURCEDIR)/journal1.test,$(TARGETDIR)/journal1.test)
+	$(call forcecopy,$(SOURCEDIR)/jrnlmode.test,$(TARGETDIR)/jrnlmode.test)
+	$(call forcecopy,$(SOURCEDIR)/lastinsert.test,$(TARGETDIR)/lastinsert.test)
+	$(call forcecopy,$(SOURCEDIR)/laststmtchanges.test,$(TARGETDIR)/laststmtchanges.test)
+	$(call forcecopy,$(SOURCEDIR)/like.test,$(TARGETDIR)/like.test)
+	$(call forcecopy,$(SOURCEDIR)/like2.test,$(TARGETDIR)/like2.test)
+	$(call forcecopy,$(SOURCEDIR)/limit.test,$(TARGETDIR)/limit.test)
+	$(call forcecopy,$(SOURCEDIR)/loadext.test,$(TARGETDIR)/loadext.test)
+	$(call forcecopy,$(SOURCEDIR)/loadext2.test,$(TARGETDIR)/loadext2.test)
+	$(call forcecopy,$(SOURCEDIR)/lock.test,$(TARGETDIR)/lock.test)
+	$(call forcecopy,$(SOURCEDIR)/lock2.test,$(TARGETDIR)/lock2.test)
+	$(call forcecopy,$(SOURCEDIR)/lock3.test,$(TARGETDIR)/lock3.test)
+	$(call forcecopy,$(SOURCEDIR)/lock4.test,$(TARGETDIR)/lock4.test)
+	$(call forcecopy,$(SOURCEDIR)/lock5.test,$(TARGETDIR)/lock5.test)
+	$(call forcecopy,$(SOURCEDIR)/lookaside.test,$(TARGETDIR)/lookaside.test)
+	$(call forcecopy,$(SOURCEDIR)/main.test,$(TARGETDIR)/main.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc.test,$(TARGETDIR)/malloc.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc3.test,$(TARGETDIR)/malloc3.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc4.test,$(TARGETDIR)/malloc4.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc5.test,$(TARGETDIR)/malloc5.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc6.test,$(TARGETDIR)/malloc6.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc7.test,$(TARGETDIR)/malloc7.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc8.test,$(TARGETDIR)/malloc8.test)
+	$(call forcecopy,$(SOURCEDIR)/malloc9.test,$(TARGETDIR)/malloc9.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocA.test,$(TARGETDIR)/mallocA.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocAll.test,$(TARGETDIR)/mallocAll.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocB.test,$(TARGETDIR)/mallocB.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocC.test,$(TARGETDIR)/mallocC.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocD.test,$(TARGETDIR)/mallocD.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocE.test,$(TARGETDIR)/mallocE.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocF.test,$(TARGETDIR)/mallocF.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocG.test,$(TARGETDIR)/mallocG.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocH.test,$(TARGETDIR)/mallocH.test)
+	$(call forcecopy,$(SOURCEDIR)/mallocI.test,$(TARGETDIR)/mallocI.test)
+	$(call forcecopy,$(SOURCEDIR)/manydb.test,$(TARGETDIR)/manydb.test)
+	$(call forcecopy,$(SOURCEDIR)/memdb.test,$(TARGETDIR)/memdb.test)
+	$(call forcecopy,$(SOURCEDIR)/memleak.test,$(TARGETDIR)/memleak.test)
+	$(call forcecopy,$(SOURCEDIR)/memsubsys1.test,$(TARGETDIR)/memsubsys1.test)
+	$(call forcecopy,$(SOURCEDIR)/memsubsys2.test,$(TARGETDIR)/memsubsys2.test)
+	$(call forcecopy,$(SOURCEDIR)/minmax.test,$(TARGETDIR)/minmax.test)
+	$(call forcecopy,$(SOURCEDIR)/minmax2.test,$(TARGETDIR)/minmax2.test)
+	$(call forcecopy,$(SOURCEDIR)/minmax3.test,$(TARGETDIR)/minmax3.test)
+	$(call forcecopy,$(SOURCEDIR)/misc1.test,$(TARGETDIR)/misc1.test)
+	$(call forcecopy,$(SOURCEDIR)/misc2.test,$(TARGETDIR)/misc2.test)
+	$(call forcecopy,$(SOURCEDIR)/misc3.test,$(TARGETDIR)/misc3.test)
+	$(call forcecopy,$(SOURCEDIR)/misc4.test,$(TARGETDIR)/misc4.test)
+	$(call forcecopy,$(SOURCEDIR)/misc5.test,$(TARGETDIR)/misc5.test)
+	$(call forcecopy,$(SOURCEDIR)/misc6.test,$(TARGETDIR)/misc6.test)
+	$(call forcecopy,$(SOURCEDIR)/misc7.test,$(TARGETDIR)/misc7.test)
+	$(call forcecopy,$(SOURCEDIR)/misuse.test,$(TARGETDIR)/misuse.test)
+	$(call forcecopy,$(SOURCEDIR)/mutex1.test,$(TARGETDIR)/mutex1.test)
+	$(call forcecopy,$(SOURCEDIR)/mutex2.test,$(TARGETDIR)/mutex2.test)
+	$(call forcecopy,$(SOURCEDIR)/nan.test,$(TARGETDIR)/nan.test)
+	$(call forcecopy,$(SOURCEDIR)/notnull.test,$(TARGETDIR)/notnull.test)
+	$(call forcecopy,$(SOURCEDIR)/null.test,$(TARGETDIR)/null.test)
+	$(call forcecopy,$(SOURCEDIR)/openv2.test,$(TARGETDIR)/openv2.test)
+	$(call forcecopy,$(SOURCEDIR)/pager.test,$(TARGETDIR)/pager.test)
+	$(call forcecopy,$(SOURCEDIR)/pager2.test,$(TARGETDIR)/pager2.test)
+	$(call forcecopy,$(SOURCEDIR)/pager3.test,$(TARGETDIR)/pager3.test)
+	$(call forcecopy,$(SOURCEDIR)/pageropt.test,$(TARGETDIR)/pageropt.test)
+	$(call forcecopy,$(SOURCEDIR)/pagesize.test,$(TARGETDIR)/pagesize.test)
+	$(call forcecopy,$(SOURCEDIR)/pcache.test,$(TARGETDIR)/pcache.test)
+	$(call forcecopy,$(SOURCEDIR)/permutations.test,$(TARGETDIR)/permutations.test)
+	$(call forcecopy,$(SOURCEDIR)/pragma.test,$(TARGETDIR)/pragma.test)
+	$(call forcecopy,$(SOURCEDIR)/pragma2.test,$(TARGETDIR)/pragma2.test)
+	$(call forcecopy,$(SOURCEDIR)/printf.test,$(TARGETDIR)/printf.test)
+	$(call forcecopy,$(SOURCEDIR)/progress.test,$(TARGETDIR)/progress.test)
+	$(call forcecopy,$(SOURCEDIR)/ptrchng.test,$(TARGETDIR)/ptrchng.test)
+	$(call forcecopy,$(SOURCEDIR)/quick.test,$(TARGETDIR)/quick.test)
+	$(call forcecopy,$(SOURCEDIR)/quote.test,$(TARGETDIR)/quote.test)
+	$(call forcecopy,$(SOURCEDIR)/rdonly.test,$(TARGETDIR)/rdonly.test)
+	$(call forcecopy,$(SOURCEDIR)/reindex.test,$(TARGETDIR)/reindex.test)
+	$(call forcecopy,$(SOURCEDIR)/rollback.test,$(TARGETDIR)/rollback.test)
+	$(call forcecopy,$(SOURCEDIR)/rowid.test,$(TARGETDIR)/rowid.test)
+	$(call forcecopy,$(SOURCEDIR)/rtree.test,$(TARGETDIR)/rtree.test)
+	$(call forcecopy,$(SOURCEDIR)/safety.test,$(TARGETDIR)/safety.test)
+	$(call forcecopy,$(SOURCEDIR)/schema.test,$(TARGETDIR)/schema.test)
+	$(call forcecopy,$(SOURCEDIR)/schema2.test,$(TARGETDIR)/schema2.test)
+	$(call forcecopy,$(SOURCEDIR)/select1.test,$(TARGETDIR)/select1.test)
+	$(call forcecopy,$(SOURCEDIR)/select2.test,$(TARGETDIR)/select2.test)
+	$(call forcecopy,$(SOURCEDIR)/select3.test,$(TARGETDIR)/select3.test)
+	$(call forcecopy,$(SOURCEDIR)/select4.test,$(TARGETDIR)/select4.test)
+	$(call forcecopy,$(SOURCEDIR)/select5.test,$(TARGETDIR)/select5.test)
+	$(call forcecopy,$(SOURCEDIR)/select6.test,$(TARGETDIR)/select6.test)
+	$(call forcecopy,$(SOURCEDIR)/select7.test,$(TARGETDIR)/select7.test)
+	$(call forcecopy,$(SOURCEDIR)/select8.test,$(TARGETDIR)/select8.test)
+	$(call forcecopy,$(SOURCEDIR)/select9.test,$(TARGETDIR)/select9.test)
+	$(call forcecopy,$(SOURCEDIR)/selectA.test,$(TARGETDIR)/selectA.test)
+	$(call forcecopy,$(SOURCEDIR)/selectB.test,$(TARGETDIR)/selectB.test)
+	$(call forcecopy,$(SOURCEDIR)/server1.test,$(TARGETDIR)/server1.test)
+	$(call forcecopy,$(SOURCEDIR)/shared.test,$(TARGETDIR)/shared.test)
+	$(call forcecopy,$(SOURCEDIR)/shared2.test,$(TARGETDIR)/shared2.test)
+	$(call forcecopy,$(SOURCEDIR)/shared3.test,$(TARGETDIR)/shared3.test)
+	$(call forcecopy,$(SOURCEDIR)/shared4.test,$(TARGETDIR)/shared4.test)
+	$(call forcecopy,$(SOURCEDIR)/shared_err.test,$(TARGETDIR)/shared_err.test)
+	$(call forcecopy,$(SOURCEDIR)/shortread1.test,$(TARGETDIR)/shortread1.test)
+	$(call forcecopy,$(SOURCEDIR)/sidedelete.test,$(TARGETDIR)/sidedelete.test)
+	$(call forcecopy,$(SOURCEDIR)/soak.test,$(TARGETDIR)/soak.test)
+	$(call forcecopy,$(SOURCEDIR)/softheap1.test,$(TARGETDIR)/softheap1.test)
+	$(call forcecopy,$(SOURCEDIR)/sort.test,$(TARGETDIR)/sort.test)
+	$(call forcecopy,$(SOURCEDIR)/speed1.test,$(TARGETDIR)/speed1.test)
+	$(call forcecopy,$(SOURCEDIR)/speed1p.test,$(TARGETDIR)/speed1p.test)
+	$(call forcecopy,$(SOURCEDIR)/speed2.test,$(TARGETDIR)/speed2.test)
+	$(call forcecopy,$(SOURCEDIR)/speed3.test,$(TARGETDIR)/speed3.test)
+	$(call forcecopy,$(SOURCEDIR)/speed4.test,$(TARGETDIR)/speed4.test)
+	$(call forcecopy,$(SOURCEDIR)/speed4p.test,$(TARGETDIR)/speed4p.test)
+	$(call forcecopy,$(SOURCEDIR)/sqllimits1.test,$(TARGETDIR)/sqllimits1.test)
+	$(call forcecopy,$(SOURCEDIR)/subquery.test,$(TARGETDIR)/subquery.test)
+	$(call forcecopy,$(SOURCEDIR)/subselect.test,$(TARGETDIR)/subselect.test)
+	$(call forcecopy,$(SOURCEDIR)/substr.test,$(TARGETDIR)/substr.test)
+	$(call forcecopy,$(SOURCEDIR)/sync.test,$(TARGETDIR)/sync.test)
+	$(call forcecopy,$(SOURCEDIR)/table.test,$(TARGETDIR)/table.test)
+	$(call forcecopy,$(SOURCEDIR)/tableapi.test,$(TARGETDIR)/tableapi.test)
+	$(call forcecopy,$(SOURCEDIR)/tclsqlite.test,$(TARGETDIR)/tclsqlite.test)
+	$(call forcecopy,$(SOURCEDIR)/tempdb.test,$(TARGETDIR)/tempdb.test)
+	$(call forcecopy,$(SOURCEDIR)/temptable.test,$(TARGETDIR)/temptable.test)
+	$(call forcecopy,$(SOURCEDIR)/thread001.test,$(TARGETDIR)/thread001.test)
+	$(call forcecopy,$(SOURCEDIR)/thread002.test,$(TARGETDIR)/thread002.test)
+	$(call forcecopy,$(SOURCEDIR)/thread003.test,$(TARGETDIR)/thread003.test)
+	$(call forcecopy,$(SOURCEDIR)/thread1.test,$(TARGETDIR)/thread1.test)
+	$(call forcecopy,$(SOURCEDIR)/thread2.test,$(TARGETDIR)/thread2.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1435.test,$(TARGETDIR)/tkt1435.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1443.test,$(TARGETDIR)/tkt1443.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1444.test,$(TARGETDIR)/tkt1444.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1449.test,$(TARGETDIR)/tkt1449.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1473.test,$(TARGETDIR)/tkt1473.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1501.test,$(TARGETDIR)/tkt1501.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1512.test,$(TARGETDIR)/tkt1512.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1514.test,$(TARGETDIR)/tkt1514.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1536.test,$(TARGETDIR)/tkt1536.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1537.test,$(TARGETDIR)/tkt1537.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1567.test,$(TARGETDIR)/tkt1567.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1644.test,$(TARGETDIR)/tkt1644.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1667.test,$(TARGETDIR)/tkt1667.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt1873.test,$(TARGETDIR)/tkt1873.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2141.test,$(TARGETDIR)/tkt2141.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2192.test,$(TARGETDIR)/tkt2192.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2213.test,$(TARGETDIR)/tkt2213.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2251.test,$(TARGETDIR)/tkt2251.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2285.test,$(TARGETDIR)/tkt2285.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2332.test,$(TARGETDIR)/tkt2332.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2339.test,$(TARGETDIR)/tkt2339.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2391.test,$(TARGETDIR)/tkt2391.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2409.test,$(TARGETDIR)/tkt2409.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2450.test,$(TARGETDIR)/tkt2450.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2640.test,$(TARGETDIR)/tkt2640.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2643.test,$(TARGETDIR)/tkt2643.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2686.test,$(TARGETDIR)/tkt2686.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2767.test,$(TARGETDIR)/tkt2767.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2817.test,$(TARGETDIR)/tkt2817.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2820.test,$(TARGETDIR)/tkt2820.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2822.test,$(TARGETDIR)/tkt2822.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2832.test,$(TARGETDIR)/tkt2832.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2854.test,$(TARGETDIR)/tkt2854.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2920.test,$(TARGETDIR)/tkt2920.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2927.test,$(TARGETDIR)/tkt2927.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt2942.test,$(TARGETDIR)/tkt2942.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3080.test,$(TARGETDIR)/tkt3080.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3093.test,$(TARGETDIR)/tkt3093.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3121.test,$(TARGETDIR)/tkt3121.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3201.test,$(TARGETDIR)/tkt3201.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3292.test,$(TARGETDIR)/tkt3292.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3298.test,$(TARGETDIR)/tkt3298.test)
+	$(call forcecopy,$(SOURCEDIR)/tkt3334.test,$(TARGETDIR)/tkt3334.test)
+	$(call forcecopy,$(SOURCEDIR)/tokenize.test,$(TARGETDIR)/tokenize.test)
+	$(call forcecopy,$(SOURCEDIR)/trace.test,$(TARGETDIR)/trace.test)
+	$(call forcecopy,$(SOURCEDIR)/trans.test,$(TARGETDIR)/trans.test)
+	$(call forcecopy,$(SOURCEDIR)/trans2.test,$(TARGETDIR)/trans2.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger1.test,$(TARGETDIR)/trigger1.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger2.test,$(TARGETDIR)/trigger2.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger3.test,$(TARGETDIR)/trigger3.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger4.test,$(TARGETDIR)/trigger4.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger5.test,$(TARGETDIR)/trigger5.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger6.test,$(TARGETDIR)/trigger6.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger7.test,$(TARGETDIR)/trigger7.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger8.test,$(TARGETDIR)/trigger8.test)
+	$(call forcecopy,$(SOURCEDIR)/trigger9.test,$(TARGETDIR)/trigger9.test)
+	$(call forcecopy,$(SOURCEDIR)/triggerA.test,$(TARGETDIR)/triggerA.test)
+	$(call forcecopy,$(SOURCEDIR)/triggerB.test,$(TARGETDIR)/triggerB.test)
+	$(call forcecopy,$(SOURCEDIR)/types.test,$(TARGETDIR)/types.test)
+	$(call forcecopy,$(SOURCEDIR)/types2.test,$(TARGETDIR)/types2.test)
+	$(call forcecopy,$(SOURCEDIR)/types3.test,$(TARGETDIR)/types3.test)
+	$(call forcecopy,$(SOURCEDIR)/unique.test,$(TARGETDIR)/unique.test)
+	$(call forcecopy,$(SOURCEDIR)/update.test,$(TARGETDIR)/update.test)
+	$(call forcecopy,$(SOURCEDIR)/utf16align.test,$(TARGETDIR)/utf16align.test)
+	$(call forcecopy,$(SOURCEDIR)/vacuum.test,$(TARGETDIR)/vacuum.test)
+	$(call forcecopy,$(SOURCEDIR)/vacuum2.test,$(TARGETDIR)/vacuum2.test)
+	$(call forcecopy,$(SOURCEDIR)/vacuum3.test,$(TARGETDIR)/vacuum3.test)
+	$(call forcecopy,$(SOURCEDIR)/varint.test,$(TARGETDIR)/varint.test)
+	$(call forcecopy,$(SOURCEDIR)/veryquick.test,$(TARGETDIR)/veryquick.test)
+	$(call forcecopy,$(SOURCEDIR)/view.test,$(TARGETDIR)/view.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab1.test,$(TARGETDIR)/vtab1.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab2.test,$(TARGETDIR)/vtab2.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab3.test,$(TARGETDIR)/vtab3.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab4.test,$(TARGETDIR)/vtab4.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab5.test,$(TARGETDIR)/vtab5.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab6.test,$(TARGETDIR)/vtab6.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab7.test,$(TARGETDIR)/vtab7.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab8.test,$(TARGETDIR)/vtab8.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab9.test,$(TARGETDIR)/vtab9.test)
+	$(call forcecopy,$(SOURCEDIR)/vtabA.test,$(TARGETDIR)/vtabA.test)
+	$(call forcecopy,$(SOURCEDIR)/vtabB.test,$(TARGETDIR)/vtabB.test)
+	$(call forcecopy,$(SOURCEDIR)/vtabC.test,$(TARGETDIR)/vtabC.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab_alter.test,$(TARGETDIR)/vtab_alter.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab_err.test,$(TARGETDIR)/vtab_err.test)
+	$(call forcecopy,$(SOURCEDIR)/vtab_shared.test,$(TARGETDIR)/vtab_shared.test)
+	$(call forcecopy,$(SOURCEDIR)/where.test,$(TARGETDIR)/where.test)
+	$(call forcecopy,$(SOURCEDIR)/where2.test,$(TARGETDIR)/where2.test)
+	$(call forcecopy,$(SOURCEDIR)/where3.test,$(TARGETDIR)/where3.test)
+	$(call forcecopy,$(SOURCEDIR)/where4.test,$(TARGETDIR)/where4.test)
+	$(call forcecopy,$(SOURCEDIR)/where5.test,$(TARGETDIR)/where5.test)
+	$(call forcecopy,$(SOURCEDIR)/where6.test,$(TARGETDIR)/where6.test)
+	$(call forcecopy,$(SOURCEDIR)/zeroblob.test,$(TARGETDIR)/zeroblob.test)
+	
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) COPYFILES
+
+CLEAN : 
+	$(call forceremove,$(TARGET_FILES))
+	
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES : 
+	@echo $(TARGETDIR)/speed1p.explain
+	@echo $(TARGETDIR)/speed4p.explain
+	@echo $(TARGETDIR)/fuzz_common.tcl
+	@echo $(TARGETDIR)/malloc_common.tcl
+	@echo $(TARGETDIR)/tester.tcl
+	@echo $(TARGETDIR)/thread_common.tcl
+	@echo $(TARGETDIR)/trans2.test.gz
+	@echo $(TARGETDIR)/aggerror.test
+	@echo $(TARGETDIR)/alias.test
+	@echo $(TARGETDIR)/all.test
+	@echo $(TARGETDIR)/alter.test
+	@echo $(TARGETDIR)/alter2.test
+	@echo $(TARGETDIR)/alter3.test
+	@echo $(TARGETDIR)/altermalloc.test
+	@echo $(TARGETDIR)/analyze.test
+	@echo $(TARGETDIR)/async.test
+	@echo $(TARGETDIR)/async2.test
+	@echo $(TARGETDIR)/async3.test
+	@echo $(TARGETDIR)/attach.test
+	@echo $(TARGETDIR)/attach2.test
+	@echo $(TARGETDIR)/attach3.test
+	@echo $(TARGETDIR)/attachmalloc.test
+	@echo $(TARGETDIR)/auth.test
+	@echo $(TARGETDIR)/auth2.test
+	@echo $(TARGETDIR)/autoinc.test
+	@echo $(TARGETDIR)/autovacuum.test
+	@echo $(TARGETDIR)/autovacuum_ioerr2.test
+	@echo $(TARGETDIR)/avtrans.test
+	@echo $(TARGETDIR)/badutf.test
+	@echo $(TARGETDIR)/between.test
+	@echo $(TARGETDIR)/bigfile.test
+	@echo $(TARGETDIR)/bigrow.test
+	@echo $(TARGETDIR)/bind.test
+	@echo $(TARGETDIR)/bindxfer.test
+	@echo $(TARGETDIR)/bitvec.test
+	@echo $(TARGETDIR)/blob.test
+	@echo $(TARGETDIR)/busy.test
+	@echo $(TARGETDIR)/cache.test
+	@echo $(TARGETDIR)/capi2.test
+	@echo $(TARGETDIR)/capi3.test
+	@echo $(TARGETDIR)/capi3b.test
+	@echo $(TARGETDIR)/capi3c.test
+	@echo $(TARGETDIR)/capi3d.test
+	@echo $(TARGETDIR)/cast.test
+	@echo $(TARGETDIR)/check.test
+	@echo $(TARGETDIR)/collate1.test
+	@echo $(TARGETDIR)/collate2.test
+	@echo $(TARGETDIR)/collate3.test
+	@echo $(TARGETDIR)/collate4.test
+	@echo $(TARGETDIR)/collate5.test
+	@echo $(TARGETDIR)/collate6.test
+	@echo $(TARGETDIR)/collate7.test
+	@echo $(TARGETDIR)/collate8.test
+	@echo $(TARGETDIR)/collate9.test
+	@echo $(TARGETDIR)/collateA.test
+	@echo $(TARGETDIR)/colmeta.test
+	@echo $(TARGETDIR)/colname.test
+	@echo $(TARGETDIR)/conflict.test
+	@echo $(TARGETDIR)/corrupt.test
+	@echo $(TARGETDIR)/corrupt2.test
+	@echo $(TARGETDIR)/corrupt3.test
+	@echo $(TARGETDIR)/corrupt4.test
+	@echo $(TARGETDIR)/corrupt5.test
+	@echo $(TARGETDIR)/corrupt6.test
+	@echo $(TARGETDIR)/corrupt7.test
+	@echo $(TARGETDIR)/corrupt8.test
+	@echo $(TARGETDIR)/corrupt9.test
+	@echo $(TARGETDIR)/corruptA.test
+	@echo $(TARGETDIR)/crash.test
+	@echo $(TARGETDIR)/crash2.test
+	@echo $(TARGETDIR)/crash3.test
+	@echo $(TARGETDIR)/crash4.test
+	@echo $(TARGETDIR)/crash5.test
+	@echo $(TARGETDIR)/crash6.test
+	@echo $(TARGETDIR)/crash7.test
+	@echo $(TARGETDIR)/createtab.test
+	@echo $(TARGETDIR)/cse.test
+	@echo $(TARGETDIR)/date.test
+	@echo $(TARGETDIR)/default.test
+	@echo $(TARGETDIR)/delete.test
+	@echo $(TARGETDIR)/delete2.test
+	@echo $(TARGETDIR)/delete3.test
+	@echo $(TARGETDIR)/descidx1.test
+	@echo $(TARGETDIR)/descidx2.test
+	@echo $(TARGETDIR)/descidx3.test
+	@echo $(TARGETDIR)/diskfull.test
+	@echo $(TARGETDIR)/distinctagg.test
+	@echo $(TARGETDIR)/enc.test
+	@echo $(TARGETDIR)/enc2.test
+	@echo $(TARGETDIR)/enc3.test
+	@echo $(TARGETDIR)/eval.test
+	@echo $(TARGETDIR)/exclusive.test
+	@echo $(TARGETDIR)/exclusive2.test
+	@echo $(TARGETDIR)/exec.test
+	@echo $(TARGETDIR)/expr.test
+	@echo $(TARGETDIR)/filectrl.test
+	@echo $(TARGETDIR)/filefmt.test
+	@echo $(TARGETDIR)/fkey1.test
+	@echo $(TARGETDIR)/format4.test
+	@echo $(TARGETDIR)/fts1a.test
+	@echo $(TARGETDIR)/fts1b.test
+	@echo $(TARGETDIR)/fts1c.test
+	@echo $(TARGETDIR)/fts1d.test
+	@echo $(TARGETDIR)/fts1e.test
+	@echo $(TARGETDIR)/fts1f.test
+	@echo $(TARGETDIR)/fts1i.test
+	@echo $(TARGETDIR)/fts1j.test
+	@echo $(TARGETDIR)/fts1k.test
+	@echo $(TARGETDIR)/fts1l.test
+	@echo $(TARGETDIR)/fts1m.test
+	@echo $(TARGETDIR)/fts1n.test
+	@echo $(TARGETDIR)/fts1o.test
+	@echo $(TARGETDIR)/fts1porter.test
+	@echo $(TARGETDIR)/fts2.test
+	@echo $(TARGETDIR)/fts2a.test
+	@echo $(TARGETDIR)/fts2b.test
+	@echo $(TARGETDIR)/fts2c.test
+	@echo $(TARGETDIR)/fts2d.test
+	@echo $(TARGETDIR)/fts2e.test
+	@echo $(TARGETDIR)/fts2f.test
+	@echo $(TARGETDIR)/fts2g.test
+	@echo $(TARGETDIR)/fts2h.test
+	@echo $(TARGETDIR)/fts2i.test
+	@echo $(TARGETDIR)/fts2j.test
+	@echo $(TARGETDIR)/fts2k.test
+	@echo $(TARGETDIR)/fts2l.test
+	@echo $(TARGETDIR)/fts2m.test
+	@echo $(TARGETDIR)/fts2n.test
+	@echo $(TARGETDIR)/fts2o.test
+	@echo $(TARGETDIR)/fts2p.test
+	@echo $(TARGETDIR)/fts2q.test
+	@echo $(TARGETDIR)/fts2r.test
+	@echo $(TARGETDIR)/fts2token.test
+	@echo $(TARGETDIR)/fts3.test
+	@echo $(TARGETDIR)/fts3aa.test
+	@echo $(TARGETDIR)/fts3ab.test
+	@echo $(TARGETDIR)/fts3ac.test
+	@echo $(TARGETDIR)/fts3ad.test
+	@echo $(TARGETDIR)/fts3ae.test
+	@echo $(TARGETDIR)/fts3af.test
+	@echo $(TARGETDIR)/fts3ag.test
+	@echo $(TARGETDIR)/fts3ah.test
+	@echo $(TARGETDIR)/fts3ai.test
+	@echo $(TARGETDIR)/fts3aj.test
+	@echo $(TARGETDIR)/fts3ak.test
+	@echo $(TARGETDIR)/fts3al.test
+	@echo $(TARGETDIR)/fts3am.test
+	@echo $(TARGETDIR)/fts3an.test
+	@echo $(TARGETDIR)/fts3ao.test
+	@echo $(TARGETDIR)/fts3atoken.test
+	@echo $(TARGETDIR)/fts3b.test
+	@echo $(TARGETDIR)/fts3c.test
+	@echo $(TARGETDIR)/fts3d.test
+	@echo $(TARGETDIR)/fts3e.test
+	@echo $(TARGETDIR)/fts3near.test
+	@echo $(TARGETDIR)/func.test
+	@echo $(TARGETDIR)/fuzz.test
+	@echo $(TARGETDIR)/fuzz2.test
+	@echo $(TARGETDIR)/fuzz_malloc.test
+	@echo $(TARGETDIR)/hook.test
+	@echo $(TARGETDIR)/icu.test
+	@echo $(TARGETDIR)/in.test
+	@echo $(TARGETDIR)/in2.test
+	@echo $(TARGETDIR)/in3.test
+	@echo $(TARGETDIR)/incrblob.test
+	@echo $(TARGETDIR)/incrblob2.test
+	@echo $(TARGETDIR)/incrblob_err.test
+	@echo $(TARGETDIR)/incrvacuum.test
+	@echo $(TARGETDIR)/incrvacuum2.test
+	@echo $(TARGETDIR)/incrvacuum_ioerr.test
+	@echo $(TARGETDIR)/index.test
+	@echo $(TARGETDIR)/index2.test
+	@echo $(TARGETDIR)/index3.test
+	@echo $(TARGETDIR)/insert.test
+	@echo $(TARGETDIR)/insert2.test
+	@echo $(TARGETDIR)/insert3.test
+	@echo $(TARGETDIR)/insert4.test
+	@echo $(TARGETDIR)/insert5.test
+	@echo $(TARGETDIR)/interrupt.test
+	@echo $(TARGETDIR)/intpkey.test
+	@echo $(TARGETDIR)/io.test
+	@echo $(TARGETDIR)/ioerr.test
+	@echo $(TARGETDIR)/ioerr2.test
+	@echo $(TARGETDIR)/ioerr3.test
+	@echo $(TARGETDIR)/ioerr4.test
+	@echo $(TARGETDIR)/ioerr5.test
+	@echo $(TARGETDIR)/join.test
+	@echo $(TARGETDIR)/join2.test
+	@echo $(TARGETDIR)/join3.test
+	@echo $(TARGETDIR)/join4.test
+	@echo $(TARGETDIR)/join5.test
+	@echo $(TARGETDIR)/journal1.test
+	@echo $(TARGETDIR)/jrnlmode.test
+	@echo $(TARGETDIR)/lastinsert.test
+	@echo $(TARGETDIR)/laststmtchanges.test
+	@echo $(TARGETDIR)/like.test
+	@echo $(TARGETDIR)/like2.test
+	@echo $(TARGETDIR)/limit.test
+	@echo $(TARGETDIR)/loadext.test
+	@echo $(TARGETDIR)/loadext2.test
+	@echo $(TARGETDIR)/lock.test
+	@echo $(TARGETDIR)/lock2.test
+	@echo $(TARGETDIR)/lock3.test
+	@echo $(TARGETDIR)/lock4.test
+	@echo $(TARGETDIR)/lock5.test
+	@echo $(TARGETDIR)/lookaside.test
+	@echo $(TARGETDIR)/main.test
+	@echo $(TARGETDIR)/malloc.test
+	@echo $(TARGETDIR)/malloc3.test
+	@echo $(TARGETDIR)/malloc4.test
+	@echo $(TARGETDIR)/malloc5.test
+	@echo $(TARGETDIR)/malloc6.test
+	@echo $(TARGETDIR)/malloc7.test
+	@echo $(TARGETDIR)/malloc8.test
+	@echo $(TARGETDIR)/malloc9.test
+	@echo $(TARGETDIR)/mallocA.test
+	@echo $(TARGETDIR)/mallocAll.test
+	@echo $(TARGETDIR)/mallocB.test
+	@echo $(TARGETDIR)/mallocC.test
+	@echo $(TARGETDIR)/mallocD.test
+	@echo $(TARGETDIR)/mallocE.test
+	@echo $(TARGETDIR)/mallocF.test
+	@echo $(TARGETDIR)/mallocG.test
+	@echo $(TARGETDIR)/mallocH.test
+	@echo $(TARGETDIR)/mallocI.test
+	@echo $(TARGETDIR)/manydb.test
+	@echo $(TARGETDIR)/memdb.test
+	@echo $(TARGETDIR)/memleak.test
+	@echo $(TARGETDIR)/memsubsys1.test
+	@echo $(TARGETDIR)/memsubsys2.test
+	@echo $(TARGETDIR)/minmax.test
+	@echo $(TARGETDIR)/minmax2.test
+	@echo $(TARGETDIR)/minmax3.test
+	@echo $(TARGETDIR)/misc1.test
+	@echo $(TARGETDIR)/misc2.test
+	@echo $(TARGETDIR)/misc3.test
+	@echo $(TARGETDIR)/misc4.test
+	@echo $(TARGETDIR)/misc5.test
+	@echo $(TARGETDIR)/misc6.test
+	@echo $(TARGETDIR)/misc7.test
+	@echo $(TARGETDIR)/misuse.test
+	@echo $(TARGETDIR)/mutex1.test
+	@echo $(TARGETDIR)/mutex2.test
+	@echo $(TARGETDIR)/nan.test
+	@echo $(TARGETDIR)/notnull.test
+	@echo $(TARGETDIR)/null.test
+	@echo $(TARGETDIR)/openv2.test
+	@echo $(TARGETDIR)/pager.test
+	@echo $(TARGETDIR)/pager2.test
+	@echo $(TARGETDIR)/pager3.test
+	@echo $(TARGETDIR)/pageropt.test
+	@echo $(TARGETDIR)/pagesize.test
+	@echo $(TARGETDIR)/pcache.test
+	@echo $(TARGETDIR)/permutations.test
+	@echo $(TARGETDIR)/pragma.test
+	@echo $(TARGETDIR)/pragma2.test
+	@echo $(TARGETDIR)/printf.test
+	@echo $(TARGETDIR)/progress.test
+	@echo $(TARGETDIR)/ptrchng.test
+	@echo $(TARGETDIR)/quick.test
+	@echo $(TARGETDIR)/quote.test
+	@echo $(TARGETDIR)/rdonly.test
+	@echo $(TARGETDIR)/reindex.test
+	@echo $(TARGETDIR)/rollback.test
+	@echo $(TARGETDIR)/rowid.test
+	@echo $(TARGETDIR)/rtree.test
+	@echo $(TARGETDIR)/safety.test
+	@echo $(TARGETDIR)/schema.test
+	@echo $(TARGETDIR)/schema2.test
+	@echo $(TARGETDIR)/select1.test
+	@echo $(TARGETDIR)/select2.test
+	@echo $(TARGETDIR)/select3.test
+	@echo $(TARGETDIR)/select4.test
+	@echo $(TARGETDIR)/select5.test
+	@echo $(TARGETDIR)/select6.test
+	@echo $(TARGETDIR)/select7.test
+	@echo $(TARGETDIR)/select8.test
+	@echo $(TARGETDIR)/select9.test
+	@echo $(TARGETDIR)/selectA.test
+	@echo $(TARGETDIR)/selectB.test
+	@echo $(TARGETDIR)/server1.test
+	@echo $(TARGETDIR)/shared.test
+	@echo $(TARGETDIR)/shared2.test
+	@echo $(TARGETDIR)/shared3.test
+	@echo $(TARGETDIR)/shared4.test
+	@echo $(TARGETDIR)/shared_err.test
+	@echo $(TARGETDIR)/shortread1.test
+	@echo $(TARGETDIR)/sidedelete.test
+	@echo $(TARGETDIR)/soak.test
+	@echo $(TARGETDIR)/softheap1.test
+	@echo $(TARGETDIR)/sort.test
+	@echo $(TARGETDIR)/speed1.test
+	@echo $(TARGETDIR)/speed1p.test
+	@echo $(TARGETDIR)/speed2.test
+	@echo $(TARGETDIR)/speed3.test
+	@echo $(TARGETDIR)/speed4.test
+	@echo $(TARGETDIR)/speed4p.test
+	@echo $(TARGETDIR)/sqllimits1.test
+	@echo $(TARGETDIR)/subquery.test
+	@echo $(TARGETDIR)/subselect.test
+	@echo $(TARGETDIR)/substr.test
+	@echo $(TARGETDIR)/sync.test
+	@echo $(TARGETDIR)/table.test
+	@echo $(TARGETDIR)/tableapi.test
+	@echo $(TARGETDIR)/tclsqlite.test
+	@echo $(TARGETDIR)/tempdb.test
+	@echo $(TARGETDIR)/temptable.test
+	@echo $(TARGETDIR)/thread001.test
+	@echo $(TARGETDIR)/thread002.test
+	@echo $(TARGETDIR)/thread003.test
+	@echo $(TARGETDIR)/thread1.test
+	@echo $(TARGETDIR)/thread2.test
+	@echo $(TARGETDIR)/tkt1435.test
+	@echo $(TARGETDIR)/tkt1443.test
+	@echo $(TARGETDIR)/tkt1444.test
+	@echo $(TARGETDIR)/tkt1449.test
+	@echo $(TARGETDIR)/tkt1473.test
+	@echo $(TARGETDIR)/tkt1501.test
+	@echo $(TARGETDIR)/tkt1512.test
+	@echo $(TARGETDIR)/tkt1514.test
+	@echo $(TARGETDIR)/tkt1536.test
+	@echo $(TARGETDIR)/tkt1537.test
+	@echo $(TARGETDIR)/tkt1567.test
+	@echo $(TARGETDIR)/tkt1644.test
+	@echo $(TARGETDIR)/tkt1667.test
+	@echo $(TARGETDIR)/tkt1873.test
+	@echo $(TARGETDIR)/tkt2141.test
+	@echo $(TARGETDIR)/tkt2192.test
+	@echo $(TARGETDIR)/tkt2213.test
+	@echo $(TARGETDIR)/tkt2251.test
+	@echo $(TARGETDIR)/tkt2285.test
+	@echo $(TARGETDIR)/tkt2332.test
+	@echo $(TARGETDIR)/tkt2339.test
+	@echo $(TARGETDIR)/tkt2391.test
+	@echo $(TARGETDIR)/tkt2409.test
+	@echo $(TARGETDIR)/tkt2450.test
+	@echo $(TARGETDIR)/tkt2640.test
+	@echo $(TARGETDIR)/tkt2643.test
+	@echo $(TARGETDIR)/tkt2686.test
+	@echo $(TARGETDIR)/tkt2767.test
+	@echo $(TARGETDIR)/tkt2817.test
+	@echo $(TARGETDIR)/tkt2820.test
+	@echo $(TARGETDIR)/tkt2822.test
+	@echo $(TARGETDIR)/tkt2832.test
+	@echo $(TARGETDIR)/tkt2854.test
+	@echo $(TARGETDIR)/tkt2920.test
+	@echo $(TARGETDIR)/tkt2927.test
+	@echo $(TARGETDIR)/tkt2942.test
+	@echo $(TARGETDIR)/tkt3080.test
+	@echo $(TARGETDIR)/tkt3093.test
+	@echo $(TARGETDIR)/tkt3121.test
+	@echo $(TARGETDIR)/tkt3201.test
+	@echo $(TARGETDIR)/tkt3292.test
+	@echo $(TARGETDIR)/tkt3298.test
+	@echo $(TARGETDIR)/tkt3334.test
+	@echo $(TARGETDIR)/tokenize.test
+	@echo $(TARGETDIR)/trace.test
+	@echo $(TARGETDIR)/trans.test
+	@echo $(TARGETDIR)/trans2.test
+	@echo $(TARGETDIR)/trigger1.test
+	@echo $(TARGETDIR)/trigger2.test
+	@echo $(TARGETDIR)/trigger3.test
+	@echo $(TARGETDIR)/trigger4.test
+	@echo $(TARGETDIR)/trigger5.test
+	@echo $(TARGETDIR)/trigger6.test
+	@echo $(TARGETDIR)/trigger7.test
+	@echo $(TARGETDIR)/trigger8.test
+	@echo $(TARGETDIR)/trigger9.test
+	@echo $(TARGETDIR)/triggerA.test
+	@echo $(TARGETDIR)/triggerB.test
+	@echo $(TARGETDIR)/types.test
+	@echo $(TARGETDIR)/types2.test
+	@echo $(TARGETDIR)/types3.test
+	@echo $(TARGETDIR)/unique.test
+	@echo $(TARGETDIR)/update.test
+	@echo $(TARGETDIR)/utf16align.test
+	@echo $(TARGETDIR)/vacuum.test
+	@echo $(TARGETDIR)/vacuum2.test
+	@echo $(TARGETDIR)/vacuum3.test
+	@echo $(TARGETDIR)/varint.test
+	@echo $(TARGETDIR)/veryquick.test
+	@echo $(TARGETDIR)/view.test
+	@echo $(TARGETDIR)/vtab1.test
+	@echo $(TARGETDIR)/vtab2.test
+	@echo $(TARGETDIR)/vtab3.test
+	@echo $(TARGETDIR)/vtab4.test
+	@echo $(TARGETDIR)/vtab5.test
+	@echo $(TARGETDIR)/vtab6.test
+	@echo $(TARGETDIR)/vtab7.test
+	@echo $(TARGETDIR)/vtab8.test
+	@echo $(TARGETDIR)/vtab9.test
+	@echo $(TARGETDIR)/vtabA.test
+	@echo $(TARGETDIR)/vtabB.test
+	@echo $(TARGETDIR)/vtabC.test
+	@echo $(TARGETDIR)/vtab_alter.test
+	@echo $(TARGETDIR)/vtab_err.test
+	@echo $(TARGETDIR)/vtab_shared.test
+	@echo $(TARGETDIR)/where.test
+	@echo $(TARGETDIR)/where2.test
+	@echo $(TARGETDIR)/where3.test
+	@echo $(TARGETDIR)/where4.test
+	@echo $(TARGETDIR)/where5.test
+	@echo $(TARGETDIR)/where6.test
+	@echo $(TARGETDIR)/zeroblob.test
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sqlite3_securecopytestfiles.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for sqlite3_securecopytestfiles
+#
+
+platform	win32
+makefile 	gnumake
+techstream	pds
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/sqlite3_securecopytestfiles.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,69 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Copy SQLITE3_SECURE test files
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR=$(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10286A82
+else
+	TARGETDIR=$(EPOCROOT)epoc32/data/z/private/10286A82
+
+endif
+
+SOURCEDIR = $(EXTENSION_ROOT)/../TEST/TCLSCRIPT
+
+$(TARGETDIR):
+	$(call createdir, "$@")
+
+COPYFILES :
+	$(call forcecopy,$(SOURCEDIR)/*.test,$(TARGETDIR)/)
+	$(call forcecopy,$(SOURCEDIR)/tester.tcl,$(TARGETDIR)/)
+
+	
+DO_NOTHING :
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+BLD : $(TARGETDIR) $(SOURCEDIR) COPYFILES
+
+CLEAN : 
+	$(call forceremove,$(TARGETDIR)/*.test)
+	$(call forceremove,$(TARGETDIR)/tester.tcl)
+	
+SAVESPACE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES : 
+	@echo $(TARGETDIR)/*.test
+	@echo $(TARGETDIR)/tester.tcl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_sitestfiledist.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for xml_sitestfiledist
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_sitestfiledist.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,131 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(OS), "Windows_NT")
+RMDIR := @rmdir 2>>nul
+else
+RMDIR := @rmdir
+endif
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	DEST_DIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/xmltest/serviceindication
+else
+	DEST_DIR = $(EPOCROOT)epoc32/data/z/system/xmltest/serviceindication
+endif
+
+SOURCE_DIR = $(EXTENSION_ROOT)/../test/rtest/data/serviceindication
+
+# Ensure we have a clean canvas - this also avoids us having to specify
+# switches to commands that are not recognised across platforms.
+CLEAN_DEST :
+	$(call createdir,$(DEST_DIR))
+
+MAKE_DIRS :
+	$(call createdir,$(DEST_DIR)/1.0)
+	$(call createdir,$(DEST_DIR)/corrupt)
+
+COPYFILES : CLEAN_DEST MAKE_DIRS
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/1.0/*.bdy $(DEST_DIR)/1.0/*.bdy)
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/corrupt/*.bdy $(DEST_DIR)/corrupt/*.bdy)
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : COPYFILES
+
+CLEAN : 
+	$(call createdir,$(DEST_DIR))
+
+BLD : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(DEST_DIR)/1.0/si_invalid_cdate.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_act_multiple.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_act_multiple2.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_day.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_hour.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_len.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_min.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_sec.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_cd_year.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_ind.bdy
+	@echo $(DEST_DIR)/1.0/si_inv_msg_emp.bdy
+	@echo $(DEST_DIR)/1.0/si_valid.bdy
+	@echo $(DEST_DIR)/1.0/si_valid_chi.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_de.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_no.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_sh.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_sl.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_sm.bdy
+	@echo $(DEST_DIR)/1.0/si_val_act_sn.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_1.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_2.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_3.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_4.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_5.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_6.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_7.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_8.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_iso_8859_9.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_shift_JIS.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_us_ascii.bdy
+	@echo $(DEST_DIR)/1.0/si_val_char_utf_8.bdy
+	@echo $(DEST_DIR)/1.0/si_val_expired.bdy
+	@echo $(DEST_DIR)/1.0/si_val_exp_null.bdy
+	@echo $(DEST_DIR)/1.0/si_val_ind_opq.bdy
+	@echo $(DEST_DIR)/1.0/si_val_msg_emp_indatt.bdy
+	@echo $(DEST_DIR)/1.0/si_val_no_cd.bdy
+	@echo $(DEST_DIR)/1.0/si_val_no_exp.bdy
+	@echo $(DEST_DIR)/1.0/si_val_only_href.bdy
+	@echo $(DEST_DIR)/1.0/si_val_sender_encoding.bdy
+	@echo $(DEST_DIR)/1.0/si_val_wbx_ver_10.bdy
+	@echo $(DEST_DIR)/1.0/si_val_wbx_ver_11.bdy
+	@echo $(DEST_DIR)/1.0/si_val_wbx_ver_12.bdy
+	@echo $(DEST_DIR)/1.0/si_val_wbx_ver_13.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_act_undf.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_cd_token.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_cd_type.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_char.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_hrf_ter.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_msg_emp2.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_msg_ter.bdy
+	@echo $(DEST_DIR)/corrupt/si_inv_msg_ter2.bdy
+	@echo $(DEST_DIR)/corrupt/si_val_wbx_ver_14.bdy
+	@echo $(DEST_DIR)/corrupt/si_val_wbx_ver_30.bdy
+	@echo $(DEST_DIR)/corrupt/si_val_wbx_ver_FF.bdy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_stringdictionary00tagtable.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for xml_stringdictionary00tagtable use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_stringdictionary00tagtable.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,57 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+BUILD_DIR = $(EPOCROOT)epoc32/build/generated/xml
+
+GENERATED_FILES = $(BUILD_DIR)/t_stringdictionary00tagtable.cpp
+
+$(BUILD_DIR)/t_stringdictionary00tagtable.cpp : $(EXTENSION_ROOT)/../test/rtest/tsrc/t_stringdictionary00tagtable.st
+	$(call createdir,$(BUILD_DIR))
+	@perl $(EPOCROOT)epoc32/tools/ecopyfile.pl $(EXTENSION_ROOT)/../test/rtest/tsrc/t_stringdictionary00tagtable.st $(BUILD_DIR)$/t_stringdictionary00tagtable.st
+	@perl $(EPOCROOT)epoc32/tools/stringtable.pl $(BUILD_DIR)/t_stringdictionary00tagtable.st 
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : $(GENERATED_FILES)
+
+BLD : MAKMAKE
+
+SAVESPACE : MAKMAKE
+
+CLEAN : 
+	$(call createdir,$(BUILD_DIR))
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES : 
+	@echo $(GENERATED_FILES)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_syncmltestfiledist.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for xml_syncmltestfiledist
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_syncmltestfiledist.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,357 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(OS), "Windows_NT")
+RMDIR := @rmdir 2>>nul
+else
+RMDIR := @rmdir
+endif
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	DEST_DIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/xmltest/syncml
+else
+	DEST_DIR = $(EPOCROOT)epoc32/data/z/system/xmltest/syncml
+endif
+
+SOURCE_DIR = $(EXTENSION_ROOT)/../test/rtest/data/syncml
+
+# Ensure we have a clean canvas - this also avoids us having to specify
+# switches to commands that are not recognised across platforms.
+CLEAN_DEST :
+	$(call createdir,$(DEST_DIR))
+
+MAKE_DIRS :
+	$(call createdir,$(DEST_DIR)/1.1/add-to-client)
+	$(call createdir,$(DEST_DIR)/1.1/add-to-server)
+	$(call createdir,$(DEST_DIR)/1.1/Atomic)
+	$(call createdir,$(DEST_DIR)/1.1/AuthBasicFail)
+	$(call createdir,$(DEST_DIR)/1.1/AuthBasicFailFirst)
+	$(call createdir,$(DEST_DIR)/1.1/AuthMD5Fail)
+	$(call createdir,$(DEST_DIR)/1.1/AuthMD5FailFirst)
+	$(call createdir,$(DEST_DIR)/1.1/client-large)
+	$(call createdir,$(DEST_DIR)/1.1/client-large-multiple)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAdd)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertDisplay)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertMultiChoice)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertSingleChoice)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertTextInput)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertUserAccept)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAlertUserReject)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAtomic)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAtomicAlertUserAccept)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAtomicAlertUserReject)
+	$(call createdir,$(DEST_DIR)/1.1/DevManAtomicFail)
+	$(call createdir,$(DEST_DIR)/1.1/DevManDelete)
+	$(call createdir,$(DEST_DIR)/1.1/DevManGet)
+	$(call createdir,$(DEST_DIR)/1.1/DevManLargeObjectAdd)
+	$(call createdir,$(DEST_DIR)/1.1/DevManLargeObjectGet)
+	$(call createdir,$(DEST_DIR)/1.1/DevManReplace)
+	$(call createdir,$(DEST_DIR)/1.1/DevManSequence)
+	$(call createdir,$(DEST_DIR)/1.1/DevManSequenceAlertUserAccept)
+	$(call createdir,$(DEST_DIR)/1.1/DevManSequenceAlertUserReject)
+	$(call createdir,$(DEST_DIR)/1.1/DevManSequenceFail)
+	$(call createdir,$(DEST_DIR)/1.1/DevManSimple)
+	$(call createdir,$(DEST_DIR)/1.1/Large-object-from-client)
+	$(call createdir,$(DEST_DIR)/1.1/Large-object-from-server)
+	$(call createdir,$(DEST_DIR)/1.1/Large-object-from-server2)
+	$(call createdir,$(DEST_DIR)/1.1/Multiple-Db-Sync)
+	$(call createdir,$(DEST_DIR)/1.1/One-way-client-refresh-sync)
+	$(call createdir,$(DEST_DIR)/1.1/One-way-client-sync)
+	$(call createdir,$(DEST_DIR)/1.1/One-way-server-refresh-sync)
+	$(call createdir,$(DEST_DIR)/1.1/One-way-server-sync)
+	$(call createdir,$(DEST_DIR)/1.1/Pref-Tx-Rx)
+	$(call createdir,$(DEST_DIR)/1.1/server-busy)
+	$(call createdir,$(DEST_DIR)/1.1/server-large)
+	$(call createdir,$(DEST_DIR)/1.1/server-large-multiple)
+	$(call createdir,$(DEST_DIR)/1.1/slow-sync)
+	$(call createdir,$(DEST_DIR)/1.1/two-way-add)
+	$(call createdir,$(DEST_DIR)/1.1/two-way-delete)
+	$(call createdir,$(DEST_DIR)/1.1/two-way-replace)
+	$(call createdir,$(DEST_DIR)/1.1/two-way-sync)
+	$(call createdir,$(DEST_DIR)/1.2/defects)
+	$(call createdir,$(DEST_DIR)/unknown)
+
+
+COPYFILES : CLEAN_DEST MAKE_DIRS
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/add-to-client/*.xml $(DEST_DIR)/1.1/add-to-client/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/add-to-server/*.xml $(DEST_DIR)/1.1/add-to-server/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/atomic/*.xml $(DEST_DIR)/1.1/Atomic/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authbasicfail/*.xml $(DEST_DIR)/1.1/AuthBasicFail/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authbasicfailfirst/*.xml $(DEST_DIR)/1.1/AuthBasicFailFirst/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authmd5fail/*.xml $(DEST_DIR)/1.1/AuthMD5Fail/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authmd5failfirst/*.xml $(DEST_DIR)/1.1/AuthMD5FailFirst/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/client-large/*.xml $(DEST_DIR)/1.1/client-large/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/client-large-multiple/*.xml $(DEST_DIR)/1.1/client-large-multiple/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanadd/*.xml $(DEST_DIR)/1.1/DevManAdd/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertdisplay/*.xml $(DEST_DIR)/1.1/DevManAlertDisplay/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertmultichoice/*.xml $(DEST_DIR)/1.1/DevManAlertMultiChoice/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertsinglechoice/*.xml $(DEST_DIR)/1.1/DevManAlertSingleChoice/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalerttextinput/*.xml $(DEST_DIR)/1.1/DevManAlertTextInput/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertuseraccept/*.xml $(DEST_DIR)/1.1/DevManAlertUserAccept/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertuserreject/*.xml $(DEST_DIR)/1.1/DevManAlertUserReject/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomic/*.xml $(DEST_DIR)/1.1/DevManAtomic/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicalertuseraccept/*.xml $(DEST_DIR)/1.1/DevManAtomicAlertUserAccept/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicalertuserreject/*.xml $(DEST_DIR)/1.1/DevManAtomicAlertUserReject/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicfail/*.xml $(DEST_DIR)/1.1/DevManAtomicFail/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmandelete/*.xml $(DEST_DIR)/1.1/DevManDelete/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanget/*.xml $(DEST_DIR)/1.1/DevManGet/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanlargeobjectadd/*.xml $(DEST_DIR)/1.1/DevManLargeObjectAdd/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanlargeobjectget/*.xml $(DEST_DIR)/1.1/DevManLargeObjectGet/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanreplace/*.xml $(DEST_DIR)/1.1/DevManReplace/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequence/*.xml $(DEST_DIR)/1.1/DevManSequence/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencealertuseraccept/*.xml $(DEST_DIR)/1.1/DevManSequenceAlertUserAccept/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencealertuserreject/*.xml $(DEST_DIR)/1.1/DevManSequenceAlertUserReject/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencefail/*.xml $(DEST_DIR)/1.1/DevManSequenceFail/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansimple/*.xml $(DEST_DIR)/1.1/DevManSimple/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-client/*.xml $(DEST_DIR)/1.1/Large-object-from-client/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-server/*.xml $(DEST_DIR)/1.1/Large-object-from-server/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-server2/*.xml $(DEST_DIR)/1.1/Large-object-from-server2/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/multiple-db-sync/*.xml $(DEST_DIR)/1.1/Multiple-Db-Sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-client-refresh-sync/*.xml $(DEST_DIR)/1.1/One-way-client-refresh-sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-client-sync/*.xml $(DEST_DIR)/1.1/One-way-client-sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-server-refresh-sync/*.xml $(DEST_DIR)/1.1/One-way-server-refresh-sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-server-sync/*.xml $(DEST_DIR)/1.1/One-way-server-sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/pref-tx-rx/*.xml $(DEST_DIR)/1.1/Pref-Tx-Rx/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-busy/*.xml $(DEST_DIR)/1.1/server-busy/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-large/*.xml $(DEST_DIR)/1.1/server-large/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-large-multiple/*.xml $(DEST_DIR)/1.1/server-large-multiple/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/slow-sync/*.xml $(DEST_DIR)/1.1/slow-sync/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-add/*.xml $(DEST_DIR)/1.1/two-way-add/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-delete/*.xml $(DEST_DIR)/1.1/two-way-delete/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-replace/*.xml $(DEST_DIR)/1.1/two-way-replace/*.xml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-sync/*.xml $(DEST_DIR)/1.1/two-way-sync/*.xml)
+
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/add-to-client/*.wbxml $(DEST_DIR)/1.1/add-to-client/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/add-to-server/*.wbxml $(DEST_DIR)/1.1/add-to-server/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/atomic/*.wbxml $(DEST_DIR)/1.1/Atomic/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authbasicfail/*.wbxml $(DEST_DIR)/1.1/AuthBasicFail/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authbasicfailfirst/*.wbxml $(DEST_DIR)/1.1/AuthBasicFailFirst/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)$/1.1$/authmd5fail$/*.wbxml $(DEST_DIR)$/1.1$/AuthMD5Fail$/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/authmd5failfirst/*.wbxml $(DEST_DIR)/1.1/AuthMD5FailFirst/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/client-large/*.wbxml $(DEST_DIR)/1.1/client-large/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/client-large-multiple/*.wbxml $(DEST_DIR)/1.1/client-large-multiple/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanadd/*.wbxml $(DEST_DIR)/1.1/DevManAdd/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertdisplay/*.wbxml $(DEST_DIR)/1.1/DevManAlertDisplay/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertmultichoice/*.wbxml $(DEST_DIR)/1.1/DevManAlertMultiChoice/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertsinglechoice/*.wbxml $(DEST_DIR)/1.1/DevManAlertSingleChoice/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalerttextinput/*.wbxml $(DEST_DIR)/1.1/DevManAlertTextInput/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertuseraccept/*.wbxml $(DEST_DIR)/1.1/DevManAlertUserAccept/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanalertuserreject/*.wbxml $(DEST_DIR)/1.1/DevManAlertUserReject/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomic/*.wbxml $(DEST_DIR)/1.1/DevManAtomic/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicalertuseraccept/*.wbxml $(DEST_DIR)/1.1/DevManAtomicAlertUserAccept/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicalertuserreject/*.wbxml $(DEST_DIR)/1.1/DevManAtomicAlertUserReject/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanatomicfail/*.wbxml $(DEST_DIR)/1.1/DevManAtomicFail/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmandelete/*.wbxml $(DEST_DIR)/1.1/DevManDelete/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanget/*.wbxml $(DEST_DIR)/1.1/DevManGet/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanlargeobjectadd/*.wbxml $(DEST_DIR)/1.1/DevManLargeObjectAdd/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanlargeobjectget/*.wbxml $(DEST_DIR)/1.1/DevManLargeObjectGet/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmanreplace/*.wbxml $(DEST_DIR)/1.1/DevManReplace/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequence/*.wbxml $(DEST_DIR)/1.1/DevManSequence/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencealertuseraccept/*.wbxml $(DEST_DIR)/1.1/DevManSequenceAlertUserAccept/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencealertuserreject/*.wbxml $(DEST_DIR)/1.1/DevManSequenceAlertUserReject/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansequencefail/*.wbxml $(DEST_DIR)/1.1/DevManSequenceFail/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/devmansimple/*.wbxml	 $(DEST_DIR)/1.1/DevManSimple/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-client/*.wbxml $(DEST_DIR)/1.1/Large-object-from-client/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-server/*.wbxml $(DEST_DIR)/1.1/Large-object-from-server/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/large-object-from-server2/*.wbxml $(DEST_DIR)/1.1/Large-object-from-server2/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/multiple-db-sync/*.wbxml $(DEST_DIR)/1.1/Multiple-Db-Sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-client-refresh-sync/*.wbxml $(DEST_DIR)/1.1/One-way-client-refresh-sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-client-sync/*.wbxml $(DEST_DIR)/1.1/One-way-client-sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-server-refresh-sync/*.wbxml $(DEST_DIR)/1.1/One-way-server-refresh-sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/one-way-server-sync/*.wbxml $(DEST_DIR)/1.1/One-way-server-sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/pref-tx-rx/*.wbxml $(DEST_DIR)/1.1/Pref-Tx-Rx/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-busy/*.wbxml $(DEST_DIR)/1.1/server-busy/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-large/*.wbxml $(DEST_DIR)/1.1/server-large/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/server-large-multiple/*.wbxml $(DEST_DIR)/1.1/server-large-multiple/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/slow-sync/*.wbxml $(DEST_DIR)/1.1/slow-sync/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-add/*.wbxml $(DEST_DIR)/1.1/two-way-add/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-delete/*.wbxml $(DEST_DIR)/1.1/two-way-delete/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-replace/*.wbxml $(DEST_DIR)/1.1/two-way-replace/*.wbxml)
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.1/two-way-sync/*.wbxml $(DEST_DIR)/1.1/two-way-sync/*.wbxml)
+
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/1.2/defects/*.wbxml $(DEST_DIR)/1.2/defects/*.wbxml)
+	
+	$(CP) $(call slash2generic,$(SOURCE_DIR)/unknown/*.wbxml $(DEST_DIR)/unknown/*.wbxml)
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : COPYFILES
+
+CLEAN : 
+	$(call createdir,$(DEST_DIR))
+
+BLD : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(DEST_DIR)/1.1/add-to-client/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/add-to-client/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/add-to-client/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/add-to-server/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/add-to-server/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/add-to-server/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/atomic/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/atomic/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/atomic/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfail/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfail/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfail/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfailfirst/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfailfirst/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/authbasicfailfirst/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5fail/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5fail/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5fail/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5failfirst/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5failfirst/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/authmd5failfirst/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/client-large/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/client-large/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/client-large/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/client-large/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/client-large-multiple/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/client-large-multiple/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/client-large-multiple/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/client-large-multiple/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/devmanadd/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanadd/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertdisplay/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertdisplay/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertmultichoice/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertmultichoice/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertsinglechoice/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertsinglechoice/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalerttextinput/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalerttextinput/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertuseraccept/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertuseraccept/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertuserreject/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanalertuserreject/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomic/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomic/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicAlertUserAccept/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicAlertUserAccept/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicAlertUserReject/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicAlertUserReject/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicFail/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanatomicFail/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmandelete/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmandelete/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanget/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanget/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectadd/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectadd/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectadd/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectadd/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectget/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectget/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectget/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectget/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/devmanlargeobjectget/FromServer5.wbxml
+	@echo $(DEST_DIR)/1.1/devmanreplace/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmanreplace/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequence/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequence/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencealertuseraccept/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencealertuseraccept/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencealertuserreject/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencealertuserreject/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencefail/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/devmansequencefail/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/devmansimple/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-client/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-client/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-client/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-client/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server2/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server2/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server2/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/large-object-from-server2/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/multiple-db-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/multiple-db-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/multiple-db-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-refresh-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-refresh-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-refresh-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-client-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-refresh-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-refresh-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-refresh-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/one-way-server-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/pref-tx-rx/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/pref-tx-rx/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/pref-tx-rx/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/server-busy/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/server-large/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/server-large/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/server-large/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/server-large/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/server-large-multiple/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/server-large-multiple/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/server-large-multiple/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/server-large-multiple/FromServer4.wbxml
+	@echo $(DEST_DIR)/1.1/server-large-multiple/FromServer5.wbxml
+	@echo $(DEST_DIR)/1.1/slow-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/slow-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/slow-sync/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-add/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-add/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-add/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-delete/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-delete/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-delete/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-replace/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-replace/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-replace/FromServer3.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-sync/FromServer1.wbxml
+	@echo $(DEST_DIR)/1.1/two-way-sync/FromServer2.wbxml
+	@echo $(DEST_DIR)/1.2/defects/DEF063979.wbxml
+	@echo $(DEST_DIR)/1.2/defects/DEF066185.wbxml
+	@echo $(DEST_DIR)/1.2/defects/DEF078987_1.wbxml
+	@echo $(DEST_DIR)/1.2/defects/DEF078987_2.wbxml
+	@echo $(DEST_DIR)/1.2/defects/DEF078668.wbxml
+	@echo $(DEST_DIR)/unknown/DEF078987_3.wbxml
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_wmltestfiledist.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for xml_wmltestfiledist
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_wmltestfiledist.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,94 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(OS), "Windows_NT")
+RMDIR := @rmdir 2>>nul
+else
+RMDIR := @rmdir
+endif
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	DEST_DIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/system/xmltest/wml
+else
+	DEST_DIR = $(EPOCROOT)epoc32/data/z/system/xmltest/wml
+endif
+
+SOURCE_DIR = $(EXTENSION_ROOT)/../test/rtest/data/Wml
+
+# Ensure we have a clean canvas - this also avoids us having to specify
+# switches to commands that are not recognised across platforms.
+CLEAN_DEST :
+	$(call createdir,$(DEST_DIR))
+
+MAKE_DIRS :
+	$(call createdir,$(DEST_DIR)/1.1)
+	$(call createdir,$(DEST_DIR)/codepage)
+	$(call createdir,$(DEST_DIR)/corrupt)
+	$(call createdir,$(DEST_DIR)/unknown)
+
+COPYFILES : CLEAN_DEST MAKE_DIRS
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/1.1/*.wmlc $(DEST_DIR)/1.1/*.wmlc)
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/codepage/*.wmlc $(DEST_DIR)/codepage/*.wmlc)
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/corrupt/*.wmlc $(DEST_DIR)/corrupt/*.wmlc)
+	$(CP) $(call slash2generic, $(SOURCE_DIR)/unknown/*.wmlc $(DEST_DIR)/unknown/*.wmlc)	
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : COPYFILES
+
+CLEAN :
+	$(call createdir,$(DEST_DIR))
+
+BLD : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(DEST_DIR)/1.1/AllElements.wmlc
+	@echo $(DEST_DIR)/1.1/CharEntities.wmlc
+	@echo $(DEST_DIR)/1.1/data.wmlc
+	@echo $(DEST_DIR)/1.1/http___www.bbc.co.uk_mobile_sportheads1.wmlc
+	@echo $(DEST_DIR)/1.1/mob.wmlc
+	@echo $(DEST_DIR)/1.1/Variables.wmlc
+	@echo $(DEST_DIR)/1.1/wireless_char.wmlc
+	@echo $(DEST_DIR)/codepage/wml_data_attr_copepage_255.wmlc
+	@echo $(DEST_DIR)/corrupt/CorruptAttrVal_mob.wmlc
+	@echo $(DEST_DIR)/corrupt/CorruptAttr_mob.wmlc
+	@echo $(DEST_DIR)/corrupt/CorruptTag_AllElements.wmlc
+	@echo $(DEST_DIR)/corrupt/NonNullTermInlineStr.wmlc
+	@echo $(DEST_DIR)/unknown/UnknownPubId_AllElements.wmlc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_xmlcmatchdatapostbuild.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for xml_xmlcmatchdatapostbuild use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/test/xml_xmlcmatchdatapostbuild.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,85 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(OS), "Windows_NT")
+	RMDIR := @rmdir 2>>nul
+	@echo $(OS))
+else
+	RMDIR := @rmdir
+endif
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/xmlramonly
+	SOURCEDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+	SOURCEDIR2 = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/resource/plugins
+else
+	TARGETDIR = $(EPOCROOT)epoc32/data/z/xmlramonly
+	SOURCEDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+	SOURCEDIR2 = $(EPOCROOT)epoc32/data/z/resource/plugins
+endif
+
+# Ensure we have a clean canvas - this also avoids us having to specify
+# switches to commands that are not recognised across platforms.
+CLEAN_DEST :
+	$(call createdir,$(TARGETDIR))
+
+$(TARGETDIR) : 
+	$(call createdir,"$@")
+
+COPYFILES : CLEAN_DEST $(TARGETDIR)
+	$(CP) $(call slash2generic,$(SOURCEDIR)/tu_xmlramparserplugins.dll  $(TARGETDIR)/tu_xmlramparserplugins.dll)
+	$(CP) $(call slash2generic,$(SOURCEDIR2)/tu_xmlramparserplugins.RSC  $(TARGETDIR)/tu_xmlramparserplugins.rsc)
+	-$(ERASE) $(call slash2generic,$(SOURCEDIR)/tu_xmlramparserplugins.dll)
+	-$(ERASE) $(call slash2generic,$(SOURCEDIR2)/tu_xmlramparserplugins.rsc)
+
+DO_NOTHING:
+	@echo do nothing
+
+#
+# The targets invoked by bld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+CLEAN :
+	$(call createdir,$(TARGETDIR))
+
+ifeq ($(PLATFORM), GCCXML)
+BLD : DO_NOTHING
+else
+BLD : COPYFILES
+endif
+
+SAVESPACE : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+RELEASABLES :
+	@echo $(TARGETDIR)/tu_xmlramparserplugins.dll
+	@echo $(TARGETDIR)/tu_xmlramparserplugins.rsc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/word_template.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# template.meta
+# Meta information for template use
+#
+
+platform	win32
+makefile 	gnumake
+techstream	syslibs
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/syslibs/word_template.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,68 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# template.mk
+# Build Word template files
+# 
+#
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+ifeq ($(findstring WINS,$(PLATFORM)),WINS)
+	TARGETDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)/z/private/10003a64
+else
+	# The IBY file uses the template file stored here when building ROMs
+	TARGETDIR = $(EPOCROOT)epoc32/data/z/private/10003a64
+endif
+
+TEMPLATES = $(TARGETDIR)/blank
+
+$(TARGETDIR) :
+	$(call createdir, "$@")
+
+# Well, actually just copy the prebuilt ones for now...
+#  - deleting existing file first (in case it's read-only)
+
+TEMPLATESRCDIR = $(EXTENSION_ROOT)/../utemplat
+
+$(TEMPLATES) : $(TEMPLATESRCDIR)$/BLANK.UK $(TARGETDIR)
+	$(call forceremove,$@)
+	$(call forcecopy,$(TEMPLATESRCDIR)/BLANK.UK,"$@")
+DO_NOTHING :
+	@echo do nothing
+
+# The targets invoked by bld...
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : BLD
+
+BLD : $(TARGETDIR) $(TEMPLATES)
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : DO_NOTHING
+
+CLEAN :
+	-$(ERASE) $(TEMPLATES)
+
+RELEASABLES :
+	@echo $(TEMPLATES)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/techview/uiklaf_resource.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for Uiklad resource generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	techview
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/techview/uiklaf_resource.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,63 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Extension Makefile to check uiklaf generated rsg files against the generic exported uiklafgt rsg files.
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+#----------------------------------------------------------------
+# Check whether the associated RSG header
+# files are identical to those already exported by uiklafGT
+#
+#
+
+INCDIR = $(EPOCROOT)epoc32/include
+INCUIKLAFDIR = $(EPOCROOT)epoc32/include/uiklafgt
+
+DO_NOTHING :
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE : DO_NOTHING
+
+RESOURCE : DO_NOTHING
+
+SAVESPACE : DO_NOTHING
+
+BLD : DO_NOTHING
+
+FREEZE : DO_NOTHING
+
+LIB : DO_NOTHING
+
+CLEANLIB : DO_NOTHING
+
+FINAL : 
+	perl -w $(EXTENSION_ROOT)/rsg_check.pl $(INCDIR)/eikcore.rsg $(INCUIKLAFDIR)/eikcore.rsg
+	perl -w $(EXTENSION_ROOT)/rsg_check.pl $(INCDIR)/eikpriv.rsg $(INCUIKLAFDIR)/eikpriv.rsg
+
+
+ROMFILE : DO_NOTHING
+
+CLEAN : DO_NOTHING
+
+RELEASABLES : DO_NOTHING
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/ant_launch.flm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+JAVABLDDIR := $(EPOCBLD)/$(PLATFORM_PATH)/$(CFG_PATH)
+RELDIR := $(EPOCROOT)/epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+ANTLIBCMD := $(subst \,/,$(ANT_HOME))/bin/ant -lib $(EPOCROOT)/epoc32/tools/java
+ANTBLDFILE := $(TO_BLDINF)/$(BUILD_XML)
+
+JAVAMARKER := $(JAVABLDDIR)/javabld.$(BUILD_XML).done
+
+# Build
+ANTCMD_BUILD := $(ANTLIBCMD) -logger com.symbian.ant.ScanLogger -buildfile $(ANTBLDFILE) -Depoc.build=$(JAVABLDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)/epoc32/tools ; $(GNUTOUCH) $(JAVAMARKER)
+
+TARGET :: $(JAVAMARKER)
+
+$(call raptor_recipe,ant_build,$(JAVAMARKER),$(ANTBLDFILE) $(JAVABLDDIR),$(ANTCMD_BUILD))
+
+# Clean
+ANTCMD_CLEAN := $(ANTLIBCMD) -logger com.symbian.ant.ScanLogger -buildfile $(ANTBLDFILE) -Depoc.build=$(JAVABLDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)/epoc32/tools clean ; $(GNURM) -f $(JAVAMARKER)
+
+$(call raptor_phony_recipe,ant_clean,CLEAN,,$(ANTCMD_CLEAN))
+
+# sbs --what
+JAVARELEASABLES := $(shell $(ANTLIBCMD) -logger com.symbian.ant.AbldWhatLogger -quiet -buildfile $(ANTBLDFILE) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)/epoc32/tools what)
+
+$(eval $(call whatmacro,$(JAVARELEASABLES),USERFLM))
+
+# Create directory
+CREATABLEPATHS := $(JAVABLDDIR)
+$(call makepath,$(CREATABLEPATHS))
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/ant_launch.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for Apache Ant launcher
+#
+
+platform	tools
+makefile 	gnumake
+techstream	developertools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/ant_launch.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,81 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+EXTENSION_ROOT:=$(lastword $(subst :, ,$(EXTENSION_ROOT)))
+BUILDDIR = $(EPOCROOT)epoc32/build$(EXTENSION_ROOT)/$(PLATFORM_PATH)/$(CFG_PATH)
+RELDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)/$(CFG_PATH)
+LIBDIR = $(ANT_HOME)/bin/ant -lib $(EPOCROOT)epoc32/tools/java
+BLDFILE = -buildfile $(EXTENSION_ROOT)/${build_xml}
+
+BUILD = $(BUILDDIR)/${notdir ${build_xml}}_${target}
+HAS_BUILT = ${wildcard ${BUILD}}
+
+DO_NOTHING :
+	@echo Nothing to do
+
+$(BUILDDIR):
+	-$(MKDIR) $(call slash2generic,$$@)
+
+SAVESPACE : BLD	
+MAKMAKE FREEZE LIB CLEANLIB RESOURCE FINAL : DO_NOTHING
+
+
+## Find configuration
+ifeq ($(CFG),REL)
+RELEASE = REL
+endif
+ifeq ($(CFG),UREL)
+RELEASE = UREL
+endif
+
+## Build target
+ifeq ($(CFG),$(RELEASE))
+ifeq ($(strip $(HAS_BUILT)), )
+
+BLD : $(EXTENSION_ROOT)/${build_xml} $(BUILDDIR)
+	$(LIBDIR) -logger com.symbian.ant.ScanLogger $(BLDFILE) -Depoc.build=$(BUILDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools ${args} ${target}
+	echo $(BUILDDIR)/${build_xml} ${target} > ${BUILD}
+else
+BLD : ${BUILD}
+	@echo The java component ${target} has already been built. Clean to rebuild.
+endif
+else
+BLD : DO_NOTHING
+endif
+
+
+## Allow for a abld reallyclean
+ifeq ($(CFG),$(RELEASE))
+ifneq ($(strip $(HAS_BUILT)), )
+
+CLEAN : ${BUILD}
+	$(LIBDIR) -logger com.symbian.ant.ScanLogger $(BLDFILE) -Depoc.build=$(BUILDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools clean 
+	${RM} ${BUILD}
+else
+CLEAN : DO_NOTHING
+endif
+else
+CLEAN : DO_NOTHING
+endif
+
+
+## Allow for a abld -what
+RELEASABLES :
+	$(LIBDIR) -logger com.symbian.ant.AbldWhatLogger -quiet $(BLDFILE) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools what
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/ant_launch.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+<?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 build/2_0.xsd">
+
+  <!-- Extension interfaces : replacements for Template Extension Makefiles -->
+  <interface name="tools.ant_launch" extends="Symbian.UserFLM" flm="ant_launch.flm">
+    <param name="BUILD_XML" />
+  </interface>
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/apply_imgtools_variants.xml	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,11 @@
+<?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 build/2_0.xsd">
+ 
+	<var name="apply_mingw_libs">
+		<set name="LINKER_OPTIONS" value="-lwsock32" />
+	</var>
+  
+</build>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/bldex.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stlport builds
+#
+
+platform	win32
+makefile 	gnumake
+techstream	tools
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/bldex.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,75 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Generate some source files
+# Note that the YACC and LEX tools used expect to see Unix-style
+# path names and will hang horribly if given DOS pathnames
+# 
+#
+
+FIXSLASHES:=$(subst \,/,$(EPOCROOT))
+EPOCROOTABS:=$(patsubst %/,%,$(FIXSLASHES))
+EPOCROOT:=$(EPOCROOTABS)/
+
+YACC_VERSION:=$(EPOCROOT)epoc32/gcc/bin/bison
+LEX_VERSION:=$(EPOCROOT)epoc32/gcc/bin/flex
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+LEXSOURCE:=$(EXTENSION_ROOT)/$(LEXSOURCE)
+YACCSOURCE:=$(EXTENSION_ROOT)/$(YACCSOURCE)
+
+GENERATED_FILES= \
+	$(EPOCROOT)epoc32/build/rcomp/build/rcomp.cpp \
+	$(EPOCROOT)epoc32/build/rcomp/build/rcomp.hpp \
+	$(EPOCROOT)epoc32/build/rcomp/build/rcompl.cpp
+
+$(EPOCROOT)epoc32/build/rcomp/build/rcompl.cpp : $(LEXSOURCE)
+	$(call createdir,$(EPOCROOT)epoc32/build/rcomp/build)
+	$(LEX_VERSION) -t $< > $@
+
+$(EPOCROOT)epoc32/build/rcomp/build/rcomp.cpp $(EPOCROOT)epoc32/build/rcomp/build/rcomp.hpp : $(YACCSOURCE)
+	$(call createdir,$(EPOCROOT)epoc32/build/rcomp/build)
+	$(YACC_VERSION) -d -o $@ $<
+
+do_nothing:
+	
+
+#
+# The targets invoked by bld...
+#
+
+# Do the work in the MAKMAKE target, in the hope of getting the files
+# created in time to scan them in the processing of RCOMP.MMP
+
+MAKMAKE : $(GENERATED_FILES)
+
+BLD : MAKMAKE
+
+SAVESPACE : MAKMAKE
+
+CLEAN : 
+	$(call remove,$(GENERATED_FILES))
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+RELEASABLES : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/compsupp.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the config extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	Tools
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/compsupp.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,43 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+do_nothing:
+
+MAKMAKE : do_nothing
+
+FREEZE : do_nothing
+
+LIB :
+	unzip -o $(FILE) -d $(TODIR)
+
+CLEANLIB : do_nothing
+
+RESOURCE : do_nothing
+
+FINAL : do_nothing
+
+BLD : do_nothing
+
+SAVESPACE : do_nothing
+
+RELEASABLES :
+		@perl -S $(EPOCROOT)epoc32/tools/listzip.pl $(EPOCROOT)epoc32/release $(FILE)
+
+CLEAN : do_nothing
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/features.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for features file generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/features.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,78 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# This makefile template is used to generate header/iby/features.dat file
+# 
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+ifeq "$(CFG_PATH)" "rel"
+
+FEAT_TOOL := perl -S $(call slash2generic,features.pl)
+
+ifndef FEAT_DATABASE
+FEAT_DATABASE := $(EPOCROOT)epoc32/rom/include/featuredatabase.xml
+endif
+
+ifndef FEAT_HEADER_PATH
+FEAT_HEADER_PATH := $(EPOCROOT)epoc32/include
+endif
+
+ifndef FEAT_IBY_PATH
+FEAT_IBY_PATH := $(EPOCROOT)epoc32/rom/include
+endif
+
+ifndef FEAT_DAT_PATH
+FEAT_DAT_PATH := $(EPOCROOT)epoc32/data/config
+endif
+
+# Features tool will be invoked here
+ALL:
+	$(FEAT_TOOL) --datfile=$(FEAT_DAT_PATH) --hdrfile=$(FEAT_HEADER_PATH) --ibyfile=$(FEAT_IBY_PATH) $(FEAT_DATABASE)
+
+
+BLD SAVESPACE: ALL
+
+CLEAN :
+	-$(ERASE) $(call slash2generic,$(FEAT_HEADER_PATH)/featureuids.h)
+	-$(ERASE) $(call slash2generic,$(FEAT_IBY_PATH)/feature.iby)
+	-$(ERASE) $(call slash2generic,$(FEAT_DAT_PATH)/features.dat)
+
+RELEASABLES :
+	@echo $(FEAT_HEADER_PATH)/featureuids.h
+	@echo $(FEAT_IBY_PATH)/feature.iby
+	@echo $(FEAT_DAT_PATH)/features.dat
+	
+DO_NOTHING :
+	@echo do nothing
+	
+MAKMAKE : DO_NOTHING
+FREEZE : DO_NOTHING
+LIB : DO_NOTHING
+CLEANLIB : DO_NOTHING
+RESOURCE : DO_NOTHING
+FINAL : DO_NOTHING
+
+#if $(CFG_PATH) == "deb"
+else
+
+FINAL FREEZE LIB CLEANLIB RESOURCE RELEASABLES CLEAN BLD SAVESPACE MAKMAKE :
+
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/jni_ant_launch.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for Apache Ant launcher
+#
+
+platform	tools
+makefile 	gnumake
+techstream	developertools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/jni_ant_launch.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,64 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+# Get standard shell definitions
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+LETTERS:=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
+
+# Raptor includes the drive letter on paths - this makefile can't handle the drive letter
+# If we don't do this we get "multiple target patterns" errors in sbsv2
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),$(subst $(let):,,$(EPOCROOT)))))
+ifneq ($(TMPROOT),)
+	EPOCROOT:=$(TMPROOT)
+endif
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EXTENSION_ROOT)),$(subst $(let):,,$(EXTENSION_ROOT)))))
+ifneq ($(TMPROOT),)
+	EXTENSION_ROOT:=$(TMPROOT)
+endif
+
+
+BUILDDIR = $(EPOCROOT)epoc32/build/$(EXTENSION_ROOT)/$(PLATFORM_PATH)
+RELDIR = $(EPOCROOT)epoc32/release/$(PLATFORM_PATH)
+LIBDIR = $(ANT_HOME)/bin/ant -lib $(EPOCROOT)epoc32/tools/java
+BLDFILE = -buildfile $(EXTENSION_ROOT)/build.xml
+
+BUILD = $(BUILDDIR)/${notdir ${build_xml}}_${target}
+HAS_BUILT = ${wildcard ${BUILD}}
+
+DO_NOTHING :
+	@echo Nothing to do
+
+SAVESPACE : BLD	
+MAKMAKE FREEZE CLEANLIB RESOURCE FINAL : DO_NOTHING
+
+BLD: DO_NOTHING
+
+LIB:
+	@$(call createdir,"$(BUILDDIR)")
+	$(LIBDIR) -logger com.symbian.ant.ScanLogger $(BLDFILE) -Depoc.build=$(BUILDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools ${args} ${target}
+	echo $(BUILDDIR)/${build_xml} ${target} > ${BUILD}	
+
+## Allow for a abld reallyclean
+CLEAN :
+	$(LIBDIR) -logger com.symbian.ant.ScanLogger $(BLDFILE) -Depoc.build=$(BUILDDIR) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools clean 
+
+## Allow for a abld -what
+RELEASABLES : 
+	$(LIBDIR) -logger com.symbian.ant.AbldWhatLogger -quiet $(BLDFILE) -Depoc.rel=$(RELDIR) -Dtools.rel=$(EPOCROOT)tools what
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/kif.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for Kit Information file generation
+#
+
+platform	win32
+makefile 	gnumake
+techstream	productcreationtools
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/kif.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,60 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Invoke genkif.pl to create the Kit Information File
+# 
+#
+
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+do_nothing :
+	
+
+#
+# The targets invoked by abld 
+#
+
+MAKMAKE : do_nothing
+
+RESOURCE : do_nothing
+
+SAVESPACE : BLD
+
+BLD : 
+ifeq ($(CFG),REL)
+	perl ${EPOCROOT}epoc32/tools/genkif.pl -o ${EPOCROOT}epoc32/data/kif.xml
+endif
+
+FREEZE : do_nothing
+
+LIB : do_nothing
+
+CLEANLIB : do_nothing
+
+FINAL : do_nothing
+
+CLEAN : 
+ifeq ($(CFG),REL)
+	$(call remove,${EPOCROOT}epoc32/data/kif.xml)
+endif
+
+RELEASABLES : 
+ifeq ($(CFG),REL)	
+	@echo ${EPOCROOT}epoc32/data/kif.xml	
+endif
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/py2exe.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for Python Py2exe
+#
+
+platform	tools tools2
+makefile 	gnumake
+techstream	productcreationtools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/py2exe.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,39 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+MAKMAKE :
+	@python $(EXTENSION_ROOT)/$(RAPTOR_SCRIPTS_LOC)$(SETUP_SCRIPT) py2exe $(EXTENSION_ROOT)/$(RAPTOR_SCRIPTS_LOC)$(ENTRY_POINT) $(EXTENSION_ROOT)/$(DIST_DIR)
+
+CLEAN :
+	@del $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)*.pyd))
+	@del $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)library.zip)
+	@del $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)MSVCR*.dll))
+	@del $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)python*.dll))
+	@del $(subst .py,.exe, $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)$(ENTRY_POINT)))
+	@del $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)w9xpopen.exe)
+
+RELEASABLES :
+	@echo $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)*.pyd))
+	@echo $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)library.zip)
+	@echo $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)MSVCR*.dll))
+	@echo $(subst /,\, $(wildcard $(EXTENSION_ROOT)\$(DIST_DIR)python*.dll))
+	@echo $(subst .py,.exe, $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)$(ENTRY_POINT)))
+	@echo $(subst /,\, $(EXTENSION_ROOT)\$(DIST_DIR)w9xpopen.exe)
+
+# Dummy target
+DO_NOTHING :
+	
+BLD LIB SAVESPACE FREEZE CLEANLIB RESOURCE FINAL : DO_NOTHING
+	
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/raptor_linux_dist.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stlport builds
+#
+
+platform	win32
+makefile 	gnumake
+techstream	tools
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/raptor_linux_dist.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+MAKMAKE :
+	cd "$(subst /,\,$(EXTENSION_ROOT)/..)"; python python/sbs_dist.py $(RAPTOR_DIST) $(RAPTOR_DIST_INCLUDE_DIRS)
+
+# Dummy target
+DO_NOTHING :
+
+RELEASABLES CLEAN BLD LIB SAVESPACE FREEZE CLEANLIB RESOURCE FINAL : DO_NOTHING
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/stlport.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for stlport builds
+#
+
+platform	win32
+makefile 	gnumake
+techstream	tools
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/stlport.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,91 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+# To ensure that EPOCROOT always ends with a forward slash
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+
+SOURCE_ARCHIVE:=$(EXTENSION_ROOT)/$(SOURCE_ARCHIVE)
+
+ISPATH:=$(call settPath)
+
+ifeq "$(ISPATH)" "1"
+Path:=$(EPOCROOT)epoc32/gcc_mingw/bin;$(Path)
+PATH:=$(Path)
+endif
+
+
+EXTRACT_DIR=$(EPOCROOT)epoc32/build
+STL_DIR=$(EXTRACT_DIR)/STLport-$(STLPORT_VERSION)
+BUILD_DIR=$(STL_DIR)/build/lib
+UNZIPPED=$(STL_DIR)/unzipped.ok
+
+RELEASE_DIR=$(EPOCROOT)epoc32/release/tools2
+RELEASE_DIR_REL=$(RELEASE_DIR)/rel
+RELEASE_DIR_DEB=$(RELEASE_DIR)/deb
+RELEASE_DIRS=$(RELEASE_DIR_REL) $(RELEASE_DIR_DEB)
+
+STL_REL_LIB_PATH=$(STL_DIR)/lib/libstlport.a
+STL_DEB_LIB_PATH=$(STL_DIR)/lib/libstlportg.a
+
+REL_LIB=$(RELEASE_DIR_REL)/$(STL_REL_LIB_NAME)
+DEB_LIB=$(RELEASE_DIR_DEB)/$(STL_REL_LIB_NAME)
+
+STL_HEADERS_PATH=$(EPOCROOT)epoc32/include/tools/stlport
+
+
+$(UNZIPPED): $(SOURCE_ARCHIVE)  $(EXTRACT_DIR)
+	unzip -o $(SOURCE_ARCHIVE) -d $(EXTRACT_DIR)
+	
+
+$(REL_LIB): $(UNZIPPED) $(STL_REL_LIB_PATH)  $(RELEASE_DIR_REL)
+	$(call ecopy) $(STL_REL_LIB_PATH) $(REL_LIB)
+
+$(DEB_LIB): $(UNZIPPED) $(STL_DEB_LIB_PATH)  $(RELEASE_DIR_DEB)
+	$(call ecopy) $(STL_DEB_LIB_PATH) $(DEB_LIB)
+
+LIB: $(REL_LIB) $(DEB_LIB)
+
+
+$(EXTRACT_DIR) $(RELEASE_DIRS):
+	$(call createdir,$@)
+
+# -Wno-uninitialized is needed by mingw gcc v3.4.5 because it gets
+#  # confused by some of the STLport source and gives this error erroneously
+export EXTRA_CXXFLAGS=-Wno-uninitialized
+
+$(STL_REL_LIB_PATH) (STL_DEB_LIB_PATH):
+	$(call tmpmacro)
+	make -C $(BUILD_DIR) -fgcc.mak install-release-static install-dbg-static LIB_SUFFIX=
+	
+CLEAN:
+	$(call remove,$(REL_LIB))
+	$(call remove,$(DEB_LIB))
+	make -C $(BUILD_DIR) -fgcc.mak clobber LIB_SUFFIX=
+	$(call remove,$(STL_DIR))
+
+
+RELEASABLES:
+	@echo $(REL_LIB)
+	@echo $(DEB_LIB)
+	
+
+MAKMAKE BLD SAVESPACE FREEZE CLEANLIB RESOURCE FINAL:
+	@echo $@ does nothing in $(TEMPLATE_EXTENSION_MAKEFILE)
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/x86tool.meta	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+# 
+# Contributors:
+#
+# Description:
+# Meta information for the GNU makesis extension template
+#
+
+platform	win32
+makefile 	gnumake
+techstream	tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/extension/tools/x86tool.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,373 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# /epoc32/tools/makefile_templates/tools/x86tool.mk
+# SBSv2 issues and differences from SBSv1
+# 1/ The shell is different
+# 2/ The msys shell can't handle absolute paths from root without the drive letter e.g. it can't find /epoc32 but it can find x:/epoc32
+# workaround is to go back to TO_ROOT
+# 3/ The current directory is at the bld.inf rather than /epoc32/build
+# 4/ Backslash is problematic
+# 5/ Path variables include the drive letter x: which causes problems for make when used in targets due to :
+# 6/ TO_ROOT is not defined
+# 7/ Some tool compatibility is problematic e.g. createdir doesn't work with paths containing forward slash
+# 
+#
+
+# If this environment variable is defined we're definitely building for win32
+ifdef ComSpec
+WIN32:=1
+endif
+
+space:=
+space+=
+LETTERS:=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
+
+# If win32 isn't defined yet - then we're probably building on sbsv2
+# So see if EPOCROOT starts with a drive letter to work out if we're building for win32
+ifndef WIN32
+  ifneq ($(subst $(space),,$(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),1,))),)
+    WIN32:=1
+  endif
+endif
+
+# To guarantee there is a slash at the end of EPOCROOT in case there is not.
+# This is needed to ensure compatibility with SBSv1.
+TMPROOT:=$(subst \,/,$(EPOCROOT))
+EPOCROOT:=$(patsubst %/,%,$(TMPROOT))/
+
+# Get standard shell definitions
+include $(EPOCROOT)epoc32/tools/shell/$(notdir $(basename $(SHELL))).mk
+
+# Raptor includes the drive letter on paths - this makefile can't handle the drive letter
+# If we don't do this we get "multiple target patterns" errors in sbsv2
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EPOCROOT)),$(subst $(let):,,$(EPOCROOT)))))
+ifneq ($(TMPROOT),)
+  EPOCROOT:=$(TMPROOT)
+endif
+TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(EXTENSION_ROOT)),$(subst $(let):,,$(EXTENSION_ROOT)))))
+ifneq ($(TMPROOT),)
+  EXTENSION_ROOT:=$(TMPROOT)
+endif
+
+# Make up for raptor not defining TO_ROOT properly
+# This might get broken if they change the current directory (which should really be in /epoc32/build)
+# We're using TO_ROOT to handle the fact that the msys shell doesn't seem to handle absolute paths
+ifdef WIN32
+  ifeq ($(TO_ROOT),)
+    TMPROOT:=$(strip $(foreach let,$(LETTERS),$(if $(findstring $(let):,$(TO_BLDINF)),$(subst $(let):,,$(TO_BLDINF)))))
+    TO_ROOT:=.$(subst $(space),,$(foreach word,$(subst /,$(space),$(TMPROOT)),/..))
+  endif
+endif
+
+# Handle inconsistent case for build variant
+CFG_PATH:=$(CFG)
+ifeq ($(CFG_PATH),DEB)
+  CFG_PATH:=deb
+endif
+ifeq ($(CFG_PATH),REL)
+  CFG_PATH:=rel
+endif
+
+# Set the following to enable code coverage stats
+CODE_COVERAGE:=
+
+# Build
+ifdef WIN32
+  TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/rel/
+  TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/deb/
+  GCOVDIR:=$(if $(CODE_COVERAGE),$(EPOCROOT)epoc32/gcc_mingw/libgcc/mingw32/3.4.5/)
+else
+  TARGET_DIR_REL:=$(EPOCROOT)epoc32/release/tools2/linux-i386/rel/
+  TARGET_DIR_DEB:=$(EPOCROOT)epoc32/release/tools2/linux-i386/deb/
+endif
+
+# The root to the source code - paths are relative to bld.inf if NOT specified
+# If SOURCE_ROOT specified then it's relative to EPOCROOT
+ifndef SOURCE_ROOT
+  ROOT:=$(subst \,/,$(EXTENSION_ROOT))
+  OBJSUBST:=/
+else
+  ROOT:=$(EPOCROOT)$(subst $(space)/,/,$(SOURCE_ROOT))
+  OBJSUBST:=$(EPOCROOT)
+endif
+
+# ***
+# STATIC LIBRARY
+#
+ifeq ($(TARGET_TYPE),lib)
+  TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
+  TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,.a)
+
+  ifeq ($(CFG_PATH),deb)
+    TARGET_LIB:=$(TARGET_FULLNAME_DEB)
+  endif
+  ifeq ($(CFG_PATH),rel)
+    TARGET_LIB:=$(TARGET_FULLNAME_REL)
+  endif
+  TARGET_LIB?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+endif
+
+# ***
+# EXE
+#
+ifeq ($(TARGET_TYPE),exe)
+  TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
+  TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.exe))
+
+  ifeq ($(CFG_PATH),deb)
+    TARGET_BLD:=$(TARGET_FULLNAME_DEB)
+  endif
+  ifeq ($(CFG_PATH),rel)
+    TARGET_BLD:=$(TARGET_FULLNAME_REL)
+  endif
+  TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+
+  LIBS+=symexestub
+  ifdef STLPORT
+    LIBS+=-lstlport.5.1
+  endif
+endif
+
+# ***
+# DLL/SO
+#
+ifeq ($(TARGET_TYPE),dll)
+
+  TARGET_FULLNAME_REL:=$(TARGET_DIR_REL)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
+  TARGET_FULLNAME_DEB:=$(TARGET_DIR_DEB)$(TARGET_SUB_DIR)lib$(TARGET_NAME)$(if $(findstring .,$(TARGET_NAME)),,$(if $(WIN32),.dll,.so))
+
+  ifeq ($(CFG_PATH),deb)
+    TARGET_BLD:=$(TARGET_FULLNAME_DEB)
+  endif
+  ifeq ($(CFG_PATH),rel)
+    TARGET_BLD:=$(TARGET_FULLNAME_REL)
+  endif
+  TARGET_BLD?=$(TARGET_FULLNAME_REL) $(TARGET_FULLNAME_DEB)
+
+  ifdef STLPORT
+    LIBS+=-lstlport.5.1
+  endif
+endif
+
+# Pick up MINGW compiler from epoc32 on Windows
+ifdef WIN32
+  AR:=$(EPOCROOT)epoc32/gcc_mingw/bin/ar
+  CXX:=$(EPOCROOT)epoc32/gcc_mingw/bin/g++
+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_COMMON:=$(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)"'
+CXXDEFS_DEB:=$(CXXDEFS_COMMON) -D_DEBUG
+CXXDEFS_REL:=$(CXXDEFS_COMMON)
+
+# Setup the command line options for the compiler
+PREINC=$(EPOCROOT)epoc32/include/x86tool/x86tool.h
+CXXOPT_DEB:=-fshort-wchar -x c++ -O0 -g3 -Wall -c -fmessage-length=0 -include $(PREINC) -masm=intel
+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
+CXXOPT_REL:=-fshort-wchar -x c++ -Wall -c -fmessage-length=0 -include $(PREINC) $(if $(CODE_COVERAGE),-O0,$(OPTIMISE)) -masm=intel
+
+# Allow specification of additional build include file
+ifdef BUILDINC
+  CXXOPT_DEB+= -include $(BUILDINC)
+  CXXOPT_REL+= -include $(BUILDINC)
+endif
+
+# Extra options needed for cia files
+ASMOPT:=-fomit-frame-pointer
+
+# Linker options for DLL
+ifndef DLL_WIN_LINKER_OPTS
+  DLL_WIN_LINKER_OPTS:= $(if $(CODE_COVERAGE),-lgcov) -Wl,-export-all-symbols
+endif
+ifndef DLL_LIN_LINKER_OPTS
+  DLL_LIN_LINKER_OPTS:= -Wl,-export-all-symbols $(if $(CODE_COVERAGE),-lgcov) -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 $(ROOT)/$(dir)/*.$(ext))))) \
+  $(foreach src,$(SOURCE),$(ROOT)/$(if $(SOURCE_FOLDER),$(SOURCE_FOLDER)/)$(src)) \
+  $(foreach src,$(SOURCE_MOD),$(subst \,/,$(EXTENSION_ROOT))/$(src)) \
+  $(foreach id,$(SOURCE_IDS),$(foreach src,$($(id)_SOURCE),$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT))/$(src))))
+
+# Include folders
+CXXINC:=$(foreach inc,$(INCLUDES) $(SOURCE_DIRS),-I$(ROOT)/$(inc)) \
+  $(foreach inc,$(SYS_INCLUDES),-I$(EPOCROOT)$(inc)) -I$(ROOT) \
+  $(foreach id,$(SOURCE_IDS),$(foreach inc,$($(id)_SOURCE_INC),-I$(subst $(space)/,/,$(if $($(id)_SOURCE_ROOT),$(EPOCROOT)$($(id)_SOURCE_ROOT),$(ROOT)))/$(inc)))
+
+# 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
+
+# Support for building JNI
+ifdef JAVA_JNI
+  CXXINC+= -I"$(JAVA_HOME)/include"
+  ifdef WIN32
+    CXXINC+= -I"$(JAVA_HOME)/include/win32"
+  else
+    CXXINC+= -I"$(JAVA_HOME)/include/linux"
+  endif
+endif
+
+
+# STL Port support needed? Note STL and Symbian won't mix!
+ifdef STLPORT
+  CXXINC+= -I$(EPOCROOT)epoc32/include/tools/stlport 
+endif
+
+# ***
+# DEBUG
+#
+
+# Object files are the same name as the source files with a .o extension
+OBJECTFILES_DEB:=$(foreach src,$(SOURCE_FILES),deb$(src).o)
+
+# Compile
+$(OBJECTFILES_DEB) : $(PREINC) $(SOURCE_FILES)
+	@echo ***
+	@echo Making: $@
+	$(call createdir,$(dir $@))
+	$(CXX) $(CXXDEFS_DEB) $(CXXINC) -I$(subst deb$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_DEB) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst deb$(OBJSUBST),$(OBJSUBST),$(basename $@))
+
+# Link
+$(TARGET_FULLNAME_DEB) : $(OBJECTFILES_DEB) $(foreach lib,$(LIBS),$(TARGET_DIR_DEB)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_DEB)lib$(lib)$(if $(WIN32),.a,.so))
+ifeq ($(TARGET_TYPE),lib)
+	@echo ***
+	@echo Creating lib: $@
+	$(AR) -r $(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB)
+endif
+ifeq ($(TARGET_TYPE),exe)
+	@echo ***
+	@echo Creating exe: $@
+	$(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+		-o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		$(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
+endif
+ifeq ($(TARGET_TYPE),dll)
+  ifdef WIN32
+	@echo ***
+	@echo Creating Windows dll: $@
+	$(CXX) -L$(TARGET_DIR_DEB) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+		-shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		-Wl,-out-implib,$(@D)/$(basename $(@F)).a \
+		$(DLL_WIN_LINKER_OPTS)
+  else
+	@echo ***
+	@echo Creating Linux shared object: $@
+	$(CXX) -L$(TARGET_DIR_DEB) \
+		-shared -o$(TARGET_FULLNAME_DEB) $(OBJECTFILES_DEB) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		$(DLL_LIN_LINKER_OPTS)
+  endif
+endif
+
+# ***
+# RELEASE
+#
+
+# Object files are the same name as the source files with a .o extension
+OBJECTFILES_REL:=$(foreach src,$(SOURCE_FILES),rel$(src).o)
+
+# Compile
+$(OBJECTFILES_REL) : $(PREINC) $(SOURCE_FILES)
+	@echo ***
+	@echo Making: $@
+	$(call createdir,$(dir $@))
+	$(CXX) $(CXXDEFS_REL) $(CXXINC) -I$(subst rel$(OBJSUBST),$(OBJSUBST),$(dir $@)) $(CXXOPT_REL) $(if $(findstring .cia,$@),$(ASMOPT),$(if $(CODE_COVERAGE),-fprofile-arcs -ftest-coverage)) -o$@ $(subst rel$(OBJSUBST),$(OBJSUBST),$(basename $@))
+
+# Link
+$(TARGET_FULLNAME_REL) : $(OBJECTFILES_REL) $(foreach lib,$(LIBS),$(TARGET_DIR_REL)lib$(lib).a) $(foreach lib,$(SHARED_LIBS),$(TARGET_DIR_REL)lib$(lib)$(if $(WIN32),.a,.so))
+ifeq ($(TARGET_TYPE),lib)
+	@echo ***
+	@echo Creating lib: $@
+	$(AR) -r $(TARGET_FULLNAME_REL) $(OBJECTFILES_REL)
+endif
+ifeq ($(TARGET_TYPE),exe)
+	@echo ***
+	@echo Creating exe: $@
+	$(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+		-o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		$(if $(CODE_COVERAGE),-lgcov) $(if $(WIN32),,-ldl)
+endif
+ifeq ($(TARGET_TYPE),dll)
+  ifdef WIN32
+	@echo ***
+	@echo Creating Windows dll: $@	
+	$(CXX) -L$(TARGET_DIR_REL) $(if $(GCOVDIR),-L$(GCOVDIR)) \
+		-shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		-Wl,-out-implib,$(@D)/$(basename $(@F)).a \
+		$(DLL_WIN_LINKER_OPTS)
+  else
+	@echo ***
+	@echo Creating Linux shared object: $@
+	$(CXX) -L$(TARGET_DIR_REL) \
+		-shared -o$(TARGET_FULLNAME_REL) $(OBJECTFILES_REL) \
+		$(foreach lib,$(LIBS) $(SHARED_LIBS), -l$(lib)) \
+		$(DLL_LIN_LINKER_OPTS)
+  endif
+endif
+
+do_nothing:
+
+#
+# The targets invoked by abld...
+#
+
+MAKMAKE : do_nothing
+FREEZE : do_nothing
+RESOURCE : do_nothing
+CLEANLIB : do_nothing
+FINAL : do_nothing
+
+SAVESPACE :
+ifeq ($(CFG_PATH),deb)
+	$(call remove,$(OBJECTFILES_DEB))
+endif
+ifeq ($(CFG_PATH),rel)
+	$(call remove,$(OBJECTFILES_REL))
+endif
+
+LIB : $(TARGET_LIB)
+
+BLD : $(TARGET_BLD)
+
+CLEAN :
+	$(call remove,$(foreach file,$(TARGET_LIB) $(TARGET_BLD),$(TO_ROOT)$(file)))
+ifeq ($(CFG_PATH),deb)
+	$(call remove,$(OBJECTFILES_DEB))
+endif
+ifeq ($(CFG_PATH),rel)
+	$(call remove,$(OBJECTFILES_REL))
+endif
+
+RELEASABLES :
+	@echo $(TARGET_LIB) $(TARGET_BLD)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,178 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+../bin/java/symbianant.jar  /epoc32/tools/java/symbianant.jar
+../extension/application-protocols/buildstubsis.meta 	/epoc32/tools/makefile_templates/application-protocols/buildstubsis.meta			
+../extension/application-protocols/buildstubsis.mk 	/epoc32/tools/makefile_templates/application-protocols/buildstubsis.mk			
+../extension/app-services/buildstubsis.meta 		/epoc32/tools/makefile_templates/app-services/buildstubsis.meta		
+../extension/app-services/buildstubsis.mk 		/epoc32/tools/makefile_templates/app-services/buildstubsis.mk		
+../extension/app-services/buildupgradesis.meta 		/epoc32/tools/makefile_templates/app-services/buildupgradesis.meta		
+../extension/app-services/buildupgradesis.mk 		/epoc32/tools/makefile_templates/app-services/buildupgradesis.mk		
+../extension/app-services/tzlocaltestserver.meta	/epoc32/tools/makefile_templates/app-services/tzlocaltestserver.meta			
+../extension/app-services/tzlocaltestserver.mk		/epoc32/tools/makefile_templates/app-services/tzlocaltestserver.mk		
+../extension/app-services/wlddatabasekit_sec.meta	/epoc32/tools/makefile_templates/app-services/wlddatabasekit_sec.meta			
+../extension/app-services/wlddatabasekit_sec.mk 		/epoc32/tools/makefile_templates/app-services/wlddatabasekit_sec.mk		
+../extension/base/base_rvct_common.mk		/epoc32/tools/makefile_templates/base/base_rvct_common.mk		
+../extension/base/bootstrap.meta 	/epoc32/tools/makefile_templates/base/bootstrap.meta			
+../extension/base/bootstrap.mk 		/epoc32/tools/makefile_templates/base/bootstrap.mk
+../extension/base/bootstrap.flm 	/epoc32/tools/makefile_templates/base/bootstrap.flm			
+../extension/base/bootstrap.xml		/epoc32/tools/makefile_templates/base/bootstrap.xml			
+../extension/base/config.meta 		/epoc32/tools/makefile_templates/base/config.meta		
+../extension/base/config.mk 		/epoc32/tools/makefile_templates/base/config.mk		
+../extension/base/copy_default.meta 	/epoc32/tools/makefile_templates/base/copy_default.meta			
+../extension/base/copy_default.mk 	/epoc32/tools/makefile_templates/base/copy_default.mk			
+../extension/base/genexec.meta 		/epoc32/tools/makefile_templates/base/genexec.meta		
+../extension/base/genexec.mk 		/epoc32/tools/makefile_templates/base/genexec.mk		
+../extension/base/h2_genbootinc.meta 	/epoc32/tools/makefile_templates/base/h2_genbootinc.meta			
+../extension/base/h2_genbootinc.mk 	/epoc32/tools/makefile_templates/base/h2_genbootinc.mk			
+../extension/base/h2_restricted_coreldr.meta 	/epoc32/tools/makefile_templates/base/h2_restricted_coreldr.meta			
+../extension/base/h2_restricted_coreldr.mk 	/epoc32/tools/makefile_templates/base/h2_restricted_coreldr.mk			
+../extension/base/h4_genbootinc.meta 		/epoc32/tools/makefile_templates/base/h4_genbootinc.meta		
+../extension/base/h4_genbootinc.mk 		/epoc32/tools/makefile_templates/base/h4_genbootinc.mk		
+../extension/base/h4_restricted_coreldr.meta 	/epoc32/tools/makefile_templates/base/h4_restricted_coreldr.meta			
+../extension/base/h4_restricted_coreldr.mk 	/epoc32/tools/makefile_templates/base/h4_restricted_coreldr.mk			
+../extension/base/h4_restricted_on_coreldr.meta 	/epoc32/tools/makefile_templates/base/h4_restricted_on_coreldr.meta			
+../extension/base/h4_restricted_on_coreldr.mk 	/epoc32/tools/makefile_templates/base/h4_restricted_on_coreldr.mk			
+../extension/base/h4_restricted_on_miniboot.meta 	/epoc32/tools/makefile_templates/base/h4_restricted_on_miniboot.meta			
+../extension/base/h4_restricted_on_miniboot.mk	/epoc32/tools/makefile_templates/base/h4_restricted_on_miniboot.mk			
+../extension/base/integrator_lmnand2_coreldr.meta 	/epoc32/tools/makefile_templates/base/integrator_lmnand2_coreldr.meta			
+../extension/base/integrator_lmnand2_coreldr.mk 		/epoc32/tools/makefile_templates/base/integrator_lmnand2_coreldr.mk		
+../extension/base/integrator_lmnand2_miniboot.meta 	/epoc32/tools/makefile_templates/base/integrator_lmnand2_miniboot.meta			
+../extension/base/integrator_lmnand2_miniboot.mk 	/epoc32/tools/makefile_templates/base/integrator_lmnand2_miniboot.mk			
+../extension/base/lab_restricted_miniboot.flm		/epoc32/tools/makefile_templates/base/lab_restricted_miniboot.flm		
+../extension/base/lab_restricted_miniboot.meta		/epoc32/tools/makefile_templates/base/lab_restricted_miniboot.meta		
+../extension/base/lab_restricted_miniboot.mk		/epoc32/tools/makefile_templates/base/lab_restricted_miniboot.mk		
+../extension/base/lab_restricted_miniboot.xml		/epoc32/tools/makefile_templates/base/lab_restricted_miniboot.xml		
+../extension/base/lubbock_coreldr.meta 		/epoc32/tools/makefile_templates/base/lubbock_coreldr.meta		
+../extension/base/lubbock_coreldr.mk 		/epoc32/tools/makefile_templates/base/lubbock_coreldr.mk		
+../extension/base/lubbock_miniboot.meta 		/epoc32/tools/makefile_templates/base/lubbock_miniboot.meta		
+../extension/base/lubbock_miniboot.mk 		/epoc32/tools/makefile_templates/base/lubbock_miniboot.mk		
+../extension/base/nand_fbr_offset.meta 		/epoc32/tools/makefile_templates/base/nand_fbr_offset.meta		
+../extension/base/nand_fbr_offset.mk 		/epoc32/tools/makefile_templates/base/nand_fbr_offset.mk		
+../extension/base/ne1_tb_genbootinc.meta				/epoc32/tools/makefile_templates/base/ne1_tb_genbootinc.meta
+../extension/base/ne1_tb_genbootinc.mk 				/epoc32/tools/makefile_templates/base/ne1_tb_genbootinc.mk
+../extension/base/ne1_tb_restricted_coreldr.flm		/epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.flm		
+../extension/base/ne1_tb_restricted_coreldr.meta 	/epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.meta			
+../extension/base/ne1_tb_restricted_coreldr.mk 		/epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.mk		
+../extension/base/ne1_tb_restricted_coreldr.xml		/epoc32/tools/makefile_templates/base/ne1_tb_restricted_coreldr.xml		
+../extension/base/omap3_genbootinc.meta		/epoc32/tools/makefile_templates/base/omap3_genbootinc.meta		
+../extension/base/omap3_genbootinc.mk		/epoc32/tools/makefile_templates/base/omap3_genbootinc.mk		
+../extension/base/omap3_restricted_coreldr.flm		/epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.flm		
+../extension/base/omap3_restricted_coreldr.meta		/epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.meta		
+../extension/base/omap3_restricted_coreldr.mk		/epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.mk		
+../extension/base/omap3_restricted_coreldr.xml		/epoc32/tools/makefile_templates/base/omap3_restricted_coreldr.xml		
+../extension/converged-comms/createcommdbs.meta 	/epoc32/tools/makefile_templates/converged-comms/createcommdbs.meta			
+../extension/converged-comms/createcommdbs.mk 	/epoc32/tools/makefile_templates/converged-comms/createcommdbs.mk			
+../extension/converged-comms/installdefaultcommdb.meta 	/epoc32/tools/makefile_templates/converged-comms/installdefaultcommdb.meta			
+../extension/converged-comms/installdefaultcommdb.mk 	/epoc32/tools/makefile_templates/converged-comms/installdefaultcommdb.mk			
+../extension/graphics/gen_khronos_cpp_from_hdr.meta		/epoc32/tools/makefile_templates/graphics/gen_khronos_cpp_from_hdr.meta		
+../extension/graphics/gen_khronos_cpp_from_hdr.mk		/epoc32/tools/makefile_templates/graphics/gen_khronos_cpp_from_hdr.mk		
+../extension/graphics/gen_khronos_openvg_cpp_from_hdr.meta	/epoc32/tools/makefile_templates/graphics/gen_khronos_openvg_cpp_from_hdr.meta			
+../extension/graphics/gen_khronos_openvg_cpp_from_hdr.mk	/epoc32/tools/makefile_templates/graphics/gen_khronos_openvg_cpp_from_hdr.mk			
+../extension/graphics/genpdrs.meta 		/epoc32/tools/makefile_templates/graphics/genpdrs.meta		
+../extension/graphics/genpdrs.mk 		/epoc32/tools/makefile_templates/graphics/genpdrs.mk		
+../extension/security/upsserver.meta 	/epoc32/tools/makefile_templates/security/upsserver.meta			
+../extension/security/upsserver.mk 		/epoc32/tools/makefile_templates/security/upsserver.mk		
+../extension/syslibs/conversiontable.meta 	/epoc32/tools/makefile_templates/syslibs/conversiontable.meta			
+../extension/syslibs/conversiontable.mk 		/epoc32/tools/makefile_templates/syslibs/conversiontable.mk		
+../extension/syslibs/fm_copyfile_to_winscw_zdrive.meta 	/epoc32/tools/makefile_templates/syslibs/fm_copyfile_to_winscw_zdrive.meta			
+../extension/syslibs/fm_copyfile_to_winscw_zdrive.mk 	/epoc32/tools/makefile_templates/syslibs/fm_copyfile_to_winscw_zdrive.mk			
+../extension/syslibs/generate_cpp.meta 		/epoc32/tools/makefile_templates/syslibs/generate_cpp.meta		
+../extension/syslibs/generate_cpp.mk 		/epoc32/tools/makefile_templates/syslibs/generate_cpp.mk		
+../extension/syslibs/generate_snm.meta 		/epoc32/tools/makefile_templates/syslibs/generate_snm.meta		
+../extension/syslibs/generate_snm.mk 		/epoc32/tools/makefile_templates/syslibs/generate_snm.mk		
+../extension/syslibs/test/bafl_copytestfiles.meta	/epoc32/tools/makefile_templates/syslibs/test/bafl_copytestfiles.meta			
+../extension/syslibs/test/bafl_copytestfiles.mk		/epoc32/tools/makefile_templates/syslibs/test/bafl_copytestfiles.mk		
+../extension/syslibs/test/bafl_resource_files.meta	/epoc32/tools/makefile_templates/syslibs/test/bafl_resource_files.meta			
+../extension/syslibs/test/bafl_resource_files.mk	/epoc32/tools/makefile_templates/syslibs/test/bafl_resource_files.mk			
+../extension/syslibs/test/centrep_copydatfile.meta	/epoc32/tools/makefile_templates/syslibs/test/centrep_copydatfile.meta			
+../extension/syslibs/test/centrep_copydatfile.mk	/epoc32/tools/makefile_templates/syslibs/test/centrep_copydatfile.mk			
+../extension/syslibs/test/centrep_copyincentrepsrv.meta		/epoc32/tools/makefile_templates/syslibs/test/centrep_copyincentrepsrv.meta		
+../extension/syslibs/test/centrep_copyincentrepsrv.mk		/epoc32/tools/makefile_templates/syslibs/test/centrep_copyincentrepsrv.mk		
+../extension/syslibs/test/centrep_copypctestfile.meta		/epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfile.meta		
+../extension/syslibs/test/centrep_copypctestfile.mk		/epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfile.mk		
+../extension/syslibs/test/centrep_copypctestfilev2.meta		/epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfilev2.meta		
+../extension/syslibs/test/centrep_copypctestfilev2.mk		/epoc32/tools/makefile_templates/syslibs/test/centrep_copypctestfilev2.mk		
+../extension/syslibs/test/charconv_testpostbuild.meta		/epoc32/tools/makefile_templates/syslibs/test/charconv_testpostbuild.meta		
+../extension/syslibs/test/charconv_testpostbuild.mk		/epoc32/tools/makefile_templates/syslibs/test/charconv_testpostbuild.mk		
+../extension/syslibs/test/charconv_tiso8859x_generate_cpp.meta		/epoc32/tools/makefile_templates/syslibs/test/charconv_tiso8859x_generate_cpp.meta		
+../extension/syslibs/test/charconv_tiso8859x_generate_cpp.mk		/epoc32/tools/makefile_templates/syslibs/test/charconv_tiso8859x_generate_cpp.mk		
+../extension/syslibs/test/charconv_tsnmdata.meta		/epoc32/tools/makefile_templates/syslibs/test/charconv_tsnmdata.meta		
+../extension/syslibs/test/charconv_tsnmdata.mk			/epoc32/tools/makefile_templates/syslibs/test/charconv_tsnmdata.mk	
+../extension/syslibs/test/dbms_copytestdbscfiles.meta		/epoc32/tools/makefile_templates/syslibs/test/dbms_copytestdbscfiles.meta		
+../extension/syslibs/test/dbms_copytestdbscfiles.mk		/epoc32/tools/makefile_templates/syslibs/test/dbms_copytestdbscfiles.mk		
+../extension/syslibs/test/ecom3_buildsis.meta			/epoc32/tools/makefile_templates/syslibs/test/ecom3_buildsis.meta	
+../extension/syslibs/test/ecom3_buildsis.mk			/epoc32/tools/makefile_templates/syslibs/test/ecom3_buildsis.mk	
+../extension/syslibs/test/ecom3_postbuild.meta			/epoc32/tools/makefile_templates/syslibs/test/ecom3_postbuild.meta	
+../extension/syslibs/test/ecom3_postbuild.mk			/epoc32/tools/makefile_templates/syslibs/test/ecom3_postbuild.mk	
+../extension/syslibs/test/ecom3_relocatetarget.meta		/epoc32/tools/makefile_templates/syslibs/test/ecom3_relocatetarget.meta		
+../extension/syslibs/test/ecom3_relocatetarget.mk		/epoc32/tools/makefile_templates/syslibs/test/ecom3_relocatetarget.mk		
+../extension/syslibs/test/featmgr_moveplugin.meta		/epoc32/tools/makefile_templates/syslibs/test/featmgr_moveplugin.meta		
+../extension/syslibs/test/featmgr_moveplugin.mk			/epoc32/tools/makefile_templates/syslibs/test/featmgr_moveplugin.mk	
+../extension/syslibs/test/logeng_copytestfiles.meta		/epoc32/tools/makefile_templates/syslibs/test/logeng_copytestfiles.meta		
+../extension/syslibs/test/logeng_copytestfiles.mk		/epoc32/tools/makefile_templates/syslibs/test/logeng_copytestfiles.mk		
+../extension/syslibs/test/sql_copyperfsqltestfiles.meta		/epoc32/tools/makefile_templates/syslibs/test/sql_copyperfsqltestfiles.meta		
+../extension/syslibs/test/sql_copyperfsqltestfiles.mk		/epoc32/tools/makefile_templates/syslibs/test/sql_copyperfsqltestfiles.mk		
+../extension/syslibs/test/sql_copysqltestfiles.meta		/epoc32/tools/makefile_templates/syslibs/test/sql_copysqltestfiles.meta		
+../extension/syslibs/test/sql_copysqltestfiles.mk		/epoc32/tools/makefile_templates/syslibs/test/sql_copysqltestfiles.mk		
+../extension/syslibs/test/sqlite3_copysqlite3testfiles.meta	/epoc32/tools/makefile_templates/syslibs/test/sqlite3_copysqlite3testfiles.meta			
+../extension/syslibs/test/sqlite3_copysqlite3testfiles.mk	/epoc32/tools/makefile_templates/syslibs/test/sqlite3_copysqlite3testfiles.mk			
+../extension/syslibs/test/sqlite3_securecopytestfiles.meta	/epoc32/tools/makefile_templates/syslibs/test/sqlite3_securecopytestfiles.meta			
+../extension/syslibs/test/sqlite3_securecopytestfiles.mk	/epoc32/tools/makefile_templates/syslibs/test/sqlite3_securecopytestfiles.mk			
+../extension/syslibs/test/xml_sitestfiledist.meta		/epoc32/tools/makefile_templates/syslibs/test/xml_sitestfiledist.meta		
+../extension/syslibs/test/xml_sitestfiledist.mk			/epoc32/tools/makefile_templates/syslibs/test/xml_sitestfiledist.mk	
+../extension/syslibs/test/xml_stringdictionary00tagtable.meta	/epoc32/tools/makefile_templates/syslibs/test/xml_stringdictionary00tagtable.meta			
+../extension/syslibs/test/xml_stringdictionary00tagtable.mk	/epoc32/tools/makefile_templates/syslibs/test/xml_stringdictionary00tagtable.mk			
+../extension/syslibs/test/xml_syncmltestfiledist.meta		/epoc32/tools/makefile_templates/syslibs/test/xml_syncmltestfiledist.meta		
+../extension/syslibs/test/xml_syncmltestfiledist.mk		/epoc32/tools/makefile_templates/syslibs/test/xml_syncmltestfiledist.mk		
+../extension/syslibs/test/xml_wmltestfiledist.meta		/epoc32/tools/makefile_templates/syslibs/test/xml_wmltestfiledist.meta		
+../extension/syslibs/test/xml_wmltestfiledist.mk		/epoc32/tools/makefile_templates/syslibs/test/xml_wmltestfiledist.mk		
+../extension/syslibs/test/xml_xmlcmatchdatapostbuild.meta	/epoc32/tools/makefile_templates/syslibs/test/xml_xmlcmatchdatapostbuild.meta			
+../extension/syslibs/test/xml_xmlcmatchdatapostbuild.mk		/epoc32/tools/makefile_templates/syslibs/test/xml_xmlcmatchdatapostbuild.mk		
+../extension/syslibs/word_template.meta			/epoc32/tools/makefile_templates/syslibs/word_template.meta	
+../extension/syslibs/word_template.mk			/epoc32/tools/makefile_templates/syslibs/word_template.mk	
+../extension/techview/uiklaf_resource.meta	/epoc32/tools/makefile_templates/techview/uiklaf_resource.meta			
+../extension/techview/uiklaf_resource.mk		/epoc32/tools/makefile_templates/techview/uiklaf_resource.mk		
+../extension/tools/ant_launch.flm	/epoc32/tools/makefile_templates/tools/ant_launch.flm			
+../extension/tools/ant_launch.meta /epoc32/tools/makefile_templates/tools/ant_launch.meta				
+../extension/tools/ant_launch.mk /epoc32/tools/makefile_templates/tools/ant_launch.mk				
+../extension/tools/ant_launch.xml	/epoc32/tools/makefile_templates/tools/ant_launch.xml			
+../extension/tools/bldex.meta /epoc32/tools/makefile_templates/tools/bldex.meta				
+../extension/tools/bldex.mk /epoc32/tools/makefile_templates/tools/bldex.mk				
+../extension/tools/compsupp.meta		/epoc32/tools/makefile_templates/tools/compsupp.meta		
+../extension/tools/compsupp.mk 		/epoc32/tools/makefile_templates/tools/compsupp.mk		
+../extension/tools/features.meta 	/epoc32/tools/makefile_templates/tools/features.meta			
+../extension/tools/features.mk 		/epoc32/tools/makefile_templates/tools/features.mk		
+../extension/tools/jni_ant_launch.meta /epoc32/tools/makefile_templates/tools/jni_ant_launch.meta				
+../extension/tools/jni_ant_launch.mk /epoc32/tools/makefile_templates/tools/jni_ant_launch.mk				
+../extension/tools/kif.meta		/epoc32/tools/makefile_templates/tools/kif.meta		
+../extension/tools/kif.mk		/epoc32/tools/makefile_templates/tools/kif.mk		
+../extension/tools/py2exe.meta /epoc32/tools/makefile_templates/tools/py2exe.meta				
+../extension/tools/py2exe.mk /epoc32/tools/makefile_templates/tools/py2exe.mk				
+../extension/tools/raptor_linux_dist.meta /epoc32/tools/makefile_templates/tools/raptor_linux_dist.meta				
+../extension/tools/raptor_linux_dist.mk /epoc32/tools/makefile_templates/tools/raptor_linux_dist.mk				
+../extension/tools/stlport.meta 		/epoc32/tools/makefile_templates/tools/stlport.meta		
+../extension/tools/stlport.mk 		/epoc32/tools/makefile_templates/tools/stlport.mk		
+../extension/tools/x86tool.meta 		/epoc32/tools/makefile_templates/tools/x86tool.meta		
+../extension/tools/x86tool.mk 		/epoc32/tools/makefile_templates/tools/x86tool.mk
+../extension/tools/apply_imgtools_variants.xml  /epoc32/tools/makefile_templates/tools/apply_imgtools_variants.xml		
+../shell/cmd.mk 				/epoc32/tools/shell/cmd.mk
+../shell/generic.mk 			/epoc32/tools/shell/generic.mk	
+../shell/sh.mk				/epoc32/tools/shell/sh.mk
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/group/buildsystem.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_sbsv1_buildsystem
+
+source	\src\tools\build\sbsv1\buildsystem
+binary	\src\tools\build\sbsv1\buildsystem\group	all
+exports	\src\tools\build\sbsv1\buildsystem\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/shell/cmd.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,136 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+include $(EPOCROOT)epoc32/tools/shell/generic.mk
+
+# Host platform dependant variables
+/:=$(shell echo \)
+;:=;
+CP=copy
+RM=del
+RMDIR=rmdir
+MKDIR=mkdir
+ERASE=@erase /q 2>>nul
+
+
+# Some tools do not work with slash but only dollar slash.  
+# That is actually a defect for them and should be fixed.  
+# Then this macro should be abandoned.
+define slash2generic
+$(subst /,$/,$(1))
+endef
+
+# Call perl script to create directory. 
+# Used in base/config.mk and many others
+define createdir
+perl $(EPOCROOT)epoc32/tools/emkdir.pl $(1)
+endef
+
+# Check if not exist directory then create it first. 
+# Used in BASE/lubbock_miniboot
+define ifnotexistd
+if not exist $(1) md $(subst /,\,$(1))
+endef
+
+# This means there are something to add for SBSv2 here.
+# For abld, there is nothing.
+# Used in base/lubbock_miniboot and should be used in similar situation.
+define sbsadd
+
+endef
+
+# Add double quotes for abld target. No quote for SBSv2.
+# Used in base/lubbock_miniboot
+define abldquote
+"$(1)"
+endef
+
+# Used in Syslibs/conversiontable.mk
+define generated
+$(EPOCROOT)epoc32/build/$(1)
+endef
+
+# Used in syslibs/generate_cpp.mk
+define formatreleasables
+@echo $(1)
+endef
+
+# Used in BASE/config.mk
+define generatedcpp
+$(EPOCROOT)epoc32/build/generatedcpp/hal
+endef
+
+# Set path. Used in BASE/bootstrap.mk
+define epocbldabs
+$(1)$(2)
+endef
+
+# Call perl script ecopyfile.pl to copy.  
+# Used in BASE/bootstrap.mk 
+define ecopy
+perl $(EPOCROOT)epoc32/tools/ecopyfile.pl 
+endef
+
+# Abld does not support pipe symbol | while SBSv2 does.  So for Abld it is nothing.
+# Used in Base/bootstrap.mk. 
+define pipe
+
+endef
+
+# Call perl script copyfeaturevariants.pl.  Used in BASE/copy_default.mk.
+define cpfeature
+perl $(EPOCROOT)epoc32/tools/copyfeaturevariants.pl $(1) $(2)
+endef
+
+# Used in Syslibs/generate_cpp.mk at the bottom to deal with different
+# way of includeing TEM in Abld and SBSv2.
+define include
+$(EPOCROOT)epoc32/tools/makefile_templates/syslibs/generate_cpp.mk
+endef
+
+# Macro to change working directory. Used for TOOLS/stlport.mk
+# The path needs to be fixed before passing to cd command
+define chdir
+-cd $(subst /,\,$(1))
+endef
+
+# Macro to remove files. All paths need to be corrected before deleting.
+# Used in TOOLS/stlport.mk
+define remove
+-$(ERASE) $(subst /,\,$(1))
+endef
+
+# Macro to copy files. Needed for sbsv2 build 
+# Used in PDS components in syslibs/*.mk
+define forcecopy
+$(CP) $(subst /,\,$(1)) $(subst /,\,$(2))
+endef
+
+# Macro to remove files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forceremove
+-$(ERASE) $(subst /,\,$(1))
+endef
+
+define tmpmacro
+$(call chdir,$(BUILD_DIR));configure.bat -c gcc;
+endef
+
+define settPath
+1
+endef
+
+# Configuration needs to be returned as upper case for abld
+CONFIGURATION:=REL
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/shell/generic.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,63 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# Definitions common to all shells
+# *_PATH variables to support filename policy conformance in makefile templates
+# NOTE: These should all be replaced by calls to a function that lower-cases
+# the current setting of the original variable
+# 
+#
+
+PLATFORM_PATH=$(PLATFORM)
+CFG_PATH=$(CFG)
+
+ifeq ($(PLATFORM_PATH),WINS) 
+	PLATFORM_PATH=wins
+else
+ifeq ($(PLATFORM_PATH),WINSCW) 
+	PLATFORM_PATH=winscw
+else
+ifeq ($(PLATFORM_PATH),ARMV5) 
+	PLATFORM_PATH=armv5
+else
+ifeq ($(PLATFORM_PATH),ARMV7) 
+	PLATFORM_PATH=armv7
+else
+ifeq ($(PLATFORM_PATH),TOOLS) 
+	PLATFORM_PATH=tools
+else
+ifeq ($(PLATFORM_PATH),TOOLS2) 
+	PLATFORM_PATH=tools2
+endif
+endif
+endif
+endif
+endif
+endif
+
+ifeq ($(CFG_PATH),UREL) 
+	CFG_PATH=urel
+else
+ifeq ($(CFG_PATH),UDEB) 
+	CFG_PATH=udeb
+else
+ifeq ($(CFG_PATH),DEB) 
+	CFG_PATH=deb
+else
+ifeq ($(CFG_PATH),REL) 
+	CFG_PATH=rel
+endif
+endif
+endif
+endif
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/shell/sh.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,117 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+include $(EPOCROOT)epoc32/tools/shell/generic.mk
+
+
+# Some tools do not work with slash but only dollar slash.  
+# That is actually a defect for them and should be fixed.  
+# Then this macro should be abandoned.
+define slash2generic
+$(1)
+endef
+
+# Use $(MKDIR) to create directory
+# Use in base/config.mk and many others
+define createdir
+$(MKDIR) -p $(1) 
+endef
+
+# Check if not exist directory then create it first. 
+# Use in BASE/lubbock_miniboot and many others
+define ifnotexistd
+if [ ! -d $(1) ]; then $(MKDIR) -p $(1); fi
+endef
+
+# This means there are something to add for SBSv2 here.
+# Used in base/lubbock_miniboot and should be used in similar situation.
+define sbsadd
+$(1)
+endef
+
+# Add double quotes for abld target. No quote for SBSv2.
+# Used in base/lubbock_miniboot
+define abldquote
+$(1)
+endef
+
+# Used in Syslibs/conversiontable.mk
+define generated
+$(EPOCROOT)epoc32/build/$(1)
+endef
+
+# Used in syslibs/generate_cpp.mk
+define formatreleasables
+$(if $(1),@echo $(word 1,$(1)))
+$(if $(1),$(call formatreleasables,$(wordlist 2,$(words $(1)),$(1))))
+endef
+
+# Used in BASE/config.mk
+define generatedcpp
+$(EPOCROOT)epoc32/build/generatedcpp/hal
+endef
+
+# Set path. Used in BASE/bootstrap.mk
+define epocbldabs
+$(EPOCBLD)
+endef
+
+# Copy. Used in BASE/bootstrap.mk 
+define ecopy
+cp
+endef
+
+# Abld does not support pipe symbol | while SBSv2 does.  So for Abld it is nothing.
+# Used in Base/bootstrap.mk. 
+define pipe
+| $(1)
+endef
+
+# Used in BASE/copy_default.mk.
+define cpfeature
+$(CP) $? $@
+endef
+
+# Used in Syslibs/generate_cpp.mk at the bottom to deal with different
+# way of includeing TEM in Abld and SBSv2.
+define include
+$(TEMPLATE_EXTENSION_MAKEFILE)
+endef
+
+# Macro to change working directory. Used for TOOLS/stlport.mk
+# The path needs to be fixed before passing to cd command
+define chdir
+-cd $(1)
+endef
+
+# Macro to remove files. Used in TOOLS/stlport.mk
+define remove
+-rm -f $(1)
+endef
+
+# Macro to copy files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forcecopy
+$(CP) -f $(1)	$(2) && chmod a+rwx $(2)
+endef
+
+# Macro to remove files. Needed for sbsv2 build
+# Used in PDS components in syslibs/*.mk
+define forceremove
+-$(ERASE) -f $(1)
+endef
+
+# Configuration needs to be returned as upper case for abld
+CONFIGURATION:=rel
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/Bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Component description file
+// 
+//
+
+PRJ_MMPFILES
+
+InvariantStaticDLL.mmp
+VariantStaticDLL.mmp
+UseStaticDLL.mmp
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/CommonFramework.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,61 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#ifndef __CommonFramework_H
+#define __CommonFramework_H
+
+#include <e32base.h>
+#include <e32cons.h>
+
+_LIT(KTxtEPOC32EX,"EXAMPLES");
+_LIT(KTxtExampleCode,"Symbian OS Example Code");
+_LIT(KFormatFailed,"failed: leave code=%d");
+_LIT(KTxtOK,"ok");
+_LIT(KTxtPressAnyKey," [press any key]");
+
+// public
+LOCAL_D CConsoleBase* console; // write all your messages to this
+LOCAL_C void doExampleL(); // code this function for the real example
+
+// private
+LOCAL_C void callExampleL(); // initialize with cleanup stack, then do example
+
+GLDEF_C TInt E32Main() // main function called by E32
+    {
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+	TRAPD(error,callExampleL()); // more initialization, then do example
+	__ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error));
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+	return 0; // and return
+    }
+
+LOCAL_C void callExampleL() // initialize and call example code under cleanup stack
+    {
+	console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
+	CleanupStack::PushL(console);
+	TRAPD(error,doExampleL()); // perform example function
+	if (error)
+		console->Printf(KFormatFailed, error);
+	else
+		console->Printf(KTxtOK);
+	console->Printf(KTxtPressAnyKey);
+	console->Getch(); // get and ignore character
+	CleanupStack::PopAndDestroy(); // close console
+    }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/InvariantStaticDLL.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,62 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This program creates a dll.
+// 
+//
+
+#include "InvariantStaticDLL.h"
+#include <e32uid.h>
+
+// construct/destruct
+
+EXPORT_C CInvMessenger* CInvMessenger::NewLC(CConsoleBase& aConsole, const TDesC& aString)
+	{
+	CInvMessenger* self=new (ELeave) CInvMessenger(aConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL(aString);
+	return self;
+	}
+
+CInvMessenger::~CInvMessenger() // destruct - virtual, so no export
+	{
+	delete iString;
+	}
+
+// useful functions
+
+EXPORT_C void CInvMessenger::ShowMessage()
+	{
+	_LIT(KFormat1,"FEATURE INVARIANT %S\n");
+	iConsole.Printf(KFormat1, iString); // notify completion
+	}
+
+// constructor support
+// don't export these, because used only by functions in this DLL, eg our NewLC()
+
+CInvMessenger::CInvMessenger(CConsoleBase& aConsole) // first-phase C++ constructor
+	: iConsole(aConsole)
+	{
+	}
+
+void CInvMessenger::ConstructL(const TDesC& aString) // second-phase constructor
+	{
+	iString=aString.AllocL(); // copy given string into own descriptor
+    }
+
+
+GLDEF_C TInt E32Dll(TInt /*aReason*/)
+// DLL entry point
+	{
+	return(KErrNone);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/InvariantStaticDLL.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Statically linked dll example
+// 
+//
+ 
+
+#include <e32cons.h>
+
+
+class CInvMessenger : public CBase
+  	{
+public:
+		// Construction
+	IMPORT_C static CInvMessenger* NewLC(CConsoleBase& aConsole, const TDesC& aString);
+		// Destructor - virtual and class not intended
+		// for derivation, so not exported
+	~CInvMessenger();
+		// general functions - exported
+	IMPORT_C void ShowMessage();
+private:
+		// C++ constructor - not exported;
+		// implicitly called from NewLC()
+	CInvMessenger(CConsoleBase& aConsole);
+		// 2nd phase construction, called by NewLC()
+	void ConstructL(const TDesC& aString); // second-phase constructor
+private:
+	CConsoleBase& iConsole; // Use the console (but not owned)
+	HBufC*        iString;  // Allocated container for string data (destructor destroys)
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/InvariantStaticDLL.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,38 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// using relative paths for sourcepath and user includes
+// exports are unfrozen
+// 
+//
+
+TARGET        InvariantStaticDLL.dll
+TARGETTYPE    dll
+UID           0x1000008d 0x10004268
+VENDORID      0x70000001
+
+SOURCEPATH    .
+SOURCE        InvariantStaticDLL.cpp
+
+USERINCLUDE   .
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY       euser.lib
+
+#if defined(WINS)
+    deffile ./InvariantStaticDLLwin.def
+#else
+    deffile ./InvariantStaticDLLarm.def
+#endif
+nostrictdef
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/InvariantStaticDLLarm.def	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+EXPORTS
+	_ZN13CInvMessenger11ShowMessageEv @ 1 NONAME
+	_ZN13CInvMessenger5NewLCER12CConsoleBaseRK7TDesC16 @ 2 NONAME
+	_ZTI13CInvMessenger @ 3 NONAME ; #<TI>#
+	_ZTV13CInvMessenger @ 4 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/InvariantStaticDLLwin.def	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+EXPORTS
+	?NewLC@CInvMessenger@@SAPAV1@AAVCConsoleBase@@ABVTDesC16@@@Z @ 1 NONAME ; class CInvMessenger * CInvMessenger::NewLC(class CConsoleBase &, class TDesC16 const &)
+	?ShowMessage@CInvMessenger@@QAEXXZ @ 2 NONAME ; void CInvMessenger::ShowMessage(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/UseStaticDLL.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,55 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// A simple program which uses the statically linked dll  "eulibd1b.dll"
+// 
+//
+
+// standard example header
+#include "CommonFramework.h"
+#include "InvariantStaticDLL.h"
+#include "VariantStaticDLL.h"
+
+_LIT(KTxt1,"statically linked DLL example \n\n");
+
+#ifdef FEATURE_VARIANT_DEFAULT
+	_LIT(KTxt2,"Hello from variant_default!");
+#endif
+
+#ifdef FEATURE_VARIANT_A
+	_LIT(KTxt2,"Hello from variant_a!");
+#endif
+
+#ifdef FEATURE_VARIANT_B
+	_LIT(KTxt2,"Hello from variant_b!");
+#endif
+
+_LIT(KTxtNewLine,"\n");
+
+LOCAL_C void doExampleL()
+    {
+	console->Printf(KTxt1);
+
+	CInvMessenger* myInvMessage = CInvMessenger::NewLC(*console, KTxt2);
+	myInvMessage->ShowMessage();
+
+	console->Printf(KTxtNewLine);
+
+	CVarMessenger* myVarMessage = CVarMessenger::NewLC(*console, KTxt2);
+	myVarMessage->ShowMessage();
+
+	console->Printf(KTxtNewLine);
+	CleanupStack::PopAndDestroy(); 
+	}
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/UseStaticDLL.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,33 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// using relative paths for sourcepath and user includes
+// 
+//
+
+TARGET        UseStaticDLL.exe
+TARGETTYPE    exe
+UID           0
+VENDORID      0x70000001
+
+// test exe's support binary variation
+FEATUREVARIANT
+
+SOURCEPATH    .
+SOURCE        UseStaticDLL.cpp
+
+USERINCLUDE   .
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY       euser.lib InvariantStaticDLL.lib VariantStaticDLL.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/VariantStaticDLL.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,72 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// This program creates a dll.
+// 
+//
+
+#include "VariantStaticDLL.h"
+#include <e32uid.h>
+
+// construct/destruct
+
+EXPORT_C CVarMessenger* CVarMessenger::NewLC(CConsoleBase& aConsole, const TDesC& aString)
+	{
+	CVarMessenger* self=new (ELeave) CVarMessenger(aConsole);
+	CleanupStack::PushL(self);
+	self->ConstructL(aString);
+	return self;
+	}
+
+CVarMessenger::~CVarMessenger() // destruct - virtual, so no export
+	{
+	delete iString;
+	}
+
+// useful functions
+
+EXPORT_C void CVarMessenger::ShowMessage()
+	{
+#ifdef FEATURE_VARIANT_A
+	_LIT(KFormat1,"FEATURE VARIANT A %S\n");
+#else
+	_LIT(KFormat1,"FEATURE VARIANT ~A %S\n");
+#endif
+#ifdef FEATURE_VARIANT_B
+	_LIT(KFormat2,"FEATURE VARIANT B %S\n");
+#else
+	_LIT(KFormat2,"FEATURE VARIANT ~B %S\n");
+#endif
+	iConsole.Printf(KFormat1, iString); // notify completion
+	iConsole.Printf(KFormat2, iString); // notify completion
+	}
+
+// constructor support
+// don't export these, because used only by functions in this DLL, eg our NewLC()
+
+CVarMessenger::CVarMessenger(CConsoleBase& aConsole) // first-phase C++ constructor
+	: iConsole(aConsole)
+	{
+	}
+
+void CVarMessenger::ConstructL(const TDesC& aString) // second-phase constructor
+	{
+	iString=aString.AllocL(); // copy given string into own descriptor
+    }
+
+
+GLDEF_C TInt E32Dll(TInt /*aReason*/)
+// DLL entry point
+	{
+	return(KErrNone);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/VariantStaticDLL.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,41 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Statically linked dll example
+// 
+//
+ 
+
+#include <e32cons.h>
+
+
+class CVarMessenger : public CBase
+  	{
+public:
+		// Construction
+	IMPORT_C static CVarMessenger* NewLC(CConsoleBase& aConsole, const TDesC& aString);
+		// Destructor - virtual and class not intended
+		// for derivation, so not exported
+	~CVarMessenger();
+		// general functions - exported
+	IMPORT_C void ShowMessage();
+private:
+		// C++ constructor - not exported;
+		// implicitly called from NewLC()
+	CVarMessenger(CConsoleBase& aConsole);
+		// 2nd phase construction, called by NewLC()
+	void ConstructL(const TDesC& aString); // second-phase constructor
+private:
+	CConsoleBase& iConsole; // Use the console (but not owned)
+	HBufC*        iString;  // Allocated container for string data (destructor destroys)
+	};
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/VariantStaticDLL.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,49 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// using relative paths for sourcepath and user includes
+// exports are unfrozen
+// 
+//
+
+TARGET        VariantStaticDLL.dll
+TARGETTYPE    dll
+FEATUREVARIANT
+UID           0x1000008d 0x10004268
+VENDORID      0x70000001
+
+SOURCEPATH    .
+SOURCE        VariantStaticDLL.cpp
+
+USERINCLUDE   .
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY       euser.lib
+
+#if defined(WINS)
+    deffile ./VariantStaticDLLwin.def
+#else
+    deffile ./VariantStaticDLLarm.def
+#endif
+nostrictdef
+
+// Test variation in MMP files?
+#if defined(FEATURE_VARIANT_DEFAULT)
+#warning "FEATURE_VARIANT_DEFAULT defined"
+#elif defined(FEATURE_VARIANT_A)
+#warning "FEATURE_VARIANT_A defined"
+#elif defined(FEATURE_VARIANT_B )
+#warning "FEATURE_VARIANT_B defined"
+#else
+#error "Test failed"
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/VariantStaticDLLarm.def	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+EXPORTS
+	_ZN13CVarMessenger11ShowMessageEv @ 1 NONAME
+	_ZN13CVarMessenger5NewLCER12CConsoleBaseRK7TDesC16 @ 2 NONAME
+	_ZTI13CVarMessenger @ 3 NONAME ; #<TI>#
+	_ZTV13CVarMessenger @ 4 NONAME ; #<VT>#
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/VariantStaticDLLwin.def	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+EXPORTS
+	?NewLC@CVarMessenger@@SAPAV1@AAVCConsoleBase@@ABVTDesC16@@@Z @ 1 NONAME ; class CVarMessenger * CVarMessenger::NewLC(class CConsoleBase &, class TDesC16 const &)
+	?ShowMessage@CVarMessenger@@QAEXXZ @ 2 NONAME ; void CVarMessenger::ShowMessage(void)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/bvtest.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+FEATURE_VARIANT_A
+FEATURE_VARIANT_A_EXTRA
+
+FEATURE_VARIANT_B
+FEATURE_VARIANT_B_EXTRA
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/default.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+
+VARIANT default
+
+BUILD_INCLUDE	set		/epoc32/include/variant
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,295 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# binary variation build test
+#
+# build a variant DLL and an invariant DLL and use them.
+
+use strict;
+use Test;
+use Digest::MD5;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 204 }
+
+# remember where we started
+use Cwd;
+my $cwd = getcwd();
+
+# change to the test data directory
+use File::Basename;
+my $dir = dirname($0);
+chdir($dir);
+print "# running in $dir\n";
+
+# create a local default.hrh, as it varies per OS version
+# (make it just include the product include file)
+my $epocroot = $ENV{'EPOCROOT'};
+my $include = $epocroot . "epoc32/include/variant";
+my $variant = $epocroot . "epoc32/tools/variant";
+
+my $cfg = $variant . "/variant.cfg";
+my $productInclude;
+
+open(VARCFG, "$cfg") or die("cannot read $cfg\n");
+while (<VARCFG>)
+{
+	$productInclude = "$1" if /epoc32.+?([^\\\/]+\.hrh)$/i;
+}
+close(VARCFG);
+die("no product include file in $cfg\n") unless ($productInclude);
+
+open(DEFHRH, ">default.hrh") or die("cannot write $dir/default.hrh\n");
+print(DEFHRH "#include <$productInclude>\n");
+print(DEFHRH "\n#define FEATURE_VARIANT_DEFAULT\n");
+close(DEFHRH);
+print("# testing against product $productInclude\n");
+
+# copy test files to EPOCROOT (make sure we do not destroy any valid
+# files that are already there and remember to clean up afterwards)
+#
+# /epoc32/include/variant/default.hrh
+# /epoc32/include/variant/variant_a.hrh
+# /epoc32/include/variant/variant_b.hrh
+# /epoc32/include/variant/a/variant_a_extra.hrh
+# /epoc32/include/variant/b/variant_b_extra.hrh
+# /epoc32/tools/variant/default.var
+# /epoc32/tools/variant/variant_a.var
+# /epoc32/tools/variant/variant_b.var
+# /epoc32/tools/variant/variant_c.var
+# /epoc32/include/variant/featurelists/bvtest.txt
+
+my @created = ("$include/default.hrh",
+			   "$include/variant_a.hrh",
+			   "$include/variant_b.hrh",
+			   "$include/a/variant_a_extra.hrh",
+			   "$include/b/variant_b_extra.hrh",
+			   "$variant/default.var",
+			   "$variant/variant_a.var",
+			   "$variant/variant_b.var",
+			   "$variant/variant_c.var",
+			   "$include/featurelists/bvtest.txt"
+			  );
+
+use File::Copy;
+my $file;
+foreach $file (@created)
+{
+	my $epocDir = dirname($file);
+	my $localFile = basename($file);
+
+	mkdir($epocDir) if (!-d $epocDir);
+	move($file, "$file.bak") if (-f $file);
+
+	print "# copy $localFile $file\n";
+	unlink $file;
+	copy($localFile, $file) or die "Failed copy: $!";
+}
+
+###############################################################################
+# THE TESTS                                                                   #
+###############################################################################
+
+# we need to test the ABIv1 and ABIv2 builds
+
+testABI("armv5");
+testABI("armv5_abiv1");
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# delete test files and restore backed up files to their original state
+foreach $file (@created)
+{
+	if (-f "$file.bak")
+	{
+		move("$file.bak", $file);
+	}
+	else
+	{
+		unlink($file);
+	}
+}
+
+# change back to the starting directory
+chdir($cwd);
+
+# ALL DONE
+
+
+###############################################################################
+# SUBROUTINES                                                                 #
+###############################################################################
+
+sub testABI
+{
+	my $platform = shift;
+
+	# remove the binaries if they already exist
+	my $release = $epocroot . "epoc32/release/$platform";
+
+	my @binaries = (
+			    	"$release/udeb/InvariantStaticDLL.dll",
+			    	"$release/urel/InvariantStaticDLL.dll",
+					);
+
+	foreach (@binaries)
+	{
+		unlink($_);
+	}
+
+	cleanVariants("$release/udeb", "VariantStaticDLL.dll");
+	cleanVariants("$release/urel", "VariantStaticDLL.dll");
+	cleanVariants("$release/udeb", "UseStaticDLL.exe");
+	cleanVariants("$release/urel", "UseStaticDLL.exe");
+
+	# we cannot test the command return values because they are always 0
+	system("bldmake bldfiles");
+	
+	# clean out everything so makefiles have to be recreated
+	system("abld reallyclean $platform.variant_a >nul 2>&1");
+	system("abld reallyclean $platform.variant_b >nul 2>&1");
+	system("abld reallyclean $platform.variant_c >nul 2>&1");
+	system("abld reallyclean $platform >nul 2>&1");
+	
+	# Build variants first to ensure the default makefile is created for invariant dlls
+	system("abld build $platform.variant_a");
+	system("abld build $platform.variant_b");
+	system("abld build $platform.variant_c");
+	system("abld build $platform");
+
+	# test for the existence of each invariant binary file
+	foreach (@binaries)
+	{
+		print "# checking $_\n";
+		ok(-f $_);
+	}
+
+	# test for the existence of each variant binary file
+	checkVariants("$release/udeb/VariantStaticDLL.dll");
+	checkVariants("$release/urel/VariantStaticDLL.dll");
+	checkVariants("$release/udeb/UseStaticDLL.exe");
+	checkVariants("$release/urel/UseStaticDLL.exe");
+}
+
+sub cleanVariants
+{
+	my $dir = shift;
+	my $name = shift;
+
+	if (opendir(DIR, $dir))
+	{
+		while (my $file = readdir(DIR))
+		{
+			if ($file =~ /^$name/)
+			{
+				print "removing $dir/$file\n";
+				unlink("$dir/$file");
+			}
+		}
+		closedir(DIR);
+	}
+	else
+	{
+		print "cannot clean $dir/$name*\n";
+	}
+}
+
+sub checkVariants
+{
+	my $root = shift;
+	
+	$root =~ s/\.([^\.]+)$//;
+	my $ext = $1;
+	
+	my $vmap = "$root.$ext.vmap";
+
+	# there should be a VMAP file
+	print "# checking $vmap\n";
+	ok(-f $vmap);
+
+	my $hashDefault = "0";
+	my $hashVariantA = "0";
+	my $hashVariantB = "0";
+	my $hashVariantC = "0";
+
+	# Variables to hold feature macro values
+	my ( $featDefault, $featVariantA, $featVariantB, $featVariantC );
+	
+	if (open(VMAP, $vmap))
+	{
+		while (<VMAP>)
+		{
+			if (/([0-9a-f]{32})\s+(\S+)\s(\S+)/i)
+			{
+				my $var = lc($2);
+				
+				# Store the data for later
+				( $hashDefault, $featDefault ) = ( $1, $3) if ($var eq 'default');
+				( $hashVariantA, $featVariantA ) = ( $1, $3) if ($var eq 'variant_a');
+				( $hashVariantB, $featVariantB ) = ( $1, $3) if ($var eq 'variant_b');
+				( $hashVariantC, $featVariantC ) = ( $1, $3) if ($var eq 'variant_c');
+			}
+		}
+		close(VMAP);
+	}
+
+	# the three hashes Default,A,B should be valid and different
+	ok($hashDefault);
+	ok($hashVariantA);
+	ok($hashVariantB);
+
+	ok($hashDefault ne $hashVariantA);
+	ok($hashDefault ne $hashVariantB);
+	ok($hashVariantA ne $hashVariantB);
+
+	# the three feature lists for Default,A,B should be valid and different
+	ok($featDefault);
+	ok($featVariantA);
+	ok($featVariantB);
+
+	ok($featDefault ne $featVariantA);
+	ok($featDefault ne $featVariantB);
+	ok($featVariantA ne $featVariantB);
+
+	# Check the feature lists are correct
+	ok($featDefault eq 'FEATURE_VARIANT_A=undefined,FEATURE_VARIANT_B=undefined');
+	ok($featVariantA eq 'FEATURE_VARIANT_A=defined,FEATURE_VARIANT_B=undefined');
+	ok($featVariantB eq 'FEATURE_VARIANT_A=undefined,FEATURE_VARIANT_B=\'123\'');
+	
+	# Check the hash and feature lists match
+	ok($hashDefault eq Digest::MD5::md5_hex($featDefault));
+	ok($hashVariantA eq Digest::MD5::md5_hex($featVariantA));
+	ok($hashVariantB eq Digest::MD5::md5_hex($featVariantB));
+	
+	# hashes A and C should be the same
+	ok($hashVariantA, $hashVariantC);
+
+	# feature lists for A and C should be the same
+	ok($featVariantA, $featVariantC);
+	
+	# the corresponding binaries should exist
+	print("# checking $root.$hashDefault.$ext\n");
+	ok(-f "$root.$hashDefault.$ext");
+
+	print("# checking $root.$hashVariantA.$ext\n");
+	ok(-f "$root.$hashVariantA.$ext");
+
+	print("# checking $root.$hashVariantB.$ext\n");
+	ok(-f "$root.$hashVariantB.$ext");
+
+	print("# checking $root.$hashVariantC.$ext\n");
+	ok(-f "$root.$hashVariantC.$ext");
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_a.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <default.hrh>
+#include <variant_a_extra.hrh>
+
+#define FEATURE_VARIANT_A
+#undef FEATURE_VARIANT_DEFAULT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_a.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+
+VARIANT variant_a
+EXTENDS default
+
+BUILD_INCLUDE	append	/epoc32/include/variant/a
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_a_extra.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,17 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#define FEATURE_VARIANT_A_EXTRA
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_b.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include <default.hrh>
+#include <variant_b_extra.hrh>
+
+#define FEATURE_VARIANT_B 123
+#undef FEATURE_VARIANT_DEFAULT
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_b.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+
+VARIANT variant_b
+EXTENDS default
+
+BUILD_INCLUDE	append	/epoc32/include/variant/b
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_b_extra.hrh	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,17 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#define FEATURE_VARIANT_B_EXTRA
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/binaryvariation/variant_c.var	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,7 @@
+
+VARIANT variant_c
+EXTENDS default
+VARIANT_HRH /epoc32/include/variant/variant_a.hrh
+
+BUILD_INCLUDE	append	/epoc32/include/variant/a
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/extensions/my_testing.01	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+
+this is not really a DLL...
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/extensions/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,86 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# template extension makefile test
+#
+#
+
+use strict;
+use Test;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 6 }
+
+# remember where we started
+use Cwd;
+my $cwd = getcwd();
+
+# change to the test data directory
+use File::Basename;
+my $dir = dirname($0);
+chdir($dir);
+print "# running in $dir\n";
+
+my $epocroot = $ENV{'EPOCROOT'};
+
+###############################################################################
+# THE TESTS                                                                   #
+###############################################################################
+
+# check base/copy_default in a [non] feature variant world
+my $mk = "../../extension/base/copy_default.mk";
+my $name = "my_testing";
+my $path = "${epocroot}epoc32/release/armv5/udeb/$name";
+my $vars = "SHELL=cmd PLATFORM_PATH=armv5 CFG_PATH=udeb SOURCES=$name.01 TARGET=$name.loc";
+
+use File::Copy;
+copy("$name.01", "$path.01");		# no variants
+unlink("$path.loc");
+
+system("make -f $mk $vars BLD");
+system("make -f $mk $vars RELEASABLES");
+
+print "# checking $path.loc\n";
+ok(-f "$path.loc");
+
+unlink("$path.01");
+system("make -f $mk $vars CLEAN");
+ok(! -f "$path.loc");
+
+my $v1 = "11111111101111111110111111111011";	# variant
+my $v2 = "22222222202222222220222222222022";	# variant
+copy("$name.01", "$path.$v1.01");
+copy("$name.01", "$path.$v2.01");
+
+system("make -f $mk $vars BLD");
+system("make -f $mk $vars RELEASABLES");
+
+print "# checking $path.$v1.loc\n";
+ok(-f "$path.$v1.loc");
+print "# checking $path.$v2.loc\n";
+ok(-f "$path.$v2.loc");
+
+unlink("$path.$v1.01");
+unlink("$path.$v2.01");
+
+system("make -f $mk $vars CLEAN");
+ok(! -f "$path.$v1.loc");
+ok(! -f "$path.$v2.loc");
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# change back to the starting directory
+chdir($cwd);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/helloworld/Bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,20 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Component description file
+// 
+//
+
+PRJ_MMPFILES
+
+HelloWorld.mmp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/helloworld/CommonFramework.h	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,61 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+#ifndef __CommonFramework_H
+#define __CommonFramework_H
+
+#include <e32base.h>
+#include <e32cons.h>
+
+_LIT(KTxtEPOC32EX,"EXAMPLES");
+_LIT(KTxtExampleCode,"Symbian OS Example Code");
+_LIT(KFormatFailed,"failed: leave code=%d");
+_LIT(KTxtOK,"ok");
+_LIT(KTxtPressAnyKey," [press any key]");
+
+// public
+LOCAL_D CConsoleBase* console; // write all your messages to this
+LOCAL_C void doExampleL(); // code this function for the real example
+
+// private
+LOCAL_C void callExampleL(); // initialize with cleanup stack, then do example
+
+GLDEF_C TInt E32Main() // main function called by E32
+    {
+	__UHEAP_MARK;
+	CTrapCleanup* cleanup=CTrapCleanup::New(); // get clean-up stack
+	TRAPD(error,callExampleL()); // more initialization, then do example
+	__ASSERT_ALWAYS(!error,User::Panic(KTxtEPOC32EX,error));
+	delete cleanup; // destroy clean-up stack
+	__UHEAP_MARKEND;
+	return 0; // and return
+    }
+
+LOCAL_C void callExampleL() // initialize and call example code under cleanup stack
+    {
+	console=Console::NewL(KTxtExampleCode,TSize(KConsFullScreen,KConsFullScreen));
+	CleanupStack::PushL(console);
+	TRAPD(error,doExampleL()); // perform example function
+	if (error)
+		console->Printf(KFormatFailed, error);
+	else
+		console->Printf(KTxtOK);
+	console->Printf(KTxtPressAnyKey);
+	console->Getch(); // get and ignore character
+	CleanupStack::PopAndDestroy(); // close console
+    }
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/helloworld/HelloWorld.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+#include "CommonFramework.h"
+
+// do the example
+LOCAL_C void doExampleL()
+    {
+	_LIT(KHelloWorldText,"Hello world!\n");
+	console->Printf(KHelloWorldText);
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/helloworld/HelloWorld.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,30 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// using relative paths for sourcepath and user includes
+// 
+//
+
+TARGET        HelloWorld.exe
+TARGETTYPE    exe
+UID           0xE8000047
+VENDORID      0x70000001
+
+SOURCEPATH    .
+SOURCE        HelloWorld.cpp
+
+USERINCLUDE   .
+OS_LAYER_SYSTEMINCLUDE
+
+LIBRARY       euser.lib
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/helloworld/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,68 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# hello world build test
+#
+# If we cannot build this then we probably cannot build anything...
+
+use strict;
+use Test;
+
+# how many tests do we plan to run?
+BEGIN { plan tests => 4 }
+
+# remember where we started
+use Cwd;
+my $cwd = getcwd();
+
+# change to the test data directory
+use File::Basename;
+my $dir = dirname($0);
+chdir($dir);
+print "# running in $dir\n";
+
+# remove the binaries if they already exist
+my $release = $ENV{'EPOCROOT'} . "epoc32/release";
+my @binaries = ("$release/winscw/udeb/HelloWorld.exe",
+			    "$release/winscw/urel/HelloWorld.exe",
+				"$release/armv5/udeb/HelloWorld.exe",
+				"$release/armv5/urel/HelloWorld.exe"
+			   );
+
+foreach (@binaries)
+{
+	unlink($_);
+}
+
+###############################################################################
+# THE TESTS                                                                   #
+###############################################################################
+
+# we cannot test the command return values because they are always 0
+system("bldmake bldfiles");
+system("abld build");
+
+# test for the existence of each binary file
+foreach (@binaries)
+{
+	print "# checking $_\n";
+	ok(-f $_);
+}
+
+###############################################################################
+# END OF TESTS                                                                #
+###############################################################################
+
+# change back to the starting directory
+chdir($cwd);
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/test/smoketest.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,34 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# run smoke tests for the buildsystem
+#
+# each test should use the Test module
+#
+# Failing tests can be re-run individually in their own folder
+# if you need more detailed output to determine the fault.
+
+use strict;
+use Test::Harness;
+$Test::Harness::Verbose = 1;
+
+# a list of all the tests.
+my @all = ( 
+'helloworld/test.pl' ,
+'binaryvariation/test.pl' ,
+'extensions/test.pl'
+);
+
+runtests(@all);
+exit 0;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/tools/buildloggers/group/build.mk	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,36 @@
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+#
+
+SRCDIR = ..\src
+JARDIR = ..\..\..\bin\java
+PKGDIR = com\symbian\ant
+JAVAC = $(JAVA_HOME)\bin\javac -cp $(ANT_HOME)\lib\ant.jar
+
+JARFILE = $(JARDIR)\symbianant.jar
+
+ALL: $(JARFILE)
+
+$(SRCDIR)\$(PKGDIR)\AbldWhatLogger.class: $(SRCDIR)\$(PKGDIR)\AbldWhatLogger.java
+	$(JAVAC) $<
+	
+$(SRCDIR)\$(PKGDIR)\ScanLogger.class: $(SRCDIR)\$(PKGDIR)\ScanLogger.java
+	$(JAVAC) $<
+	
+$(JARFILE): $(SRCDIR)\$(PKGDIR)\AbldWhatLogger.class $(SRCDIR)\$(PKGDIR)\ScanLogger.class
+	$(JAVA_HOME)\bin\jar -cf $@ -C $(SRCDIR) $(PKGDIR)\AbldWhatLogger.class -C $(SRCDIR) $(PKGDIR)\ScanLogger.class
+
+CLEAN:
+	-del $(SRCDIR)\$(PKGDIR)\*.class
+	-del $(JARFILE)
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/tools/buildloggers/src/com/symbian/ant/AbldWhatLogger.java	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,37 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+package com.symbian.ant;
+
+import java.io.PrintStream;
+import org.apache.tools.ant.DefaultLogger;
+
+public class AbldWhatLogger extends DefaultLogger {
+	
+	protected void printMessage(String aMessage, PrintStream aPrintStream, int aPrioritary) {  
+		if (aMessage.indexOf("[echo]") >= 0) {
+			// remove "[echo]"
+			aMessage = aMessage.replace("[echo]", "");
+		} else {
+			aMessage = "";
+		}
+
+		// remove drive letter
+		aMessage = aMessage.replaceAll("[A-Z]:", "");
+
+		super.printMessage(aMessage, aPrintStream, aPrioritary);
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/buildsystem/tools/buildloggers/src/com/symbian/ant/ScanLogger.java	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,86 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+package com.symbian.ant;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.StringReader;
+
+import org.apache.tools.ant.BuildEvent;
+import org.apache.tools.ant.DefaultLogger;
+import org.apache.tools.ant.Project;
+import org.apache.tools.ant.util.StringUtils;
+
+public class ScanLogger extends DefaultLogger {
+
+    /**
+     * Logs a message, if the priority is suitable.
+     * In non-emacs mode, task level messages are prefixed by the
+     * task name which is right-justified.
+     *
+     * @param event A BuildEvent containing message information.
+     *              Must not be <code>null</code>.
+     */
+    public void messageLogged(BuildEvent event) {
+        int priority = event.getPriority();
+        // Filter out messages based on priority
+        if (priority <= msgOutputLevel) {
+
+            StringBuffer message = new StringBuffer();
+            if (event.getTask() != null && !emacsMode) {
+                // Print out the name of the task if we're in one
+                String name = event.getTask().getTaskName();
+                String label = "[" + name + "] ";
+                int size = LEFT_COLUMN_SIZE - label.length();
+                StringBuffer tmp = new StringBuffer();
+                for (int i = 0; i < size; i++) {
+                    tmp.append(" ");
+                }
+                tmp.append(label);
+                label = tmp.toString();
+
+                try {
+                    BufferedReader r =
+                        new BufferedReader(
+                            new StringReader(event.getMessage()));
+                    String line = r.readLine();
+                    boolean first = true;
+                    while (line != null) {
+                        if (!first) {
+                            message.append(StringUtils.LINE_SEP);
+                        }
+                        first = false;
+                        message.append(label).append(line);
+                        line = r.readLine();
+                    }
+                } catch (IOException e) {
+                    // shouldn't be possible
+                    message.append("ERROR:").append(label).append(event.getMessage());
+                }
+            } else {
+                message.append(event.getMessage());
+            }
+
+            String msg = message.toString();
+            if (priority != Project.MSG_ERR) {
+                printMessage(msg, out, priority);
+            } else {
+                printMessage("ERROR:" + msg, err, priority);
+            }
+            log(msg);
+        }
+    }
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/fix_eabi_think_offsets/fix_eabi_thunk_offsets.bat	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,427 @@
+:: 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 "Eclipse Public License v1.0"
+:: which accompanies this distribution, and is available
+:: at the URL "http://www.eclipse.org/legal/epl-v10.html".
+::
+:: Initial Contributors:
+:: Nokia Corporation - initial contribution.
+::
+:: Contributors:
+::
+:: Description:
+::
+
+@rem = '--*-Perl-*--
+@echo off
+if "%OS%" == "Windows_NT" goto WinNT
+perl -x -S "%0" %1 %2 %3 %4 %5 %6 %7 %8 %9
+goto endofperl
+:WinNT
+perl -x -S "%0" %*
+if NOT "%COMSPEC%" == "%SystemRoot%\system32\cmd.exe" goto endofperl
+if %errorlevel% == 9009 echo You do not have Perl in your PATH.
+goto endofperl
+@rem ';
+#!perl
+#line 28
+
+use strict;
+use Getopt::Long;
+
+my $toolVersion = "1.0";
+
+my $update = 0;
+my $use_perforce = 0;
+my $verbose = 0;
+my $defFile;
+
+# 1. Check arguments, output help etc.
+
+GetOptions (
+	'update' => \$update,			# modify the files
+	'perforce' => \$use_perforce,	# apply "p4 edit" to changed files
+	'v+' => \$verbose,				# print extra diagnostic info
+	'match=s' => \$defFile			# only process DEF files matching a pattern
+	);
+
+if (@ARGV == 0)
+	{
+	print STDERR "\nfix_eabi_thunk_offsets.bat - Version $toolVersion\n";
+
+	print STDERR << 'END_OF_HELP';
+
+Usage: fix_eabi_think_offsets [-update] [-perforce] [-match exp] build_log ... 
+
+Parse the output from one or more build logs, extracting MAKEDEF errors and
+warnings which relate to EABI virtual function override thunks. Using this
+information, prepare modified DEF files in which each "missing" export is 
+replaced by a corresponding "unfrozen" export.
+
+-update     Overwrite the existing .def files with the modified versions
+-perforce   Apply "p4 edit" to each of the modified .def files
+-match exp  Process only .def files with names that contain "\exp"
+
+NOTE: The tool assumes that the original build source layout is replicated on 
+the drive where it is being executed.
+
+Build logs will sometimes contain corrupted warning messages, in which case
+the tool will probably report that there is nothing to replace some missing
+symbol. It may help to edit the log file and try again: it is always safe to 
+run this tool more than once on the same log file.
+
+END_OF_HELP
+
+	exit(1);
+	}
+
+my $parseWarnings = 1;
+my $parseErrors = 1;
+
+
+# 2. Parse the build logs, extracting the Makedef warnings & errors
+
+my $line;
+my $header;
+my $parseWarning = 0;
+my $parseError = 0;
+my $variant;
+my $component;
+my $sourceDefFile;
+my @errorOutput;
+my @warningOutput;
+
+my %DefFiles;
+my %TempDefFiles;
+
+sub newDefFile($)
+	{
+	my ($defFile) = @_;
+	if (!defined $DefFiles{$defFile})
+		{
+		@{$DefFiles{$defFile}} = \();
+		}
+	}
+
+while ($line = <>)
+	{
+	if ($line =~ /^Chdir /)
+		{
+		$component = $line;
+		$component =~ s/^Chdir //;
+		$component =~ s/\s//g;
+		next;
+		}
+		
+	if (($line =~ /^  make/) && ($line =~ / CFG\=/))
+		{
+		$variant = $line;
+		$variant =~ s/^.*CFG\=//;
+		$variant =~ s/ .*$//;
+		$variant =~ s/\s//g;
+		next;
+		}
+
+	if ($parseWarnings && ($line =~ /MAKEDEF WARNING:/))
+		{
+		$parseWarning =  1;
+		$parseError = 0;
+		$header = $line;
+		next;		
+		}
+		
+	if ($parseErrors && ($line =~ /MAKEDEF ERROR:/))
+		{
+		$parseWarning =  0;
+		$parseError = 1;
+		$header = $line;
+		next;		
+		}
+
+	if ($line !~ /^  /)
+		{
+		$parseWarning = 0;
+		$parseError = 0;
+		next;
+		}
+
+	if ($parseWarning)
+		{
+		if ($header)
+			{
+			if ($defFile && ($header !~ /\\$defFile/i))
+				{
+				$parseWarning = 0;
+				$parseError = 0;
+				next;
+				}
+			
+			$sourceDefFile = $header;
+			$sourceDefFile =~ s/^.*not yet Frozen in//;
+			$sourceDefFile =~ s/://;
+			$sourceDefFile =~ s/\s//g;
+			
+			push @warningOutput, "--\n$sourceDefFile ($variant)\n$component\n$header";
+			newDefFile($sourceDefFile);
+			$header = "";
+			}
+
+		next if ($line =~ /\*\*\*/);
+		if ($line =~ /^  (\S.*}\.def)(\(\d+\) : \S+.*)$/)
+			{
+			push @{$DefFiles{$sourceDefFile}}, "W$2";
+			$TempDefFiles{$1} = $sourceDefFile;
+			}
+		push @warningOutput, $line;
+		
+		next;		
+		}
+
+	if ($parseError)
+		{
+		if ($defFile && ($line !~ /\\$defFile/i))
+			{
+			$parseWarning = 0;
+			$parseError = 0;
+			next;
+			}
+			
+		if ($header)
+			{
+			$sourceDefFile = $line;
+			$sourceDefFile =~ s/\(.*$//;
+			$sourceDefFile =~ s/\s//g;
+
+			push @errorOutput, "--\n$sourceDefFile ($variant)\n$component\n$header";
+			newDefFile($sourceDefFile);
+			$header = "";
+			}
+
+		next if ($line =~ /\*\*\*/);
+		if ($line =~ /(\(\d+\) : \S+.*)$/)
+			{
+			push @{$DefFiles{$sourceDefFile}}, "E$1";
+			}
+		push @errorOutput, $line;
+		
+		next;
+		}
+
+	# Catch a orphaned warning line...
+	
+	if ($line =~ /^  (\S.*}\.def)(\(\d+\) : \S+.*)$/)
+		{
+		my $tempDefFile = $1;
+		my $newline = $2;
+		
+		next if ($defFile && ($tempDefFile !~ /\\$defFile/i));
+
+		my $sourceDefFile = $TempDefFiles{$tempDefFile};
+		push @{$DefFiles{$sourceDefFile}}, "W$newline";
+		push @warningOutput, $line;
+		}
+
+	}
+
+close BUILD_LOG;
+
+# 3. Process the information for each DEF file
+
+my %Classes;
+my @DefFileList;
+
+foreach my $def (sort keys %DefFiles)
+	{
+	my @replacements;
+	my @errors;
+	my @warnings;
+	my $problems = 0;
+	
+	print "\n----\n$def\n";
+	if ($verbose > 1)
+		{
+		print "Information extracted from Makedef warnings and errors:\n";
+		# printed inside the following loop...
+		}
+
+	# Process into lists of errors and warnings which can be sorted
+	
+	my $previousline = "";
+	foreach $line (sort @{$DefFiles{$def}})
+		{
+		next if ($line eq $previousline);	# skip duplicates
+		$previousline = $line;
+		print "\t$line\n" if ($verbose > 1);
+			
+		if ($line =~ /^(.)\((\d+)\) : (((_ZTh|_ZTv)([n0-9_]+)_(NK?(\d+)(\S+)))\s.*)$/)
+			{
+			my $msgtype = $1;
+			my $lineno = $2;
+			my $defline = $3;
+			my $symbol = $4;
+			my $thunkprefix = $5;
+			my $thunkoffset = $6;
+			my $unthunked = $7;
+			my $topnamelen = $8;
+			my $restofsymbol = $9;
+			
+			if ($msgtype eq "E")
+				{
+				push @errors, "$unthunked\@$thunkprefix $thunkoffset $lineno $symbol";
+				}
+			else
+				{
+				push @warnings, "$unthunked\@$thunkprefix $thunkoffset $symbol";
+				}
+				
+			my $class = substr $restofsymbol, 0, $topnamelen;
+			$Classes{$class} = 1;
+			}
+		else
+			{
+			print "WARNING: Ignored - not a thunk: $line\n";
+			}
+		}
+	
+	# Match up the errors and warnings for related symbols
+	
+	@errors = sort @errors;
+	@warnings = sort @warnings;
+	my $error;
+	my $warning;
+	while (scalar @errors && scalar @warnings)
+		{
+		# Unpack the first entry in each of the lists
+		
+		$error = shift @errors;
+		my ($ekey, $eoffset, $eline, $esymbol) = split / /, $error;
+		$warning = shift @warnings;
+		my ($wkey, $woffset, $wsymbol) = split / /, $warning;
+		
+		# Are they for the same thunk?
+		
+		if ($ekey lt $wkey) 
+			{
+			# no - unmatched error, so put back the warning
+			unshift @warnings, $warning;
+			print "Nothing to replace missing symbol on $eline : $esymbol\n";
+			$problems += 1;
+			next;
+			}
+		
+		if ($ekey gt $wkey)
+			{
+			# no - unmatched warning, so put back the error
+			unshift @errors, $error;
+			print "Nothing missing for replacement symbol : $wsymbol\n";
+			$problems += 1;
+			next;
+			}
+		
+		# Yes - create replacement instruction
+		
+		push @replacements, "$eline $esymbol => $wsymbol";
+		}
+	
+	# drain remaining problems, if any
+	
+	foreach my $error (@errors)
+		{
+		my ($ekey, $eoffset, $eline, $esymbol) = split / /, $error;
+		print "Nothing to replace missing symbol on $eline : $esymbol\n";
+		$problems += 1;
+		}
+	foreach my $warning (@warnings)
+		{
+		my ($wkey, $woffset, $wsymbol) = split / /, $warning;
+		print "Nothing missing for replacement symbol : $wsymbol\n";
+		$problems += 1;
+		}
+		
+	if ($verbose)
+		{
+		print "\nSubstitions identified:\n\t";
+		print join("\n\t", sort @replacements);
+		print "\n";
+		}
+	
+	open DEFFILE, "<$def" or print "Can't open $def: $!\n" and next;
+	my @deflines = <DEFFILE>;
+	close DEFFILE;
+	my $changedlines = 0;
+
+	foreach my $fix (@replacements)
+		{
+		my ($lineno, $before, $to, $after) = split ' ', $fix;
+
+		my $line = @deflines[$lineno-1];
+		if ($line =~ /\s($after)\s/)
+			{
+			print "$lineno - already fixed\n";
+			next;
+			}
+		if ($line =~ /\s($before)\s/)
+			{
+			$line =~ s/(\s)$before(\s)/$1$after$2/;
+			@deflines[$lineno-1] = $line;
+			print "Changed $lineno to $line" if ($verbose > 1);
+			$changedlines += 1;
+			next;
+			}
+		print "$lineno doesn't contain $before\n";
+		$problems += 1;
+		}
+	print "\n";
+	
+	if ($problems != 0)
+		{
+		print "WARNING: $problems thunks could not be repaired\n";
+		}
+
+	if ($changedlines == 0)
+		{
+		print "Nothing to change\n";
+		next;
+		}
+	print "Will change $changedlines lines\n\n";
+
+	# Now update the file (and edit in Perforce if required)
+		
+	if ($update)
+		{
+		chmod 0666, $def;	# make it writeable
+		
+		open DEFFILE, ">$def" or print "Can't open $def for writing: $!\n" and next;
+		print DEFFILE @deflines;
+		close DEFFILE;
+		
+		print "Updated $def\n";
+		push @DefFileList, $def;
+		
+		if ($use_perforce)
+			{
+			print "* p4 edit $def\n";
+			system "p4 edit $def";
+			print "\n";
+			}
+		}
+	}
+
+# 5. More diagnostic information
+
+if (scalar @DefFileList)
+	{
+	print "\nList of updated def files\n";
+	print join("\n", @DefFileList);
+	print "\n";
+	}
+
+if ($verbose && scalar keys %Classes != 0)
+	{
+	print "\nList of affected classes:\n";
+	print join("\n", sort keys %Classes), "\n";
+	}
+
+__END__
+:endofperl
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/fix_eabi_think_offsets/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,19 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/fix_eabi_think_offsets/group/fix_eabi_thunk_offsets.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_sbsv1_fix_eabi_thunk_offsets
+
+source	\src\tools\build\sbsv1\fix_eabi_thunk_offsets
+binary	\src\tools\build\sbsv1\fix_eabi_thunk_offsets\group	all
+exports	\src\tools\build\sbsv1\fix_eabi_thunk_offsets\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/make-abld/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,22 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+#ifndef TOOLS2_LINUX
+../../make-abld/make.exe			/epoc32/tools/make.exe
+#endif
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/make-abld/group/make-abld.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_sbsv1_make-abld
+
+source	\src\tools\build\sbsv1\make-abld
+binary	\src\tools\build\sbsv1\make-abld\group	all
+exports	\src\tools\build\sbsv1\make-abld\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
Binary file sbsv1/make-abld/make.exe has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/scpp-abld/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// Copyright (c) 2007-2010 Nokia Corporation and/or its subsidiary(-ies).
+// All rights reserved.
+// This component and the accompanying materials are made available
+// under the terms of "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+PRJ_PLATFORMS
+TOOLS2
+
+PRJ_EXPORTS
+
+#ifndef TOOLS2_LINUX
+../../scpp-abld/scpp.exe			/epoc32/tools/scpp.exe
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/sbsv1/scpp-abld/group/scpp-abld.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component	dev_build_sbsv1_scpp-abld
+
+source	\src\tools\build\sbsv1\scpp-abld
+binary	\src\tools\build\sbsv1\scpp-abld\group	all
+exports	\src\tools\build\sbsv1\scpp-abld\group
+
+notes_source \component_defs\release.src
+
+ipr T
+
Binary file sbsv1/scpp-abld/scpp.exe has changed
--- a/sbsv2/raptor/python/raptor_version.py.bak	Wed Jun 23 17:27:59 2010 +0800
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,20 +0,0 @@
-#
-# 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 "Eclipse Public License v1.0"
-# which accompanies this distribution, and is available
-# at the URL "http://www.eclipse.org/legal/epl-v10.html".
-#
-# Initial Contributors:
-# Nokia Corporation - initial contribution.
-#
-# Contributors:
-#
-# Description: 
-# raptor version information module
-#
-
-def Version():
-	"""Raptor version string"""
-	return "2.10.0 [2009-10-05 sf release]"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/distillsrc.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,99 @@
+#!/bin/perl -w
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# distillsrc.pl - compiles a list of source used in .mrp files, and deletes
+# any unused source
+# 
+#
+
+use strict;
+use FindBin;
+use Getopt::Long;
+use File::Spec;
+
+use lib $FindBin::Bin;
+use distillsrc;
+
+my $errorLevel = 0;
+
+# Distillsrc is to continue on error rather than die.  A warning handler is used
+# so that we can still exit with an error level.
+$SIG{__WARN__} = sub {warn @_;
+                      $errorLevel = 1};
+
+sub dieHelp()
+	{
+	print <<HELP_EOF;
+
+  Usage: perl distillsrc.pl [-f file] [-m file] [-c file] -r src_root
+    -s source_path [-p src_prefix] -l platform [-n] [-d] [-h help];
+	
+  Options in detail:
+    -file|f file : components.txt file to read (may be more than one)
+    -mrp|m file : additional .mrp file to read (may be more than one)
+    -config|c file : a configuration file to use containing .mrp files to use
+    -r src_root : The root from which all src statements are based
+    -s source_path : The path under src_root to the source tree to be processed
+    -p src_prefix : An optional prefix which can be stripped from all src
+      statements
+    -l platform : The platform (beech etc), needed in order to locate the
+      correct product directory
+    -n : don't check the case of files in the config file and in .mrps against
+      the file system
+    -d : dummy mode
+      
+  Note that the src_prefix in combination with the src_root can be used to
+  displace the source tree, if it isn't in it's final location.
+HELP_EOF
+	exit 1;
+	}
+
+# Read command line options to find out if we're doing a dummy run, and where the options are
+my @files = ();
+my @mrps = ();
+my $srcroot;
+my $srcprefix;
+my $dummy = 0;
+my $srcpath;
+my $config;
+my $platform;
+my $help;
+my $nocheckcase;
+GetOptions("config=s" => \$config, "file=s" => \@files, "mrp=s" => \@mrps, "srcroot|r=s" => \$srcroot, "srcpath|s=s" => \$srcpath, "srcprefix|p=s" => \$srcprefix, "platform|l=s" => \$platform, "dummy" => \$dummy, "help" => \$help, "nocheck|n" => \$nocheckcase);
+
+if ($help)
+	{
+	dieHelp();
+	}
+
+
+my $distiller=New CDistillSrc($srcroot, $srcpath, $srcprefix, $platform, !$nocheckcase);
+
+if (!defined($distiller))
+	{
+	dieHelp();
+	}
+
+if (!($distiller->LoadMrps($config, \@files, \@mrps)))
+	{
+	exit 1; # Couldn't read all the mrps - don't start deleting source based on incomplete data
+	}
+
+$distiller->Print(0);
+
+# Run through the source tree, matching every file against the source items. Anything that doesn't, delete it (or warn, if we're doing a dummy run).
+	
+$distiller->DistillSrc($dummy);
+
+exit $errorLevel;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/distillsrc.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,898 @@
+#!/bin/perl -w
+
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# distillsrc.pm - compiles a list of source used in .mrp files, and deletes
+# any unused source
+# 
+#
+
+package CDistillSrc;
+
+use strict;
+use File::Spec;
+use File::Path;
+use File::Basename;
+use FindBin;
+use lib $FindBin::Bin;
+use ReadMrp;
+
+use lib File::Spec->catdir($FindBin::Bin, '..', 'makecbr');
+use CConfig;
+
+
+
+# Constructor
+#
+# Parameters:
+#
+# $aSrcRoot : The root from which all src statements are based
+# $aSrcPath : The path under aSrcRoot to the source tree to be processed
+# $aSrcPrefix : An optional prefix which can be stripped from all src statements
+# $aPlatform : e.g 'beech' - used to locate the platform specific product directory
+#
+# Returns: The object (or undef if there was a problem)
+#
+sub New($$$$)
+	{
+	my $proto = shift;
+	my ($aSrcRoot, $aSrcPath, $aSrcPrefix, $aPlatform, $aCheckCase) = @_;
+
+	my $class = ref($proto) || $proto;
+
+	my $self = {};
+	bless($self, $class);
+
+	my $error = 0;
+
+	if (!defined($aSrcRoot))
+		{
+		print "ERROR: RealTimeBuild: A srcroot must be given, to specify where all 'source' declarations originate from\n";
+		$error = 1;
+		}
+		
+	if (!defined($aSrcPath))
+		{
+		print "ERROR: RealTimeBuild: A srcpath must be given, to specify which source under the srcroot is to be filtered. Use '\\' to filter the entire srcroot\n";
+		$error = 1;
+		}
+
+	if (!defined($aPlatform))
+		{
+		print "ERROR: RealTimeBuild: A platform must be given, to locate the product directory\n";
+		$error = 1;
+		}
+		
+	if ($error)
+		{
+		print "\n";
+		}
+	else
+		{
+		if ($aSrcPath =~ /\.\./)
+			{
+			print "ERROR: RealTimeBuild: The source path must be relative to the srcroot, and must not contain '..'\n";
+			$error = 1;
+			}
+	
+		$self->iSrcRoot($aSrcRoot);
+		$self->iSrcPath($aSrcPath);
+		$self->iSrcPrefix($aSrcPrefix);
+		$self->iPlatform($aPlatform);
+		$self->iSrcItems({});
+		$self->iCheckCase(!!$aCheckCase);
+
+		$self->AddSrcItem("os/buildtools/toolsandutils/productionbldtools/unref/orphan/cedprd/SuppKit", "non-shipped");
+		$self->AddSrcItem("os/buildtools/toolsandutils/productionbldtools/unref/orphan/cedprd/tools", "non-shipped");
+		$self->AddSrcItem("os/buildtools/toolsandutils/productionbldtools/unref/orphan/cedprd/DevKit", "non-shipped");
+		$self->AddSrcItem("os/buildtools/toolsandutils/productionbldtools", "non-shipped");
+		}
+
+	if ($error)
+		{
+		$self = undef;
+		}
+
+	return $self;
+	}
+
+# Object data
+#
+sub iSrcRoot()
+	{
+	my $self = shift;
+	if (@_) { $self->{iSRCROOT} = shift; }
+	return $self->{iSRCROOT};
+	}
+
+sub iSrcPath()
+	{
+	my $self = shift;
+	if (@_) { $self->{iSRCPATH} = shift; }
+	return $self->{iSRCPATH};
+	}
+
+sub iSrcPrefix()
+	{
+	my $self = shift;
+	if (@_) { $self->{iSRCPREFIX} = shift; }
+	return $self->{iSRCPREFIX};
+	}
+
+sub iPlatform()
+	{
+	my $self = shift;
+	if (@_) { $self->{iPLATFORM} = shift; }
+	return $self->{iPLATFORM};
+	}
+	
+sub iSrcItems()
+	{
+	my $self = shift;
+	if (@_) { $self->{iSRCITEMS} = shift; }
+	return $self->{iSRCITEMS};
+	}
+
+sub iCheckCase()
+	{
+	my $self = shift;
+	if (@_) { $self->{iCHECKCASE} = shift; }
+	return $self->{iCHECKCASE};
+	}
+
+sub iCorrectedCase()
+	{
+	my $self = shift;
+	if (@_) { $self->{iCORRECTEDCASE} = shift; }
+	return $self->{iCORRECTEDCASE};
+	}
+
+# LoadMrps - Records the source lines out of all .mrp files
+#
+# Parameters:
+# $aConfig - optional configuration file, as used by makecbr
+# $aLists - optional component lists, as used by makecbr
+# $aMrps - optional .mrp files
+#
+# Returns: True, if the load was successful. False otherwise
+#
+sub LoadMrps($$$)
+	{
+	my $self = shift;
+	my ($aConfig, $aLists, $aMrps) = @_;
+	# Load in config file
+
+	my @lists = @$aLists;
+	my @mrps;
+	foreach my $mrp (@$aMrps){
+		{
+		push @mrps, [$mrp, ''];
+		}
+	}
+	my @configMrps = ();
+    if (defined($aConfig))
+		{
+		my @configs = $self->_LoadConfig($aConfig);
+
+		# Add mrps and lists (after planting them in srcroot)
+		push @lists, map($self->_PlantFile($_), @{$configs[0]});
+		@configMrps = map($self->_PlantFile($_), @{$configs[1]});
+		foreach my $mrp (@configMrps)
+			{
+			push @mrps, [$mrp, ''];
+			}
+		}
+	
+	# Load in mrp lists
+	foreach my $file (@lists)
+		{
+		if (open (MRPLIST, $file))
+			{
+			foreach my $line (<MRPLIST>)
+				{
+				chomp $line;
+				$line =~ s/#.*$//; # Remove comments
+				$line =~ s/^\s*//; # Remove extraneous spaces
+				$line =~ s/\s*$//;
+	
+				if ($line ne "")
+					{
+					my @parms = split(/\s+/, $line);
+	
+					if (scalar(@parms) != 2)
+						{
+						warn "ERROR: RealTimeBuild: Entries in component list '$file' should be of the form 'name mrp_location'. Problem in line: $line\n";
+						next;
+						}
+					else
+						{
+						# Ignore *nosource* entries
+						next if ($parms[1] eq '*nosource*');
+						
+						push @mrps, [$self->_PlantFile($parms[1]), $parms[0]];
+						}
+					}
+				}
+			close MRPLIST or warn "ERROR: RealTimeBuild: Couldn't close '$file' : $!\n";
+			}
+		else
+			{
+			warn "Couldn't open '$file' : $!\n";	
+			}
+		}
+
+	# Load all .mrp files
+	if (scalar(@mrps) == 0)
+		{
+		die "ERROR: RealTimeBuild: No .mrp files were specified\n";
+		}
+
+	my $loaded = 1;
+	
+	foreach my $mrp (@mrps)
+		{
+		# Get path of mrp file (from here)
+		my ($name, $path) = fileparse($mrp->[0]);
+		# Convert to path from source root
+		if (!($self->_RemoveBaseFromPath($self->iSrcRoot(), \$path)))
+			{
+			warn "ERROR: Mrp file $mrp->[0] isn't under the source root (".$self->iSrcRoot().")\n";
+			next;
+			}
+		
+		my $mrpobj;
+        
+        # To indicate the correct case and where the .mrp file comes from if failed to check letter case
+        if (!($self->_CheckCase($mrp->[0]))) {
+            my $mrp_error_source = "optional component list(by -f) or optional .mrp list(by -m)";
+            foreach my $myName (@configMrps) {
+                if ($myName eq $mrp->[0]) {
+                    $mrp_error_source = "config file '".$aConfig."'";
+                    last;
+                }
+            } 
+            print "WARNING: Case of '".$mrp->[0]."' supplied in ".$mrp_error_source." does not match the file system. Should be ".$self->iCorrectedCase()."\n";
+        }
+        
+		if (!eval { $mrpobj = New ReadMrp($mrp->[0]) })
+			{
+			$loaded = 0;
+			my $message = $@;
+			$message =~ s/^(ERROR:\s*)?/ERROR: RealTimeBuild: /i;
+			print $message;
+			}
+		else
+			{
+			my $selfowned = 0;
+			my $mrpComponentName = $mrpobj->GetComponent();
+			if( ($mrp->[1] ne '') && (lc($mrp->[1]) ne lc($mrpComponentName)))
+				{
+				print "ERROR: RealTimeBuild: Component name \'$mrp->[1]\' does not match \'$mrpComponentName\' in $mrp->[0]\n";
+				}
+			foreach my $srcitem (@{$mrpobj->GetSrcItems()})
+				{
+				if ($srcitem =~ /^[\/\\]/)
+					{
+					# Remove source prefix
+					$srcitem = $self->_StripFile($srcitem);
+					}
+				else
+					{
+					# Relative source item
+					$srcitem = File::Spec->catdir($path, $srcitem);
+					}
+
+				my $rootedmrp = $path.$name;
+				if ($self->_RemoveBaseFromPath($srcitem, \$rootedmrp))
+					{
+					$selfowned = 1;
+					}
+
+				$self->AddSrcItem($srcitem, $mrpComponentName);
+				}
+			if ($self->iCheckCase())
+				{
+				foreach my $binexpitem (@{$mrpobj->GetBinExpItems()})
+					{
+					# Check lower case
+					if ($binexpitem =~ /[A-Z]/)
+						{
+						print "REMARK: [$mrpComponentName] Binary/export file $binexpitem should be lower case\n";
+						}
+					}
+				}
+
+			if (!$selfowned)
+				{
+				print "REMARK: .mrp file '$mrp->[0]' does not include itself as source\n"; 
+				}
+			}
+		}
+	return $loaded;
+	}
+	
+# AddSrcItem - Records a source file, usually taken from an .mrp file
+#
+# Parameters:
+# $aItem - the source file name
+# $aComponent - the name of the component which claimed the file
+#
+# Returns: None
+# Dies: Not normally; only if the source hash data structure gets corrupted
+sub AddSrcItem($$)
+	{
+	my $self = shift;
+	my ($aItem, $aComponent) = @_;
+
+	my $item = $aItem;
+
+	# Worth checking that the file exists
+	my $truePath = File::Spec->catdir($self->iSrcRoot(), $item);
+	if (($item !~ /^\\component_defs/i) && (!-e $truePath))
+		{
+		print "ERROR: RealTimeBuild: '$aComponent' owns $item, but that path doesn't exist\n";
+		$item = ""; # No point adding this path to the tree	
+		}
+	else
+		{
+		# Check case consistency
+		$self->_CheckCase($truePath) or print "WARNING: [$aComponent] Case of '".$truePath."' does not match the file system. Should be ".$self->iCorrectedCase()."\n";
+		}
+	
+	$item =~ s/^[\/\\]*//; # Remove preceding slashes
+
+	my @path = split(/[\/\\]+/,$item);
+
+	my $dir = $self->iSrcItems();
+	while ((scalar @path) > 0)
+		{
+		my $subdir = lc(shift @path);
+	
+		if (scalar(@path) == 0)
+			{
+			# Just enter the final path segment
+			if (exists($dir->{$subdir}))
+				{
+				# Someone already owns at least part of this path
+				if (!ref($dir->{$subdir}))
+					{
+					# Someone owns the whole of this path
+					my $conflict = $dir->{$subdir};
+
+					print "REMARK: $aComponent and $conflict both own $item\n";
+					}
+				else
+					{
+					if (ref($dir->{$subdir}) ne "HASH")
+						{
+						die "ERROR: Source hash is corrupted\n";
+						}
+					else
+						{
+						# Someone owns a child of this path
+						my $childtree = $dir->{$subdir};
+
+						my @conflicts = $self->_GetTreeComps($childtree);
+						print "REMARK: $aComponent owns $item, which is already owned by the following component(s): ".join(", ",@conflicts)."\n";
+						}
+					}
+				}
+			$dir->{$subdir} = $aComponent;
+			}
+		else
+			{
+			# Need to enter another subdirectory
+			
+			if (exists($dir->{$subdir}))
+				{
+				if (ref($dir->{$subdir}))
+					{
+					# Someone already has - just do a quick integrity check
+					
+					if (ref($dir->{$subdir}) ne "HASH")
+						{
+						die "ERROR: Source hash is corrupted\n";
+						}
+					}
+				else
+					{
+					# The path from this point on is already owned by a component
+					my $conflict = $dir->{$subdir};
+					
+					print "REMARK: $aComponent and $conflict both own $item\n";
+					last;
+					}
+				}
+			else
+				{
+				$dir->{$subdir} = {};
+				}
+			}
+
+		$dir = $dir->{$subdir};
+		}
+	}
+
+# DistillSrc - Compare the recorded source lines against the source path. Delete anything which doesn't match.
+#
+# Parameters:
+# $aDummy - A flag - non-zero means don't actually delete
+#
+# Returns: None
+sub DistillSrc($$)
+	{
+	my $self = shift;
+	my ($aDummy) = @_;
+
+	my $tree = $self->iSrcItems();
+	my $path = File::Spec->catdir($self->iSrcRoot(), $self->iSrcPath());
+
+	$path=~s/[\/\\]+/\\/; # Remove multiple slashes
+
+	# Pop the srcpath off the front of the tree
+	my @path = split(/[\/\\]/,$self->iSrcPath());
+
+	foreach my $dir (@path)
+		{
+		if ($dir eq ".")
+			{
+			next;
+			}
+		elsif (exists($tree->{lc($dir)}))
+			{
+			$tree = $tree->{lc($dir)};
+		
+			if (!ref($tree))
+				{
+				# Some component owns all of the srcpath
+				last;
+				}
+			}
+		else
+			{
+			# No mrp files claimed any of the source
+			$tree = undef;
+			last;
+			}
+		}
+
+	# Now recurse into the tree and delete files
+	if (defined($tree))
+		{
+		if (ref($tree))
+			{
+			$self->_DistillTree($tree, $path, $aDummy);
+			}
+		else
+			{
+			print "REMARK: All source owned by component '$tree'; no action\n";
+			}
+		}
+	else
+		{
+		print "WARNING: No .mrp files claim any source; removing $path\n";
+		$self->_DeletePath($path, $aDummy);
+		}
+	}
+
+# Print - Display the source tree
+#
+# Parameters:
+# $aDepth - The number of levels of the tree to show. 0 = all levels
+#
+# Returns: None
+sub Print($$)
+	{
+	my $self = shift;
+
+	my ($aDepth) = @_;
+
+	$self->_PrintTree("", $self->iSrcItems(), $aDepth);
+	}
+	
+# *** Private methods ***
+# *** 
+
+# _LoadConfig - (private) Reads a configuration file, as used by makecbr
+#
+# Parameters:
+# $aConfig - filename of the configuration file
+#
+# Returns:
+# (files, mrps) - where files and mrps are listrefs containing component lists and
+# mrp files respectively
+#
+sub _LoadConfig($)
+	{
+	my $self = shift;
+	my ($aConfig) = @_;
+	
+	my @files = ();
+	my @mrps = ();
+	
+	my $config = New CConfig($aConfig);
+
+	if (!defined $config)
+		{
+		die "Couldn't load config file '$aConfig'\n";
+		}
+		
+	# Extract the interesting items into our lists
+	push @mrps, $config->Get("gt+techview baseline mrp location");
+	push @mrps, $config->Get("gt only baseline mrp location");
+	push @files, $config->Get("techview component list");
+	push @files, $config->Get("gt component list");
+	
+	# Remove any items we couldn't find
+	@mrps = grep(defined($_), @mrps);
+	@files = grep(defined($_), @files);
+	
+	return (\@files, \@mrps);
+	}
+
+# _StripFile - (private) Remover of src prefix. Also maps product directories
+#
+# Parameters:
+# $aFile - Filename to process
+#
+# Returns: The processed filename
+#
+sub _StripFile($)
+	{
+	my $self = shift;
+	my ($aFile) = @_;
+
+	my $file = $aFile;
+
+	# Map the product dirs
+	my $platform = $self->iPlatform();
+	$file =~ s#^[\/\\]?product[\/\\]#/sf/os/unref/orphan/cedprd/#i;
+
+	# Remove the prefix
+	my $prefix = $self->iSrcPrefix();
+	
+	if (defined $prefix)
+		{
+		my $mapped = $file; # Keep a copy in case we can't remove the prefix
+		
+		if (!$self->_RemoveBaseFromPath($prefix, \$file))
+			{
+			$file = $mapped;
+			}
+		}
+	
+	return $file;
+	}
+	
+# _PlantFile - (private) Add src root to file. Also take off src prefix
+#
+# Parameters:
+# $aFile - Filename to process
+#
+# Returns: The processed filename
+#
+sub _PlantFile($)
+	{
+	my $self = shift;
+	my ($aFile) = @_;
+
+	my $file = $aFile;
+
+	# Remove the prefix
+	$file = $self->_StripFile($file);
+
+	# Plant the file in the src root
+	$file = File::Spec->catdir($self->iSrcRoot(), $file);
+	
+	# Ensure all slashes are normalised to a single backslash
+	$file =~ s/[\/\\]+/\\/; 
+	
+	return $file;
+	}
+
+# _RemoveBaseFromPath - (private) Remove a base path from the root of a filename.
+#
+# Parameters:
+# $aBase - The base path to remove
+# $$aFile - Filename to process (scalar reference)
+#
+# Returns: True if the file was under the base path, false otherwise
+#   $$aFile may be corrupted if the return is false
+sub _RemoveBaseFromPath($)
+	{
+	my $self = shift;
+	my ($aBase, $aFile) = @_;
+
+	my $base = $aBase;
+	$base =~ s/^[\/\\]*//; # Remove extra slashes
+	$base =~ s/[\/\\]*$//;
+
+	my @base = split(/[\/\\]+/, $base);
+
+	$$aFile =~ s/^[\/\\]*//; # Remove preceding slashes
+	
+	my $matched = 1;
+	my $filedir;
+	
+	foreach my $dir (@base)
+		{
+		if ($$aFile =~ /[\/\\]/)
+			{
+			# Split off the bottom dir
+			$$aFile =~ /([^\/\\]*)[\/\\]+(.*)$/;
+			($filedir, $$aFile) = ($1, $2, $3);
+			}
+		else
+			{
+			# Special case - no more dirs
+			$filedir = $$aFile;
+			$$aFile = "";
+			}
+		if (lc($filedir) ne lc($dir))
+			{
+			# Base doesn't match
+			$matched = 0;
+			last;
+			}
+		}
+	
+	return $matched;
+	}
+
+# _CheckCase - (private) Given a literal filename, compares the case of the
+#                        file on the filesystem against the filename i.e. it
+#                        can be used to enforce case sensitivity
+#
+# Parameters:
+# $aFilename - The literal filename
+#
+# Returns: True if the file matches the supplied case.
+#          True if the file doesn't exist at all (user is expected to check that separately)
+#          True if case checking has been disabled.
+#          False otherwise (if the file exists but under a differing case).
+#
+# If false, the correctly cased name is present through $self->iCorrectedCase()
+sub _CheckCase($)
+{
+	my $self = shift;
+	my ($aFile) = @_;
+
+	return 1 if !($self->iCheckCase()); # checking disabled
+	return 1 if ($^O !~ /win32/i); # only works on Windows anyway
+	
+	return 1 if (!-e $aFile); # file not found (under case-insensitive checking)
+	
+	$self->iCorrectedCase(Win32::GetLongPathName($aFile));
+	return ($aFile eq $self->iCorrectedCase());
+}
+
+# _DistillTree - (private) Given a src tree and a dir, clean out any unowned files
+#
+# Parameters:
+# %$aTree - The source tree (hash ref containing nested hash refs and string leaves)
+# $aDir - The directory to compare against
+# $aDummy - A flag - non-zero means don't do the actual deletion
+#
+# Returns: A flag - non-zero if there were any owned files present
+sub _DistillTree($$$)
+	{
+	my $self = shift;
+	my ($aTree, $aDir, $aDummy) = @_;
+
+
+	my $keptsome = 0;
+
+	if (opendir(DIR, $aDir))
+	{	
+		my $dir = $aDir;
+		$dir =~ s/[\/\\]*$//; # Remove trailing / from dir
+	
+		foreach my $entry (readdir(DIR))
+			{
+			my $path = $dir."\\".$entry;
+	
+			if ($entry =~ /^\.\.?$/)
+				{
+				next;
+				}
+			elsif (exists $aTree->{lc($entry)})
+				{
+				my $treeentry = $aTree->{lc($entry)};
+				if (ref($treeentry) eq "HASH")
+					{
+					# Part of this path is owned
+					if (-d $path)
+						{
+						# Recurse into path
+						my $keep = $self->_DistillTree($treeentry, $path, $aDummy);
+						if ($keep)
+							{
+							$keptsome = 1;
+							}
+						else
+							{
+							# Correction; none of this path was owned
+							$self->_DeletePath($path, $aDummy);
+							}
+						}
+					elsif (-f $path)
+						{
+						my @comps = $self->_GetTreeComps($treeentry);
+						print "ERROR: RealTimeBuild: $path is a file, yet is used as a directory in components: ".join(", ",@comps)."\n";
+						}
+					else
+						{
+						print "ERROR: $path has disappeared while it was being examined\n";
+						}
+					}
+				elsif (!ref($treeentry))
+					{
+					# This path is completely owned
+					$keptsome = 1;
+					next;
+					}
+				else
+					{
+					die "ERROR: Source hash is corrupted\n";
+					}
+				}
+			else
+				{
+				$self->_DeletePath($path, $aDummy);
+				}
+			}
+		
+		closedir(DIR);
+		}
+	else
+		{
+			warn "ERROR: RealTimeBuild: Couldn't open directory '$aDir' for reading\n";
+		}
+
+	return $keptsome;
+	}
+
+# _GetTreeComps - (private) Get all the leaves out of a tree (or component
+#                           names out of a source tree)
+# Parameters:
+# %$aTree - The source tree (hash ref containing nested hash refs and string leaves)
+# 
+# Returns: A list of strings found at the leaves (or component names)
+sub _GetTreeComps($)
+	{
+	my $self = shift;
+	my ($aTree) = @_;
+
+	my @comps = ();
+
+	foreach my $entry (keys(%$aTree))
+		{
+		if (ref($aTree->{$entry}) eq "HASH")
+			{
+			push @comps, $self->_GetTreeComps($aTree->{$entry});
+			}
+		elsif (!ref($aTree->{$entry}))
+			{
+			push @comps, $aTree->{$entry};
+			}
+		else
+			{
+			die "ERROR: Source hash is corrupted\n";
+			}
+		}
+		
+	return @comps;
+	}
+
+# _DeletePath - (private) Safe path deletion (file or dir)
+#
+# $aPath - The path to delet
+# $aDummy  - A flag - non-zero means don't actually delete
+#
+# Returns: None. Prints warnings if deletion fails. Dies only in exceptional circumstances
+sub _DeletePath($$)
+	{
+	my $self = shift;
+
+	my ($aPath, $aDummy) = @_;
+
+	if (-d $aPath)
+		{
+		if ($aDummy)
+			{
+			print "DUMMY: Directory $aPath is not specified in any .mrp file\n";
+			}
+		else
+			{
+			print "REMARK: Deleting directory $aPath; ";
+			my $files = rmtree($aPath);
+			if ($files)
+				{
+				print "$files items removed\n";
+				}
+			else
+				{
+				print "\nWARNING: Problem removing directory $aPath\n";
+				}
+			}
+		}
+	elsif (-f $aPath)
+		{
+		if ($aDummy)
+			{
+			print "DUMMY: File $aPath is not specified in any .mrp file\n";
+			}
+		else
+			{
+				unless($aPath =~ /distribution.policy.s60/i)
+				{
+					print "REMARK: Deleting file $aPath\n";
+					unlink $aPath or print "WARNING: Problem deleting file $aPath\n";
+				}
+			}
+		}
+	else
+		{
+		warn "ERROR: Can't delete path $aPath; not a file or directory\n";
+		}
+	}
+
+# _PrintTree - Display a subset of the source tree
+#
+# Parameters:
+# $aPrefix - The string to prefix all paths
+# $aDepth - The number of levels of the tree to show. 0 = all levels
+#
+# Returns: None
+sub _PrintTree($$$)
+        {
+	my $self = shift;
+	
+        my ($aPrefix, $aTree, $aDepth) = @_;
+
+	my $prefix = "";
+	
+	if ($aPrefix ne "")
+		{
+		$prefix = $aPrefix."\\";
+		}
+
+        foreach my $key (sort(keys(%$aTree)))
+                {
+                if (ref($aTree->{$key}))
+                        {
+			if ($aDepth!=1)
+				{
+				my $newprefix = $prefix.$key;
+				
+				if ($key eq "")
+					{
+					$newprefix.="{empty}";
+					}
+
+                        	$self->_PrintTree($newprefix, $aTree->{$key}, $aDepth-1);
+				}
+			else
+				{
+				print $prefix.$key."\\...\n";
+				}
+                        }
+                else
+                        {
+                        print $prefix.$key." = ".$aTree->{$key}."\n";
+                        }
+                }
+        }
+
+1;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/group/distillsrc.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,24 @@
+#
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description: 
+#
+# Tools for generating Symbian production builds
+
+component dev_build_srctools_distillsrc
+
+source	\src\tools\build\srctools\distillsrc
+
+notes_source  \src\tools\build\srctools\distillsrc\release.src
+
+ipr T 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/readmrp.pm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,267 @@
+#! /bin/perl
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# readmrp - API to parse mrp files (but do no further processing)
+# 
+#
+
+package ReadMrp;
+
+sub New($)
+	{
+	my $proto = shift;
+	my $class = ref($proto) || $proto;
+	my $self = {};
+	bless $self, $class;
+
+	my ($fileName) = @_;
+	$self->{filename} = $fileName;
+	$self->Read();
+
+	return $self;
+	}
+
+sub Read()
+	{
+	my $self = shift;
+	my $fileName = $self->{filename};
+
+	die "ERROR: MRP file '$fileName' does not exist\n" unless (-e $fileName);
+
+	my $srcitems = [];
+	my $binexpitems = [];
+	my $component;
+	my $notes;
+
+	open MRP, "$fileName" or die "ERROR: Couldn't open '$fileName' for reading: $!\n";
+	
+	while (my $line = <MRP>)
+		{
+		chomp $line;
+
+		$line =~ s/(?<!\\)#.*$//;  # remove comments
+		$line =~ s/^\s+//;
+		next if (!$line); # blank lines
+
+		my @operands;
+
+		my $string = $line;
+		while ($string)
+		{
+			if ($string =~ s/^\"(.*?)\"// # Match and remove next quoted string
+			or $string =~ s/^(.*?)\s+//   # or, match and remove next (but not last) unquoted string
+		 	or $string =~ s/^(.*)\s*$//)  # or, match and remove last unquoted string.
+			{
+				push (@operands, $1);
+				$string =~ s/^\s+//; # Remove delimiter if present.
+			}
+		}
+
+		my $keyword = shift @operands;
+
+		my $minus = ($keyword =~ s/^-//);
+
+		if ($keyword eq "component")
+			{
+			die "-component is not a valid command in file '$fileName'\n" if $minus;
+			$component = shift @operands;
+			}
+		elsif ($keyword eq "notes_source")
+			{
+			die "-notes_source is not a valid command in file '$fileName'\n" if $minus;
+			$notes = shift @operands
+			# N.B. This may require source mapping, so we don't check for existence here
+			}
+		elsif ($keyword eq "source")
+			{
+			die "-source is not supported by this parser yet in file '$fileName'\n" if $minus;
+			my $srcItem = join ' ', @operands;
+			push @$srcitems, $srcItem;
+			}
+		elsif ($keyword eq "binary")
+			{
+			if (scalar @operands == 1)
+				{
+				push @$binexpitems, shift @operands;
+				}
+			else
+				{
+				# This release doesn't handle bld.inf binary lines; no parsing here
+				}
+			}
+		elsif ($keyword eq "testbinary")
+			{
+			if (scalar @operands == 1)
+				{
+				push @$binexpitems, shift @operands;
+				}
+			else
+				{
+				# This release doesn't handle bld.inf binary lines; no parsing here
+				}
+			}
+		elsif ($keyword eq "exports")
+			{
+			# This release doesn't handle bld.inf exports lines; no parsing here
+			}
+		elsif ($keyword eq "testexports")
+			{
+			# This release doesn't handle bld.inf exports lines; no parsing here
+			}
+		elsif ($keyword eq "export_file")
+			{
+			push @$binexpitems, $operands[1];
+			}
+		elsif ($keyword eq "ipr")
+			{
+			# This release doesn't handle ipr lines; no parsing here
+			}
+		else
+			{
+			die "ERROR: In file '$fileName', command not understood in line: $line\n";
+			}
+		}
+	die "ERROR: Component not specified in file '$fileName'\n" unless defined($component);
+	die "ERROR: Notes_source not specified in file '$fileName'\n" unless defined($notes);
+	$self->{srcitems} = $srcitems;
+	$self->{component} = $component;
+	$self->{binexpitems} = $binexpitems;
+	$self->{notes} = $notes;
+	}
+
+sub GetComponent()
+	{
+	my $self = shift;
+	return $self->{component};
+	}
+
+sub GetSrcItems()
+	{
+	my $self = shift;
+	return $self->{srcitems};
+	}
+
+sub GetBinExpItems()
+	{
+	my $self = shift;
+	return $self->{binexpitems};
+	}
+
+sub GetNotes()
+	{
+	my $self = shift;
+	return $self->{notes};
+	}
+
+sub _SplitOnSpaces($)
+	{
+	my $self = shift;
+	my ($operands) = (@_);
+	
+	# Break down operands
+	my @operands = ();
+	my $operand = "";
+	my $first;
+	while ($operands =~ /\S/)
+		{
+		$operands =~ /^(\s*\S+)(\s+.*)?$/ or die "Semantic error (broken regexp)";
+
+		($first, $operands) = ($1, $2);
+		$operand .= $first;
+
+		$operand =~ s/^\s*//; # Remove preceding whitespace
+
+		if (substr($operand,0,1) ne '"')
+			{
+			# Not quoted
+			push @operands, $operand;
+			$operand = "";
+			}
+		else
+			{
+			# Quoted
+			if (substr($operand,scalar($operand-1),1) eq '"')
+				{
+				# Complete quoted operand
+				$operand = substr ($operand, 1, scalar($operand-1));
+				push @operands, $operand;
+				$operand = "";
+				}
+			# Else leave the operand to have the next word added
+			}
+		}
+
+	if ($operand ne "")
+		{
+		die "ERROR: Missing end quote from '$operand'\n";
+		}
+	
+	return @operands;	
+	}
+1;
+
+__END__
+
+=pod
+
+=head1 NAME
+
+readmrp - Simple parser for MRP fils
+
+=head1 SYNOPSIS
+
+ use readmrp;
+
+ my $mrpFile = '\someFolder\anMrpFile.mrp';
+
+ # Create an instance of a readmrp object
+ my $mrp = new readmrp($mrpFile);
+
+ # Get data out
+ my $name = $mrp->GetComponent();
+ my @srcitems = @{$mrp->GetSrcItems()};
+ my @binexpitems = @{$mrp->GetBinExpItems()};
+ my $notessrc = $mrp->GetNotes();
+
+=head1 DESCRIPTION
+
+This module is used to parse MRP files and to store the basic data.  It does not do any further processing of the data, and so it deliberately does not depend on the referenced files being present.  It records source statements, as well as simple binary statements and the target of export_file statements.  It ignores exports and complex binary statements, which refer to a group directory and would require further processing to determine their targets.
+
+=head1 METHODS
+
+=head2 New (mrpFile)
+
+Constructor.  Takes an MRP filename, and immediately parses it.  Dies if there is a syntax error in the MRP file.
+
+=head2 GetComponent ()
+
+Returns the parsed component name.
+
+=head2 GetSrcItems ()
+
+Returns an array ref of the source paths of the 'source' statements in the MRP file.
+
+=head2 GetBinExpItems ()
+
+Returns an array ref of the target paths of the simple 'binary' and 'export_file' statements in the MRP file.  It does not distringuish between binary files and exports.
+
+=head2 GetNotes ()
+
+Returns the path of the 'notes_source' file.
+
+=head1 COPYRIGHT
+
+Copyright (c) 2004-2007 Symbian Software Ltd. All Rights Reserved.
+
+=cut
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/release.src	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,21 @@
+NOTESRC_RELEASER
+Productisation (kits.notify@symbian.com)
+
+NOTESRC_RELEASE_REASON
+New release based on build %build identifier%
+
+NOTESRC_GENERAL_COMMENTS
+Built automatically from an release build, not via an OCK or CustKit.
+See Appendix_to_Release_Notes.rtf for details on prohibited export or use.
+
+NOTESRC_KNOWN_DEVIATIONS
+See General Comments above.
+
+NOTESRC_BUGS_FIXED
+See General Comments above.
+
+NOTESRC_BUGS_REMAINING
+See General Comments above.
+
+NOTESRC_OTHER_CHANGES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/base.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+comPlete	sOurce/complete\complete.mrp
+    whole   source\\\\\\\whOLe/whole.mrp
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/bincase.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+component	binCase
+binary	\epoc32\thisonesfine
+binary  \epoc32\thisOneIsnt
+binary  \epoc32\andNorIs/thisone
+export_file \prefix\source\bincase\bincase.mrp \epoc32\thisonesokay
+export_file \prefix\source\bincase\bincase.mrp \epoc32\thisonesNot
+export_file \prefix\source\bincase\bincase.mrp \epoc32\norThis\one
+notes_source dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/duffer.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+component duffer
+
+source duffer.mrp
+
+-notes_source can't do this
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/naughty.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,3 @@
+component naughty
+source nothing_important
+notes_source relnotes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/options.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+GT+Techview baseline component name:gt_techview_baseline
+GT+Techview baseline mrp location:\Source\miSSinG\miSsINg.mRp
+GT only baseline component name:gt_only_baseline
+GT only baseline mrp location:sourcE\spAcey\spaCEY.mrP
+
+Techview component list:BAse.TxT
+
+Components to export:[\sf\os\unref\orphan\comgen\application-protocols\http\group, \sf\os\unref\orphan\comgen\syslibs\charconv\version1\group, \sf\app\messaging\messagingappbase\smilparser\group, \sf\mw\messagingmw\messagingfw\msgtests\mms\group, \sf\os\unref\orphan\comgen\syncml\group]
+Components to make:[\sf\os\unref\orphan\comgen\syslibs\charconv\version1\group, \sf\mw\messagingmw\messagingfw\msgtests\GMXML\group, \sf\mw\messagingmw\messagingfw\msgtests\mms\group, \sf\os\unref\orphan\comtv\messagingUi\group, \sf\app\java\midpprofile\midpmidlet\j2me\group\8.1]
+Platforms to make:[arm4, winscw, tools, armv5]
+
+GT conflicts mrp location:\sf\os\buildtools\packaging\additionalutils\GT_overwritten.mrp
+GT conflicts component name:GT_overwritten
+Conflicting files log:\product\cedar\generated\logs\techview_dups.log
+
+Release notes template location:\sf\os\buildtools\toolsandutils\productionbldtools\makecbr\files\release.src
+Release notes location:\component_defs\release.src
+Reltools.ini location:\sf\os\deviceplatformrelease\symbianosbld\productionbldcbrconfig\8.1b\Reltools.ini
+Spare drive letter:C*
+Techview directory:\CBRTV
+GT directory:\CBRGT
+Source directories:[\src\]
+Release archive: 8.1bDaily
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/complete/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/complete/complete.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,8 @@
+component	complete
+source	\prefix\source\complete
+binary	\prefix/source\complete all
+exports	/prefix\source\complete
+export_file	\epoc32\include\complete	\prefix/source\complete\complete
+source	\prefix\source\shared\complete
+source	\PREFIX\source\shared\DISTRIBUTION.POLICY
+notes_source	dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/complete/file	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/fixer.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+component	fixer
+source	fixer.mrp
+source	/prefix/soUrce/DIStribuTION.poliCY
+source	\prefix\soUrce\missing\unowned
+notes_source	dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/missing/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/missing/file	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+dummy
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/missing/missing.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,6 @@
+component	missing
+source	\preFIX\source\missing\file
+source	DISTRIBUTION.POLICY
+source	/prefix\source\missing\missing.mrp
+source	\prefix\source\shared\missing
+notes_source	dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/missing/unowned	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/shared/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/shared/complete	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/shared/missing	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/spacey/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/spacey/spa cey.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+Dum my
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/spacey/spacey.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,5 @@
+component spacey
+source \source//spacey\\spacey.mrp
+source \source//spacey\\DISTRIBUTION.POLICY
+source \source\spacey\spa cey.txt
+notes_source	dummy     
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/whole/DISTRIBUTION.POLICY	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,2 @@
+Category T
+OSD:	Reference/Test	Tools
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/whole/file	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1 @@
+dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/source/whole/whole.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+component	whole
+source	\\prefix//source\whole
+binary	/prefix/source\whole	all
+notes_source dummy
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/distillsrc/test/test.pl	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,226 @@
+#!\bin\perl -w
+# 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 "Eclipse Public License v1.0"
+# which accompanies this distribution, and is available
+# at the URL "http://www.eclipse.org/legal/epl-v10.html".
+#
+# Initial Contributors:
+# Nokia Corporation - initial contribution.
+#
+# Contributors:
+#
+# Description:
+# distillsrc.pl test script
+# 
+#
+
+use FindBin;
+use Cwd ('chdir','abs_path');
+
+my $cwd = abs_path($FindBin::Bin."\\..");
+chdir($cwd) or die "Couldn't change directory to $cwd\n";
+
+# Test cases
+#
+# Entry format: [parameters, [[pass regexps],[fail regexps]]]
+# 
+# [pass regexps] and [fail regexps] are lists of regular expressions, each
+# as a string. All pass regexps must match. No fail regexps may match.
+# If a line matches both, it is said to have passed (hence a generic failure
+# rule can be written to match any output which wasn't expected)
+my @testcases =
+	(
+	['-r fred -l beech' ,
+		[
+			['^ERROR: RealTimeBuild:.*srcpath must be given'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-s fred -l beech' ,
+		[
+			['^ERROR: RealTimeBuild:.*srcroot must be given'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-r fred -s src' ,
+		[
+			['^ERROR: RealTimeBuild:.*platform'],
+			['^ERROR: RealTimeBuild:']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -c test\options.txt -N' ,
+		[
+			[
+			'= spacey$',
+			'= whole$',
+			'^DUMMY: File test\\\\source\\\\fixer.mrp',
+			'^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY',
+			'^DUMMY: File test\\\\source\\\\missing\\\\unowned'
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -c test\options.txt -m test\source\fixer.mrp' ,
+		[
+			[
+			'= spacey$',
+			'= whole$',
+			'= fixer$',
+			'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\DIStribuTION.poliCY. does not match.* Should be test\\\\source\\\\DISTRIBUTION.POLICY$',
+			'WARNING: \[fixer\] Case of .test\\\\soUrce\\\\missing.* does not match.* Should be test\\\\source\\\\missing',
+			'source\\\\spacey\\\\spa cey.txt = spacey$',
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -f test\base.txt' ,
+		[
+			[
+			'= whole$',
+			'^DUMMY: File test\\\\source\\\\fixer\\.mrp',
+			'^DUMMY: File test\\\\source\\\\DISTRIBUTION\\.POLICY',
+			'^DUMMY: Directory test\\\\source\\\\missing',
+			'^DUMMY: File test\\\\source\\\\shared\\\\missing',
+			'^DUMMY: Directory test\\\\source\\\\spacey'
+			],
+			[
+			'^DUMMY:.*is not specified in any \\.mrp file',
+			'does not include itself'
+			]
+		]
+	],
+	['-d -r test -s nowt -l fred -m test\naughty.mrp' ,
+		[
+			[
+			'nothing_important.* doesn\'t exist',
+			'No \.mrp files claim any source',
+			'naughty\.mrp.*does not include itself'
+			],
+			['^DUMMY:.*is not specified in any \\.mrp file']
+		]
+	],
+	['-r test -s source -l fred -m test\not_present.mrp' ,
+		[
+			['^ERROR: RealTimeBuild:.*not_present\\.mrp.*does not exist'],
+			[]
+		]
+	],
+	['-r test -s source -l fred -m test\duffer.mrp',
+		[
+			['^ERROR: RealTimeBuild:.*not a valid command.*test\\\\duffer\\.mrp'],
+			['= duffer$']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -f test\base.txt',
+		[
+			[
+			'^WARNING:.*Case of \'.*complete.mrp\' does not match.* Should be.*source.*$',
+			'^WARNING:.*Case of \'.*whole.mrp\' does not match.* Should be.*whole.whole.*$',
+			],
+			['^WARNING:.*Case of .* does not match.* Should be.*$']
+		]
+	],
+	['-d -r test -s source -p prefix -l fred -m test\bincase.mrp',
+		[
+			[
+			'^REMARK:.*\\\\epoc32\\\\thisOneIsnt should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\andNorIs\/thisone should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\thisonesNot should be lower case',
+			'^REMARK:.*\\\\epoc32\\\\norThis\\\\one should be lower case'
+			],
+			['^REMARK:.*should be lower case.*$']
+		]
+	]
+	);
+
+my $passes = 0;
+my $tests = 0;
+
+foreach my $testcase (@testcases)
+	{
+	my $cmd = "distillsrc.pl ".$testcase->[0];
+	print "\nRunning $cmd\n";
+	my @output = `perl $cmd 2>&1`;
+	my @passregexps = @{$testcase->[1]->[0]};
+	my @failregexps = @{$testcase->[1]->[1]};
+
+	my $testpass = -1; # (unset)
+
+	foreach my $line (@output)
+		{
+		chomp ($line);
+		my $pass = 0;
+		my $fail = 0;
+		
+		foreach my $passregexp (@passregexps)
+			{
+			if ($line =~ /$passregexp/)
+				{
+				$pass = 1;
+
+				# Remove rule from list
+				@passregexps = grep($_ ne $passregexp, @passregexps);
+				}
+			}
+
+		if (!$pass)
+			{
+			foreach my $failregexp (@failregexps)
+				{
+				if ($line =~ /$failregexp/)
+					{
+					$fail = 1;
+					}
+				}
+			}
+
+		if ($pass)
+			{
+			print "GOOD:$line\n";
+			if ($testpass == -1)
+				{
+				$testpass = 1; # Passed (so far)
+				}
+			}
+		elsif ($fail)
+			{
+			print "BAD:$line\n";
+			$testpass = 0; # Failed
+			}
+		else { print "OKEH:$line\n"; }
+		}
+	
+	if ($testpass == 1)
+		{
+		if ((scalar @passregexps) == 0)
+			{
+			print "*** PASS\n";
+			$passes ++;
+			}
+		else
+			{
+			print "*** FAIL - tests not matched:\n> ";
+			print join("\n> ", @passregexps)."\n";
+			}
+		}
+	elsif ($testpass == 0)
+		{
+		print "*** FAIL - hard fail\n";
+		}
+	else
+		{
+		print "*** FAIL - no tests matched\n";
+		}
+
+	$tests ++;
+	}
+
+print "*** Out of $tests tests, $passes passed\n";
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/UnicodeData-5.0.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,17720 @@
+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;CHARACTER TABULATION;;;;
+000A;<control>;Cc;0;B;;;;;N;LINE FEED (LF);;;;
+000B;<control>;Cc;0;S;;;;;N;LINE TABULATION;;;;
+000C;<control>;Cc;0;WS;;;;;N;FORM FEED (FF);;;;
+000D;<control>;Cc;0;B;;;;;N;CARRIAGE RETURN (CR);;;;
+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;INFORMATION SEPARATOR FOUR;;;;
+001D;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR THREE;;;;
+001E;<control>;Cc;0;B;;;;;N;INFORMATION SEPARATOR TWO;;;;
+001F;<control>;Cc;0;S;;;;;N;INFORMATION SEPARATOR ONE;;;;
+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;ES;;;;;N;;;;;
+002C;COMMA;Po;0;CS;;;;;N;;;;;
+002D;HYPHEN-MINUS;Pd;0;ES;;;;;N;;;;;
+002E;FULL STOP;Po;0;CS;;;;;N;PERIOD;;;;
+002F;SOLIDUS;Po;0;CS;;;;;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 (NEL);;;;
+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 FORWARD;;;;
+008C;<control>;Cc;0;BN;;;;;N;PARTIAL LINE BACKWARD;;;;
+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;Cf;0;BN;;;;;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;N;SUPERSCRIPT DIGIT TWO;;;;
+00B3;SUPERSCRIPT THREE;No;0;EN;<super> 0033;;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;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;;0243;;0243
+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;;023D;;023D
+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;;;0220;;0220
+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;01C5
+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;01C8
+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;01CB
+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;01F2
+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
+0220;LATIN CAPITAL LETTER N WITH LONG RIGHT LEG;Lu;0;L;;;;;N;;;;019E;
+0221;LATIN SMALL LETTER D WITH CURL;Ll;0;L;;;;;N;;;;;
+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
+0234;LATIN SMALL LETTER L WITH CURL;Ll;0;L;;;;;N;;;;;
+0235;LATIN SMALL LETTER N WITH CURL;Ll;0;L;;;;;N;;;;;
+0236;LATIN SMALL LETTER T WITH CURL;Ll;0;L;;;;;N;;;;;
+0237;LATIN SMALL LETTER DOTLESS J;Ll;0;L;;;;;N;;;;;
+0238;LATIN SMALL LETTER DB DIGRAPH;Ll;0;L;;;;;N;;;;;
+0239;LATIN SMALL LETTER QP DIGRAPH;Ll;0;L;;;;;N;;;;;
+023A;LATIN CAPITAL LETTER A WITH STROKE;Lu;0;L;;;;;N;;;;2C65;
+023B;LATIN CAPITAL LETTER C WITH STROKE;Lu;0;L;;;;;N;;;;023C;
+023C;LATIN SMALL LETTER C WITH STROKE;Ll;0;L;;;;;N;;;023B;;023B
+023D;LATIN CAPITAL LETTER L WITH BAR;Lu;0;L;;;;;N;;;;019A;
+023E;LATIN CAPITAL LETTER T WITH DIAGONAL STROKE;Lu;0;L;;;;;N;;;;2C66;
+023F;LATIN SMALL LETTER S WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0240;LATIN SMALL LETTER Z WITH SWASH TAIL;Ll;0;L;;;;;N;;;;;
+0241;LATIN CAPITAL LETTER GLOTTAL STOP;Lu;0;L;;;;;N;;;;0242;
+0242;LATIN SMALL LETTER GLOTTAL STOP;Ll;0;L;;;;;N;;;0241;;0241
+0243;LATIN CAPITAL LETTER B WITH STROKE;Lu;0;L;;;;;N;;;;0180;
+0244;LATIN CAPITAL LETTER U BAR;Lu;0;L;;;;;N;;;;0289;
+0245;LATIN CAPITAL LETTER TURNED V;Lu;0;L;;;;;N;;;;028C;
+0246;LATIN CAPITAL LETTER E WITH STROKE;Lu;0;L;;;;;N;;;;0247;
+0247;LATIN SMALL LETTER E WITH STROKE;Ll;0;L;;;;;N;;;0246;;0246
+0248;LATIN CAPITAL LETTER J WITH STROKE;Lu;0;L;;;;;N;;;;0249;
+0249;LATIN SMALL LETTER J WITH STROKE;Ll;0;L;;;;;N;;;0248;;0248
+024A;LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL;Lu;0;L;;;;;N;;;;024B;
+024B;LATIN SMALL LETTER Q WITH HOOK TAIL;Ll;0;L;;;;;N;;;024A;;024A
+024C;LATIN CAPITAL LETTER R WITH STROKE;Lu;0;L;;;;;N;;;;024D;
+024D;LATIN SMALL LETTER R WITH STROKE;Ll;0;L;;;;;N;;;024C;;024C
+024E;LATIN CAPITAL LETTER Y WITH STROKE;Lu;0;L;;;;;N;;;;024F;
+024F;LATIN SMALL LETTER Y WITH STROKE;Ll;0;L;;;;;N;;;024E;;024E
+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;;;2C62;;2C62
+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;;2C64;;2C64
+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;;;0244;;0244
+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;;;0245;;0245
+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;Lo;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;;;;;
+02AE;LATIN SMALL LETTER TURNED H WITH FISHHOOK;Ll;0;L;;;;;N;;;;;
+02AF;LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL;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;Lm;0;ON;;;;;N;;;;;
+02BA;MODIFIER LETTER DOUBLE PRIME;Lm;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;Lm;0;ON;;;;;N;MODIFIER LETTER CIRCUMFLEX;;;;
+02C7;CARON;Lm;0;ON;;;;;N;MODIFIER LETTER HACEK;Mandarin Chinese third tone;;;
+02C8;MODIFIER LETTER VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02C9;MODIFIER LETTER MACRON;Lm;0;ON;;;;;N;;Mandarin Chinese first tone;;;
+02CA;MODIFIER LETTER ACUTE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER ACUTE;Mandarin Chinese second tone;;;
+02CB;MODIFIER LETTER GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER GRAVE;Mandarin Chinese fourth tone;;;
+02CC;MODIFIER LETTER LOW VERTICAL LINE;Lm;0;ON;;;;;N;;;;;
+02CD;MODIFIER LETTER LOW MACRON;Lm;0;ON;;;;;N;;;;;
+02CE;MODIFIER LETTER LOW GRAVE ACCENT;Lm;0;ON;;;;;N;MODIFIER LETTER LOW GRAVE;;;;
+02CF;MODIFIER LETTER LOW ACUTE ACCENT;Lm;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;;;;;
+02EF;MODIFIER LETTER LOW DOWN ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F0;MODIFIER LETTER LOW UP ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F1;MODIFIER LETTER LOW LEFT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F2;MODIFIER LETTER LOW RIGHT ARROWHEAD;Sk;0;ON;;;;;N;;;;;
+02F3;MODIFIER LETTER LOW RING;Sk;0;ON;;;;;N;;;;;
+02F4;MODIFIER LETTER MIDDLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F5;MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F6;MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT;Sk;0;ON;;;;;N;;;;;
+02F7;MODIFIER LETTER LOW TILDE;Sk;0;ON;;;;;N;;;;;
+02F8;MODIFIER LETTER RAISED COLON;Sk;0;ON;;;;;N;;;;;
+02F9;MODIFIER LETTER BEGIN HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FA;MODIFIER LETTER END HIGH TONE;Sk;0;ON;;;;;N;;;;;
+02FB;MODIFIER LETTER BEGIN LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FC;MODIFIER LETTER END LOW TONE;Sk;0;ON;;;;;N;;;;;
+02FD;MODIFIER LETTER SHELF;Sk;0;ON;;;;;N;;;;;
+02FE;MODIFIER LETTER OPEN SHELF;Sk;0;ON;;;;;N;;;;;
+02FF;MODIFIER LETTER LOW LEFT ARROW;Sk;0;ON;;;;;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, Tonos;;;
+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;;;;
+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;;;;;
+034F;COMBINING GRAPHEME JOINER;Mn;0;NSM;;;;;N;;;;;
+0350;COMBINING RIGHT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+0351;COMBINING LEFT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0352;COMBINING FERMATA;Mn;230;NSM;;;;;N;;;;;
+0353;COMBINING X BELOW;Mn;220;NSM;;;;;N;;;;;
+0354;COMBINING LEFT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0355;COMBINING RIGHT ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0356;COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW;Mn;220;NSM;;;;;N;;;;;
+0357;COMBINING RIGHT HALF RING ABOVE;Mn;230;NSM;;;;;N;;;;;
+0358;COMBINING DOT ABOVE RIGHT;Mn;232;NSM;;;;;N;;;;;
+0359;COMBINING ASTERISK BELOW;Mn;220;NSM;;;;;N;;;;;
+035A;COMBINING DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+035B;COMBINING ZIGZAG ABOVE;Mn;230;NSM;;;;;N;;;;;
+035C;COMBINING DOUBLE BREVE BELOW;Mn;233;NSM;;;;;N;;;;;
+035D;COMBINING DOUBLE BREVE;Mn;234;NSM;;;;;N;;;;;
+035E;COMBINING DOUBLE MACRON;Mn;234;NSM;;;;;N;;;;;
+035F;COMBINING DOUBLE MACRON BELOW;Mn;233;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;;;;;
+0363;COMBINING LATIN SMALL LETTER A;Mn;230;NSM;;;;;N;;;;;
+0364;COMBINING LATIN SMALL LETTER E;Mn;230;NSM;;;;;N;;;;;
+0365;COMBINING LATIN SMALL LETTER I;Mn;230;NSM;;;;;N;;;;;
+0366;COMBINING LATIN SMALL LETTER O;Mn;230;NSM;;;;;N;;;;;
+0367;COMBINING LATIN SMALL LETTER U;Mn;230;NSM;;;;;N;;;;;
+0368;COMBINING LATIN SMALL LETTER C;Mn;230;NSM;;;;;N;;;;;
+0369;COMBINING LATIN SMALL LETTER D;Mn;230;NSM;;;;;N;;;;;
+036A;COMBINING LATIN SMALL LETTER H;Mn;230;NSM;;;;;N;;;;;
+036B;COMBINING LATIN SMALL LETTER M;Mn;230;NSM;;;;;N;;;;;
+036C;COMBINING LATIN SMALL LETTER R;Mn;230;NSM;;;;;N;;;;;
+036D;COMBINING LATIN SMALL LETTER T;Mn;230;NSM;;;;;N;;;;;
+036E;COMBINING LATIN SMALL LETTER V;Mn;230;NSM;;;;;N;;;;;
+036F;COMBINING LATIN SMALL LETTER X;Mn;230;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;;;;
+037B;GREEK SMALL REVERSED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FD;;03FD
+037C;GREEK SMALL DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FE;;03FE
+037D;GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL;Ll;0;L;;;;;N;;;03FF;;03FF
+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;;;;;
+03D8;GREEK LETTER ARCHAIC KOPPA;Lu;0;L;;;;;N;;*;;03D9;
+03D9;GREEK SMALL LETTER ARCHAIC KOPPA;Ll;0;L;;;;;N;;*;03D8;;03D8
+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;;03F9;;03F9
+03F3;GREEK LETTER YOT;Ll;0;L;;;;;N;;;;;
+03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;
+03F5;GREEK LUNATE EPSILON SYMBOL;Ll;0;L;<compat> 03B5;;;;N;;;0395;;0395
+03F6;GREEK REVERSED LUNATE EPSILON SYMBOL;Sm;0;ON;;;;;N;;;;;
+03F7;GREEK CAPITAL LETTER SHO;Lu;0;L;;;;;N;;;;03F8;
+03F8;GREEK SMALL LETTER SHO;Ll;0;L;;;;;N;;;03F7;;03F7
+03F9;GREEK CAPITAL LUNATE SIGMA SYMBOL;Lu;0;L;<compat> 03A3;;;;N;;;;03F2;
+03FA;GREEK CAPITAL LETTER SAN;Lu;0;L;;;;;N;;;;03FB;
+03FB;GREEK SMALL LETTER SAN;Ll;0;L;;;;;N;;;03FA;;03FA
+03FC;GREEK RHO WITH STROKE SYMBOL;Ll;0;L;;;;;N;;;;;
+03FD;GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037B;
+03FE;GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037C;
+03FF;GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL;Lu;0;L;;;;;N;;;;037D;
+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;;;;;
+048A;CYRILLIC CAPITAL LETTER SHORT I WITH TAIL;Lu;0;L;;;;;N;;;;048B;
+048B;CYRILLIC SMALL LETTER SHORT I WITH TAIL;Ll;0;L;;;;;N;;;048A;;048A
+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;;;04CF;
+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
+04C5;CYRILLIC CAPITAL LETTER EL WITH TAIL;Lu;0;L;;;;;N;;;;04C6;
+04C6;CYRILLIC SMALL LETTER EL WITH TAIL;Ll;0;L;;;;;N;;;04C5;;04C5
+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
+04C9;CYRILLIC CAPITAL LETTER EN WITH TAIL;Lu;0;L;;;;;N;;;;04CA;
+04CA;CYRILLIC SMALL LETTER EN WITH TAIL;Ll;0;L;;;;;N;;;04C9;;04C9
+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
+04CD;CYRILLIC CAPITAL LETTER EM WITH TAIL;Lu;0;L;;;;;N;;;;04CE;
+04CE;CYRILLIC SMALL LETTER EM WITH TAIL;Ll;0;L;;;;;N;;;04CD;;04CD
+04CF;CYRILLIC SMALL LETTER PALOCHKA;Ll;0;L;;;;;N;;;04C0;;04C0
+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
+04F6;CYRILLIC CAPITAL LETTER GHE WITH DESCENDER;Lu;0;L;;;;;N;;;;04F7;
+04F7;CYRILLIC SMALL LETTER GHE WITH DESCENDER;Ll;0;L;;;;;N;;;04F6;;04F6
+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
+04FA;CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK;Lu;0;L;;;;;N;;;;04FB;
+04FB;CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK;Ll;0;L;;;;;N;;;04FA;;04FA
+04FC;CYRILLIC CAPITAL LETTER HA WITH HOOK;Lu;0;L;;;;;N;;;;04FD;
+04FD;CYRILLIC SMALL LETTER HA WITH HOOK;Ll;0;L;;;;;N;;;04FC;;04FC
+04FE;CYRILLIC CAPITAL LETTER HA WITH STROKE;Lu;0;L;;;;;N;;;;04FF;
+04FF;CYRILLIC SMALL LETTER HA WITH STROKE;Ll;0;L;;;;;N;;;04FE;;04FE
+0500;CYRILLIC CAPITAL LETTER KOMI DE;Lu;0;L;;;;;N;;;;0501;
+0501;CYRILLIC SMALL LETTER KOMI DE;Ll;0;L;;;;;N;;;0500;;0500
+0502;CYRILLIC CAPITAL LETTER KOMI DJE;Lu;0;L;;;;;N;;;;0503;
+0503;CYRILLIC SMALL LETTER KOMI DJE;Ll;0;L;;;;;N;;;0502;;0502
+0504;CYRILLIC CAPITAL LETTER KOMI ZJE;Lu;0;L;;;;;N;;;;0505;
+0505;CYRILLIC SMALL LETTER KOMI ZJE;Ll;0;L;;;;;N;;;0504;;0504
+0506;CYRILLIC CAPITAL LETTER KOMI DZJE;Lu;0;L;;;;;N;;;;0507;
+0507;CYRILLIC SMALL LETTER KOMI DZJE;Ll;0;L;;;;;N;;;0506;;0506
+0508;CYRILLIC CAPITAL LETTER KOMI LJE;Lu;0;L;;;;;N;;;;0509;
+0509;CYRILLIC SMALL LETTER KOMI LJE;Ll;0;L;;;;;N;;;0508;;0508
+050A;CYRILLIC CAPITAL LETTER KOMI NJE;Lu;0;L;;;;;N;;;;050B;
+050B;CYRILLIC SMALL LETTER KOMI NJE;Ll;0;L;;;;;N;;;050A;;050A
+050C;CYRILLIC CAPITAL LETTER KOMI SJE;Lu;0;L;;;;;N;;;;050D;
+050D;CYRILLIC SMALL LETTER KOMI SJE;Ll;0;L;;;;;N;;;050C;;050C
+050E;CYRILLIC CAPITAL LETTER KOMI TJE;Lu;0;L;;;;;N;;;;050F;
+050F;CYRILLIC SMALL LETTER KOMI TJE;Ll;0;L;;;;;N;;;050E;;050E
+0510;CYRILLIC CAPITAL LETTER REVERSED ZE;Lu;0;L;;;;;N;;;;0511;
+0511;CYRILLIC SMALL LETTER REVERSED ZE;Ll;0;L;;;;;N;;;0510;;0510
+0512;CYRILLIC CAPITAL LETTER EL WITH HOOK;Lu;0;L;;;;;N;;;;0513;
+0513;CYRILLIC SMALL LETTER EL WITH HOOK;Ll;0;L;;;;;N;;;0512;;0512
+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;;;;;
+05A2;HEBREW ACCENT ATNAH HAFUKH;Mn;220;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;;;;;
+05BA;HEBREW POINT HOLAM HASER FOR VAV;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;;;;;
+05C5;HEBREW MARK LOWER DOT;Mn;220;NSM;;;;;N;;;;;
+05C6;HEBREW PUNCTUATION NUN HAFUKHA;Po;0;R;;;;;N;;;;;
+05C7;HEBREW POINT QAMATS QATAN;Mn;18;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;;;;;
+0600;ARABIC NUMBER SIGN;Cf;0;AL;;;;;N;;;;;
+0601;ARABIC SIGN SANAH;Cf;0;AL;;;;;N;;;;;
+0602;ARABIC FOOTNOTE MARKER;Cf;0;AL;;;;;N;;;;;
+0603;ARABIC SIGN SAFHA;Cf;0;AL;;;;;N;;;;;
+060B;AFGHANI SIGN;Sc;0;AL;;;;;N;;;;;
+060C;ARABIC COMMA;Po;0;CS;;;;;N;;;;;
+060D;ARABIC DATE SEPARATOR;Po;0;AL;;;;;N;;;;;
+060E;ARABIC POETIC VERSE SIGN;So;0;ON;;;;;N;;;;;
+060F;ARABIC SIGN MISRA;So;0;ON;;;;;N;;;;;
+0610;ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0611;ARABIC SIGN ALAYHE ASSALLAM;Mn;230;NSM;;;;;N;;;;;
+0612;ARABIC SIGN RAHMATULLAH ALAYHE;Mn;230;NSM;;;;;N;;;;;
+0613;ARABIC SIGN RADI ALLAHOU ANHU;Mn;230;NSM;;;;;N;;;;;
+0614;ARABIC SIGN TAKHALLUS;Mn;230;NSM;;;;;N;;;;;
+0615;ARABIC SMALL HIGH TAH;Mn;230;NSM;;;;;N;;;;;
+061B;ARABIC SEMICOLON;Po;0;AL;;;;;N;;;;;
+061E;ARABIC TRIPLE DOT PUNCTUATION MARK;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;;;;;
+0656;ARABIC SUBSCRIPT ALEF;Mn;220;NSM;;;;;N;;;;;
+0657;ARABIC INVERTED DAMMA;Mn;230;NSM;;;;;N;;;;;
+0658;ARABIC MARK NOON GHUNNA;Mn;230;NSM;;;;;N;;;;;
+0659;ARABIC ZWARAKAY;Mn;230;NSM;;;;;N;;;;;
+065A;ARABIC VOWEL SIGN SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065B;ARABIC VOWEL SIGN INVERTED SMALL V ABOVE;Mn;230;NSM;;;;;N;;;;;
+065C;ARABIC VOWEL SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+065D;ARABIC REVERSED DAMMA;Mn;230;NSM;;;;;N;;;;;
+065E;ARABIC FATHA WITH TWO DOTS;Mn;230;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;;;;;
+066E;ARABIC LETTER DOTLESS BEH;Lo;0;AL;;;;;N;;;;;
+066F;ARABIC LETTER DOTLESS QAF;Lo;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;Cf;0;AL;;;;;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;;;;;
+06EE;ARABIC LETTER DAL WITH INVERTED V;Lo;0;AL;;;;;N;;;;;
+06EF;ARABIC LETTER REH WITH INVERTED V;Lo;0;AL;;;;;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;;;;;
+06FF;ARABIC LETTER HEH WITH INVERTED V;Lo;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;;;;;
+072D;SYRIAC LETTER PERSIAN BHETH;Lo;0;AL;;;;;N;;;;;
+072E;SYRIAC LETTER PERSIAN GHAMAL;Lo;0;AL;;;;;N;;;;;
+072F;SYRIAC LETTER PERSIAN DHALATH;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;;;;;
+074D;SYRIAC LETTER SOGDIAN ZHAIN;Lo;0;AL;;;;;N;;;;;
+074E;SYRIAC LETTER SOGDIAN KHAPH;Lo;0;AL;;;;;N;;;;;
+074F;SYRIAC LETTER SOGDIAN FE;Lo;0;AL;;;;;N;;;;;
+0750;ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW;Lo;0;AL;;;;;N;;;;;
+0751;ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0752;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0753;ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0754;ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0755;ARABIC LETTER BEH WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+0756;ARABIC LETTER BEH WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+0757;ARABIC LETTER HAH WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0758;ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0759;ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH;Lo;0;AL;;;;;N;;;;;
+075A;ARABIC LETTER DAL WITH INVERTED SMALL V BELOW;Lo;0;AL;;;;;N;;;;;
+075B;ARABIC LETTER REH WITH STROKE;Lo;0;AL;;;;;N;;;;;
+075C;ARABIC LETTER SEEN WITH FOUR DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075D;ARABIC LETTER AIN WITH TWO DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+075E;ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE;Lo;0;AL;;;;;N;;;;;
+075F;ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+0760;ARABIC LETTER FEH WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0761;ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0762;ARABIC LETTER KEHEH WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0763;ARABIC LETTER KEHEH WITH THREE DOTS ABOVE;Lo;0;AL;;;;;N;;;;;
+0764;ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW;Lo;0;AL;;;;;N;;;;;
+0765;ARABIC LETTER MEEM WITH DOT ABOVE;Lo;0;AL;;;;;N;;;;;
+0766;ARABIC LETTER MEEM WITH DOT BELOW;Lo;0;AL;;;;;N;;;;;
+0767;ARABIC LETTER NOON WITH TWO DOTS BELOW;Lo;0;AL;;;;;N;;;;;
+0768;ARABIC LETTER NOON WITH SMALL TAH;Lo;0;AL;;;;;N;;;;;
+0769;ARABIC LETTER NOON WITH SMALL V;Lo;0;AL;;;;;N;;;;;
+076A;ARABIC LETTER LAM WITH BAR;Lo;0;AL;;;;;N;;;;;
+076B;ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;N;;;;;
+076C;ARABIC LETTER REH WITH HAMZA ABOVE;Lo;0;AL;;;;;N;;;;;
+076D;ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE;Lo;0;AL;;;;;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;;;;;
+07B1;THAANA LETTER NAA;Lo;0;AL;;;;;N;;;;;
+07C0;NKO DIGIT ZERO;Nd;0;R;;0;0;0;N;;;;;
+07C1;NKO DIGIT ONE;Nd;0;R;;1;1;1;N;;;;;
+07C2;NKO DIGIT TWO;Nd;0;R;;2;2;2;N;;;;;
+07C3;NKO DIGIT THREE;Nd;0;R;;3;3;3;N;;;;;
+07C4;NKO DIGIT FOUR;Nd;0;R;;4;4;4;N;;;;;
+07C5;NKO DIGIT FIVE;Nd;0;R;;5;5;5;N;;;;;
+07C6;NKO DIGIT SIX;Nd;0;R;;6;6;6;N;;;;;
+07C7;NKO DIGIT SEVEN;Nd;0;R;;7;7;7;N;;;;;
+07C8;NKO DIGIT EIGHT;Nd;0;R;;8;8;8;N;;;;;
+07C9;NKO DIGIT NINE;Nd;0;R;;9;9;9;N;;;;;
+07CA;NKO LETTER A;Lo;0;R;;;;;N;;;;;
+07CB;NKO LETTER EE;Lo;0;R;;;;;N;;;;;
+07CC;NKO LETTER I;Lo;0;R;;;;;N;;;;;
+07CD;NKO LETTER E;Lo;0;R;;;;;N;;;;;
+07CE;NKO LETTER U;Lo;0;R;;;;;N;;;;;
+07CF;NKO LETTER OO;Lo;0;R;;;;;N;;;;;
+07D0;NKO LETTER O;Lo;0;R;;;;;N;;;;;
+07D1;NKO LETTER DAGBASINNA;Lo;0;R;;;;;N;;;;;
+07D2;NKO LETTER N;Lo;0;R;;;;;N;;;;;
+07D3;NKO LETTER BA;Lo;0;R;;;;;N;;;;;
+07D4;NKO LETTER PA;Lo;0;R;;;;;N;;;;;
+07D5;NKO LETTER TA;Lo;0;R;;;;;N;;;;;
+07D6;NKO LETTER JA;Lo;0;R;;;;;N;;;;;
+07D7;NKO LETTER CHA;Lo;0;R;;;;;N;;;;;
+07D8;NKO LETTER DA;Lo;0;R;;;;;N;;;;;
+07D9;NKO LETTER RA;Lo;0;R;;;;;N;;;;;
+07DA;NKO LETTER RRA;Lo;0;R;;;;;N;;;;;
+07DB;NKO LETTER SA;Lo;0;R;;;;;N;;;;;
+07DC;NKO LETTER GBA;Lo;0;R;;;;;N;;;;;
+07DD;NKO LETTER FA;Lo;0;R;;;;;N;;;;;
+07DE;NKO LETTER KA;Lo;0;R;;;;;N;;;;;
+07DF;NKO LETTER LA;Lo;0;R;;;;;N;;;;;
+07E0;NKO LETTER NA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E1;NKO LETTER MA;Lo;0;R;;;;;N;;;;;
+07E2;NKO LETTER NYA;Lo;0;R;;;;;N;;;;;
+07E3;NKO LETTER NA;Lo;0;R;;;;;N;;;;;
+07E4;NKO LETTER HA;Lo;0;R;;;;;N;;;;;
+07E5;NKO LETTER WA;Lo;0;R;;;;;N;;;;;
+07E6;NKO LETTER YA;Lo;0;R;;;;;N;;;;;
+07E7;NKO LETTER NYA WOLOSO;Lo;0;R;;;;;N;;;;;
+07E8;NKO LETTER JONA JA;Lo;0;R;;;;;N;;;;;
+07E9;NKO LETTER JONA CHA;Lo;0;R;;;;;N;;;;;
+07EA;NKO LETTER JONA RA;Lo;0;R;;;;;N;;;;;
+07EB;NKO COMBINING SHORT HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07EC;NKO COMBINING SHORT LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07ED;NKO COMBINING SHORT RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07EE;NKO COMBINING LONG DESCENDING TONE;Mn;230;NSM;;;;;N;;;;;
+07EF;NKO COMBINING LONG HIGH TONE;Mn;230;NSM;;;;;N;;;;;
+07F0;NKO COMBINING LONG LOW TONE;Mn;230;NSM;;;;;N;;;;;
+07F1;NKO COMBINING LONG RISING TONE;Mn;230;NSM;;;;;N;;;;;
+07F2;NKO COMBINING NASALIZATION MARK;Mn;220;NSM;;;;;N;;;;;
+07F3;NKO COMBINING DOUBLE DOT ABOVE;Mn;230;NSM;;;;;N;;;;;
+07F4;NKO HIGH TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F5;NKO LOW TONE APOSTROPHE;Lm;0;R;;;;;N;;;;;
+07F6;NKO SYMBOL OO DENNEN;So;0;ON;;;;;N;;;;;
+07F7;NKO SYMBOL GBAKURUNEN;Po;0;ON;;;;;N;;;;;
+07F8;NKO COMMA;Po;0;ON;;;;;N;;;;;
+07F9;NKO EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+07FA;NKO LAJANYALAN;Lm;0;R;;;;;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;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;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;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;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;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;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;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;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;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;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;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;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;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;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;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;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;;;;;
+0B35;ORIYA LETTER VA;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;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;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;;;;;
+0BB6;TAMIL LETTER SHA;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;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;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;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+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;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;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;L;;;;;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;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;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;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;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;;;;;Y;;gug ta yun;;;
+0F3B;TIBETAN MARK GUG RTAGS GYAS;Pe;0;ON;;;;;Y;;gug ta ye;;;
+0F3C;TIBETAN MARK ANG KHANG GYON;Ps;0;ON;;;;;Y;TIBETAN LEFT BRACE;ang kang yun;;;
+0F3D;TIBETAN MARK ANG KHANG GYAS;Pe;0;ON;;;;;Y;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;;;
+0FD0;TIBETAN MARK BSKA- SHOG GI MGO RGYAN;Po;0;L;;;;;N;;ka shog gi go gyen;;;
+0FD1;TIBETAN MARK MNYAM YIG GI MGO RGYAN;Po;0;L;;;;;N;;nyam yig gi go gyen;;;
+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;;2D00;
+10A1;GEORGIAN CAPITAL LETTER BAN;Lu;0;L;;;;;N;;Khutsuri;;2D01;
+10A2;GEORGIAN CAPITAL LETTER GAN;Lu;0;L;;;;;N;;Khutsuri;;2D02;
+10A3;GEORGIAN CAPITAL LETTER DON;Lu;0;L;;;;;N;;Khutsuri;;2D03;
+10A4;GEORGIAN CAPITAL LETTER EN;Lu;0;L;;;;;N;;Khutsuri;;2D04;
+10A5;GEORGIAN CAPITAL LETTER VIN;Lu;0;L;;;;;N;;Khutsuri;;2D05;
+10A6;GEORGIAN CAPITAL LETTER ZEN;Lu;0;L;;;;;N;;Khutsuri;;2D06;
+10A7;GEORGIAN CAPITAL LETTER TAN;Lu;0;L;;;;;N;;Khutsuri;;2D07;
+10A8;GEORGIAN CAPITAL LETTER IN;Lu;0;L;;;;;N;;Khutsuri;;2D08;
+10A9;GEORGIAN CAPITAL LETTER KAN;Lu;0;L;;;;;N;;Khutsuri;;2D09;
+10AA;GEORGIAN CAPITAL LETTER LAS;Lu;0;L;;;;;N;;Khutsuri;;2D0A;
+10AB;GEORGIAN CAPITAL LETTER MAN;Lu;0;L;;;;;N;;Khutsuri;;2D0B;
+10AC;GEORGIAN CAPITAL LETTER NAR;Lu;0;L;;;;;N;;Khutsuri;;2D0C;
+10AD;GEORGIAN CAPITAL LETTER ON;Lu;0;L;;;;;N;;Khutsuri;;2D0D;
+10AE;GEORGIAN CAPITAL LETTER PAR;Lu;0;L;;;;;N;;Khutsuri;;2D0E;
+10AF;GEORGIAN CAPITAL LETTER ZHAR;Lu;0;L;;;;;N;;Khutsuri;;2D0F;
+10B0;GEORGIAN CAPITAL LETTER RAE;Lu;0;L;;;;;N;;Khutsuri;;2D10;
+10B1;GEORGIAN CAPITAL LETTER SAN;Lu;0;L;;;;;N;;Khutsuri;;2D11;
+10B2;GEORGIAN CAPITAL LETTER TAR;Lu;0;L;;;;;N;;Khutsuri;;2D12;
+10B3;GEORGIAN CAPITAL LETTER UN;Lu;0;L;;;;;N;;Khutsuri;;2D13;
+10B4;GEORGIAN CAPITAL LETTER PHAR;Lu;0;L;;;;;N;;Khutsuri;;2D14;
+10B5;GEORGIAN CAPITAL LETTER KHAR;Lu;0;L;;;;;N;;Khutsuri;;2D15;
+10B6;GEORGIAN CAPITAL LETTER GHAN;Lu;0;L;;;;;N;;Khutsuri;;2D16;
+10B7;GEORGIAN CAPITAL LETTER QAR;Lu;0;L;;;;;N;;Khutsuri;;2D17;
+10B8;GEORGIAN CAPITAL LETTER SHIN;Lu;0;L;;;;;N;;Khutsuri;;2D18;
+10B9;GEORGIAN CAPITAL LETTER CHIN;Lu;0;L;;;;;N;;Khutsuri;;2D19;
+10BA;GEORGIAN CAPITAL LETTER CAN;Lu;0;L;;;;;N;;Khutsuri;;2D1A;
+10BB;GEORGIAN CAPITAL LETTER JIL;Lu;0;L;;;;;N;;Khutsuri;;2D1B;
+10BC;GEORGIAN CAPITAL LETTER CIL;Lu;0;L;;;;;N;;Khutsuri;;2D1C;
+10BD;GEORGIAN CAPITAL LETTER CHAR;Lu;0;L;;;;;N;;Khutsuri;;2D1D;
+10BE;GEORGIAN CAPITAL LETTER XAN;Lu;0;L;;;;;N;;Khutsuri;;2D1E;
+10BF;GEORGIAN CAPITAL LETTER JHAN;Lu;0;L;;;;;N;;Khutsuri;;2D1F;
+10C0;GEORGIAN CAPITAL LETTER HAE;Lu;0;L;;;;;N;;Khutsuri;;2D20;
+10C1;GEORGIAN CAPITAL LETTER HE;Lu;0;L;;;;;N;;Khutsuri;;2D21;
+10C2;GEORGIAN CAPITAL LETTER HIE;Lu;0;L;;;;;N;;Khutsuri;;2D22;
+10C3;GEORGIAN CAPITAL LETTER WE;Lu;0;L;;;;;N;;Khutsuri;;2D23;
+10C4;GEORGIAN CAPITAL LETTER HAR;Lu;0;L;;;;;N;;Khutsuri;;2D24;
+10C5;GEORGIAN CAPITAL LETTER HOE;Lu;0;L;;;;;N;;Khutsuri;;2D25;
+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;;;;
+10F7;GEORGIAN LETTER YN;Lo;0;L;;;;;N;;;;;
+10F8;GEORGIAN LETTER ELIFI;Lo;0;L;;;;;N;;;;;
+10F9;GEORGIAN LETTER TURNED GAN;Lo;0;L;;;;;N;;;;;
+10FA;GEORGIAN LETTER AIN;Lo;0;L;;;;;N;;;;;
+10FB;GEORGIAN PARAGRAPH SEPARATOR;Po;0;L;;;;;N;;;;;
+10FC;MODIFIER LETTER GEORGIAN NAR;Lm;0;L;<super> 10DC;;;;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;;;;;
+1207;ETHIOPIC SYLLABLE HOA;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;;;;;
+1247;ETHIOPIC SYLLABLE QOA;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;;;;;
+1287;ETHIOPIC SYLLABLE XOA;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;;;;;
+12AF;ETHIOPIC SYLLABLE KOA;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;;;;;
+12CF;ETHIOPIC SYLLABLE WOA;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;;;;;
+12EF;ETHIOPIC SYLLABLE YOA;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;;;;;
+130F;ETHIOPIC SYLLABLE GOA;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;;;;;
+131F;ETHIOPIC SYLLABLE GGWAA;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;;;;;
+1347;ETHIOPIC SYLLABLE TZOA;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;;;;;
+135F;ETHIOPIC COMBINING GEMINATION MARK;Mn;230;NSM;;;;;N;;;;;
+1360;ETHIOPIC SECTION MARK;So;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;No;0;L;;;1;1;N;;;;;
+136A;ETHIOPIC DIGIT TWO;No;0;L;;;2;2;N;;;;;
+136B;ETHIOPIC DIGIT THREE;No;0;L;;;3;3;N;;;;;
+136C;ETHIOPIC DIGIT FOUR;No;0;L;;;4;4;N;;;;;
+136D;ETHIOPIC DIGIT FIVE;No;0;L;;;5;5;N;;;;;
+136E;ETHIOPIC DIGIT SIX;No;0;L;;;6;6;N;;;;;
+136F;ETHIOPIC DIGIT SEVEN;No;0;L;;;7;7;N;;;;;
+1370;ETHIOPIC DIGIT EIGHT;No;0;L;;;8;8;N;;;;;
+1371;ETHIOPIC DIGIT NINE;No;0;L;;;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;;;;;
+1380;ETHIOPIC SYLLABLE SEBATBEIT MWA;Lo;0;L;;;;;N;;;;;
+1381;ETHIOPIC SYLLABLE MWI;Lo;0;L;;;;;N;;;;;
+1382;ETHIOPIC SYLLABLE MWEE;Lo;0;L;;;;;N;;;;;
+1383;ETHIOPIC SYLLABLE MWE;Lo;0;L;;;;;N;;;;;
+1384;ETHIOPIC SYLLABLE SEBATBEIT BWA;Lo;0;L;;;;;N;;;;;
+1385;ETHIOPIC SYLLABLE BWI;Lo;0;L;;;;;N;;;;;
+1386;ETHIOPIC SYLLABLE BWEE;Lo;0;L;;;;;N;;;;;
+1387;ETHIOPIC SYLLABLE BWE;Lo;0;L;;;;;N;;;;;
+1388;ETHIOPIC SYLLABLE SEBATBEIT FWA;Lo;0;L;;;;;N;;;;;
+1389;ETHIOPIC SYLLABLE FWI;Lo;0;L;;;;;N;;;;;
+138A;ETHIOPIC SYLLABLE FWEE;Lo;0;L;;;;;N;;;;;
+138B;ETHIOPIC SYLLABLE FWE;Lo;0;L;;;;;N;;;;;
+138C;ETHIOPIC SYLLABLE SEBATBEIT PWA;Lo;0;L;;;;;N;;;;;
+138D;ETHIOPIC SYLLABLE PWI;Lo;0;L;;;;;N;;;;;
+138E;ETHIOPIC SYLLABLE PWEE;Lo;0;L;;;;;N;;;;;
+138F;ETHIOPIC SYLLABLE PWE;Lo;0;L;;;;;N;;;;;
+1390;ETHIOPIC TONAL MARK YIZET;So;0;ON;;;;;N;;;;;
+1391;ETHIOPIC TONAL MARK DERET;So;0;ON;;;;;N;;;;;
+1392;ETHIOPIC TONAL MARK RIKRIK;So;0;ON;;;;;N;;;;;
+1393;ETHIOPIC TONAL MARK SHORT RIKRIK;So;0;ON;;;;;N;;;;;
+1394;ETHIOPIC TONAL MARK DIFAT;So;0;ON;;;;;N;;;;;
+1395;ETHIOPIC TONAL MARK KENAT;So;0;ON;;;;;N;;;;;
+1396;ETHIOPIC TONAL MARK CHIRET;So;0;ON;;;;;N;;;;;
+1397;ETHIOPIC TONAL MARK HIDET;So;0;ON;;;;;N;;;;;
+1398;ETHIOPIC TONAL MARK DERET-HIDET;So;0;ON;;;;;N;;;;;
+1399;ETHIOPIC TONAL MARK KURT;So;0;ON;;;;;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;;;;;Y;;;;;
+169C;OGHAM REVERSED FEATHER MARK;Pe;0;ON;;;;;Y;;;;;
+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;Nl;0;L;;;;17;N;;golden number 17;;;
+16EF;RUNIC TVIMADUR SYMBOL;Nl;0;L;;;;18;N;;golden number 18;;;
+16F0;RUNIC BELGTHOR SYMBOL;Nl;0;L;;;;19;N;;golden number 19;;;
+1700;TAGALOG LETTER A;Lo;0;L;;;;;N;;;;;
+1701;TAGALOG LETTER I;Lo;0;L;;;;;N;;;;;
+1702;TAGALOG LETTER U;Lo;0;L;;;;;N;;;;;
+1703;TAGALOG LETTER KA;Lo;0;L;;;;;N;;;;;
+1704;TAGALOG LETTER GA;Lo;0;L;;;;;N;;;;;
+1705;TAGALOG LETTER NGA;Lo;0;L;;;;;N;;;;;
+1706;TAGALOG LETTER TA;Lo;0;L;;;;;N;;;;;
+1707;TAGALOG LETTER DA;Lo;0;L;;;;;N;;;;;
+1708;TAGALOG LETTER NA;Lo;0;L;;;;;N;;;;;
+1709;TAGALOG LETTER PA;Lo;0;L;;;;;N;;;;;
+170A;TAGALOG LETTER BA;Lo;0;L;;;;;N;;;;;
+170B;TAGALOG LETTER MA;Lo;0;L;;;;;N;;;;;
+170C;TAGALOG LETTER YA;Lo;0;L;;;;;N;;;;;
+170E;TAGALOG LETTER LA;Lo;0;L;;;;;N;;;;;
+170F;TAGALOG LETTER WA;Lo;0;L;;;;;N;;;;;
+1710;TAGALOG LETTER SA;Lo;0;L;;;;;N;;;;;
+1711;TAGALOG LETTER HA;Lo;0;L;;;;;N;;;;;
+1712;TAGALOG VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1713;TAGALOG VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1714;TAGALOG SIGN VIRAMA;Mn;9;NSM;;;;;N;;;;;
+1720;HANUNOO LETTER A;Lo;0;L;;;;;N;;;;;
+1721;HANUNOO LETTER I;Lo;0;L;;;;;N;;;;;
+1722;HANUNOO LETTER U;Lo;0;L;;;;;N;;;;;
+1723;HANUNOO LETTER KA;Lo;0;L;;;;;N;;;;;
+1724;HANUNOO LETTER GA;Lo;0;L;;;;;N;;;;;
+1725;HANUNOO LETTER NGA;Lo;0;L;;;;;N;;;;;
+1726;HANUNOO LETTER TA;Lo;0;L;;;;;N;;;;;
+1727;HANUNOO LETTER DA;Lo;0;L;;;;;N;;;;;
+1728;HANUNOO LETTER NA;Lo;0;L;;;;;N;;;;;
+1729;HANUNOO LETTER PA;Lo;0;L;;;;;N;;;;;
+172A;HANUNOO LETTER BA;Lo;0;L;;;;;N;;;;;
+172B;HANUNOO LETTER MA;Lo;0;L;;;;;N;;;;;
+172C;HANUNOO LETTER YA;Lo;0;L;;;;;N;;;;;
+172D;HANUNOO LETTER RA;Lo;0;L;;;;;N;;;;;
+172E;HANUNOO LETTER LA;Lo;0;L;;;;;N;;;;;
+172F;HANUNOO LETTER WA;Lo;0;L;;;;;N;;;;;
+1730;HANUNOO LETTER SA;Lo;0;L;;;;;N;;;;;
+1731;HANUNOO LETTER HA;Lo;0;L;;;;;N;;;;;
+1732;HANUNOO VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1733;HANUNOO VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1734;HANUNOO SIGN PAMUDPOD;Mn;9;NSM;;;;;N;;;;;
+1735;PHILIPPINE SINGLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1736;PHILIPPINE DOUBLE PUNCTUATION;Po;0;L;;;;;N;;;;;
+1740;BUHID LETTER A;Lo;0;L;;;;;N;;;;;
+1741;BUHID LETTER I;Lo;0;L;;;;;N;;;;;
+1742;BUHID LETTER U;Lo;0;L;;;;;N;;;;;
+1743;BUHID LETTER KA;Lo;0;L;;;;;N;;;;;
+1744;BUHID LETTER GA;Lo;0;L;;;;;N;;;;;
+1745;BUHID LETTER NGA;Lo;0;L;;;;;N;;;;;
+1746;BUHID LETTER TA;Lo;0;L;;;;;N;;;;;
+1747;BUHID LETTER DA;Lo;0;L;;;;;N;;;;;
+1748;BUHID LETTER NA;Lo;0;L;;;;;N;;;;;
+1749;BUHID LETTER PA;Lo;0;L;;;;;N;;;;;
+174A;BUHID LETTER BA;Lo;0;L;;;;;N;;;;;
+174B;BUHID LETTER MA;Lo;0;L;;;;;N;;;;;
+174C;BUHID LETTER YA;Lo;0;L;;;;;N;;;;;
+174D;BUHID LETTER RA;Lo;0;L;;;;;N;;;;;
+174E;BUHID LETTER LA;Lo;0;L;;;;;N;;;;;
+174F;BUHID LETTER WA;Lo;0;L;;;;;N;;;;;
+1750;BUHID LETTER SA;Lo;0;L;;;;;N;;;;;
+1751;BUHID LETTER HA;Lo;0;L;;;;;N;;;;;
+1752;BUHID VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1753;BUHID VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1760;TAGBANWA LETTER A;Lo;0;L;;;;;N;;;;;
+1761;TAGBANWA LETTER I;Lo;0;L;;;;;N;;;;;
+1762;TAGBANWA LETTER U;Lo;0;L;;;;;N;;;;;
+1763;TAGBANWA LETTER KA;Lo;0;L;;;;;N;;;;;
+1764;TAGBANWA LETTER GA;Lo;0;L;;;;;N;;;;;
+1765;TAGBANWA LETTER NGA;Lo;0;L;;;;;N;;;;;
+1766;TAGBANWA LETTER TA;Lo;0;L;;;;;N;;;;;
+1767;TAGBANWA LETTER DA;Lo;0;L;;;;;N;;;;;
+1768;TAGBANWA LETTER NA;Lo;0;L;;;;;N;;;;;
+1769;TAGBANWA LETTER PA;Lo;0;L;;;;;N;;;;;
+176A;TAGBANWA LETTER BA;Lo;0;L;;;;;N;;;;;
+176B;TAGBANWA LETTER MA;Lo;0;L;;;;;N;;;;;
+176C;TAGBANWA LETTER YA;Lo;0;L;;;;;N;;;;;
+176E;TAGBANWA LETTER LA;Lo;0;L;;;;;N;;;;;
+176F;TAGBANWA LETTER WA;Lo;0;L;;;;;N;;;;;
+1770;TAGBANWA LETTER SA;Lo;0;L;;;;;N;;;;;
+1772;TAGBANWA VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1773;TAGBANWA VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+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;Cf;0;L;;;;;N;;*;;;
+17B5;KHMER VOWEL INHERENT AA;Cf;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;Lm;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;Lo;0;L;;;;;N;;;;;
+17DD;KHMER SIGN ATTHACAN;Mn;230;NSM;;;;;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;;;;;
+17F0;KHMER SYMBOL LEK ATTAK SON;No;0;ON;;;;0;N;;;;;
+17F1;KHMER SYMBOL LEK ATTAK MUOY;No;0;ON;;;;1;N;;;;;
+17F2;KHMER SYMBOL LEK ATTAK PII;No;0;ON;;;;2;N;;;;;
+17F3;KHMER SYMBOL LEK ATTAK BEI;No;0;ON;;;;3;N;;;;;
+17F4;KHMER SYMBOL LEK ATTAK BUON;No;0;ON;;;;4;N;;;;;
+17F5;KHMER SYMBOL LEK ATTAK PRAM;No;0;ON;;;;5;N;;;;;
+17F6;KHMER SYMBOL LEK ATTAK PRAM-MUOY;No;0;ON;;;;6;N;;;;;
+17F7;KHMER SYMBOL LEK ATTAK PRAM-PII;No;0;ON;;;;7;N;;;;;
+17F8;KHMER SYMBOL LEK ATTAK PRAM-BEI;No;0;ON;;;;8;N;;;;;
+17F9;KHMER SYMBOL LEK ATTAK PRAM-BUON;No;0;ON;;;;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;Mn;0;NSM;;;;;N;;;;;
+180C;MONGOLIAN FREE VARIATION SELECTOR TWO;Mn;0;NSM;;;;;N;;;;;
+180D;MONGOLIAN FREE VARIATION SELECTOR THREE;Mn;0;NSM;;;;;N;;;;;
+180E;MONGOLIAN VOWEL SEPARATOR;Zs;0;WS;;;;;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;;;;;
+1900;LIMBU VOWEL-CARRIER LETTER;Lo;0;L;;;;;N;;;;;
+1901;LIMBU LETTER KA;Lo;0;L;;;;;N;;;;;
+1902;LIMBU LETTER KHA;Lo;0;L;;;;;N;;;;;
+1903;LIMBU LETTER GA;Lo;0;L;;;;;N;;;;;
+1904;LIMBU LETTER GHA;Lo;0;L;;;;;N;;;;;
+1905;LIMBU LETTER NGA;Lo;0;L;;;;;N;;;;;
+1906;LIMBU LETTER CA;Lo;0;L;;;;;N;;;;;
+1907;LIMBU LETTER CHA;Lo;0;L;;;;;N;;;;;
+1908;LIMBU LETTER JA;Lo;0;L;;;;;N;;;;;
+1909;LIMBU LETTER JHA;Lo;0;L;;;;;N;;;;;
+190A;LIMBU LETTER YAN;Lo;0;L;;;;;N;;;;;
+190B;LIMBU LETTER TA;Lo;0;L;;;;;N;;;;;
+190C;LIMBU LETTER THA;Lo;0;L;;;;;N;;;;;
+190D;LIMBU LETTER DA;Lo;0;L;;;;;N;;;;;
+190E;LIMBU LETTER DHA;Lo;0;L;;;;;N;;;;;
+190F;LIMBU LETTER NA;Lo;0;L;;;;;N;;;;;
+1910;LIMBU LETTER PA;Lo;0;L;;;;;N;;;;;
+1911;LIMBU LETTER PHA;Lo;0;L;;;;;N;;;;;
+1912;LIMBU LETTER BA;Lo;0;L;;;;;N;;;;;
+1913;LIMBU LETTER BHA;Lo;0;L;;;;;N;;;;;
+1914;LIMBU LETTER MA;Lo;0;L;;;;;N;;;;;
+1915;LIMBU LETTER YA;Lo;0;L;;;;;N;;;;;
+1916;LIMBU LETTER RA;Lo;0;L;;;;;N;;;;;
+1917;LIMBU LETTER LA;Lo;0;L;;;;;N;;;;;
+1918;LIMBU LETTER WA;Lo;0;L;;;;;N;;;;;
+1919;LIMBU LETTER SHA;Lo;0;L;;;;;N;;;;;
+191A;LIMBU LETTER SSA;Lo;0;L;;;;;N;;;;;
+191B;LIMBU LETTER SA;Lo;0;L;;;;;N;;;;;
+191C;LIMBU LETTER HA;Lo;0;L;;;;;N;;;;;
+1920;LIMBU VOWEL SIGN A;Mn;0;NSM;;;;;N;;;;;
+1921;LIMBU VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+1922;LIMBU VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+1923;LIMBU VOWEL SIGN EE;Mc;0;L;;;;;N;;;;;
+1924;LIMBU VOWEL SIGN AI;Mc;0;L;;;;;N;;;;;
+1925;LIMBU VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+1926;LIMBU VOWEL SIGN AU;Mc;0;L;;;;;N;;;;;
+1927;LIMBU VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+1928;LIMBU VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+1929;LIMBU SUBJOINED LETTER YA;Mc;0;NSM;;;;;N;;;;;
+192A;LIMBU SUBJOINED LETTER RA;Mc;0;NSM;;;;;N;;;;;
+192B;LIMBU SUBJOINED LETTER WA;Mc;0;NSM;;;;;N;;;;;
+1930;LIMBU SMALL LETTER KA;Mc;0;L;;;;;N;;;;;
+1931;LIMBU SMALL LETTER NGA;Mc;0;L;;;;;N;;;;;
+1932;LIMBU SMALL LETTER ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+1933;LIMBU SMALL LETTER TA;Mc;0;L;;;;;N;;;;;
+1934;LIMBU SMALL LETTER NA;Mc;0;L;;;;;N;;;;;
+1935;LIMBU SMALL LETTER PA;Mc;0;L;;;;;N;;;;;
+1936;LIMBU SMALL LETTER MA;Mc;0;L;;;;;N;;;;;
+1937;LIMBU SMALL LETTER RA;Mc;0;L;;;;;N;;;;;
+1938;LIMBU SMALL LETTER LA;Mc;0;L;;;;;N;;;;;
+1939;LIMBU SIGN MUKPHRENG;Mn;222;NSM;;;;;N;;;;;
+193A;LIMBU SIGN KEMPHRENG;Mn;230;NSM;;;;;N;;;;;
+193B;LIMBU SIGN SA-I;Mn;220;NSM;;;;;N;;;;;
+1940;LIMBU SIGN LOO;So;0;ON;;;;;N;;;;;
+1944;LIMBU EXCLAMATION MARK;Po;0;ON;;;;;N;;;;;
+1945;LIMBU QUESTION MARK;Po;0;ON;;;;;N;;;;;
+1946;LIMBU DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1947;LIMBU DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1948;LIMBU DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1949;LIMBU DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+194A;LIMBU DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+194B;LIMBU DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+194C;LIMBU DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+194D;LIMBU DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+194E;LIMBU DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+194F;LIMBU DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1950;TAI LE LETTER KA;Lo;0;L;;;;;N;;;;;
+1951;TAI LE LETTER XA;Lo;0;L;;;;;N;;;;;
+1952;TAI LE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1953;TAI LE LETTER TSA;Lo;0;L;;;;;N;;;;;
+1954;TAI LE LETTER SA;Lo;0;L;;;;;N;;;;;
+1955;TAI LE LETTER YA;Lo;0;L;;;;;N;;;;;
+1956;TAI LE LETTER TA;Lo;0;L;;;;;N;;;;;
+1957;TAI LE LETTER THA;Lo;0;L;;;;;N;;;;;
+1958;TAI LE LETTER LA;Lo;0;L;;;;;N;;;;;
+1959;TAI LE LETTER PA;Lo;0;L;;;;;N;;;;;
+195A;TAI LE LETTER PHA;Lo;0;L;;;;;N;;;;;
+195B;TAI LE LETTER MA;Lo;0;L;;;;;N;;;;;
+195C;TAI LE LETTER FA;Lo;0;L;;;;;N;;;;;
+195D;TAI LE LETTER VA;Lo;0;L;;;;;N;;;;;
+195E;TAI LE LETTER HA;Lo;0;L;;;;;N;;;;;
+195F;TAI LE LETTER QA;Lo;0;L;;;;;N;;;;;
+1960;TAI LE LETTER KHA;Lo;0;L;;;;;N;;;;;
+1961;TAI LE LETTER TSHA;Lo;0;L;;;;;N;;;;;
+1962;TAI LE LETTER NA;Lo;0;L;;;;;N;;;;;
+1963;TAI LE LETTER A;Lo;0;L;;;;;N;;;;;
+1964;TAI LE LETTER I;Lo;0;L;;;;;N;;;;;
+1965;TAI LE LETTER EE;Lo;0;L;;;;;N;;;;;
+1966;TAI LE LETTER EH;Lo;0;L;;;;;N;;;;;
+1967;TAI LE LETTER U;Lo;0;L;;;;;N;;;;;
+1968;TAI LE LETTER OO;Lo;0;L;;;;;N;;;;;
+1969;TAI LE LETTER O;Lo;0;L;;;;;N;;;;;
+196A;TAI LE LETTER UE;Lo;0;L;;;;;N;;;;;
+196B;TAI LE LETTER E;Lo;0;L;;;;;N;;;;;
+196C;TAI LE LETTER AUE;Lo;0;L;;;;;N;;;;;
+196D;TAI LE LETTER AI;Lo;0;L;;;;;N;;;;;
+1970;TAI LE LETTER TONE-2;Lo;0;L;;;;;N;;;;;
+1971;TAI LE LETTER TONE-3;Lo;0;L;;;;;N;;;;;
+1972;TAI LE LETTER TONE-4;Lo;0;L;;;;;N;;;;;
+1973;TAI LE LETTER TONE-5;Lo;0;L;;;;;N;;;;;
+1974;TAI LE LETTER TONE-6;Lo;0;L;;;;;N;;;;;
+1980;NEW TAI LUE LETTER HIGH QA;Lo;0;L;;;;;N;;;;;
+1981;NEW TAI LUE LETTER LOW QA;Lo;0;L;;;;;N;;;;;
+1982;NEW TAI LUE LETTER HIGH KA;Lo;0;L;;;;;N;;;;;
+1983;NEW TAI LUE LETTER HIGH XA;Lo;0;L;;;;;N;;;;;
+1984;NEW TAI LUE LETTER HIGH NGA;Lo;0;L;;;;;N;;;;;
+1985;NEW TAI LUE LETTER LOW KA;Lo;0;L;;;;;N;;;;;
+1986;NEW TAI LUE LETTER LOW XA;Lo;0;L;;;;;N;;;;;
+1987;NEW TAI LUE LETTER LOW NGA;Lo;0;L;;;;;N;;;;;
+1988;NEW TAI LUE LETTER HIGH TSA;Lo;0;L;;;;;N;;;;;
+1989;NEW TAI LUE LETTER HIGH SA;Lo;0;L;;;;;N;;;;;
+198A;NEW TAI LUE LETTER HIGH YA;Lo;0;L;;;;;N;;;;;
+198B;NEW TAI LUE LETTER LOW TSA;Lo;0;L;;;;;N;;;;;
+198C;NEW TAI LUE LETTER LOW SA;Lo;0;L;;;;;N;;;;;
+198D;NEW TAI LUE LETTER LOW YA;Lo;0;L;;;;;N;;;;;
+198E;NEW TAI LUE LETTER HIGH TA;Lo;0;L;;;;;N;;;;;
+198F;NEW TAI LUE LETTER HIGH THA;Lo;0;L;;;;;N;;;;;
+1990;NEW TAI LUE LETTER HIGH NA;Lo;0;L;;;;;N;;;;;
+1991;NEW TAI LUE LETTER LOW TA;Lo;0;L;;;;;N;;;;;
+1992;NEW TAI LUE LETTER LOW THA;Lo;0;L;;;;;N;;;;;
+1993;NEW TAI LUE LETTER LOW NA;Lo;0;L;;;;;N;;;;;
+1994;NEW TAI LUE LETTER HIGH PA;Lo;0;L;;;;;N;;;;;
+1995;NEW TAI LUE LETTER HIGH PHA;Lo;0;L;;;;;N;;;;;
+1996;NEW TAI LUE LETTER HIGH MA;Lo;0;L;;;;;N;;;;;
+1997;NEW TAI LUE LETTER LOW PA;Lo;0;L;;;;;N;;;;;
+1998;NEW TAI LUE LETTER LOW PHA;Lo;0;L;;;;;N;;;;;
+1999;NEW TAI LUE LETTER LOW MA;Lo;0;L;;;;;N;;;;;
+199A;NEW TAI LUE LETTER HIGH FA;Lo;0;L;;;;;N;;;;;
+199B;NEW TAI LUE LETTER HIGH VA;Lo;0;L;;;;;N;;;;;
+199C;NEW TAI LUE LETTER HIGH LA;Lo;0;L;;;;;N;;;;;
+199D;NEW TAI LUE LETTER LOW FA;Lo;0;L;;;;;N;;;;;
+199E;NEW TAI LUE LETTER LOW VA;Lo;0;L;;;;;N;;;;;
+199F;NEW TAI LUE LETTER LOW LA;Lo;0;L;;;;;N;;;;;
+19A0;NEW TAI LUE LETTER HIGH HA;Lo;0;L;;;;;N;;;;;
+19A1;NEW TAI LUE LETTER HIGH DA;Lo;0;L;;;;;N;;;;;
+19A2;NEW TAI LUE LETTER HIGH BA;Lo;0;L;;;;;N;;;;;
+19A3;NEW TAI LUE LETTER LOW HA;Lo;0;L;;;;;N;;;;;
+19A4;NEW TAI LUE LETTER LOW DA;Lo;0;L;;;;;N;;;;;
+19A5;NEW TAI LUE LETTER LOW BA;Lo;0;L;;;;;N;;;;;
+19A6;NEW TAI LUE LETTER HIGH KVA;Lo;0;L;;;;;N;;;;;
+19A7;NEW TAI LUE LETTER HIGH XVA;Lo;0;L;;;;;N;;;;;
+19A8;NEW TAI LUE LETTER LOW KVA;Lo;0;L;;;;;N;;;;;
+19A9;NEW TAI LUE LETTER LOW XVA;Lo;0;L;;;;;N;;;;;
+19B0;NEW TAI LUE VOWEL SIGN VOWEL SHORTENER;Mc;0;L;;;;;N;;;;;
+19B1;NEW TAI LUE VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+19B2;NEW TAI LUE VOWEL SIGN II;Mc;0;L;;;;;N;;;;;
+19B3;NEW TAI LUE VOWEL SIGN U;Mc;0;L;;;;;N;;;;;
+19B4;NEW TAI LUE VOWEL SIGN UU;Mc;0;L;;;;;N;;;;;
+19B5;NEW TAI LUE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+19B6;NEW TAI LUE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+19B7;NEW TAI LUE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+19B8;NEW TAI LUE VOWEL SIGN OA;Mc;0;L;;;;;N;;;;;
+19B9;NEW TAI LUE VOWEL SIGN UE;Mc;0;L;;;;;N;;;;;
+19BA;NEW TAI LUE VOWEL SIGN AY;Mc;0;L;;;;;N;;;;;
+19BB;NEW TAI LUE VOWEL SIGN AAY;Mc;0;L;;;;;N;;;;;
+19BC;NEW TAI LUE VOWEL SIGN UY;Mc;0;L;;;;;N;;;;;
+19BD;NEW TAI LUE VOWEL SIGN OY;Mc;0;L;;;;;N;;;;;
+19BE;NEW TAI LUE VOWEL SIGN OAY;Mc;0;L;;;;;N;;;;;
+19BF;NEW TAI LUE VOWEL SIGN UEY;Mc;0;L;;;;;N;;;;;
+19C0;NEW TAI LUE VOWEL SIGN IY;Mc;0;L;;;;;N;;;;;
+19C1;NEW TAI LUE LETTER FINAL V;Lo;0;L;;;;;N;;;;;
+19C2;NEW TAI LUE LETTER FINAL NG;Lo;0;L;;;;;N;;;;;
+19C3;NEW TAI LUE LETTER FINAL N;Lo;0;L;;;;;N;;;;;
+19C4;NEW TAI LUE LETTER FINAL M;Lo;0;L;;;;;N;;;;;
+19C5;NEW TAI LUE LETTER FINAL K;Lo;0;L;;;;;N;;;;;
+19C6;NEW TAI LUE LETTER FINAL D;Lo;0;L;;;;;N;;;;;
+19C7;NEW TAI LUE LETTER FINAL B;Lo;0;L;;;;;N;;;;;
+19C8;NEW TAI LUE TONE MARK-1;Mc;0;L;;;;;N;;;;;
+19C9;NEW TAI LUE TONE MARK-2;Mc;0;L;;;;;N;;;;;
+19D0;NEW TAI LUE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+19D1;NEW TAI LUE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+19D2;NEW TAI LUE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+19D3;NEW TAI LUE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+19D4;NEW TAI LUE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+19D5;NEW TAI LUE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+19D6;NEW TAI LUE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+19D7;NEW TAI LUE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+19D8;NEW TAI LUE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+19D9;NEW TAI LUE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+19DE;NEW TAI LUE SIGN LAE;Po;0;ON;;;;;N;;;;;
+19DF;NEW TAI LUE SIGN LAEV;Po;0;ON;;;;;N;;;;;
+19E0;KHMER SYMBOL PATHAMASAT;So;0;ON;;;;;N;;;;;
+19E1;KHMER SYMBOL MUOY KOET;So;0;ON;;;;;N;;;;;
+19E2;KHMER SYMBOL PII KOET;So;0;ON;;;;;N;;;;;
+19E3;KHMER SYMBOL BEI KOET;So;0;ON;;;;;N;;;;;
+19E4;KHMER SYMBOL BUON KOET;So;0;ON;;;;;N;;;;;
+19E5;KHMER SYMBOL PRAM KOET;So;0;ON;;;;;N;;;;;
+19E6;KHMER SYMBOL PRAM-MUOY KOET;So;0;ON;;;;;N;;;;;
+19E7;KHMER SYMBOL PRAM-PII KOET;So;0;ON;;;;;N;;;;;
+19E8;KHMER SYMBOL PRAM-BEI KOET;So;0;ON;;;;;N;;;;;
+19E9;KHMER SYMBOL PRAM-BUON KOET;So;0;ON;;;;;N;;;;;
+19EA;KHMER SYMBOL DAP KOET;So;0;ON;;;;;N;;;;;
+19EB;KHMER SYMBOL DAP-MUOY KOET;So;0;ON;;;;;N;;;;;
+19EC;KHMER SYMBOL DAP-PII KOET;So;0;ON;;;;;N;;;;;
+19ED;KHMER SYMBOL DAP-BEI KOET;So;0;ON;;;;;N;;;;;
+19EE;KHMER SYMBOL DAP-BUON KOET;So;0;ON;;;;;N;;;;;
+19EF;KHMER SYMBOL DAP-PRAM KOET;So;0;ON;;;;;N;;;;;
+19F0;KHMER SYMBOL TUTEYASAT;So;0;ON;;;;;N;;;;;
+19F1;KHMER SYMBOL MUOY ROC;So;0;ON;;;;;N;;;;;
+19F2;KHMER SYMBOL PII ROC;So;0;ON;;;;;N;;;;;
+19F3;KHMER SYMBOL BEI ROC;So;0;ON;;;;;N;;;;;
+19F4;KHMER SYMBOL BUON ROC;So;0;ON;;;;;N;;;;;
+19F5;KHMER SYMBOL PRAM ROC;So;0;ON;;;;;N;;;;;
+19F6;KHMER SYMBOL PRAM-MUOY ROC;So;0;ON;;;;;N;;;;;
+19F7;KHMER SYMBOL PRAM-PII ROC;So;0;ON;;;;;N;;;;;
+19F8;KHMER SYMBOL PRAM-BEI ROC;So;0;ON;;;;;N;;;;;
+19F9;KHMER SYMBOL PRAM-BUON ROC;So;0;ON;;;;;N;;;;;
+19FA;KHMER SYMBOL DAP ROC;So;0;ON;;;;;N;;;;;
+19FB;KHMER SYMBOL DAP-MUOY ROC;So;0;ON;;;;;N;;;;;
+19FC;KHMER SYMBOL DAP-PII ROC;So;0;ON;;;;;N;;;;;
+19FD;KHMER SYMBOL DAP-BEI ROC;So;0;ON;;;;;N;;;;;
+19FE;KHMER SYMBOL DAP-BUON ROC;So;0;ON;;;;;N;;;;;
+19FF;KHMER SYMBOL DAP-PRAM ROC;So;0;ON;;;;;N;;;;;
+1A00;BUGINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1A01;BUGINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1A02;BUGINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1A03;BUGINESE LETTER NGKA;Lo;0;L;;;;;N;;;;;
+1A04;BUGINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1A05;BUGINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1A06;BUGINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1A07;BUGINESE LETTER MPA;Lo;0;L;;;;;N;;;;;
+1A08;BUGINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1A09;BUGINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1A0A;BUGINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1A0B;BUGINESE LETTER NRA;Lo;0;L;;;;;N;;;;;
+1A0C;BUGINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1A0D;BUGINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1A0E;BUGINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1A0F;BUGINESE LETTER NYCA;Lo;0;L;;;;;N;;;;;
+1A10;BUGINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1A11;BUGINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1A12;BUGINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1A13;BUGINESE LETTER VA;Lo;0;L;;;;;N;;;;;
+1A14;BUGINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1A15;BUGINESE LETTER A;Lo;0;L;;;;;N;;;;;
+1A16;BUGINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1A17;BUGINESE VOWEL SIGN I;Mn;230;NSM;;;;;N;;;;;
+1A18;BUGINESE VOWEL SIGN U;Mn;220;NSM;;;;;N;;;;;
+1A19;BUGINESE VOWEL SIGN E;Mc;0;L;;;;;N;;;;;
+1A1A;BUGINESE VOWEL SIGN O;Mc;0;L;;;;;N;;;;;
+1A1B;BUGINESE VOWEL SIGN AE;Mc;0;L;;;;;N;;;;;
+1A1E;BUGINESE PALLAWA;Po;0;L;;;;;N;;;;;
+1A1F;BUGINESE END OF SECTION;Po;0;L;;;;;N;;;;;
+1B00;BALINESE SIGN ULU RICEM;Mn;0;NSM;;;;;N;;ardhacandra;;;
+1B01;BALINESE SIGN ULU CANDRA;Mn;0;NSM;;;;;N;;candrabindu;;;
+1B02;BALINESE SIGN CECEK;Mn;0;NSM;;;;;N;;anusvara;;;
+1B03;BALINESE SIGN SURANG;Mn;0;NSM;;;;;N;;repha;;;
+1B04;BALINESE SIGN BISAH;Mc;0;L;;;;;N;;visarga;;;
+1B05;BALINESE LETTER AKARA;Lo;0;L;;;;;N;;a;;;
+1B06;BALINESE LETTER AKARA TEDUNG;Lo;0;L;1B05 1B35;;;;N;;aa;;;
+1B07;BALINESE LETTER IKARA;Lo;0;L;;;;;N;;i;;;
+1B08;BALINESE LETTER IKARA TEDUNG;Lo;0;L;1B07 1B35;;;;N;;ii;;;
+1B09;BALINESE LETTER UKARA;Lo;0;L;;;;;N;;u;;;
+1B0A;BALINESE LETTER UKARA TEDUNG;Lo;0;L;1B09 1B35;;;;N;;uu;;;
+1B0B;BALINESE LETTER RA REPA;Lo;0;L;;;;;N;;vocalic r;;;
+1B0C;BALINESE LETTER RA REPA TEDUNG;Lo;0;L;1B0B 1B35;;;;N;;vocalic rr;;;
+1B0D;BALINESE LETTER LA LENGA;Lo;0;L;;;;;N;;vocalic l;;;
+1B0E;BALINESE LETTER LA LENGA TEDUNG;Lo;0;L;1B0D 1B35;;;;N;;vocalic ll;;;
+1B0F;BALINESE LETTER EKARA;Lo;0;L;;;;;N;;e;;;
+1B10;BALINESE LETTER AIKARA;Lo;0;L;;;;;N;;ai;;;
+1B11;BALINESE LETTER OKARA;Lo;0;L;;;;;N;;o;;;
+1B12;BALINESE LETTER OKARA TEDUNG;Lo;0;L;1B11 1B35;;;;N;;au;;;
+1B13;BALINESE LETTER KA;Lo;0;L;;;;;N;;;;;
+1B14;BALINESE LETTER KA MAHAPRANA;Lo;0;L;;;;;N;;kha;;;
+1B15;BALINESE LETTER GA;Lo;0;L;;;;;N;;;;;
+1B16;BALINESE LETTER GA GORA;Lo;0;L;;;;;N;;gha;;;
+1B17;BALINESE LETTER NGA;Lo;0;L;;;;;N;;;;;
+1B18;BALINESE LETTER CA;Lo;0;L;;;;;N;;;;;
+1B19;BALINESE LETTER CA LACA;Lo;0;L;;;;;N;;cha;;;
+1B1A;BALINESE LETTER JA;Lo;0;L;;;;;N;;;;;
+1B1B;BALINESE LETTER JA JERA;Lo;0;L;;;;;N;;jha;;;
+1B1C;BALINESE LETTER NYA;Lo;0;L;;;;;N;;;;;
+1B1D;BALINESE LETTER TA LATIK;Lo;0;L;;;;;N;;tta;;;
+1B1E;BALINESE LETTER TA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ttha;;;
+1B1F;BALINESE LETTER DA MURDA ALPAPRANA;Lo;0;L;;;;;N;;dda;;;
+1B20;BALINESE LETTER DA MURDA MAHAPRANA;Lo;0;L;;;;;N;;ddha;;;
+1B21;BALINESE LETTER NA RAMBAT;Lo;0;L;;;;;N;;nna;;;
+1B22;BALINESE LETTER TA;Lo;0;L;;;;;N;;;;;
+1B23;BALINESE LETTER TA TAWA;Lo;0;L;;;;;N;;tha;;;
+1B24;BALINESE LETTER DA;Lo;0;L;;;;;N;;;;;
+1B25;BALINESE LETTER DA MADU;Lo;0;L;;;;;N;;dha;;;
+1B26;BALINESE LETTER NA;Lo;0;L;;;;;N;;;;;
+1B27;BALINESE LETTER PA;Lo;0;L;;;;;N;;;;;
+1B28;BALINESE LETTER PA KAPAL;Lo;0;L;;;;;N;;pha;;;
+1B29;BALINESE LETTER BA;Lo;0;L;;;;;N;;;;;
+1B2A;BALINESE LETTER BA KEMBANG;Lo;0;L;;;;;N;;bha;;;
+1B2B;BALINESE LETTER MA;Lo;0;L;;;;;N;;;;;
+1B2C;BALINESE LETTER YA;Lo;0;L;;;;;N;;;;;
+1B2D;BALINESE LETTER RA;Lo;0;L;;;;;N;;;;;
+1B2E;BALINESE LETTER LA;Lo;0;L;;;;;N;;;;;
+1B2F;BALINESE LETTER WA;Lo;0;L;;;;;N;;;;;
+1B30;BALINESE LETTER SA SAGA;Lo;0;L;;;;;N;;sha;;;
+1B31;BALINESE LETTER SA SAPA;Lo;0;L;;;;;N;;ssa;;;
+1B32;BALINESE LETTER SA;Lo;0;L;;;;;N;;;;;
+1B33;BALINESE LETTER HA;Lo;0;L;;;;;N;;;;;
+1B34;BALINESE SIGN REREKAN;Mn;7;NSM;;;;;N;;nukta;;;
+1B35;BALINESE VOWEL SIGN TEDUNG;Mc;0;L;;;;;N;;aa;;;
+1B36;BALINESE VOWEL SIGN ULU;Mn;0;NSM;;;;;N;;i;;;
+1B37;BALINESE VOWEL SIGN ULU SARI;Mn;0;NSM;;;;;N;;ii;;;
+1B38;BALINESE VOWEL SIGN SUKU;Mn;0;NSM;;;;;N;;u;;;
+1B39;BALINESE VOWEL SIGN SUKU ILUT;Mn;0;NSM;;;;;N;;uu;;;
+1B3A;BALINESE VOWEL SIGN RA REPA;Mn;0;NSM;;;;;N;;vocalic r;;;
+1B3B;BALINESE VOWEL SIGN RA REPA TEDUNG;Mc;0;L;1B3A 1B35;;;;N;;vocalic rr;;;
+1B3C;BALINESE VOWEL SIGN LA LENGA;Mn;0;NSM;;;;;N;;vocalic l;;;
+1B3D;BALINESE VOWEL SIGN LA LENGA TEDUNG;Mc;0;L;1B3C 1B35;;;;N;;vocalic ll;;;
+1B3E;BALINESE VOWEL SIGN TALING;Mc;0;L;;;;;N;;e;;;
+1B3F;BALINESE VOWEL SIGN TALING REPA;Mc;0;L;;;;;N;;ai;;;
+1B40;BALINESE VOWEL SIGN TALING TEDUNG;Mc;0;L;1B3E 1B35;;;;N;;o;;;
+1B41;BALINESE VOWEL SIGN TALING REPA TEDUNG;Mc;0;L;1B3F 1B35;;;;N;;au;;;
+1B42;BALINESE VOWEL SIGN PEPET;Mn;0;NSM;;;;;N;;ae;;;
+1B43;BALINESE VOWEL SIGN PEPET TEDUNG;Mc;0;L;1B42 1B35;;;;N;;oe;;;
+1B44;BALINESE ADEG ADEG;Mc;9;L;;;;;N;;virama;;;
+1B45;BALINESE LETTER KAF SASAK;Lo;0;L;;;;;N;;;;;
+1B46;BALINESE LETTER KHOT SASAK;Lo;0;L;;;;;N;;;;;
+1B47;BALINESE LETTER TZIR SASAK;Lo;0;L;;;;;N;;;;;
+1B48;BALINESE LETTER EF SASAK;Lo;0;L;;;;;N;;;;;
+1B49;BALINESE LETTER VE SASAK;Lo;0;L;;;;;N;;;;;
+1B4A;BALINESE LETTER ZAL SASAK;Lo;0;L;;;;;N;;;;;
+1B4B;BALINESE LETTER ASYURA SASAK;Lo;0;L;;;;;N;;;;;
+1B50;BALINESE DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+1B51;BALINESE DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+1B52;BALINESE DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+1B53;BALINESE DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+1B54;BALINESE DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+1B55;BALINESE DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+1B56;BALINESE DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+1B57;BALINESE DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+1B58;BALINESE DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+1B59;BALINESE DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+1B5A;BALINESE PANTI;Po;0;L;;;;;N;;section;;;
+1B5B;BALINESE PAMADA;Po;0;L;;;;;N;;honorific section;;;
+1B5C;BALINESE WINDU;Po;0;L;;;;;N;;punctuation ring;;;
+1B5D;BALINESE CARIK PAMUNGKAH;Po;0;L;;;;;N;;colon;;;
+1B5E;BALINESE CARIK SIKI;Po;0;L;;;;;N;;danda;;;
+1B5F;BALINESE CARIK PAREREN;Po;0;L;;;;;N;;double danda;;;
+1B60;BALINESE PAMENENG;Po;0;L;;;;;N;;line-breaking hyphen;;;
+1B61;BALINESE MUSICAL SYMBOL DONG;So;0;L;;;;;N;;;;;
+1B62;BALINESE MUSICAL SYMBOL DENG;So;0;L;;;;;N;;;;;
+1B63;BALINESE MUSICAL SYMBOL DUNG;So;0;L;;;;;N;;;;;
+1B64;BALINESE MUSICAL SYMBOL DANG;So;0;L;;;;;N;;;;;
+1B65;BALINESE MUSICAL SYMBOL DANG SURANG;So;0;L;;;;;N;;;;;
+1B66;BALINESE MUSICAL SYMBOL DING;So;0;L;;;;;N;;;;;
+1B67;BALINESE MUSICAL SYMBOL DAENG;So;0;L;;;;;N;;;;;
+1B68;BALINESE MUSICAL SYMBOL DEUNG;So;0;L;;;;;N;;;;;
+1B69;BALINESE MUSICAL SYMBOL DAING;So;0;L;;;;;N;;;;;
+1B6A;BALINESE MUSICAL SYMBOL DANG GEDE;So;0;L;;;;;N;;;;;
+1B6B;BALINESE MUSICAL SYMBOL COMBINING TEGEH;Mn;230;NSM;;;;;N;;;;;
+1B6C;BALINESE MUSICAL SYMBOL COMBINING ENDEP;Mn;220;NSM;;;;;N;;;;;
+1B6D;BALINESE MUSICAL SYMBOL COMBINING KEMPUL;Mn;230;NSM;;;;;N;;;;;
+1B6E;BALINESE MUSICAL SYMBOL COMBINING KEMPLI;Mn;230;NSM;;;;;N;;;;;
+1B6F;BALINESE MUSICAL SYMBOL COMBINING JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B70;BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B71;BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN;Mn;230;NSM;;;;;N;;;;;
+1B72;BALINESE MUSICAL SYMBOL COMBINING BENDE;Mn;230;NSM;;;;;N;;;;;
+1B73;BALINESE MUSICAL SYMBOL COMBINING GONG;Mn;230;NSM;;;;;N;;;;;
+1B74;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG;So;0;L;;;;;N;;;;;
+1B75;BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG;So;0;L;;;;;N;;;;;
+1B76;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK;So;0;L;;;;;N;;;;;
+1B77;BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK;So;0;L;;;;;N;;;;;
+1B78;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG;So;0;L;;;;;N;;;;;
+1B79;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG;So;0;L;;;;;N;;;;;
+1B7A;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK;So;0;L;;;;;N;;;;;
+1B7B;BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK;So;0;L;;;;;N;;;;;
+1B7C;BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING;So;0;L;;;;;N;;;;;
+1D00;LATIN LETTER SMALL CAPITAL A;Ll;0;L;;;;;N;;;;;
+1D01;LATIN LETTER SMALL CAPITAL AE;Ll;0;L;;;;;N;;;;;
+1D02;LATIN SMALL LETTER TURNED AE;Ll;0;L;;;;;N;;;;;
+1D03;LATIN LETTER SMALL CAPITAL BARRED B;Ll;0;L;;;;;N;;;;;
+1D04;LATIN LETTER SMALL CAPITAL C;Ll;0;L;;;;;N;;;;;
+1D05;LATIN LETTER SMALL CAPITAL D;Ll;0;L;;;;;N;;;;;
+1D06;LATIN LETTER SMALL CAPITAL ETH;Ll;0;L;;;;;N;;;;;
+1D07;LATIN LETTER SMALL CAPITAL E;Ll;0;L;;;;;N;;;;;
+1D08;LATIN SMALL LETTER TURNED OPEN E;Ll;0;L;;;;;N;;;;;
+1D09;LATIN SMALL LETTER TURNED I;Ll;0;L;;;;;N;;;;;
+1D0A;LATIN LETTER SMALL CAPITAL J;Ll;0;L;;;;;N;;;;;
+1D0B;LATIN LETTER SMALL CAPITAL K;Ll;0;L;;;;;N;;;;;
+1D0C;LATIN LETTER SMALL CAPITAL L WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D0D;LATIN LETTER SMALL CAPITAL M;Ll;0;L;;;;;N;;;;;
+1D0E;LATIN LETTER SMALL CAPITAL REVERSED N;Ll;0;L;;;;;N;;;;;
+1D0F;LATIN LETTER SMALL CAPITAL O;Ll;0;L;;;;;N;;;;;
+1D10;LATIN LETTER SMALL CAPITAL OPEN O;Ll;0;L;;;;;N;;;;;
+1D11;LATIN SMALL LETTER SIDEWAYS O;Ll;0;L;;;;;N;;;;;
+1D12;LATIN SMALL LETTER SIDEWAYS OPEN O;Ll;0;L;;;;;N;;;;;
+1D13;LATIN SMALL LETTER SIDEWAYS O WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D14;LATIN SMALL LETTER TURNED OE;Ll;0;L;;;;;N;;;;;
+1D15;LATIN LETTER SMALL CAPITAL OU;Ll;0;L;;;;;N;;;;;
+1D16;LATIN SMALL LETTER TOP HALF O;Ll;0;L;;;;;N;;;;;
+1D17;LATIN SMALL LETTER BOTTOM HALF O;Ll;0;L;;;;;N;;;;;
+1D18;LATIN LETTER SMALL CAPITAL P;Ll;0;L;;;;;N;;;;;
+1D19;LATIN LETTER SMALL CAPITAL REVERSED R;Ll;0;L;;;;;N;;;;;
+1D1A;LATIN LETTER SMALL CAPITAL TURNED R;Ll;0;L;;;;;N;;;;;
+1D1B;LATIN LETTER SMALL CAPITAL T;Ll;0;L;;;;;N;;;;;
+1D1C;LATIN LETTER SMALL CAPITAL U;Ll;0;L;;;;;N;;;;;
+1D1D;LATIN SMALL LETTER SIDEWAYS U;Ll;0;L;;;;;N;;;;;
+1D1E;LATIN SMALL LETTER SIDEWAYS DIAERESIZED U;Ll;0;L;;;;;N;;;;;
+1D1F;LATIN SMALL LETTER SIDEWAYS TURNED M;Ll;0;L;;;;;N;;;;;
+1D20;LATIN LETTER SMALL CAPITAL V;Ll;0;L;;;;;N;;;;;
+1D21;LATIN LETTER SMALL CAPITAL W;Ll;0;L;;;;;N;;;;;
+1D22;LATIN LETTER SMALL CAPITAL Z;Ll;0;L;;;;;N;;;;;
+1D23;LATIN LETTER SMALL CAPITAL EZH;Ll;0;L;;;;;N;;;;;
+1D24;LATIN LETTER VOICED LARYNGEAL SPIRANT;Ll;0;L;;;;;N;;;;;
+1D25;LATIN LETTER AIN;Ll;0;L;;;;;N;;;;;
+1D26;GREEK LETTER SMALL CAPITAL GAMMA;Ll;0;L;;;;;N;;;;;
+1D27;GREEK LETTER SMALL CAPITAL LAMDA;Ll;0;L;;;;;N;;;;;
+1D28;GREEK LETTER SMALL CAPITAL PI;Ll;0;L;;;;;N;;;;;
+1D29;GREEK LETTER SMALL CAPITAL RHO;Ll;0;L;;;;;N;;;;;
+1D2A;GREEK LETTER SMALL CAPITAL PSI;Ll;0;L;;;;;N;;;;;
+1D2B;CYRILLIC LETTER SMALL CAPITAL EL;Ll;0;L;;;;;N;;;;;
+1D2C;MODIFIER LETTER CAPITAL A;Lm;0;L;<super> 0041;;;;N;;;;;
+1D2D;MODIFIER LETTER CAPITAL AE;Lm;0;L;<super> 00C6;;;;N;;;;;
+1D2E;MODIFIER LETTER CAPITAL B;Lm;0;L;<super> 0042;;;;N;;;;;
+1D2F;MODIFIER LETTER CAPITAL BARRED B;Lm;0;L;;;;;N;;;;;
+1D30;MODIFIER LETTER CAPITAL D;Lm;0;L;<super> 0044;;;;N;;;;;
+1D31;MODIFIER LETTER CAPITAL E;Lm;0;L;<super> 0045;;;;N;;;;;
+1D32;MODIFIER LETTER CAPITAL REVERSED E;Lm;0;L;<super> 018E;;;;N;;;;;
+1D33;MODIFIER LETTER CAPITAL G;Lm;0;L;<super> 0047;;;;N;;;;;
+1D34;MODIFIER LETTER CAPITAL H;Lm;0;L;<super> 0048;;;;N;;;;;
+1D35;MODIFIER LETTER CAPITAL I;Lm;0;L;<super> 0049;;;;N;;;;;
+1D36;MODIFIER LETTER CAPITAL J;Lm;0;L;<super> 004A;;;;N;;;;;
+1D37;MODIFIER LETTER CAPITAL K;Lm;0;L;<super> 004B;;;;N;;;;;
+1D38;MODIFIER LETTER CAPITAL L;Lm;0;L;<super> 004C;;;;N;;;;;
+1D39;MODIFIER LETTER CAPITAL M;Lm;0;L;<super> 004D;;;;N;;;;;
+1D3A;MODIFIER LETTER CAPITAL N;Lm;0;L;<super> 004E;;;;N;;;;;
+1D3B;MODIFIER LETTER CAPITAL REVERSED N;Lm;0;L;;;;;N;;;;;
+1D3C;MODIFIER LETTER CAPITAL O;Lm;0;L;<super> 004F;;;;N;;;;;
+1D3D;MODIFIER LETTER CAPITAL OU;Lm;0;L;<super> 0222;;;;N;;;;;
+1D3E;MODIFIER LETTER CAPITAL P;Lm;0;L;<super> 0050;;;;N;;;;;
+1D3F;MODIFIER LETTER CAPITAL R;Lm;0;L;<super> 0052;;;;N;;;;;
+1D40;MODIFIER LETTER CAPITAL T;Lm;0;L;<super> 0054;;;;N;;;;;
+1D41;MODIFIER LETTER CAPITAL U;Lm;0;L;<super> 0055;;;;N;;;;;
+1D42;MODIFIER LETTER CAPITAL W;Lm;0;L;<super> 0057;;;;N;;;;;
+1D43;MODIFIER LETTER SMALL A;Lm;0;L;<super> 0061;;;;N;;;;;
+1D44;MODIFIER LETTER SMALL TURNED A;Lm;0;L;<super> 0250;;;;N;;;;;
+1D45;MODIFIER LETTER SMALL ALPHA;Lm;0;L;<super> 0251;;;;N;;;;;
+1D46;MODIFIER LETTER SMALL TURNED AE;Lm;0;L;<super> 1D02;;;;N;;;;;
+1D47;MODIFIER LETTER SMALL B;Lm;0;L;<super> 0062;;;;N;;;;;
+1D48;MODIFIER LETTER SMALL D;Lm;0;L;<super> 0064;;;;N;;;;;
+1D49;MODIFIER LETTER SMALL E;Lm;0;L;<super> 0065;;;;N;;;;;
+1D4A;MODIFIER LETTER SMALL SCHWA;Lm;0;L;<super> 0259;;;;N;;;;;
+1D4B;MODIFIER LETTER SMALL OPEN E;Lm;0;L;<super> 025B;;;;N;;;;;
+1D4C;MODIFIER LETTER SMALL TURNED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1D4D;MODIFIER LETTER SMALL G;Lm;0;L;<super> 0067;;;;N;;;;;
+1D4E;MODIFIER LETTER SMALL TURNED I;Lm;0;L;;;;;N;;;;;
+1D4F;MODIFIER LETTER SMALL K;Lm;0;L;<super> 006B;;;;N;;;;;
+1D50;MODIFIER LETTER SMALL M;Lm;0;L;<super> 006D;;;;N;;;;;
+1D51;MODIFIER LETTER SMALL ENG;Lm;0;L;<super> 014B;;;;N;;;;;
+1D52;MODIFIER LETTER SMALL O;Lm;0;L;<super> 006F;;;;N;;;;;
+1D53;MODIFIER LETTER SMALL OPEN O;Lm;0;L;<super> 0254;;;;N;;;;;
+1D54;MODIFIER LETTER SMALL TOP HALF O;Lm;0;L;<super> 1D16;;;;N;;;;;
+1D55;MODIFIER LETTER SMALL BOTTOM HALF O;Lm;0;L;<super> 1D17;;;;N;;;;;
+1D56;MODIFIER LETTER SMALL P;Lm;0;L;<super> 0070;;;;N;;;;;
+1D57;MODIFIER LETTER SMALL T;Lm;0;L;<super> 0074;;;;N;;;;;
+1D58;MODIFIER LETTER SMALL U;Lm;0;L;<super> 0075;;;;N;;;;;
+1D59;MODIFIER LETTER SMALL SIDEWAYS U;Lm;0;L;<super> 1D1D;;;;N;;;;;
+1D5A;MODIFIER LETTER SMALL TURNED M;Lm;0;L;<super> 026F;;;;N;;;;;
+1D5B;MODIFIER LETTER SMALL V;Lm;0;L;<super> 0076;;;;N;;;;;
+1D5C;MODIFIER LETTER SMALL AIN;Lm;0;L;<super> 1D25;;;;N;;;;;
+1D5D;MODIFIER LETTER SMALL BETA;Lm;0;L;<super> 03B2;;;;N;;;;;
+1D5E;MODIFIER LETTER SMALL GREEK GAMMA;Lm;0;L;<super> 03B3;;;;N;;;;;
+1D5F;MODIFIER LETTER SMALL DELTA;Lm;0;L;<super> 03B4;;;;N;;;;;
+1D60;MODIFIER LETTER SMALL GREEK PHI;Lm;0;L;<super> 03C6;;;;N;;;;;
+1D61;MODIFIER LETTER SMALL CHI;Lm;0;L;<super> 03C7;;;;N;;;;;
+1D62;LATIN SUBSCRIPT SMALL LETTER I;Ll;0;L;<sub> 0069;;;;N;;;;;
+1D63;LATIN SUBSCRIPT SMALL LETTER R;Ll;0;L;<sub> 0072;;;;N;;;;;
+1D64;LATIN SUBSCRIPT SMALL LETTER U;Ll;0;L;<sub> 0075;;;;N;;;;;
+1D65;LATIN SUBSCRIPT SMALL LETTER V;Ll;0;L;<sub> 0076;;;;N;;;;;
+1D66;GREEK SUBSCRIPT SMALL LETTER BETA;Ll;0;L;<sub> 03B2;;;;N;;;;;
+1D67;GREEK SUBSCRIPT SMALL LETTER GAMMA;Ll;0;L;<sub> 03B3;;;;N;;;;;
+1D68;GREEK SUBSCRIPT SMALL LETTER RHO;Ll;0;L;<sub> 03C1;;;;N;;;;;
+1D69;GREEK SUBSCRIPT SMALL LETTER PHI;Ll;0;L;<sub> 03C6;;;;N;;;;;
+1D6A;GREEK SUBSCRIPT SMALL LETTER CHI;Ll;0;L;<sub> 03C7;;;;N;;;;;
+1D6B;LATIN SMALL LETTER UE;Ll;0;L;;;;;N;;;;;
+1D6C;LATIN SMALL LETTER B WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6D;LATIN SMALL LETTER D WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6E;LATIN SMALL LETTER F WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D6F;LATIN SMALL LETTER M WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D70;LATIN SMALL LETTER N WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D71;LATIN SMALL LETTER P WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D72;LATIN SMALL LETTER R WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D73;LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D74;LATIN SMALL LETTER S WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D75;LATIN SMALL LETTER T WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D76;LATIN SMALL LETTER Z WITH MIDDLE TILDE;Ll;0;L;;;;;N;;;;;
+1D77;LATIN SMALL LETTER TURNED G;Ll;0;L;;;;;N;;;;;
+1D78;MODIFIER LETTER CYRILLIC EN;Lm;0;L;<super> 043D;;;;N;;;;;
+1D79;LATIN SMALL LETTER INSULAR G;Ll;0;L;;;;;N;;;;;
+1D7A;LATIN SMALL LETTER TH WITH STRIKETHROUGH;Ll;0;L;;;;;N;;;;;
+1D7B;LATIN SMALL CAPITAL LETTER I WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7C;LATIN SMALL LETTER IOTA WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7D;LATIN SMALL LETTER P WITH STROKE;Ll;0;L;;;;;N;;;2C63;;2C63
+1D7E;LATIN SMALL CAPITAL LETTER U WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D7F;LATIN SMALL LETTER UPSILON WITH STROKE;Ll;0;L;;;;;N;;;;;
+1D80;LATIN SMALL LETTER B WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D81;LATIN SMALL LETTER D WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D82;LATIN SMALL LETTER F WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D83;LATIN SMALL LETTER G WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D84;LATIN SMALL LETTER K WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D85;LATIN SMALL LETTER L WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D86;LATIN SMALL LETTER M WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D87;LATIN SMALL LETTER N WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D88;LATIN SMALL LETTER P WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D89;LATIN SMALL LETTER R WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8A;LATIN SMALL LETTER S WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8B;LATIN SMALL LETTER ESH WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8C;LATIN SMALL LETTER V WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8D;LATIN SMALL LETTER X WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8E;LATIN SMALL LETTER Z WITH PALATAL HOOK;Ll;0;L;;;;;N;;;;;
+1D8F;LATIN SMALL LETTER A WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D90;LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D91;LATIN SMALL LETTER D WITH HOOK AND TAIL;Ll;0;L;;;;;N;;;;;
+1D92;LATIN SMALL LETTER E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D93;LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D94;LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D95;LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D96;LATIN SMALL LETTER I WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D97;LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D98;LATIN SMALL LETTER ESH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D99;LATIN SMALL LETTER U WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9A;LATIN SMALL LETTER EZH WITH RETROFLEX HOOK;Ll;0;L;;;;;N;;;;;
+1D9B;MODIFIER LETTER SMALL TURNED ALPHA;Lm;0;L;<super> 0252;;;;N;;;;;
+1D9C;MODIFIER LETTER SMALL C;Lm;0;L;<super> 0063;;;;N;;;;;
+1D9D;MODIFIER LETTER SMALL C WITH CURL;Lm;0;L;<super> 0255;;;;N;;;;;
+1D9E;MODIFIER LETTER SMALL ETH;Lm;0;L;<super> 00F0;;;;N;;;;;
+1D9F;MODIFIER LETTER SMALL REVERSED OPEN E;Lm;0;L;<super> 025C;;;;N;;;;;
+1DA0;MODIFIER LETTER SMALL F;Lm;0;L;<super> 0066;;;;N;;;;;
+1DA1;MODIFIER LETTER SMALL DOTLESS J WITH STROKE;Lm;0;L;<super> 025F;;;;N;;;;;
+1DA2;MODIFIER LETTER SMALL SCRIPT G;Lm;0;L;<super> 0261;;;;N;;;;;
+1DA3;MODIFIER LETTER SMALL TURNED H;Lm;0;L;<super> 0265;;;;N;;;;;
+1DA4;MODIFIER LETTER SMALL I WITH STROKE;Lm;0;L;<super> 0268;;;;N;;;;;
+1DA5;MODIFIER LETTER SMALL IOTA;Lm;0;L;<super> 0269;;;;N;;;;;
+1DA6;MODIFIER LETTER SMALL CAPITAL I;Lm;0;L;<super> 026A;;;;N;;;;;
+1DA7;MODIFIER LETTER SMALL CAPITAL I WITH STROKE;Lm;0;L;<super> 1D7B;;;;N;;;;;
+1DA8;MODIFIER LETTER SMALL J WITH CROSSED-TAIL;Lm;0;L;<super> 029D;;;;N;;;;;
+1DA9;MODIFIER LETTER SMALL L WITH RETROFLEX HOOK;Lm;0;L;<super> 026D;;;;N;;;;;
+1DAA;MODIFIER LETTER SMALL L WITH PALATAL HOOK;Lm;0;L;<super> 1D85;;;;N;;;;;
+1DAB;MODIFIER LETTER SMALL CAPITAL L;Lm;0;L;<super> 029F;;;;N;;;;;
+1DAC;MODIFIER LETTER SMALL M WITH HOOK;Lm;0;L;<super> 0271;;;;N;;;;;
+1DAD;MODIFIER LETTER SMALL TURNED M WITH LONG LEG;Lm;0;L;<super> 0270;;;;N;;;;;
+1DAE;MODIFIER LETTER SMALL N WITH LEFT HOOK;Lm;0;L;<super> 0272;;;;N;;;;;
+1DAF;MODIFIER LETTER SMALL N WITH RETROFLEX HOOK;Lm;0;L;<super> 0273;;;;N;;;;;
+1DB0;MODIFIER LETTER SMALL CAPITAL N;Lm;0;L;<super> 0274;;;;N;;;;;
+1DB1;MODIFIER LETTER SMALL BARRED O;Lm;0;L;<super> 0275;;;;N;;;;;
+1DB2;MODIFIER LETTER SMALL PHI;Lm;0;L;<super> 0278;;;;N;;;;;
+1DB3;MODIFIER LETTER SMALL S WITH HOOK;Lm;0;L;<super> 0282;;;;N;;;;;
+1DB4;MODIFIER LETTER SMALL ESH;Lm;0;L;<super> 0283;;;;N;;;;;
+1DB5;MODIFIER LETTER SMALL T WITH PALATAL HOOK;Lm;0;L;<super> 01AB;;;;N;;;;;
+1DB6;MODIFIER LETTER SMALL U BAR;Lm;0;L;<super> 0289;;;;N;;;;;
+1DB7;MODIFIER LETTER SMALL UPSILON;Lm;0;L;<super> 028A;;;;N;;;;;
+1DB8;MODIFIER LETTER SMALL CAPITAL U;Lm;0;L;<super> 1D1C;;;;N;;;;;
+1DB9;MODIFIER LETTER SMALL V WITH HOOK;Lm;0;L;<super> 028B;;;;N;;;;;
+1DBA;MODIFIER LETTER SMALL TURNED V;Lm;0;L;<super> 028C;;;;N;;;;;
+1DBB;MODIFIER LETTER SMALL Z;Lm;0;L;<super> 007A;;;;N;;;;;
+1DBC;MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK;Lm;0;L;<super> 0290;;;;N;;;;;
+1DBD;MODIFIER LETTER SMALL Z WITH CURL;Lm;0;L;<super> 0291;;;;N;;;;;
+1DBE;MODIFIER LETTER SMALL EZH;Lm;0;L;<super> 0292;;;;N;;;;;
+1DBF;MODIFIER LETTER SMALL THETA;Lm;0;L;<super> 03B8;;;;N;;;;;
+1DC0;COMBINING DOTTED GRAVE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC1;COMBINING DOTTED ACUTE ACCENT;Mn;230;NSM;;;;;N;;;;;
+1DC2;COMBINING SNAKE BELOW;Mn;220;NSM;;;;;N;;;;;
+1DC3;COMBINING SUSPENSION MARK;Mn;230;NSM;;;;;N;;;;;
+1DC4;COMBINING MACRON-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DC5;COMBINING GRAVE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC6;COMBINING MACRON-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC7;COMBINING ACUTE-MACRON;Mn;230;NSM;;;;;N;;;;;
+1DC8;COMBINING GRAVE-ACUTE-GRAVE;Mn;230;NSM;;;;;N;;;;;
+1DC9;COMBINING ACUTE-GRAVE-ACUTE;Mn;230;NSM;;;;;N;;;;;
+1DCA;COMBINING LATIN SMALL LETTER R BELOW;Mn;220;NSM;;;;;N;;;;;
+1DFE;COMBINING LEFT ARROWHEAD ABOVE;Mn;230;NSM;;;;;N;;;;;
+1DFF;COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW;Mn;220;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;Cf;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;;;;;Y;SINGLE TURNED COMMA QUOTATION MARK;;;;
+2019;RIGHT SINGLE QUOTATION MARK;Pf;0;ON;;;;;Y;SINGLE COMMA QUOTATION MARK;;;;
+201A;SINGLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;Y;LOW SINGLE COMMA QUOTATION MARK;;;;
+201B;SINGLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;Y;SINGLE REVERSED COMMA QUOTATION MARK;;;;
+201C;LEFT DOUBLE QUOTATION MARK;Pi;0;ON;;;;;Y;DOUBLE TURNED COMMA QUOTATION MARK;;;;
+201D;RIGHT DOUBLE QUOTATION MARK;Pf;0;ON;;;;;Y;DOUBLE COMMA QUOTATION MARK;;;;
+201E;DOUBLE LOW-9 QUOTATION MARK;Ps;0;ON;;;;;Y;LOW DOUBLE COMMA QUOTATION MARK;;;;
+201F;DOUBLE HIGH-REVERSED-9 QUOTATION MARK;Pi;0;ON;;;;;Y;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;CS;<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;CS;;;;;N;;;;;
+2045;LEFT SQUARE BRACKET WITH QUILL;Ps;0;ON;;;;;Y;;;;;
+2046;RIGHT SQUARE BRACKET WITH QUILL;Pe;0;ON;;;;;Y;;;;;
+2047;DOUBLE QUESTION MARK;Po;0;ON;<compat> 003F 003F;;;;N;;;;;
+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;;;;;
+204E;LOW ASTERISK;Po;0;ON;;;;;N;;;;;
+204F;REVERSED SEMICOLON;Po;0;ON;;;;;N;;;;;
+2050;CLOSE UP;Po;0;ON;;;;;N;;;;;
+2051;TWO ASTERISKS ALIGNED VERTICALLY;Po;0;ON;;;;;N;;;;;
+2052;COMMERCIAL MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2053;SWUNG DASH;Po;0;ON;;;;;N;;;;;
+2054;INVERTED UNDERTIE;Pc;0;ON;;;;;N;;;;;
+2055;FLOWER PUNCTUATION MARK;Po;0;ON;;;;;N;;;;;
+2056;THREE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2057;QUADRUPLE PRIME;Po;0;ON;<compat> 2032 2032 2032 2032;;;;N;;;;;
+2058;FOUR DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+2059;FIVE DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205A;TWO DOT PUNCTUATION;Po;0;ON;;;;;N;;;;;
+205B;FOUR DOT MARK;Po;0;ON;;;;;N;;;;;
+205C;DOTTED CROSS;Po;0;ON;;;;;N;;;;;
+205D;TRICOLON;Po;0;ON;;;;;N;;;;;
+205E;VERTICAL FOUR DOTS;Po;0;ON;;;;;N;;;;;
+205F;MEDIUM MATHEMATICAL SPACE;Zs;0;WS;<compat> 0020;;;;N;;;;;
+2060;WORD JOINER;Cf;0;BN;;;;;N;;;;;
+2061;FUNCTION APPLICATION;Cf;0;BN;;;;;N;;;;;
+2062;INVISIBLE TIMES;Cf;0;BN;;;;;N;;;;;
+2063;INVISIBLE SEPARATOR;Cf;0;BN;;;;;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;N;SUPERSCRIPT DIGIT ZERO;;;;
+2071;SUPERSCRIPT LATIN SMALL LETTER I;Ll;0;L;<super> 0069;;;;N;;;;;
+2074;SUPERSCRIPT FOUR;No;0;EN;<super> 0034;;4;4;N;SUPERSCRIPT DIGIT FOUR;;;;
+2075;SUPERSCRIPT FIVE;No;0;EN;<super> 0035;;5;5;N;SUPERSCRIPT DIGIT FIVE;;;;
+2076;SUPERSCRIPT SIX;No;0;EN;<super> 0036;;6;6;N;SUPERSCRIPT DIGIT SIX;;;;
+2077;SUPERSCRIPT SEVEN;No;0;EN;<super> 0037;;7;7;N;SUPERSCRIPT DIGIT SEVEN;;;;
+2078;SUPERSCRIPT EIGHT;No;0;EN;<super> 0038;;8;8;N;SUPERSCRIPT DIGIT EIGHT;;;;
+2079;SUPERSCRIPT NINE;No;0;EN;<super> 0039;;9;9;N;SUPERSCRIPT DIGIT NINE;;;;
+207A;SUPERSCRIPT PLUS SIGN;Sm;0;ES;<super> 002B;;;;N;;;;;
+207B;SUPERSCRIPT MINUS;Sm;0;ES;<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;N;SUBSCRIPT DIGIT ZERO;;;;
+2081;SUBSCRIPT ONE;No;0;EN;<sub> 0031;;1;1;N;SUBSCRIPT DIGIT ONE;;;;
+2082;SUBSCRIPT TWO;No;0;EN;<sub> 0032;;2;2;N;SUBSCRIPT DIGIT TWO;;;;
+2083;SUBSCRIPT THREE;No;0;EN;<sub> 0033;;3;3;N;SUBSCRIPT DIGIT THREE;;;;
+2084;SUBSCRIPT FOUR;No;0;EN;<sub> 0034;;4;4;N;SUBSCRIPT DIGIT FOUR;;;;
+2085;SUBSCRIPT FIVE;No;0;EN;<sub> 0035;;5;5;N;SUBSCRIPT DIGIT FIVE;;;;
+2086;SUBSCRIPT SIX;No;0;EN;<sub> 0036;;6;6;N;SUBSCRIPT DIGIT SIX;;;;
+2087;SUBSCRIPT SEVEN;No;0;EN;<sub> 0037;;7;7;N;SUBSCRIPT DIGIT SEVEN;;;;
+2088;SUBSCRIPT EIGHT;No;0;EN;<sub> 0038;;8;8;N;SUBSCRIPT DIGIT EIGHT;;;;
+2089;SUBSCRIPT NINE;No;0;EN;<sub> 0039;;9;9;N;SUBSCRIPT DIGIT NINE;;;;
+208A;SUBSCRIPT PLUS SIGN;Sm;0;ES;<sub> 002B;;;;N;;;;;
+208B;SUBSCRIPT MINUS;Sm;0;ES;<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;;;;
+2090;LATIN SUBSCRIPT SMALL LETTER A;Lm;0;L;<sub> 0061;;;;N;;;;;
+2091;LATIN SUBSCRIPT SMALL LETTER E;Lm;0;L;<sub> 0065;;;;N;;;;;
+2092;LATIN SUBSCRIPT SMALL LETTER O;Lm;0;L;<sub> 006F;;;;N;;;;;
+2093;LATIN SUBSCRIPT SMALL LETTER X;Lm;0;L;<sub> 0078;;;;N;;;;;
+2094;LATIN SUBSCRIPT SMALL LETTER SCHWA;Lm;0;L;<sub> 0259;;;;N;;;;;
+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;;;;;
+20B0;GERMAN PENNY SIGN;Sc;0;ET;;;;;N;;;;;
+20B1;PESO SIGN;Sc;0;ET;;;;;N;;;;;
+20B2;GUARANI SIGN;Sc;0;ET;;;;;N;;;;;
+20B3;AUSTRAL SIGN;Sc;0;ET;;;;;N;;;;;
+20B4;HRYVNIA SIGN;Sc;0;ET;;;;;N;;;;;
+20B5;CEDI 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;;;;;
+20E4;COMBINING ENCLOSING UPWARD POINTING TRIANGLE;Me;0;NSM;;;;;N;;;;;
+20E5;COMBINING REVERSE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E6;COMBINING DOUBLE VERTICAL STROKE OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20E7;COMBINING ANNUITY SYMBOL;Mn;230;NSM;;;;;N;;;;;
+20E8;COMBINING TRIPLE UNDERDOT;Mn;220;NSM;;;;;N;;;;;
+20E9;COMBINING WIDE BRIDGE ABOVE;Mn;230;NSM;;;;;N;;;;;
+20EA;COMBINING LEFTWARDS ARROW OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EB;COMBINING LONG DOUBLE SOLIDUS OVERLAY;Mn;1;NSM;;;;;N;;;;;
+20EC;COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20ED;COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS;Mn;220;NSM;;;;;N;;;;;
+20EE;COMBINING LEFT ARROW BELOW;Mn;220;NSM;;;;;N;;;;;
+20EF;COMBINING RIGHT ARROW BELOW;Mn;220;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;Lu;0;L;;;;;N;TURNED F;;;214E;
+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;;;;;
+213B;FACSIMILE SIGN;So;0;ON;<compat> 0046 0041 0058;;;;N;;;;;
+213C;DOUBLE-STRUCK SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+213D;DOUBLE-STRUCK SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+213E;DOUBLE-STRUCK CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+213F;DOUBLE-STRUCK CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+2140;DOUBLE-STRUCK N-ARY SUMMATION;Sm;0;ON;<font> 2211;;;;Y;;;;;
+2141;TURNED SANS-SERIF CAPITAL G;Sm;0;ON;;;;;N;;;;;
+2142;TURNED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2143;REVERSED SANS-SERIF CAPITAL L;Sm;0;ON;;;;;N;;;;;
+2144;TURNED SANS-SERIF CAPITAL Y;Sm;0;ON;;;;;N;;;;;
+2145;DOUBLE-STRUCK ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+2146;DOUBLE-STRUCK ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+2147;DOUBLE-STRUCK ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+2148;DOUBLE-STRUCK ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+2149;DOUBLE-STRUCK ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+214A;PROPERTY LINE;So;0;ON;;;;;N;;;;;
+214B;TURNED AMPERSAND;Sm;0;ON;;;;;N;;;;;
+214C;PER SIGN;So;0;ON;;;;;N;;;;;
+214D;AKTIESELSKAB;So;0;ON;;;;;N;;;;;
+214E;TURNED SMALL F;Ll;0;L;;;;;N;;;2132;;2132
+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;Lu;0;L;;;;;N;;;;2184;
+2184;LATIN SMALL LETTER REVERSED C;Ll;0;L;;;;;N;;;2183;;2183
+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;;;;;
+21F4;RIGHT ARROW WITH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+21F5;DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+21F6;THREE RIGHTWARDS ARROWS;Sm;0;ON;;;;;N;;;;;
+21F7;LEFTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F8;RIGHTWARDS ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21F9;LEFT RIGHT ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FA;LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FB;RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FC;LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+21FD;LEFTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FE;RIGHTWARDS OPEN-HEADED ARROW;Sm;0;ON;;;;;N;;;;;
+21FF;LEFT RIGHT OPEN-HEADED ARROW;Sm;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;ES;;;;;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;;;;;
+22F2;ELEMENT OF WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F3;ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F4;SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22F5;ELEMENT OF WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+22F6;ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F7;SMALL ELEMENT OF WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22F8;ELEMENT OF WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+22F9;ELEMENT OF WITH TWO HORIZONTAL STROKES;Sm;0;ON;;;;;Y;;;;;
+22FA;CONTAINS WITH LONG HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FB;CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FC;SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+22FD;CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FE;SMALL CONTAINS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+22FF;Z NOTATION BAG MEMBERSHIP;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;;;;;
+237C;RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW;Sm;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;;;;;
+239B;LEFT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239C;LEFT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+239D;LEFT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+239E;RIGHT PARENTHESIS UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+239F;RIGHT PARENTHESIS EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A0;RIGHT PARENTHESIS LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23A1;LEFT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A2;LEFT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A3;LEFT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A4;RIGHT SQUARE BRACKET UPPER CORNER;Sm;0;ON;;;;;N;;;;;
+23A5;RIGHT SQUARE BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23A6;RIGHT SQUARE BRACKET LOWER CORNER;Sm;0;ON;;;;;N;;;;;
+23A7;LEFT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23A8;LEFT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23A9;LEFT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AA;CURLY BRACKET EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AB;RIGHT CURLY BRACKET UPPER HOOK;Sm;0;ON;;;;;N;;;;;
+23AC;RIGHT CURLY BRACKET MIDDLE PIECE;Sm;0;ON;;;;;N;;;;;
+23AD;RIGHT CURLY BRACKET LOWER HOOK;Sm;0;ON;;;;;N;;;;;
+23AE;INTEGRAL EXTENSION;Sm;0;ON;;;;;N;;;;;
+23AF;HORIZONTAL LINE EXTENSION;Sm;0;ON;;;;;N;;;;;
+23B0;UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B1;UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION;Sm;0;ON;;;;;N;;;;;
+23B2;SUMMATION TOP;Sm;0;ON;;;;;N;;;;;
+23B3;SUMMATION BOTTOM;Sm;0;ON;;;;;N;;;;;
+23B4;TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B5;BOTTOM SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B6;BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET;So;0;ON;;;;;N;;;;;
+23B7;RADICAL SYMBOL BOTTOM;So;0;ON;;;;;N;;;;;
+23B8;LEFT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23B9;RIGHT VERTICAL BOX LINE;So;0;ON;;;;;N;;;;;
+23BA;HORIZONTAL SCAN LINE-1;So;0;ON;;;;;N;;;;;
+23BB;HORIZONTAL SCAN LINE-3;So;0;ON;;;;;N;;;;;
+23BC;HORIZONTAL SCAN LINE-7;So;0;ON;;;;;N;;;;;
+23BD;HORIZONTAL SCAN LINE-9;So;0;ON;;;;;N;;;;;
+23BE;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT;So;0;ON;;;;;N;;;;;
+23BF;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT;So;0;ON;;;;;N;;;;;
+23C0;DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C1;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C2;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23C3;DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C4;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C5;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE;So;0;ON;;;;;N;;;;;
+23C6;DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE;So;0;ON;;;;;N;;;;;
+23C7;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C8;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE;So;0;ON;;;;;N;;;;;
+23C9;DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CA;DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL;So;0;ON;;;;;N;;;;;
+23CB;DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT;So;0;ON;;;;;N;;;;;
+23CC;DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT;So;0;ON;;;;;N;;;;;
+23CD;SQUARE FOOT;So;0;ON;;;;;N;;;;;
+23CE;RETURN SYMBOL;So;0;ON;;;;;N;;;;;
+23CF;EJECT SYMBOL;So;0;ON;;;;;N;;;;;
+23D0;VERTICAL LINE EXTENSION;So;0;ON;;;;;N;;;;;
+23D1;METRICAL BREVE;So;0;ON;;;;;N;;;;;
+23D2;METRICAL LONG OVER SHORT;So;0;ON;;;;;N;;;;;
+23D3;METRICAL SHORT OVER LONG;So;0;ON;;;;;N;;;;;
+23D4;METRICAL LONG OVER TWO SHORTS;So;0;ON;;;;;N;;;;;
+23D5;METRICAL TWO SHORTS OVER LONG;So;0;ON;;;;;N;;;;;
+23D6;METRICAL TWO SHORTS JOINED;So;0;ON;;;;;N;;;;;
+23D7;METRICAL TRISEME;So;0;ON;;;;;N;;;;;
+23D8;METRICAL TETRASEME;So;0;ON;;;;;N;;;;;
+23D9;METRICAL PENTASEME;So;0;ON;;;;;N;;;;;
+23DA;EARTH GROUND;So;0;ON;;;;;N;;;;;
+23DB;FUSE;So;0;ON;;;;;N;;;;;
+23DC;TOP PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DD;BOTTOM PARENTHESIS;Sm;0;ON;;;;;N;;mathematical use;;;
+23DE;TOP CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23DF;BOTTOM CURLY BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E0;TOP TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E1;BOTTOM TORTOISE SHELL BRACKET;Sm;0;ON;;;;;N;;mathematical use;;;
+23E2;WHITE TRAPEZIUM;So;0;ON;;;;;N;;;;;
+23E3;BENZENE RING WITH CIRCLE;So;0;ON;;;;;N;;;;;
+23E4;STRAIGHTNESS;So;0;ON;;;;;N;;;;;
+23E5;FLATNESS;So;0;ON;;;;;N;;;;;
+23E6;AC CURRENT;So;0;ON;;;;;N;;;;;
+23E7;ELECTRICAL INTERSECTION;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;ON;<circle> 0031;;1;1;N;;;;;
+2461;CIRCLED DIGIT TWO;No;0;ON;<circle> 0032;;2;2;N;;;;;
+2462;CIRCLED DIGIT THREE;No;0;ON;<circle> 0033;;3;3;N;;;;;
+2463;CIRCLED DIGIT FOUR;No;0;ON;<circle> 0034;;4;4;N;;;;;
+2464;CIRCLED DIGIT FIVE;No;0;ON;<circle> 0035;;5;5;N;;;;;
+2465;CIRCLED DIGIT SIX;No;0;ON;<circle> 0036;;6;6;N;;;;;
+2466;CIRCLED DIGIT SEVEN;No;0;ON;<circle> 0037;;7;7;N;;;;;
+2467;CIRCLED DIGIT EIGHT;No;0;ON;<circle> 0038;;8;8;N;;;;;
+2468;CIRCLED DIGIT NINE;No;0;ON;<circle> 0039;;9;9;N;;;;;
+2469;CIRCLED NUMBER TEN;No;0;ON;<circle> 0031 0030;;;10;N;;;;;
+246A;CIRCLED NUMBER ELEVEN;No;0;ON;<circle> 0031 0031;;;11;N;;;;;
+246B;CIRCLED NUMBER TWELVE;No;0;ON;<circle> 0031 0032;;;12;N;;;;;
+246C;CIRCLED NUMBER THIRTEEN;No;0;ON;<circle> 0031 0033;;;13;N;;;;;
+246D;CIRCLED NUMBER FOURTEEN;No;0;ON;<circle> 0031 0034;;;14;N;;;;;
+246E;CIRCLED NUMBER FIFTEEN;No;0;ON;<circle> 0031 0035;;;15;N;;;;;
+246F;CIRCLED NUMBER SIXTEEN;No;0;ON;<circle> 0031 0036;;;16;N;;;;;
+2470;CIRCLED NUMBER SEVENTEEN;No;0;ON;<circle> 0031 0037;;;17;N;;;;;
+2471;CIRCLED NUMBER EIGHTEEN;No;0;ON;<circle> 0031 0038;;;18;N;;;;;
+2472;CIRCLED NUMBER NINETEEN;No;0;ON;<circle> 0031 0039;;;19;N;;;;;
+2473;CIRCLED NUMBER TWENTY;No;0;ON;<circle> 0032 0030;;;20;N;;;;;
+2474;PARENTHESIZED DIGIT ONE;No;0;ON;<compat> 0028 0031 0029;;1;1;N;;;;;
+2475;PARENTHESIZED DIGIT TWO;No;0;ON;<compat> 0028 0032 0029;;2;2;N;;;;;
+2476;PARENTHESIZED DIGIT THREE;No;0;ON;<compat> 0028 0033 0029;;3;3;N;;;;;
+2477;PARENTHESIZED DIGIT FOUR;No;0;ON;<compat> 0028 0034 0029;;4;4;N;;;;;
+2478;PARENTHESIZED DIGIT FIVE;No;0;ON;<compat> 0028 0035 0029;;5;5;N;;;;;
+2479;PARENTHESIZED DIGIT SIX;No;0;ON;<compat> 0028 0036 0029;;6;6;N;;;;;
+247A;PARENTHESIZED DIGIT SEVEN;No;0;ON;<compat> 0028 0037 0029;;7;7;N;;;;;
+247B;PARENTHESIZED DIGIT EIGHT;No;0;ON;<compat> 0028 0038 0029;;8;8;N;;;;;
+247C;PARENTHESIZED DIGIT NINE;No;0;ON;<compat> 0028 0039 0029;;9;9;N;;;;;
+247D;PARENTHESIZED NUMBER TEN;No;0;ON;<compat> 0028 0031 0030 0029;;;10;N;;;;;
+247E;PARENTHESIZED NUMBER ELEVEN;No;0;ON;<compat> 0028 0031 0031 0029;;;11;N;;;;;
+247F;PARENTHESIZED NUMBER TWELVE;No;0;ON;<compat> 0028 0031 0032 0029;;;12;N;;;;;
+2480;PARENTHESIZED NUMBER THIRTEEN;No;0;ON;<compat> 0028 0031 0033 0029;;;13;N;;;;;
+2481;PARENTHESIZED NUMBER FOURTEEN;No;0;ON;<compat> 0028 0031 0034 0029;;;14;N;;;;;
+2482;PARENTHESIZED NUMBER FIFTEEN;No;0;ON;<compat> 0028 0031 0035 0029;;;15;N;;;;;
+2483;PARENTHESIZED NUMBER SIXTEEN;No;0;ON;<compat> 0028 0031 0036 0029;;;16;N;;;;;
+2484;PARENTHESIZED NUMBER SEVENTEEN;No;0;ON;<compat> 0028 0031 0037 0029;;;17;N;;;;;
+2485;PARENTHESIZED NUMBER EIGHTEEN;No;0;ON;<compat> 0028 0031 0038 0029;;;18;N;;;;;
+2486;PARENTHESIZED NUMBER NINETEEN;No;0;ON;<compat> 0028 0031 0039 0029;;;19;N;;;;;
+2487;PARENTHESIZED NUMBER TWENTY;No;0;ON;<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;ON;<circle> 0030;;0;0;N;;;;;
+24EB;NEGATIVE CIRCLED NUMBER ELEVEN;No;0;ON;;;;11;N;;;;;
+24EC;NEGATIVE CIRCLED NUMBER TWELVE;No;0;ON;;;;12;N;;;;;
+24ED;NEGATIVE CIRCLED NUMBER THIRTEEN;No;0;ON;;;;13;N;;;;;
+24EE;NEGATIVE CIRCLED NUMBER FOURTEEN;No;0;ON;;;;14;N;;;;;
+24EF;NEGATIVE CIRCLED NUMBER FIFTEEN;No;0;ON;;;;15;N;;;;;
+24F0;NEGATIVE CIRCLED NUMBER SIXTEEN;No;0;ON;;;;16;N;;;;;
+24F1;NEGATIVE CIRCLED NUMBER SEVENTEEN;No;0;ON;;;;17;N;;;;;
+24F2;NEGATIVE CIRCLED NUMBER EIGHTEEN;No;0;ON;;;;18;N;;;;;
+24F3;NEGATIVE CIRCLED NUMBER NINETEEN;No;0;ON;;;;19;N;;;;;
+24F4;NEGATIVE CIRCLED NUMBER TWENTY;No;0;ON;;;;20;N;;;;;
+24F5;DOUBLE CIRCLED DIGIT ONE;No;0;ON;;;1;1;N;;;;;
+24F6;DOUBLE CIRCLED DIGIT TWO;No;0;ON;;;2;2;N;;;;;
+24F7;DOUBLE CIRCLED DIGIT THREE;No;0;ON;;;3;3;N;;;;;
+24F8;DOUBLE CIRCLED DIGIT FOUR;No;0;ON;;;4;4;N;;;;;
+24F9;DOUBLE CIRCLED DIGIT FIVE;No;0;ON;;;5;5;N;;;;;
+24FA;DOUBLE CIRCLED DIGIT SIX;No;0;ON;;;6;6;N;;;;;
+24FB;DOUBLE CIRCLED DIGIT SEVEN;No;0;ON;;;7;7;N;;;;;
+24FC;DOUBLE CIRCLED DIGIT EIGHT;No;0;ON;;;8;8;N;;;;;
+24FD;DOUBLE CIRCLED DIGIT NINE;No;0;ON;;;9;9;N;;;;;
+24FE;DOUBLE CIRCLED NUMBER TEN;No;0;ON;;;;10;N;;;;;
+24FF;NEGATIVE CIRCLED DIGIT ZERO;No;0;ON;;;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;;;;;
+2596;QUADRANT LOWER LEFT;So;0;ON;;;;;N;;;;;
+2597;QUADRANT LOWER RIGHT;So;0;ON;;;;;N;;;;;
+2598;QUADRANT UPPER LEFT;So;0;ON;;;;;N;;;;;
+2599;QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259A;QUADRANT UPPER LEFT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259B;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259C;QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT;So;0;ON;;;;;N;;;;;
+259D;QUADRANT UPPER RIGHT;So;0;ON;;;;;N;;;;;
+259E;QUADRANT UPPER RIGHT AND LOWER LEFT;So;0;ON;;;;;N;;;;;
+259F;QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT;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;;;;;
+25F8;UPPER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25F9;UPPER RIGHT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FA;LOWER LEFT TRIANGLE;Sm;0;ON;;;;;N;;;;;
+25FB;WHITE MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FC;BLACK MEDIUM SQUARE;Sm;0;ON;;;;;N;;;;;
+25FD;WHITE MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FE;BLACK MEDIUM SMALL SQUARE;Sm;0;ON;;;;;N;;;;;
+25FF;LOWER RIGHT TRIANGLE;Sm;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;;;;;
+2614;UMBRELLA WITH RAIN DROPS;So;0;ON;;;;;N;;;;;
+2615;HOT BEVERAGE;So;0;ON;;;;;N;;;;;
+2616;WHITE SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2617;BLACK SHOGI PIECE;So;0;ON;;;;;N;;;;;
+2618;SHAMROCK;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;;;;;
+2672;UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+2673;RECYCLING SYMBOL FOR TYPE-1 PLASTICS;So;0;ON;;;;;N;;pete;;;
+2674;RECYCLING SYMBOL FOR TYPE-2 PLASTICS;So;0;ON;;;;;N;;hdpe;;;
+2675;RECYCLING SYMBOL FOR TYPE-3 PLASTICS;So;0;ON;;;;;N;;pvc;;;
+2676;RECYCLING SYMBOL FOR TYPE-4 PLASTICS;So;0;ON;;;;;N;;ldpe;;;
+2677;RECYCLING SYMBOL FOR TYPE-5 PLASTICS;So;0;ON;;;;;N;;pp;;;
+2678;RECYCLING SYMBOL FOR TYPE-6 PLASTICS;So;0;ON;;;;;N;;ps;;;
+2679;RECYCLING SYMBOL FOR TYPE-7 PLASTICS;So;0;ON;;;;;N;;other;;;
+267A;RECYCLING SYMBOL FOR GENERIC MATERIALS;So;0;ON;;;;;N;;;;;
+267B;BLACK UNIVERSAL RECYCLING SYMBOL;So;0;ON;;;;;N;;;;;
+267C;RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267D;PARTIALLY-RECYCLED PAPER SYMBOL;So;0;ON;;;;;N;;;;;
+267E;PERMANENT PAPER SIGN;So;0;ON;;;;;N;;;;;
+267F;WHEELCHAIR SYMBOL;So;0;ON;;;;;N;;;;;
+2680;DIE FACE-1;So;0;ON;;;;;N;;;;;
+2681;DIE FACE-2;So;0;ON;;;;;N;;;;;
+2682;DIE FACE-3;So;0;ON;;;;;N;;;;;
+2683;DIE FACE-4;So;0;ON;;;;;N;;;;;
+2684;DIE FACE-5;So;0;ON;;;;;N;;;;;
+2685;DIE FACE-6;So;0;ON;;;;;N;;;;;
+2686;WHITE CIRCLE WITH DOT RIGHT;So;0;ON;;;;;N;;;;;
+2687;WHITE CIRCLE WITH TWO DOTS;So;0;ON;;;;;N;;;;;
+2688;BLACK CIRCLE WITH WHITE DOT RIGHT;So;0;ON;;;;;N;;;;;
+2689;BLACK CIRCLE WITH TWO WHITE DOTS;So;0;ON;;;;;N;;;;;
+268A;MONOGRAM FOR YANG;So;0;ON;;;;;N;;;;;
+268B;MONOGRAM FOR YIN;So;0;ON;;;;;N;;;;;
+268C;DIGRAM FOR GREATER YANG;So;0;ON;;;;;N;;;;;
+268D;DIGRAM FOR LESSER YIN;So;0;ON;;;;;N;;;;;
+268E;DIGRAM FOR LESSER YANG;So;0;ON;;;;;N;;;;;
+268F;DIGRAM FOR GREATER YIN;So;0;ON;;;;;N;;;;;
+2690;WHITE FLAG;So;0;ON;;;;;N;;;;;
+2691;BLACK FLAG;So;0;ON;;;;;N;;;;;
+2692;HAMMER AND PICK;So;0;ON;;;;;N;;;;;
+2693;ANCHOR;So;0;ON;;;;;N;;;;;
+2694;CROSSED SWORDS;So;0;ON;;;;;N;;;;;
+2695;STAFF OF AESCULAPIUS;So;0;ON;;;;;N;;;;;
+2696;SCALES;So;0;ON;;;;;N;;;;;
+2697;ALEMBIC;So;0;ON;;;;;N;;;;;
+2698;FLOWER;So;0;ON;;;;;N;;;;;
+2699;GEAR;So;0;ON;;;;;N;;;;;
+269A;STAFF OF HERMES;So;0;ON;;;;;N;;;;;
+269B;ATOM SYMBOL;So;0;ON;;;;;N;;;;;
+269C;FLEUR-DE-LIS;So;0;ON;;;;;N;;;;;
+26A0;WARNING SIGN;So;0;ON;;;;;N;;;;;
+26A1;HIGH VOLTAGE SIGN;So;0;ON;;;;;N;;;;;
+26A2;DOUBLED FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A3;DOUBLED MALE SIGN;So;0;ON;;;;;N;;;;;
+26A4;INTERLOCKED FEMALE AND MALE SIGN;So;0;ON;;;;;N;;;;;
+26A5;MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A6;MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A7;MALE WITH STROKE AND MALE AND FEMALE SIGN;So;0;ON;;;;;N;;;;;
+26A8;VERTICAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26A9;HORIZONTAL MALE WITH STROKE SIGN;So;0;ON;;;;;N;;;;;
+26AA;MEDIUM WHITE CIRCLE;So;0;ON;;;;;N;;;;;
+26AB;MEDIUM BLACK CIRCLE;So;0;ON;;;;;N;;;;;
+26AC;MEDIUM SMALL WHITE CIRCLE;So;0;L;;;;;N;;;;;
+26AD;MARRIAGE SYMBOL;So;0;ON;;;;;N;;;;;
+26AE;DIVORCE SYMBOL;So;0;ON;;;;;N;;;;;
+26AF;UNMARRIED PARTNERSHIP SYMBOL;So;0;ON;;;;;N;;;;;
+26B0;COFFIN;So;0;ON;;;;;N;;;;;
+26B1;FUNERAL URN;So;0;ON;;;;;N;;;;;
+26B2;NEUTER;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;;;;;
+2768;MEDIUM LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2769;MEDIUM RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276A;MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276B;MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276C;MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276D;MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+276E;HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+276F;HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2770;HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2771;HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2772;LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2773;LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+2774;MEDIUM LEFT CURLY BRACKET ORNAMENT;Ps;0;ON;;;;;Y;;;;;
+2775;MEDIUM RIGHT CURLY BRACKET ORNAMENT;Pe;0;ON;;;;;Y;;;;;
+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;;;;
+27C0;THREE DIMENSIONAL ANGLE;Sm;0;ON;;;;;Y;;;;;
+27C1;WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE;Sm;0;ON;;;;;N;;;;;
+27C2;PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+27C3;OPEN SUBSET;Sm;0;ON;;;;;Y;;;;;
+27C4;OPEN SUPERSET;Sm;0;ON;;;;;Y;;;;;
+27C5;LEFT S-SHAPED BAG DELIMITER;Ps;0;ON;;;;;Y;;;;;
+27C6;RIGHT S-SHAPED BAG DELIMITER;Pe;0;ON;;;;;Y;;;;;
+27C7;OR WITH DOT INSIDE;Sm;0;ON;;;;;N;;;;;
+27C8;REVERSE SOLIDUS PRECEDING SUBSET;Sm;0;ON;;;;;N;;;;;
+27C9;SUPERSET PRECEDING SOLIDUS;Sm;0;ON;;;;;N;;;;;
+27CA;VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+27D0;WHITE DIAMOND WITH CENTRED DOT;Sm;0;ON;;;;;N;;;;;
+27D1;AND WITH DOT;Sm;0;ON;;;;;N;;;;;
+27D2;ELEMENT OF OPENING UPWARDS;Sm;0;ON;;;;;N;;;;;
+27D3;LOWER RIGHT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D4;UPPER LEFT CORNER WITH DOT;Sm;0;ON;;;;;Y;;;;;
+27D5;LEFT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D6;RIGHT OUTER JOIN;Sm;0;ON;;;;;Y;;;;;
+27D7;FULL OUTER JOIN;Sm;0;ON;;;;;N;;;;;
+27D8;LARGE UP TACK;Sm;0;ON;;;;;N;;;;;
+27D9;LARGE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+27DA;LEFT AND RIGHT DOUBLE TURNSTILE;Sm;0;ON;;;;;N;;;;;
+27DB;LEFT AND RIGHT TACK;Sm;0;ON;;;;;N;;;;;
+27DC;LEFT MULTIMAP;Sm;0;ON;;;;;Y;;;;;
+27DD;LONG RIGHT TACK;Sm;0;ON;;;;;Y;;;;;
+27DE;LONG LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+27DF;UP TACK WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+27E0;LOZENGE DIVIDED BY HORIZONTAL RULE;Sm;0;ON;;;;;N;;;;;
+27E1;WHITE CONCAVE-SIDED DIAMOND;Sm;0;ON;;;;;N;;;;;
+27E2;WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E3;WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E4;WHITE SQUARE WITH LEFTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E5;WHITE SQUARE WITH RIGHTWARDS TICK;Sm;0;ON;;;;;Y;;;;;
+27E6;MATHEMATICAL LEFT WHITE SQUARE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E7;MATHEMATICAL RIGHT WHITE SQUARE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27E8;MATHEMATICAL LEFT ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27E9;MATHEMATICAL RIGHT ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27EA;MATHEMATICAL LEFT DOUBLE ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+27EB;MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+27F0;UPWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F1;DOWNWARDS QUADRUPLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F2;ANTICLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F3;CLOCKWISE GAPPED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F4;RIGHT ARROW WITH CIRCLED PLUS;Sm;0;ON;;;;;N;;;;;
+27F5;LONG LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F6;LONG RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+27F7;LONG LEFT RIGHT ARROW;Sm;0;ON;;;;;N;;;;;
+27F8;LONG LEFTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27F9;LONG RIGHTWARDS DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FA;LONG LEFT RIGHT DOUBLE ARROW;Sm;0;ON;;;;;N;;;;;
+27FB;LONG LEFTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FC;LONG RIGHTWARDS ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FD;LONG LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FE;LONG RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+27FF;LONG RIGHTWARDS SQUIGGLE ARROW;Sm;0;ON;;;;;N;;;;;
+2800;BRAILLE PATTERN BLANK;So;0;L;;;;;N;;;;;
+2801;BRAILLE PATTERN DOTS-1;So;0;L;;;;;N;;;;;
+2802;BRAILLE PATTERN DOTS-2;So;0;L;;;;;N;;;;;
+2803;BRAILLE PATTERN DOTS-12;So;0;L;;;;;N;;;;;
+2804;BRAILLE PATTERN DOTS-3;So;0;L;;;;;N;;;;;
+2805;BRAILLE PATTERN DOTS-13;So;0;L;;;;;N;;;;;
+2806;BRAILLE PATTERN DOTS-23;So;0;L;;;;;N;;;;;
+2807;BRAILLE PATTERN DOTS-123;So;0;L;;;;;N;;;;;
+2808;BRAILLE PATTERN DOTS-4;So;0;L;;;;;N;;;;;
+2809;BRAILLE PATTERN DOTS-14;So;0;L;;;;;N;;;;;
+280A;BRAILLE PATTERN DOTS-24;So;0;L;;;;;N;;;;;
+280B;BRAILLE PATTERN DOTS-124;So;0;L;;;;;N;;;;;
+280C;BRAILLE PATTERN DOTS-34;So;0;L;;;;;N;;;;;
+280D;BRAILLE PATTERN DOTS-134;So;0;L;;;;;N;;;;;
+280E;BRAILLE PATTERN DOTS-234;So;0;L;;;;;N;;;;;
+280F;BRAILLE PATTERN DOTS-1234;So;0;L;;;;;N;;;;;
+2810;BRAILLE PATTERN DOTS-5;So;0;L;;;;;N;;;;;
+2811;BRAILLE PATTERN DOTS-15;So;0;L;;;;;N;;;;;
+2812;BRAILLE PATTERN DOTS-25;So;0;L;;;;;N;;;;;
+2813;BRAILLE PATTERN DOTS-125;So;0;L;;;;;N;;;;;
+2814;BRAILLE PATTERN DOTS-35;So;0;L;;;;;N;;;;;
+2815;BRAILLE PATTERN DOTS-135;So;0;L;;;;;N;;;;;
+2816;BRAILLE PATTERN DOTS-235;So;0;L;;;;;N;;;;;
+2817;BRAILLE PATTERN DOTS-1235;So;0;L;;;;;N;;;;;
+2818;BRAILLE PATTERN DOTS-45;So;0;L;;;;;N;;;;;
+2819;BRAILLE PATTERN DOTS-145;So;0;L;;;;;N;;;;;
+281A;BRAILLE PATTERN DOTS-245;So;0;L;;;;;N;;;;;
+281B;BRAILLE PATTERN DOTS-1245;So;0;L;;;;;N;;;;;
+281C;BRAILLE PATTERN DOTS-345;So;0;L;;;;;N;;;;;
+281D;BRAILLE PATTERN DOTS-1345;So;0;L;;;;;N;;;;;
+281E;BRAILLE PATTERN DOTS-2345;So;0;L;;;;;N;;;;;
+281F;BRAILLE PATTERN DOTS-12345;So;0;L;;;;;N;;;;;
+2820;BRAILLE PATTERN DOTS-6;So;0;L;;;;;N;;;;;
+2821;BRAILLE PATTERN DOTS-16;So;0;L;;;;;N;;;;;
+2822;BRAILLE PATTERN DOTS-26;So;0;L;;;;;N;;;;;
+2823;BRAILLE PATTERN DOTS-126;So;0;L;;;;;N;;;;;
+2824;BRAILLE PATTERN DOTS-36;So;0;L;;;;;N;;;;;
+2825;BRAILLE PATTERN DOTS-136;So;0;L;;;;;N;;;;;
+2826;BRAILLE PATTERN DOTS-236;So;0;L;;;;;N;;;;;
+2827;BRAILLE PATTERN DOTS-1236;So;0;L;;;;;N;;;;;
+2828;BRAILLE PATTERN DOTS-46;So;0;L;;;;;N;;;;;
+2829;BRAILLE PATTERN DOTS-146;So;0;L;;;;;N;;;;;
+282A;BRAILLE PATTERN DOTS-246;So;0;L;;;;;N;;;;;
+282B;BRAILLE PATTERN DOTS-1246;So;0;L;;;;;N;;;;;
+282C;BRAILLE PATTERN DOTS-346;So;0;L;;;;;N;;;;;
+282D;BRAILLE PATTERN DOTS-1346;So;0;L;;;;;N;;;;;
+282E;BRAILLE PATTERN DOTS-2346;So;0;L;;;;;N;;;;;
+282F;BRAILLE PATTERN DOTS-12346;So;0;L;;;;;N;;;;;
+2830;BRAILLE PATTERN DOTS-56;So;0;L;;;;;N;;;;;
+2831;BRAILLE PATTERN DOTS-156;So;0;L;;;;;N;;;;;
+2832;BRAILLE PATTERN DOTS-256;So;0;L;;;;;N;;;;;
+2833;BRAILLE PATTERN DOTS-1256;So;0;L;;;;;N;;;;;
+2834;BRAILLE PATTERN DOTS-356;So;0;L;;;;;N;;;;;
+2835;BRAILLE PATTERN DOTS-1356;So;0;L;;;;;N;;;;;
+2836;BRAILLE PATTERN DOTS-2356;So;0;L;;;;;N;;;;;
+2837;BRAILLE PATTERN DOTS-12356;So;0;L;;;;;N;;;;;
+2838;BRAILLE PATTERN DOTS-456;So;0;L;;;;;N;;;;;
+2839;BRAILLE PATTERN DOTS-1456;So;0;L;;;;;N;;;;;
+283A;BRAILLE PATTERN DOTS-2456;So;0;L;;;;;N;;;;;
+283B;BRAILLE PATTERN DOTS-12456;So;0;L;;;;;N;;;;;
+283C;BRAILLE PATTERN DOTS-3456;So;0;L;;;;;N;;;;;
+283D;BRAILLE PATTERN DOTS-13456;So;0;L;;;;;N;;;;;
+283E;BRAILLE PATTERN DOTS-23456;So;0;L;;;;;N;;;;;
+283F;BRAILLE PATTERN DOTS-123456;So;0;L;;;;;N;;;;;
+2840;BRAILLE PATTERN DOTS-7;So;0;L;;;;;N;;;;;
+2841;BRAILLE PATTERN DOTS-17;So;0;L;;;;;N;;;;;
+2842;BRAILLE PATTERN DOTS-27;So;0;L;;;;;N;;;;;
+2843;BRAILLE PATTERN DOTS-127;So;0;L;;;;;N;;;;;
+2844;BRAILLE PATTERN DOTS-37;So;0;L;;;;;N;;;;;
+2845;BRAILLE PATTERN DOTS-137;So;0;L;;;;;N;;;;;
+2846;BRAILLE PATTERN DOTS-237;So;0;L;;;;;N;;;;;
+2847;BRAILLE PATTERN DOTS-1237;So;0;L;;;;;N;;;;;
+2848;BRAILLE PATTERN DOTS-47;So;0;L;;;;;N;;;;;
+2849;BRAILLE PATTERN DOTS-147;So;0;L;;;;;N;;;;;
+284A;BRAILLE PATTERN DOTS-247;So;0;L;;;;;N;;;;;
+284B;BRAILLE PATTERN DOTS-1247;So;0;L;;;;;N;;;;;
+284C;BRAILLE PATTERN DOTS-347;So;0;L;;;;;N;;;;;
+284D;BRAILLE PATTERN DOTS-1347;So;0;L;;;;;N;;;;;
+284E;BRAILLE PATTERN DOTS-2347;So;0;L;;;;;N;;;;;
+284F;BRAILLE PATTERN DOTS-12347;So;0;L;;;;;N;;;;;
+2850;BRAILLE PATTERN DOTS-57;So;0;L;;;;;N;;;;;
+2851;BRAILLE PATTERN DOTS-157;So;0;L;;;;;N;;;;;
+2852;BRAILLE PATTERN DOTS-257;So;0;L;;;;;N;;;;;
+2853;BRAILLE PATTERN DOTS-1257;So;0;L;;;;;N;;;;;
+2854;BRAILLE PATTERN DOTS-357;So;0;L;;;;;N;;;;;
+2855;BRAILLE PATTERN DOTS-1357;So;0;L;;;;;N;;;;;
+2856;BRAILLE PATTERN DOTS-2357;So;0;L;;;;;N;;;;;
+2857;BRAILLE PATTERN DOTS-12357;So;0;L;;;;;N;;;;;
+2858;BRAILLE PATTERN DOTS-457;So;0;L;;;;;N;;;;;
+2859;BRAILLE PATTERN DOTS-1457;So;0;L;;;;;N;;;;;
+285A;BRAILLE PATTERN DOTS-2457;So;0;L;;;;;N;;;;;
+285B;BRAILLE PATTERN DOTS-12457;So;0;L;;;;;N;;;;;
+285C;BRAILLE PATTERN DOTS-3457;So;0;L;;;;;N;;;;;
+285D;BRAILLE PATTERN DOTS-13457;So;0;L;;;;;N;;;;;
+285E;BRAILLE PATTERN DOTS-23457;So;0;L;;;;;N;;;;;
+285F;BRAILLE PATTERN DOTS-123457;So;0;L;;;;;N;;;;;
+2860;BRAILLE PATTERN DOTS-67;So;0;L;;;;;N;;;;;
+2861;BRAILLE PATTERN DOTS-167;So;0;L;;;;;N;;;;;
+2862;BRAILLE PATTERN DOTS-267;So;0;L;;;;;N;;;;;
+2863;BRAILLE PATTERN DOTS-1267;So;0;L;;;;;N;;;;;
+2864;BRAILLE PATTERN DOTS-367;So;0;L;;;;;N;;;;;
+2865;BRAILLE PATTERN DOTS-1367;So;0;L;;;;;N;;;;;
+2866;BRAILLE PATTERN DOTS-2367;So;0;L;;;;;N;;;;;
+2867;BRAILLE PATTERN DOTS-12367;So;0;L;;;;;N;;;;;
+2868;BRAILLE PATTERN DOTS-467;So;0;L;;;;;N;;;;;
+2869;BRAILLE PATTERN DOTS-1467;So;0;L;;;;;N;;;;;
+286A;BRAILLE PATTERN DOTS-2467;So;0;L;;;;;N;;;;;
+286B;BRAILLE PATTERN DOTS-12467;So;0;L;;;;;N;;;;;
+286C;BRAILLE PATTERN DOTS-3467;So;0;L;;;;;N;;;;;
+286D;BRAILLE PATTERN DOTS-13467;So;0;L;;;;;N;;;;;
+286E;BRAILLE PATTERN DOTS-23467;So;0;L;;;;;N;;;;;
+286F;BRAILLE PATTERN DOTS-123467;So;0;L;;;;;N;;;;;
+2870;BRAILLE PATTERN DOTS-567;So;0;L;;;;;N;;;;;
+2871;BRAILLE PATTERN DOTS-1567;So;0;L;;;;;N;;;;;
+2872;BRAILLE PATTERN DOTS-2567;So;0;L;;;;;N;;;;;
+2873;BRAILLE PATTERN DOTS-12567;So;0;L;;;;;N;;;;;
+2874;BRAILLE PATTERN DOTS-3567;So;0;L;;;;;N;;;;;
+2875;BRAILLE PATTERN DOTS-13567;So;0;L;;;;;N;;;;;
+2876;BRAILLE PATTERN DOTS-23567;So;0;L;;;;;N;;;;;
+2877;BRAILLE PATTERN DOTS-123567;So;0;L;;;;;N;;;;;
+2878;BRAILLE PATTERN DOTS-4567;So;0;L;;;;;N;;;;;
+2879;BRAILLE PATTERN DOTS-14567;So;0;L;;;;;N;;;;;
+287A;BRAILLE PATTERN DOTS-24567;So;0;L;;;;;N;;;;;
+287B;BRAILLE PATTERN DOTS-124567;So;0;L;;;;;N;;;;;
+287C;BRAILLE PATTERN DOTS-34567;So;0;L;;;;;N;;;;;
+287D;BRAILLE PATTERN DOTS-134567;So;0;L;;;;;N;;;;;
+287E;BRAILLE PATTERN DOTS-234567;So;0;L;;;;;N;;;;;
+287F;BRAILLE PATTERN DOTS-1234567;So;0;L;;;;;N;;;;;
+2880;BRAILLE PATTERN DOTS-8;So;0;L;;;;;N;;;;;
+2881;BRAILLE PATTERN DOTS-18;So;0;L;;;;;N;;;;;
+2882;BRAILLE PATTERN DOTS-28;So;0;L;;;;;N;;;;;
+2883;BRAILLE PATTERN DOTS-128;So;0;L;;;;;N;;;;;
+2884;BRAILLE PATTERN DOTS-38;So;0;L;;;;;N;;;;;
+2885;BRAILLE PATTERN DOTS-138;So;0;L;;;;;N;;;;;
+2886;BRAILLE PATTERN DOTS-238;So;0;L;;;;;N;;;;;
+2887;BRAILLE PATTERN DOTS-1238;So;0;L;;;;;N;;;;;
+2888;BRAILLE PATTERN DOTS-48;So;0;L;;;;;N;;;;;
+2889;BRAILLE PATTERN DOTS-148;So;0;L;;;;;N;;;;;
+288A;BRAILLE PATTERN DOTS-248;So;0;L;;;;;N;;;;;
+288B;BRAILLE PATTERN DOTS-1248;So;0;L;;;;;N;;;;;
+288C;BRAILLE PATTERN DOTS-348;So;0;L;;;;;N;;;;;
+288D;BRAILLE PATTERN DOTS-1348;So;0;L;;;;;N;;;;;
+288E;BRAILLE PATTERN DOTS-2348;So;0;L;;;;;N;;;;;
+288F;BRAILLE PATTERN DOTS-12348;So;0;L;;;;;N;;;;;
+2890;BRAILLE PATTERN DOTS-58;So;0;L;;;;;N;;;;;
+2891;BRAILLE PATTERN DOTS-158;So;0;L;;;;;N;;;;;
+2892;BRAILLE PATTERN DOTS-258;So;0;L;;;;;N;;;;;
+2893;BRAILLE PATTERN DOTS-1258;So;0;L;;;;;N;;;;;
+2894;BRAILLE PATTERN DOTS-358;So;0;L;;;;;N;;;;;
+2895;BRAILLE PATTERN DOTS-1358;So;0;L;;;;;N;;;;;
+2896;BRAILLE PATTERN DOTS-2358;So;0;L;;;;;N;;;;;
+2897;BRAILLE PATTERN DOTS-12358;So;0;L;;;;;N;;;;;
+2898;BRAILLE PATTERN DOTS-458;So;0;L;;;;;N;;;;;
+2899;BRAILLE PATTERN DOTS-1458;So;0;L;;;;;N;;;;;
+289A;BRAILLE PATTERN DOTS-2458;So;0;L;;;;;N;;;;;
+289B;BRAILLE PATTERN DOTS-12458;So;0;L;;;;;N;;;;;
+289C;BRAILLE PATTERN DOTS-3458;So;0;L;;;;;N;;;;;
+289D;BRAILLE PATTERN DOTS-13458;So;0;L;;;;;N;;;;;
+289E;BRAILLE PATTERN DOTS-23458;So;0;L;;;;;N;;;;;
+289F;BRAILLE PATTERN DOTS-123458;So;0;L;;;;;N;;;;;
+28A0;BRAILLE PATTERN DOTS-68;So;0;L;;;;;N;;;;;
+28A1;BRAILLE PATTERN DOTS-168;So;0;L;;;;;N;;;;;
+28A2;BRAILLE PATTERN DOTS-268;So;0;L;;;;;N;;;;;
+28A3;BRAILLE PATTERN DOTS-1268;So;0;L;;;;;N;;;;;
+28A4;BRAILLE PATTERN DOTS-368;So;0;L;;;;;N;;;;;
+28A5;BRAILLE PATTERN DOTS-1368;So;0;L;;;;;N;;;;;
+28A6;BRAILLE PATTERN DOTS-2368;So;0;L;;;;;N;;;;;
+28A7;BRAILLE PATTERN DOTS-12368;So;0;L;;;;;N;;;;;
+28A8;BRAILLE PATTERN DOTS-468;So;0;L;;;;;N;;;;;
+28A9;BRAILLE PATTERN DOTS-1468;So;0;L;;;;;N;;;;;
+28AA;BRAILLE PATTERN DOTS-2468;So;0;L;;;;;N;;;;;
+28AB;BRAILLE PATTERN DOTS-12468;So;0;L;;;;;N;;;;;
+28AC;BRAILLE PATTERN DOTS-3468;So;0;L;;;;;N;;;;;
+28AD;BRAILLE PATTERN DOTS-13468;So;0;L;;;;;N;;;;;
+28AE;BRAILLE PATTERN DOTS-23468;So;0;L;;;;;N;;;;;
+28AF;BRAILLE PATTERN DOTS-123468;So;0;L;;;;;N;;;;;
+28B0;BRAILLE PATTERN DOTS-568;So;0;L;;;;;N;;;;;
+28B1;BRAILLE PATTERN DOTS-1568;So;0;L;;;;;N;;;;;
+28B2;BRAILLE PATTERN DOTS-2568;So;0;L;;;;;N;;;;;
+28B3;BRAILLE PATTERN DOTS-12568;So;0;L;;;;;N;;;;;
+28B4;BRAILLE PATTERN DOTS-3568;So;0;L;;;;;N;;;;;
+28B5;BRAILLE PATTERN DOTS-13568;So;0;L;;;;;N;;;;;
+28B6;BRAILLE PATTERN DOTS-23568;So;0;L;;;;;N;;;;;
+28B7;BRAILLE PATTERN DOTS-123568;So;0;L;;;;;N;;;;;
+28B8;BRAILLE PATTERN DOTS-4568;So;0;L;;;;;N;;;;;
+28B9;BRAILLE PATTERN DOTS-14568;So;0;L;;;;;N;;;;;
+28BA;BRAILLE PATTERN DOTS-24568;So;0;L;;;;;N;;;;;
+28BB;BRAILLE PATTERN DOTS-124568;So;0;L;;;;;N;;;;;
+28BC;BRAILLE PATTERN DOTS-34568;So;0;L;;;;;N;;;;;
+28BD;BRAILLE PATTERN DOTS-134568;So;0;L;;;;;N;;;;;
+28BE;BRAILLE PATTERN DOTS-234568;So;0;L;;;;;N;;;;;
+28BF;BRAILLE PATTERN DOTS-1234568;So;0;L;;;;;N;;;;;
+28C0;BRAILLE PATTERN DOTS-78;So;0;L;;;;;N;;;;;
+28C1;BRAILLE PATTERN DOTS-178;So;0;L;;;;;N;;;;;
+28C2;BRAILLE PATTERN DOTS-278;So;0;L;;;;;N;;;;;
+28C3;BRAILLE PATTERN DOTS-1278;So;0;L;;;;;N;;;;;
+28C4;BRAILLE PATTERN DOTS-378;So;0;L;;;;;N;;;;;
+28C5;BRAILLE PATTERN DOTS-1378;So;0;L;;;;;N;;;;;
+28C6;BRAILLE PATTERN DOTS-2378;So;0;L;;;;;N;;;;;
+28C7;BRAILLE PATTERN DOTS-12378;So;0;L;;;;;N;;;;;
+28C8;BRAILLE PATTERN DOTS-478;So;0;L;;;;;N;;;;;
+28C9;BRAILLE PATTERN DOTS-1478;So;0;L;;;;;N;;;;;
+28CA;BRAILLE PATTERN DOTS-2478;So;0;L;;;;;N;;;;;
+28CB;BRAILLE PATTERN DOTS-12478;So;0;L;;;;;N;;;;;
+28CC;BRAILLE PATTERN DOTS-3478;So;0;L;;;;;N;;;;;
+28CD;BRAILLE PATTERN DOTS-13478;So;0;L;;;;;N;;;;;
+28CE;BRAILLE PATTERN DOTS-23478;So;0;L;;;;;N;;;;;
+28CF;BRAILLE PATTERN DOTS-123478;So;0;L;;;;;N;;;;;
+28D0;BRAILLE PATTERN DOTS-578;So;0;L;;;;;N;;;;;
+28D1;BRAILLE PATTERN DOTS-1578;So;0;L;;;;;N;;;;;
+28D2;BRAILLE PATTERN DOTS-2578;So;0;L;;;;;N;;;;;
+28D3;BRAILLE PATTERN DOTS-12578;So;0;L;;;;;N;;;;;
+28D4;BRAILLE PATTERN DOTS-3578;So;0;L;;;;;N;;;;;
+28D5;BRAILLE PATTERN DOTS-13578;So;0;L;;;;;N;;;;;
+28D6;BRAILLE PATTERN DOTS-23578;So;0;L;;;;;N;;;;;
+28D7;BRAILLE PATTERN DOTS-123578;So;0;L;;;;;N;;;;;
+28D8;BRAILLE PATTERN DOTS-4578;So;0;L;;;;;N;;;;;
+28D9;BRAILLE PATTERN DOTS-14578;So;0;L;;;;;N;;;;;
+28DA;BRAILLE PATTERN DOTS-24578;So;0;L;;;;;N;;;;;
+28DB;BRAILLE PATTERN DOTS-124578;So;0;L;;;;;N;;;;;
+28DC;BRAILLE PATTERN DOTS-34578;So;0;L;;;;;N;;;;;
+28DD;BRAILLE PATTERN DOTS-134578;So;0;L;;;;;N;;;;;
+28DE;BRAILLE PATTERN DOTS-234578;So;0;L;;;;;N;;;;;
+28DF;BRAILLE PATTERN DOTS-1234578;So;0;L;;;;;N;;;;;
+28E0;BRAILLE PATTERN DOTS-678;So;0;L;;;;;N;;;;;
+28E1;BRAILLE PATTERN DOTS-1678;So;0;L;;;;;N;;;;;
+28E2;BRAILLE PATTERN DOTS-2678;So;0;L;;;;;N;;;;;
+28E3;BRAILLE PATTERN DOTS-12678;So;0;L;;;;;N;;;;;
+28E4;BRAILLE PATTERN DOTS-3678;So;0;L;;;;;N;;;;;
+28E5;BRAILLE PATTERN DOTS-13678;So;0;L;;;;;N;;;;;
+28E6;BRAILLE PATTERN DOTS-23678;So;0;L;;;;;N;;;;;
+28E7;BRAILLE PATTERN DOTS-123678;So;0;L;;;;;N;;;;;
+28E8;BRAILLE PATTERN DOTS-4678;So;0;L;;;;;N;;;;;
+28E9;BRAILLE PATTERN DOTS-14678;So;0;L;;;;;N;;;;;
+28EA;BRAILLE PATTERN DOTS-24678;So;0;L;;;;;N;;;;;
+28EB;BRAILLE PATTERN DOTS-124678;So;0;L;;;;;N;;;;;
+28EC;BRAILLE PATTERN DOTS-34678;So;0;L;;;;;N;;;;;
+28ED;BRAILLE PATTERN DOTS-134678;So;0;L;;;;;N;;;;;
+28EE;BRAILLE PATTERN DOTS-234678;So;0;L;;;;;N;;;;;
+28EF;BRAILLE PATTERN DOTS-1234678;So;0;L;;;;;N;;;;;
+28F0;BRAILLE PATTERN DOTS-5678;So;0;L;;;;;N;;;;;
+28F1;BRAILLE PATTERN DOTS-15678;So;0;L;;;;;N;;;;;
+28F2;BRAILLE PATTERN DOTS-25678;So;0;L;;;;;N;;;;;
+28F3;BRAILLE PATTERN DOTS-125678;So;0;L;;;;;N;;;;;
+28F4;BRAILLE PATTERN DOTS-35678;So;0;L;;;;;N;;;;;
+28F5;BRAILLE PATTERN DOTS-135678;So;0;L;;;;;N;;;;;
+28F6;BRAILLE PATTERN DOTS-235678;So;0;L;;;;;N;;;;;
+28F7;BRAILLE PATTERN DOTS-1235678;So;0;L;;;;;N;;;;;
+28F8;BRAILLE PATTERN DOTS-45678;So;0;L;;;;;N;;;;;
+28F9;BRAILLE PATTERN DOTS-145678;So;0;L;;;;;N;;;;;
+28FA;BRAILLE PATTERN DOTS-245678;So;0;L;;;;;N;;;;;
+28FB;BRAILLE PATTERN DOTS-1245678;So;0;L;;;;;N;;;;;
+28FC;BRAILLE PATTERN DOTS-345678;So;0;L;;;;;N;;;;;
+28FD;BRAILLE PATTERN DOTS-1345678;So;0;L;;;;;N;;;;;
+28FE;BRAILLE PATTERN DOTS-2345678;So;0;L;;;;;N;;;;;
+28FF;BRAILLE PATTERN DOTS-12345678;So;0;L;;;;;N;;;;;
+2900;RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2901;RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2902;LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2903;RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2904;LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2905;RIGHTWARDS TWO-HEADED ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2906;LEFTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2907;RIGHTWARDS DOUBLE ARROW FROM BAR;Sm;0;ON;;;;;N;;;;;
+2908;DOWNWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2909;UPWARDS ARROW WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+290A;UPWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290B;DOWNWARDS TRIPLE ARROW;Sm;0;ON;;;;;N;;;;;
+290C;LEFTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290D;RIGHTWARDS DOUBLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290E;LEFTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+290F;RIGHTWARDS TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2910;RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW;Sm;0;ON;;;;;N;;;;;
+2911;RIGHTWARDS ARROW WITH DOTTED STEM;Sm;0;ON;;;;;N;;;;;
+2912;UPWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2913;DOWNWARDS ARROW TO BAR;Sm;0;ON;;;;;N;;;;;
+2914;RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2915;RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2916;RIGHTWARDS TWO-HEADED ARROW WITH TAIL;Sm;0;ON;;;;;N;;;;;
+2917;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2918;RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2919;LEFTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291A;RIGHTWARDS ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291B;LEFTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291C;RIGHTWARDS DOUBLE ARROW-TAIL;Sm;0;ON;;;;;N;;;;;
+291D;LEFTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291E;RIGHTWARDS ARROW TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+291F;LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2920;RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+2921;NORTH WEST AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2922;NORTH EAST AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2923;NORTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2924;NORTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2925;SOUTH EAST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2926;SOUTH WEST ARROW WITH HOOK;Sm;0;ON;;;;;N;;;;;
+2927;NORTH WEST ARROW AND NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2928;NORTH EAST ARROW AND SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2929;SOUTH EAST ARROW AND SOUTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292A;SOUTH WEST ARROW AND NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+292B;RISING DIAGONAL CROSSING FALLING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292C;FALLING DIAGONAL CROSSING RISING DIAGONAL;Sm;0;ON;;;;;N;;;;;
+292D;SOUTH EAST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292E;NORTH EAST ARROW CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+292F;FALLING DIAGONAL CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2930;RISING DIAGONAL CROSSING SOUTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2931;NORTH EAST ARROW CROSSING NORTH WEST ARROW;Sm;0;ON;;;;;N;;;;;
+2932;NORTH WEST ARROW CROSSING NORTH EAST ARROW;Sm;0;ON;;;;;N;;;;;
+2933;WAVE ARROW POINTING DIRECTLY RIGHT;Sm;0;ON;;;;;N;;;;;
+2934;ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS;Sm;0;ON;;;;;N;;;;;
+2935;ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2936;ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS;Sm;0;ON;;;;;N;;;;;
+2937;ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS;Sm;0;ON;;;;;N;;;;;
+2938;RIGHT-SIDE ARC CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2939;LEFT-SIDE ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293A;TOP ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293B;BOTTOM ARC ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293C;TOP ARC CLOCKWISE ARROW WITH MINUS;Sm;0;ON;;;;;N;;;;;
+293D;TOP ARC ANTICLOCKWISE ARROW WITH PLUS;Sm;0;ON;;;;;N;;;;;
+293E;LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+293F;LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW;Sm;0;ON;;;;;N;;;;;
+2940;ANTICLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2941;CLOCKWISE CLOSED CIRCLE ARROW;Sm;0;ON;;;;;N;;;;;
+2942;RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2943;LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2944;SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2945;RIGHTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2946;LEFTWARDS ARROW WITH PLUS BELOW;Sm;0;ON;;;;;N;;;;;
+2947;RIGHTWARDS ARROW THROUGH X;Sm;0;ON;;;;;N;;;;;
+2948;LEFT RIGHT ARROW THROUGH SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+2949;UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+294A;LEFT BARB UP RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+294B;LEFT BARB DOWN RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294C;UP BARB RIGHT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+294D;UP BARB LEFT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+294E;LEFT BARB UP RIGHT BARB UP HARPOON;Sm;0;ON;;;;;N;;;;;
+294F;UP BARB RIGHT DOWN BARB RIGHT HARPOON;Sm;0;ON;;;;;N;;;;;
+2950;LEFT BARB DOWN RIGHT BARB DOWN HARPOON;Sm;0;ON;;;;;N;;;;;
+2951;UP BARB LEFT DOWN BARB LEFT HARPOON;Sm;0;ON;;;;;N;;;;;
+2952;LEFTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2953;RIGHTWARDS HARPOON WITH BARB UP TO BAR;Sm;0;ON;;;;;N;;;;;
+2954;UPWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2955;DOWNWARDS HARPOON WITH BARB RIGHT TO BAR;Sm;0;ON;;;;;N;;;;;
+2956;LEFTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2957;RIGHTWARDS HARPOON WITH BARB DOWN TO BAR;Sm;0;ON;;;;;N;;;;;
+2958;UPWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+2959;DOWNWARDS HARPOON WITH BARB LEFT TO BAR;Sm;0;ON;;;;;N;;;;;
+295A;LEFTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295B;RIGHTWARDS HARPOON WITH BARB UP FROM BAR;Sm;0;ON;;;;;N;;;;;
+295C;UPWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295D;DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR;Sm;0;ON;;;;;N;;;;;
+295E;LEFTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+295F;RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR;Sm;0;ON;;;;;N;;;;;
+2960;UPWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2961;DOWNWARDS HARPOON WITH BARB LEFT FROM BAR;Sm;0;ON;;;;;N;;;;;
+2962;LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2963;UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2964;RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2965;DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2966;LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2967;LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+2968;RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP;Sm;0;ON;;;;;N;;;;;
+2969;RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN;Sm;0;ON;;;;;N;;;;;
+296A;LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296B;LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296C;RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH;Sm;0;ON;;;;;N;;;;;
+296D;RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH;Sm;0;ON;;;;;N;;;;;
+296E;UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+296F;DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT;Sm;0;ON;;;;;N;;;;;
+2970;RIGHT DOUBLE ARROW WITH ROUNDED HEAD;Sm;0;ON;;;;;N;;;;;
+2971;EQUALS SIGN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2972;TILDE OPERATOR ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2973;LEFTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2974;RIGHTWARDS ARROW ABOVE TILDE OPERATOR;Sm;0;ON;;;;;N;;;;;
+2975;RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;N;;;;;
+2976;LESS-THAN ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2977;LEFTWARDS ARROW THROUGH LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2978;GREATER-THAN ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+2979;SUBSET ABOVE RIGHTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297A;LEFTWARDS ARROW THROUGH SUBSET;Sm;0;ON;;;;;N;;;;;
+297B;SUPERSET ABOVE LEFTWARDS ARROW;Sm;0;ON;;;;;N;;;;;
+297C;LEFT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297D;RIGHT FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297E;UP FISH TAIL;Sm;0;ON;;;;;N;;;;;
+297F;DOWN FISH TAIL;Sm;0;ON;;;;;N;;;;;
+2980;TRIPLE VERTICAL BAR DELIMITER;Sm;0;ON;;;;;N;;;;;
+2981;Z NOTATION SPOT;Sm;0;ON;;;;;N;;;;;
+2982;Z NOTATION TYPE COLON;Sm;0;ON;;;;;N;;;;;
+2983;LEFT WHITE CURLY BRACKET;Ps;0;ON;;;;;Y;;;;;
+2984;RIGHT WHITE CURLY BRACKET;Pe;0;ON;;;;;Y;;;;;
+2985;LEFT WHITE PARENTHESIS;Ps;0;ON;;;;;Y;;;;;
+2986;RIGHT WHITE PARENTHESIS;Pe;0;ON;;;;;Y;;;;;
+2987;Z NOTATION LEFT IMAGE BRACKET;Ps;0;ON;;;;;Y;;;;;
+2988;Z NOTATION RIGHT IMAGE BRACKET;Pe;0;ON;;;;;Y;;;;;
+2989;Z NOTATION LEFT BINDING BRACKET;Ps;0;ON;;;;;Y;;;;;
+298A;Z NOTATION RIGHT BINDING BRACKET;Pe;0;ON;;;;;Y;;;;;
+298B;LEFT SQUARE BRACKET WITH UNDERBAR;Ps;0;ON;;;;;Y;;;;;
+298C;RIGHT SQUARE BRACKET WITH UNDERBAR;Pe;0;ON;;;;;Y;;;;;
+298D;LEFT SQUARE BRACKET WITH TICK IN TOP CORNER;Ps;0;ON;;;;;Y;;;;;
+298E;RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Pe;0;ON;;;;;Y;;;;;
+298F;LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER;Ps;0;ON;;;;;Y;;;;;
+2990;RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER;Pe;0;ON;;;;;Y;;;;;
+2991;LEFT ANGLE BRACKET WITH DOT;Ps;0;ON;;;;;Y;;;;;
+2992;RIGHT ANGLE BRACKET WITH DOT;Pe;0;ON;;;;;Y;;;;;
+2993;LEFT ARC LESS-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2994;RIGHT ARC GREATER-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2995;DOUBLE LEFT ARC GREATER-THAN BRACKET;Ps;0;ON;;;;;Y;;;;;
+2996;DOUBLE RIGHT ARC LESS-THAN BRACKET;Pe;0;ON;;;;;Y;;;;;
+2997;LEFT BLACK TORTOISE SHELL BRACKET;Ps;0;ON;;;;;Y;;;;;
+2998;RIGHT BLACK TORTOISE SHELL BRACKET;Pe;0;ON;;;;;Y;;;;;
+2999;DOTTED FENCE;Sm;0;ON;;;;;N;;;;;
+299A;VERTICAL ZIGZAG LINE;Sm;0;ON;;;;;N;;;;;
+299B;MEASURED ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+299C;RIGHT ANGLE VARIANT WITH SQUARE;Sm;0;ON;;;;;Y;;;;;
+299D;MEASURED RIGHT ANGLE WITH DOT;Sm;0;ON;;;;;Y;;;;;
+299E;ANGLE WITH S INSIDE;Sm;0;ON;;;;;Y;;;;;
+299F;ACUTE ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A0;SPHERICAL ANGLE OPENING LEFT;Sm;0;ON;;;;;Y;;;;;
+29A1;SPHERICAL ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A2;TURNED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A3;REVERSED ANGLE;Sm;0;ON;;;;;Y;;;;;
+29A4;ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A5;REVERSED ANGLE WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+29A6;OBLIQUE ANGLE OPENING UP;Sm;0;ON;;;;;Y;;;;;
+29A7;OBLIQUE ANGLE OPENING DOWN;Sm;0;ON;;;;;Y;;;;;
+29A8;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29A9;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AA;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT;Sm;0;ON;;;;;Y;;;;;
+29AB;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT;Sm;0;ON;;;;;Y;;;;;
+29AC;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AD;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP;Sm;0;ON;;;;;Y;;;;;
+29AE;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29AF;MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN;Sm;0;ON;;;;;Y;;;;;
+29B0;REVERSED EMPTY SET;Sm;0;ON;;;;;N;;;;;
+29B1;EMPTY SET WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+29B2;EMPTY SET WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+29B3;EMPTY SET WITH RIGHT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B4;EMPTY SET WITH LEFT ARROW ABOVE;Sm;0;ON;;;;;N;;;;;
+29B5;CIRCLE WITH HORIZONTAL BAR;Sm;0;ON;;;;;N;;;;;
+29B6;CIRCLED VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29B7;CIRCLED PARALLEL;Sm;0;ON;;;;;N;;;;;
+29B8;CIRCLED REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29B9;CIRCLED PERPENDICULAR;Sm;0;ON;;;;;N;;;;;
+29BA;CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29BB;CIRCLE WITH SUPERIMPOSED X;Sm;0;ON;;;;;N;;;;;
+29BC;CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+29BD;UP ARROW THROUGH CIRCLE;Sm;0;ON;;;;;N;;;;;
+29BE;CIRCLED WHITE BULLET;Sm;0;ON;;;;;N;;;;;
+29BF;CIRCLED BULLET;Sm;0;ON;;;;;N;;;;;
+29C0;CIRCLED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+29C1;CIRCLED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+29C2;CIRCLE WITH SMALL CIRCLE TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C3;CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT;Sm;0;ON;;;;;Y;;;;;
+29C4;SQUARED RISING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C5;SQUARED FALLING DIAGONAL SLASH;Sm;0;ON;;;;;Y;;;;;
+29C6;SQUARED ASTERISK;Sm;0;ON;;;;;N;;;;;
+29C7;SQUARED SMALL CIRCLE;Sm;0;ON;;;;;N;;;;;
+29C8;SQUARED SQUARE;Sm;0;ON;;;;;N;;;;;
+29C9;TWO JOINED SQUARES;Sm;0;ON;;;;;Y;;;;;
+29CA;TRIANGLE WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+29CB;TRIANGLE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+29CC;S IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+29CD;TRIANGLE WITH SERIFS AT BOTTOM;Sm;0;ON;;;;;N;;;;;
+29CE;RIGHT TRIANGLE ABOVE LEFT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29CF;LEFT TRIANGLE BESIDE VERTICAL BAR;Sm;0;ON;;;;;Y;;;;;
+29D0;VERTICAL BAR BESIDE RIGHT TRIANGLE;Sm;0;ON;;;;;Y;;;;;
+29D1;BOWTIE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D2;BOWTIE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D3;BLACK BOWTIE;Sm;0;ON;;;;;N;;;;;
+29D4;TIMES WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D5;TIMES WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29D6;WHITE HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D7;BLACK HOURGLASS;Sm;0;ON;;;;;N;;;;;
+29D8;LEFT WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29D9;RIGHT WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DA;LEFT DOUBLE WIGGLY FENCE;Ps;0;ON;;;;;Y;;;;;
+29DB;RIGHT DOUBLE WIGGLY FENCE;Pe;0;ON;;;;;Y;;;;;
+29DC;INCOMPLETE INFINITY;Sm;0;ON;;;;;Y;;;;;
+29DD;TIE OVER INFINITY;Sm;0;ON;;;;;N;;;;;
+29DE;INFINITY NEGATED WITH VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+29DF;DOUBLE-ENDED MULTIMAP;Sm;0;ON;;;;;N;;;;;
+29E0;SQUARE WITH CONTOURED OUTLINE;Sm;0;ON;;;;;N;;;;;
+29E1;INCREASES AS;Sm;0;ON;;;;;Y;;;;;
+29E2;SHUFFLE PRODUCT;Sm;0;ON;;;;;N;;;;;
+29E3;EQUALS SIGN AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E4;EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+29E5;IDENTICAL TO AND SLANTED PARALLEL;Sm;0;ON;;;;;Y;;;;;
+29E6;GLEICH STARK;Sm;0;ON;;;;;N;;;;;
+29E7;THERMODYNAMIC;Sm;0;ON;;;;;N;;;;;
+29E8;DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29E9;DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK;Sm;0;ON;;;;;Y;;;;;
+29EA;BLACK DIAMOND WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EB;BLACK LOZENGE;Sm;0;ON;;;;;N;;;;;
+29EC;WHITE CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29ED;BLACK CIRCLE WITH DOWN ARROW;Sm;0;ON;;;;;N;;;;;
+29EE;ERROR-BARRED WHITE SQUARE;Sm;0;ON;;;;;N;;;;;
+29EF;ERROR-BARRED BLACK SQUARE;Sm;0;ON;;;;;N;;;;;
+29F0;ERROR-BARRED WHITE DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F1;ERROR-BARRED BLACK DIAMOND;Sm;0;ON;;;;;N;;;;;
+29F2;ERROR-BARRED WHITE CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F3;ERROR-BARRED BLACK CIRCLE;Sm;0;ON;;;;;N;;;;;
+29F4;RULE-DELAYED;Sm;0;ON;;;;;Y;;;;;
+29F5;REVERSE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+29F6;SOLIDUS WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+29F7;REVERSE SOLIDUS WITH HORIZONTAL STROKE;Sm;0;ON;;;;;Y;;;;;
+29F8;BIG SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29F9;BIG REVERSE SOLIDUS;Sm;0;ON;;;;;Y;;;;;
+29FA;DOUBLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FB;TRIPLE PLUS;Sm;0;ON;;;;;N;;;;;
+29FC;LEFT-POINTING CURVED ANGLE BRACKET;Ps;0;ON;;;;;Y;;;;;
+29FD;RIGHT-POINTING CURVED ANGLE BRACKET;Pe;0;ON;;;;;Y;;;;;
+29FE;TINY;Sm;0;ON;;;;;N;;;;;
+29FF;MINY;Sm;0;ON;;;;;N;;;;;
+2A00;N-ARY CIRCLED DOT OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A01;N-ARY CIRCLED PLUS OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A02;N-ARY CIRCLED TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A03;N-ARY UNION OPERATOR WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A04;N-ARY UNION OPERATOR WITH PLUS;Sm;0;ON;;;;;N;;;;;
+2A05;N-ARY SQUARE INTERSECTION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A06;N-ARY SQUARE UNION OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A07;TWO LOGICAL AND OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A08;TWO LOGICAL OR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A09;N-ARY TIMES OPERATOR;Sm;0;ON;;;;;N;;;;;
+2A0A;MODULO TWO SUM;Sm;0;ON;;;;;Y;;;;;
+2A0B;SUMMATION WITH INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0C;QUADRUPLE INTEGRAL OPERATOR;Sm;0;ON;<compat> 222B 222B 222B 222B;;;;Y;;;;;
+2A0D;FINITE PART INTEGRAL;Sm;0;ON;;;;;Y;;;;;
+2A0E;INTEGRAL WITH DOUBLE STROKE;Sm;0;ON;;;;;Y;;;;;
+2A0F;INTEGRAL AVERAGE WITH SLASH;Sm;0;ON;;;;;Y;;;;;
+2A10;CIRCULATION FUNCTION;Sm;0;ON;;;;;Y;;;;;
+2A11;ANTICLOCKWISE INTEGRATION;Sm;0;ON;;;;;Y;;;;;
+2A12;LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A13;LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE;Sm;0;ON;;;;;Y;;;;;
+2A14;LINE INTEGRATION NOT INCLUDING THE POLE;Sm;0;ON;;;;;Y;;;;;
+2A15;INTEGRAL AROUND A POINT OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A16;QUATERNION INTEGRAL OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A17;INTEGRAL WITH LEFTWARDS ARROW WITH HOOK;Sm;0;ON;;;;;Y;;;;;
+2A18;INTEGRAL WITH TIMES SIGN;Sm;0;ON;;;;;Y;;;;;
+2A19;INTEGRAL WITH INTERSECTION;Sm;0;ON;;;;;Y;;;;;
+2A1A;INTEGRAL WITH UNION;Sm;0;ON;;;;;Y;;;;;
+2A1B;INTEGRAL WITH OVERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1C;INTEGRAL WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2A1D;JOIN;Sm;0;ON;;;;;N;;;;;
+2A1E;LARGE LEFT TRIANGLE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A1F;Z NOTATION SCHEMA COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A20;Z NOTATION SCHEMA PIPING;Sm;0;ON;;;;;Y;;;;;
+2A21;Z NOTATION SCHEMA PROJECTION;Sm;0;ON;;;;;Y;;;;;
+2A22;PLUS SIGN WITH SMALL CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2A23;PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A24;PLUS SIGN WITH TILDE ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A25;PLUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A26;PLUS SIGN WITH TILDE BELOW;Sm;0;ON;;;;;Y;;;;;
+2A27;PLUS SIGN WITH SUBSCRIPT TWO;Sm;0;ON;;;;;N;;;;;
+2A28;PLUS SIGN WITH BLACK TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A29;MINUS SIGN WITH COMMA ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A2A;MINUS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A2B;MINUS SIGN WITH FALLING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2C;MINUS SIGN WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A2D;PLUS SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2E;PLUS SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A2F;VECTOR OR CROSS PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A30;MULTIPLICATION SIGN WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A31;MULTIPLICATION SIGN WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A32;SEMIDIRECT PRODUCT WITH BOTTOM CLOSED;Sm;0;ON;;;;;N;;;;;
+2A33;SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A34;MULTIPLICATION SIGN IN LEFT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A35;MULTIPLICATION SIGN IN RIGHT HALF CIRCLE;Sm;0;ON;;;;;Y;;;;;
+2A36;CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;N;;;;;
+2A37;MULTIPLICATION SIGN IN DOUBLE CIRCLE;Sm;0;ON;;;;;N;;;;;
+2A38;CIRCLED DIVISION SIGN;Sm;0;ON;;;;;N;;;;;
+2A39;PLUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3A;MINUS SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3B;MULTIPLICATION SIGN IN TRIANGLE;Sm;0;ON;;;;;N;;;;;
+2A3C;INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3D;RIGHTHAND INTERIOR PRODUCT;Sm;0;ON;;;;;Y;;;;;
+2A3E;Z NOTATION RELATIONAL COMPOSITION;Sm;0;ON;;;;;Y;;;;;
+2A3F;AMALGAMATION OR COPRODUCT;Sm;0;ON;;;;;N;;;;;
+2A40;INTERSECTION WITH DOT;Sm;0;ON;;;;;N;;;;;
+2A41;UNION WITH MINUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A42;UNION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A43;INTERSECTION WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A44;INTERSECTION WITH LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A45;UNION WITH LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A46;UNION ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A47;INTERSECTION ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A48;UNION ABOVE BAR ABOVE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A49;INTERSECTION ABOVE BAR ABOVE UNION;Sm;0;ON;;;;;N;;;;;
+2A4A;UNION BESIDE AND JOINED WITH UNION;Sm;0;ON;;;;;N;;;;;
+2A4B;INTERSECTION BESIDE AND JOINED WITH INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4C;CLOSED UNION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4D;CLOSED INTERSECTION WITH SERIFS;Sm;0;ON;;;;;N;;;;;
+2A4E;DOUBLE SQUARE INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2A4F;DOUBLE SQUARE UNION;Sm;0;ON;;;;;N;;;;;
+2A50;CLOSED UNION WITH SERIFS AND SMASH PRODUCT;Sm;0;ON;;;;;N;;;;;
+2A51;LOGICAL AND WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A52;LOGICAL OR WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A53;DOUBLE LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A54;DOUBLE LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A55;TWO INTERSECTING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A56;TWO INTERSECTING LOGICAL OR;Sm;0;ON;;;;;N;;;;;
+2A57;SLOPING LARGE OR;Sm;0;ON;;;;;Y;;;;;
+2A58;SLOPING LARGE AND;Sm;0;ON;;;;;Y;;;;;
+2A59;LOGICAL OR OVERLAPPING LOGICAL AND;Sm;0;ON;;;;;N;;;;;
+2A5A;LOGICAL AND WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5B;LOGICAL OR WITH MIDDLE STEM;Sm;0;ON;;;;;N;;;;;
+2A5C;LOGICAL AND WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5D;LOGICAL OR WITH HORIZONTAL DASH;Sm;0;ON;;;;;N;;;;;
+2A5E;LOGICAL AND WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A5F;LOGICAL AND WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A60;LOGICAL AND WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A61;SMALL VEE WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A62;LOGICAL OR WITH DOUBLE OVERBAR;Sm;0;ON;;;;;N;;;;;
+2A63;LOGICAL OR WITH DOUBLE UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2A64;Z NOTATION DOMAIN ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A65;Z NOTATION RANGE ANTIRESTRICTION;Sm;0;ON;;;;;Y;;;;;
+2A66;EQUALS SIGN WITH DOT BELOW;Sm;0;ON;;;;;N;;;;;
+2A67;IDENTICAL WITH DOT ABOVE;Sm;0;ON;;;;;N;;;;;
+2A68;TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A69;TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE;Sm;0;ON;;;;;N;;;;;
+2A6A;TILDE OPERATOR WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6B;TILDE OPERATOR WITH RISING DOTS;Sm;0;ON;;;;;Y;;;;;
+2A6C;SIMILAR MINUS SIMILAR;Sm;0;ON;;;;;Y;;;;;
+2A6D;CONGRUENT WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A6E;EQUALS WITH ASTERISK;Sm;0;ON;;;;;N;;;;;
+2A6F;ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT;Sm;0;ON;;;;;Y;;;;;
+2A70;APPROXIMATELY EQUAL OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A71;EQUALS SIGN ABOVE PLUS SIGN;Sm;0;ON;;;;;N;;;;;
+2A72;PLUS SIGN ABOVE EQUALS SIGN;Sm;0;ON;;;;;N;;;;;
+2A73;EQUALS SIGN ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2A74;DOUBLE COLON EQUAL;Sm;0;ON;<compat> 003A 003A 003D;;;;Y;;;;;
+2A75;TWO CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D;;;;N;;;;;
+2A76;THREE CONSECUTIVE EQUALS SIGNS;Sm;0;ON;<compat> 003D 003D 003D;;;;N;;;;;
+2A77;EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW;Sm;0;ON;;;;;N;;;;;
+2A78;EQUIVALENT WITH FOUR DOTS ABOVE;Sm;0;ON;;;;;N;;;;;
+2A79;LESS-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7A;GREATER-THAN WITH CIRCLE INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A7B;LESS-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7C;GREATER-THAN WITH QUESTION MARK ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A7D;LESS-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7E;GREATER-THAN OR SLANTED EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A7F;LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A80;GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A81;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A82;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2A83;LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT;Sm;0;ON;;;;;Y;;;;;
+2A84;GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT;Sm;0;ON;;;;;Y;;;;;
+2A85;LESS-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A86;GREATER-THAN OR APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A87;LESS-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A88;GREATER-THAN AND SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2A89;LESS-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8A;GREATER-THAN AND NOT APPROXIMATE;Sm;0;ON;;;;;Y;;;;;
+2A8B;LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8C;GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A8D;LESS-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8E;GREATER-THAN ABOVE SIMILAR OR EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A8F;LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A90;GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A91;LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A92;GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A93;LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A94;GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2A95;SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A96;SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A97;SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A98;SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE;Sm;0;ON;;;;;Y;;;;;
+2A99;DOUBLE-LINE EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9A;DOUBLE-LINE EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9B;DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9C;DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9D;SIMILAR OR LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9E;SIMILAR OR GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2A9F;SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA0;SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AA1;DOUBLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA2;DOUBLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AA3;DOUBLE NESTED LESS-THAN WITH UNDERBAR;Sm;0;ON;;;;;Y;;;;;
+2AA4;GREATER-THAN OVERLAPPING LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA5;GREATER-THAN BESIDE LESS-THAN;Sm;0;ON;;;;;N;;;;;
+2AA6;LESS-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA7;GREATER-THAN CLOSED BY CURVE;Sm;0;ON;;;;;Y;;;;;
+2AA8;LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AA9;GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL;Sm;0;ON;;;;;Y;;;;;
+2AAA;SMALLER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAB;LARGER THAN;Sm;0;ON;;;;;Y;;;;;
+2AAC;SMALLER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAD;LARGER THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AAE;EQUALS SIGN WITH BUMPY ABOVE;Sm;0;ON;;;;;N;;;;;
+2AAF;PRECEDES ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB0;SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB1;PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB2;SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB3;PRECEDES ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB4;SUCCEEDS ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AB5;PRECEDES ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB6;SUCCEEDS ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB7;PRECEDES ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB8;SUCCEEDS ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AB9;PRECEDES ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABA;SUCCEEDS ABOVE NOT ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ABB;DOUBLE PRECEDES;Sm;0;ON;;;;;Y;;;;;
+2ABC;DOUBLE SUCCEEDS;Sm;0;ON;;;;;Y;;;;;
+2ABD;SUBSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABE;SUPERSET WITH DOT;Sm;0;ON;;;;;Y;;;;;
+2ABF;SUBSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC0;SUPERSET WITH PLUS SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC1;SUBSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC2;SUPERSET WITH MULTIPLICATION SIGN BELOW;Sm;0;ON;;;;;Y;;;;;
+2AC3;SUBSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC4;SUPERSET OF OR EQUAL TO WITH DOT ABOVE;Sm;0;ON;;;;;Y;;;;;
+2AC5;SUBSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC6;SUPERSET OF ABOVE EQUALS SIGN;Sm;0;ON;;;;;Y;;;;;
+2AC7;SUBSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC8;SUPERSET OF ABOVE TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AC9;SUBSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACA;SUPERSET OF ABOVE ALMOST EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACB;SUBSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACC;SUPERSET OF ABOVE NOT EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2ACD;SQUARE LEFT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACE;SQUARE RIGHT OPEN BOX OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2ACF;CLOSED SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD0;CLOSED SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD1;CLOSED SUBSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD2;CLOSED SUPERSET OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AD3;SUBSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD4;SUPERSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD5;SUBSET ABOVE SUBSET;Sm;0;ON;;;;;Y;;;;;
+2AD6;SUPERSET ABOVE SUPERSET;Sm;0;ON;;;;;Y;;;;;
+2AD7;SUPERSET BESIDE SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD8;SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET;Sm;0;ON;;;;;N;;;;;
+2AD9;ELEMENT OF OPENING DOWNWARDS;Sm;0;ON;;;;;N;;;;;
+2ADA;PITCHFORK WITH TEE TOP;Sm;0;ON;;;;;N;;;;;
+2ADB;TRANSVERSAL INTERSECTION;Sm;0;ON;;;;;N;;;;;
+2ADC;FORKING;Sm;0;ON;2ADD 0338;;;;Y;;not independent;;;
+2ADD;NONFORKING;Sm;0;ON;;;;;N;;independent;;;
+2ADE;SHORT LEFT TACK;Sm;0;ON;;;;;Y;;;;;
+2ADF;SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AE0;SHORT UP TACK;Sm;0;ON;;;;;N;;;;;
+2AE1;PERPENDICULAR WITH S;Sm;0;ON;;;;;N;;;;;
+2AE2;VERTICAL BAR TRIPLE RIGHT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE3;DOUBLE VERTICAL BAR LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE4;VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE5;DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE;Sm;0;ON;;;;;Y;;;;;
+2AE6;LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL;Sm;0;ON;;;;;Y;;;;;
+2AE7;SHORT DOWN TACK WITH OVERBAR;Sm;0;ON;;;;;N;;;;;
+2AE8;SHORT UP TACK WITH UNDERBAR;Sm;0;ON;;;;;N;;;;;
+2AE9;SHORT UP TACK ABOVE SHORT DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEA;DOUBLE DOWN TACK;Sm;0;ON;;;;;N;;;;;
+2AEB;DOUBLE UP TACK;Sm;0;ON;;;;;N;;;;;
+2AEC;DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AED;REVERSED DOUBLE STROKE NOT SIGN;Sm;0;ON;;;;;Y;;;;;
+2AEE;DOES NOT DIVIDE WITH REVERSED NEGATION SLASH;Sm;0;ON;;;;;Y;;;;;
+2AEF;VERTICAL LINE WITH CIRCLE ABOVE;Sm;0;ON;;;;;N;;;;;
+2AF0;VERTICAL LINE WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF1;DOWN TACK WITH CIRCLE BELOW;Sm;0;ON;;;;;N;;;;;
+2AF2;PARALLEL WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF3;PARALLEL WITH TILDE OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AF4;TRIPLE VERTICAL BAR BINARY RELATION;Sm;0;ON;;;;;N;;;;;
+2AF5;TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE;Sm;0;ON;;;;;N;;;;;
+2AF6;TRIPLE COLON OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AF7;TRIPLE NESTED LESS-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF8;TRIPLE NESTED GREATER-THAN;Sm;0;ON;;;;;Y;;;;;
+2AF9;DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFA;DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO;Sm;0;ON;;;;;Y;;;;;
+2AFB;TRIPLE SOLIDUS BINARY RELATION;Sm;0;ON;;;;;Y;;;;;
+2AFC;LARGE TRIPLE VERTICAL BAR OPERATOR;Sm;0;ON;;;;;N;;;;;
+2AFD;DOUBLE SOLIDUS OPERATOR;Sm;0;ON;;;;;Y;;;;;
+2AFE;WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2AFF;N-ARY WHITE VERTICAL BAR;Sm;0;ON;;;;;N;;;;;
+2B00;NORTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B01;NORTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B02;SOUTH EAST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B03;SOUTH WEST WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B04;LEFT RIGHT WHITE ARROW;So;0;ON;;;;;N;;;;;
+2B05;LEFTWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B06;UPWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B07;DOWNWARDS BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B08;NORTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B09;NORTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0A;SOUTH EAST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0B;SOUTH WEST BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0C;LEFT RIGHT BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0D;UP DOWN BLACK ARROW;So;0;ON;;;;;N;;;;;
+2B0E;RIGHTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B0F;RIGHTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B10;LEFTWARDS ARROW WITH TIP DOWNWARDS;So;0;ON;;;;;N;;;;;
+2B11;LEFTWARDS ARROW WITH TIP UPWARDS;So;0;ON;;;;;N;;;;;
+2B12;SQUARE WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B13;SQUARE WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B14;SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B15;SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK;So;0;ON;;;;;N;;;;;
+2B16;DIAMOND WITH LEFT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B17;DIAMOND WITH RIGHT HALF BLACK;So;0;ON;;;;;N;;;;;
+2B18;DIAMOND WITH TOP HALF BLACK;So;0;ON;;;;;N;;;;;
+2B19;DIAMOND WITH BOTTOM HALF BLACK;So;0;ON;;;;;N;;;;;
+2B1A;DOTTED SQUARE;So;0;ON;;;;;N;;;;;
+2B20;WHITE PENTAGON;So;0;ON;;;;;N;;;;;
+2B21;WHITE HEXAGON;So;0;ON;;;;;N;;;;;
+2B22;BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2B23;HORIZONTAL BLACK HEXAGON;So;0;ON;;;;;N;;;;;
+2C00;GLAGOLITIC CAPITAL LETTER AZU;Lu;0;L;;;;;N;;;;2C30;
+2C01;GLAGOLITIC CAPITAL LETTER BUKY;Lu;0;L;;;;;N;;;;2C31;
+2C02;GLAGOLITIC CAPITAL LETTER VEDE;Lu;0;L;;;;;N;;;;2C32;
+2C03;GLAGOLITIC CAPITAL LETTER GLAGOLI;Lu;0;L;;;;;N;;;;2C33;
+2C04;GLAGOLITIC CAPITAL LETTER DOBRO;Lu;0;L;;;;;N;;;;2C34;
+2C05;GLAGOLITIC CAPITAL LETTER YESTU;Lu;0;L;;;;;N;;;;2C35;
+2C06;GLAGOLITIC CAPITAL LETTER ZHIVETE;Lu;0;L;;;;;N;;;;2C36;
+2C07;GLAGOLITIC CAPITAL LETTER DZELO;Lu;0;L;;;;;N;;;;2C37;
+2C08;GLAGOLITIC CAPITAL LETTER ZEMLJA;Lu;0;L;;;;;N;;;;2C38;
+2C09;GLAGOLITIC CAPITAL LETTER IZHE;Lu;0;L;;;;;N;;;;2C39;
+2C0A;GLAGOLITIC CAPITAL LETTER INITIAL IZHE;Lu;0;L;;;;;N;;;;2C3A;
+2C0B;GLAGOLITIC CAPITAL LETTER I;Lu;0;L;;;;;N;;;;2C3B;
+2C0C;GLAGOLITIC CAPITAL LETTER DJERVI;Lu;0;L;;;;;N;;;;2C3C;
+2C0D;GLAGOLITIC CAPITAL LETTER KAKO;Lu;0;L;;;;;N;;;;2C3D;
+2C0E;GLAGOLITIC CAPITAL LETTER LJUDIJE;Lu;0;L;;;;;N;;;;2C3E;
+2C0F;GLAGOLITIC CAPITAL LETTER MYSLITE;Lu;0;L;;;;;N;;;;2C3F;
+2C10;GLAGOLITIC CAPITAL LETTER NASHI;Lu;0;L;;;;;N;;;;2C40;
+2C11;GLAGOLITIC CAPITAL LETTER ONU;Lu;0;L;;;;;N;;;;2C41;
+2C12;GLAGOLITIC CAPITAL LETTER POKOJI;Lu;0;L;;;;;N;;;;2C42;
+2C13;GLAGOLITIC CAPITAL LETTER RITSI;Lu;0;L;;;;;N;;;;2C43;
+2C14;GLAGOLITIC CAPITAL LETTER SLOVO;Lu;0;L;;;;;N;;;;2C44;
+2C15;GLAGOLITIC CAPITAL LETTER TVRIDO;Lu;0;L;;;;;N;;;;2C45;
+2C16;GLAGOLITIC CAPITAL LETTER UKU;Lu;0;L;;;;;N;;;;2C46;
+2C17;GLAGOLITIC CAPITAL LETTER FRITU;Lu;0;L;;;;;N;;;;2C47;
+2C18;GLAGOLITIC CAPITAL LETTER HERU;Lu;0;L;;;;;N;;;;2C48;
+2C19;GLAGOLITIC CAPITAL LETTER OTU;Lu;0;L;;;;;N;;;;2C49;
+2C1A;GLAGOLITIC CAPITAL LETTER PE;Lu;0;L;;;;;N;;;;2C4A;
+2C1B;GLAGOLITIC CAPITAL LETTER SHTA;Lu;0;L;;;;;N;;;;2C4B;
+2C1C;GLAGOLITIC CAPITAL LETTER TSI;Lu;0;L;;;;;N;;;;2C4C;
+2C1D;GLAGOLITIC CAPITAL LETTER CHRIVI;Lu;0;L;;;;;N;;;;2C4D;
+2C1E;GLAGOLITIC CAPITAL LETTER SHA;Lu;0;L;;;;;N;;;;2C4E;
+2C1F;GLAGOLITIC CAPITAL LETTER YERU;Lu;0;L;;;;;N;;;;2C4F;
+2C20;GLAGOLITIC CAPITAL LETTER YERI;Lu;0;L;;;;;N;;;;2C50;
+2C21;GLAGOLITIC CAPITAL LETTER YATI;Lu;0;L;;;;;N;;;;2C51;
+2C22;GLAGOLITIC CAPITAL LETTER SPIDERY HA;Lu;0;L;;;;;N;;;;2C52;
+2C23;GLAGOLITIC CAPITAL LETTER YU;Lu;0;L;;;;;N;;;;2C53;
+2C24;GLAGOLITIC CAPITAL LETTER SMALL YUS;Lu;0;L;;;;;N;;;;2C54;
+2C25;GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL;Lu;0;L;;;;;N;;;;2C55;
+2C26;GLAGOLITIC CAPITAL LETTER YO;Lu;0;L;;;;;N;;;;2C56;
+2C27;GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS;Lu;0;L;;;;;N;;;;2C57;
+2C28;GLAGOLITIC CAPITAL LETTER BIG YUS;Lu;0;L;;;;;N;;;;2C58;
+2C29;GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS;Lu;0;L;;;;;N;;;;2C59;
+2C2A;GLAGOLITIC CAPITAL LETTER FITA;Lu;0;L;;;;;N;;;;2C5A;
+2C2B;GLAGOLITIC CAPITAL LETTER IZHITSA;Lu;0;L;;;;;N;;;;2C5B;
+2C2C;GLAGOLITIC CAPITAL LETTER SHTAPIC;Lu;0;L;;;;;N;;;;2C5C;
+2C2D;GLAGOLITIC CAPITAL LETTER TROKUTASTI A;Lu;0;L;;;;;N;;;;2C5D;
+2C2E;GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE;Lu;0;L;;;;;N;;;;2C5E;
+2C30;GLAGOLITIC SMALL LETTER AZU;Ll;0;L;;;;;N;;;2C00;;2C00
+2C31;GLAGOLITIC SMALL LETTER BUKY;Ll;0;L;;;;;N;;;2C01;;2C01
+2C32;GLAGOLITIC SMALL LETTER VEDE;Ll;0;L;;;;;N;;;2C02;;2C02
+2C33;GLAGOLITIC SMALL LETTER GLAGOLI;Ll;0;L;;;;;N;;;2C03;;2C03
+2C34;GLAGOLITIC SMALL LETTER DOBRO;Ll;0;L;;;;;N;;;2C04;;2C04
+2C35;GLAGOLITIC SMALL LETTER YESTU;Ll;0;L;;;;;N;;;2C05;;2C05
+2C36;GLAGOLITIC SMALL LETTER ZHIVETE;Ll;0;L;;;;;N;;;2C06;;2C06
+2C37;GLAGOLITIC SMALL LETTER DZELO;Ll;0;L;;;;;N;;;2C07;;2C07
+2C38;GLAGOLITIC SMALL LETTER ZEMLJA;Ll;0;L;;;;;N;;;2C08;;2C08
+2C39;GLAGOLITIC SMALL LETTER IZHE;Ll;0;L;;;;;N;;;2C09;;2C09
+2C3A;GLAGOLITIC SMALL LETTER INITIAL IZHE;Ll;0;L;;;;;N;;;2C0A;;2C0A
+2C3B;GLAGOLITIC SMALL LETTER I;Ll;0;L;;;;;N;;;2C0B;;2C0B
+2C3C;GLAGOLITIC SMALL LETTER DJERVI;Ll;0;L;;;;;N;;;2C0C;;2C0C
+2C3D;GLAGOLITIC SMALL LETTER KAKO;Ll;0;L;;;;;N;;;2C0D;;2C0D
+2C3E;GLAGOLITIC SMALL LETTER LJUDIJE;Ll;0;L;;;;;N;;;2C0E;;2C0E
+2C3F;GLAGOLITIC SMALL LETTER MYSLITE;Ll;0;L;;;;;N;;;2C0F;;2C0F
+2C40;GLAGOLITIC SMALL LETTER NASHI;Ll;0;L;;;;;N;;;2C10;;2C10
+2C41;GLAGOLITIC SMALL LETTER ONU;Ll;0;L;;;;;N;;;2C11;;2C11
+2C42;GLAGOLITIC SMALL LETTER POKOJI;Ll;0;L;;;;;N;;;2C12;;2C12
+2C43;GLAGOLITIC SMALL LETTER RITSI;Ll;0;L;;;;;N;;;2C13;;2C13
+2C44;GLAGOLITIC SMALL LETTER SLOVO;Ll;0;L;;;;;N;;;2C14;;2C14
+2C45;GLAGOLITIC SMALL LETTER TVRIDO;Ll;0;L;;;;;N;;;2C15;;2C15
+2C46;GLAGOLITIC SMALL LETTER UKU;Ll;0;L;;;;;N;;;2C16;;2C16
+2C47;GLAGOLITIC SMALL LETTER FRITU;Ll;0;L;;;;;N;;;2C17;;2C17
+2C48;GLAGOLITIC SMALL LETTER HERU;Ll;0;L;;;;;N;;;2C18;;2C18
+2C49;GLAGOLITIC SMALL LETTER OTU;Ll;0;L;;;;;N;;;2C19;;2C19
+2C4A;GLAGOLITIC SMALL LETTER PE;Ll;0;L;;;;;N;;;2C1A;;2C1A
+2C4B;GLAGOLITIC SMALL LETTER SHTA;Ll;0;L;;;;;N;;;2C1B;;2C1B
+2C4C;GLAGOLITIC SMALL LETTER TSI;Ll;0;L;;;;;N;;;2C1C;;2C1C
+2C4D;GLAGOLITIC SMALL LETTER CHRIVI;Ll;0;L;;;;;N;;;2C1D;;2C1D
+2C4E;GLAGOLITIC SMALL LETTER SHA;Ll;0;L;;;;;N;;;2C1E;;2C1E
+2C4F;GLAGOLITIC SMALL LETTER YERU;Ll;0;L;;;;;N;;;2C1F;;2C1F
+2C50;GLAGOLITIC SMALL LETTER YERI;Ll;0;L;;;;;N;;;2C20;;2C20
+2C51;GLAGOLITIC SMALL LETTER YATI;Ll;0;L;;;;;N;;;2C21;;2C21
+2C52;GLAGOLITIC SMALL LETTER SPIDERY HA;Ll;0;L;;;;;N;;;2C22;;2C22
+2C53;GLAGOLITIC SMALL LETTER YU;Ll;0;L;;;;;N;;;2C23;;2C23
+2C54;GLAGOLITIC SMALL LETTER SMALL YUS;Ll;0;L;;;;;N;;;2C24;;2C24
+2C55;GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL;Ll;0;L;;;;;N;;;2C25;;2C25
+2C56;GLAGOLITIC SMALL LETTER YO;Ll;0;L;;;;;N;;;2C26;;2C26
+2C57;GLAGOLITIC SMALL LETTER IOTATED SMALL YUS;Ll;0;L;;;;;N;;;2C27;;2C27
+2C58;GLAGOLITIC SMALL LETTER BIG YUS;Ll;0;L;;;;;N;;;2C28;;2C28
+2C59;GLAGOLITIC SMALL LETTER IOTATED BIG YUS;Ll;0;L;;;;;N;;;2C29;;2C29
+2C5A;GLAGOLITIC SMALL LETTER FITA;Ll;0;L;;;;;N;;;2C2A;;2C2A
+2C5B;GLAGOLITIC SMALL LETTER IZHITSA;Ll;0;L;;;;;N;;;2C2B;;2C2B
+2C5C;GLAGOLITIC SMALL LETTER SHTAPIC;Ll;0;L;;;;;N;;;2C2C;;2C2C
+2C5D;GLAGOLITIC SMALL LETTER TROKUTASTI A;Ll;0;L;;;;;N;;;2C2D;;2C2D
+2C5E;GLAGOLITIC SMALL LETTER LATINATE MYSLITE;Ll;0;L;;;;;N;;;2C2E;;2C2E
+2C60;LATIN CAPITAL LETTER L WITH DOUBLE BAR;Lu;0;L;;;;;N;;;;2C61;
+2C61;LATIN SMALL LETTER L WITH DOUBLE BAR;Ll;0;L;;;;;N;;;2C60;;2C60
+2C62;LATIN CAPITAL LETTER L WITH MIDDLE TILDE;Lu;0;L;;;;;N;;;;026B;
+2C63;LATIN CAPITAL LETTER P WITH STROKE;Lu;0;L;;;;;N;;;;1D7D;
+2C64;LATIN CAPITAL LETTER R WITH TAIL;Lu;0;L;;;;;N;;;;027D;
+2C65;LATIN SMALL LETTER A WITH STROKE;Ll;0;L;;;;;N;;;023A;;023A
+2C66;LATIN SMALL LETTER T WITH DIAGONAL STROKE;Ll;0;L;;;;;N;;;023E;;023E
+2C67;LATIN CAPITAL LETTER H WITH DESCENDER;Lu;0;L;;;;;N;;;;2C68;
+2C68;LATIN SMALL LETTER H WITH DESCENDER;Ll;0;L;;;;;N;;;2C67;;2C67
+2C69;LATIN CAPITAL LETTER K WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6A;
+2C6A;LATIN SMALL LETTER K WITH DESCENDER;Ll;0;L;;;;;N;;;2C69;;2C69
+2C6B;LATIN CAPITAL LETTER Z WITH DESCENDER;Lu;0;L;;;;;N;;;;2C6C;
+2C6C;LATIN SMALL LETTER Z WITH DESCENDER;Ll;0;L;;;;;N;;;2C6B;;2C6B
+2C74;LATIN SMALL LETTER V WITH CURL;Ll;0;L;;;;;N;;;;;
+2C75;LATIN CAPITAL LETTER HALF H;Lu;0;L;;;;;N;;;;2C76;
+2C76;LATIN SMALL LETTER HALF H;Ll;0;L;;;;;N;;;2C75;;2C75
+2C77;LATIN SMALL LETTER TAILLESS PHI;Ll;0;L;;;;;N;;;;;
+2C80;COPTIC CAPITAL LETTER ALFA;Lu;0;L;;;;;N;;;;2C81;
+2C81;COPTIC SMALL LETTER ALFA;Ll;0;L;;;;;N;;;2C80;;2C80
+2C82;COPTIC CAPITAL LETTER VIDA;Lu;0;L;;;;;N;;;;2C83;
+2C83;COPTIC SMALL LETTER VIDA;Ll;0;L;;;;;N;;;2C82;;2C82
+2C84;COPTIC CAPITAL LETTER GAMMA;Lu;0;L;;;;;N;;;;2C85;
+2C85;COPTIC SMALL LETTER GAMMA;Ll;0;L;;;;;N;;;2C84;;2C84
+2C86;COPTIC CAPITAL LETTER DALDA;Lu;0;L;;;;;N;;;;2C87;
+2C87;COPTIC SMALL LETTER DALDA;Ll;0;L;;;;;N;;;2C86;;2C86
+2C88;COPTIC CAPITAL LETTER EIE;Lu;0;L;;;;;N;;;;2C89;
+2C89;COPTIC SMALL LETTER EIE;Ll;0;L;;;;;N;;;2C88;;2C88
+2C8A;COPTIC CAPITAL LETTER SOU;Lu;0;L;;;;;N;;;;2C8B;
+2C8B;COPTIC SMALL LETTER SOU;Ll;0;L;;;;;N;;;2C8A;;2C8A
+2C8C;COPTIC CAPITAL LETTER ZATA;Lu;0;L;;;;;N;;;;2C8D;
+2C8D;COPTIC SMALL LETTER ZATA;Ll;0;L;;;;;N;;;2C8C;;2C8C
+2C8E;COPTIC CAPITAL LETTER HATE;Lu;0;L;;;;;N;;;;2C8F;
+2C8F;COPTIC SMALL LETTER HATE;Ll;0;L;;;;;N;;;2C8E;;2C8E
+2C90;COPTIC CAPITAL LETTER THETHE;Lu;0;L;;;;;N;;;;2C91;
+2C91;COPTIC SMALL LETTER THETHE;Ll;0;L;;;;;N;;;2C90;;2C90
+2C92;COPTIC CAPITAL LETTER IAUDA;Lu;0;L;;;;;N;;;;2C93;
+2C93;COPTIC SMALL LETTER IAUDA;Ll;0;L;;;;;N;;;2C92;;2C92
+2C94;COPTIC CAPITAL LETTER KAPA;Lu;0;L;;;;;N;;;;2C95;
+2C95;COPTIC SMALL LETTER KAPA;Ll;0;L;;;;;N;;;2C94;;2C94
+2C96;COPTIC CAPITAL LETTER LAULA;Lu;0;L;;;;;N;;;;2C97;
+2C97;COPTIC SMALL LETTER LAULA;Ll;0;L;;;;;N;;;2C96;;2C96
+2C98;COPTIC CAPITAL LETTER MI;Lu;0;L;;;;;N;;;;2C99;
+2C99;COPTIC SMALL LETTER MI;Ll;0;L;;;;;N;;;2C98;;2C98
+2C9A;COPTIC CAPITAL LETTER NI;Lu;0;L;;;;;N;;;;2C9B;
+2C9B;COPTIC SMALL LETTER NI;Ll;0;L;;;;;N;;;2C9A;;2C9A
+2C9C;COPTIC CAPITAL LETTER KSI;Lu;0;L;;;;;N;;;;2C9D;
+2C9D;COPTIC SMALL LETTER KSI;Ll;0;L;;;;;N;;;2C9C;;2C9C
+2C9E;COPTIC CAPITAL LETTER O;Lu;0;L;;;;;N;;;;2C9F;
+2C9F;COPTIC SMALL LETTER O;Ll;0;L;;;;;N;;;2C9E;;2C9E
+2CA0;COPTIC CAPITAL LETTER PI;Lu;0;L;;;;;N;;;;2CA1;
+2CA1;COPTIC SMALL LETTER PI;Ll;0;L;;;;;N;;;2CA0;;2CA0
+2CA2;COPTIC CAPITAL LETTER RO;Lu;0;L;;;;;N;;;;2CA3;
+2CA3;COPTIC SMALL LETTER RO;Ll;0;L;;;;;N;;;2CA2;;2CA2
+2CA4;COPTIC CAPITAL LETTER SIMA;Lu;0;L;;;;;N;;;;2CA5;
+2CA5;COPTIC SMALL LETTER SIMA;Ll;0;L;;;;;N;;;2CA4;;2CA4
+2CA6;COPTIC CAPITAL LETTER TAU;Lu;0;L;;;;;N;;;;2CA7;
+2CA7;COPTIC SMALL LETTER TAU;Ll;0;L;;;;;N;;;2CA6;;2CA6
+2CA8;COPTIC CAPITAL LETTER UA;Lu;0;L;;;;;N;;;;2CA9;
+2CA9;COPTIC SMALL LETTER UA;Ll;0;L;;;;;N;;;2CA8;;2CA8
+2CAA;COPTIC CAPITAL LETTER FI;Lu;0;L;;;;;N;;;;2CAB;
+2CAB;COPTIC SMALL LETTER FI;Ll;0;L;;;;;N;;;2CAA;;2CAA
+2CAC;COPTIC CAPITAL LETTER KHI;Lu;0;L;;;;;N;;;;2CAD;
+2CAD;COPTIC SMALL LETTER KHI;Ll;0;L;;;;;N;;;2CAC;;2CAC
+2CAE;COPTIC CAPITAL LETTER PSI;Lu;0;L;;;;;N;;;;2CAF;
+2CAF;COPTIC SMALL LETTER PSI;Ll;0;L;;;;;N;;;2CAE;;2CAE
+2CB0;COPTIC CAPITAL LETTER OOU;Lu;0;L;;;;;N;;;;2CB1;
+2CB1;COPTIC SMALL LETTER OOU;Ll;0;L;;;;;N;;;2CB0;;2CB0
+2CB2;COPTIC CAPITAL LETTER DIALECT-P ALEF;Lu;0;L;;;;;N;;;;2CB3;
+2CB3;COPTIC SMALL LETTER DIALECT-P ALEF;Ll;0;L;;;;;N;;;2CB2;;2CB2
+2CB4;COPTIC CAPITAL LETTER OLD COPTIC AIN;Lu;0;L;;;;;N;;;;2CB5;
+2CB5;COPTIC SMALL LETTER OLD COPTIC AIN;Ll;0;L;;;;;N;;;2CB4;;2CB4
+2CB6;COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE;Lu;0;L;;;;;N;;;;2CB7;
+2CB7;COPTIC SMALL LETTER CRYPTOGRAMMIC EIE;Ll;0;L;;;;;N;;;2CB6;;2CB6
+2CB8;COPTIC CAPITAL LETTER DIALECT-P KAPA;Lu;0;L;;;;;N;;;;2CB9;
+2CB9;COPTIC SMALL LETTER DIALECT-P KAPA;Ll;0;L;;;;;N;;;2CB8;;2CB8
+2CBA;COPTIC CAPITAL LETTER DIALECT-P NI;Lu;0;L;;;;;N;;;;2CBB;
+2CBB;COPTIC SMALL LETTER DIALECT-P NI;Ll;0;L;;;;;N;;;2CBA;;2CBA
+2CBC;COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI;Lu;0;L;;;;;N;;;;2CBD;
+2CBD;COPTIC SMALL LETTER CRYPTOGRAMMIC NI;Ll;0;L;;;;;N;;;2CBC;;2CBC
+2CBE;COPTIC CAPITAL LETTER OLD COPTIC OOU;Lu;0;L;;;;;N;;;;2CBF;
+2CBF;COPTIC SMALL LETTER OLD COPTIC OOU;Ll;0;L;;;;;N;;;2CBE;;2CBE
+2CC0;COPTIC CAPITAL LETTER SAMPI;Lu;0;L;;;;;N;;;;2CC1;
+2CC1;COPTIC SMALL LETTER SAMPI;Ll;0;L;;;;;N;;;2CC0;;2CC0
+2CC2;COPTIC CAPITAL LETTER CROSSED SHEI;Lu;0;L;;;;;N;;;;2CC3;
+2CC3;COPTIC SMALL LETTER CROSSED SHEI;Ll;0;L;;;;;N;;;2CC2;;2CC2
+2CC4;COPTIC CAPITAL LETTER OLD COPTIC SHEI;Lu;0;L;;;;;N;;;;2CC5;
+2CC5;COPTIC SMALL LETTER OLD COPTIC SHEI;Ll;0;L;;;;;N;;;2CC4;;2CC4
+2CC6;COPTIC CAPITAL LETTER OLD COPTIC ESH;Lu;0;L;;;;;N;;;;2CC7;
+2CC7;COPTIC SMALL LETTER OLD COPTIC ESH;Ll;0;L;;;;;N;;;2CC6;;2CC6
+2CC8;COPTIC CAPITAL LETTER AKHMIMIC KHEI;Lu;0;L;;;;;N;;;;2CC9;
+2CC9;COPTIC SMALL LETTER AKHMIMIC KHEI;Ll;0;L;;;;;N;;;2CC8;;2CC8
+2CCA;COPTIC CAPITAL LETTER DIALECT-P HORI;Lu;0;L;;;;;N;;;;2CCB;
+2CCB;COPTIC SMALL LETTER DIALECT-P HORI;Ll;0;L;;;;;N;;;2CCA;;2CCA
+2CCC;COPTIC CAPITAL LETTER OLD COPTIC HORI;Lu;0;L;;;;;N;;;;2CCD;
+2CCD;COPTIC SMALL LETTER OLD COPTIC HORI;Ll;0;L;;;;;N;;;2CCC;;2CCC
+2CCE;COPTIC CAPITAL LETTER OLD COPTIC HA;Lu;0;L;;;;;N;;;;2CCF;
+2CCF;COPTIC SMALL LETTER OLD COPTIC HA;Ll;0;L;;;;;N;;;2CCE;;2CCE
+2CD0;COPTIC CAPITAL LETTER L-SHAPED HA;Lu;0;L;;;;;N;;;;2CD1;
+2CD1;COPTIC SMALL LETTER L-SHAPED HA;Ll;0;L;;;;;N;;;2CD0;;2CD0
+2CD2;COPTIC CAPITAL LETTER OLD COPTIC HEI;Lu;0;L;;;;;N;;;;2CD3;
+2CD3;COPTIC SMALL LETTER OLD COPTIC HEI;Ll;0;L;;;;;N;;;2CD2;;2CD2
+2CD4;COPTIC CAPITAL LETTER OLD COPTIC HAT;Lu;0;L;;;;;N;;;;2CD5;
+2CD5;COPTIC SMALL LETTER OLD COPTIC HAT;Ll;0;L;;;;;N;;;2CD4;;2CD4
+2CD6;COPTIC CAPITAL LETTER OLD COPTIC GANGIA;Lu;0;L;;;;;N;;;;2CD7;
+2CD7;COPTIC SMALL LETTER OLD COPTIC GANGIA;Ll;0;L;;;;;N;;;2CD6;;2CD6
+2CD8;COPTIC CAPITAL LETTER OLD COPTIC DJA;Lu;0;L;;;;;N;;;;2CD9;
+2CD9;COPTIC SMALL LETTER OLD COPTIC DJA;Ll;0;L;;;;;N;;;2CD8;;2CD8
+2CDA;COPTIC CAPITAL LETTER OLD COPTIC SHIMA;Lu;0;L;;;;;N;;;;2CDB;
+2CDB;COPTIC SMALL LETTER OLD COPTIC SHIMA;Ll;0;L;;;;;N;;;2CDA;;2CDA
+2CDC;COPTIC CAPITAL LETTER OLD NUBIAN SHIMA;Lu;0;L;;;;;N;;;;2CDD;
+2CDD;COPTIC SMALL LETTER OLD NUBIAN SHIMA;Ll;0;L;;;;;N;;;2CDC;;2CDC
+2CDE;COPTIC CAPITAL LETTER OLD NUBIAN NGI;Lu;0;L;;;;;N;;;;2CDF;
+2CDF;COPTIC SMALL LETTER OLD NUBIAN NGI;Ll;0;L;;;;;N;;;2CDE;;2CDE
+2CE0;COPTIC CAPITAL LETTER OLD NUBIAN NYI;Lu;0;L;;;;;N;;;;2CE1;
+2CE1;COPTIC SMALL LETTER OLD NUBIAN NYI;Ll;0;L;;;;;N;;;2CE0;;2CE0
+2CE2;COPTIC CAPITAL LETTER OLD NUBIAN WAU;Lu;0;L;;;;;N;;;;2CE3;
+2CE3;COPTIC SMALL LETTER OLD NUBIAN WAU;Ll;0;L;;;;;N;;;2CE2;;2CE2
+2CE4;COPTIC SYMBOL KAI;Ll;0;L;;;;;N;;;;;
+2CE5;COPTIC SYMBOL MI RO;So;0;ON;;;;;N;;;;;
+2CE6;COPTIC SYMBOL PI RO;So;0;ON;;;;;N;;;;;
+2CE7;COPTIC SYMBOL STAUROS;So;0;ON;;;;;N;;;;;
+2CE8;COPTIC SYMBOL TAU RO;So;0;ON;;;;;N;;;;;
+2CE9;COPTIC SYMBOL KHI RO;So;0;ON;;;;;N;;;;;
+2CEA;COPTIC SYMBOL SHIMA SIMA;So;0;ON;;;;;N;;;;;
+2CF9;COPTIC OLD NUBIAN FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFA;COPTIC OLD NUBIAN DIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFB;COPTIC OLD NUBIAN INDIRECT QUESTION MARK;Po;0;ON;;;;;N;;;;;
+2CFC;COPTIC OLD NUBIAN VERSE DIVIDER;Po;0;ON;;;;;N;;;;;
+2CFD;COPTIC FRACTION ONE HALF;No;0;ON;;;;1/2;N;;;;;
+2CFE;COPTIC FULL STOP;Po;0;ON;;;;;N;;;;;
+2CFF;COPTIC MORPHOLOGICAL DIVIDER;Po;0;ON;;;;;N;;;;;
+2D00;GEORGIAN SMALL LETTER AN;Ll;0;L;;;;;N;;Khutsuri;10A0;;10A0
+2D01;GEORGIAN SMALL LETTER BAN;Ll;0;L;;;;;N;;Khutsuri;10A1;;10A1
+2D02;GEORGIAN SMALL LETTER GAN;Ll;0;L;;;;;N;;Khutsuri;10A2;;10A2
+2D03;GEORGIAN SMALL LETTER DON;Ll;0;L;;;;;N;;Khutsuri;10A3;;10A3
+2D04;GEORGIAN SMALL LETTER EN;Ll;0;L;;;;;N;;Khutsuri;10A4;;10A4
+2D05;GEORGIAN SMALL LETTER VIN;Ll;0;L;;;;;N;;Khutsuri;10A5;;10A5
+2D06;GEORGIAN SMALL LETTER ZEN;Ll;0;L;;;;;N;;Khutsuri;10A6;;10A6
+2D07;GEORGIAN SMALL LETTER TAN;Ll;0;L;;;;;N;;Khutsuri;10A7;;10A7
+2D08;GEORGIAN SMALL LETTER IN;Ll;0;L;;;;;N;;Khutsuri;10A8;;10A8
+2D09;GEORGIAN SMALL LETTER KAN;Ll;0;L;;;;;N;;Khutsuri;10A9;;10A9
+2D0A;GEORGIAN SMALL LETTER LAS;Ll;0;L;;;;;N;;Khutsuri;10AA;;10AA
+2D0B;GEORGIAN SMALL LETTER MAN;Ll;0;L;;;;;N;;Khutsuri;10AB;;10AB
+2D0C;GEORGIAN SMALL LETTER NAR;Ll;0;L;;;;;N;;Khutsuri;10AC;;10AC
+2D0D;GEORGIAN SMALL LETTER ON;Ll;0;L;;;;;N;;Khutsuri;10AD;;10AD
+2D0E;GEORGIAN SMALL LETTER PAR;Ll;0;L;;;;;N;;Khutsuri;10AE;;10AE
+2D0F;GEORGIAN SMALL LETTER ZHAR;Ll;0;L;;;;;N;;Khutsuri;10AF;;10AF
+2D10;GEORGIAN SMALL LETTER RAE;Ll;0;L;;;;;N;;Khutsuri;10B0;;10B0
+2D11;GEORGIAN SMALL LETTER SAN;Ll;0;L;;;;;N;;Khutsuri;10B1;;10B1
+2D12;GEORGIAN SMALL LETTER TAR;Ll;0;L;;;;;N;;Khutsuri;10B2;;10B2
+2D13;GEORGIAN SMALL LETTER UN;Ll;0;L;;;;;N;;Khutsuri;10B3;;10B3
+2D14;GEORGIAN SMALL LETTER PHAR;Ll;0;L;;;;;N;;Khutsuri;10B4;;10B4
+2D15;GEORGIAN SMALL LETTER KHAR;Ll;0;L;;;;;N;;Khutsuri;10B5;;10B5
+2D16;GEORGIAN SMALL LETTER GHAN;Ll;0;L;;;;;N;;Khutsuri;10B6;;10B6
+2D17;GEORGIAN SMALL LETTER QAR;Ll;0;L;;;;;N;;Khutsuri;10B7;;10B7
+2D18;GEORGIAN SMALL LETTER SHIN;Ll;0;L;;;;;N;;Khutsuri;10B8;;10B8
+2D19;GEORGIAN SMALL LETTER CHIN;Ll;0;L;;;;;N;;Khutsuri;10B9;;10B9
+2D1A;GEORGIAN SMALL LETTER CAN;Ll;0;L;;;;;N;;Khutsuri;10BA;;10BA
+2D1B;GEORGIAN SMALL LETTER JIL;Ll;0;L;;;;;N;;Khutsuri;10BB;;10BB
+2D1C;GEORGIAN SMALL LETTER CIL;Ll;0;L;;;;;N;;Khutsuri;10BC;;10BC
+2D1D;GEORGIAN SMALL LETTER CHAR;Ll;0;L;;;;;N;;Khutsuri;10BD;;10BD
+2D1E;GEORGIAN SMALL LETTER XAN;Ll;0;L;;;;;N;;Khutsuri;10BE;;10BE
+2D1F;GEORGIAN SMALL LETTER JHAN;Ll;0;L;;;;;N;;Khutsuri;10BF;;10BF
+2D20;GEORGIAN SMALL LETTER HAE;Ll;0;L;;;;;N;;Khutsuri;10C0;;10C0
+2D21;GEORGIAN SMALL LETTER HE;Ll;0;L;;;;;N;;Khutsuri;10C1;;10C1
+2D22;GEORGIAN SMALL LETTER HIE;Ll;0;L;;;;;N;;Khutsuri;10C2;;10C2
+2D23;GEORGIAN SMALL LETTER WE;Ll;0;L;;;;;N;;Khutsuri;10C3;;10C3
+2D24;GEORGIAN SMALL LETTER HAR;Ll;0;L;;;;;N;;Khutsuri;10C4;;10C4
+2D25;GEORGIAN SMALL LETTER HOE;Ll;0;L;;;;;N;;Khutsuri;10C5;;10C5
+2D30;TIFINAGH LETTER YA;Lo;0;L;;;;;N;;;;;
+2D31;TIFINAGH LETTER YAB;Lo;0;L;;;;;N;;;;;
+2D32;TIFINAGH LETTER YABH;Lo;0;L;;;;;N;;;;;
+2D33;TIFINAGH LETTER YAG;Lo;0;L;;;;;N;;;;;
+2D34;TIFINAGH LETTER YAGHH;Lo;0;L;;;;;N;;;;;
+2D35;TIFINAGH LETTER BERBER ACADEMY YAJ;Lo;0;L;;;;;N;;;;;
+2D36;TIFINAGH LETTER YAJ;Lo;0;L;;;;;N;;;;;
+2D37;TIFINAGH LETTER YAD;Lo;0;L;;;;;N;;;;;
+2D38;TIFINAGH LETTER YADH;Lo;0;L;;;;;N;;;;;
+2D39;TIFINAGH LETTER YADD;Lo;0;L;;;;;N;;;;;
+2D3A;TIFINAGH LETTER YADDH;Lo;0;L;;;;;N;;;;;
+2D3B;TIFINAGH LETTER YEY;Lo;0;L;;;;;N;;;;;
+2D3C;TIFINAGH LETTER YAF;Lo;0;L;;;;;N;;;;;
+2D3D;TIFINAGH LETTER YAK;Lo;0;L;;;;;N;;;;;
+2D3E;TIFINAGH LETTER TUAREG YAK;Lo;0;L;;;;;N;;;;;
+2D3F;TIFINAGH LETTER YAKHH;Lo;0;L;;;;;N;;;;;
+2D40;TIFINAGH LETTER YAH;Lo;0;L;;;;;N;;Tuareg yab;;;
+2D41;TIFINAGH LETTER BERBER ACADEMY YAH;Lo;0;L;;;;;N;;;;;
+2D42;TIFINAGH LETTER TUAREG YAH;Lo;0;L;;;;;N;;;;;
+2D43;TIFINAGH LETTER YAHH;Lo;0;L;;;;;N;;;;;
+2D44;TIFINAGH LETTER YAA;Lo;0;L;;;;;N;;;;;
+2D45;TIFINAGH LETTER YAKH;Lo;0;L;;;;;N;;;;;
+2D46;TIFINAGH LETTER TUAREG YAKH;Lo;0;L;;;;;N;;;;;
+2D47;TIFINAGH LETTER YAQ;Lo;0;L;;;;;N;;;;;
+2D48;TIFINAGH LETTER TUAREG YAQ;Lo;0;L;;;;;N;;;;;
+2D49;TIFINAGH LETTER YI;Lo;0;L;;;;;N;;;;;
+2D4A;TIFINAGH LETTER YAZH;Lo;0;L;;;;;N;;;;;
+2D4B;TIFINAGH LETTER AHAGGAR YAZH;Lo;0;L;;;;;N;;;;;
+2D4C;TIFINAGH LETTER TUAREG YAZH;Lo;0;L;;;;;N;;;;;
+2D4D;TIFINAGH LETTER YAL;Lo;0;L;;;;;N;;;;;
+2D4E;TIFINAGH LETTER YAM;Lo;0;L;;;;;N;;;;;
+2D4F;TIFINAGH LETTER YAN;Lo;0;L;;;;;N;;;;;
+2D50;TIFINAGH LETTER TUAREG YAGN;Lo;0;L;;;;;N;;;;;
+2D51;TIFINAGH LETTER TUAREG YANG;Lo;0;L;;;;;N;;;;;
+2D52;TIFINAGH LETTER YAP;Lo;0;L;;;;;N;;;;;
+2D53;TIFINAGH LETTER YU;Lo;0;L;;;;;N;;Tuareg yaw;;;
+2D54;TIFINAGH LETTER YAR;Lo;0;L;;;;;N;;;;;
+2D55;TIFINAGH LETTER YARR;Lo;0;L;;;;;N;;;;;
+2D56;TIFINAGH LETTER YAGH;Lo;0;L;;;;;N;;;;;
+2D57;TIFINAGH LETTER TUAREG YAGH;Lo;0;L;;;;;N;;;;;
+2D58;TIFINAGH LETTER AYER YAGH;Lo;0;L;;;;;N;;Adrar yaj;;;
+2D59;TIFINAGH LETTER YAS;Lo;0;L;;;;;N;;;;;
+2D5A;TIFINAGH LETTER YASS;Lo;0;L;;;;;N;;;;;
+2D5B;TIFINAGH LETTER YASH;Lo;0;L;;;;;N;;;;;
+2D5C;TIFINAGH LETTER YAT;Lo;0;L;;;;;N;;;;;
+2D5D;TIFINAGH LETTER YATH;Lo;0;L;;;;;N;;;;;
+2D5E;TIFINAGH LETTER YACH;Lo;0;L;;;;;N;;;;;
+2D5F;TIFINAGH LETTER YATT;Lo;0;L;;;;;N;;;;;
+2D60;TIFINAGH LETTER YAV;Lo;0;L;;;;;N;;;;;
+2D61;TIFINAGH LETTER YAW;Lo;0;L;;;;;N;;;;;
+2D62;TIFINAGH LETTER YAY;Lo;0;L;;;;;N;;;;;
+2D63;TIFINAGH LETTER YAZ;Lo;0;L;;;;;N;;;;;
+2D64;TIFINAGH LETTER TAWELLEMET YAZ;Lo;0;L;;;;;N;;harpoon yaz;;;
+2D65;TIFINAGH LETTER YAZZ;Lo;0;L;;;;;N;;;;;
+2D6F;TIFINAGH MODIFIER LETTER LABIALIZATION MARK;Lm;0;L;<super> 2D61;;;;N;;tamatart;;;
+2D80;ETHIOPIC SYLLABLE LOA;Lo;0;L;;;;;N;;;;;
+2D81;ETHIOPIC SYLLABLE MOA;Lo;0;L;;;;;N;;;;;
+2D82;ETHIOPIC SYLLABLE ROA;Lo;0;L;;;;;N;;;;;
+2D83;ETHIOPIC SYLLABLE SOA;Lo;0;L;;;;;N;;;;;
+2D84;ETHIOPIC SYLLABLE SHOA;Lo;0;L;;;;;N;;;;;
+2D85;ETHIOPIC SYLLABLE BOA;Lo;0;L;;;;;N;;;;;
+2D86;ETHIOPIC SYLLABLE TOA;Lo;0;L;;;;;N;;;;;
+2D87;ETHIOPIC SYLLABLE COA;Lo;0;L;;;;;N;;;;;
+2D88;ETHIOPIC SYLLABLE NOA;Lo;0;L;;;;;N;;;;;
+2D89;ETHIOPIC SYLLABLE NYOA;Lo;0;L;;;;;N;;;;;
+2D8A;ETHIOPIC SYLLABLE GLOTTAL OA;Lo;0;L;;;;;N;;;;;
+2D8B;ETHIOPIC SYLLABLE ZOA;Lo;0;L;;;;;N;;;;;
+2D8C;ETHIOPIC SYLLABLE DOA;Lo;0;L;;;;;N;;;;;
+2D8D;ETHIOPIC SYLLABLE DDOA;Lo;0;L;;;;;N;;;;;
+2D8E;ETHIOPIC SYLLABLE JOA;Lo;0;L;;;;;N;;;;;
+2D8F;ETHIOPIC SYLLABLE THOA;Lo;0;L;;;;;N;;;;;
+2D90;ETHIOPIC SYLLABLE CHOA;Lo;0;L;;;;;N;;;;;
+2D91;ETHIOPIC SYLLABLE PHOA;Lo;0;L;;;;;N;;;;;
+2D92;ETHIOPIC SYLLABLE POA;Lo;0;L;;;;;N;;;;;
+2D93;ETHIOPIC SYLLABLE GGWA;Lo;0;L;;;;;N;;;;;
+2D94;ETHIOPIC SYLLABLE GGWI;Lo;0;L;;;;;N;;;;;
+2D95;ETHIOPIC SYLLABLE GGWEE;Lo;0;L;;;;;N;;;;;
+2D96;ETHIOPIC SYLLABLE GGWE;Lo;0;L;;;;;N;;;;;
+2DA0;ETHIOPIC SYLLABLE SSA;Lo;0;L;;;;;N;;;;;
+2DA1;ETHIOPIC SYLLABLE SSU;Lo;0;L;;;;;N;;;;;
+2DA2;ETHIOPIC SYLLABLE SSI;Lo;0;L;;;;;N;;;;;
+2DA3;ETHIOPIC SYLLABLE SSAA;Lo;0;L;;;;;N;;;;;
+2DA4;ETHIOPIC SYLLABLE SSEE;Lo;0;L;;;;;N;;;;;
+2DA5;ETHIOPIC SYLLABLE SSE;Lo;0;L;;;;;N;;;;;
+2DA6;ETHIOPIC SYLLABLE SSO;Lo;0;L;;;;;N;;;;;
+2DA8;ETHIOPIC SYLLABLE CCA;Lo;0;L;;;;;N;;;;;
+2DA9;ETHIOPIC SYLLABLE CCU;Lo;0;L;;;;;N;;;;;
+2DAA;ETHIOPIC SYLLABLE CCI;Lo;0;L;;;;;N;;;;;
+2DAB;ETHIOPIC SYLLABLE CCAA;Lo;0;L;;;;;N;;;;;
+2DAC;ETHIOPIC SYLLABLE CCEE;Lo;0;L;;;;;N;;;;;
+2DAD;ETHIOPIC SYLLABLE CCE;Lo;0;L;;;;;N;;;;;
+2DAE;ETHIOPIC SYLLABLE CCO;Lo;0;L;;;;;N;;;;;
+2DB0;ETHIOPIC SYLLABLE ZZA;Lo;0;L;;;;;N;;;;;
+2DB1;ETHIOPIC SYLLABLE ZZU;Lo;0;L;;;;;N;;;;;
+2DB2;ETHIOPIC SYLLABLE ZZI;Lo;0;L;;;;;N;;;;;
+2DB3;ETHIOPIC SYLLABLE ZZAA;Lo;0;L;;;;;N;;;;;
+2DB4;ETHIOPIC SYLLABLE ZZEE;Lo;0;L;;;;;N;;;;;
+2DB5;ETHIOPIC SYLLABLE ZZE;Lo;0;L;;;;;N;;;;;
+2DB6;ETHIOPIC SYLLABLE ZZO;Lo;0;L;;;;;N;;;;;
+2DB8;ETHIOPIC SYLLABLE CCHA;Lo;0;L;;;;;N;;;;;
+2DB9;ETHIOPIC SYLLABLE CCHU;Lo;0;L;;;;;N;;;;;
+2DBA;ETHIOPIC SYLLABLE CCHI;Lo;0;L;;;;;N;;;;;
+2DBB;ETHIOPIC SYLLABLE CCHAA;Lo;0;L;;;;;N;;;;;
+2DBC;ETHIOPIC SYLLABLE CCHEE;Lo;0;L;;;;;N;;;;;
+2DBD;ETHIOPIC SYLLABLE CCHE;Lo;0;L;;;;;N;;;;;
+2DBE;ETHIOPIC SYLLABLE CCHO;Lo;0;L;;;;;N;;;;;
+2DC0;ETHIOPIC SYLLABLE QYA;Lo;0;L;;;;;N;;;;;
+2DC1;ETHIOPIC SYLLABLE QYU;Lo;0;L;;;;;N;;;;;
+2DC2;ETHIOPIC SYLLABLE QYI;Lo;0;L;;;;;N;;;;;
+2DC3;ETHIOPIC SYLLABLE QYAA;Lo;0;L;;;;;N;;;;;
+2DC4;ETHIOPIC SYLLABLE QYEE;Lo;0;L;;;;;N;;;;;
+2DC5;ETHIOPIC SYLLABLE QYE;Lo;0;L;;;;;N;;;;;
+2DC6;ETHIOPIC SYLLABLE QYO;Lo;0;L;;;;;N;;;;;
+2DC8;ETHIOPIC SYLLABLE KYA;Lo;0;L;;;;;N;;;;;
+2DC9;ETHIOPIC SYLLABLE KYU;Lo;0;L;;;;;N;;;;;
+2DCA;ETHIOPIC SYLLABLE KYI;Lo;0;L;;;;;N;;;;;
+2DCB;ETHIOPIC SYLLABLE KYAA;Lo;0;L;;;;;N;;;;;
+2DCC;ETHIOPIC SYLLABLE KYEE;Lo;0;L;;;;;N;;;;;
+2DCD;ETHIOPIC SYLLABLE KYE;Lo;0;L;;;;;N;;;;;
+2DCE;ETHIOPIC SYLLABLE KYO;Lo;0;L;;;;;N;;;;;
+2DD0;ETHIOPIC SYLLABLE XYA;Lo;0;L;;;;;N;;;;;
+2DD1;ETHIOPIC SYLLABLE XYU;Lo;0;L;;;;;N;;;;;
+2DD2;ETHIOPIC SYLLABLE XYI;Lo;0;L;;;;;N;;;;;
+2DD3;ETHIOPIC SYLLABLE XYAA;Lo;0;L;;;;;N;;;;;
+2DD4;ETHIOPIC SYLLABLE XYEE;Lo;0;L;;;;;N;;;;;
+2DD5;ETHIOPIC SYLLABLE XYE;Lo;0;L;;;;;N;;;;;
+2DD6;ETHIOPIC SYLLABLE XYO;Lo;0;L;;;;;N;;;;;
+2DD8;ETHIOPIC SYLLABLE GYA;Lo;0;L;;;;;N;;;;;
+2DD9;ETHIOPIC SYLLABLE GYU;Lo;0;L;;;;;N;;;;;
+2DDA;ETHIOPIC SYLLABLE GYI;Lo;0;L;;;;;N;;;;;
+2DDB;ETHIOPIC SYLLABLE GYAA;Lo;0;L;;;;;N;;;;;
+2DDC;ETHIOPIC SYLLABLE GYEE;Lo;0;L;;;;;N;;;;;
+2DDD;ETHIOPIC SYLLABLE GYE;Lo;0;L;;;;;N;;;;;
+2DDE;ETHIOPIC SYLLABLE GYO;Lo;0;L;;;;;N;;;;;
+2E00;RIGHT ANGLE SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E01;RIGHT ANGLE DOTTED SUBSTITUTION MARKER;Po;0;ON;;;;;N;;;;;
+2E02;LEFT SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E03;RIGHT SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E04;LEFT DOTTED SUBSTITUTION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E05;RIGHT DOTTED SUBSTITUTION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E06;RAISED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E07;RAISED DOTTED INTERPOLATION MARKER;Po;0;ON;;;;;N;;;;;
+2E08;DOTTED TRANSPOSITION MARKER;Po;0;ON;;;;;N;;;;;
+2E09;LEFT TRANSPOSITION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0A;RIGHT TRANSPOSITION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0B;RAISED SQUARE;Po;0;ON;;;;;N;;;;;
+2E0C;LEFT RAISED OMISSION BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E0D;RIGHT RAISED OMISSION BRACKET;Pf;0;ON;;;;;Y;;;;;
+2E0E;EDITORIAL CORONIS;Po;0;ON;;;;;N;;;;;
+2E0F;PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E10;FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E11;REVERSED FORKED PARAGRAPHOS;Po;0;ON;;;;;N;;;;;
+2E12;HYPODIASTOLE;Po;0;ON;;;;;N;;;;;
+2E13;DOTTED OBELOS;Po;0;ON;;;;;N;;;;;
+2E14;DOWNWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E15;UPWARDS ANCORA;Po;0;ON;;;;;N;;;;;
+2E16;DOTTED RIGHT-POINTING ANGLE;Po;0;ON;;;;;N;;;;;
+2E17;DOUBLE OBLIQUE HYPHEN;Pd;0;ON;;;;;N;;;;;
+2E1C;LEFT LOW PARAPHRASE BRACKET;Pi;0;ON;;;;;Y;;;;;
+2E1D;RIGHT LOW PARAPHRASE BRACKET;Pf;0;ON;;;;;Y;;;;;
+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;;;;;Y;;;;;
+301E;DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;Y;;;;;
+301F;LOW DOUBLE PRIME QUOTATION MARK;Pe;0;ON;;;;;Y;;;;;
+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;;;;;
+303B;VERTICAL IDEOGRAPHIC ITERATION MARK;Lm;0;L;;;;;N;;;;;
+303C;MASU MARK;Lo;0;L;;;;;N;;;;;
+303D;PART ALTERNATION MARK;Po;0;ON;;;;;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;;;;;
+3095;HIRAGANA LETTER SMALL KA;Lo;0;L;;;;;N;;;;;
+3096;HIRAGANA LETTER SMALL KE;Lo;0;L;;;;;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;;;;;
+309F;HIRAGANA DIGRAPH YORI;Lo;0;L;<vertical> 3088 308A;;;;N;;;;;
+30A0;KATAKANA-HIRAGANA DOUBLE HYPHEN;Pd;0;ON;;;;;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;Po;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;;;;;
+30FF;KATAKANA DIGRAPH KOTO;Lo;0;L;<vertical> 30B3 30C8;;;;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;;;;;
+31C0;CJK STROKE T;So;0;ON;;;;;N;;;;;
+31C1;CJK STROKE WG;So;0;ON;;;;;N;;;;;
+31C2;CJK STROKE XG;So;0;ON;;;;;N;;;;;
+31C3;CJK STROKE BXG;So;0;ON;;;;;N;;;;;
+31C4;CJK STROKE SW;So;0;ON;;;;;N;;;;;
+31C5;CJK STROKE HZZ;So;0;ON;;;;;N;;;;;
+31C6;CJK STROKE HZG;So;0;ON;;;;;N;;;;;
+31C7;CJK STROKE HP;So;0;ON;;;;;N;;;;;
+31C8;CJK STROKE HZWG;So;0;ON;;;;;N;;;;;
+31C9;CJK STROKE SZWG;So;0;ON;;;;;N;;;;;
+31CA;CJK STROKE HZT;So;0;ON;;;;;N;;;;;
+31CB;CJK STROKE HZZP;So;0;ON;;;;;N;;;;;
+31CC;CJK STROKE HPWG;So;0;ON;;;;;N;;;;;
+31CD;CJK STROKE HZW;So;0;ON;;;;;N;;;;;
+31CE;CJK STROKE HZZZ;So;0;ON;;;;;N;;;;;
+31CF;CJK STROKE N;So;0;ON;;;;;N;;;;;
+31F0;KATAKANA LETTER SMALL KU;Lo;0;L;;;;;N;;;;;
+31F1;KATAKANA LETTER SMALL SI;Lo;0;L;;;;;N;;;;;
+31F2;KATAKANA LETTER SMALL SU;Lo;0;L;;;;;N;;;;;
+31F3;KATAKANA LETTER SMALL TO;Lo;0;L;;;;;N;;;;;
+31F4;KATAKANA LETTER SMALL NU;Lo;0;L;;;;;N;;;;;
+31F5;KATAKANA LETTER SMALL HA;Lo;0;L;;;;;N;;;;;
+31F6;KATAKANA LETTER SMALL HI;Lo;0;L;;;;;N;;;;;
+31F7;KATAKANA LETTER SMALL HU;Lo;0;L;;;;;N;;;;;
+31F8;KATAKANA LETTER SMALL HE;Lo;0;L;;;;;N;;;;;
+31F9;KATAKANA LETTER SMALL HO;Lo;0;L;;;;;N;;;;;
+31FA;KATAKANA LETTER SMALL MU;Lo;0;L;;;;;N;;;;;
+31FB;KATAKANA LETTER SMALL RA;Lo;0;L;;;;;N;;;;;
+31FC;KATAKANA LETTER SMALL RI;Lo;0;L;;;;;N;;;;;
+31FD;KATAKANA LETTER SMALL RU;Lo;0;L;;;;;N;;;;;
+31FE;KATAKANA LETTER SMALL RE;Lo;0;L;;;;;N;;;;;
+31FF;KATAKANA LETTER SMALL RO;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;;;;
+321D;PARENTHESIZED KOREAN CHARACTER OJEON;So;0;ON;<compat> 0028 110B 1169 110C 1165 11AB 0029;;;;N;;;;;
+321E;PARENTHESIZED KOREAN CHARACTER O HU;So;0;ON;<compat> 0028 110B 1169 1112 116E 0029;;;;N;;;;;
+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;;;;;
+3250;PARTNERSHIP SIGN;So;0;ON;<square> 0050 0054 0045;;;;N;;;;;
+3251;CIRCLED NUMBER TWENTY ONE;No;0;ON;<circle> 0032 0031;;;21;N;;;;;
+3252;CIRCLED NUMBER TWENTY TWO;No;0;ON;<circle> 0032 0032;;;22;N;;;;;
+3253;CIRCLED NUMBER TWENTY THREE;No;0;ON;<circle> 0032 0033;;;23;N;;;;;
+3254;CIRCLED NUMBER TWENTY FOUR;No;0;ON;<circle> 0032 0034;;;24;N;;;;;
+3255;CIRCLED NUMBER TWENTY FIVE;No;0;ON;<circle> 0032 0035;;;25;N;;;;;
+3256;CIRCLED NUMBER TWENTY SIX;No;0;ON;<circle> 0032 0036;;;26;N;;;;;
+3257;CIRCLED NUMBER TWENTY SEVEN;No;0;ON;<circle> 0032 0037;;;27;N;;;;;
+3258;CIRCLED NUMBER TWENTY EIGHT;No;0;ON;<circle> 0032 0038;;;28;N;;;;;
+3259;CIRCLED NUMBER TWENTY NINE;No;0;ON;<circle> 0032 0039;;;29;N;;;;;
+325A;CIRCLED NUMBER THIRTY;No;0;ON;<circle> 0033 0030;;;30;N;;;;;
+325B;CIRCLED NUMBER THIRTY ONE;No;0;ON;<circle> 0033 0031;;;31;N;;;;;
+325C;CIRCLED NUMBER THIRTY TWO;No;0;ON;<circle> 0033 0032;;;32;N;;;;;
+325D;CIRCLED NUMBER THIRTY THREE;No;0;ON;<circle> 0033 0033;;;33;N;;;;;
+325E;CIRCLED NUMBER THIRTY FOUR;No;0;ON;<circle> 0033 0034;;;34;N;;;;;
+325F;CIRCLED NUMBER THIRTY FIVE;No;0;ON;<circle> 0033 0035;;;35;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;;;;
+327C;CIRCLED KOREAN CHARACTER CHAMKO;So;0;ON;<circle> 110E 1161 11B7 1100 1169;;;;N;;;;;
+327D;CIRCLED KOREAN CHARACTER JUEUI;So;0;ON;<circle> 110C 116E 110B 1174;;;;N;;;;;
+327E;CIRCLED HANGUL IEUNG U;So;0;ON;<circle> 110B 116E;;;;N;;;;;
+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;;;;;
+32B1;CIRCLED NUMBER THIRTY SIX;No;0;ON;<circle> 0033 0036;;;36;N;;;;;
+32B2;CIRCLED NUMBER THIRTY SEVEN;No;0;ON;<circle> 0033 0037;;;37;N;;;;;
+32B3;CIRCLED NUMBER THIRTY EIGHT;No;0;ON;<circle> 0033 0038;;;38;N;;;;;
+32B4;CIRCLED NUMBER THIRTY NINE;No;0;ON;<circle> 0033 0039;;;39;N;;;;;
+32B5;CIRCLED NUMBER FORTY;No;0;ON;<circle> 0034 0030;;;40;N;;;;;
+32B6;CIRCLED NUMBER FORTY ONE;No;0;ON;<circle> 0034 0031;;;41;N;;;;;
+32B7;CIRCLED NUMBER FORTY TWO;No;0;ON;<circle> 0034 0032;;;42;N;;;;;
+32B8;CIRCLED NUMBER FORTY THREE;No;0;ON;<circle> 0034 0033;;;43;N;;;;;
+32B9;CIRCLED NUMBER FORTY FOUR;No;0;ON;<circle> 0034 0034;;;44;N;;;;;
+32BA;CIRCLED NUMBER FORTY FIVE;No;0;ON;<circle> 0034 0035;;;45;N;;;;;
+32BB;CIRCLED NUMBER FORTY SIX;No;0;ON;<circle> 0034 0036;;;46;N;;;;;
+32BC;CIRCLED NUMBER FORTY SEVEN;No;0;ON;<circle> 0034 0037;;;47;N;;;;;
+32BD;CIRCLED NUMBER FORTY EIGHT;No;0;ON;<circle> 0034 0038;;;48;N;;;;;
+32BE;CIRCLED NUMBER FORTY NINE;No;0;ON;<circle> 0034 0039;;;49;N;;;;;
+32BF;CIRCLED NUMBER FIFTY;No;0;ON;<circle> 0035 0030;;;50;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;;;;;
+32CC;SQUARE HG;So;0;ON;<square> 0048 0067;;;;N;;;;;
+32CD;SQUARE ERG;So;0;ON;<square> 0065 0072 0067;;;;N;;;;;
+32CE;SQUARE EV;So;0;ON;<square> 0065 0056;;;;N;;;;;
+32CF;LIMITED LIABILITY SIGN;So;0;ON;<square> 004C 0054 0044;;;;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;;;;;
+3377;SQUARE DM;So;0;ON;<square> 0064 006D;;;;N;;;;;
+3378;SQUARE DM SQUARED;So;0;ON;<square> 0064 006D 00B2;;;;N;;;;;
+3379;SQUARE DM CUBED;So;0;ON;<square> 0064 006D 00B3;;;;N;;;;;
+337A;SQUARE IU;So;0;ON;<square> 0049 0055;;;;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;;;;
+33DE;SQUARE V OVER M;So;0;ON;<square> 0056 2215 006D;;;;N;;;;;
+33DF;SQUARE A OVER M;So;0;ON;<square> 0041 2215 006D;;;;N;;;;;
+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;;;;;
+33FF;SQUARE GAL;So;0;ON;<square> 0067 0061 006C;;;;N;;;;;
+3400;<CJK Ideograph Extension A, First>;Lo;0;L;;;;;N;;;;;
+4DB5;<CJK Ideograph Extension A, Last>;Lo;0;L;;;;;N;;;;;
+4DC0;HEXAGRAM FOR THE CREATIVE HEAVEN;So;0;ON;;;;;N;;;;;
+4DC1;HEXAGRAM FOR THE RECEPTIVE EARTH;So;0;ON;;;;;N;;;;;
+4DC2;HEXAGRAM FOR DIFFICULTY AT THE BEGINNING;So;0;ON;;;;;N;;;;;
+4DC3;HEXAGRAM FOR YOUTHFUL FOLLY;So;0;ON;;;;;N;;;;;
+4DC4;HEXAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+4DC5;HEXAGRAM FOR CONFLICT;So;0;ON;;;;;N;;;;;
+4DC6;HEXAGRAM FOR THE ARMY;So;0;ON;;;;;N;;;;;
+4DC7;HEXAGRAM FOR HOLDING TOGETHER;So;0;ON;;;;;N;;;;;
+4DC8;HEXAGRAM FOR SMALL TAMING;So;0;ON;;;;;N;;;;;
+4DC9;HEXAGRAM FOR TREADING;So;0;ON;;;;;N;;;;;
+4DCA;HEXAGRAM FOR PEACE;So;0;ON;;;;;N;;;;;
+4DCB;HEXAGRAM FOR STANDSTILL;So;0;ON;;;;;N;;;;;
+4DCC;HEXAGRAM FOR FELLOWSHIP;So;0;ON;;;;;N;;;;;
+4DCD;HEXAGRAM FOR GREAT POSSESSION;So;0;ON;;;;;N;;;;;
+4DCE;HEXAGRAM FOR MODESTY;So;0;ON;;;;;N;;;;;
+4DCF;HEXAGRAM FOR ENTHUSIASM;So;0;ON;;;;;N;;;;;
+4DD0;HEXAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+4DD1;HEXAGRAM FOR WORK ON THE DECAYED;So;0;ON;;;;;N;;;;;
+4DD2;HEXAGRAM FOR APPROACH;So;0;ON;;;;;N;;;;;
+4DD3;HEXAGRAM FOR CONTEMPLATION;So;0;ON;;;;;N;;;;;
+4DD4;HEXAGRAM FOR BITING THROUGH;So;0;ON;;;;;N;;;;;
+4DD5;HEXAGRAM FOR GRACE;So;0;ON;;;;;N;;;;;
+4DD6;HEXAGRAM FOR SPLITTING APART;So;0;ON;;;;;N;;;;;
+4DD7;HEXAGRAM FOR RETURN;So;0;ON;;;;;N;;;;;
+4DD8;HEXAGRAM FOR INNOCENCE;So;0;ON;;;;;N;;;;;
+4DD9;HEXAGRAM FOR GREAT TAMING;So;0;ON;;;;;N;;;;;
+4DDA;HEXAGRAM FOR MOUTH CORNERS;So;0;ON;;;;;N;;;;;
+4DDB;HEXAGRAM FOR GREAT PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DDC;HEXAGRAM FOR THE ABYSMAL WATER;So;0;ON;;;;;N;;;;;
+4DDD;HEXAGRAM FOR THE CLINGING FIRE;So;0;ON;;;;;N;;;;;
+4DDE;HEXAGRAM FOR INFLUENCE;So;0;ON;;;;;N;;;;;
+4DDF;HEXAGRAM FOR DURATION;So;0;ON;;;;;N;;;;;
+4DE0;HEXAGRAM FOR RETREAT;So;0;ON;;;;;N;;;;;
+4DE1;HEXAGRAM FOR GREAT POWER;So;0;ON;;;;;N;;;;;
+4DE2;HEXAGRAM FOR PROGRESS;So;0;ON;;;;;N;;;;;
+4DE3;HEXAGRAM FOR DARKENING OF THE LIGHT;So;0;ON;;;;;N;;;;;
+4DE4;HEXAGRAM FOR THE FAMILY;So;0;ON;;;;;N;;;;;
+4DE5;HEXAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+4DE6;HEXAGRAM FOR OBSTRUCTION;So;0;ON;;;;;N;;;;;
+4DE7;HEXAGRAM FOR DELIVERANCE;So;0;ON;;;;;N;;;;;
+4DE8;HEXAGRAM FOR DECREASE;So;0;ON;;;;;N;;;;;
+4DE9;HEXAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+4DEA;HEXAGRAM FOR BREAKTHROUGH;So;0;ON;;;;;N;;;;;
+4DEB;HEXAGRAM FOR COMING TO MEET;So;0;ON;;;;;N;;;;;
+4DEC;HEXAGRAM FOR GATHERING TOGETHER;So;0;ON;;;;;N;;;;;
+4DED;HEXAGRAM FOR PUSHING UPWARD;So;0;ON;;;;;N;;;;;
+4DEE;HEXAGRAM FOR OPPRESSION;So;0;ON;;;;;N;;;;;
+4DEF;HEXAGRAM FOR THE WELL;So;0;ON;;;;;N;;;;;
+4DF0;HEXAGRAM FOR REVOLUTION;So;0;ON;;;;;N;;;;;
+4DF1;HEXAGRAM FOR THE CAULDRON;So;0;ON;;;;;N;;;;;
+4DF2;HEXAGRAM FOR THE AROUSING THUNDER;So;0;ON;;;;;N;;;;;
+4DF3;HEXAGRAM FOR THE KEEPING STILL MOUNTAIN;So;0;ON;;;;;N;;;;;
+4DF4;HEXAGRAM FOR DEVELOPMENT;So;0;ON;;;;;N;;;;;
+4DF5;HEXAGRAM FOR THE MARRYING MAIDEN;So;0;ON;;;;;N;;;;;
+4DF6;HEXAGRAM FOR ABUNDANCE;So;0;ON;;;;;N;;;;;
+4DF7;HEXAGRAM FOR THE WANDERER;So;0;ON;;;;;N;;;;;
+4DF8;HEXAGRAM FOR THE GENTLE WIND;So;0;ON;;;;;N;;;;;
+4DF9;HEXAGRAM FOR THE JOYOUS LAKE;So;0;ON;;;;;N;;;;;
+4DFA;HEXAGRAM FOR DISPERSION;So;0;ON;;;;;N;;;;;
+4DFB;HEXAGRAM FOR LIMITATION;So;0;ON;;;;;N;;;;;
+4DFC;HEXAGRAM FOR INNER TRUTH;So;0;ON;;;;;N;;;;;
+4DFD;HEXAGRAM FOR SMALL PREPONDERANCE;So;0;ON;;;;;N;;;;;
+4DFE;HEXAGRAM FOR AFTER COMPLETION;So;0;ON;;;;;N;;;;;
+4DFF;HEXAGRAM FOR BEFORE COMPLETION;So;0;ON;;;;;N;;;;;
+4E00;<CJK Ideograph, First>;Lo;0;L;;;;;N;;;;;
+9FBB;<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;Lm;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;;;;;
+A4A2;YI RADICAL ZUP;So;0;ON;;;;;N;;;;;
+A4A3;YI RADICAL CYT;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;;;;;
+A4B4;YI RADICAL NZUP;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;;;;;
+A4C1;YI RADICAL ZUR;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;;;;;
+A4C5;YI RADICAL NBIE;So;0;ON;;;;;N;;;;;
+A4C6;YI RADICAL KE;So;0;ON;;;;;N;;;;;
+A700;MODIFIER LETTER CHINESE TONE YIN PING;Sk;0;ON;;;;;N;;;;;
+A701;MODIFIER LETTER CHINESE TONE YANG PING;Sk;0;ON;;;;;N;;;;;
+A702;MODIFIER LETTER CHINESE TONE YIN SHANG;Sk;0;ON;;;;;N;;;;;
+A703;MODIFIER LETTER CHINESE TONE YANG SHANG;Sk;0;ON;;;;;N;;;;;
+A704;MODIFIER LETTER CHINESE TONE YIN QU;Sk;0;ON;;;;;N;;;;;
+A705;MODIFIER LETTER CHINESE TONE YANG QU;Sk;0;ON;;;;;N;;;;;
+A706;MODIFIER LETTER CHINESE TONE YIN RU;Sk;0;ON;;;;;N;;;;;
+A707;MODIFIER LETTER CHINESE TONE YANG RU;Sk;0;ON;;;;;N;;;;;
+A708;MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A709;MODIFIER LETTER HIGH DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70A;MODIFIER LETTER MID DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70B;MODIFIER LETTER LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70C;MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70D;MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70E;MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A70F;MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A710;MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A711;MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A712;MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A713;MODIFIER LETTER HIGH LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A714;MODIFIER LETTER MID LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A715;MODIFIER LETTER LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A716;MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR;Sk;0;ON;;;;;N;;;;;
+A717;MODIFIER LETTER DOT VERTICAL BAR;Lm;0;ON;;;;;N;;;;;
+A718;MODIFIER LETTER DOT SLASH;Lm;0;ON;;;;;N;;;;;
+A719;MODIFIER LETTER DOT HORIZONTAL BAR;Lm;0;ON;;;;;N;;;;;
+A71A;MODIFIER LETTER LOWER RIGHT CORNER ANGLE;Lm;0;ON;;;;;N;;;;;
+A720;MODIFIER LETTER STRESS AND HIGH TONE;Sk;0;ON;;;;;N;;;;;
+A721;MODIFIER LETTER STRESS AND LOW TONE;Sk;0;ON;;;;;N;;;;;
+A800;SYLOTI NAGRI LETTER A;Lo;0;L;;;;;N;;;;;
+A801;SYLOTI NAGRI LETTER I;Lo;0;L;;;;;N;;;;;
+A802;SYLOTI NAGRI SIGN DVISVARA;Mc;0;NSM;;;;;N;;;;;
+A803;SYLOTI NAGRI LETTER U;Lo;0;L;;;;;N;;;;;
+A804;SYLOTI NAGRI LETTER E;Lo;0;L;;;;;N;;;;;
+A805;SYLOTI NAGRI LETTER O;Lo;0;L;;;;;N;;;;;
+A806;SYLOTI NAGRI SIGN HASANTA;Mn;9;NSM;;;;;N;;;;;
+A807;SYLOTI NAGRI LETTER KO;Lo;0;L;;;;;N;;;;;
+A808;SYLOTI NAGRI LETTER KHO;Lo;0;L;;;;;N;;;;;
+A809;SYLOTI NAGRI LETTER GO;Lo;0;L;;;;;N;;;;;
+A80A;SYLOTI NAGRI LETTER GHO;Lo;0;L;;;;;N;;;;;
+A80B;SYLOTI NAGRI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+A80C;SYLOTI NAGRI LETTER CO;Lo;0;L;;;;;N;;;;;
+A80D;SYLOTI NAGRI LETTER CHO;Lo;0;L;;;;;N;;;;;
+A80E;SYLOTI NAGRI LETTER JO;Lo;0;L;;;;;N;;;;;
+A80F;SYLOTI NAGRI LETTER JHO;Lo;0;L;;;;;N;;;;;
+A810;SYLOTI NAGRI LETTER TTO;Lo;0;L;;;;;N;;;;;
+A811;SYLOTI NAGRI LETTER TTHO;Lo;0;L;;;;;N;;;;;
+A812;SYLOTI NAGRI LETTER DDO;Lo;0;L;;;;;N;;;;;
+A813;SYLOTI NAGRI LETTER DDHO;Lo;0;L;;;;;N;;;;;
+A814;SYLOTI NAGRI LETTER TO;Lo;0;L;;;;;N;;;;;
+A815;SYLOTI NAGRI LETTER THO;Lo;0;L;;;;;N;;;;;
+A816;SYLOTI NAGRI LETTER DO;Lo;0;L;;;;;N;;;;;
+A817;SYLOTI NAGRI LETTER DHO;Lo;0;L;;;;;N;;;;;
+A818;SYLOTI NAGRI LETTER NO;Lo;0;L;;;;;N;;;;;
+A819;SYLOTI NAGRI LETTER PO;Lo;0;L;;;;;N;;;;;
+A81A;SYLOTI NAGRI LETTER PHO;Lo;0;L;;;;;N;;;;;
+A81B;SYLOTI NAGRI LETTER BO;Lo;0;L;;;;;N;;;;;
+A81C;SYLOTI NAGRI LETTER BHO;Lo;0;L;;;;;N;;;;;
+A81D;SYLOTI NAGRI LETTER MO;Lo;0;L;;;;;N;;;;;
+A81E;SYLOTI NAGRI LETTER RO;Lo;0;L;;;;;N;;;;;
+A81F;SYLOTI NAGRI LETTER LO;Lo;0;L;;;;;N;;;;;
+A820;SYLOTI NAGRI LETTER RRO;Lo;0;L;;;;;N;;;;;
+A821;SYLOTI NAGRI LETTER SO;Lo;0;L;;;;;N;;;;;
+A822;SYLOTI NAGRI LETTER HO;Lo;0;L;;;;;N;;;;;
+A823;SYLOTI NAGRI VOWEL SIGN A;Mc;0;L;;;;;N;;;;;
+A824;SYLOTI NAGRI VOWEL SIGN I;Mc;0;L;;;;;N;;;;;
+A825;SYLOTI NAGRI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+A826;SYLOTI NAGRI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+A827;SYLOTI NAGRI VOWEL SIGN OO;Mc;0;L;;;;;N;;;;;
+A828;SYLOTI NAGRI POETRY MARK-1;So;0;ON;;;;;N;;;;;
+A829;SYLOTI NAGRI POETRY MARK-2;So;0;ON;;;;;N;;;;;
+A82A;SYLOTI NAGRI POETRY MARK-3;So;0;ON;;;;;N;;;;;
+A82B;SYLOTI NAGRI POETRY MARK-4;So;0;ON;;;;;N;;;;;
+A840;PHAGS-PA LETTER KA;Lo;0;L;;;;;N;;;;;
+A841;PHAGS-PA LETTER KHA;Lo;0;L;;;;;N;;;;;
+A842;PHAGS-PA LETTER GA;Lo;0;L;;;;;N;;;;;
+A843;PHAGS-PA LETTER NGA;Lo;0;L;;;;;N;;;;;
+A844;PHAGS-PA LETTER CA;Lo;0;L;;;;;N;;;;;
+A845;PHAGS-PA LETTER CHA;Lo;0;L;;;;;N;;;;;
+A846;PHAGS-PA LETTER JA;Lo;0;L;;;;;N;;;;;
+A847;PHAGS-PA LETTER NYA;Lo;0;L;;;;;N;;;;;
+A848;PHAGS-PA LETTER TA;Lo;0;L;;;;;N;;;;;
+A849;PHAGS-PA LETTER THA;Lo;0;L;;;;;N;;;;;
+A84A;PHAGS-PA LETTER DA;Lo;0;L;;;;;N;;;;;
+A84B;PHAGS-PA LETTER NA;Lo;0;L;;;;;N;;;;;
+A84C;PHAGS-PA LETTER PA;Lo;0;L;;;;;N;;;;;
+A84D;PHAGS-PA LETTER PHA;Lo;0;L;;;;;N;;;;;
+A84E;PHAGS-PA LETTER BA;Lo;0;L;;;;;N;;;;;
+A84F;PHAGS-PA LETTER MA;Lo;0;L;;;;;N;;;;;
+A850;PHAGS-PA LETTER TSA;Lo;0;L;;;;;N;;;;;
+A851;PHAGS-PA LETTER TSHA;Lo;0;L;;;;;N;;;;;
+A852;PHAGS-PA LETTER DZA;Lo;0;L;;;;;N;;;;;
+A853;PHAGS-PA LETTER WA;Lo;0;L;;;;;N;;;;;
+A854;PHAGS-PA LETTER ZHA;Lo;0;L;;;;;N;;;;;
+A855;PHAGS-PA LETTER ZA;Lo;0;L;;;;;N;;;;;
+A856;PHAGS-PA LETTER SMALL A;Lo;0;L;;;;;N;;;;;
+A857;PHAGS-PA LETTER YA;Lo;0;L;;;;;N;;;;;
+A858;PHAGS-PA LETTER RA;Lo;0;L;;;;;N;;;;;
+A859;PHAGS-PA LETTER LA;Lo;0;L;;;;;N;;;;;
+A85A;PHAGS-PA LETTER SHA;Lo;0;L;;;;;N;;;;;
+A85B;PHAGS-PA LETTER SA;Lo;0;L;;;;;N;;;;;
+A85C;PHAGS-PA LETTER HA;Lo;0;L;;;;;N;;;;;
+A85D;PHAGS-PA LETTER A;Lo;0;L;;;;;N;;;;;
+A85E;PHAGS-PA LETTER I;Lo;0;L;;;;;N;;;;;
+A85F;PHAGS-PA LETTER U;Lo;0;L;;;;;N;;;;;
+A860;PHAGS-PA LETTER E;Lo;0;L;;;;;N;;;;;
+A861;PHAGS-PA LETTER O;Lo;0;L;;;;;N;;;;;
+A862;PHAGS-PA LETTER QA;Lo;0;L;;;;;N;;;;;
+A863;PHAGS-PA LETTER XA;Lo;0;L;;;;;N;;;;;
+A864;PHAGS-PA LETTER FA;Lo;0;L;;;;;N;;;;;
+A865;PHAGS-PA LETTER GGA;Lo;0;L;;;;;N;;;;;
+A866;PHAGS-PA LETTER EE;Lo;0;L;;;;;N;;;;;
+A867;PHAGS-PA SUBJOINED LETTER WA;Lo;0;L;;;;;N;;;;;
+A868;PHAGS-PA SUBJOINED LETTER YA;Lo;0;L;;;;;N;;;;;
+A869;PHAGS-PA LETTER TTA;Lo;0;L;;;;;N;;;;;
+A86A;PHAGS-PA LETTER TTHA;Lo;0;L;;;;;N;;;;;
+A86B;PHAGS-PA LETTER DDA;Lo;0;L;;;;;N;;;;;
+A86C;PHAGS-PA LETTER NNA;Lo;0;L;;;;;N;;;;;
+A86D;PHAGS-PA LETTER ALTERNATE YA;Lo;0;L;;;;;N;;;;;
+A86E;PHAGS-PA LETTER VOICELESS SHA;Lo;0;L;;;;;N;;;;;
+A86F;PHAGS-PA LETTER VOICED HA;Lo;0;L;;;;;N;;;;;
+A870;PHAGS-PA LETTER ASPIRATED FA;Lo;0;L;;;;;N;;;;;
+A871;PHAGS-PA SUBJOINED LETTER RA;Lo;0;L;;;;;N;;;;;
+A872;PHAGS-PA SUPERFIXED LETTER RA;Lo;0;L;;;;;N;;;;;
+A873;PHAGS-PA LETTER CANDRABINDU;Lo;0;L;;;;;N;;;;;
+A874;PHAGS-PA SINGLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A875;PHAGS-PA DOUBLE HEAD MARK;Po;0;ON;;;;;N;;;;;
+A876;PHAGS-PA MARK SHAD;Po;0;ON;;;;;N;;;;;
+A877;PHAGS-PA MARK DOUBLE SHAD;Po;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;964B;;;;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;;;;;
+FA30;CJK COMPATIBILITY IDEOGRAPH-FA30;Lo;0;L;4FAE;;;;N;;;;;
+FA31;CJK COMPATIBILITY IDEOGRAPH-FA31;Lo;0;L;50E7;;;;N;;;;;
+FA32;CJK COMPATIBILITY IDEOGRAPH-FA32;Lo;0;L;514D;;;;N;;;;;
+FA33;CJK COMPATIBILITY IDEOGRAPH-FA33;Lo;0;L;52C9;;;;N;;;;;
+FA34;CJK COMPATIBILITY IDEOGRAPH-FA34;Lo;0;L;52E4;;;;N;;;;;
+FA35;CJK COMPATIBILITY IDEOGRAPH-FA35;Lo;0;L;5351;;;;N;;;;;
+FA36;CJK COMPATIBILITY IDEOGRAPH-FA36;Lo;0;L;559D;;;;N;;;;;
+FA37;CJK COMPATIBILITY IDEOGRAPH-FA37;Lo;0;L;5606;;;;N;;;;;
+FA38;CJK COMPATIBILITY IDEOGRAPH-FA38;Lo;0;L;5668;;;;N;;;;;
+FA39;CJK COMPATIBILITY IDEOGRAPH-FA39;Lo;0;L;5840;;;;N;;;;;
+FA3A;CJK COMPATIBILITY IDEOGRAPH-FA3A;Lo;0;L;58A8;;;;N;;;;;
+FA3B;CJK COMPATIBILITY IDEOGRAPH-FA3B;Lo;0;L;5C64;;;;N;;;;;
+FA3C;CJK COMPATIBILITY IDEOGRAPH-FA3C;Lo;0;L;5C6E;;;;N;;;;;
+FA3D;CJK COMPATIBILITY IDEOGRAPH-FA3D;Lo;0;L;6094;;;;N;;;;;
+FA3E;CJK COMPATIBILITY IDEOGRAPH-FA3E;Lo;0;L;6168;;;;N;;;;;
+FA3F;CJK COMPATIBILITY IDEOGRAPH-FA3F;Lo;0;L;618E;;;;N;;;;;
+FA40;CJK COMPATIBILITY IDEOGRAPH-FA40;Lo;0;L;61F2;;;;N;;;;;
+FA41;CJK COMPATIBILITY IDEOGRAPH-FA41;Lo;0;L;654F;;;;N;;;;;
+FA42;CJK COMPATIBILITY IDEOGRAPH-FA42;Lo;0;L;65E2;;;;N;;;;;
+FA43;CJK COMPATIBILITY IDEOGRAPH-FA43;Lo;0;L;6691;;;;N;;;;;
+FA44;CJK COMPATIBILITY IDEOGRAPH-FA44;Lo;0;L;6885;;;;N;;;;;
+FA45;CJK COMPATIBILITY IDEOGRAPH-FA45;Lo;0;L;6D77;;;;N;;;;;
+FA46;CJK COMPATIBILITY IDEOGRAPH-FA46;Lo;0;L;6E1A;;;;N;;;;;
+FA47;CJK COMPATIBILITY IDEOGRAPH-FA47;Lo;0;L;6F22;;;;N;;;;;
+FA48;CJK COMPATIBILITY IDEOGRAPH-FA48;Lo;0;L;716E;;;;N;;;;;
+FA49;CJK COMPATIBILITY IDEOGRAPH-FA49;Lo;0;L;722B;;;;N;;;;;
+FA4A;CJK COMPATIBILITY IDEOGRAPH-FA4A;Lo;0;L;7422;;;;N;;;;;
+FA4B;CJK COMPATIBILITY IDEOGRAPH-FA4B;Lo;0;L;7891;;;;N;;;;;
+FA4C;CJK COMPATIBILITY IDEOGRAPH-FA4C;Lo;0;L;793E;;;;N;;;;;
+FA4D;CJK COMPATIBILITY IDEOGRAPH-FA4D;Lo;0;L;7949;;;;N;;;;;
+FA4E;CJK COMPATIBILITY IDEOGRAPH-FA4E;Lo;0;L;7948;;;;N;;;;;
+FA4F;CJK COMPATIBILITY IDEOGRAPH-FA4F;Lo;0;L;7950;;;;N;;;;;
+FA50;CJK COMPATIBILITY IDEOGRAPH-FA50;Lo;0;L;7956;;;;N;;;;;
+FA51;CJK COMPATIBILITY IDEOGRAPH-FA51;Lo;0;L;795D;;;;N;;;;;
+FA52;CJK COMPATIBILITY IDEOGRAPH-FA52;Lo;0;L;798D;;;;N;;;;;
+FA53;CJK COMPATIBILITY IDEOGRAPH-FA53;Lo;0;L;798E;;;;N;;;;;
+FA54;CJK COMPATIBILITY IDEOGRAPH-FA54;Lo;0;L;7A40;;;;N;;;;;
+FA55;CJK COMPATIBILITY IDEOGRAPH-FA55;Lo;0;L;7A81;;;;N;;;;;
+FA56;CJK COMPATIBILITY IDEOGRAPH-FA56;Lo;0;L;7BC0;;;;N;;;;;
+FA57;CJK COMPATIBILITY IDEOGRAPH-FA57;Lo;0;L;7DF4;;;;N;;;;;
+FA58;CJK COMPATIBILITY IDEOGRAPH-FA58;Lo;0;L;7E09;;;;N;;;;;
+FA59;CJK COMPATIBILITY IDEOGRAPH-FA59;Lo;0;L;7E41;;;;N;;;;;
+FA5A;CJK COMPATIBILITY IDEOGRAPH-FA5A;Lo;0;L;7F72;;;;N;;;;;
+FA5B;CJK COMPATIBILITY IDEOGRAPH-FA5B;Lo;0;L;8005;;;;N;;;;;
+FA5C;CJK COMPATIBILITY IDEOGRAPH-FA5C;Lo;0;L;81ED;;;;N;;;;;
+FA5D;CJK COMPATIBILITY IDEOGRAPH-FA5D;Lo;0;L;8279;;;;N;;;;;
+FA5E;CJK COMPATIBILITY IDEOGRAPH-FA5E;Lo;0;L;8279;;;;N;;;;;
+FA5F;CJK COMPATIBILITY IDEOGRAPH-FA5F;Lo;0;L;8457;;;;N;;;;;
+FA60;CJK COMPATIBILITY IDEOGRAPH-FA60;Lo;0;L;8910;;;;N;;;;;
+FA61;CJK COMPATIBILITY IDEOGRAPH-FA61;Lo;0;L;8996;;;;N;;;;;
+FA62;CJK COMPATIBILITY IDEOGRAPH-FA62;Lo;0;L;8B01;;;;N;;;;;
+FA63;CJK COMPATIBILITY IDEOGRAPH-FA63;Lo;0;L;8B39;;;;N;;;;;
+FA64;CJK COMPATIBILITY IDEOGRAPH-FA64;Lo;0;L;8CD3;;;;N;;;;;
+FA65;CJK COMPATIBILITY IDEOGRAPH-FA65;Lo;0;L;8D08;;;;N;;;;;
+FA66;CJK COMPATIBILITY IDEOGRAPH-FA66;Lo;0;L;8FB6;;;;N;;;;;
+FA67;CJK COMPATIBILITY IDEOGRAPH-FA67;Lo;0;L;9038;;;;N;;;;;
+FA68;CJK COMPATIBILITY IDEOGRAPH-FA68;Lo;0;L;96E3;;;;N;;;;;
+FA69;CJK COMPATIBILITY IDEOGRAPH-FA69;Lo;0;L;97FF;;;;N;;;;;
+FA6A;CJK COMPATIBILITY IDEOGRAPH-FA6A;Lo;0;L;983B;;;;N;;;;;
+FA70;CJK COMPATIBILITY IDEOGRAPH-FA70;Lo;0;L;4E26;;;;N;;;;;
+FA71;CJK COMPATIBILITY IDEOGRAPH-FA71;Lo;0;L;51B5;;;;N;;;;;
+FA72;CJK COMPATIBILITY IDEOGRAPH-FA72;Lo;0;L;5168;;;;N;;;;;
+FA73;CJK COMPATIBILITY IDEOGRAPH-FA73;Lo;0;L;4F80;;;;N;;;;;
+FA74;CJK COMPATIBILITY IDEOGRAPH-FA74;Lo;0;L;5145;;;;N;;;;;
+FA75;CJK COMPATIBILITY IDEOGRAPH-FA75;Lo;0;L;5180;;;;N;;;;;
+FA76;CJK COMPATIBILITY IDEOGRAPH-FA76;Lo;0;L;52C7;;;;N;;;;;
+FA77;CJK COMPATIBILITY IDEOGRAPH-FA77;Lo;0;L;52FA;;;;N;;;;;
+FA78;CJK COMPATIBILITY IDEOGRAPH-FA78;Lo;0;L;559D;;;;N;;;;;
+FA79;CJK COMPATIBILITY IDEOGRAPH-FA79;Lo;0;L;5555;;;;N;;;;;
+FA7A;CJK COMPATIBILITY IDEOGRAPH-FA7A;Lo;0;L;5599;;;;N;;;;;
+FA7B;CJK COMPATIBILITY IDEOGRAPH-FA7B;Lo;0;L;55E2;;;;N;;;;;
+FA7C;CJK COMPATIBILITY IDEOGRAPH-FA7C;Lo;0;L;585A;;;;N;;;;;
+FA7D;CJK COMPATIBILITY IDEOGRAPH-FA7D;Lo;0;L;58B3;;;;N;;;;;
+FA7E;CJK COMPATIBILITY IDEOGRAPH-FA7E;Lo;0;L;5944;;;;N;;;;;
+FA7F;CJK COMPATIBILITY IDEOGRAPH-FA7F;Lo;0;L;5954;;;;N;;;;;
+FA80;CJK COMPATIBILITY IDEOGRAPH-FA80;Lo;0;L;5A62;;;;N;;;;;
+FA81;CJK COMPATIBILITY IDEOGRAPH-FA81;Lo;0;L;5B28;;;;N;;;;;
+FA82;CJK COMPATIBILITY IDEOGRAPH-FA82;Lo;0;L;5ED2;;;;N;;;;;
+FA83;CJK COMPATIBILITY IDEOGRAPH-FA83;Lo;0;L;5ED9;;;;N;;;;;
+FA84;CJK COMPATIBILITY IDEOGRAPH-FA84;Lo;0;L;5F69;;;;N;;;;;
+FA85;CJK COMPATIBILITY IDEOGRAPH-FA85;Lo;0;L;5FAD;;;;N;;;;;
+FA86;CJK COMPATIBILITY IDEOGRAPH-FA86;Lo;0;L;60D8;;;;N;;;;;
+FA87;CJK COMPATIBILITY IDEOGRAPH-FA87;Lo;0;L;614E;;;;N;;;;;
+FA88;CJK COMPATIBILITY IDEOGRAPH-FA88;Lo;0;L;6108;;;;N;;;;;
+FA89;CJK COMPATIBILITY IDEOGRAPH-FA89;Lo;0;L;618E;;;;N;;;;;
+FA8A;CJK COMPATIBILITY IDEOGRAPH-FA8A;Lo;0;L;6160;;;;N;;;;;
+FA8B;CJK COMPATIBILITY IDEOGRAPH-FA8B;Lo;0;L;61F2;;;;N;;;;;
+FA8C;CJK COMPATIBILITY IDEOGRAPH-FA8C;Lo;0;L;6234;;;;N;;;;;
+FA8D;CJK COMPATIBILITY IDEOGRAPH-FA8D;Lo;0;L;63C4;;;;N;;;;;
+FA8E;CJK COMPATIBILITY IDEOGRAPH-FA8E;Lo;0;L;641C;;;;N;;;;;
+FA8F;CJK COMPATIBILITY IDEOGRAPH-FA8F;Lo;0;L;6452;;;;N;;;;;
+FA90;CJK COMPATIBILITY IDEOGRAPH-FA90;Lo;0;L;6556;;;;N;;;;;
+FA91;CJK COMPATIBILITY IDEOGRAPH-FA91;Lo;0;L;6674;;;;N;;;;;
+FA92;CJK COMPATIBILITY IDEOGRAPH-FA92;Lo;0;L;6717;;;;N;;;;;
+FA93;CJK COMPATIBILITY IDEOGRAPH-FA93;Lo;0;L;671B;;;;N;;;;;
+FA94;CJK COMPATIBILITY IDEOGRAPH-FA94;Lo;0;L;6756;;;;N;;;;;
+FA95;CJK COMPATIBILITY IDEOGRAPH-FA95;Lo;0;L;6B79;;;;N;;;;;
+FA96;CJK COMPATIBILITY IDEOGRAPH-FA96;Lo;0;L;6BBA;;;;N;;;;;
+FA97;CJK COMPATIBILITY IDEOGRAPH-FA97;Lo;0;L;6D41;;;;N;;;;;
+FA98;CJK COMPATIBILITY IDEOGRAPH-FA98;Lo;0;L;6EDB;;;;N;;;;;
+FA99;CJK COMPATIBILITY IDEOGRAPH-FA99;Lo;0;L;6ECB;;;;N;;;;;
+FA9A;CJK COMPATIBILITY IDEOGRAPH-FA9A;Lo;0;L;6F22;;;;N;;;;;
+FA9B;CJK COMPATIBILITY IDEOGRAPH-FA9B;Lo;0;L;701E;;;;N;;;;;
+FA9C;CJK COMPATIBILITY IDEOGRAPH-FA9C;Lo;0;L;716E;;;;N;;;;;
+FA9D;CJK COMPATIBILITY IDEOGRAPH-FA9D;Lo;0;L;77A7;;;;N;;;;;
+FA9E;CJK COMPATIBILITY IDEOGRAPH-FA9E;Lo;0;L;7235;;;;N;;;;;
+FA9F;CJK COMPATIBILITY IDEOGRAPH-FA9F;Lo;0;L;72AF;;;;N;;;;;
+FAA0;CJK COMPATIBILITY IDEOGRAPH-FAA0;Lo;0;L;732A;;;;N;;;;;
+FAA1;CJK COMPATIBILITY IDEOGRAPH-FAA1;Lo;0;L;7471;;;;N;;;;;
+FAA2;CJK COMPATIBILITY IDEOGRAPH-FAA2;Lo;0;L;7506;;;;N;;;;;
+FAA3;CJK COMPATIBILITY IDEOGRAPH-FAA3;Lo;0;L;753B;;;;N;;;;;
+FAA4;CJK COMPATIBILITY IDEOGRAPH-FAA4;Lo;0;L;761D;;;;N;;;;;
+FAA5;CJK COMPATIBILITY IDEOGRAPH-FAA5;Lo;0;L;761F;;;;N;;;;;
+FAA6;CJK COMPATIBILITY IDEOGRAPH-FAA6;Lo;0;L;76CA;;;;N;;;;;
+FAA7;CJK COMPATIBILITY IDEOGRAPH-FAA7;Lo;0;L;76DB;;;;N;;;;;
+FAA8;CJK COMPATIBILITY IDEOGRAPH-FAA8;Lo;0;L;76F4;;;;N;;;;;
+FAA9;CJK COMPATIBILITY IDEOGRAPH-FAA9;Lo;0;L;774A;;;;N;;;;;
+FAAA;CJK COMPATIBILITY IDEOGRAPH-FAAA;Lo;0;L;7740;;;;N;;;;;
+FAAB;CJK COMPATIBILITY IDEOGRAPH-FAAB;Lo;0;L;78CC;;;;N;;;;;
+FAAC;CJK COMPATIBILITY IDEOGRAPH-FAAC;Lo;0;L;7AB1;;;;N;;;;;
+FAAD;CJK COMPATIBILITY IDEOGRAPH-FAAD;Lo;0;L;7BC0;;;;N;;;;;
+FAAE;CJK COMPATIBILITY IDEOGRAPH-FAAE;Lo;0;L;7C7B;;;;N;;;;;
+FAAF;CJK COMPATIBILITY IDEOGRAPH-FAAF;Lo;0;L;7D5B;;;;N;;;;;
+FAB0;CJK COMPATIBILITY IDEOGRAPH-FAB0;Lo;0;L;7DF4;;;;N;;;;;
+FAB1;CJK COMPATIBILITY IDEOGRAPH-FAB1;Lo;0;L;7F3E;;;;N;;;;;
+FAB2;CJK COMPATIBILITY IDEOGRAPH-FAB2;Lo;0;L;8005;;;;N;;;;;
+FAB3;CJK COMPATIBILITY IDEOGRAPH-FAB3;Lo;0;L;8352;;;;N;;;;;
+FAB4;CJK COMPATIBILITY IDEOGRAPH-FAB4;Lo;0;L;83EF;;;;N;;;;;
+FAB5;CJK COMPATIBILITY IDEOGRAPH-FAB5;Lo;0;L;8779;;;;N;;;;;
+FAB6;CJK COMPATIBILITY IDEOGRAPH-FAB6;Lo;0;L;8941;;;;N;;;;;
+FAB7;CJK COMPATIBILITY IDEOGRAPH-FAB7;Lo;0;L;8986;;;;N;;;;;
+FAB8;CJK COMPATIBILITY IDEOGRAPH-FAB8;Lo;0;L;8996;;;;N;;;;;
+FAB9;CJK COMPATIBILITY IDEOGRAPH-FAB9;Lo;0;L;8ABF;;;;N;;;;;
+FABA;CJK COMPATIBILITY IDEOGRAPH-FABA;Lo;0;L;8AF8;;;;N;;;;;
+FABB;CJK COMPATIBILITY IDEOGRAPH-FABB;Lo;0;L;8ACB;;;;N;;;;;
+FABC;CJK COMPATIBILITY IDEOGRAPH-FABC;Lo;0;L;8B01;;;;N;;;;;
+FABD;CJK COMPATIBILITY IDEOGRAPH-FABD;Lo;0;L;8AFE;;;;N;;;;;
+FABE;CJK COMPATIBILITY IDEOGRAPH-FABE;Lo;0;L;8AED;;;;N;;;;;
+FABF;CJK COMPATIBILITY IDEOGRAPH-FABF;Lo;0;L;8B39;;;;N;;;;;
+FAC0;CJK COMPATIBILITY IDEOGRAPH-FAC0;Lo;0;L;8B8A;;;;N;;;;;
+FAC1;CJK COMPATIBILITY IDEOGRAPH-FAC1;Lo;0;L;8D08;;;;N;;;;;
+FAC2;CJK COMPATIBILITY IDEOGRAPH-FAC2;Lo;0;L;8F38;;;;N;;;;;
+FAC3;CJK COMPATIBILITY IDEOGRAPH-FAC3;Lo;0;L;9072;;;;N;;;;;
+FAC4;CJK COMPATIBILITY IDEOGRAPH-FAC4;Lo;0;L;9199;;;;N;;;;;
+FAC5;CJK COMPATIBILITY IDEOGRAPH-FAC5;Lo;0;L;9276;;;;N;;;;;
+FAC6;CJK COMPATIBILITY IDEOGRAPH-FAC6;Lo;0;L;967C;;;;N;;;;;
+FAC7;CJK COMPATIBILITY IDEOGRAPH-FAC7;Lo;0;L;96E3;;;;N;;;;;
+FAC8;CJK COMPATIBILITY IDEOGRAPH-FAC8;Lo;0;L;9756;;;;N;;;;;
+FAC9;CJK COMPATIBILITY IDEOGRAPH-FAC9;Lo;0;L;97DB;;;;N;;;;;
+FACA;CJK COMPATIBILITY IDEOGRAPH-FACA;Lo;0;L;97FF;;;;N;;;;;
+FACB;CJK COMPATIBILITY IDEOGRAPH-FACB;Lo;0;L;980B;;;;N;;;;;
+FACC;CJK COMPATIBILITY IDEOGRAPH-FACC;Lo;0;L;983B;;;;N;;;;;
+FACD;CJK COMPATIBILITY IDEOGRAPH-FACD;Lo;0;L;9B12;;;;N;;;;;
+FACE;CJK COMPATIBILITY IDEOGRAPH-FACE;Lo;0;L;9F9C;;;;N;;;;;
+FACF;CJK COMPATIBILITY IDEOGRAPH-FACF;Lo;0;L;2284A;;;;N;;;;;
+FAD0;CJK COMPATIBILITY IDEOGRAPH-FAD0;Lo;0;L;22844;;;;N;;;;;
+FAD1;CJK COMPATIBILITY IDEOGRAPH-FAD1;Lo;0;L;233D5;;;;N;;;;;
+FAD2;CJK COMPATIBILITY IDEOGRAPH-FAD2;Lo;0;L;3B9D;;;;N;;;;;
+FAD3;CJK COMPATIBILITY IDEOGRAPH-FAD3;Lo;0;L;4018;;;;N;;;;;
+FAD4;CJK COMPATIBILITY IDEOGRAPH-FAD4;Lo;0;L;4039;;;;N;;;;;
+FAD5;CJK COMPATIBILITY IDEOGRAPH-FAD5;Lo;0;L;25249;;;;N;;;;;
+FAD6;CJK COMPATIBILITY IDEOGRAPH-FAD6;Lo;0;L;25CD0;;;;N;;;;;
+FAD7;CJK COMPATIBILITY IDEOGRAPH-FAD7;Lo;0;L;27ED3;;;;N;;;;;
+FAD8;CJK COMPATIBILITY IDEOGRAPH-FAD8;Lo;0;L;9F43;;;;N;;;;;
+FAD9;CJK COMPATIBILITY IDEOGRAPH-FAD9;Lo;0;L;9F8E;;;;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;ES;<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;;;;
+FDFC;RIAL SIGN;Sc;0;AL;<isolated> 0631 06CC 0627 0644;;;;N;;;;;
+FDFD;ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM;So;0;ON;;;;;N;;;;;
+FE00;VARIATION SELECTOR-1;Mn;0;NSM;;;;;N;;;;;
+FE01;VARIATION SELECTOR-2;Mn;0;NSM;;;;;N;;;;;
+FE02;VARIATION SELECTOR-3;Mn;0;NSM;;;;;N;;;;;
+FE03;VARIATION SELECTOR-4;Mn;0;NSM;;;;;N;;;;;
+FE04;VARIATION SELECTOR-5;Mn;0;NSM;;;;;N;;;;;
+FE05;VARIATION SELECTOR-6;Mn;0;NSM;;;;;N;;;;;
+FE06;VARIATION SELECTOR-7;Mn;0;NSM;;;;;N;;;;;
+FE07;VARIATION SELECTOR-8;Mn;0;NSM;;;;;N;;;;;
+FE08;VARIATION SELECTOR-9;Mn;0;NSM;;;;;N;;;;;
+FE09;VARIATION SELECTOR-10;Mn;0;NSM;;;;;N;;;;;
+FE0A;VARIATION SELECTOR-11;Mn;0;NSM;;;;;N;;;;;
+FE0B;VARIATION SELECTOR-12;Mn;0;NSM;;;;;N;;;;;
+FE0C;VARIATION SELECTOR-13;Mn;0;NSM;;;;;N;;;;;
+FE0D;VARIATION SELECTOR-14;Mn;0;NSM;;;;;N;;;;;
+FE0E;VARIATION SELECTOR-15;Mn;0;NSM;;;;;N;;;;;
+FE0F;VARIATION SELECTOR-16;Mn;0;NSM;;;;;N;;;;;
+FE10;PRESENTATION FORM FOR VERTICAL COMMA;Po;0;ON;<vertical> 002C;;;;N;;;;;
+FE11;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA;Po;0;ON;<vertical> 3001;;;;N;;;;;
+FE12;PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP;Po;0;ON;<vertical> 3002;;;;N;;;;;
+FE13;PRESENTATION FORM FOR VERTICAL COLON;Po;0;ON;<vertical> 003A;;;;N;;;;;
+FE14;PRESENTATION FORM FOR VERTICAL SEMICOLON;Po;0;ON;<vertical> 003B;;;;N;;;;;
+FE15;PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK;Po;0;ON;<vertical> 0021;;;;N;;;;;
+FE16;PRESENTATION FORM FOR VERTICAL QUESTION MARK;Po;0;ON;<vertical> 003F;;;;N;;;;;
+FE17;PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET;Ps;0;ON;<vertical> 3016;;;;N;;;;;
+FE18;PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET;Pe;0;ON;<vertical> 3017;;;;N;;;;;
+FE19;PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS;Po;0;ON;<vertical> 2026;;;;N;;;;;
+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;;;;
+FE45;SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE46;WHITE SESAME DOT;Po;0;ON;;;;;N;;;;;
+FE47;PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET;Ps;0;ON;<vertical> 005B;;;;N;;;;;
+FE48;PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET;Pe;0;ON;<vertical> 005D;;;;N;;;;;
+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;;;;Y;SMALL OPENING PARENTHESIS;;;;
+FE5A;SMALL RIGHT PARENTHESIS;Pe;0;ON;<small> 0029;;;;Y;SMALL CLOSING PARENTHESIS;;;;
+FE5B;SMALL LEFT CURLY BRACKET;Ps;0;ON;<small> 007B;;;;Y;SMALL OPENING CURLY BRACKET;;;;
+FE5C;SMALL RIGHT CURLY BRACKET;Pe;0;ON;<small> 007D;;;;Y;SMALL CLOSING CURLY BRACKET;;;;
+FE5D;SMALL LEFT TORTOISE SHELL BRACKET;Ps;0;ON;<small> 3014;;;;Y;SMALL OPENING TORTOISE SHELL BRACKET;;;;
+FE5E;SMALL RIGHT TORTOISE SHELL BRACKET;Pe;0;ON;<small> 3015;;;;Y;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;ES;<small> 002B;;;;N;;;;;
+FE63;SMALL HYPHEN-MINUS;Pd;0;ES;<small> 002D;;;;N;;;;;
+FE64;SMALL LESS-THAN SIGN;Sm;0;ON;<small> 003C;;;;Y;;;;;
+FE65;SMALL GREATER-THAN SIGN;Sm;0;ON;<small> 003E;;;;Y;;;;;
+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;;;;
+FE73;ARABIC TAIL FRAGMENT;Lo;0;AL;;;;;N;;;;;
+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;;;;Y;FULLWIDTH OPENING PARENTHESIS;;;;
+FF09;FULLWIDTH RIGHT PARENTHESIS;Pe;0;ON;<wide> 0029;;;;Y;FULLWIDTH CLOSING PARENTHESIS;;;;
+FF0A;FULLWIDTH ASTERISK;Po;0;ON;<wide> 002A;;;;N;;;;;
+FF0B;FULLWIDTH PLUS SIGN;Sm;0;ES;<wide> 002B;;;;N;;;;;
+FF0C;FULLWIDTH COMMA;Po;0;CS;<wide> 002C;;;;N;;;;;
+FF0D;FULLWIDTH HYPHEN-MINUS;Pd;0;ES;<wide> 002D;;;;N;;;;;
+FF0E;FULLWIDTH FULL STOP;Po;0;CS;<wide> 002E;;;;N;FULLWIDTH PERIOD;;;;
+FF0F;FULLWIDTH SOLIDUS;Po;0;CS;<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;;;;Y;;;;;
+FF1D;FULLWIDTH EQUALS SIGN;Sm;0;ON;<wide> 003D;;;;N;;;;;
+FF1E;FULLWIDTH GREATER-THAN SIGN;Sm;0;ON;<wide> 003E;;;;Y;;;;;
+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;;;;Y;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;;;;Y;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;;;;Y;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;;;;Y;FULLWIDTH CLOSING CURLY BRACKET;;;;
+FF5E;FULLWIDTH TILDE;Sm;0;ON;<wide> 007E;;;;N;FULLWIDTH SPACING TILDE;;;;
+FF5F;FULLWIDTH LEFT WHITE PARENTHESIS;Ps;0;ON;<wide> 2985;;;;Y;;*;;;
+FF60;FULLWIDTH RIGHT WHITE PARENTHESIS;Pe;0;ON;<wide> 2986;;;;Y;;*;;;
+FF61;HALFWIDTH IDEOGRAPHIC FULL STOP;Po;0;ON;<narrow> 3002;;;;N;HALFWIDTH IDEOGRAPHIC PERIOD;;;;
+FF62;HALFWIDTH LEFT CORNER BRACKET;Ps;0;ON;<narrow> 300C;;;;Y;HALFWIDTH OPENING CORNER BRACKET;;;;
+FF63;HALFWIDTH RIGHT CORNER BRACKET;Pe;0;ON;<narrow> 300D;;;;Y;HALFWIDTH CLOSING CORNER BRACKET;;;;
+FF64;HALFWIDTH IDEOGRAPHIC COMMA;Po;0;ON;<narrow> 3001;;;;N;;;;;
+FF65;HALFWIDTH KATAKANA MIDDLE DOT;Po;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;ON;;;;;N;;;;;
+FFFA;INTERLINEAR ANNOTATION SEPARATOR;Cf;0;ON;;;;;N;;;;;
+FFFB;INTERLINEAR ANNOTATION TERMINATOR;Cf;0;ON;;;;;N;;;;;
+FFFC;OBJECT REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+FFFD;REPLACEMENT CHARACTER;So;0;ON;;;;;N;;;;;
+10000;LINEAR B SYLLABLE B008 A;Lo;0;L;;;;;N;;;;;
+10001;LINEAR B SYLLABLE B038 E;Lo;0;L;;;;;N;;;;;
+10002;LINEAR B SYLLABLE B028 I;Lo;0;L;;;;;N;;;;;
+10003;LINEAR B SYLLABLE B061 O;Lo;0;L;;;;;N;;;;;
+10004;LINEAR B SYLLABLE B010 U;Lo;0;L;;;;;N;;;;;
+10005;LINEAR B SYLLABLE B001 DA;Lo;0;L;;;;;N;;;;;
+10006;LINEAR B SYLLABLE B045 DE;Lo;0;L;;;;;N;;;;;
+10007;LINEAR B SYLLABLE B007 DI;Lo;0;L;;;;;N;;;;;
+10008;LINEAR B SYLLABLE B014 DO;Lo;0;L;;;;;N;;;;;
+10009;LINEAR B SYLLABLE B051 DU;Lo;0;L;;;;;N;;;;;
+1000A;LINEAR B SYLLABLE B057 JA;Lo;0;L;;;;;N;;;;;
+1000B;LINEAR B SYLLABLE B046 JE;Lo;0;L;;;;;N;;;;;
+1000D;LINEAR B SYLLABLE B036 JO;Lo;0;L;;;;;N;;;;;
+1000E;LINEAR B SYLLABLE B065 JU;Lo;0;L;;;;;N;;;;;
+1000F;LINEAR B SYLLABLE B077 KA;Lo;0;L;;;;;N;;;;;
+10010;LINEAR B SYLLABLE B044 KE;Lo;0;L;;;;;N;;;;;
+10011;LINEAR B SYLLABLE B067 KI;Lo;0;L;;;;;N;;;;;
+10012;LINEAR B SYLLABLE B070 KO;Lo;0;L;;;;;N;;;;;
+10013;LINEAR B SYLLABLE B081 KU;Lo;0;L;;;;;N;;;;;
+10014;LINEAR B SYLLABLE B080 MA;Lo;0;L;;;;;N;;;;;
+10015;LINEAR B SYLLABLE B013 ME;Lo;0;L;;;;;N;;;;;
+10016;LINEAR B SYLLABLE B073 MI;Lo;0;L;;;;;N;;;;;
+10017;LINEAR B SYLLABLE B015 MO;Lo;0;L;;;;;N;;;;;
+10018;LINEAR B SYLLABLE B023 MU;Lo;0;L;;;;;N;;;;;
+10019;LINEAR B SYLLABLE B006 NA;Lo;0;L;;;;;N;;;;;
+1001A;LINEAR B SYLLABLE B024 NE;Lo;0;L;;;;;N;;;;;
+1001B;LINEAR B SYLLABLE B030 NI;Lo;0;L;;;;;N;;;;;
+1001C;LINEAR B SYLLABLE B052 NO;Lo;0;L;;;;;N;;;;;
+1001D;LINEAR B SYLLABLE B055 NU;Lo;0;L;;;;;N;;;;;
+1001E;LINEAR B SYLLABLE B003 PA;Lo;0;L;;;;;N;;;;;
+1001F;LINEAR B SYLLABLE B072 PE;Lo;0;L;;;;;N;;;;;
+10020;LINEAR B SYLLABLE B039 PI;Lo;0;L;;;;;N;;;;;
+10021;LINEAR B SYLLABLE B011 PO;Lo;0;L;;;;;N;;;;;
+10022;LINEAR B SYLLABLE B050 PU;Lo;0;L;;;;;N;;;;;
+10023;LINEAR B SYLLABLE B016 QA;Lo;0;L;;;;;N;;;;;
+10024;LINEAR B SYLLABLE B078 QE;Lo;0;L;;;;;N;;;;;
+10025;LINEAR B SYLLABLE B021 QI;Lo;0;L;;;;;N;;;;;
+10026;LINEAR B SYLLABLE B032 QO;Lo;0;L;;;;;N;;;;;
+10028;LINEAR B SYLLABLE B060 RA;Lo;0;L;;;;;N;;;;;
+10029;LINEAR B SYLLABLE B027 RE;Lo;0;L;;;;;N;;;;;
+1002A;LINEAR B SYLLABLE B053 RI;Lo;0;L;;;;;N;;;;;
+1002B;LINEAR B SYLLABLE B002 RO;Lo;0;L;;;;;N;;;;;
+1002C;LINEAR B SYLLABLE B026 RU;Lo;0;L;;;;;N;;;;;
+1002D;LINEAR B SYLLABLE B031 SA;Lo;0;L;;;;;N;;;;;
+1002E;LINEAR B SYLLABLE B009 SE;Lo;0;L;;;;;N;;;;;
+1002F;LINEAR B SYLLABLE B041 SI;Lo;0;L;;;;;N;;;;;
+10030;LINEAR B SYLLABLE B012 SO;Lo;0;L;;;;;N;;;;;
+10031;LINEAR B SYLLABLE B058 SU;Lo;0;L;;;;;N;;;;;
+10032;LINEAR B SYLLABLE B059 TA;Lo;0;L;;;;;N;;;;;
+10033;LINEAR B SYLLABLE B004 TE;Lo;0;L;;;;;N;;;;;
+10034;LINEAR B SYLLABLE B037 TI;Lo;0;L;;;;;N;;;;;
+10035;LINEAR B SYLLABLE B005 TO;Lo;0;L;;;;;N;;;;;
+10036;LINEAR B SYLLABLE B069 TU;Lo;0;L;;;;;N;;;;;
+10037;LINEAR B SYLLABLE B054 WA;Lo;0;L;;;;;N;;;;;
+10038;LINEAR B SYLLABLE B075 WE;Lo;0;L;;;;;N;;;;;
+10039;LINEAR B SYLLABLE B040 WI;Lo;0;L;;;;;N;;;;;
+1003A;LINEAR B SYLLABLE B042 WO;Lo;0;L;;;;;N;;;;;
+1003C;LINEAR B SYLLABLE B017 ZA;Lo;0;L;;;;;N;;;;;
+1003D;LINEAR B SYLLABLE B074 ZE;Lo;0;L;;;;;N;;;;;
+1003F;LINEAR B SYLLABLE B020 ZO;Lo;0;L;;;;;N;;;;;
+10040;LINEAR B SYLLABLE B025 A2;Lo;0;L;;;;;N;;;;;
+10041;LINEAR B SYLLABLE B043 A3;Lo;0;L;;;;;N;;;;;
+10042;LINEAR B SYLLABLE B085 AU;Lo;0;L;;;;;N;;;;;
+10043;LINEAR B SYLLABLE B071 DWE;Lo;0;L;;;;;N;;;;;
+10044;LINEAR B SYLLABLE B090 DWO;Lo;0;L;;;;;N;;;;;
+10045;LINEAR B SYLLABLE B048 NWA;Lo;0;L;;;;;N;;;;;
+10046;LINEAR B SYLLABLE B029 PU2;Lo;0;L;;;;;N;;;;;
+10047;LINEAR B SYLLABLE B062 PTE;Lo;0;L;;;;;N;;;;;
+10048;LINEAR B SYLLABLE B076 RA2;Lo;0;L;;;;;N;;;;;
+10049;LINEAR B SYLLABLE B033 RA3;Lo;0;L;;;;;N;;;;;
+1004A;LINEAR B SYLLABLE B068 RO2;Lo;0;L;;;;;N;;;;;
+1004B;LINEAR B SYLLABLE B066 TA2;Lo;0;L;;;;;N;;;;;
+1004C;LINEAR B SYLLABLE B087 TWE;Lo;0;L;;;;;N;;;;;
+1004D;LINEAR B SYLLABLE B091 TWO;Lo;0;L;;;;;N;;;;;
+10050;LINEAR B SYMBOL B018;Lo;0;L;;;;;N;;;;;
+10051;LINEAR B SYMBOL B019;Lo;0;L;;;;;N;;;;;
+10052;LINEAR B SYMBOL B022;Lo;0;L;;;;;N;;;;;
+10053;LINEAR B SYMBOL B034;Lo;0;L;;;;;N;;;;;
+10054;LINEAR B SYMBOL B047;Lo;0;L;;;;;N;;;;;
+10055;LINEAR B SYMBOL B049;Lo;0;L;;;;;N;;;;;
+10056;LINEAR B SYMBOL B056;Lo;0;L;;;;;N;;;;;
+10057;LINEAR B SYMBOL B063;Lo;0;L;;;;;N;;;;;
+10058;LINEAR B SYMBOL B064;Lo;0;L;;;;;N;;;;;
+10059;LINEAR B SYMBOL B079;Lo;0;L;;;;;N;;;;;
+1005A;LINEAR B SYMBOL B082;Lo;0;L;;;;;N;;;;;
+1005B;LINEAR B SYMBOL B083;Lo;0;L;;;;;N;;;;;
+1005C;LINEAR B SYMBOL B086;Lo;0;L;;;;;N;;;;;
+1005D;LINEAR B SYMBOL B089;Lo;0;L;;;;;N;;;;;
+10080;LINEAR B IDEOGRAM B100 MAN;Lo;0;L;;;;;N;;;;;
+10081;LINEAR B IDEOGRAM B102 WOMAN;Lo;0;L;;;;;N;;;;;
+10082;LINEAR B IDEOGRAM B104 DEER;Lo;0;L;;;;;N;;;;;
+10083;LINEAR B IDEOGRAM B105 EQUID;Lo;0;L;;;;;N;;;;;
+10084;LINEAR B IDEOGRAM B105F MARE;Lo;0;L;;;;;N;;;;;
+10085;LINEAR B IDEOGRAM B105M STALLION;Lo;0;L;;;;;N;;;;;
+10086;LINEAR B IDEOGRAM B106F EWE;Lo;0;L;;;;;N;;;;;
+10087;LINEAR B IDEOGRAM B106M RAM;Lo;0;L;;;;;N;;;;;
+10088;LINEAR B IDEOGRAM B107F SHE-GOAT;Lo;0;L;;;;;N;;;;;
+10089;LINEAR B IDEOGRAM B107M HE-GOAT;Lo;0;L;;;;;N;;;;;
+1008A;LINEAR B IDEOGRAM B108F SOW;Lo;0;L;;;;;N;;;;;
+1008B;LINEAR B IDEOGRAM B108M BOAR;Lo;0;L;;;;;N;;;;;
+1008C;LINEAR B IDEOGRAM B109F COW;Lo;0;L;;;;;N;;;;;
+1008D;LINEAR B IDEOGRAM B109M BULL;Lo;0;L;;;;;N;;;;;
+1008E;LINEAR B IDEOGRAM B120 WHEAT;Lo;0;L;;;;;N;;;;;
+1008F;LINEAR B IDEOGRAM B121 BARLEY;Lo;0;L;;;;;N;;;;;
+10090;LINEAR B IDEOGRAM B122 OLIVE;Lo;0;L;;;;;N;;;;;
+10091;LINEAR B IDEOGRAM B123 SPICE;Lo;0;L;;;;;N;;;;;
+10092;LINEAR B IDEOGRAM B125 CYPERUS;Lo;0;L;;;;;N;;;;;
+10093;LINEAR B MONOGRAM B127 KAPO;Lo;0;L;;;;;N;;;;;
+10094;LINEAR B MONOGRAM B128 KANAKO;Lo;0;L;;;;;N;;;;;
+10095;LINEAR B IDEOGRAM B130 OIL;Lo;0;L;;;;;N;;;;;
+10096;LINEAR B IDEOGRAM B131 WINE;Lo;0;L;;;;;N;;;;;
+10097;LINEAR B IDEOGRAM B132;Lo;0;L;;;;;N;;;;;
+10098;LINEAR B MONOGRAM B133 AREPA;Lo;0;L;;;;;N;;;;;
+10099;LINEAR B MONOGRAM B135 MERI;Lo;0;L;;;;;N;;;;;
+1009A;LINEAR B IDEOGRAM B140 BRONZE;Lo;0;L;;;;;N;;;;;
+1009B;LINEAR B IDEOGRAM B141 GOLD;Lo;0;L;;;;;N;;;;;
+1009C;LINEAR B IDEOGRAM B142;Lo;0;L;;;;;N;;;;;
+1009D;LINEAR B IDEOGRAM B145 WOOL;Lo;0;L;;;;;N;;;;;
+1009E;LINEAR B IDEOGRAM B146;Lo;0;L;;;;;N;;;;;
+1009F;LINEAR B IDEOGRAM B150;Lo;0;L;;;;;N;;;;;
+100A0;LINEAR B IDEOGRAM B151 HORN;Lo;0;L;;;;;N;;;;;
+100A1;LINEAR B IDEOGRAM B152;Lo;0;L;;;;;N;;;;;
+100A2;LINEAR B IDEOGRAM B153;Lo;0;L;;;;;N;;;;;
+100A3;LINEAR B IDEOGRAM B154;Lo;0;L;;;;;N;;;;;
+100A4;LINEAR B MONOGRAM B156 TURO2;Lo;0;L;;;;;N;;;;;
+100A5;LINEAR B IDEOGRAM B157;Lo;0;L;;;;;N;;;;;
+100A6;LINEAR B IDEOGRAM B158;Lo;0;L;;;;;N;;;;;
+100A7;LINEAR B IDEOGRAM B159 CLOTH;Lo;0;L;;;;;N;;;;;
+100A8;LINEAR B IDEOGRAM B160;Lo;0;L;;;;;N;;;;;
+100A9;LINEAR B IDEOGRAM B161;Lo;0;L;;;;;N;;;;;
+100AA;LINEAR B IDEOGRAM B162 GARMENT;Lo;0;L;;;;;N;;;;;
+100AB;LINEAR B IDEOGRAM B163 ARMOUR;Lo;0;L;;;;;N;;;;;
+100AC;LINEAR B IDEOGRAM B164;Lo;0;L;;;;;N;;;;;
+100AD;LINEAR B IDEOGRAM B165;Lo;0;L;;;;;N;;;;;
+100AE;LINEAR B IDEOGRAM B166;Lo;0;L;;;;;N;;;;;
+100AF;LINEAR B IDEOGRAM B167;Lo;0;L;;;;;N;;;;;
+100B0;LINEAR B IDEOGRAM B168;Lo;0;L;;;;;N;;;;;
+100B1;LINEAR B IDEOGRAM B169;Lo;0;L;;;;;N;;;;;
+100B2;LINEAR B IDEOGRAM B170;Lo;0;L;;;;;N;;;;;
+100B3;LINEAR B IDEOGRAM B171;Lo;0;L;;;;;N;;;;;
+100B4;LINEAR B IDEOGRAM B172;Lo;0;L;;;;;N;;;;;
+100B5;LINEAR B IDEOGRAM B173 MONTH;Lo;0;L;;;;;N;;;;;
+100B6;LINEAR B IDEOGRAM B174;Lo;0;L;;;;;N;;;;;
+100B7;LINEAR B IDEOGRAM B176 TREE;Lo;0;L;;;;;N;;;;;
+100B8;LINEAR B IDEOGRAM B177;Lo;0;L;;;;;N;;;;;
+100B9;LINEAR B IDEOGRAM B178;Lo;0;L;;;;;N;;;;;
+100BA;LINEAR B IDEOGRAM B179;Lo;0;L;;;;;N;;;;;
+100BB;LINEAR B IDEOGRAM B180;Lo;0;L;;;;;N;;;;;
+100BC;LINEAR B IDEOGRAM B181;Lo;0;L;;;;;N;;;;;
+100BD;LINEAR B IDEOGRAM B182;Lo;0;L;;;;;N;;;;;
+100BE;LINEAR B IDEOGRAM B183;Lo;0;L;;;;;N;;;;;
+100BF;LINEAR B IDEOGRAM B184;Lo;0;L;;;;;N;;;;;
+100C0;LINEAR B IDEOGRAM B185;Lo;0;L;;;;;N;;;;;
+100C1;LINEAR B IDEOGRAM B189;Lo;0;L;;;;;N;;;;;
+100C2;LINEAR B IDEOGRAM B190;Lo;0;L;;;;;N;;;;;
+100C3;LINEAR B IDEOGRAM B191 HELMET;Lo;0;L;;;;;N;;;;;
+100C4;LINEAR B IDEOGRAM B220 FOOTSTOOL;Lo;0;L;;;;;N;;;;;
+100C5;LINEAR B IDEOGRAM B225 BATHTUB;Lo;0;L;;;;;N;;;;;
+100C6;LINEAR B IDEOGRAM B230 SPEAR;Lo;0;L;;;;;N;;;;;
+100C7;LINEAR B IDEOGRAM B231 ARROW;Lo;0;L;;;;;N;;;;;
+100C8;LINEAR B IDEOGRAM B232;Lo;0;L;;;;;N;;;;;
+100C9;LINEAR B IDEOGRAM B233 SWORD;Lo;0;L;;;;;N;;pug;;;
+100CA;LINEAR B IDEOGRAM B234;Lo;0;L;;;;;N;;;;;
+100CB;LINEAR B IDEOGRAM B236;Lo;0;L;;;;;N;;gup;;;
+100CC;LINEAR B IDEOGRAM B240 WHEELED CHARIOT;Lo;0;L;;;;;N;;;;;
+100CD;LINEAR B IDEOGRAM B241 CHARIOT;Lo;0;L;;;;;N;;;;;
+100CE;LINEAR B IDEOGRAM B242 CHARIOT FRAME;Lo;0;L;;;;;N;;;;;
+100CF;LINEAR B IDEOGRAM B243 WHEEL;Lo;0;L;;;;;N;;;;;
+100D0;LINEAR B IDEOGRAM B245;Lo;0;L;;;;;N;;;;;
+100D1;LINEAR B IDEOGRAM B246;Lo;0;L;;;;;N;;;;;
+100D2;LINEAR B MONOGRAM B247 DIPTE;Lo;0;L;;;;;N;;;;;
+100D3;LINEAR B IDEOGRAM B248;Lo;0;L;;;;;N;;;;;
+100D4;LINEAR B IDEOGRAM B249;Lo;0;L;;;;;N;;;;;
+100D5;LINEAR B IDEOGRAM B251;Lo;0;L;;;;;N;;;;;
+100D6;LINEAR B IDEOGRAM B252;Lo;0;L;;;;;N;;;;;
+100D7;LINEAR B IDEOGRAM B253;Lo;0;L;;;;;N;;;;;
+100D8;LINEAR B IDEOGRAM B254 DART;Lo;0;L;;;;;N;;;;;
+100D9;LINEAR B IDEOGRAM B255;Lo;0;L;;;;;N;;;;;
+100DA;LINEAR B IDEOGRAM B256;Lo;0;L;;;;;N;;;;;
+100DB;LINEAR B IDEOGRAM B257;Lo;0;L;;;;;N;;;;;
+100DC;LINEAR B IDEOGRAM B258;Lo;0;L;;;;;N;;;;;
+100DD;LINEAR B IDEOGRAM B259;Lo;0;L;;;;;N;;;;;
+100DE;LINEAR B IDEOGRAM VESSEL B155;Lo;0;L;;;;;N;;;;;
+100DF;LINEAR B IDEOGRAM VESSEL B200;Lo;0;L;;;;;N;;;;;
+100E0;LINEAR B IDEOGRAM VESSEL B201;Lo;0;L;;;;;N;;;;;
+100E1;LINEAR B IDEOGRAM VESSEL B202;Lo;0;L;;;;;N;;;;;
+100E2;LINEAR B IDEOGRAM VESSEL B203;Lo;0;L;;;;;N;;;;;
+100E3;LINEAR B IDEOGRAM VESSEL B204;Lo;0;L;;;;;N;;;;;
+100E4;LINEAR B IDEOGRAM VESSEL B205;Lo;0;L;;;;;N;;;;;
+100E5;LINEAR B IDEOGRAM VESSEL B206;Lo;0;L;;;;;N;;;;;
+100E6;LINEAR B IDEOGRAM VESSEL B207;Lo;0;L;;;;;N;;;;;
+100E7;LINEAR B IDEOGRAM VESSEL B208;Lo;0;L;;;;;N;;;;;
+100E8;LINEAR B IDEOGRAM VESSEL B209;Lo;0;L;;;;;N;;;;;
+100E9;LINEAR B IDEOGRAM VESSEL B210;Lo;0;L;;;;;N;;;;;
+100EA;LINEAR B IDEOGRAM VESSEL B211;Lo;0;L;;;;;N;;;;;
+100EB;LINEAR B IDEOGRAM VESSEL B212;Lo;0;L;;;;;N;;;;;
+100EC;LINEAR B IDEOGRAM VESSEL B213;Lo;0;L;;;;;N;;;;;
+100ED;LINEAR B IDEOGRAM VESSEL B214;Lo;0;L;;;;;N;;;;;
+100EE;LINEAR B IDEOGRAM VESSEL B215;Lo;0;L;;;;;N;;;;;
+100EF;LINEAR B IDEOGRAM VESSEL B216;Lo;0;L;;;;;N;;;;;
+100F0;LINEAR B IDEOGRAM VESSEL B217;Lo;0;L;;;;;N;;;;;
+100F1;LINEAR B IDEOGRAM VESSEL B218;Lo;0;L;;;;;N;;;;;
+100F2;LINEAR B IDEOGRAM VESSEL B219;Lo;0;L;;;;;N;;;;;
+100F3;LINEAR B IDEOGRAM VESSEL B221;Lo;0;L;;;;;N;;;;;
+100F4;LINEAR B IDEOGRAM VESSEL B222;Lo;0;L;;;;;N;;;;;
+100F5;LINEAR B IDEOGRAM VESSEL B226;Lo;0;L;;;;;N;;;;;
+100F6;LINEAR B IDEOGRAM VESSEL B227;Lo;0;L;;;;;N;;;;;
+100F7;LINEAR B IDEOGRAM VESSEL B228;Lo;0;L;;;;;N;;;;;
+100F8;LINEAR B IDEOGRAM VESSEL B229;Lo;0;L;;;;;N;;;;;
+100F9;LINEAR B IDEOGRAM VESSEL B250;Lo;0;L;;;;;N;;;;;
+100FA;LINEAR B IDEOGRAM VESSEL B305;Lo;0;L;;;;;N;;;;;
+10100;AEGEAN WORD SEPARATOR LINE;Po;0;L;;;;;N;;;;;
+10101;AEGEAN WORD SEPARATOR DOT;Po;0;ON;;;;;N;;;;;
+10102;AEGEAN CHECK MARK;So;0;L;;;;;N;;;;;
+10107;AEGEAN NUMBER ONE;No;0;L;;;;1;N;;;;;
+10108;AEGEAN NUMBER TWO;No;0;L;;;;2;N;;;;;
+10109;AEGEAN NUMBER THREE;No;0;L;;;;3;N;;;;;
+1010A;AEGEAN NUMBER FOUR;No;0;L;;;;4;N;;;;;
+1010B;AEGEAN NUMBER FIVE;No;0;L;;;;5;N;;;;;
+1010C;AEGEAN NUMBER SIX;No;0;L;;;;6;N;;;;;
+1010D;AEGEAN NUMBER SEVEN;No;0;L;;;;7;N;;;;;
+1010E;AEGEAN NUMBER EIGHT;No;0;L;;;;8;N;;;;;
+1010F;AEGEAN NUMBER NINE;No;0;L;;;;9;N;;;;;
+10110;AEGEAN NUMBER TEN;No;0;L;;;;10;N;;;;;
+10111;AEGEAN NUMBER TWENTY;No;0;L;;;;20;N;;;;;
+10112;AEGEAN NUMBER THIRTY;No;0;L;;;;30;N;;;;;
+10113;AEGEAN NUMBER FORTY;No;0;L;;;;40;N;;;;;
+10114;AEGEAN NUMBER FIFTY;No;0;L;;;;50;N;;;;;
+10115;AEGEAN NUMBER SIXTY;No;0;L;;;;60;N;;;;;
+10116;AEGEAN NUMBER SEVENTY;No;0;L;;;;70;N;;;;;
+10117;AEGEAN NUMBER EIGHTY;No;0;L;;;;80;N;;;;;
+10118;AEGEAN NUMBER NINETY;No;0;L;;;;90;N;;;;;
+10119;AEGEAN NUMBER ONE HUNDRED;No;0;L;;;;100;N;;;;;
+1011A;AEGEAN NUMBER TWO HUNDRED;No;0;L;;;;200;N;;;;;
+1011B;AEGEAN NUMBER THREE HUNDRED;No;0;L;;;;300;N;;;;;
+1011C;AEGEAN NUMBER FOUR HUNDRED;No;0;L;;;;400;N;;;;;
+1011D;AEGEAN NUMBER FIVE HUNDRED;No;0;L;;;;500;N;;;;;
+1011E;AEGEAN NUMBER SIX HUNDRED;No;0;L;;;;600;N;;;;;
+1011F;AEGEAN NUMBER SEVEN HUNDRED;No;0;L;;;;700;N;;;;;
+10120;AEGEAN NUMBER EIGHT HUNDRED;No;0;L;;;;800;N;;;;;
+10121;AEGEAN NUMBER NINE HUNDRED;No;0;L;;;;900;N;;;;;
+10122;AEGEAN NUMBER ONE THOUSAND;No;0;L;;;;1000;N;;;;;
+10123;AEGEAN NUMBER TWO THOUSAND;No;0;L;;;;2000;N;;;;;
+10124;AEGEAN NUMBER THREE THOUSAND;No;0;L;;;;3000;N;;;;;
+10125;AEGEAN NUMBER FOUR THOUSAND;No;0;L;;;;4000;N;;;;;
+10126;AEGEAN NUMBER FIVE THOUSAND;No;0;L;;;;5000;N;;;;;
+10127;AEGEAN NUMBER SIX THOUSAND;No;0;L;;;;6000;N;;;;;
+10128;AEGEAN NUMBER SEVEN THOUSAND;No;0;L;;;;7000;N;;;;;
+10129;AEGEAN NUMBER EIGHT THOUSAND;No;0;L;;;;8000;N;;;;;
+1012A;AEGEAN NUMBER NINE THOUSAND;No;0;L;;;;9000;N;;;;;
+1012B;AEGEAN NUMBER TEN THOUSAND;No;0;L;;;;10000;N;;;;;
+1012C;AEGEAN NUMBER TWENTY THOUSAND;No;0;L;;;;20000;N;;;;;
+1012D;AEGEAN NUMBER THIRTY THOUSAND;No;0;L;;;;30000;N;;;;;
+1012E;AEGEAN NUMBER FORTY THOUSAND;No;0;L;;;;40000;N;;;;;
+1012F;AEGEAN NUMBER FIFTY THOUSAND;No;0;L;;;;50000;N;;;;;
+10130;AEGEAN NUMBER SIXTY THOUSAND;No;0;L;;;;60000;N;;;;;
+10131;AEGEAN NUMBER SEVENTY THOUSAND;No;0;L;;;;70000;N;;;;;
+10132;AEGEAN NUMBER EIGHTY THOUSAND;No;0;L;;;;80000;N;;;;;
+10133;AEGEAN NUMBER NINETY THOUSAND;No;0;L;;;;90000;N;;;;;
+10137;AEGEAN WEIGHT BASE UNIT;So;0;L;;;;;N;;;;;
+10138;AEGEAN WEIGHT FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+10139;AEGEAN WEIGHT SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013A;AEGEAN WEIGHT THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+1013B;AEGEAN WEIGHT FOURTH SUBUNIT;So;0;L;;;;;N;;;;;
+1013C;AEGEAN DRY MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013D;AEGEAN LIQUID MEASURE FIRST SUBUNIT;So;0;L;;;;;N;;;;;
+1013E;AEGEAN MEASURE SECOND SUBUNIT;So;0;L;;;;;N;;;;;
+1013F;AEGEAN MEASURE THIRD SUBUNIT;So;0;L;;;;;N;;;;;
+10140;GREEK ACROPHONIC ATTIC ONE QUARTER;Nl;0;ON;;;;1/4;N;;;;;
+10141;GREEK ACROPHONIC ATTIC ONE HALF;Nl;0;ON;;;;1/2;N;;;;;
+10142;GREEK ACROPHONIC ATTIC ONE DRACHMA;Nl;0;ON;;;;1;N;;;;;
+10143;GREEK ACROPHONIC ATTIC FIVE;Nl;0;ON;;;;5;N;;;;;
+10144;GREEK ACROPHONIC ATTIC FIFTY;Nl;0;ON;;;;50;N;;;;;
+10145;GREEK ACROPHONIC ATTIC FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10146;GREEK ACROPHONIC ATTIC FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10147;GREEK ACROPHONIC ATTIC FIFTY THOUSAND;Nl;0;ON;;;;50000;N;;;;;
+10148;GREEK ACROPHONIC ATTIC FIVE TALENTS;Nl;0;ON;;;;5;N;;;;;
+10149;GREEK ACROPHONIC ATTIC TEN TALENTS;Nl;0;ON;;;;10;N;;;;;
+1014A;GREEK ACROPHONIC ATTIC FIFTY TALENTS;Nl;0;ON;;;;50;N;;;;;
+1014B;GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS;Nl;0;ON;;;;100;N;;;;;
+1014C;GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS;Nl;0;ON;;;;500;N;;;;;
+1014D;GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS;Nl;0;ON;;;;1000;N;;;;;
+1014E;GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS;Nl;0;ON;;;;5000;N;;;;;
+1014F;GREEK ACROPHONIC ATTIC FIVE STATERS;Nl;0;ON;;;;5;N;;;;;
+10150;GREEK ACROPHONIC ATTIC TEN STATERS;Nl;0;ON;;;;10;N;;;;;
+10151;GREEK ACROPHONIC ATTIC FIFTY STATERS;Nl;0;ON;;;;50;N;;;;;
+10152;GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS;Nl;0;ON;;;;100;N;;;;;
+10153;GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS;Nl;0;ON;;;;500;N;;;;;
+10154;GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS;Nl;0;ON;;;;1000;N;;;;;
+10155;GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS;Nl;0;ON;;;;10000;N;;;;;
+10156;GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS;Nl;0;ON;;;;50000;N;;;;;
+10157;GREEK ACROPHONIC ATTIC TEN MNAS;Nl;0;ON;;;;10;N;;;;;
+10158;GREEK ACROPHONIC HERAEUM ONE PLETHRON;Nl;0;ON;;;;1;N;;;;;
+10159;GREEK ACROPHONIC THESPIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015A;GREEK ACROPHONIC HERMIONIAN ONE;Nl;0;ON;;;;1;N;;;;;
+1015B;GREEK ACROPHONIC EPIDAUREAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015C;GREEK ACROPHONIC THESPIAN TWO;Nl;0;ON;;;;2;N;;;;;
+1015D;GREEK ACROPHONIC CYRENAIC TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015E;GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS;Nl;0;ON;;;;2;N;;;;;
+1015F;GREEK ACROPHONIC TROEZENIAN FIVE;Nl;0;ON;;;;5;N;;;;;
+10160;GREEK ACROPHONIC TROEZENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10161;GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM;Nl;0;ON;;;;10;N;;;;;
+10162;GREEK ACROPHONIC HERMIONIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10163;GREEK ACROPHONIC MESSENIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10164;GREEK ACROPHONIC THESPIAN TEN;Nl;0;ON;;;;10;N;;;;;
+10165;GREEK ACROPHONIC THESPIAN THIRTY;Nl;0;ON;;;;30;N;;;;;
+10166;GREEK ACROPHONIC TROEZENIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10167;GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM;Nl;0;ON;;;;50;N;;;;;
+10168;GREEK ACROPHONIC HERMIONIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+10169;GREEK ACROPHONIC THESPIAN FIFTY;Nl;0;ON;;;;50;N;;;;;
+1016A;GREEK ACROPHONIC THESPIAN ONE HUNDRED;Nl;0;ON;;;;100;N;;;;;
+1016B;GREEK ACROPHONIC THESPIAN THREE HUNDRED;Nl;0;ON;;;;300;N;;;;;
+1016C;GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016D;GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016E;GREEK ACROPHONIC THESPIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+1016F;GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10170;GREEK ACROPHONIC NAXIAN FIVE HUNDRED;Nl;0;ON;;;;500;N;;;;;
+10171;GREEK ACROPHONIC THESPIAN ONE THOUSAND;Nl;0;ON;;;;1000;N;;;;;
+10172;GREEK ACROPHONIC THESPIAN FIVE THOUSAND;Nl;0;ON;;;;5000;N;;;;;
+10173;GREEK ACROPHONIC DELPHIC FIVE MNAS;Nl;0;ON;;;;5;N;;;;;
+10174;GREEK ACROPHONIC STRATIAN FIFTY MNAS;Nl;0;ON;;;;50;N;;;;;
+10175;GREEK ONE HALF SIGN;No;0;ON;;;;1/2;N;;;;;
+10176;GREEK ONE HALF SIGN ALTERNATE FORM;No;0;ON;;;;1/2;N;;;;;
+10177;GREEK TWO THIRDS SIGN;No;0;ON;;;;2/3;N;;;;;
+10178;GREEK THREE QUARTERS SIGN;No;0;ON;;;;3/4;N;;;;;
+10179;GREEK YEAR SIGN;So;0;ON;;;;;N;;;;;
+1017A;GREEK TALENT SIGN;So;0;ON;;;;;N;;;;;
+1017B;GREEK DRACHMA SIGN;So;0;ON;;;;;N;;;;;
+1017C;GREEK OBOL SIGN;So;0;ON;;;;;N;;;;;
+1017D;GREEK TWO OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017E;GREEK THREE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+1017F;GREEK FOUR OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10180;GREEK FIVE OBOLS SIGN;So;0;ON;;;;;N;;;;;
+10181;GREEK METRETES SIGN;So;0;ON;;;;;N;;;;;
+10182;GREEK KYATHOS BASE SIGN;So;0;ON;;;;;N;;;;;
+10183;GREEK LITRA SIGN;So;0;ON;;;;;N;;;;;
+10184;GREEK OUNKIA SIGN;So;0;ON;;;;;N;;;;;
+10185;GREEK XESTES SIGN;So;0;ON;;;;;N;;;;;
+10186;GREEK ARTABE SIGN;So;0;ON;;;;;N;;;;;
+10187;GREEK AROURA SIGN;So;0;ON;;;;;N;;;;;
+10188;GREEK GRAMMA SIGN;So;0;ON;;;;;N;;;;;
+10189;GREEK TRYBLION BASE SIGN;So;0;ON;;;;;N;;;;;
+1018A;GREEK ZERO SIGN;No;0;ON;;;;0;N;;;;;
+10300;OLD ITALIC LETTER A;Lo;0;L;;;;;N;;;;;
+10301;OLD ITALIC LETTER BE;Lo;0;L;;;;;N;;;;;
+10302;OLD ITALIC LETTER KE;Lo;0;L;;;;;N;;;;;
+10303;OLD ITALIC LETTER DE;Lo;0;L;;;;;N;;;;;
+10304;OLD ITALIC LETTER E;Lo;0;L;;;;;N;;;;;
+10305;OLD ITALIC LETTER VE;Lo;0;L;;;;;N;;;;;
+10306;OLD ITALIC LETTER ZE;Lo;0;L;;;;;N;;;;;
+10307;OLD ITALIC LETTER HE;Lo;0;L;;;;;N;;;;;
+10308;OLD ITALIC LETTER THE;Lo;0;L;;;;;N;;;;;
+10309;OLD ITALIC LETTER I;Lo;0;L;;;;;N;;;;;
+1030A;OLD ITALIC LETTER KA;Lo;0;L;;;;;N;;;;;
+1030B;OLD ITALIC LETTER EL;Lo;0;L;;;;;N;;;;;
+1030C;OLD ITALIC LETTER EM;Lo;0;L;;;;;N;;;;;
+1030D;OLD ITALIC LETTER EN;Lo;0;L;;;;;N;;;;;
+1030E;OLD ITALIC LETTER ESH;Lo;0;L;;;;;N;;;;;
+1030F;OLD ITALIC LETTER O;Lo;0;L;;;;;N;;Faliscan;;;
+10310;OLD ITALIC LETTER PE;Lo;0;L;;;;;N;;;;;
+10311;OLD ITALIC LETTER SHE;Lo;0;L;;;;;N;;;;;
+10312;OLD ITALIC LETTER KU;Lo;0;L;;;;;N;;;;;
+10313;OLD ITALIC LETTER ER;Lo;0;L;;;;;N;;;;;
+10314;OLD ITALIC LETTER ES;Lo;0;L;;;;;N;;;;;
+10315;OLD ITALIC LETTER TE;Lo;0;L;;;;;N;;;;;
+10316;OLD ITALIC LETTER U;Lo;0;L;;;;;N;;;;;
+10317;OLD ITALIC LETTER EKS;Lo;0;L;;;;;N;;Faliscan;;;
+10318;OLD ITALIC LETTER PHE;Lo;0;L;;;;;N;;;;;
+10319;OLD ITALIC LETTER KHE;Lo;0;L;;;;;N;;;;;
+1031A;OLD ITALIC LETTER EF;Lo;0;L;;;;;N;;;;;
+1031B;OLD ITALIC LETTER ERS;Lo;0;L;;;;;N;;Umbrian;;;
+1031C;OLD ITALIC LETTER CHE;Lo;0;L;;;;;N;;Umbrian;;;
+1031D;OLD ITALIC LETTER II;Lo;0;L;;;;;N;;Oscan;;;
+1031E;OLD ITALIC LETTER UU;Lo;0;L;;;;;N;;Oscan;;;
+10320;OLD ITALIC NUMERAL ONE;No;0;L;;;;1;N;;;;;
+10321;OLD ITALIC NUMERAL FIVE;No;0;L;;;;5;N;;;;;
+10322;OLD ITALIC NUMERAL TEN;No;0;L;;;;10;N;;;;;
+10323;OLD ITALIC NUMERAL FIFTY;No;0;L;;;;50;N;;;;;
+10330;GOTHIC LETTER AHSA;Lo;0;L;;;;;N;;;;;
+10331;GOTHIC LETTER BAIRKAN;Lo;0;L;;;;;N;;;;;
+10332;GOTHIC LETTER GIBA;Lo;0;L;;;;;N;;;;;
+10333;GOTHIC LETTER DAGS;Lo;0;L;;;;;N;;;;;
+10334;GOTHIC LETTER AIHVUS;Lo;0;L;;;;;N;;;;;
+10335;GOTHIC LETTER QAIRTHRA;Lo;0;L;;;;;N;;;;;
+10336;GOTHIC LETTER IUJA;Lo;0;L;;;;;N;;;;;
+10337;GOTHIC LETTER HAGL;Lo;0;L;;;;;N;;;;;
+10338;GOTHIC LETTER THIUTH;Lo;0;L;;;;;N;;;;;
+10339;GOTHIC LETTER EIS;Lo;0;L;;;;;N;;;;;
+1033A;GOTHIC LETTER KUSMA;Lo;0;L;;;;;N;;;;;
+1033B;GOTHIC LETTER LAGUS;Lo;0;L;;;;;N;;;;;
+1033C;GOTHIC LETTER MANNA;Lo;0;L;;;;;N;;;;;
+1033D;GOTHIC LETTER NAUTHS;Lo;0;L;;;;;N;;;;;
+1033E;GOTHIC LETTER JER;Lo;0;L;;;;;N;;;;;
+1033F;GOTHIC LETTER URUS;Lo;0;L;;;;;N;;;;;
+10340;GOTHIC LETTER PAIRTHRA;Lo;0;L;;;;;N;;;;;
+10341;GOTHIC LETTER NINETY;Nl;0;L;;;;90;N;;;;;
+10342;GOTHIC LETTER RAIDA;Lo;0;L;;;;;N;;;;;
+10343;GOTHIC LETTER SAUIL;Lo;0;L;;;;;N;;;;;
+10344;GOTHIC LETTER TEIWS;Lo;0;L;;;;;N;;;;;
+10345;GOTHIC LETTER WINJA;Lo;0;L;;;;;N;;;;;
+10346;GOTHIC LETTER FAIHU;Lo;0;L;;;;;N;;;;;
+10347;GOTHIC LETTER IGGWS;Lo;0;L;;;;;N;;;;;
+10348;GOTHIC LETTER HWAIR;Lo;0;L;;;;;N;;;;;
+10349;GOTHIC LETTER OTHAL;Lo;0;L;;;;;N;;;;;
+1034A;GOTHIC LETTER NINE HUNDRED;Nl;0;L;;;;900;N;;;;;
+10380;UGARITIC LETTER ALPA;Lo;0;L;;;;;N;;;;;
+10381;UGARITIC LETTER BETA;Lo;0;L;;;;;N;;;;;
+10382;UGARITIC LETTER GAMLA;Lo;0;L;;;;;N;;;;;
+10383;UGARITIC LETTER KHA;Lo;0;L;;;;;N;;;;;
+10384;UGARITIC LETTER DELTA;Lo;0;L;;;;;N;;;;;
+10385;UGARITIC LETTER HO;Lo;0;L;;;;;N;;;;;
+10386;UGARITIC LETTER WO;Lo;0;L;;;;;N;;;;;
+10387;UGARITIC LETTER ZETA;Lo;0;L;;;;;N;;;;;
+10388;UGARITIC LETTER HOTA;Lo;0;L;;;;;N;;;;;
+10389;UGARITIC LETTER TET;Lo;0;L;;;;;N;;;;;
+1038A;UGARITIC LETTER YOD;Lo;0;L;;;;;N;;;;;
+1038B;UGARITIC LETTER KAF;Lo;0;L;;;;;N;;;;;
+1038C;UGARITIC LETTER SHIN;Lo;0;L;;;;;N;;;;;
+1038D;UGARITIC LETTER LAMDA;Lo;0;L;;;;;N;;;;;
+1038E;UGARITIC LETTER MEM;Lo;0;L;;;;;N;;;;;
+1038F;UGARITIC LETTER DHAL;Lo;0;L;;;;;N;;;;;
+10390;UGARITIC LETTER NUN;Lo;0;L;;;;;N;;;;;
+10391;UGARITIC LETTER ZU;Lo;0;L;;;;;N;;;;;
+10392;UGARITIC LETTER SAMKA;Lo;0;L;;;;;N;;;;;
+10393;UGARITIC LETTER AIN;Lo;0;L;;;;;N;;;;;
+10394;UGARITIC LETTER PU;Lo;0;L;;;;;N;;;;;
+10395;UGARITIC LETTER SADE;Lo;0;L;;;;;N;;;;;
+10396;UGARITIC LETTER QOPA;Lo;0;L;;;;;N;;;;;
+10397;UGARITIC LETTER RASHA;Lo;0;L;;;;;N;;;;;
+10398;UGARITIC LETTER THANNA;Lo;0;L;;;;;N;;;;;
+10399;UGARITIC LETTER GHAIN;Lo;0;L;;;;;N;;;;;
+1039A;UGARITIC LETTER TO;Lo;0;L;;;;;N;;;;;
+1039B;UGARITIC LETTER I;Lo;0;L;;;;;N;;;;;
+1039C;UGARITIC LETTER U;Lo;0;L;;;;;N;;;;;
+1039D;UGARITIC LETTER SSU;Lo;0;L;;;;;N;;;;;
+1039F;UGARITIC WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103A0;OLD PERSIAN SIGN A;Lo;0;L;;;;;N;;;;;
+103A1;OLD PERSIAN SIGN I;Lo;0;L;;;;;N;;;;;
+103A2;OLD PERSIAN SIGN U;Lo;0;L;;;;;N;;;;;
+103A3;OLD PERSIAN SIGN KA;Lo;0;L;;;;;N;;;;;
+103A4;OLD PERSIAN SIGN KU;Lo;0;L;;;;;N;;;;;
+103A5;OLD PERSIAN SIGN GA;Lo;0;L;;;;;N;;;;;
+103A6;OLD PERSIAN SIGN GU;Lo;0;L;;;;;N;;;;;
+103A7;OLD PERSIAN SIGN XA;Lo;0;L;;;;;N;;;;;
+103A8;OLD PERSIAN SIGN CA;Lo;0;L;;;;;N;;;;;
+103A9;OLD PERSIAN SIGN JA;Lo;0;L;;;;;N;;;;;
+103AA;OLD PERSIAN SIGN JI;Lo;0;L;;;;;N;;;;;
+103AB;OLD PERSIAN SIGN TA;Lo;0;L;;;;;N;;;;;
+103AC;OLD PERSIAN SIGN TU;Lo;0;L;;;;;N;;;;;
+103AD;OLD PERSIAN SIGN DA;Lo;0;L;;;;;N;;;;;
+103AE;OLD PERSIAN SIGN DI;Lo;0;L;;;;;N;;;;;
+103AF;OLD PERSIAN SIGN DU;Lo;0;L;;;;;N;;;;;
+103B0;OLD PERSIAN SIGN THA;Lo;0;L;;;;;N;;;;;
+103B1;OLD PERSIAN SIGN PA;Lo;0;L;;;;;N;;;;;
+103B2;OLD PERSIAN SIGN BA;Lo;0;L;;;;;N;;;;;
+103B3;OLD PERSIAN SIGN FA;Lo;0;L;;;;;N;;;;;
+103B4;OLD PERSIAN SIGN NA;Lo;0;L;;;;;N;;;;;
+103B5;OLD PERSIAN SIGN NU;Lo;0;L;;;;;N;;;;;
+103B6;OLD PERSIAN SIGN MA;Lo;0;L;;;;;N;;;;;
+103B7;OLD PERSIAN SIGN MI;Lo;0;L;;;;;N;;;;;
+103B8;OLD PERSIAN SIGN MU;Lo;0;L;;;;;N;;;;;
+103B9;OLD PERSIAN SIGN YA;Lo;0;L;;;;;N;;;;;
+103BA;OLD PERSIAN SIGN VA;Lo;0;L;;;;;N;;;;;
+103BB;OLD PERSIAN SIGN VI;Lo;0;L;;;;;N;;;;;
+103BC;OLD PERSIAN SIGN RA;Lo;0;L;;;;;N;;;;;
+103BD;OLD PERSIAN SIGN RU;Lo;0;L;;;;;N;;;;;
+103BE;OLD PERSIAN SIGN LA;Lo;0;L;;;;;N;;;;;
+103BF;OLD PERSIAN SIGN SA;Lo;0;L;;;;;N;;;;;
+103C0;OLD PERSIAN SIGN ZA;Lo;0;L;;;;;N;;;;;
+103C1;OLD PERSIAN SIGN SHA;Lo;0;L;;;;;N;;;;;
+103C2;OLD PERSIAN SIGN SSA;Lo;0;L;;;;;N;;;;;
+103C3;OLD PERSIAN SIGN HA;Lo;0;L;;;;;N;;;;;
+103C8;OLD PERSIAN SIGN AURAMAZDAA;Lo;0;L;;;;;N;;;;;
+103C9;OLD PERSIAN SIGN AURAMAZDAA-2;Lo;0;L;;;;;N;;;;;
+103CA;OLD PERSIAN SIGN AURAMAZDAAHA;Lo;0;L;;;;;N;;;;;
+103CB;OLD PERSIAN SIGN XSHAAYATHIYA;Lo;0;L;;;;;N;;;;;
+103CC;OLD PERSIAN SIGN DAHYAAUSH;Lo;0;L;;;;;N;;;;;
+103CD;OLD PERSIAN SIGN DAHYAAUSH-2;Lo;0;L;;;;;N;;;;;
+103CE;OLD PERSIAN SIGN BAGA;Lo;0;L;;;;;N;;;;;
+103CF;OLD PERSIAN SIGN BUUMISH;Lo;0;L;;;;;N;;;;;
+103D0;OLD PERSIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+103D1;OLD PERSIAN NUMBER ONE;Nl;0;L;;;;1;N;;;;;
+103D2;OLD PERSIAN NUMBER TWO;Nl;0;L;;;;2;N;;;;;
+103D3;OLD PERSIAN NUMBER TEN;Nl;0;L;;;;10;N;;;;;
+103D4;OLD PERSIAN NUMBER TWENTY;Nl;0;L;;;;20;N;;;;;
+103D5;OLD PERSIAN NUMBER HUNDRED;Nl;0;L;;;;100;N;;;;;
+10400;DESERET CAPITAL LETTER LONG I;Lu;0;L;;;;;N;;;;10428;
+10401;DESERET CAPITAL LETTER LONG E;Lu;0;L;;;;;N;;;;10429;
+10402;DESERET CAPITAL LETTER LONG A;Lu;0;L;;;;;N;;;;1042A;
+10403;DESERET CAPITAL LETTER LONG AH;Lu;0;L;;;;;N;;;;1042B;
+10404;DESERET CAPITAL LETTER LONG O;Lu;0;L;;;;;N;;;;1042C;
+10405;DESERET CAPITAL LETTER LONG OO;Lu;0;L;;;;;N;;;;1042D;
+10406;DESERET CAPITAL LETTER SHORT I;Lu;0;L;;;;;N;;;;1042E;
+10407;DESERET CAPITAL LETTER SHORT E;Lu;0;L;;;;;N;;;;1042F;
+10408;DESERET CAPITAL LETTER SHORT A;Lu;0;L;;;;;N;;;;10430;
+10409;DESERET CAPITAL LETTER SHORT AH;Lu;0;L;;;;;N;;;;10431;
+1040A;DESERET CAPITAL LETTER SHORT O;Lu;0;L;;;;;N;;;;10432;
+1040B;DESERET CAPITAL LETTER SHORT OO;Lu;0;L;;;;;N;;;;10433;
+1040C;DESERET CAPITAL LETTER AY;Lu;0;L;;;;;N;;;;10434;
+1040D;DESERET CAPITAL LETTER OW;Lu;0;L;;;;;N;;;;10435;
+1040E;DESERET CAPITAL LETTER WU;Lu;0;L;;;;;N;;;;10436;
+1040F;DESERET CAPITAL LETTER YEE;Lu;0;L;;;;;N;;;;10437;
+10410;DESERET CAPITAL LETTER H;Lu;0;L;;;;;N;;;;10438;
+10411;DESERET CAPITAL LETTER PEE;Lu;0;L;;;;;N;;;;10439;
+10412;DESERET CAPITAL LETTER BEE;Lu;0;L;;;;;N;;;;1043A;
+10413;DESERET CAPITAL LETTER TEE;Lu;0;L;;;;;N;;;;1043B;
+10414;DESERET CAPITAL LETTER DEE;Lu;0;L;;;;;N;;;;1043C;
+10415;DESERET CAPITAL LETTER CHEE;Lu;0;L;;;;;N;;;;1043D;
+10416;DESERET CAPITAL LETTER JEE;Lu;0;L;;;;;N;;;;1043E;
+10417;DESERET CAPITAL LETTER KAY;Lu;0;L;;;;;N;;;;1043F;
+10418;DESERET CAPITAL LETTER GAY;Lu;0;L;;;;;N;;;;10440;
+10419;DESERET CAPITAL LETTER EF;Lu;0;L;;;;;N;;;;10441;
+1041A;DESERET CAPITAL LETTER VEE;Lu;0;L;;;;;N;;;;10442;
+1041B;DESERET CAPITAL LETTER ETH;Lu;0;L;;;;;N;;;;10443;
+1041C;DESERET CAPITAL LETTER THEE;Lu;0;L;;;;;N;;;;10444;
+1041D;DESERET CAPITAL LETTER ES;Lu;0;L;;;;;N;;;;10445;
+1041E;DESERET CAPITAL LETTER ZEE;Lu;0;L;;;;;N;;;;10446;
+1041F;DESERET CAPITAL LETTER ESH;Lu;0;L;;;;;N;;;;10447;
+10420;DESERET CAPITAL LETTER ZHEE;Lu;0;L;;;;;N;;;;10448;
+10421;DESERET CAPITAL LETTER ER;Lu;0;L;;;;;N;;;;10449;
+10422;DESERET CAPITAL LETTER EL;Lu;0;L;;;;;N;;;;1044A;
+10423;DESERET CAPITAL LETTER EM;Lu;0;L;;;;;N;;;;1044B;
+10424;DESERET CAPITAL LETTER EN;Lu;0;L;;;;;N;;;;1044C;
+10425;DESERET CAPITAL LETTER ENG;Lu;0;L;;;;;N;;;;1044D;
+10426;DESERET CAPITAL LETTER OI;Lu;0;L;;;;;N;;;;1044E;
+10427;DESERET CAPITAL LETTER EW;Lu;0;L;;;;;N;;;;1044F;
+10428;DESERET SMALL LETTER LONG I;Ll;0;L;;;;;N;;;10400;;10400
+10429;DESERET SMALL LETTER LONG E;Ll;0;L;;;;;N;;;10401;;10401
+1042A;DESERET SMALL LETTER LONG A;Ll;0;L;;;;;N;;;10402;;10402
+1042B;DESERET SMALL LETTER LONG AH;Ll;0;L;;;;;N;;;10403;;10403
+1042C;DESERET SMALL LETTER LONG O;Ll;0;L;;;;;N;;;10404;;10404
+1042D;DESERET SMALL LETTER LONG OO;Ll;0;L;;;;;N;;;10405;;10405
+1042E;DESERET SMALL LETTER SHORT I;Ll;0;L;;;;;N;;;10406;;10406
+1042F;DESERET SMALL LETTER SHORT E;Ll;0;L;;;;;N;;;10407;;10407
+10430;DESERET SMALL LETTER SHORT A;Ll;0;L;;;;;N;;;10408;;10408
+10431;DESERET SMALL LETTER SHORT AH;Ll;0;L;;;;;N;;;10409;;10409
+10432;DESERET SMALL LETTER SHORT O;Ll;0;L;;;;;N;;;1040A;;1040A
+10433;DESERET SMALL LETTER SHORT OO;Ll;0;L;;;;;N;;;1040B;;1040B
+10434;DESERET SMALL LETTER AY;Ll;0;L;;;;;N;;;1040C;;1040C
+10435;DESERET SMALL LETTER OW;Ll;0;L;;;;;N;;;1040D;;1040D
+10436;DESERET SMALL LETTER WU;Ll;0;L;;;;;N;;;1040E;;1040E
+10437;DESERET SMALL LETTER YEE;Ll;0;L;;;;;N;;;1040F;;1040F
+10438;DESERET SMALL LETTER H;Ll;0;L;;;;;N;;;10410;;10410
+10439;DESERET SMALL LETTER PEE;Ll;0;L;;;;;N;;;10411;;10411
+1043A;DESERET SMALL LETTER BEE;Ll;0;L;;;;;N;;;10412;;10412
+1043B;DESERET SMALL LETTER TEE;Ll;0;L;;;;;N;;;10413;;10413
+1043C;DESERET SMALL LETTER DEE;Ll;0;L;;;;;N;;;10414;;10414
+1043D;DESERET SMALL LETTER CHEE;Ll;0;L;;;;;N;;;10415;;10415
+1043E;DESERET SMALL LETTER JEE;Ll;0;L;;;;;N;;;10416;;10416
+1043F;DESERET SMALL LETTER KAY;Ll;0;L;;;;;N;;;10417;;10417
+10440;DESERET SMALL LETTER GAY;Ll;0;L;;;;;N;;;10418;;10418
+10441;DESERET SMALL LETTER EF;Ll;0;L;;;;;N;;;10419;;10419
+10442;DESERET SMALL LETTER VEE;Ll;0;L;;;;;N;;;1041A;;1041A
+10443;DESERET SMALL LETTER ETH;Ll;0;L;;;;;N;;;1041B;;1041B
+10444;DESERET SMALL LETTER THEE;Ll;0;L;;;;;N;;;1041C;;1041C
+10445;DESERET SMALL LETTER ES;Ll;0;L;;;;;N;;;1041D;;1041D
+10446;DESERET SMALL LETTER ZEE;Ll;0;L;;;;;N;;;1041E;;1041E
+10447;DESERET SMALL LETTER ESH;Ll;0;L;;;;;N;;;1041F;;1041F
+10448;DESERET SMALL LETTER ZHEE;Ll;0;L;;;;;N;;;10420;;10420
+10449;DESERET SMALL LETTER ER;Ll;0;L;;;;;N;;;10421;;10421
+1044A;DESERET SMALL LETTER EL;Ll;0;L;;;;;N;;;10422;;10422
+1044B;DESERET SMALL LETTER EM;Ll;0;L;;;;;N;;;10423;;10423
+1044C;DESERET SMALL LETTER EN;Ll;0;L;;;;;N;;;10424;;10424
+1044D;DESERET SMALL LETTER ENG;Ll;0;L;;;;;N;;;10425;;10425
+1044E;DESERET SMALL LETTER OI;Ll;0;L;;;;;N;;;10426;;10426
+1044F;DESERET SMALL LETTER EW;Ll;0;L;;;;;N;;;10427;;10427
+10450;SHAVIAN LETTER PEEP;Lo;0;L;;;;;N;;;;;
+10451;SHAVIAN LETTER TOT;Lo;0;L;;;;;N;;;;;
+10452;SHAVIAN LETTER KICK;Lo;0;L;;;;;N;;;;;
+10453;SHAVIAN LETTER FEE;Lo;0;L;;;;;N;;;;;
+10454;SHAVIAN LETTER THIGH;Lo;0;L;;;;;N;;;;;
+10455;SHAVIAN LETTER SO;Lo;0;L;;;;;N;;;;;
+10456;SHAVIAN LETTER SURE;Lo;0;L;;;;;N;;;;;
+10457;SHAVIAN LETTER CHURCH;Lo;0;L;;;;;N;;;;;
+10458;SHAVIAN LETTER YEA;Lo;0;L;;;;;N;;;;;
+10459;SHAVIAN LETTER HUNG;Lo;0;L;;;;;N;;;;;
+1045A;SHAVIAN LETTER BIB;Lo;0;L;;;;;N;;;;;
+1045B;SHAVIAN LETTER DEAD;Lo;0;L;;;;;N;;;;;
+1045C;SHAVIAN LETTER GAG;Lo;0;L;;;;;N;;;;;
+1045D;SHAVIAN LETTER VOW;Lo;0;L;;;;;N;;;;;
+1045E;SHAVIAN LETTER THEY;Lo;0;L;;;;;N;;;;;
+1045F;SHAVIAN LETTER ZOO;Lo;0;L;;;;;N;;;;;
+10460;SHAVIAN LETTER MEASURE;Lo;0;L;;;;;N;;;;;
+10461;SHAVIAN LETTER JUDGE;Lo;0;L;;;;;N;;;;;
+10462;SHAVIAN LETTER WOE;Lo;0;L;;;;;N;;;;;
+10463;SHAVIAN LETTER HA-HA;Lo;0;L;;;;;N;;;;;
+10464;SHAVIAN LETTER LOLL;Lo;0;L;;;;;N;;;;;
+10465;SHAVIAN LETTER MIME;Lo;0;L;;;;;N;;;;;
+10466;SHAVIAN LETTER IF;Lo;0;L;;;;;N;;;;;
+10467;SHAVIAN LETTER EGG;Lo;0;L;;;;;N;;;;;
+10468;SHAVIAN LETTER ASH;Lo;0;L;;;;;N;;;;;
+10469;SHAVIAN LETTER ADO;Lo;0;L;;;;;N;;;;;
+1046A;SHAVIAN LETTER ON;Lo;0;L;;;;;N;;;;;
+1046B;SHAVIAN LETTER WOOL;Lo;0;L;;;;;N;;;;;
+1046C;SHAVIAN LETTER OUT;Lo;0;L;;;;;N;;;;;
+1046D;SHAVIAN LETTER AH;Lo;0;L;;;;;N;;;;;
+1046E;SHAVIAN LETTER ROAR;Lo;0;L;;;;;N;;;;;
+1046F;SHAVIAN LETTER NUN;Lo;0;L;;;;;N;;;;;
+10470;SHAVIAN LETTER EAT;Lo;0;L;;;;;N;;;;;
+10471;SHAVIAN LETTER AGE;Lo;0;L;;;;;N;;;;;
+10472;SHAVIAN LETTER ICE;Lo;0;L;;;;;N;;;;;
+10473;SHAVIAN LETTER UP;Lo;0;L;;;;;N;;;;;
+10474;SHAVIAN LETTER OAK;Lo;0;L;;;;;N;;;;;
+10475;SHAVIAN LETTER OOZE;Lo;0;L;;;;;N;;;;;
+10476;SHAVIAN LETTER OIL;Lo;0;L;;;;;N;;;;;
+10477;SHAVIAN LETTER AWE;Lo;0;L;;;;;N;;;;;
+10478;SHAVIAN LETTER ARE;Lo;0;L;;;;;N;;;;;
+10479;SHAVIAN LETTER OR;Lo;0;L;;;;;N;;;;;
+1047A;SHAVIAN LETTER AIR;Lo;0;L;;;;;N;;;;;
+1047B;SHAVIAN LETTER ERR;Lo;0;L;;;;;N;;;;;
+1047C;SHAVIAN LETTER ARRAY;Lo;0;L;;;;;N;;;;;
+1047D;SHAVIAN LETTER EAR;Lo;0;L;;;;;N;;;;;
+1047E;SHAVIAN LETTER IAN;Lo;0;L;;;;;N;;;;;
+1047F;SHAVIAN LETTER YEW;Lo;0;L;;;;;N;;;;;
+10480;OSMANYA LETTER ALEF;Lo;0;L;;;;;N;;;;;
+10481;OSMANYA LETTER BA;Lo;0;L;;;;;N;;;;;
+10482;OSMANYA LETTER TA;Lo;0;L;;;;;N;;;;;
+10483;OSMANYA LETTER JA;Lo;0;L;;;;;N;;;;;
+10484;OSMANYA LETTER XA;Lo;0;L;;;;;N;;;;;
+10485;OSMANYA LETTER KHA;Lo;0;L;;;;;N;;;;;
+10486;OSMANYA LETTER DEEL;Lo;0;L;;;;;N;;;;;
+10487;OSMANYA LETTER RA;Lo;0;L;;;;;N;;;;;
+10488;OSMANYA LETTER SA;Lo;0;L;;;;;N;;;;;
+10489;OSMANYA LETTER SHIIN;Lo;0;L;;;;;N;;;;;
+1048A;OSMANYA LETTER DHA;Lo;0;L;;;;;N;;;;;
+1048B;OSMANYA LETTER CAYN;Lo;0;L;;;;;N;;;;;
+1048C;OSMANYA LETTER GA;Lo;0;L;;;;;N;;;;;
+1048D;OSMANYA LETTER FA;Lo;0;L;;;;;N;;;;;
+1048E;OSMANYA LETTER QAAF;Lo;0;L;;;;;N;;;;;
+1048F;OSMANYA LETTER KAAF;Lo;0;L;;;;;N;;;;;
+10490;OSMANYA LETTER LAAN;Lo;0;L;;;;;N;;;;;
+10491;OSMANYA LETTER MIIN;Lo;0;L;;;;;N;;;;;
+10492;OSMANYA LETTER NUUN;Lo;0;L;;;;;N;;;;;
+10493;OSMANYA LETTER WAW;Lo;0;L;;;;;N;;;;;
+10494;OSMANYA LETTER HA;Lo;0;L;;;;;N;;;;;
+10495;OSMANYA LETTER YA;Lo;0;L;;;;;N;;;;;
+10496;OSMANYA LETTER A;Lo;0;L;;;;;N;;;;;
+10497;OSMANYA LETTER E;Lo;0;L;;;;;N;;;;;
+10498;OSMANYA LETTER I;Lo;0;L;;;;;N;;;;;
+10499;OSMANYA LETTER O;Lo;0;L;;;;;N;;;;;
+1049A;OSMANYA LETTER U;Lo;0;L;;;;;N;;;;;
+1049B;OSMANYA LETTER AA;Lo;0;L;;;;;N;;;;;
+1049C;OSMANYA LETTER EE;Lo;0;L;;;;;N;;;;;
+1049D;OSMANYA LETTER OO;Lo;0;L;;;;;N;;;;;
+104A0;OSMANYA DIGIT ZERO;Nd;0;L;;0;0;0;N;;;;;
+104A1;OSMANYA DIGIT ONE;Nd;0;L;;1;1;1;N;;;;;
+104A2;OSMANYA DIGIT TWO;Nd;0;L;;2;2;2;N;;;;;
+104A3;OSMANYA DIGIT THREE;Nd;0;L;;3;3;3;N;;;;;
+104A4;OSMANYA DIGIT FOUR;Nd;0;L;;4;4;4;N;;;;;
+104A5;OSMANYA DIGIT FIVE;Nd;0;L;;5;5;5;N;;;;;
+104A6;OSMANYA DIGIT SIX;Nd;0;L;;6;6;6;N;;;;;
+104A7;OSMANYA DIGIT SEVEN;Nd;0;L;;7;7;7;N;;;;;
+104A8;OSMANYA DIGIT EIGHT;Nd;0;L;;8;8;8;N;;;;;
+104A9;OSMANYA DIGIT NINE;Nd;0;L;;9;9;9;N;;;;;
+10800;CYPRIOT SYLLABLE A;Lo;0;R;;;;;N;;;;;
+10801;CYPRIOT SYLLABLE E;Lo;0;R;;;;;N;;;;;
+10802;CYPRIOT SYLLABLE I;Lo;0;R;;;;;N;;;;;
+10803;CYPRIOT SYLLABLE O;Lo;0;R;;;;;N;;;;;
+10804;CYPRIOT SYLLABLE U;Lo;0;R;;;;;N;;;;;
+10805;CYPRIOT SYLLABLE JA;Lo;0;R;;;;;N;;;;;
+10808;CYPRIOT SYLLABLE JO;Lo;0;R;;;;;N;;;;;
+1080A;CYPRIOT SYLLABLE KA;Lo;0;R;;;;;N;;;;;
+1080B;CYPRIOT SYLLABLE KE;Lo;0;R;;;;;N;;;;;
+1080C;CYPRIOT SYLLABLE KI;Lo;0;R;;;;;N;;;;;
+1080D;CYPRIOT SYLLABLE KO;Lo;0;R;;;;;N;;;;;
+1080E;CYPRIOT SYLLABLE KU;Lo;0;R;;;;;N;;;;;
+1080F;CYPRIOT SYLLABLE LA;Lo;0;R;;;;;N;;;;;
+10810;CYPRIOT SYLLABLE LE;Lo;0;R;;;;;N;;;;;
+10811;CYPRIOT SYLLABLE LI;Lo;0;R;;;;;N;;;;;
+10812;CYPRIOT SYLLABLE LO;Lo;0;R;;;;;N;;;;;
+10813;CYPRIOT SYLLABLE LU;Lo;0;R;;;;;N;;;;;
+10814;CYPRIOT SYLLABLE MA;Lo;0;R;;;;;N;;;;;
+10815;CYPRIOT SYLLABLE ME;Lo;0;R;;;;;N;;;;;
+10816;CYPRIOT SYLLABLE MI;Lo;0;R;;;;;N;;;;;
+10817;CYPRIOT SYLLABLE MO;Lo;0;R;;;;;N;;;;;
+10818;CYPRIOT SYLLABLE MU;Lo;0;R;;;;;N;;;;;
+10819;CYPRIOT SYLLABLE NA;Lo;0;R;;;;;N;;;;;
+1081A;CYPRIOT SYLLABLE NE;Lo;0;R;;;;;N;;;;;
+1081B;CYPRIOT SYLLABLE NI;Lo;0;R;;;;;N;;;;;
+1081C;CYPRIOT SYLLABLE NO;Lo;0;R;;;;;N;;;;;
+1081D;CYPRIOT SYLLABLE NU;Lo;0;R;;;;;N;;;;;
+1081E;CYPRIOT SYLLABLE PA;Lo;0;R;;;;;N;;;;;
+1081F;CYPRIOT SYLLABLE PE;Lo;0;R;;;;;N;;;;;
+10820;CYPRIOT SYLLABLE PI;Lo;0;R;;;;;N;;;;;
+10821;CYPRIOT SYLLABLE PO;Lo;0;R;;;;;N;;;;;
+10822;CYPRIOT SYLLABLE PU;Lo;0;R;;;;;N;;;;;
+10823;CYPRIOT SYLLABLE RA;Lo;0;R;;;;;N;;;;;
+10824;CYPRIOT SYLLABLE RE;Lo;0;R;;;;;N;;;;;
+10825;CYPRIOT SYLLABLE RI;Lo;0;R;;;;;N;;;;;
+10826;CYPRIOT SYLLABLE RO;Lo;0;R;;;;;N;;;;;
+10827;CYPRIOT SYLLABLE RU;Lo;0;R;;;;;N;;;;;
+10828;CYPRIOT SYLLABLE SA;Lo;0;R;;;;;N;;;;;
+10829;CYPRIOT SYLLABLE SE;Lo;0;R;;;;;N;;;;;
+1082A;CYPRIOT SYLLABLE SI;Lo;0;R;;;;;N;;;;;
+1082B;CYPRIOT SYLLABLE SO;Lo;0;R;;;;;N;;;;;
+1082C;CYPRIOT SYLLABLE SU;Lo;0;R;;;;;N;;;;;
+1082D;CYPRIOT SYLLABLE TA;Lo;0;R;;;;;N;;;;;
+1082E;CYPRIOT SYLLABLE TE;Lo;0;R;;;;;N;;;;;
+1082F;CYPRIOT SYLLABLE TI;Lo;0;R;;;;;N;;;;;
+10830;CYPRIOT SYLLABLE TO;Lo;0;R;;;;;N;;;;;
+10831;CYPRIOT SYLLABLE TU;Lo;0;R;;;;;N;;;;;
+10832;CYPRIOT SYLLABLE WA;Lo;0;R;;;;;N;;;;;
+10833;CYPRIOT SYLLABLE WE;Lo;0;R;;;;;N;;;;;
+10834;CYPRIOT SYLLABLE WI;Lo;0;R;;;;;N;;;;;
+10835;CYPRIOT SYLLABLE WO;Lo;0;R;;;;;N;;;;;
+10837;CYPRIOT SYLLABLE XA;Lo;0;R;;;;;N;;;;;
+10838;CYPRIOT SYLLABLE XE;Lo;0;R;;;;;N;;;;;
+1083C;CYPRIOT SYLLABLE ZA;Lo;0;R;;;;;N;;;;;
+1083F;CYPRIOT SYLLABLE ZO;Lo;0;R;;;;;N;;;;;
+10900;PHOENICIAN LETTER ALF;Lo;0;R;;;;;N;;;;;
+10901;PHOENICIAN LETTER BET;Lo;0;R;;;;;N;;;;;
+10902;PHOENICIAN LETTER GAML;Lo;0;R;;;;;N;;;;;
+10903;PHOENICIAN LETTER DELT;Lo;0;R;;;;;N;;;;;
+10904;PHOENICIAN LETTER HE;Lo;0;R;;;;;N;;;;;
+10905;PHOENICIAN LETTER WAU;Lo;0;R;;;;;N;;;;;
+10906;PHOENICIAN LETTER ZAI;Lo;0;R;;;;;N;;;;;
+10907;PHOENICIAN LETTER HET;Lo;0;R;;;;;N;;;;;
+10908;PHOENICIAN LETTER TET;Lo;0;R;;;;;N;;;;;
+10909;PHOENICIAN LETTER YOD;Lo;0;R;;;;;N;;;;;
+1090A;PHOENICIAN LETTER KAF;Lo;0;R;;;;;N;;;;;
+1090B;PHOENICIAN LETTER LAMD;Lo;0;R;;;;;N;;;;;
+1090C;PHOENICIAN LETTER MEM;Lo;0;R;;;;;N;;;;;
+1090D;PHOENICIAN LETTER NUN;Lo;0;R;;;;;N;;;;;
+1090E;PHOENICIAN LETTER SEMK;Lo;0;R;;;;;N;;;;;
+1090F;PHOENICIAN LETTER AIN;Lo;0;R;;;;;N;;;;;
+10910;PHOENICIAN LETTER PE;Lo;0;R;;;;;N;;;;;
+10911;PHOENICIAN LETTER SADE;Lo;0;R;;;;;N;;;;;
+10912;PHOENICIAN LETTER QOF;Lo;0;R;;;;;N;;;;;
+10913;PHOENICIAN LETTER ROSH;Lo;0;R;;;;;N;;;;;
+10914;PHOENICIAN LETTER SHIN;Lo;0;R;;;;;N;;;;;
+10915;PHOENICIAN LETTER TAU;Lo;0;R;;;;;N;;;;;
+10916;PHOENICIAN NUMBER ONE;No;0;R;;;;1;N;;;;;
+10917;PHOENICIAN NUMBER TEN;No;0;R;;;;10;N;;;;;
+10918;PHOENICIAN NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10919;PHOENICIAN NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+1091F;PHOENICIAN WORD SEPARATOR;Po;0;ON;;;;;N;;;;;
+10A00;KHAROSHTHI LETTER A;Lo;0;R;;;;;N;;;;;
+10A01;KHAROSHTHI VOWEL SIGN I;Mn;0;NSM;;;;;N;;;;;
+10A02;KHAROSHTHI VOWEL SIGN U;Mn;0;NSM;;;;;N;;;;;
+10A03;KHAROSHTHI VOWEL SIGN VOCALIC R;Mn;0;NSM;;;;;N;;;;;
+10A05;KHAROSHTHI VOWEL SIGN E;Mn;0;NSM;;;;;N;;;;;
+10A06;KHAROSHTHI VOWEL SIGN O;Mn;0;NSM;;;;;N;;;;;
+10A0C;KHAROSHTHI VOWEL LENGTH MARK;Mn;0;NSM;;;;;N;;;;;
+10A0D;KHAROSHTHI SIGN DOUBLE RING BELOW;Mn;220;NSM;;;;;N;;;;;
+10A0E;KHAROSHTHI SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+10A0F;KHAROSHTHI SIGN VISARGA;Mn;230;NSM;;;;;N;;;;;
+10A10;KHAROSHTHI LETTER KA;Lo;0;R;;;;;N;;;;;
+10A11;KHAROSHTHI LETTER KHA;Lo;0;R;;;;;N;;;;;
+10A12;KHAROSHTHI LETTER GA;Lo;0;R;;;;;N;;;;;
+10A13;KHAROSHTHI LETTER GHA;Lo;0;R;;;;;N;;;;;
+10A15;KHAROSHTHI LETTER CA;Lo;0;R;;;;;N;;;;;
+10A16;KHAROSHTHI LETTER CHA;Lo;0;R;;;;;N;;;;;
+10A17;KHAROSHTHI LETTER JA;Lo;0;R;;;;;N;;;;;
+10A19;KHAROSHTHI LETTER NYA;Lo;0;R;;;;;N;;;;;
+10A1A;KHAROSHTHI LETTER TTA;Lo;0;R;;;;;N;;;;;
+10A1B;KHAROSHTHI LETTER TTHA;Lo;0;R;;;;;N;;;;;
+10A1C;KHAROSHTHI LETTER DDA;Lo;0;R;;;;;N;;;;;
+10A1D;KHAROSHTHI LETTER DDHA;Lo;0;R;;;;;N;;;;;
+10A1E;KHAROSHTHI LETTER NNA;Lo;0;R;;;;;N;;;;;
+10A1F;KHAROSHTHI LETTER TA;Lo;0;R;;;;;N;;;;;
+10A20;KHAROSHTHI LETTER THA;Lo;0;R;;;;;N;;;;;
+10A21;KHAROSHTHI LETTER DA;Lo;0;R;;;;;N;;;;;
+10A22;KHAROSHTHI LETTER DHA;Lo;0;R;;;;;N;;;;;
+10A23;KHAROSHTHI LETTER NA;Lo;0;R;;;;;N;;;;;
+10A24;KHAROSHTHI LETTER PA;Lo;0;R;;;;;N;;;;;
+10A25;KHAROSHTHI LETTER PHA;Lo;0;R;;;;;N;;;;;
+10A26;KHAROSHTHI LETTER BA;Lo;0;R;;;;;N;;;;;
+10A27;KHAROSHTHI LETTER BHA;Lo;0;R;;;;;N;;;;;
+10A28;KHAROSHTHI LETTER MA;Lo;0;R;;;;;N;;;;;
+10A29;KHAROSHTHI LETTER YA;Lo;0;R;;;;;N;;;;;
+10A2A;KHAROSHTHI LETTER RA;Lo;0;R;;;;;N;;;;;
+10A2B;KHAROSHTHI LETTER LA;Lo;0;R;;;;;N;;;;;
+10A2C;KHAROSHTHI LETTER VA;Lo;0;R;;;;;N;;;;;
+10A2D;KHAROSHTHI LETTER SHA;Lo;0;R;;;;;N;;;;;
+10A2E;KHAROSHTHI LETTER SSA;Lo;0;R;;;;;N;;;;;
+10A2F;KHAROSHTHI LETTER SA;Lo;0;R;;;;;N;;;;;
+10A30;KHAROSHTHI LETTER ZA;Lo;0;R;;;;;N;;;;;
+10A31;KHAROSHTHI LETTER HA;Lo;0;R;;;;;N;;;;;
+10A32;KHAROSHTHI LETTER KKA;Lo;0;R;;;;;N;;;;;
+10A33;KHAROSHTHI LETTER TTTHA;Lo;0;R;;;;;N;;;;;
+10A38;KHAROSHTHI SIGN BAR ABOVE;Mn;230;NSM;;;;;N;;;;;
+10A39;KHAROSHTHI SIGN CAUDA;Mn;1;NSM;;;;;N;;;;;
+10A3A;KHAROSHTHI SIGN DOT BELOW;Mn;220;NSM;;;;;N;;;;;
+10A3F;KHAROSHTHI VIRAMA;Mn;9;NSM;;;;;N;;;;;
+10A40;KHAROSHTHI DIGIT ONE;No;0;R;;;1;1;N;;;;;
+10A41;KHAROSHTHI DIGIT TWO;No;0;R;;;2;2;N;;;;;
+10A42;KHAROSHTHI DIGIT THREE;No;0;R;;;3;3;N;;;;;
+10A43;KHAROSHTHI DIGIT FOUR;No;0;R;;;4;4;N;;;;;
+10A44;KHAROSHTHI NUMBER TEN;No;0;R;;;;10;N;;;;;
+10A45;KHAROSHTHI NUMBER TWENTY;No;0;R;;;;20;N;;;;;
+10A46;KHAROSHTHI NUMBER ONE HUNDRED;No;0;R;;;;100;N;;;;;
+10A47;KHAROSHTHI NUMBER ONE THOUSAND;No;0;R;;;;1000;N;;;;;
+10A50;KHAROSHTHI PUNCTUATION DOT;Po;0;R;;;;;N;;;;;
+10A51;KHAROSHTHI PUNCTUATION SMALL CIRCLE;Po;0;R;;;;;N;;;;;
+10A52;KHAROSHTHI PUNCTUATION CIRCLE;Po;0;R;;;;;N;;;;;
+10A53;KHAROSHTHI PUNCTUATION CRESCENT BAR;Po;0;R;;;;;N;;;;;
+10A54;KHAROSHTHI PUNCTUATION MANGALAM;Po;0;R;;;;;N;;;;;
+10A55;KHAROSHTHI PUNCTUATION LOTUS;Po;0;R;;;;;N;;;;;
+10A56;KHAROSHTHI PUNCTUATION DANDA;Po;0;R;;;;;N;;;;;
+10A57;KHAROSHTHI PUNCTUATION DOUBLE DANDA;Po;0;R;;;;;N;;;;;
+10A58;KHAROSHTHI PUNCTUATION LINES;Po;0;R;;;;;N;;;;;
+12000;CUNEIFORM SIGN A;Lo;0;L;;;;;N;;;;;
+12001;CUNEIFORM SIGN A TIMES A;Lo;0;L;;;;;N;;;;;
+12002;CUNEIFORM SIGN A TIMES BAD;Lo;0;L;;;;;N;;;;;
+12003;CUNEIFORM SIGN A TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12004;CUNEIFORM SIGN A TIMES HA;Lo;0;L;;;;;N;;;;;
+12005;CUNEIFORM SIGN A TIMES IGI;Lo;0;L;;;;;N;;;;;
+12006;CUNEIFORM SIGN A TIMES LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+12007;CUNEIFORM SIGN A TIMES MUSH;Lo;0;L;;;;;N;;;;;
+12008;CUNEIFORM SIGN A TIMES SAG;Lo;0;L;;;;;N;;;;;
+12009;CUNEIFORM SIGN A2;Lo;0;L;;;;;N;;;;;
+1200A;CUNEIFORM SIGN AB;Lo;0;L;;;;;N;;;;;
+1200B;CUNEIFORM SIGN AB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1200C;CUNEIFORM SIGN AB TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+1200D;CUNEIFORM SIGN AB TIMES GAL;Lo;0;L;;;;;N;;;;;
+1200E;CUNEIFORM SIGN AB TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1200F;CUNEIFORM SIGN AB TIMES HA;Lo;0;L;;;;;N;;;;;
+12010;CUNEIFORM SIGN AB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12011;CUNEIFORM SIGN AB TIMES IMIN;Lo;0;L;;;;;N;;;;;
+12012;CUNEIFORM SIGN AB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+12013;CUNEIFORM SIGN AB TIMES SHESH;Lo;0;L;;;;;N;;;;;
+12014;CUNEIFORM SIGN AB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12015;CUNEIFORM SIGN AB GUNU;Lo;0;L;;;;;N;;;;;
+12016;CUNEIFORM SIGN AB2;Lo;0;L;;;;;N;;;;;
+12017;CUNEIFORM SIGN AB2 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+12018;CUNEIFORM SIGN AB2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12019;CUNEIFORM SIGN AB2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1201A;CUNEIFORM SIGN AB2 TIMES SHA3;Lo;0;L;;;;;N;;;;;
+1201B;CUNEIFORM SIGN AB2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1201C;CUNEIFORM SIGN AD;Lo;0;L;;;;;N;;;;;
+1201D;CUNEIFORM SIGN AK;Lo;0;L;;;;;N;;;;;
+1201E;CUNEIFORM SIGN AK TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+1201F;CUNEIFORM SIGN AK TIMES SHITA PLUS GISH;Lo;0;L;;;;;N;;;;;
+12020;CUNEIFORM SIGN AL;Lo;0;L;;;;;N;;;;;
+12021;CUNEIFORM SIGN AL TIMES AL;Lo;0;L;;;;;N;;;;;
+12022;CUNEIFORM SIGN AL TIMES DIM2;Lo;0;L;;;;;N;;;;;
+12023;CUNEIFORM SIGN AL TIMES GISH;Lo;0;L;;;;;N;;;;;
+12024;CUNEIFORM SIGN AL TIMES HA;Lo;0;L;;;;;N;;;;;
+12025;CUNEIFORM SIGN AL TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12026;CUNEIFORM SIGN AL TIMES KI;Lo;0;L;;;;;N;;;;;
+12027;CUNEIFORM SIGN AL TIMES SHE;Lo;0;L;;;;;N;;;;;
+12028;CUNEIFORM SIGN AL TIMES USH;Lo;0;L;;;;;N;;;;;
+12029;CUNEIFORM SIGN ALAN;Lo;0;L;;;;;N;;;;;
+1202A;CUNEIFORM SIGN ALEPH;Lo;0;L;;;;;N;;;;;
+1202B;CUNEIFORM SIGN AMAR;Lo;0;L;;;;;N;;;;;
+1202C;CUNEIFORM SIGN AMAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+1202D;CUNEIFORM SIGN AN;Lo;0;L;;;;;N;;;;;
+1202E;CUNEIFORM SIGN AN OVER AN;Lo;0;L;;;;;N;;;;;
+1202F;CUNEIFORM SIGN AN THREE TIMES;Lo;0;L;;;;;N;;;;;
+12030;CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA;Lo;0;L;;;;;N;;;;;
+12031;CUNEIFORM SIGN AN PLUS NAGA SQUARED;Lo;0;L;;;;;N;;;;;
+12032;CUNEIFORM SIGN ANSHE;Lo;0;L;;;;;N;;;;;
+12033;CUNEIFORM SIGN APIN;Lo;0;L;;;;;N;;;;;
+12034;CUNEIFORM SIGN ARAD;Lo;0;L;;;;;N;;;;;
+12035;CUNEIFORM SIGN ARAD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12036;CUNEIFORM SIGN ARKAB;Lo;0;L;;;;;N;;;;;
+12037;CUNEIFORM SIGN ASAL2;Lo;0;L;;;;;N;;;;;
+12038;CUNEIFORM SIGN ASH;Lo;0;L;;;;;N;;;;;
+12039;CUNEIFORM SIGN ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+1203A;CUNEIFORM SIGN ASH KABA TENU;Lo;0;L;;;;;N;;;;;
+1203B;CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP;Lo;0;L;;;;;N;;;;;
+1203C;CUNEIFORM SIGN ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203D;CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH;Lo;0;L;;;;;N;;;;;
+1203E;CUNEIFORM SIGN ASH2;Lo;0;L;;;;;N;;;;;
+1203F;CUNEIFORM SIGN ASHGAB;Lo;0;L;;;;;N;;;;;
+12040;CUNEIFORM SIGN BA;Lo;0;L;;;;;N;;;;;
+12041;CUNEIFORM SIGN BAD;Lo;0;L;;;;;N;;;;;
+12042;CUNEIFORM SIGN BAG3;Lo;0;L;;;;;N;;;;;
+12043;CUNEIFORM SIGN BAHAR2;Lo;0;L;;;;;N;;;;;
+12044;CUNEIFORM SIGN BAL;Lo;0;L;;;;;N;;;;;
+12045;CUNEIFORM SIGN BAL OVER BAL;Lo;0;L;;;;;N;;;;;
+12046;CUNEIFORM SIGN BALAG;Lo;0;L;;;;;N;;;;;
+12047;CUNEIFORM SIGN BAR;Lo;0;L;;;;;N;;;;;
+12048;CUNEIFORM SIGN BARA2;Lo;0;L;;;;;N;;;;;
+12049;CUNEIFORM SIGN BI;Lo;0;L;;;;;N;;;;;
+1204A;CUNEIFORM SIGN BI TIMES A;Lo;0;L;;;;;N;;;;;
+1204B;CUNEIFORM SIGN BI TIMES GAR;Lo;0;L;;;;;N;;;;;
+1204C;CUNEIFORM SIGN BI TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1204D;CUNEIFORM SIGN BU;Lo;0;L;;;;;N;;;;;
+1204E;CUNEIFORM SIGN BU OVER BU AB;Lo;0;L;;;;;N;;;;;
+1204F;CUNEIFORM SIGN BU OVER BU UN;Lo;0;L;;;;;N;;;;;
+12050;CUNEIFORM SIGN BU CROSSING BU;Lo;0;L;;;;;N;;;;;
+12051;CUNEIFORM SIGN BULUG;Lo;0;L;;;;;N;;;;;
+12052;CUNEIFORM SIGN BULUG OVER BULUG;Lo;0;L;;;;;N;;;;;
+12053;CUNEIFORM SIGN BUR;Lo;0;L;;;;;N;;;;;
+12054;CUNEIFORM SIGN BUR2;Lo;0;L;;;;;N;;;;;
+12055;CUNEIFORM SIGN DA;Lo;0;L;;;;;N;;;;;
+12056;CUNEIFORM SIGN DAG;Lo;0;L;;;;;N;;;;;
+12057;CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH;Lo;0;L;;;;;N;;;;;
+12058;CUNEIFORM SIGN DAG KISIM5 TIMES AMAR;Lo;0;L;;;;;N;;;;;
+12059;CUNEIFORM SIGN DAG KISIM5 TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1205A;CUNEIFORM SIGN DAG KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+1205B;CUNEIFORM SIGN DAG KISIM5 TIMES GA;Lo;0;L;;;;;N;;;;;
+1205C;CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH;Lo;0;L;;;;;N;;;;;
+1205D;CUNEIFORM SIGN DAG KISIM5 TIMES GI;Lo;0;L;;;;;N;;;;;
+1205E;CUNEIFORM SIGN DAG KISIM5 TIMES GIR2;Lo;0;L;;;;;N;;;;;
+1205F;CUNEIFORM SIGN DAG KISIM5 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12060;CUNEIFORM SIGN DAG KISIM5 TIMES HA;Lo;0;L;;;;;N;;;;;
+12061;CUNEIFORM SIGN DAG KISIM5 TIMES IR;Lo;0;L;;;;;N;;;;;
+12062;CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU;Lo;0;L;;;;;N;;;;;
+12063;CUNEIFORM SIGN DAG KISIM5 TIMES KAK;Lo;0;L;;;;;N;;;;;
+12064;CUNEIFORM SIGN DAG KISIM5 TIMES LA;Lo;0;L;;;;;N;;;;;
+12065;CUNEIFORM SIGN DAG KISIM5 TIMES LU;Lo;0;L;;;;;N;;;;;
+12066;CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2;Lo;0;L;;;;;N;;;;;
+12067;CUNEIFORM SIGN DAG KISIM5 TIMES LUM;Lo;0;L;;;;;N;;;;;
+12068;CUNEIFORM SIGN DAG KISIM5 TIMES NE;Lo;0;L;;;;;N;;;;;
+12069;CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP;Lo;0;L;;;;;N;;;;;
+1206A;CUNEIFORM SIGN DAG KISIM5 TIMES SI;Lo;0;L;;;;;N;;;;;
+1206B;CUNEIFORM SIGN DAG KISIM5 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+1206C;CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2;Lo;0;L;;;;;N;;;;;
+1206D;CUNEIFORM SIGN DAG KISIM5 TIMES USH;Lo;0;L;;;;;N;;;;;
+1206E;CUNEIFORM SIGN DAM;Lo;0;L;;;;;N;;;;;
+1206F;CUNEIFORM SIGN DAR;Lo;0;L;;;;;N;;;;;
+12070;CUNEIFORM SIGN DARA3;Lo;0;L;;;;;N;;;;;
+12071;CUNEIFORM SIGN DARA4;Lo;0;L;;;;;N;;;;;
+12072;CUNEIFORM SIGN DI;Lo;0;L;;;;;N;;;;;
+12073;CUNEIFORM SIGN DIB;Lo;0;L;;;;;N;;;;;
+12074;CUNEIFORM SIGN DIM;Lo;0;L;;;;;N;;;;;
+12075;CUNEIFORM SIGN DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12076;CUNEIFORM SIGN DIM2;Lo;0;L;;;;;N;;;;;
+12077;CUNEIFORM SIGN DIN;Lo;0;L;;;;;N;;;;;
+12078;CUNEIFORM SIGN DIN KASKAL U GUNU DISH;Lo;0;L;;;;;N;;;;;
+12079;CUNEIFORM SIGN DISH;Lo;0;L;;;;;N;;;;;
+1207A;CUNEIFORM SIGN DU;Lo;0;L;;;;;N;;;;;
+1207B;CUNEIFORM SIGN DU OVER DU;Lo;0;L;;;;;N;;;;;
+1207C;CUNEIFORM SIGN DU GUNU;Lo;0;L;;;;;N;;;;;
+1207D;CUNEIFORM SIGN DU SHESHIG;Lo;0;L;;;;;N;;;;;
+1207E;CUNEIFORM SIGN DUB;Lo;0;L;;;;;N;;;;;
+1207F;CUNEIFORM SIGN DUB TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12080;CUNEIFORM SIGN DUB2;Lo;0;L;;;;;N;;;;;
+12081;CUNEIFORM SIGN DUG;Lo;0;L;;;;;N;;;;;
+12082;CUNEIFORM SIGN DUGUD;Lo;0;L;;;;;N;;;;;
+12083;CUNEIFORM SIGN DUH;Lo;0;L;;;;;N;;;;;
+12084;CUNEIFORM SIGN DUN;Lo;0;L;;;;;N;;;;;
+12085;CUNEIFORM SIGN DUN3;Lo;0;L;;;;;N;;;;;
+12086;CUNEIFORM SIGN DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+12087;CUNEIFORM SIGN DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+12088;CUNEIFORM SIGN DUN4;Lo;0;L;;;;;N;;;;;
+12089;CUNEIFORM SIGN DUR2;Lo;0;L;;;;;N;;;;;
+1208A;CUNEIFORM SIGN E;Lo;0;L;;;;;N;;;;;
+1208B;CUNEIFORM SIGN E TIMES PAP;Lo;0;L;;;;;N;;;;;
+1208C;CUNEIFORM SIGN E OVER E NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1208D;CUNEIFORM SIGN E2;Lo;0;L;;;;;N;;;;;
+1208E;CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA;Lo;0;L;;;;;N;;;;;
+1208F;CUNEIFORM SIGN E2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+12090;CUNEIFORM SIGN E2 TIMES MI;Lo;0;L;;;;;N;;;;;
+12091;CUNEIFORM SIGN E2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+12092;CUNEIFORM SIGN E2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+12093;CUNEIFORM SIGN E2 TIMES U;Lo;0;L;;;;;N;;;;;
+12094;CUNEIFORM SIGN EDIN;Lo;0;L;;;;;N;;;;;
+12095;CUNEIFORM SIGN EGIR;Lo;0;L;;;;;N;;;;;
+12096;CUNEIFORM SIGN EL;Lo;0;L;;;;;N;;;;;
+12097;CUNEIFORM SIGN EN;Lo;0;L;;;;;N;;;;;
+12098;CUNEIFORM SIGN EN TIMES GAN2;Lo;0;L;;;;;N;;;;;
+12099;CUNEIFORM SIGN EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1209A;CUNEIFORM SIGN EN TIMES ME;Lo;0;L;;;;;N;;;;;
+1209B;CUNEIFORM SIGN EN CROSSING EN;Lo;0;L;;;;;N;;;;;
+1209C;CUNEIFORM SIGN EN OPPOSING EN;Lo;0;L;;;;;N;;;;;
+1209D;CUNEIFORM SIGN EN SQUARED;Lo;0;L;;;;;N;;;;;
+1209E;CUNEIFORM SIGN EREN;Lo;0;L;;;;;N;;;;;
+1209F;CUNEIFORM SIGN ERIN2;Lo;0;L;;;;;N;;;;;
+120A0;CUNEIFORM SIGN ESH2;Lo;0;L;;;;;N;;;;;
+120A1;CUNEIFORM SIGN EZEN;Lo;0;L;;;;;N;;;;;
+120A2;CUNEIFORM SIGN EZEN TIMES A;Lo;0;L;;;;;N;;;;;
+120A3;CUNEIFORM SIGN EZEN TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+120A4;CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120A5;CUNEIFORM SIGN EZEN TIMES AN;Lo;0;L;;;;;N;;;;;
+120A6;CUNEIFORM SIGN EZEN TIMES BAD;Lo;0;L;;;;;N;;;;;
+120A7;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU;Lo;0;L;;;;;N;;;;;
+120A8;CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU;Lo;0;L;;;;;N;;;;;
+120A9;CUNEIFORM SIGN EZEN TIMES HA;Lo;0;L;;;;;N;;;;;
+120AA;CUNEIFORM SIGN EZEN TIMES HA GUNU;Lo;0;L;;;;;N;;;;;
+120AB;CUNEIFORM SIGN EZEN TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120AC;CUNEIFORM SIGN EZEN TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120AD;CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED;Lo;0;L;;;;;N;;;;;
+120AE;CUNEIFORM SIGN EZEN TIMES KU3;Lo;0;L;;;;;N;;;;;
+120AF;CUNEIFORM SIGN EZEN TIMES LA;Lo;0;L;;;;;N;;;;;
+120B0;CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+120B1;CUNEIFORM SIGN EZEN TIMES LI;Lo;0;L;;;;;N;;;;;
+120B2;CUNEIFORM SIGN EZEN TIMES LU;Lo;0;L;;;;;N;;;;;
+120B3;CUNEIFORM SIGN EZEN TIMES U2;Lo;0;L;;;;;N;;;;;
+120B4;CUNEIFORM SIGN EZEN TIMES UD;Lo;0;L;;;;;N;;;;;
+120B5;CUNEIFORM SIGN GA;Lo;0;L;;;;;N;;;;;
+120B6;CUNEIFORM SIGN GA GUNU;Lo;0;L;;;;;N;;;;;
+120B7;CUNEIFORM SIGN GA2;Lo;0;L;;;;;N;;;;;
+120B8;CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+120B9;CUNEIFORM SIGN GA2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+120BA;CUNEIFORM SIGN GA2 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+120BB;CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB;Lo;0;L;;;;;N;;;;;
+120BC;CUNEIFORM SIGN GA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+120BD;CUNEIFORM SIGN GA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+120BE;CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL;Lo;0;L;;;;;N;;;;;
+120BF;CUNEIFORM SIGN GA2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+120C0;CUNEIFORM SIGN GA2 TIMES BAR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C1;CUNEIFORM SIGN GA2 TIMES BUR;Lo;0;L;;;;;N;;;;;
+120C2;CUNEIFORM SIGN GA2 TIMES BUR PLUS RA;Lo;0;L;;;;;N;;;;;
+120C3;CUNEIFORM SIGN GA2 TIMES DA;Lo;0;L;;;;;N;;;;;
+120C4;CUNEIFORM SIGN GA2 TIMES DI;Lo;0;L;;;;;N;;;;;
+120C5;CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE;Lo;0;L;;;;;N;;;;;
+120C6;CUNEIFORM SIGN GA2 TIMES DUB;Lo;0;L;;;;;N;;;;;
+120C7;CUNEIFORM SIGN GA2 TIMES EL;Lo;0;L;;;;;N;;;;;
+120C8;CUNEIFORM SIGN GA2 TIMES EL PLUS LA;Lo;0;L;;;;;N;;;;;
+120C9;CUNEIFORM SIGN GA2 TIMES EN;Lo;0;L;;;;;N;;;;;
+120CA;CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CB;CUNEIFORM SIGN GA2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120CC;CUNEIFORM SIGN GA2 TIMES GAR;Lo;0;L;;;;;N;;;;;
+120CD;CUNEIFORM SIGN GA2 TIMES GI;Lo;0;L;;;;;N;;;;;
+120CE;CUNEIFORM SIGN GA2 TIMES GI4;Lo;0;L;;;;;N;;;;;
+120CF;CUNEIFORM SIGN GA2 TIMES GI4 PLUS A;Lo;0;L;;;;;N;;;;;
+120D0;CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU;Lo;0;L;;;;;N;;;;;
+120D1;CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2;Lo;0;L;;;;;N;;;;;
+120D2;CUNEIFORM SIGN GA2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+120D3;CUNEIFORM SIGN GA2 TIMES HAL PLUS LA;Lo;0;L;;;;;N;;;;;
+120D4;CUNEIFORM SIGN GA2 TIMES HI PLUS LI;Lo;0;L;;;;;N;;;;;
+120D5;CUNEIFORM SIGN GA2 TIMES HUB2;Lo;0;L;;;;;N;;;;;
+120D6;CUNEIFORM SIGN GA2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+120D7;CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH;Lo;0;L;;;;;N;;;;;
+120D8;CUNEIFORM SIGN GA2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+120D9;CUNEIFORM SIGN GA2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+120DA;CUNEIFORM SIGN GA2 TIMES KID;Lo;0;L;;;;;N;;;;;
+120DB;CUNEIFORM SIGN GA2 TIMES KID PLUS LAL;Lo;0;L;;;;;N;;;;;
+120DC;CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN;Lo;0;L;;;;;N;;;;;
+120DD;CUNEIFORM SIGN GA2 TIMES LA;Lo;0;L;;;;;N;;;;;
+120DE;CUNEIFORM SIGN GA2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+120DF;CUNEIFORM SIGN GA2 TIMES MI;Lo;0;L;;;;;N;;;;;
+120E0;CUNEIFORM SIGN GA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+120E1;CUNEIFORM SIGN GA2 TIMES NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+120E2;CUNEIFORM SIGN GA2 TIMES PA;Lo;0;L;;;;;N;;;;;
+120E3;CUNEIFORM SIGN GA2 TIMES SAL;Lo;0;L;;;;;N;;;;;
+120E4;CUNEIFORM SIGN GA2 TIMES SAR;Lo;0;L;;;;;N;;;;;
+120E5;CUNEIFORM SIGN GA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+120E6;CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR;Lo;0;L;;;;;N;;;;;
+120E7;CUNEIFORM SIGN GA2 TIMES SHID;Lo;0;L;;;;;N;;;;;
+120E8;CUNEIFORM SIGN GA2 TIMES SUM;Lo;0;L;;;;;N;;;;;
+120E9;CUNEIFORM SIGN GA2 TIMES TAK4;Lo;0;L;;;;;N;;;;;
+120EA;CUNEIFORM SIGN GA2 TIMES U;Lo;0;L;;;;;N;;;;;
+120EB;CUNEIFORM SIGN GA2 TIMES UD;Lo;0;L;;;;;N;;;;;
+120EC;CUNEIFORM SIGN GA2 TIMES UD PLUS DU;Lo;0;L;;;;;N;;;;;
+120ED;CUNEIFORM SIGN GA2 OVER GA2;Lo;0;L;;;;;N;;;;;
+120EE;CUNEIFORM SIGN GABA;Lo;0;L;;;;;N;;;;;
+120EF;CUNEIFORM SIGN GABA CROSSING GABA;Lo;0;L;;;;;N;;;;;
+120F0;CUNEIFORM SIGN GAD;Lo;0;L;;;;;N;;;;;
+120F1;CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F2;CUNEIFORM SIGN GAL;Lo;0;L;;;;;N;;;;;
+120F3;CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+120F4;CUNEIFORM SIGN GALAM;Lo;0;L;;;;;N;;;;;
+120F5;CUNEIFORM SIGN GAM;Lo;0;L;;;;;N;;;;;
+120F6;CUNEIFORM SIGN GAN;Lo;0;L;;;;;N;;;;;
+120F7;CUNEIFORM SIGN GAN2;Lo;0;L;;;;;N;;;;;
+120F8;CUNEIFORM SIGN GAN2 TENU;Lo;0;L;;;;;N;;;;;
+120F9;CUNEIFORM SIGN GAN2 OVER GAN2;Lo;0;L;;;;;N;;;;;
+120FA;CUNEIFORM SIGN GAN2 CROSSING GAN2;Lo;0;L;;;;;N;;;;;
+120FB;CUNEIFORM SIGN GAR;Lo;0;L;;;;;N;;;;;
+120FC;CUNEIFORM SIGN GAR3;Lo;0;L;;;;;N;;;;;
+120FD;CUNEIFORM SIGN GASHAN;Lo;0;L;;;;;N;;;;;
+120FE;CUNEIFORM SIGN GESHTIN;Lo;0;L;;;;;N;;;;;
+120FF;CUNEIFORM SIGN GESHTIN TIMES KUR;Lo;0;L;;;;;N;;;;;
+12100;CUNEIFORM SIGN GI;Lo;0;L;;;;;N;;;;;
+12101;CUNEIFORM SIGN GI TIMES E;Lo;0;L;;;;;N;;;;;
+12102;CUNEIFORM SIGN GI TIMES U;Lo;0;L;;;;;N;;;;;
+12103;CUNEIFORM SIGN GI CROSSING GI;Lo;0;L;;;;;N;;;;;
+12104;CUNEIFORM SIGN GI4;Lo;0;L;;;;;N;;;;;
+12105;CUNEIFORM SIGN GI4 OVER GI4;Lo;0;L;;;;;N;;;;;
+12106;CUNEIFORM SIGN GI4 CROSSING GI4;Lo;0;L;;;;;N;;;;;
+12107;CUNEIFORM SIGN GIDIM;Lo;0;L;;;;;N;;;;;
+12108;CUNEIFORM SIGN GIR2;Lo;0;L;;;;;N;;;;;
+12109;CUNEIFORM SIGN GIR2 GUNU;Lo;0;L;;;;;N;;;;;
+1210A;CUNEIFORM SIGN GIR3;Lo;0;L;;;;;N;;;;;
+1210B;CUNEIFORM SIGN GIR3 TIMES A PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210C;CUNEIFORM SIGN GIR3 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1210D;CUNEIFORM SIGN GIR3 TIMES IGI;Lo;0;L;;;;;N;;;;;
+1210E;CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI;Lo;0;L;;;;;N;;;;;
+1210F;CUNEIFORM SIGN GIR3 TIMES PA;Lo;0;L;;;;;N;;;;;
+12110;CUNEIFORM SIGN GISAL;Lo;0;L;;;;;N;;;;;
+12111;CUNEIFORM SIGN GISH;Lo;0;L;;;;;N;;;;;
+12112;CUNEIFORM SIGN GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+12113;CUNEIFORM SIGN GISH TIMES BAD;Lo;0;L;;;;;N;;;;;
+12114;CUNEIFORM SIGN GISH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12115;CUNEIFORM SIGN GISH TENU;Lo;0;L;;;;;N;;;;;
+12116;CUNEIFORM SIGN GU;Lo;0;L;;;;;N;;;;;
+12117;CUNEIFORM SIGN GU CROSSING GU;Lo;0;L;;;;;N;;;;;
+12118;CUNEIFORM SIGN GU2;Lo;0;L;;;;;N;;;;;
+12119;CUNEIFORM SIGN GU2 TIMES KAK;Lo;0;L;;;;;N;;;;;
+1211A;CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+1211B;CUNEIFORM SIGN GU2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1211C;CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2;Lo;0;L;;;;;N;;;;;
+1211D;CUNEIFORM SIGN GU2 GUNU;Lo;0;L;;;;;N;;;;;
+1211E;CUNEIFORM SIGN GUD;Lo;0;L;;;;;N;;;;;
+1211F;CUNEIFORM SIGN GUD TIMES A PLUS KUR;Lo;0;L;;;;;N;;;;;
+12120;CUNEIFORM SIGN GUD TIMES KUR;Lo;0;L;;;;;N;;;;;
+12121;CUNEIFORM SIGN GUD OVER GUD LUGAL;Lo;0;L;;;;;N;;;;;
+12122;CUNEIFORM SIGN GUL;Lo;0;L;;;;;N;;;;;
+12123;CUNEIFORM SIGN GUM;Lo;0;L;;;;;N;;;;;
+12124;CUNEIFORM SIGN GUM TIMES SHE;Lo;0;L;;;;;N;;;;;
+12125;CUNEIFORM SIGN GUR;Lo;0;L;;;;;N;;;;;
+12126;CUNEIFORM SIGN GUR7;Lo;0;L;;;;;N;;;;;
+12127;CUNEIFORM SIGN GURUN;Lo;0;L;;;;;N;;;;;
+12128;CUNEIFORM SIGN GURUSH;Lo;0;L;;;;;N;;;;;
+12129;CUNEIFORM SIGN HA;Lo;0;L;;;;;N;;;;;
+1212A;CUNEIFORM SIGN HA TENU;Lo;0;L;;;;;N;;;;;
+1212B;CUNEIFORM SIGN HA GUNU;Lo;0;L;;;;;N;;;;;
+1212C;CUNEIFORM SIGN HAL;Lo;0;L;;;;;N;;;;;
+1212D;CUNEIFORM SIGN HI;Lo;0;L;;;;;N;;;;;
+1212E;CUNEIFORM SIGN HI TIMES ASH;Lo;0;L;;;;;N;;;;;
+1212F;CUNEIFORM SIGN HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+12130;CUNEIFORM SIGN HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12131;CUNEIFORM SIGN HI TIMES DISH;Lo;0;L;;;;;N;;;;;
+12132;CUNEIFORM SIGN HI TIMES GAD;Lo;0;L;;;;;N;;;;;
+12133;CUNEIFORM SIGN HI TIMES KIN;Lo;0;L;;;;;N;;;;;
+12134;CUNEIFORM SIGN HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+12135;CUNEIFORM SIGN HI TIMES SHE;Lo;0;L;;;;;N;;;;;
+12136;CUNEIFORM SIGN HI TIMES U;Lo;0;L;;;;;N;;;;;
+12137;CUNEIFORM SIGN HU;Lo;0;L;;;;;N;;;;;
+12138;CUNEIFORM SIGN HUB2;Lo;0;L;;;;;N;;;;;
+12139;CUNEIFORM SIGN HUB2 TIMES AN;Lo;0;L;;;;;N;;;;;
+1213A;CUNEIFORM SIGN HUB2 TIMES HAL;Lo;0;L;;;;;N;;;;;
+1213B;CUNEIFORM SIGN HUB2 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1213C;CUNEIFORM SIGN HUB2 TIMES LISH;Lo;0;L;;;;;N;;;;;
+1213D;CUNEIFORM SIGN HUB2 TIMES UD;Lo;0;L;;;;;N;;;;;
+1213E;CUNEIFORM SIGN HUL2;Lo;0;L;;;;;N;;;;;
+1213F;CUNEIFORM SIGN I;Lo;0;L;;;;;N;;;;;
+12140;CUNEIFORM SIGN I A;Lo;0;L;;;;;N;;;;;
+12141;CUNEIFORM SIGN IB;Lo;0;L;;;;;N;;;;;
+12142;CUNEIFORM SIGN IDIM;Lo;0;L;;;;;N;;;;;
+12143;CUNEIFORM SIGN IDIM OVER IDIM BUR;Lo;0;L;;;;;N;;;;;
+12144;CUNEIFORM SIGN IDIM OVER IDIM SQUARED;Lo;0;L;;;;;N;;;;;
+12145;CUNEIFORM SIGN IG;Lo;0;L;;;;;N;;;;;
+12146;CUNEIFORM SIGN IGI;Lo;0;L;;;;;N;;;;;
+12147;CUNEIFORM SIGN IGI DIB;Lo;0;L;;;;;N;;;;;
+12148;CUNEIFORM SIGN IGI RI;Lo;0;L;;;;;N;;;;;
+12149;CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD;Lo;0;L;;;;;N;;;;;
+1214A;CUNEIFORM SIGN IGI GUNU;Lo;0;L;;;;;N;;;;;
+1214B;CUNEIFORM SIGN IL;Lo;0;L;;;;;N;;;;;
+1214C;CUNEIFORM SIGN IL TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1214D;CUNEIFORM SIGN IL2;Lo;0;L;;;;;N;;;;;
+1214E;CUNEIFORM SIGN IM;Lo;0;L;;;;;N;;;;;
+1214F;CUNEIFORM SIGN IM TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12150;CUNEIFORM SIGN IM CROSSING IM;Lo;0;L;;;;;N;;;;;
+12151;CUNEIFORM SIGN IM OPPOSING IM;Lo;0;L;;;;;N;;;;;
+12152;CUNEIFORM SIGN IM SQUARED;Lo;0;L;;;;;N;;;;;
+12153;CUNEIFORM SIGN IMIN;Lo;0;L;;;;;N;;;;;
+12154;CUNEIFORM SIGN IN;Lo;0;L;;;;;N;;;;;
+12155;CUNEIFORM SIGN IR;Lo;0;L;;;;;N;;;;;
+12156;CUNEIFORM SIGN ISH;Lo;0;L;;;;;N;;;;;
+12157;CUNEIFORM SIGN KA;Lo;0;L;;;;;N;;;;;
+12158;CUNEIFORM SIGN KA TIMES A;Lo;0;L;;;;;N;;;;;
+12159;CUNEIFORM SIGN KA TIMES AD;Lo;0;L;;;;;N;;;;;
+1215A;CUNEIFORM SIGN KA TIMES AD PLUS KU3;Lo;0;L;;;;;N;;;;;
+1215B;CUNEIFORM SIGN KA TIMES ASH2;Lo;0;L;;;;;N;;;;;
+1215C;CUNEIFORM SIGN KA TIMES BAD;Lo;0;L;;;;;N;;;;;
+1215D;CUNEIFORM SIGN KA TIMES BALAG;Lo;0;L;;;;;N;;;;;
+1215E;CUNEIFORM SIGN KA TIMES BAR;Lo;0;L;;;;;N;;;;;
+1215F;CUNEIFORM SIGN KA TIMES BI;Lo;0;L;;;;;N;;;;;
+12160;CUNEIFORM SIGN KA TIMES ERIN2;Lo;0;L;;;;;N;;;;;
+12161;CUNEIFORM SIGN KA TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12162;CUNEIFORM SIGN KA TIMES GA;Lo;0;L;;;;;N;;;;;
+12163;CUNEIFORM SIGN KA TIMES GAL;Lo;0;L;;;;;N;;;;;
+12164;CUNEIFORM SIGN KA TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12165;CUNEIFORM SIGN KA TIMES GAR;Lo;0;L;;;;;N;;;;;
+12166;CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A;Lo;0;L;;;;;N;;;;;
+12167;CUNEIFORM SIGN KA TIMES GI;Lo;0;L;;;;;N;;;;;
+12168;CUNEIFORM SIGN KA TIMES GIR2;Lo;0;L;;;;;N;;;;;
+12169;CUNEIFORM SIGN KA TIMES GISH PLUS SAR;Lo;0;L;;;;;N;;;;;
+1216A;CUNEIFORM SIGN KA TIMES GISH CROSSING GISH;Lo;0;L;;;;;N;;;;;
+1216B;CUNEIFORM SIGN KA TIMES GU;Lo;0;L;;;;;N;;;;;
+1216C;CUNEIFORM SIGN KA TIMES GUR7;Lo;0;L;;;;;N;;;;;
+1216D;CUNEIFORM SIGN KA TIMES IGI;Lo;0;L;;;;;N;;;;;
+1216E;CUNEIFORM SIGN KA TIMES IM;Lo;0;L;;;;;N;;;;;
+1216F;CUNEIFORM SIGN KA TIMES KAK;Lo;0;L;;;;;N;;;;;
+12170;CUNEIFORM SIGN KA TIMES KI;Lo;0;L;;;;;N;;;;;
+12171;CUNEIFORM SIGN KA TIMES KID;Lo;0;L;;;;;N;;;;;
+12172;CUNEIFORM SIGN KA TIMES LI;Lo;0;L;;;;;N;;;;;
+12173;CUNEIFORM SIGN KA TIMES LU;Lo;0;L;;;;;N;;;;;
+12174;CUNEIFORM SIGN KA TIMES ME;Lo;0;L;;;;;N;;;;;
+12175;CUNEIFORM SIGN KA TIMES ME PLUS DU;Lo;0;L;;;;;N;;;;;
+12176;CUNEIFORM SIGN KA TIMES ME PLUS GI;Lo;0;L;;;;;N;;;;;
+12177;CUNEIFORM SIGN KA TIMES ME PLUS TE;Lo;0;L;;;;;N;;;;;
+12178;CUNEIFORM SIGN KA TIMES MI;Lo;0;L;;;;;N;;;;;
+12179;CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ;Lo;0;L;;;;;N;;;;;
+1217A;CUNEIFORM SIGN KA TIMES NE;Lo;0;L;;;;;N;;;;;
+1217B;CUNEIFORM SIGN KA TIMES NUN;Lo;0;L;;;;;N;;;;;
+1217C;CUNEIFORM SIGN KA TIMES PI;Lo;0;L;;;;;N;;;;;
+1217D;CUNEIFORM SIGN KA TIMES RU;Lo;0;L;;;;;N;;;;;
+1217E;CUNEIFORM SIGN KA TIMES SA;Lo;0;L;;;;;N;;;;;
+1217F;CUNEIFORM SIGN KA TIMES SAR;Lo;0;L;;;;;N;;;;;
+12180;CUNEIFORM SIGN KA TIMES SHA;Lo;0;L;;;;;N;;;;;
+12181;CUNEIFORM SIGN KA TIMES SHE;Lo;0;L;;;;;N;;;;;
+12182;CUNEIFORM SIGN KA TIMES SHID;Lo;0;L;;;;;N;;;;;
+12183;CUNEIFORM SIGN KA TIMES SHU;Lo;0;L;;;;;N;;;;;
+12184;CUNEIFORM SIGN KA TIMES SIG;Lo;0;L;;;;;N;;;;;
+12185;CUNEIFORM SIGN KA TIMES SUHUR;Lo;0;L;;;;;N;;;;;
+12186;CUNEIFORM SIGN KA TIMES TAR;Lo;0;L;;;;;N;;;;;
+12187;CUNEIFORM SIGN KA TIMES U;Lo;0;L;;;;;N;;;;;
+12188;CUNEIFORM SIGN KA TIMES U2;Lo;0;L;;;;;N;;;;;
+12189;CUNEIFORM SIGN KA TIMES UD;Lo;0;L;;;;;N;;;;;
+1218A;CUNEIFORM SIGN KA TIMES UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+1218B;CUNEIFORM SIGN KA TIMES USH;Lo;0;L;;;;;N;;;;;
+1218C;CUNEIFORM SIGN KA TIMES ZI;Lo;0;L;;;;;N;;;;;
+1218D;CUNEIFORM SIGN KA2;Lo;0;L;;;;;N;;;;;
+1218E;CUNEIFORM SIGN KA2 CROSSING KA2;Lo;0;L;;;;;N;;;;;
+1218F;CUNEIFORM SIGN KAB;Lo;0;L;;;;;N;;;;;
+12190;CUNEIFORM SIGN KAD2;Lo;0;L;;;;;N;;;;;
+12191;CUNEIFORM SIGN KAD3;Lo;0;L;;;;;N;;;;;
+12192;CUNEIFORM SIGN KAD4;Lo;0;L;;;;;N;;;;;
+12193;CUNEIFORM SIGN KAD5;Lo;0;L;;;;;N;;;;;
+12194;CUNEIFORM SIGN KAD5 OVER KAD5;Lo;0;L;;;;;N;;;;;
+12195;CUNEIFORM SIGN KAK;Lo;0;L;;;;;N;;;;;
+12196;CUNEIFORM SIGN KAK TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12197;CUNEIFORM SIGN KAL;Lo;0;L;;;;;N;;;;;
+12198;CUNEIFORM SIGN KAL TIMES BAD;Lo;0;L;;;;;N;;;;;
+12199;CUNEIFORM SIGN KAL CROSSING KAL;Lo;0;L;;;;;N;;;;;
+1219A;CUNEIFORM SIGN KAM2;Lo;0;L;;;;;N;;;;;
+1219B;CUNEIFORM SIGN KAM4;Lo;0;L;;;;;N;;;;;
+1219C;CUNEIFORM SIGN KASKAL;Lo;0;L;;;;;N;;;;;
+1219D;CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219E;CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+1219F;CUNEIFORM SIGN KESH2;Lo;0;L;;;;;N;;;;;
+121A0;CUNEIFORM SIGN KI;Lo;0;L;;;;;N;;;;;
+121A1;CUNEIFORM SIGN KI TIMES BAD;Lo;0;L;;;;;N;;;;;
+121A2;CUNEIFORM SIGN KI TIMES U;Lo;0;L;;;;;N;;;;;
+121A3;CUNEIFORM SIGN KI TIMES UD;Lo;0;L;;;;;N;;;;;
+121A4;CUNEIFORM SIGN KID;Lo;0;L;;;;;N;;;;;
+121A5;CUNEIFORM SIGN KIN;Lo;0;L;;;;;N;;;;;
+121A6;CUNEIFORM SIGN KISAL;Lo;0;L;;;;;N;;;;;
+121A7;CUNEIFORM SIGN KISH;Lo;0;L;;;;;N;;;;;
+121A8;CUNEIFORM SIGN KISIM5;Lo;0;L;;;;;N;;;;;
+121A9;CUNEIFORM SIGN KISIM5 OVER KISIM5;Lo;0;L;;;;;N;;;;;
+121AA;CUNEIFORM SIGN KU;Lo;0;L;;;;;N;;;;;
+121AB;CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2;Lo;0;L;;;;;N;;;;;
+121AC;CUNEIFORM SIGN KU3;Lo;0;L;;;;;N;;;;;
+121AD;CUNEIFORM SIGN KU4;Lo;0;L;;;;;N;;;;;
+121AE;CUNEIFORM SIGN KU4 VARIANT FORM;Lo;0;L;;;;;N;;;;;
+121AF;CUNEIFORM SIGN KU7;Lo;0;L;;;;;N;;;;;
+121B0;CUNEIFORM SIGN KUL;Lo;0;L;;;;;N;;;;;
+121B1;CUNEIFORM SIGN KUL GUNU;Lo;0;L;;;;;N;;;;;
+121B2;CUNEIFORM SIGN KUN;Lo;0;L;;;;;N;;;;;
+121B3;CUNEIFORM SIGN KUR;Lo;0;L;;;;;N;;;;;
+121B4;CUNEIFORM SIGN KUR OPPOSING KUR;Lo;0;L;;;;;N;;;;;
+121B5;CUNEIFORM SIGN KUSHU2;Lo;0;L;;;;;N;;;;;
+121B6;CUNEIFORM SIGN KWU318;Lo;0;L;;;;;N;;;;;
+121B7;CUNEIFORM SIGN LA;Lo;0;L;;;;;N;;;;;
+121B8;CUNEIFORM SIGN LAGAB;Lo;0;L;;;;;N;;;;;
+121B9;CUNEIFORM SIGN LAGAB TIMES A;Lo;0;L;;;;;N;;;;;
+121BA;CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA;Lo;0;L;;;;;N;;;;;
+121BB;CUNEIFORM SIGN LAGAB TIMES A PLUS GAR;Lo;0;L;;;;;N;;;;;
+121BC;CUNEIFORM SIGN LAGAB TIMES A PLUS LAL;Lo;0;L;;;;;N;;;;;
+121BD;CUNEIFORM SIGN LAGAB TIMES AL;Lo;0;L;;;;;N;;;;;
+121BE;CUNEIFORM SIGN LAGAB TIMES AN;Lo;0;L;;;;;N;;;;;
+121BF;CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU;Lo;0;L;;;;;N;;;;;
+121C0;CUNEIFORM SIGN LAGAB TIMES BAD;Lo;0;L;;;;;N;;;;;
+121C1;CUNEIFORM SIGN LAGAB TIMES BI;Lo;0;L;;;;;N;;;;;
+121C2;CUNEIFORM SIGN LAGAB TIMES DAR;Lo;0;L;;;;;N;;;;;
+121C3;CUNEIFORM SIGN LAGAB TIMES EN;Lo;0;L;;;;;N;;;;;
+121C4;CUNEIFORM SIGN LAGAB TIMES GA;Lo;0;L;;;;;N;;;;;
+121C5;CUNEIFORM SIGN LAGAB TIMES GAR;Lo;0;L;;;;;N;;;;;
+121C6;CUNEIFORM SIGN LAGAB TIMES GUD;Lo;0;L;;;;;N;;;;;
+121C7;CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD;Lo;0;L;;;;;N;;;;;
+121C8;CUNEIFORM SIGN LAGAB TIMES HA;Lo;0;L;;;;;N;;;;;
+121C9;CUNEIFORM SIGN LAGAB TIMES HAL;Lo;0;L;;;;;N;;;;;
+121CA;CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN;Lo;0;L;;;;;N;;;;;
+121CB;CUNEIFORM SIGN LAGAB TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+121CC;CUNEIFORM SIGN LAGAB TIMES IM;Lo;0;L;;;;;N;;;;;
+121CD;CUNEIFORM SIGN LAGAB TIMES IM PLUS HA;Lo;0;L;;;;;N;;;;;
+121CE;CUNEIFORM SIGN LAGAB TIMES IM PLUS LU;Lo;0;L;;;;;N;;;;;
+121CF;CUNEIFORM SIGN LAGAB TIMES KI;Lo;0;L;;;;;N;;;;;
+121D0;CUNEIFORM SIGN LAGAB TIMES KIN;Lo;0;L;;;;;N;;;;;
+121D1;CUNEIFORM SIGN LAGAB TIMES KU3;Lo;0;L;;;;;N;;;;;
+121D2;CUNEIFORM SIGN LAGAB TIMES KUL;Lo;0;L;;;;;N;;;;;
+121D3;CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A;Lo;0;L;;;;;N;;;;;
+121D4;CUNEIFORM SIGN LAGAB TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+121D5;CUNEIFORM SIGN LAGAB TIMES LISH;Lo;0;L;;;;;N;;;;;
+121D6;CUNEIFORM SIGN LAGAB TIMES LU;Lo;0;L;;;;;N;;;;;
+121D7;CUNEIFORM SIGN LAGAB TIMES LUL;Lo;0;L;;;;;N;;;;;
+121D8;CUNEIFORM SIGN LAGAB TIMES ME;Lo;0;L;;;;;N;;;;;
+121D9;CUNEIFORM SIGN LAGAB TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+121DA;CUNEIFORM SIGN LAGAB TIMES MUSH;Lo;0;L;;;;;N;;;;;
+121DB;CUNEIFORM SIGN LAGAB TIMES NE;Lo;0;L;;;;;N;;;;;
+121DC;CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121DD;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2;Lo;0;L;;;;;N;;;;;
+121DE;CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU;Lo;0;L;;;;;N;;;;;
+121DF;CUNEIFORM SIGN LAGAB TIMES SHU2;Lo;0;L;;;;;N;;;;;
+121E0;CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2;Lo;0;L;;;;;N;;;;;
+121E1;CUNEIFORM SIGN LAGAB TIMES SUM;Lo;0;L;;;;;N;;;;;
+121E2;CUNEIFORM SIGN LAGAB TIMES TAG;Lo;0;L;;;;;N;;;;;
+121E3;CUNEIFORM SIGN LAGAB TIMES TAK4;Lo;0;L;;;;;N;;;;;
+121E4;CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA;Lo;0;L;;;;;N;;;;;
+121E5;CUNEIFORM SIGN LAGAB TIMES U;Lo;0;L;;;;;N;;;;;
+121E6;CUNEIFORM SIGN LAGAB TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+121E7;CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+121E8;CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+121E9;CUNEIFORM SIGN LAGAB TIMES UD;Lo;0;L;;;;;N;;;;;
+121EA;CUNEIFORM SIGN LAGAB TIMES USH;Lo;0;L;;;;;N;;;;;
+121EB;CUNEIFORM SIGN LAGAB SQUARED;Lo;0;L;;;;;N;;;;;
+121EC;CUNEIFORM SIGN LAGAR;Lo;0;L;;;;;N;;;;;
+121ED;CUNEIFORM SIGN LAGAR TIMES SHE;Lo;0;L;;;;;N;;;;;
+121EE;CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM;Lo;0;L;;;;;N;;;;;
+121EF;CUNEIFORM SIGN LAGAR GUNU;Lo;0;L;;;;;N;;;;;
+121F0;CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE;Lo;0;L;;;;;N;;;;;
+121F1;CUNEIFORM SIGN LAHSHU;Lo;0;L;;;;;N;;;;;
+121F2;CUNEIFORM SIGN LAL;Lo;0;L;;;;;N;;;;;
+121F3;CUNEIFORM SIGN LAL TIMES LAL;Lo;0;L;;;;;N;;;;;
+121F4;CUNEIFORM SIGN LAM;Lo;0;L;;;;;N;;;;;
+121F5;CUNEIFORM SIGN LAM TIMES KUR;Lo;0;L;;;;;N;;;;;
+121F6;CUNEIFORM SIGN LAM TIMES KUR PLUS RU;Lo;0;L;;;;;N;;;;;
+121F7;CUNEIFORM SIGN LI;Lo;0;L;;;;;N;;;;;
+121F8;CUNEIFORM SIGN LIL;Lo;0;L;;;;;N;;;;;
+121F9;CUNEIFORM SIGN LIMMU2;Lo;0;L;;;;;N;;;;;
+121FA;CUNEIFORM SIGN LISH;Lo;0;L;;;;;N;;;;;
+121FB;CUNEIFORM SIGN LU;Lo;0;L;;;;;N;;;;;
+121FC;CUNEIFORM SIGN LU TIMES BAD;Lo;0;L;;;;;N;;;;;
+121FD;CUNEIFORM SIGN LU2;Lo;0;L;;;;;N;;;;;
+121FE;CUNEIFORM SIGN LU2 TIMES AL;Lo;0;L;;;;;N;;;;;
+121FF;CUNEIFORM SIGN LU2 TIMES BAD;Lo;0;L;;;;;N;;;;;
+12200;CUNEIFORM SIGN LU2 TIMES ESH2;Lo;0;L;;;;;N;;;;;
+12201;CUNEIFORM SIGN LU2 TIMES ESH2 TENU;Lo;0;L;;;;;N;;;;;
+12202;CUNEIFORM SIGN LU2 TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12203;CUNEIFORM SIGN LU2 TIMES HI TIMES BAD;Lo;0;L;;;;;N;;;;;
+12204;CUNEIFORM SIGN LU2 TIMES IM;Lo;0;L;;;;;N;;;;;
+12205;CUNEIFORM SIGN LU2 TIMES KAD2;Lo;0;L;;;;;N;;;;;
+12206;CUNEIFORM SIGN LU2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12207;CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12208;CUNEIFORM SIGN LU2 TIMES KI;Lo;0;L;;;;;N;;;;;
+12209;CUNEIFORM SIGN LU2 TIMES LA PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220A;CUNEIFORM SIGN LU2 TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1220B;CUNEIFORM SIGN LU2 TIMES ME PLUS EN;Lo;0;L;;;;;N;;;;;
+1220C;CUNEIFORM SIGN LU2 TIMES NE;Lo;0;L;;;;;N;;;;;
+1220D;CUNEIFORM SIGN LU2 TIMES NU;Lo;0;L;;;;;N;;;;;
+1220E;CUNEIFORM SIGN LU2 TIMES SI PLUS ASH;Lo;0;L;;;;;N;;;;;
+1220F;CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU;Lo;0;L;;;;;N;;;;;
+12210;CUNEIFORM SIGN LU2 TIMES TUG2;Lo;0;L;;;;;N;;;;;
+12211;CUNEIFORM SIGN LU2 TENU;Lo;0;L;;;;;N;;;;;
+12212;CUNEIFORM SIGN LU2 CROSSING LU2;Lo;0;L;;;;;N;;;;;
+12213;CUNEIFORM SIGN LU2 OPPOSING LU2;Lo;0;L;;;;;N;;;;;
+12214;CUNEIFORM SIGN LU2 SQUARED;Lo;0;L;;;;;N;;;;;
+12215;CUNEIFORM SIGN LU2 SHESHIG;Lo;0;L;;;;;N;;;;;
+12216;CUNEIFORM SIGN LU3;Lo;0;L;;;;;N;;;;;
+12217;CUNEIFORM SIGN LUGAL;Lo;0;L;;;;;N;;;;;
+12218;CUNEIFORM SIGN LUGAL OVER LUGAL;Lo;0;L;;;;;N;;;;;
+12219;CUNEIFORM SIGN LUGAL OPPOSING LUGAL;Lo;0;L;;;;;N;;;;;
+1221A;CUNEIFORM SIGN LUGAL SHESHIG;Lo;0;L;;;;;N;;;;;
+1221B;CUNEIFORM SIGN LUH;Lo;0;L;;;;;N;;;;;
+1221C;CUNEIFORM SIGN LUL;Lo;0;L;;;;;N;;;;;
+1221D;CUNEIFORM SIGN LUM;Lo;0;L;;;;;N;;;;;
+1221E;CUNEIFORM SIGN LUM OVER LUM;Lo;0;L;;;;;N;;;;;
+1221F;CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12220;CUNEIFORM SIGN MA;Lo;0;L;;;;;N;;;;;
+12221;CUNEIFORM SIGN MA TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12222;CUNEIFORM SIGN MA GUNU;Lo;0;L;;;;;N;;;;;
+12223;CUNEIFORM SIGN MA2;Lo;0;L;;;;;N;;;;;
+12224;CUNEIFORM SIGN MAH;Lo;0;L;;;;;N;;;;;
+12225;CUNEIFORM SIGN MAR;Lo;0;L;;;;;N;;;;;
+12226;CUNEIFORM SIGN MASH;Lo;0;L;;;;;N;;;;;
+12227;CUNEIFORM SIGN MASH2;Lo;0;L;;;;;N;;;;;
+12228;CUNEIFORM SIGN ME;Lo;0;L;;;;;N;;;;;
+12229;CUNEIFORM SIGN MES;Lo;0;L;;;;;N;;;;;
+1222A;CUNEIFORM SIGN MI;Lo;0;L;;;;;N;;;;;
+1222B;CUNEIFORM SIGN MIN;Lo;0;L;;;;;N;;;;;
+1222C;CUNEIFORM SIGN MU;Lo;0;L;;;;;N;;;;;
+1222D;CUNEIFORM SIGN MU OVER MU;Lo;0;L;;;;;N;;;;;
+1222E;CUNEIFORM SIGN MUG;Lo;0;L;;;;;N;;;;;
+1222F;CUNEIFORM SIGN MUG GUNU;Lo;0;L;;;;;N;;;;;
+12230;CUNEIFORM SIGN MUNSUB;Lo;0;L;;;;;N;;;;;
+12231;CUNEIFORM SIGN MURGU2;Lo;0;L;;;;;N;;;;;
+12232;CUNEIFORM SIGN MUSH;Lo;0;L;;;;;N;;;;;
+12233;CUNEIFORM SIGN MUSH TIMES A;Lo;0;L;;;;;N;;;;;
+12234;CUNEIFORM SIGN MUSH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12235;CUNEIFORM SIGN MUSH TIMES ZA;Lo;0;L;;;;;N;;;;;
+12236;CUNEIFORM SIGN MUSH OVER MUSH;Lo;0;L;;;;;N;;;;;
+12237;CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+12238;CUNEIFORM SIGN MUSH CROSSING MUSH;Lo;0;L;;;;;N;;;;;
+12239;CUNEIFORM SIGN MUSH3;Lo;0;L;;;;;N;;;;;
+1223A;CUNEIFORM SIGN MUSH3 TIMES A;Lo;0;L;;;;;N;;;;;
+1223B;CUNEIFORM SIGN MUSH3 TIMES A PLUS DI;Lo;0;L;;;;;N;;;;;
+1223C;CUNEIFORM SIGN MUSH3 TIMES DI;Lo;0;L;;;;;N;;;;;
+1223D;CUNEIFORM SIGN MUSH3 GUNU;Lo;0;L;;;;;N;;;;;
+1223E;CUNEIFORM SIGN NA;Lo;0;L;;;;;N;;;;;
+1223F;CUNEIFORM SIGN NA2;Lo;0;L;;;;;N;;;;;
+12240;CUNEIFORM SIGN NAGA;Lo;0;L;;;;;N;;;;;
+12241;CUNEIFORM SIGN NAGA INVERTED;Lo;0;L;;;;;N;;;;;
+12242;CUNEIFORM SIGN NAGA TIMES SHU TENU;Lo;0;L;;;;;N;;;;;
+12243;CUNEIFORM SIGN NAGA OPPOSING NAGA;Lo;0;L;;;;;N;;;;;
+12244;CUNEIFORM SIGN NAGAR;Lo;0;L;;;;;N;;;;;
+12245;CUNEIFORM SIGN NAM NUTILLU;Lo;0;L;;;;;N;;;;;
+12246;CUNEIFORM SIGN NAM;Lo;0;L;;;;;N;;;;;
+12247;CUNEIFORM SIGN NAM2;Lo;0;L;;;;;N;;;;;
+12248;CUNEIFORM SIGN NE;Lo;0;L;;;;;N;;;;;
+12249;CUNEIFORM SIGN NE TIMES A;Lo;0;L;;;;;N;;;;;
+1224A;CUNEIFORM SIGN NE TIMES UD;Lo;0;L;;;;;N;;;;;
+1224B;CUNEIFORM SIGN NE SHESHIG;Lo;0;L;;;;;N;;;;;
+1224C;CUNEIFORM SIGN NI;Lo;0;L;;;;;N;;;;;
+1224D;CUNEIFORM SIGN NI TIMES E;Lo;0;L;;;;;N;;;;;
+1224E;CUNEIFORM SIGN NI2;Lo;0;L;;;;;N;;;;;
+1224F;CUNEIFORM SIGN NIM;Lo;0;L;;;;;N;;;;;
+12250;CUNEIFORM SIGN NIM TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12251;CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12252;CUNEIFORM SIGN NINDA2;Lo;0;L;;;;;N;;;;;
+12253;CUNEIFORM SIGN NINDA2 TIMES AN;Lo;0;L;;;;;N;;;;;
+12254;CUNEIFORM SIGN NINDA2 TIMES ASH;Lo;0;L;;;;;N;;;;;
+12255;CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+12256;CUNEIFORM SIGN NINDA2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12257;CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU;Lo;0;L;;;;;N;;;;;
+12258;CUNEIFORM SIGN NINDA2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12259;CUNEIFORM SIGN NINDA2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+1225A;CUNEIFORM SIGN NINDA2 TIMES SHE;Lo;0;L;;;;;N;;;;;
+1225B;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN;Lo;0;L;;;;;N;;;;;
+1225C;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225D;CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225E;CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+1225F;CUNEIFORM SIGN NINDA2 TIMES USH;Lo;0;L;;;;;N;;;;;
+12260;CUNEIFORM SIGN NISAG;Lo;0;L;;;;;N;;;;;
+12261;CUNEIFORM SIGN NU;Lo;0;L;;;;;N;;;;;
+12262;CUNEIFORM SIGN NU11;Lo;0;L;;;;;N;;;;;
+12263;CUNEIFORM SIGN NUN;Lo;0;L;;;;;N;;;;;
+12264;CUNEIFORM SIGN NUN LAGAR TIMES GAR;Lo;0;L;;;;;N;;;;;
+12265;CUNEIFORM SIGN NUN LAGAR TIMES MASH;Lo;0;L;;;;;N;;;;;
+12266;CUNEIFORM SIGN NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12267;CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL;Lo;0;L;;;;;N;;;;;
+12268;CUNEIFORM SIGN NUN LAGAR TIMES USH;Lo;0;L;;;;;N;;;;;
+12269;CUNEIFORM SIGN NUN TENU;Lo;0;L;;;;;N;;;;;
+1226A;CUNEIFORM SIGN NUN OVER NUN;Lo;0;L;;;;;N;;;;;
+1226B;CUNEIFORM SIGN NUN CROSSING NUN;Lo;0;L;;;;;N;;;;;
+1226C;CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR;Lo;0;L;;;;;N;;;;;
+1226D;CUNEIFORM SIGN NUNUZ;Lo;0;L;;;;;N;;;;;
+1226E;CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1226F;CUNEIFORM SIGN NUNUZ AB2 TIMES BI;Lo;0;L;;;;;N;;;;;
+12270;CUNEIFORM SIGN NUNUZ AB2 TIMES DUG;Lo;0;L;;;;;N;;;;;
+12271;CUNEIFORM SIGN NUNUZ AB2 TIMES GUD;Lo;0;L;;;;;N;;;;;
+12272;CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+12273;CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3;Lo;0;L;;;;;N;;;;;
+12274;CUNEIFORM SIGN NUNUZ AB2 TIMES LA;Lo;0;L;;;;;N;;;;;
+12275;CUNEIFORM SIGN NUNUZ AB2 TIMES NE;Lo;0;L;;;;;N;;;;;
+12276;CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3;Lo;0;L;;;;;N;;;;;
+12277;CUNEIFORM SIGN NUNUZ AB2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12278;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI;Lo;0;L;;;;;N;;;;;
+12279;CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U;Lo;0;L;;;;;N;;;;;
+1227A;CUNEIFORM SIGN PA;Lo;0;L;;;;;N;;;;;
+1227B;CUNEIFORM SIGN PAD;Lo;0;L;;;;;N;;;;;
+1227C;CUNEIFORM SIGN PAN;Lo;0;L;;;;;N;;;;;
+1227D;CUNEIFORM SIGN PAP;Lo;0;L;;;;;N;;;;;
+1227E;CUNEIFORM SIGN PESH2;Lo;0;L;;;;;N;;;;;
+1227F;CUNEIFORM SIGN PI;Lo;0;L;;;;;N;;;;;
+12280;CUNEIFORM SIGN PI TIMES A;Lo;0;L;;;;;N;;;;;
+12281;CUNEIFORM SIGN PI TIMES AB;Lo;0;L;;;;;N;;;;;
+12282;CUNEIFORM SIGN PI TIMES BI;Lo;0;L;;;;;N;;;;;
+12283;CUNEIFORM SIGN PI TIMES BU;Lo;0;L;;;;;N;;;;;
+12284;CUNEIFORM SIGN PI TIMES E;Lo;0;L;;;;;N;;;;;
+12285;CUNEIFORM SIGN PI TIMES I;Lo;0;L;;;;;N;;;;;
+12286;CUNEIFORM SIGN PI TIMES IB;Lo;0;L;;;;;N;;;;;
+12287;CUNEIFORM SIGN PI TIMES U;Lo;0;L;;;;;N;;;;;
+12288;CUNEIFORM SIGN PI TIMES U2;Lo;0;L;;;;;N;;;;;
+12289;CUNEIFORM SIGN PI CROSSING PI;Lo;0;L;;;;;N;;;;;
+1228A;CUNEIFORM SIGN PIRIG;Lo;0;L;;;;;N;;;;;
+1228B;CUNEIFORM SIGN PIRIG TIMES KAL;Lo;0;L;;;;;N;;;;;
+1228C;CUNEIFORM SIGN PIRIG TIMES UD;Lo;0;L;;;;;N;;;;;
+1228D;CUNEIFORM SIGN PIRIG TIMES ZA;Lo;0;L;;;;;N;;;;;
+1228E;CUNEIFORM SIGN PIRIG OPPOSING PIRIG;Lo;0;L;;;;;N;;;;;
+1228F;CUNEIFORM SIGN RA;Lo;0;L;;;;;N;;;;;
+12290;CUNEIFORM SIGN RAB;Lo;0;L;;;;;N;;;;;
+12291;CUNEIFORM SIGN RI;Lo;0;L;;;;;N;;;;;
+12292;CUNEIFORM SIGN RU;Lo;0;L;;;;;N;;;;;
+12293;CUNEIFORM SIGN SA;Lo;0;L;;;;;N;;;;;
+12294;CUNEIFORM SIGN SAG NUTILLU;Lo;0;L;;;;;N;;;;;
+12295;CUNEIFORM SIGN SAG;Lo;0;L;;;;;N;;;;;
+12296;CUNEIFORM SIGN SAG TIMES A;Lo;0;L;;;;;N;;;;;
+12297;CUNEIFORM SIGN SAG TIMES DU;Lo;0;L;;;;;N;;;;;
+12298;CUNEIFORM SIGN SAG TIMES DUB;Lo;0;L;;;;;N;;;;;
+12299;CUNEIFORM SIGN SAG TIMES HA;Lo;0;L;;;;;N;;;;;
+1229A;CUNEIFORM SIGN SAG TIMES KAK;Lo;0;L;;;;;N;;;;;
+1229B;CUNEIFORM SIGN SAG TIMES KUR;Lo;0;L;;;;;N;;;;;
+1229C;CUNEIFORM SIGN SAG TIMES LUM;Lo;0;L;;;;;N;;;;;
+1229D;CUNEIFORM SIGN SAG TIMES MI;Lo;0;L;;;;;N;;;;;
+1229E;CUNEIFORM SIGN SAG TIMES NUN;Lo;0;L;;;;;N;;;;;
+1229F;CUNEIFORM SIGN SAG TIMES SAL;Lo;0;L;;;;;N;;;;;
+122A0;CUNEIFORM SIGN SAG TIMES SHID;Lo;0;L;;;;;N;;;;;
+122A1;CUNEIFORM SIGN SAG TIMES TAB;Lo;0;L;;;;;N;;;;;
+122A2;CUNEIFORM SIGN SAG TIMES U2;Lo;0;L;;;;;N;;;;;
+122A3;CUNEIFORM SIGN SAG TIMES UB;Lo;0;L;;;;;N;;;;;
+122A4;CUNEIFORM SIGN SAG TIMES UM;Lo;0;L;;;;;N;;;;;
+122A5;CUNEIFORM SIGN SAG TIMES UR;Lo;0;L;;;;;N;;;;;
+122A6;CUNEIFORM SIGN SAG TIMES USH;Lo;0;L;;;;;N;;;;;
+122A7;CUNEIFORM SIGN SAG OVER SAG;Lo;0;L;;;;;N;;;;;
+122A8;CUNEIFORM SIGN SAG GUNU;Lo;0;L;;;;;N;;;;;
+122A9;CUNEIFORM SIGN SAL;Lo;0;L;;;;;N;;;;;
+122AA;CUNEIFORM SIGN SAL LAGAB TIMES ASH2;Lo;0;L;;;;;N;;;;;
+122AB;CUNEIFORM SIGN SANGA2;Lo;0;L;;;;;N;;;;;
+122AC;CUNEIFORM SIGN SAR;Lo;0;L;;;;;N;;;;;
+122AD;CUNEIFORM SIGN SHA;Lo;0;L;;;;;N;;;;;
+122AE;CUNEIFORM SIGN SHA3;Lo;0;L;;;;;N;;;;;
+122AF;CUNEIFORM SIGN SHA3 TIMES A;Lo;0;L;;;;;N;;;;;
+122B0;CUNEIFORM SIGN SHA3 TIMES BAD;Lo;0;L;;;;;N;;;;;
+122B1;CUNEIFORM SIGN SHA3 TIMES GISH;Lo;0;L;;;;;N;;;;;
+122B2;CUNEIFORM SIGN SHA3 TIMES NE;Lo;0;L;;;;;N;;;;;
+122B3;CUNEIFORM SIGN SHA3 TIMES SHU2;Lo;0;L;;;;;N;;;;;
+122B4;CUNEIFORM SIGN SHA3 TIMES TUR;Lo;0;L;;;;;N;;;;;
+122B5;CUNEIFORM SIGN SHA3 TIMES U;Lo;0;L;;;;;N;;;;;
+122B6;CUNEIFORM SIGN SHA3 TIMES U PLUS A;Lo;0;L;;;;;N;;;;;
+122B7;CUNEIFORM SIGN SHA6;Lo;0;L;;;;;N;;;;;
+122B8;CUNEIFORM SIGN SHAB6;Lo;0;L;;;;;N;;;;;
+122B9;CUNEIFORM SIGN SHAR2;Lo;0;L;;;;;N;;;;;
+122BA;CUNEIFORM SIGN SHE;Lo;0;L;;;;;N;;;;;
+122BB;CUNEIFORM SIGN SHE HU;Lo;0;L;;;;;N;;;;;
+122BC;CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BD;CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+122BE;CUNEIFORM SIGN SHEG9;Lo;0;L;;;;;N;;;;;
+122BF;CUNEIFORM SIGN SHEN;Lo;0;L;;;;;N;;;;;
+122C0;CUNEIFORM SIGN SHESH;Lo;0;L;;;;;N;;;;;
+122C1;CUNEIFORM SIGN SHESH2;Lo;0;L;;;;;N;;;;;
+122C2;CUNEIFORM SIGN SHESHLAM;Lo;0;L;;;;;N;;;;;
+122C3;CUNEIFORM SIGN SHID;Lo;0;L;;;;;N;;;;;
+122C4;CUNEIFORM SIGN SHID TIMES A;Lo;0;L;;;;;N;;;;;
+122C5;CUNEIFORM SIGN SHID TIMES IM;Lo;0;L;;;;;N;;;;;
+122C6;CUNEIFORM SIGN SHIM;Lo;0;L;;;;;N;;;;;
+122C7;CUNEIFORM SIGN SHIM TIMES A;Lo;0;L;;;;;N;;;;;
+122C8;CUNEIFORM SIGN SHIM TIMES BAL;Lo;0;L;;;;;N;;;;;
+122C9;CUNEIFORM SIGN SHIM TIMES BULUG;Lo;0;L;;;;;N;;;;;
+122CA;CUNEIFORM SIGN SHIM TIMES DIN;Lo;0;L;;;;;N;;;;;
+122CB;CUNEIFORM SIGN SHIM TIMES GAR;Lo;0;L;;;;;N;;;;;
+122CC;CUNEIFORM SIGN SHIM TIMES IGI;Lo;0;L;;;;;N;;;;;
+122CD;CUNEIFORM SIGN SHIM TIMES IGI GUNU;Lo;0;L;;;;;N;;;;;
+122CE;CUNEIFORM SIGN SHIM TIMES KUSHU2;Lo;0;L;;;;;N;;;;;
+122CF;CUNEIFORM SIGN SHIM TIMES LUL;Lo;0;L;;;;;N;;;;;
+122D0;CUNEIFORM SIGN SHIM TIMES MUG;Lo;0;L;;;;;N;;;;;
+122D1;CUNEIFORM SIGN SHIM TIMES SAL;Lo;0;L;;;;;N;;;;;
+122D2;CUNEIFORM SIGN SHINIG;Lo;0;L;;;;;N;;;;;
+122D3;CUNEIFORM SIGN SHIR;Lo;0;L;;;;;N;;;;;
+122D4;CUNEIFORM SIGN SHIR TENU;Lo;0;L;;;;;N;;;;;
+122D5;CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR;Lo;0;L;;;;;N;;;;;
+122D6;CUNEIFORM SIGN SHITA;Lo;0;L;;;;;N;;;;;
+122D7;CUNEIFORM SIGN SHU;Lo;0;L;;;;;N;;;;;
+122D8;CUNEIFORM SIGN SHU OVER INVERTED SHU;Lo;0;L;;;;;N;;;;;
+122D9;CUNEIFORM SIGN SHU2;Lo;0;L;;;;;N;;;;;
+122DA;CUNEIFORM SIGN SHUBUR;Lo;0;L;;;;;N;;;;;
+122DB;CUNEIFORM SIGN SI;Lo;0;L;;;;;N;;;;;
+122DC;CUNEIFORM SIGN SI GUNU;Lo;0;L;;;;;N;;;;;
+122DD;CUNEIFORM SIGN SIG;Lo;0;L;;;;;N;;;;;
+122DE;CUNEIFORM SIGN SIG4;Lo;0;L;;;;;N;;;;;
+122DF;CUNEIFORM SIGN SIG4 OVER SIG4 SHU2;Lo;0;L;;;;;N;;;;;
+122E0;CUNEIFORM SIGN SIK2;Lo;0;L;;;;;N;;;;;
+122E1;CUNEIFORM SIGN SILA3;Lo;0;L;;;;;N;;;;;
+122E2;CUNEIFORM SIGN SU;Lo;0;L;;;;;N;;;;;
+122E3;CUNEIFORM SIGN SU OVER SU;Lo;0;L;;;;;N;;;;;
+122E4;CUNEIFORM SIGN SUD;Lo;0;L;;;;;N;;;;;
+122E5;CUNEIFORM SIGN SUD2;Lo;0;L;;;;;N;;;;;
+122E6;CUNEIFORM SIGN SUHUR;Lo;0;L;;;;;N;;;;;
+122E7;CUNEIFORM SIGN SUM;Lo;0;L;;;;;N;;;;;
+122E8;CUNEIFORM SIGN SUMASH;Lo;0;L;;;;;N;;;;;
+122E9;CUNEIFORM SIGN SUR;Lo;0;L;;;;;N;;;;;
+122EA;CUNEIFORM SIGN SUR9;Lo;0;L;;;;;N;;;;;
+122EB;CUNEIFORM SIGN TA;Lo;0;L;;;;;N;;;;;
+122EC;CUNEIFORM SIGN TA ASTERISK;Lo;0;L;;;;;N;;;;;
+122ED;CUNEIFORM SIGN TA TIMES HI;Lo;0;L;;;;;N;;;;;
+122EE;CUNEIFORM SIGN TA TIMES MI;Lo;0;L;;;;;N;;;;;
+122EF;CUNEIFORM SIGN TA GUNU;Lo;0;L;;;;;N;;;;;
+122F0;CUNEIFORM SIGN TAB;Lo;0;L;;;;;N;;;;;
+122F1;CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH;Lo;0;L;;;;;N;;;;;
+122F2;CUNEIFORM SIGN TAB SQUARED;Lo;0;L;;;;;N;;;;;
+122F3;CUNEIFORM SIGN TAG;Lo;0;L;;;;;N;;;;;
+122F4;CUNEIFORM SIGN TAG TIMES BI;Lo;0;L;;;;;N;;;;;
+122F5;CUNEIFORM SIGN TAG TIMES GUD;Lo;0;L;;;;;N;;;;;
+122F6;CUNEIFORM SIGN TAG TIMES SHE;Lo;0;L;;;;;N;;;;;
+122F7;CUNEIFORM SIGN TAG TIMES SHU;Lo;0;L;;;;;N;;;;;
+122F8;CUNEIFORM SIGN TAG TIMES TUG2;Lo;0;L;;;;;N;;;;;
+122F9;CUNEIFORM SIGN TAG TIMES UD;Lo;0;L;;;;;N;;;;;
+122FA;CUNEIFORM SIGN TAK4;Lo;0;L;;;;;N;;;;;
+122FB;CUNEIFORM SIGN TAR;Lo;0;L;;;;;N;;;;;
+122FC;CUNEIFORM SIGN TE;Lo;0;L;;;;;N;;;;;
+122FD;CUNEIFORM SIGN TE GUNU;Lo;0;L;;;;;N;;;;;
+122FE;CUNEIFORM SIGN TI;Lo;0;L;;;;;N;;;;;
+122FF;CUNEIFORM SIGN TI TENU;Lo;0;L;;;;;N;;;;;
+12300;CUNEIFORM SIGN TIL;Lo;0;L;;;;;N;;;;;
+12301;CUNEIFORM SIGN TIR;Lo;0;L;;;;;N;;;;;
+12302;CUNEIFORM SIGN TIR TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12303;CUNEIFORM SIGN TIR OVER TIR;Lo;0;L;;;;;N;;;;;
+12304;CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+12305;CUNEIFORM SIGN TU;Lo;0;L;;;;;N;;;;;
+12306;CUNEIFORM SIGN TUG2;Lo;0;L;;;;;N;;;;;
+12307;CUNEIFORM SIGN TUK;Lo;0;L;;;;;N;;;;;
+12308;CUNEIFORM SIGN TUM;Lo;0;L;;;;;N;;;;;
+12309;CUNEIFORM SIGN TUR;Lo;0;L;;;;;N;;;;;
+1230A;CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA;Lo;0;L;;;;;N;;;;;
+1230B;CUNEIFORM SIGN U;Lo;0;L;;;;;N;;;;;
+1230C;CUNEIFORM SIGN U GUD;Lo;0;L;;;;;N;;;;;
+1230D;CUNEIFORM SIGN U U U;Lo;0;L;;;;;N;;;;;
+1230E;CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR;Lo;0;L;;;;;N;;;;;
+1230F;CUNEIFORM SIGN U OVER U SUR OVER SUR;Lo;0;L;;;;;N;;;;;
+12310;CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED;Lo;0;L;;;;;N;;;;;
+12311;CUNEIFORM SIGN U2;Lo;0;L;;;;;N;;;;;
+12312;CUNEIFORM SIGN UB;Lo;0;L;;;;;N;;;;;
+12313;CUNEIFORM SIGN UD;Lo;0;L;;;;;N;;;;;
+12314;CUNEIFORM SIGN UD KUSHU2;Lo;0;L;;;;;N;;;;;
+12315;CUNEIFORM SIGN UD TIMES BAD;Lo;0;L;;;;;N;;;;;
+12316;CUNEIFORM SIGN UD TIMES MI;Lo;0;L;;;;;N;;;;;
+12317;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U;Lo;0;L;;;;;N;;;;;
+12318;CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU;Lo;0;L;;;;;N;;;;;
+12319;CUNEIFORM SIGN UD GUNU;Lo;0;L;;;;;N;;;;;
+1231A;CUNEIFORM SIGN UD SHESHIG;Lo;0;L;;;;;N;;;;;
+1231B;CUNEIFORM SIGN UD SHESHIG TIMES BAD;Lo;0;L;;;;;N;;;;;
+1231C;CUNEIFORM SIGN UDUG;Lo;0;L;;;;;N;;;;;
+1231D;CUNEIFORM SIGN UM;Lo;0;L;;;;;N;;;;;
+1231E;CUNEIFORM SIGN UM TIMES LAGAB;Lo;0;L;;;;;N;;;;;
+1231F;CUNEIFORM SIGN UM TIMES ME PLUS DA;Lo;0;L;;;;;N;;;;;
+12320;CUNEIFORM SIGN UM TIMES SHA3;Lo;0;L;;;;;N;;;;;
+12321;CUNEIFORM SIGN UM TIMES U;Lo;0;L;;;;;N;;;;;
+12322;CUNEIFORM SIGN UMBIN;Lo;0;L;;;;;N;;;;;
+12323;CUNEIFORM SIGN UMUM;Lo;0;L;;;;;N;;;;;
+12324;CUNEIFORM SIGN UMUM TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+12325;CUNEIFORM SIGN UMUM TIMES PA;Lo;0;L;;;;;N;;;;;
+12326;CUNEIFORM SIGN UN;Lo;0;L;;;;;N;;;;;
+12327;CUNEIFORM SIGN UN GUNU;Lo;0;L;;;;;N;;;;;
+12328;CUNEIFORM SIGN UR;Lo;0;L;;;;;N;;;;;
+12329;CUNEIFORM SIGN UR CROSSING UR;Lo;0;L;;;;;N;;;;;
+1232A;CUNEIFORM SIGN UR SHESHIG;Lo;0;L;;;;;N;;;;;
+1232B;CUNEIFORM SIGN UR2;Lo;0;L;;;;;N;;;;;
+1232C;CUNEIFORM SIGN UR2 TIMES A PLUS HA;Lo;0;L;;;;;N;;;;;
+1232D;CUNEIFORM SIGN UR2 TIMES A PLUS NA;Lo;0;L;;;;;N;;;;;
+1232E;CUNEIFORM SIGN UR2 TIMES AL;Lo;0;L;;;;;N;;;;;
+1232F;CUNEIFORM SIGN UR2 TIMES HA;Lo;0;L;;;;;N;;;;;
+12330;CUNEIFORM SIGN UR2 TIMES NUN;Lo;0;L;;;;;N;;;;;
+12331;CUNEIFORM SIGN UR2 TIMES U2;Lo;0;L;;;;;N;;;;;
+12332;CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH;Lo;0;L;;;;;N;;;;;
+12333;CUNEIFORM SIGN UR2 TIMES U2 PLUS BI;Lo;0;L;;;;;N;;;;;
+12334;CUNEIFORM SIGN UR4;Lo;0;L;;;;;N;;;;;
+12335;CUNEIFORM SIGN URI;Lo;0;L;;;;;N;;;;;
+12336;CUNEIFORM SIGN URI3;Lo;0;L;;;;;N;;;;;
+12337;CUNEIFORM SIGN URU;Lo;0;L;;;;;N;;;;;
+12338;CUNEIFORM SIGN URU TIMES A;Lo;0;L;;;;;N;;;;;
+12339;CUNEIFORM SIGN URU TIMES ASHGAB;Lo;0;L;;;;;N;;;;;
+1233A;CUNEIFORM SIGN URU TIMES BAR;Lo;0;L;;;;;N;;;;;
+1233B;CUNEIFORM SIGN URU TIMES DUN;Lo;0;L;;;;;N;;;;;
+1233C;CUNEIFORM SIGN URU TIMES GA;Lo;0;L;;;;;N;;;;;
+1233D;CUNEIFORM SIGN URU TIMES GAL;Lo;0;L;;;;;N;;;;;
+1233E;CUNEIFORM SIGN URU TIMES GAN2 TENU;Lo;0;L;;;;;N;;;;;
+1233F;CUNEIFORM SIGN URU TIMES GAR;Lo;0;L;;;;;N;;;;;
+12340;CUNEIFORM SIGN URU TIMES GU;Lo;0;L;;;;;N;;;;;
+12341;CUNEIFORM SIGN URU TIMES HA;Lo;0;L;;;;;N;;;;;
+12342;CUNEIFORM SIGN URU TIMES IGI;Lo;0;L;;;;;N;;;;;
+12343;CUNEIFORM SIGN URU TIMES IM;Lo;0;L;;;;;N;;;;;
+12344;CUNEIFORM SIGN URU TIMES ISH;Lo;0;L;;;;;N;;;;;
+12345;CUNEIFORM SIGN URU TIMES KI;Lo;0;L;;;;;N;;;;;
+12346;CUNEIFORM SIGN URU TIMES LUM;Lo;0;L;;;;;N;;;;;
+12347;CUNEIFORM SIGN URU TIMES MIN;Lo;0;L;;;;;N;;;;;
+12348;CUNEIFORM SIGN URU TIMES PA;Lo;0;L;;;;;N;;;;;
+12349;CUNEIFORM SIGN URU TIMES SHE;Lo;0;L;;;;;N;;;;;
+1234A;CUNEIFORM SIGN URU TIMES SIG4;Lo;0;L;;;;;N;;;;;
+1234B;CUNEIFORM SIGN URU TIMES TU;Lo;0;L;;;;;N;;;;;
+1234C;CUNEIFORM SIGN URU TIMES U PLUS GUD;Lo;0;L;;;;;N;;;;;
+1234D;CUNEIFORM SIGN URU TIMES UD;Lo;0;L;;;;;N;;;;;
+1234E;CUNEIFORM SIGN URU TIMES URUDA;Lo;0;L;;;;;N;;;;;
+1234F;CUNEIFORM SIGN URUDA;Lo;0;L;;;;;N;;;;;
+12350;CUNEIFORM SIGN URUDA TIMES U;Lo;0;L;;;;;N;;;;;
+12351;CUNEIFORM SIGN USH;Lo;0;L;;;;;N;;;;;
+12352;CUNEIFORM SIGN USH TIMES A;Lo;0;L;;;;;N;;;;;
+12353;CUNEIFORM SIGN USH TIMES KU;Lo;0;L;;;;;N;;;;;
+12354;CUNEIFORM SIGN USH TIMES KUR;Lo;0;L;;;;;N;;;;;
+12355;CUNEIFORM SIGN USH TIMES TAK4;Lo;0;L;;;;;N;;;;;
+12356;CUNEIFORM SIGN USHX;Lo;0;L;;;;;N;;;;;
+12357;CUNEIFORM SIGN USH2;Lo;0;L;;;;;N;;;;;
+12358;CUNEIFORM SIGN USHUMX;Lo;0;L;;;;;N;;;;;
+12359;CUNEIFORM SIGN UTUKI;Lo;0;L;;;;;N;;;;;
+1235A;CUNEIFORM SIGN UZ3;Lo;0;L;;;;;N;;;;;
+1235B;CUNEIFORM SIGN UZ3 TIMES KASKAL;Lo;0;L;;;;;N;;;;;
+1235C;CUNEIFORM SIGN UZU;Lo;0;L;;;;;N;;;;;
+1235D;CUNEIFORM SIGN ZA;Lo;0;L;;;;;N;;;;;
+1235E;CUNEIFORM SIGN ZA TENU;Lo;0;L;;;;;N;;;;;
+1235F;CUNEIFORM SIGN ZA SQUARED TIMES KUR;Lo;0;L;;;;;N;;;;;
+12360;CUNEIFORM SIGN ZAG;Lo;0;L;;;;;N;;;;;
+12361;CUNEIFORM SIGN ZAMX;Lo;0;L;;;;;N;;;;;
+12362;CUNEIFORM SIGN ZE2;Lo;0;L;;;;;N;;;;;
+12363;CUNEIFORM SIGN ZI;Lo;0;L;;;;;N;;;;;
+12364;CUNEIFORM SIGN ZI OVER ZI;Lo;0;L;;;;;N;;;;;
+12365;CUNEIFORM SIGN ZI3;Lo;0;L;;;;;N;;;;;
+12366;CUNEIFORM SIGN ZIB;Lo;0;L;;;;;N;;;;;
+12367;CUNEIFORM SIGN ZIB KABA TENU;Lo;0;L;;;;;N;;;;;
+12368;CUNEIFORM SIGN ZIG;Lo;0;L;;;;;N;;;;;
+12369;CUNEIFORM SIGN ZIZ2;Lo;0;L;;;;;N;;;;;
+1236A;CUNEIFORM SIGN ZU;Lo;0;L;;;;;N;;;;;
+1236B;CUNEIFORM SIGN ZU5;Lo;0;L;;;;;N;;;;;
+1236C;CUNEIFORM SIGN ZU5 TIMES A;Lo;0;L;;;;;N;;;;;
+1236D;CUNEIFORM SIGN ZUBUR;Lo;0;L;;;;;N;;;;;
+1236E;CUNEIFORM SIGN ZUM;Lo;0;L;;;;;N;;;;;
+12400;CUNEIFORM NUMERIC SIGN TWO ASH;Nl;0;L;;;;2;N;;;;;
+12401;CUNEIFORM NUMERIC SIGN THREE ASH;Nl;0;L;;;;3;N;;;;;
+12402;CUNEIFORM NUMERIC SIGN FOUR ASH;Nl;0;L;;;;4;N;;;;;
+12403;CUNEIFORM NUMERIC SIGN FIVE ASH;Nl;0;L;;;;5;N;;;;;
+12404;CUNEIFORM NUMERIC SIGN SIX ASH;Nl;0;L;;;;6;N;;;;;
+12405;CUNEIFORM NUMERIC SIGN SEVEN ASH;Nl;0;L;;;;7;N;;;;;
+12406;CUNEIFORM NUMERIC SIGN EIGHT ASH;Nl;0;L;;;;8;N;;;;;
+12407;CUNEIFORM NUMERIC SIGN NINE ASH;Nl;0;L;;;;9;N;;;;;
+12408;CUNEIFORM NUMERIC SIGN THREE DISH;Nl;0;L;;;;3;N;;;;;
+12409;CUNEIFORM NUMERIC SIGN FOUR DISH;Nl;0;L;;;;4;N;;;;;
+1240A;CUNEIFORM NUMERIC SIGN FIVE DISH;Nl;0;L;;;;5;N;;;;;
+1240B;CUNEIFORM NUMERIC SIGN SIX DISH;Nl;0;L;;;;6;N;;;;;
+1240C;CUNEIFORM NUMERIC SIGN SEVEN DISH;Nl;0;L;;;;7;N;;;;;
+1240D;CUNEIFORM NUMERIC SIGN EIGHT DISH;Nl;0;L;;;;8;N;;;;;
+1240E;CUNEIFORM NUMERIC SIGN NINE DISH;Nl;0;L;;;;9;N;;;;;
+1240F;CUNEIFORM NUMERIC SIGN FOUR U;Nl;0;L;;;;4;N;;;;;
+12410;CUNEIFORM NUMERIC SIGN FIVE U;Nl;0;L;;;;5;N;;;;;
+12411;CUNEIFORM NUMERIC SIGN SIX U;Nl;0;L;;;;6;N;;;;;
+12412;CUNEIFORM NUMERIC SIGN SEVEN U;Nl;0;L;;;;7;N;;;;;
+12413;CUNEIFORM NUMERIC SIGN EIGHT U;Nl;0;L;;;;8;N;;;;;
+12414;CUNEIFORM NUMERIC SIGN NINE U;Nl;0;L;;;;9;N;;;;;
+12415;CUNEIFORM NUMERIC SIGN ONE GESH2;Nl;0;L;;;;1;N;;;;;
+12416;CUNEIFORM NUMERIC SIGN TWO GESH2;Nl;0;L;;;;2;N;;;;;
+12417;CUNEIFORM NUMERIC SIGN THREE GESH2;Nl;0;L;;;;3;N;;;;;
+12418;CUNEIFORM NUMERIC SIGN FOUR GESH2;Nl;0;L;;;;4;N;;;;;
+12419;CUNEIFORM NUMERIC SIGN FIVE GESH2;Nl;0;L;;;;5;N;;;;;
+1241A;CUNEIFORM NUMERIC SIGN SIX GESH2;Nl;0;L;;;;6;N;;;;;
+1241B;CUNEIFORM NUMERIC SIGN SEVEN GESH2;Nl;0;L;;;;7;N;;;;;
+1241C;CUNEIFORM NUMERIC SIGN EIGHT GESH2;Nl;0;L;;;;8;N;;;;;
+1241D;CUNEIFORM NUMERIC SIGN NINE GESH2;Nl;0;L;;;;9;N;;;;;
+1241E;CUNEIFORM NUMERIC SIGN ONE GESHU;Nl;0;L;;;;1;N;;;;;
+1241F;CUNEIFORM NUMERIC SIGN TWO GESHU;Nl;0;L;;;;2;N;;;;;
+12420;CUNEIFORM NUMERIC SIGN THREE GESHU;Nl;0;L;;;;3;N;;;;;
+12421;CUNEIFORM NUMERIC SIGN FOUR GESHU;Nl;0;L;;;;4;N;;;;;
+12422;CUNEIFORM NUMERIC SIGN FIVE GESHU;Nl;0;L;;;;5;N;;;;;
+12423;CUNEIFORM NUMERIC SIGN TWO SHAR2;Nl;0;L;;;;2;N;;;;;
+12424;CUNEIFORM NUMERIC SIGN THREE SHAR2;Nl;0;L;;;;3;N;;;;;
+12425;CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12426;CUNEIFORM NUMERIC SIGN FOUR SHAR2;Nl;0;L;;;;4;N;;;;;
+12427;CUNEIFORM NUMERIC SIGN FIVE SHAR2;Nl;0;L;;;;5;N;;;;;
+12428;CUNEIFORM NUMERIC SIGN SIX SHAR2;Nl;0;L;;;;6;N;;;;;
+12429;CUNEIFORM NUMERIC SIGN SEVEN SHAR2;Nl;0;L;;;;7;N;;;;;
+1242A;CUNEIFORM NUMERIC SIGN EIGHT SHAR2;Nl;0;L;;;;8;N;;;;;
+1242B;CUNEIFORM NUMERIC SIGN NINE SHAR2;Nl;0;L;;;;9;N;;;;;
+1242C;CUNEIFORM NUMERIC SIGN ONE SHARU;Nl;0;L;;;;1;N;;;;;
+1242D;CUNEIFORM NUMERIC SIGN TWO SHARU;Nl;0;L;;;;2;N;;;;;
+1242E;CUNEIFORM NUMERIC SIGN THREE SHARU;Nl;0;L;;;;3;N;;;;;
+1242F;CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12430;CUNEIFORM NUMERIC SIGN FOUR SHARU;Nl;0;L;;;;4;N;;;;;
+12431;CUNEIFORM NUMERIC SIGN FIVE SHARU;Nl;0;L;;;;5;N;;;;;
+12432;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH;Nl;0;L;;;;;N;;;;;
+12433;CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN;Nl;0;L;;;;;N;;;;;
+12434;CUNEIFORM NUMERIC SIGN ONE BURU;Nl;0;L;;;;1;N;;;;;
+12435;CUNEIFORM NUMERIC SIGN TWO BURU;Nl;0;L;;;;2;N;;;;;
+12436;CUNEIFORM NUMERIC SIGN THREE BURU;Nl;0;L;;;;3;N;;;;;
+12437;CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM;Nl;0;L;;;;3;N;;;;;
+12438;CUNEIFORM NUMERIC SIGN FOUR BURU;Nl;0;L;;;;4;N;;;;;
+12439;CUNEIFORM NUMERIC SIGN FIVE BURU;Nl;0;L;;;;5;N;;;;;
+1243A;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16;Nl;0;L;;;;3;N;;;;;
+1243B;CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21;Nl;0;L;;;;3;N;;;;;
+1243C;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU;Nl;0;L;;;;4;N;;;;;
+1243D;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4;Nl;0;L;;;;4;N;;;;;
+1243E;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A;Nl;0;L;;;;4;N;;;;;
+1243F;CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B;Nl;0;L;;;;4;N;;;;;
+12440;CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9;Nl;0;L;;;;6;N;;;;;
+12441;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3;Nl;0;L;;;;7;N;;;;;
+12442;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A;Nl;0;L;;;;7;N;;;;;
+12443;CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B;Nl;0;L;;;;7;N;;;;;
+12444;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU;Nl;0;L;;;;8;N;;;;;
+12445;CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3;Nl;0;L;;;;8;N;;;;;
+12446;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU;Nl;0;L;;;;9;N;;;;;
+12447;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3;Nl;0;L;;;;9;N;;;;;
+12448;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4;Nl;0;L;;;;9;N;;;;;
+12449;CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A;Nl;0;L;;;;9;N;;;;;
+1244A;CUNEIFORM NUMERIC SIGN TWO ASH TENU;Nl;0;L;;;;2;N;;;;;
+1244B;CUNEIFORM NUMERIC SIGN THREE ASH TENU;Nl;0;L;;;;3;N;;;;;
+1244C;CUNEIFORM NUMERIC SIGN FOUR ASH TENU;Nl;0;L;;;;4;N;;;;;
+1244D;CUNEIFORM NUMERIC SIGN FIVE ASH TENU;Nl;0;L;;;;5;N;;;;;
+1244E;CUNEIFORM NUMERIC SIGN SIX ASH TENU;Nl;0;L;;;;6;N;;;;;
+1244F;CUNEIFORM NUMERIC SIGN ONE BAN2;Nl;0;L;;;;1;N;;;;;
+12450;CUNEIFORM NUMERIC SIGN TWO BAN2;Nl;0;L;;;;2;N;;;;;
+12451;CUNEIFORM NUMERIC SIGN THREE BAN2;Nl;0;L;;;;3;N;;;;;
+12452;CUNEIFORM NUMERIC SIGN FOUR BAN2;Nl;0;L;;;;4;N;;;;;
+12453;CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM;Nl;0;L;;;;4;N;;;;;
+12454;CUNEIFORM NUMERIC SIGN FIVE BAN2;Nl;0;L;;;;5;N;;;;;
+12455;CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM;Nl;0;L;;;;5;N;;;;;
+12456;CUNEIFORM NUMERIC SIGN NIGIDAMIN;Nl;0;L;;;;;N;;;;;
+12457;CUNEIFORM NUMERIC SIGN NIGIDAESH;Nl;0;L;;;;;N;;;;;
+12458;CUNEIFORM NUMERIC SIGN ONE ESHE3;Nl;0;L;;;;1;N;;;;;
+12459;CUNEIFORM NUMERIC SIGN TWO ESHE3;Nl;0;L;;;;2;N;;;;;
+1245A;CUNEIFORM NUMERIC SIGN ONE THIRD DISH;Nl;0;L;;;;1/3;N;;;;;
+1245B;CUNEIFORM NUMERIC SIGN TWO THIRDS DISH;Nl;0;L;;;;2/3;N;;;;;
+1245C;CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH;Nl;0;L;;;;5/6;N;;;;;
+1245D;CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A;Nl;0;L;;;;1/3;N;;;;;
+1245E;CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A;Nl;0;L;;;;2/3;N;;;;;
+1245F;CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH;Nl;0;L;;;;1/8;N;;;;;
+12460;CUNEIFORM NUMERIC SIGN ONE QUARTER ASH;Nl;0;L;;;;1/4;N;;;;;
+12461;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH;Nl;0;L;;;;1/6;N;;;;;
+12462;CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER;Nl;0;L;;;;1/4;N;;;;;
+12470;CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER;Po;0;L;;;;;N;;;;;
+12471;CUNEIFORM PUNCTUATION SIGN VERTICAL COLON;Po;0;L;;;;;N;;;;;
+12472;CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON;Po;0;L;;;;;N;;;;;
+12473;CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON;Po;0;L;;;;;N;;;;;
+1D000;BYZANTINE MUSICAL SYMBOL PSILI;So;0;L;;;;;N;;;;;
+1D001;BYZANTINE MUSICAL SYMBOL DASEIA;So;0;L;;;;;N;;;;;
+1D002;BYZANTINE MUSICAL SYMBOL PERISPOMENI;So;0;L;;;;;N;;;;;
+1D003;BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D004;BYZANTINE MUSICAL SYMBOL OXEIA DIPLI;So;0;L;;;;;N;;;;;
+1D005;BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON;So;0;L;;;;;N;;;;;
+1D006;BYZANTINE MUSICAL SYMBOL VAREIA DIPLI;So;0;L;;;;;N;;;;;
+1D007;BYZANTINE MUSICAL SYMBOL KATHISTI;So;0;L;;;;;N;;;;;
+1D008;BYZANTINE MUSICAL SYMBOL SYRMATIKI;So;0;L;;;;;N;;;;;
+1D009;BYZANTINE MUSICAL SYMBOL PARAKLITIKI;So;0;L;;;;;N;;;;;
+1D00A;BYZANTINE MUSICAL SYMBOL YPOKRISIS;So;0;L;;;;;N;;;;;
+1D00B;BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI;So;0;L;;;;;N;;;;;
+1D00C;BYZANTINE MUSICAL SYMBOL KREMASTI;So;0;L;;;;;N;;;;;
+1D00D;BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00E;BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON;So;0;L;;;;;N;;;;;
+1D00F;BYZANTINE MUSICAL SYMBOL TELEIA;So;0;L;;;;;N;;;;;
+1D010;BYZANTINE MUSICAL SYMBOL KENTIMATA;So;0;L;;;;;N;;;;;
+1D011;BYZANTINE MUSICAL SYMBOL APOSTROFOS;So;0;L;;;;;N;;;;;
+1D012;BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI;So;0;L;;;;;N;;;;;
+1D013;BYZANTINE MUSICAL SYMBOL SYNEVMA;So;0;L;;;;;N;;;;;
+1D014;BYZANTINE MUSICAL SYMBOL THITA;So;0;L;;;;;N;;;;;
+1D015;BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION;So;0;L;;;;;N;;;;;
+1D016;BYZANTINE MUSICAL SYMBOL GORGON ARCHAION;So;0;L;;;;;N;;;;;
+1D017;BYZANTINE MUSICAL SYMBOL PSILON;So;0;L;;;;;N;;;;;
+1D018;BYZANTINE MUSICAL SYMBOL CHAMILON;So;0;L;;;;;N;;;;;
+1D019;BYZANTINE MUSICAL SYMBOL VATHY;So;0;L;;;;;N;;;;;
+1D01A;BYZANTINE MUSICAL SYMBOL ISON ARCHAION;So;0;L;;;;;N;;;;;
+1D01B;BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D01C;BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION;So;0;L;;;;;N;;;;;
+1D01D;BYZANTINE MUSICAL SYMBOL SAXIMATA;So;0;L;;;;;N;;;;;
+1D01E;BYZANTINE MUSICAL SYMBOL PARICHON;So;0;L;;;;;N;;;;;
+1D01F;BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA;So;0;L;;;;;N;;;;;
+1D020;BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D021;BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION;So;0;L;;;;;N;;;;;
+1D022;BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION;So;0;L;;;;;N;;;;;
+1D023;BYZANTINE MUSICAL SYMBOL APOTHEMA;So;0;L;;;;;N;;;;;
+1D024;BYZANTINE MUSICAL SYMBOL KLASMA;So;0;L;;;;;N;;;;;
+1D025;BYZANTINE MUSICAL SYMBOL REVMA;So;0;L;;;;;N;;;;;
+1D026;BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION;So;0;L;;;;;N;;;;;
+1D027;BYZANTINE MUSICAL SYMBOL TINAGMA;So;0;L;;;;;N;;;;;
+1D028;BYZANTINE MUSICAL SYMBOL ANATRICHISMA;So;0;L;;;;;N;;;;;
+1D029;BYZANTINE MUSICAL SYMBOL SEISMA;So;0;L;;;;;N;;;;;
+1D02A;BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02B;BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU;So;0;L;;;;;N;;;;;
+1D02C;BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION;So;0;L;;;;;N;;;;;
+1D02D;BYZANTINE MUSICAL SYMBOL THEMA;So;0;L;;;;;N;;;;;
+1D02E;BYZANTINE MUSICAL SYMBOL LEMOI;So;0;L;;;;;N;;;;;
+1D02F;BYZANTINE MUSICAL SYMBOL DYO;So;0;L;;;;;N;;;;;
+1D030;BYZANTINE MUSICAL SYMBOL TRIA;So;0;L;;;;;N;;;;;
+1D031;BYZANTINE MUSICAL SYMBOL TESSERA;So;0;L;;;;;N;;;;;
+1D032;BYZANTINE MUSICAL SYMBOL KRATIMATA;So;0;L;;;;;N;;;;;
+1D033;BYZANTINE MUSICAL SYMBOL APESO EXO NEO;So;0;L;;;;;N;;;;;
+1D034;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION;So;0;L;;;;;N;;;;;
+1D035;BYZANTINE MUSICAL SYMBOL IMIFTHORA;So;0;L;;;;;N;;;;;
+1D036;BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION;So;0;L;;;;;N;;;;;
+1D037;BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON;So;0;L;;;;;N;;;;;
+1D038;BYZANTINE MUSICAL SYMBOL PELASTON;So;0;L;;;;;N;;;;;
+1D039;BYZANTINE MUSICAL SYMBOL PSIFISTON;So;0;L;;;;;N;;;;;
+1D03A;BYZANTINE MUSICAL SYMBOL KONTEVMA;So;0;L;;;;;N;;;;;
+1D03B;BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03C;BYZANTINE MUSICAL SYMBOL RAPISMA;So;0;L;;;;;N;;;;;
+1D03D;BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION;So;0;L;;;;;N;;;;;
+1D03E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION;So;0;L;;;;;N;;;;;
+1D03F;BYZANTINE MUSICAL SYMBOL ICHADIN;So;0;L;;;;;N;;;;;
+1D040;BYZANTINE MUSICAL SYMBOL NANA;So;0;L;;;;;N;;;;;
+1D041;BYZANTINE MUSICAL SYMBOL PETASMA;So;0;L;;;;;N;;;;;
+1D042;BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO;So;0;L;;;;;N;;;;;
+1D043;BYZANTINE MUSICAL SYMBOL TROMIKON ALLO;So;0;L;;;;;N;;;;;
+1D044;BYZANTINE MUSICAL SYMBOL STRAGGISMATA;So;0;L;;;;;N;;;;;
+1D045;BYZANTINE MUSICAL SYMBOL GRONTHISMATA;So;0;L;;;;;N;;;;;
+1D046;BYZANTINE MUSICAL SYMBOL ISON NEO;So;0;L;;;;;N;;;;;
+1D047;BYZANTINE MUSICAL SYMBOL OLIGON NEO;So;0;L;;;;;N;;;;;
+1D048;BYZANTINE MUSICAL SYMBOL OXEIA NEO;So;0;L;;;;;N;;;;;
+1D049;BYZANTINE MUSICAL SYMBOL PETASTI;So;0;L;;;;;N;;;;;
+1D04A;BYZANTINE MUSICAL SYMBOL KOUFISMA;So;0;L;;;;;N;;;;;
+1D04B;BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04C;BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA;So;0;L;;;;;N;;;;;
+1D04D;BYZANTINE MUSICAL SYMBOL PELASTON NEO;So;0;L;;;;;N;;;;;
+1D04E;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO;So;0;L;;;;;N;;;;;
+1D04F;BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO;So;0;L;;;;;N;;;;;
+1D050;BYZANTINE MUSICAL SYMBOL YPSILI;So;0;L;;;;;N;;;;;
+1D051;BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO;So;0;L;;;;;N;;;;;
+1D052;BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO;So;0;L;;;;;N;;;;;
+1D053;BYZANTINE MUSICAL SYMBOL YPORROI;So;0;L;;;;;N;;;;;
+1D054;BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON;So;0;L;;;;;N;;;;;
+1D055;BYZANTINE MUSICAL SYMBOL ELAFRON;So;0;L;;;;;N;;;;;
+1D056;BYZANTINE MUSICAL SYMBOL CHAMILI;So;0;L;;;;;N;;;;;
+1D057;BYZANTINE MUSICAL SYMBOL MIKRON ISON;So;0;L;;;;;N;;;;;
+1D058;BYZANTINE MUSICAL SYMBOL VAREIA NEO;So;0;L;;;;;N;;;;;
+1D059;BYZANTINE MUSICAL SYMBOL PIASMA NEO;So;0;L;;;;;N;;;;;
+1D05A;BYZANTINE MUSICAL SYMBOL PSIFISTON NEO;So;0;L;;;;;N;;;;;
+1D05B;BYZANTINE MUSICAL SYMBOL OMALON;So;0;L;;;;;N;;;;;
+1D05C;BYZANTINE MUSICAL SYMBOL ANTIKENOMA;So;0;L;;;;;N;;;;;
+1D05D;BYZANTINE MUSICAL SYMBOL LYGISMA;So;0;L;;;;;N;;;;;
+1D05E;BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO;So;0;L;;;;;N;;;;;
+1D05F;BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO;So;0;L;;;;;N;;;;;
+1D060;BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA;So;0;L;;;;;N;;;;;
+1D061;BYZANTINE MUSICAL SYMBOL KYLISMA;So;0;L;;;;;N;;;;;
+1D062;BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA;So;0;L;;;;;N;;;;;
+1D063;BYZANTINE MUSICAL SYMBOL TROMIKON NEO;So;0;L;;;;;N;;;;;
+1D064;BYZANTINE MUSICAL SYMBOL EKSTREPTON;So;0;L;;;;;N;;;;;
+1D065;BYZANTINE MUSICAL SYMBOL SYNAGMA NEO;So;0;L;;;;;N;;;;;
+1D066;BYZANTINE MUSICAL SYMBOL SYRMA;So;0;L;;;;;N;;;;;
+1D067;BYZANTINE MUSICAL SYMBOL CHOREVMA NEO;So;0;L;;;;;N;;;;;
+1D068;BYZANTINE MUSICAL SYMBOL EPEGERMA;So;0;L;;;;;N;;;;;
+1D069;BYZANTINE MUSICAL SYMBOL SEISMA NEO;So;0;L;;;;;N;;;;;
+1D06A;BYZANTINE MUSICAL SYMBOL XIRON KLASMA;So;0;L;;;;;N;;;;;
+1D06B;BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON;So;0;L;;;;;N;;;;;
+1D06C;BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA;So;0;L;;;;;N;;;;;
+1D06D;BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA;So;0;L;;;;;N;;;;;
+1D06E;BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D06F;BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA;So;0;L;;;;;N;;;;;
+1D070;BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA;So;0;L;;;;;N;;;;;
+1D071;BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA;So;0;L;;;;;N;;;;;
+1D072;BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D073;BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D074;BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON;So;0;L;;;;;N;;;;;
+1D075;BYZANTINE MUSICAL SYMBOL OYRANISMA NEO;So;0;L;;;;;N;;;;;
+1D076;BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO;So;0;L;;;;;N;;;;;
+1D077;BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO;So;0;L;;;;;N;;;;;
+1D078;BYZANTINE MUSICAL SYMBOL THEMA APLOUN;So;0;L;;;;;N;;;;;
+1D079;BYZANTINE MUSICAL SYMBOL THES KAI APOTHES;So;0;L;;;;;N;;;;;
+1D07A;BYZANTINE MUSICAL SYMBOL KATAVASMA;So;0;L;;;;;N;;;;;
+1D07B;BYZANTINE MUSICAL SYMBOL ENDOFONON;So;0;L;;;;;N;;;;;
+1D07C;BYZANTINE MUSICAL SYMBOL YFEN KATO;So;0;L;;;;;N;;;;;
+1D07D;BYZANTINE MUSICAL SYMBOL YFEN ANO;So;0;L;;;;;N;;;;;
+1D07E;BYZANTINE MUSICAL SYMBOL STAVROS;So;0;L;;;;;N;;;;;
+1D07F;BYZANTINE MUSICAL SYMBOL KLASMA ANO;So;0;L;;;;;N;;;;;
+1D080;BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION;So;0;L;;;;;N;;;;;
+1D081;BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION;So;0;L;;;;;N;;;;;
+1D082;BYZANTINE MUSICAL SYMBOL KRATIMA ALLO;So;0;L;;;;;N;;;;;
+1D083;BYZANTINE MUSICAL SYMBOL KRATIMA NEO;So;0;L;;;;;N;;;;;
+1D084;BYZANTINE MUSICAL SYMBOL APODERMA NEO;So;0;L;;;;;N;;;;;
+1D085;BYZANTINE MUSICAL SYMBOL APLI;So;0;L;;;;;N;;;;;
+1D086;BYZANTINE MUSICAL SYMBOL DIPLI;So;0;L;;;;;N;;;;;
+1D087;BYZANTINE MUSICAL SYMBOL TRIPLI;So;0;L;;;;;N;;;;;
+1D088;BYZANTINE MUSICAL SYMBOL TETRAPLI;So;0;L;;;;;N;;;;;
+1D089;BYZANTINE MUSICAL SYMBOL KORONIS;So;0;L;;;;;N;;;;;
+1D08A;BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08B;BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON;So;0;L;;;;;N;;;;;
+1D08C;BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON;So;0;L;;;;;N;;;;;
+1D08D;BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON;So;0;L;;;;;N;;;;;
+1D08E;BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU;So;0;L;;;;;N;;;;;
+1D08F;BYZANTINE MUSICAL SYMBOL GORGON NEO ANO;So;0;L;;;;;N;;;;;
+1D090;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA;So;0;L;;;;;N;;;;;
+1D091;BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D092;BYZANTINE MUSICAL SYMBOL DIGORGON;So;0;L;;;;;N;;;;;
+1D093;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO;So;0;L;;;;;N;;;;;
+1D094;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO;So;0;L;;;;;N;;;;;
+1D095;BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA;So;0;L;;;;;N;;;;;
+1D096;BYZANTINE MUSICAL SYMBOL TRIGORGON;So;0;L;;;;;N;;;;;
+1D097;BYZANTINE MUSICAL SYMBOL ARGON;So;0;L;;;;;N;;;;;
+1D098;BYZANTINE MUSICAL SYMBOL IMIDIARGON;So;0;L;;;;;N;;;;;
+1D099;BYZANTINE MUSICAL SYMBOL DIARGON;So;0;L;;;;;N;;;;;
+1D09A;BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI;So;0;L;;;;;N;;;;;
+1D09B;BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI;So;0;L;;;;;N;;;;;
+1D09C;BYZANTINE MUSICAL SYMBOL AGOGI ARGI;So;0;L;;;;;N;;;;;
+1D09D;BYZANTINE MUSICAL SYMBOL AGOGI METRIA;So;0;L;;;;;N;;;;;
+1D09E;BYZANTINE MUSICAL SYMBOL AGOGI MESI;So;0;L;;;;;N;;;;;
+1D09F;BYZANTINE MUSICAL SYMBOL AGOGI GORGI;So;0;L;;;;;N;;;;;
+1D0A0;BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI;So;0;L;;;;;N;;;;;
+1D0A1;BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI;So;0;L;;;;;N;;;;;
+1D0A2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A3;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A4;BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A5;BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS;So;0;L;;;;;N;;;;;
+1D0A6;BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A7;BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS;So;0;L;;;;;N;;;;;
+1D0A8;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0A9;BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AA;BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AB;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS;So;0;L;;;;;N;;;;;
+1D0AC;BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AD;BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS;So;0;L;;;;;N;;;;;
+1D0AE;BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS;So;0;L;;;;;N;;;;;
+1D0AF;BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0B0;BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS;So;0;L;;;;;N;;;;;
+1D0B1;BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B2;BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS;So;0;L;;;;;N;;;;;
+1D0B3;BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS;So;0;L;;;;;N;;;;;
+1D0B4;BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN;So;0;L;;;;;N;;;;;
+1D0B5;BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN;So;0;L;;;;;N;;;;;
+1D0B6;BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU;So;0;L;;;;;N;;;;;
+1D0B7;BYZANTINE MUSICAL SYMBOL IMIFONON;So;0;L;;;;;N;;;;;
+1D0B8;BYZANTINE MUSICAL SYMBOL IMIFTHORON;So;0;L;;;;;N;;;;;
+1D0B9;BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU;So;0;L;;;;;N;;;;;
+1D0BA;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA;So;0;L;;;;;N;;;;;
+1D0BB;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA;So;0;L;;;;;N;;;;;
+1D0BC;BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS;So;0;L;;;;;N;;;;;
+1D0BD;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI;So;0;L;;;;;N;;;;;
+1D0BE;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI;So;0;L;;;;;N;;;;;
+1D0BF;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE;So;0;L;;;;;N;;;;;
+1D0C0;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO;So;0;L;;;;;N;;;;;
+1D0C1;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO;So;0;L;;;;;N;;;;;
+1D0C2;BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO;So;0;L;;;;;N;;;;;
+1D0C3;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS;So;0;L;;;;;N;;;;;
+1D0C4;BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS;So;0;L;;;;;N;;;;;
+1D0C5;BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS;So;0;L;;;;;N;;;;;
+1D0C6;BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI;So;0;L;;;;;N;;;;;
+1D0C7;BYZANTINE MUSICAL SYMBOL FTHORA NENANO;So;0;L;;;;;N;;;;;
+1D0C8;BYZANTINE MUSICAL SYMBOL CHROA ZYGOS;So;0;L;;;;;N;;;;;
+1D0C9;BYZANTINE MUSICAL SYMBOL CHROA KLITON;So;0;L;;;;;N;;;;;
+1D0CA;BYZANTINE MUSICAL SYMBOL CHROA SPATHI;So;0;L;;;;;N;;;;;
+1D0CB;BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0CC;BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA;So;0;L;;;;;N;;;;;
+1D0CD;BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CE;BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION;So;0;L;;;;;N;;;;;
+1D0CF;BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION;So;0;L;;;;;N;;;;;
+1D0D0;BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D1;BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D2;BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D3;BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D4;BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D5;BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA;So;0;L;;;;;N;;;;;
+1D0D6;BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA;So;0;L;;;;;N;;;;;
+1D0D7;BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA;So;0;L;;;;;N;;;;;
+1D0D8;BYZANTINE MUSICAL SYMBOL GENIKI DIESIS;So;0;L;;;;;N;;;;;
+1D0D9;BYZANTINE MUSICAL SYMBOL GENIKI YFESIS;So;0;L;;;;;N;;;;;
+1D0DA;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI;So;0;L;;;;;N;;;;;
+1D0DB;BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI;So;0;L;;;;;N;;;;;
+1D0DC;BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI;So;0;L;;;;;N;;;;;
+1D0DD;BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS;So;0;L;;;;;N;;;;;
+1D0DE;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS;So;0;L;;;;;N;;;;;
+1D0DF;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E0;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E1;BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E2;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS;So;0;L;;;;;N;;;;;
+1D0E3;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU;So;0;L;;;;;N;;;;;
+1D0E4;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU;So;0;L;;;;;N;;;;;
+1D0E5;BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU;So;0;L;;;;;N;;;;;
+1D0E6;BYZANTINE MUSICAL SYMBOL DIGRAMMA GG;So;0;L;;;;;N;;;;;
+1D0E7;BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU;So;0;L;;;;;N;;;;;
+1D0E8;BYZANTINE MUSICAL SYMBOL STIGMA;So;0;L;;;;;N;;;;;
+1D0E9;BYZANTINE MUSICAL SYMBOL ARKTIKO PA;So;0;L;;;;;N;;;;;
+1D0EA;BYZANTINE MUSICAL SYMBOL ARKTIKO VOU;So;0;L;;;;;N;;;;;
+1D0EB;BYZANTINE MUSICAL SYMBOL ARKTIKO GA;So;0;L;;;;;N;;;;;
+1D0EC;BYZANTINE MUSICAL SYMBOL ARKTIKO DI;So;0;L;;;;;N;;;;;
+1D0ED;BYZANTINE MUSICAL SYMBOL ARKTIKO KE;So;0;L;;;;;N;;;;;
+1D0EE;BYZANTINE MUSICAL SYMBOL ARKTIKO ZO;So;0;L;;;;;N;;;;;
+1D0EF;BYZANTINE MUSICAL SYMBOL ARKTIKO NI;So;0;L;;;;;N;;;;;
+1D0F0;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F1;BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO;So;0;L;;;;;N;;;;;
+1D0F2;BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F3;BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO;So;0;L;;;;;N;;;;;
+1D0F4;BYZANTINE MUSICAL SYMBOL KLASMA KATO;So;0;L;;;;;N;;;;;
+1D0F5;BYZANTINE MUSICAL SYMBOL GORGON NEO KATO;So;0;L;;;;;N;;;;;
+1D100;MUSICAL SYMBOL SINGLE BARLINE;So;0;L;;;;;N;;;;;
+1D101;MUSICAL SYMBOL DOUBLE BARLINE;So;0;L;;;;;N;;;;;
+1D102;MUSICAL SYMBOL FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D103;MUSICAL SYMBOL REVERSE FINAL BARLINE;So;0;L;;;;;N;;;;;
+1D104;MUSICAL SYMBOL DASHED BARLINE;So;0;L;;;;;N;;;;;
+1D105;MUSICAL SYMBOL SHORT BARLINE;So;0;L;;;;;N;;;;;
+1D106;MUSICAL SYMBOL LEFT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D107;MUSICAL SYMBOL RIGHT REPEAT SIGN;So;0;L;;;;;N;;;;;
+1D108;MUSICAL SYMBOL REPEAT DOTS;So;0;L;;;;;N;;;;;
+1D109;MUSICAL SYMBOL DAL SEGNO;So;0;L;;;;;N;;;;;
+1D10A;MUSICAL SYMBOL DA CAPO;So;0;L;;;;;N;;;;;
+1D10B;MUSICAL SYMBOL SEGNO;So;0;L;;;;;N;;;;;
+1D10C;MUSICAL SYMBOL CODA;So;0;L;;;;;N;;;;;
+1D10D;MUSICAL SYMBOL REPEATED FIGURE-1;So;0;L;;;;;N;;;;;
+1D10E;MUSICAL SYMBOL REPEATED FIGURE-2;So;0;L;;;;;N;;;;;
+1D10F;MUSICAL SYMBOL REPEATED FIGURE-3;So;0;L;;;;;N;;;;;
+1D110;MUSICAL SYMBOL FERMATA;So;0;L;;;;;N;;;;;
+1D111;MUSICAL SYMBOL FERMATA BELOW;So;0;L;;;;;N;;;;;
+1D112;MUSICAL SYMBOL BREATH MARK;So;0;L;;;;;N;;;;;
+1D113;MUSICAL SYMBOL CAESURA;So;0;L;;;;;N;;;;;
+1D114;MUSICAL SYMBOL BRACE;So;0;L;;;;;N;;;;;
+1D115;MUSICAL SYMBOL BRACKET;So;0;L;;;;;N;;;;;
+1D116;MUSICAL SYMBOL ONE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D117;MUSICAL SYMBOL TWO-LINE STAFF;So;0;L;;;;;N;;;;;
+1D118;MUSICAL SYMBOL THREE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D119;MUSICAL SYMBOL FOUR-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11A;MUSICAL SYMBOL FIVE-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11B;MUSICAL SYMBOL SIX-LINE STAFF;So;0;L;;;;;N;;;;;
+1D11C;MUSICAL SYMBOL SIX-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11D;MUSICAL SYMBOL FOUR-STRING FRETBOARD;So;0;L;;;;;N;;;;;
+1D11E;MUSICAL SYMBOL G CLEF;So;0;L;;;;;N;;;;;
+1D11F;MUSICAL SYMBOL G CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D120;MUSICAL SYMBOL G CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D121;MUSICAL SYMBOL C CLEF;So;0;L;;;;;N;;;;;
+1D122;MUSICAL SYMBOL F CLEF;So;0;L;;;;;N;;;;;
+1D123;MUSICAL SYMBOL F CLEF OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D124;MUSICAL SYMBOL F CLEF OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D125;MUSICAL SYMBOL DRUM CLEF-1;So;0;L;;;;;N;;;;;
+1D126;MUSICAL SYMBOL DRUM CLEF-2;So;0;L;;;;;N;;;;;
+1D12A;MUSICAL SYMBOL DOUBLE SHARP;So;0;L;;;;;N;;;;;
+1D12B;MUSICAL SYMBOL DOUBLE FLAT;So;0;L;;;;;N;;;;;
+1D12C;MUSICAL SYMBOL FLAT UP;So;0;L;;;;;N;;;;;
+1D12D;MUSICAL SYMBOL FLAT DOWN;So;0;L;;;;;N;;;;;
+1D12E;MUSICAL SYMBOL NATURAL UP;So;0;L;;;;;N;;;;;
+1D12F;MUSICAL SYMBOL NATURAL DOWN;So;0;L;;;;;N;;;;;
+1D130;MUSICAL SYMBOL SHARP UP;So;0;L;;;;;N;;;;;
+1D131;MUSICAL SYMBOL SHARP DOWN;So;0;L;;;;;N;;;;;
+1D132;MUSICAL SYMBOL QUARTER TONE SHARP;So;0;L;;;;;N;;;;;
+1D133;MUSICAL SYMBOL QUARTER TONE FLAT;So;0;L;;;;;N;;;;;
+1D134;MUSICAL SYMBOL COMMON TIME;So;0;L;;;;;N;;;;;
+1D135;MUSICAL SYMBOL CUT TIME;So;0;L;;;;;N;;;;;
+1D136;MUSICAL SYMBOL OTTAVA ALTA;So;0;L;;;;;N;;;;;
+1D137;MUSICAL SYMBOL OTTAVA BASSA;So;0;L;;;;;N;;;;;
+1D138;MUSICAL SYMBOL QUINDICESIMA ALTA;So;0;L;;;;;N;;;;;
+1D139;MUSICAL SYMBOL QUINDICESIMA BASSA;So;0;L;;;;;N;;;;;
+1D13A;MUSICAL SYMBOL MULTI REST;So;0;L;;;;;N;;;;;
+1D13B;MUSICAL SYMBOL WHOLE REST;So;0;L;;;;;N;;;;;
+1D13C;MUSICAL SYMBOL HALF REST;So;0;L;;;;;N;;;;;
+1D13D;MUSICAL SYMBOL QUARTER REST;So;0;L;;;;;N;;;;;
+1D13E;MUSICAL SYMBOL EIGHTH REST;So;0;L;;;;;N;;;;;
+1D13F;MUSICAL SYMBOL SIXTEENTH REST;So;0;L;;;;;N;;;;;
+1D140;MUSICAL SYMBOL THIRTY-SECOND REST;So;0;L;;;;;N;;;;;
+1D141;MUSICAL SYMBOL SIXTY-FOURTH REST;So;0;L;;;;;N;;;;;
+1D142;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST;So;0;L;;;;;N;;;;;
+1D143;MUSICAL SYMBOL X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D144;MUSICAL SYMBOL PLUS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D145;MUSICAL SYMBOL CIRCLE X NOTEHEAD;So;0;L;;;;;N;;;;;
+1D146;MUSICAL SYMBOL SQUARE NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D147;MUSICAL SYMBOL SQUARE NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D148;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE;So;0;L;;;;;N;;;;;
+1D149;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK;So;0;L;;;;;N;;;;;
+1D14A;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE;So;0;L;;;;;N;;;;;
+1D14B;MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK;So;0;L;;;;;N;;;;;
+1D14C;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D14D;MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D14E;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D14F;MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D150;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE;So;0;L;;;;;N;;;;;
+1D151;MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK;So;0;L;;;;;N;;;;;
+1D152;MUSICAL SYMBOL MOON NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D153;MUSICAL SYMBOL MOON NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D154;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE;So;0;L;;;;;N;;;;;
+1D155;MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK;So;0;L;;;;;N;;;;;
+1D156;MUSICAL SYMBOL PARENTHESIS NOTEHEAD;So;0;L;;;;;N;;;;;
+1D157;MUSICAL SYMBOL VOID NOTEHEAD;So;0;L;;;;;N;;;;;
+1D158;MUSICAL SYMBOL NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D159;MUSICAL SYMBOL NULL NOTEHEAD;So;0;L;;;;;N;;;;;
+1D15A;MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE;So;0;L;;;;;N;;;;;
+1D15B;MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK;So;0;L;;;;;N;;;;;
+1D15C;MUSICAL SYMBOL BREVE;So;0;L;;;;;N;;;;;
+1D15D;MUSICAL SYMBOL WHOLE NOTE;So;0;L;;;;;N;;;;;
+1D15E;MUSICAL SYMBOL HALF NOTE;So;0;L;1D157 1D165;;;;N;;;;;
+1D15F;MUSICAL SYMBOL QUARTER NOTE;So;0;L;1D158 1D165;;;;N;;;;;
+1D160;MUSICAL SYMBOL EIGHTH NOTE;So;0;L;1D15F 1D16E;;;;N;;;;;
+1D161;MUSICAL SYMBOL SIXTEENTH NOTE;So;0;L;1D15F 1D16F;;;;N;;;;;
+1D162;MUSICAL SYMBOL THIRTY-SECOND NOTE;So;0;L;1D15F 1D170;;;;N;;;;;
+1D163;MUSICAL SYMBOL SIXTY-FOURTH NOTE;So;0;L;1D15F 1D171;;;;N;;;;;
+1D164;MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE;So;0;L;1D15F 1D172;;;;N;;;;;
+1D165;MUSICAL SYMBOL COMBINING STEM;Mc;216;L;;;;;N;;;;;
+1D166;MUSICAL SYMBOL COMBINING SPRECHGESANG STEM;Mc;216;L;;;;;N;;;;;
+1D167;MUSICAL SYMBOL COMBINING TREMOLO-1;Mn;1;NSM;;;;;N;;;;;
+1D168;MUSICAL SYMBOL COMBINING TREMOLO-2;Mn;1;NSM;;;;;N;;;;;
+1D169;MUSICAL SYMBOL COMBINING TREMOLO-3;Mn;1;NSM;;;;;N;;;;;
+1D16A;MUSICAL SYMBOL FINGERED TREMOLO-1;So;0;L;;;;;N;;;;;
+1D16B;MUSICAL SYMBOL FINGERED TREMOLO-2;So;0;L;;;;;N;;;;;
+1D16C;MUSICAL SYMBOL FINGERED TREMOLO-3;So;0;L;;;;;N;;;;;
+1D16D;MUSICAL SYMBOL COMBINING AUGMENTATION DOT;Mc;226;L;;;;;N;;;;;
+1D16E;MUSICAL SYMBOL COMBINING FLAG-1;Mc;216;L;;;;;N;;;;;
+1D16F;MUSICAL SYMBOL COMBINING FLAG-2;Mc;216;L;;;;;N;;;;;
+1D170;MUSICAL SYMBOL COMBINING FLAG-3;Mc;216;L;;;;;N;;;;;
+1D171;MUSICAL SYMBOL COMBINING FLAG-4;Mc;216;L;;;;;N;;;;;
+1D172;MUSICAL SYMBOL COMBINING FLAG-5;Mc;216;L;;;;;N;;;;;
+1D173;MUSICAL SYMBOL BEGIN BEAM;Cf;0;BN;;;;;N;;;;;
+1D174;MUSICAL SYMBOL END BEAM;Cf;0;BN;;;;;N;;;;;
+1D175;MUSICAL SYMBOL BEGIN TIE;Cf;0;BN;;;;;N;;;;;
+1D176;MUSICAL SYMBOL END TIE;Cf;0;BN;;;;;N;;;;;
+1D177;MUSICAL SYMBOL BEGIN SLUR;Cf;0;BN;;;;;N;;;;;
+1D178;MUSICAL SYMBOL END SLUR;Cf;0;BN;;;;;N;;;;;
+1D179;MUSICAL SYMBOL BEGIN PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17A;MUSICAL SYMBOL END PHRASE;Cf;0;BN;;;;;N;;;;;
+1D17B;MUSICAL SYMBOL COMBINING ACCENT;Mn;220;NSM;;;;;N;;;;;
+1D17C;MUSICAL SYMBOL COMBINING STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D17D;MUSICAL SYMBOL COMBINING TENUTO;Mn;220;NSM;;;;;N;;;;;
+1D17E;MUSICAL SYMBOL COMBINING STACCATISSIMO;Mn;220;NSM;;;;;N;;;;;
+1D17F;MUSICAL SYMBOL COMBINING MARCATO;Mn;220;NSM;;;;;N;;;;;
+1D180;MUSICAL SYMBOL COMBINING MARCATO-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D181;MUSICAL SYMBOL COMBINING ACCENT-STACCATO;Mn;220;NSM;;;;;N;;;;;
+1D182;MUSICAL SYMBOL COMBINING LOURE;Mn;220;NSM;;;;;N;;;;;
+1D183;MUSICAL SYMBOL ARPEGGIATO UP;So;0;L;;;;;N;;;;;
+1D184;MUSICAL SYMBOL ARPEGGIATO DOWN;So;0;L;;;;;N;;;;;
+1D185;MUSICAL SYMBOL COMBINING DOIT;Mn;230;NSM;;;;;N;;;;;
+1D186;MUSICAL SYMBOL COMBINING RIP;Mn;230;NSM;;;;;N;;;;;
+1D187;MUSICAL SYMBOL COMBINING FLIP;Mn;230;NSM;;;;;N;;;;;
+1D188;MUSICAL SYMBOL COMBINING SMEAR;Mn;230;NSM;;;;;N;;;;;
+1D189;MUSICAL SYMBOL COMBINING BEND;Mn;230;NSM;;;;;N;;;;;
+1D18A;MUSICAL SYMBOL COMBINING DOUBLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18B;MUSICAL SYMBOL COMBINING TRIPLE TONGUE;Mn;220;NSM;;;;;N;;;;;
+1D18C;MUSICAL SYMBOL RINFORZANDO;So;0;L;;;;;N;;;;;
+1D18D;MUSICAL SYMBOL SUBITO;So;0;L;;;;;N;;;;;
+1D18E;MUSICAL SYMBOL Z;So;0;L;;;;;N;;;;;
+1D18F;MUSICAL SYMBOL PIANO;So;0;L;;;;;N;;;;;
+1D190;MUSICAL SYMBOL MEZZO;So;0;L;;;;;N;;;;;
+1D191;MUSICAL SYMBOL FORTE;So;0;L;;;;;N;;;;;
+1D192;MUSICAL SYMBOL CRESCENDO;So;0;L;;;;;N;;;;;
+1D193;MUSICAL SYMBOL DECRESCENDO;So;0;L;;;;;N;;;;;
+1D194;MUSICAL SYMBOL GRACE NOTE SLASH;So;0;L;;;;;N;;;;;
+1D195;MUSICAL SYMBOL GRACE NOTE NO SLASH;So;0;L;;;;;N;;;;;
+1D196;MUSICAL SYMBOL TR;So;0;L;;;;;N;;;;;
+1D197;MUSICAL SYMBOL TURN;So;0;L;;;;;N;;;;;
+1D198;MUSICAL SYMBOL INVERTED TURN;So;0;L;;;;;N;;;;;
+1D199;MUSICAL SYMBOL TURN SLASH;So;0;L;;;;;N;;;;;
+1D19A;MUSICAL SYMBOL TURN UP;So;0;L;;;;;N;;;;;
+1D19B;MUSICAL SYMBOL ORNAMENT STROKE-1;So;0;L;;;;;N;;;;;
+1D19C;MUSICAL SYMBOL ORNAMENT STROKE-2;So;0;L;;;;;N;;;;;
+1D19D;MUSICAL SYMBOL ORNAMENT STROKE-3;So;0;L;;;;;N;;;;;
+1D19E;MUSICAL SYMBOL ORNAMENT STROKE-4;So;0;L;;;;;N;;;;;
+1D19F;MUSICAL SYMBOL ORNAMENT STROKE-5;So;0;L;;;;;N;;;;;
+1D1A0;MUSICAL SYMBOL ORNAMENT STROKE-6;So;0;L;;;;;N;;;;;
+1D1A1;MUSICAL SYMBOL ORNAMENT STROKE-7;So;0;L;;;;;N;;;;;
+1D1A2;MUSICAL SYMBOL ORNAMENT STROKE-8;So;0;L;;;;;N;;;;;
+1D1A3;MUSICAL SYMBOL ORNAMENT STROKE-9;So;0;L;;;;;N;;;;;
+1D1A4;MUSICAL SYMBOL ORNAMENT STROKE-10;So;0;L;;;;;N;;;;;
+1D1A5;MUSICAL SYMBOL ORNAMENT STROKE-11;So;0;L;;;;;N;;;;;
+1D1A6;MUSICAL SYMBOL HAUPTSTIMME;So;0;L;;;;;N;;;;;
+1D1A7;MUSICAL SYMBOL NEBENSTIMME;So;0;L;;;;;N;;;;;
+1D1A8;MUSICAL SYMBOL END OF STIMME;So;0;L;;;;;N;;;;;
+1D1A9;MUSICAL SYMBOL DEGREE SLASH;So;0;L;;;;;N;;;;;
+1D1AA;MUSICAL SYMBOL COMBINING DOWN BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AB;MUSICAL SYMBOL COMBINING UP BOW;Mn;230;NSM;;;;;N;;;;;
+1D1AC;MUSICAL SYMBOL COMBINING HARMONIC;Mn;230;NSM;;;;;N;;;;;
+1D1AD;MUSICAL SYMBOL COMBINING SNAP PIZZICATO;Mn;230;NSM;;;;;N;;;;;
+1D1AE;MUSICAL SYMBOL PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1AF;MUSICAL SYMBOL PEDAL UP MARK;So;0;L;;;;;N;;;;;
+1D1B0;MUSICAL SYMBOL HALF PEDAL MARK;So;0;L;;;;;N;;;;;
+1D1B1;MUSICAL SYMBOL GLISSANDO UP;So;0;L;;;;;N;;;;;
+1D1B2;MUSICAL SYMBOL GLISSANDO DOWN;So;0;L;;;;;N;;;;;
+1D1B3;MUSICAL SYMBOL WITH FINGERNAILS;So;0;L;;;;;N;;;;;
+1D1B4;MUSICAL SYMBOL DAMP;So;0;L;;;;;N;;;;;
+1D1B5;MUSICAL SYMBOL DAMP ALL;So;0;L;;;;;N;;;;;
+1D1B6;MUSICAL SYMBOL MAXIMA;So;0;L;;;;;N;;;;;
+1D1B7;MUSICAL SYMBOL LONGA;So;0;L;;;;;N;;;;;
+1D1B8;MUSICAL SYMBOL BREVIS;So;0;L;;;;;N;;;;;
+1D1B9;MUSICAL SYMBOL SEMIBREVIS WHITE;So;0;L;;;;;N;;;;;
+1D1BA;MUSICAL SYMBOL SEMIBREVIS BLACK;So;0;L;;;;;N;;;;;
+1D1BB;MUSICAL SYMBOL MINIMA;So;0;L;1D1B9 1D165;;;;N;;;;;
+1D1BC;MUSICAL SYMBOL MINIMA BLACK;So;0;L;1D1BA 1D165;;;;N;;;;;
+1D1BD;MUSICAL SYMBOL SEMIMINIMA WHITE;So;0;L;1D1BB 1D16E;;;;N;;;;;
+1D1BE;MUSICAL SYMBOL SEMIMINIMA BLACK;So;0;L;1D1BC 1D16E;;;;N;;;;;
+1D1BF;MUSICAL SYMBOL FUSA WHITE;So;0;L;1D1BB 1D16F;;;;N;;;;;
+1D1C0;MUSICAL SYMBOL FUSA BLACK;So;0;L;1D1BC 1D16F;;;;N;;;;;
+1D1C1;MUSICAL SYMBOL LONGA PERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C2;MUSICAL SYMBOL LONGA IMPERFECTA REST;So;0;L;;;;;N;;;;;
+1D1C3;MUSICAL SYMBOL BREVIS REST;So;0;L;;;;;N;;;;;
+1D1C4;MUSICAL SYMBOL SEMIBREVIS REST;So;0;L;;;;;N;;;;;
+1D1C5;MUSICAL SYMBOL MINIMA REST;So;0;L;;;;;N;;;;;
+1D1C6;MUSICAL SYMBOL SEMIMINIMA REST;So;0;L;;;;;N;;;;;
+1D1C7;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1C8;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1C9;MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CA;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA;So;0;L;;;;;N;;;;;
+1D1CB;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA;So;0;L;;;;;N;;;;;
+1D1CC;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1;So;0;L;;;;;N;;;;;
+1D1CD;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2;So;0;L;;;;;N;;;;;
+1D1CE;MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3;So;0;L;;;;;N;;;;;
+1D1CF;MUSICAL SYMBOL CROIX;So;0;L;;;;;N;;;;;
+1D1D0;MUSICAL SYMBOL GREGORIAN C CLEF;So;0;L;;;;;N;;;;;
+1D1D1;MUSICAL SYMBOL GREGORIAN F CLEF;So;0;L;;;;;N;;;;;
+1D1D2;MUSICAL SYMBOL SQUARE B;So;0;L;;;;;N;;;;;
+1D1D3;MUSICAL SYMBOL VIRGA;So;0;L;;;;;N;;;;;
+1D1D4;MUSICAL SYMBOL PODATUS;So;0;L;;;;;N;;;;;
+1D1D5;MUSICAL SYMBOL CLIVIS;So;0;L;;;;;N;;;;;
+1D1D6;MUSICAL SYMBOL SCANDICUS;So;0;L;;;;;N;;;;;
+1D1D7;MUSICAL SYMBOL CLIMACUS;So;0;L;;;;;N;;;;;
+1D1D8;MUSICAL SYMBOL TORCULUS;So;0;L;;;;;N;;;;;
+1D1D9;MUSICAL SYMBOL PORRECTUS;So;0;L;;;;;N;;;;;
+1D1DA;MUSICAL SYMBOL PORRECTUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DB;MUSICAL SYMBOL SCANDICUS FLEXUS;So;0;L;;;;;N;;;;;
+1D1DC;MUSICAL SYMBOL TORCULUS RESUPINUS;So;0;L;;;;;N;;;;;
+1D1DD;MUSICAL SYMBOL PES SUBPUNCTIS;So;0;L;;;;;N;;;;;
+1D200;GREEK VOCAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D201;GREEK VOCAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D202;GREEK VOCAL NOTATION SYMBOL-3;So;0;ON;;;;;N;;;;;
+1D203;GREEK VOCAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D204;GREEK VOCAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D205;GREEK VOCAL NOTATION SYMBOL-6;So;0;ON;;;;;N;;;;;
+1D206;GREEK VOCAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D207;GREEK VOCAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D208;GREEK VOCAL NOTATION SYMBOL-9;So;0;ON;;;;;N;;;;;
+1D209;GREEK VOCAL NOTATION SYMBOL-10;So;0;ON;;;;;N;;;;;
+1D20A;GREEK VOCAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D20B;GREEK VOCAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D20C;GREEK VOCAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D20D;GREEK VOCAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D20E;GREEK VOCAL NOTATION SYMBOL-15;So;0;ON;;;;;N;;;;;
+1D20F;GREEK VOCAL NOTATION SYMBOL-16;So;0;ON;;;;;N;;;;;
+1D210;GREEK VOCAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D211;GREEK VOCAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D212;GREEK VOCAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D213;GREEK VOCAL NOTATION SYMBOL-20;So;0;ON;;;;;N;;;;;
+1D214;GREEK VOCAL NOTATION SYMBOL-21;So;0;ON;;;;;N;;;;;
+1D215;GREEK VOCAL NOTATION SYMBOL-22;So;0;ON;;;;;N;;;;;
+1D216;GREEK VOCAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D217;GREEK VOCAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D218;GREEK VOCAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D219;GREEK VOCAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D21A;GREEK VOCAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D21B;GREEK VOCAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D21C;GREEK VOCAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D21D;GREEK INSTRUMENTAL NOTATION SYMBOL-1;So;0;ON;;;;;N;;;;;
+1D21E;GREEK INSTRUMENTAL NOTATION SYMBOL-2;So;0;ON;;;;;N;;;;;
+1D21F;GREEK INSTRUMENTAL NOTATION SYMBOL-4;So;0;ON;;;;;N;;;;;
+1D220;GREEK INSTRUMENTAL NOTATION SYMBOL-5;So;0;ON;;;;;N;;;;;
+1D221;GREEK INSTRUMENTAL NOTATION SYMBOL-7;So;0;ON;;;;;N;;;;;
+1D222;GREEK INSTRUMENTAL NOTATION SYMBOL-8;So;0;ON;;;;;N;;;;;
+1D223;GREEK INSTRUMENTAL NOTATION SYMBOL-11;So;0;ON;;;;;N;;;;;
+1D224;GREEK INSTRUMENTAL NOTATION SYMBOL-12;So;0;ON;;;;;N;;;;;
+1D225;GREEK INSTRUMENTAL NOTATION SYMBOL-13;So;0;ON;;;;;N;;;;;
+1D226;GREEK INSTRUMENTAL NOTATION SYMBOL-14;So;0;ON;;;;;N;;;;;
+1D227;GREEK INSTRUMENTAL NOTATION SYMBOL-17;So;0;ON;;;;;N;;;;;
+1D228;GREEK INSTRUMENTAL NOTATION SYMBOL-18;So;0;ON;;;;;N;;;;;
+1D229;GREEK INSTRUMENTAL NOTATION SYMBOL-19;So;0;ON;;;;;N;;;;;
+1D22A;GREEK INSTRUMENTAL NOTATION SYMBOL-23;So;0;ON;;;;;N;;;;;
+1D22B;GREEK INSTRUMENTAL NOTATION SYMBOL-24;So;0;ON;;;;;N;;;;;
+1D22C;GREEK INSTRUMENTAL NOTATION SYMBOL-25;So;0;ON;;;;;N;;;;;
+1D22D;GREEK INSTRUMENTAL NOTATION SYMBOL-26;So;0;ON;;;;;N;;;;;
+1D22E;GREEK INSTRUMENTAL NOTATION SYMBOL-27;So;0;ON;;;;;N;;;;;
+1D22F;GREEK INSTRUMENTAL NOTATION SYMBOL-29;So;0;ON;;;;;N;;;;;
+1D230;GREEK INSTRUMENTAL NOTATION SYMBOL-30;So;0;ON;;;;;N;;;;;
+1D231;GREEK INSTRUMENTAL NOTATION SYMBOL-32;So;0;ON;;;;;N;;;;;
+1D232;GREEK INSTRUMENTAL NOTATION SYMBOL-36;So;0;ON;;;;;N;;;;;
+1D233;GREEK INSTRUMENTAL NOTATION SYMBOL-37;So;0;ON;;;;;N;;;;;
+1D234;GREEK INSTRUMENTAL NOTATION SYMBOL-38;So;0;ON;;;;;N;;;;;
+1D235;GREEK INSTRUMENTAL NOTATION SYMBOL-39;So;0;ON;;;;;N;;;;;
+1D236;GREEK INSTRUMENTAL NOTATION SYMBOL-40;So;0;ON;;;;;N;;;;;
+1D237;GREEK INSTRUMENTAL NOTATION SYMBOL-42;So;0;ON;;;;;N;;;;;
+1D238;GREEK INSTRUMENTAL NOTATION SYMBOL-43;So;0;ON;;;;;N;;;;;
+1D239;GREEK INSTRUMENTAL NOTATION SYMBOL-45;So;0;ON;;;;;N;;;;;
+1D23A;GREEK INSTRUMENTAL NOTATION SYMBOL-47;So;0;ON;;;;;N;;;;;
+1D23B;GREEK INSTRUMENTAL NOTATION SYMBOL-48;So;0;ON;;;;;N;;;;;
+1D23C;GREEK INSTRUMENTAL NOTATION SYMBOL-49;So;0;ON;;;;;N;;;;;
+1D23D;GREEK INSTRUMENTAL NOTATION SYMBOL-50;So;0;ON;;;;;N;;;;;
+1D23E;GREEK INSTRUMENTAL NOTATION SYMBOL-51;So;0;ON;;;;;N;;;;;
+1D23F;GREEK INSTRUMENTAL NOTATION SYMBOL-52;So;0;ON;;;;;N;;;;;
+1D240;GREEK INSTRUMENTAL NOTATION SYMBOL-53;So;0;ON;;;;;N;;;;;
+1D241;GREEK INSTRUMENTAL NOTATION SYMBOL-54;So;0;ON;;;;;N;;;;;
+1D242;COMBINING GREEK MUSICAL TRISEME;Mn;230;NSM;;;;;N;;;;;
+1D243;COMBINING GREEK MUSICAL TETRASEME;Mn;230;NSM;;;;;N;;;;;
+1D244;COMBINING GREEK MUSICAL PENTASEME;Mn;230;NSM;;;;;N;;;;;
+1D245;GREEK MUSICAL LEIMMA;So;0;ON;;;;;N;;;;;
+1D300;MONOGRAM FOR EARTH;So;0;ON;;;;;N;;ren *;;;
+1D301;DIGRAM FOR HEAVENLY EARTH;So;0;ON;;;;;N;;tian ren *;;;
+1D302;DIGRAM FOR HUMAN EARTH;So;0;ON;;;;;N;;di ren *;;;
+1D303;DIGRAM FOR EARTHLY HEAVEN;So;0;ON;;;;;N;;ren tian *;;;
+1D304;DIGRAM FOR EARTHLY HUMAN;So;0;ON;;;;;N;;ren di *;;;
+1D305;DIGRAM FOR EARTH;So;0;ON;;;;;N;;ren ren *;;;
+1D306;TETRAGRAM FOR CENTRE;So;0;ON;;;;;N;;;;;
+1D307;TETRAGRAM FOR FULL CIRCLE;So;0;ON;;;;;N;;;;;
+1D308;TETRAGRAM FOR MIRED;So;0;ON;;;;;N;;;;;
+1D309;TETRAGRAM FOR BARRIER;So;0;ON;;;;;N;;;;;
+1D30A;TETRAGRAM FOR KEEPING SMALL;So;0;ON;;;;;N;;;;;
+1D30B;TETRAGRAM FOR CONTRARIETY;So;0;ON;;;;;N;;;;;
+1D30C;TETRAGRAM FOR ASCENT;So;0;ON;;;;;N;;;;;
+1D30D;TETRAGRAM FOR OPPOSITION;So;0;ON;;;;;N;;;;;
+1D30E;TETRAGRAM FOR BRANCHING OUT;So;0;ON;;;;;N;;;;;
+1D30F;TETRAGRAM FOR DEFECTIVENESS OR DISTORTION;So;0;ON;;;;;N;;;;;
+1D310;TETRAGRAM FOR DIVERGENCE;So;0;ON;;;;;N;;;;;
+1D311;TETRAGRAM FOR YOUTHFULNESS;So;0;ON;;;;;N;;;;;
+1D312;TETRAGRAM FOR INCREASE;So;0;ON;;;;;N;;;;;
+1D313;TETRAGRAM FOR PENETRATION;So;0;ON;;;;;N;;;;;
+1D314;TETRAGRAM FOR REACH;So;0;ON;;;;;N;;;;;
+1D315;TETRAGRAM FOR CONTACT;So;0;ON;;;;;N;;;;;
+1D316;TETRAGRAM FOR HOLDING BACK;So;0;ON;;;;;N;;;;;
+1D317;TETRAGRAM FOR WAITING;So;0;ON;;;;;N;;;;;
+1D318;TETRAGRAM FOR FOLLOWING;So;0;ON;;;;;N;;;;;
+1D319;TETRAGRAM FOR ADVANCE;So;0;ON;;;;;N;;;;;
+1D31A;TETRAGRAM FOR RELEASE;So;0;ON;;;;;N;;;;;
+1D31B;TETRAGRAM FOR RESISTANCE;So;0;ON;;;;;N;;;;;
+1D31C;TETRAGRAM FOR EASE;So;0;ON;;;;;N;;;;;
+1D31D;TETRAGRAM FOR JOY;So;0;ON;;;;;N;;;;;
+1D31E;TETRAGRAM FOR CONTENTION;So;0;ON;;;;;N;;;;;
+1D31F;TETRAGRAM FOR ENDEAVOUR;So;0;ON;;;;;N;;;;;
+1D320;TETRAGRAM FOR DUTIES;So;0;ON;;;;;N;;;;;
+1D321;TETRAGRAM FOR CHANGE;So;0;ON;;;;;N;;;;;
+1D322;TETRAGRAM FOR DECISIVENESS;So;0;ON;;;;;N;;;;;
+1D323;TETRAGRAM FOR BOLD RESOLUTION;So;0;ON;;;;;N;;;;;
+1D324;TETRAGRAM FOR PACKING;So;0;ON;;;;;N;;;;;
+1D325;TETRAGRAM FOR LEGION;So;0;ON;;;;;N;;;;;
+1D326;TETRAGRAM FOR CLOSENESS;So;0;ON;;;;;N;;;;;
+1D327;TETRAGRAM FOR KINSHIP;So;0;ON;;;;;N;;;;;
+1D328;TETRAGRAM FOR GATHERING;So;0;ON;;;;;N;;;;;
+1D329;TETRAGRAM FOR STRENGTH;So;0;ON;;;;;N;;;;;
+1D32A;TETRAGRAM FOR PURITY;So;0;ON;;;;;N;;;;;
+1D32B;TETRAGRAM FOR FULLNESS;So;0;ON;;;;;N;;;;;
+1D32C;TETRAGRAM FOR RESIDENCE;So;0;ON;;;;;N;;;;;
+1D32D;TETRAGRAM FOR LAW OR MODEL;So;0;ON;;;;;N;;;;;
+1D32E;TETRAGRAM FOR RESPONSE;So;0;ON;;;;;N;;;;;
+1D32F;TETRAGRAM FOR GOING TO MEET;So;0;ON;;;;;N;;;;;
+1D330;TETRAGRAM FOR ENCOUNTERS;So;0;ON;;;;;N;;;;;
+1D331;TETRAGRAM FOR STOVE;So;0;ON;;;;;N;;;;;
+1D332;TETRAGRAM FOR GREATNESS;So;0;ON;;;;;N;;;;;
+1D333;TETRAGRAM FOR ENLARGEMENT;So;0;ON;;;;;N;;;;;
+1D334;TETRAGRAM FOR PATTERN;So;0;ON;;;;;N;;;;;
+1D335;TETRAGRAM FOR RITUAL;So;0;ON;;;;;N;;;;;
+1D336;TETRAGRAM FOR FLIGHT;So;0;ON;;;;;N;;;;;
+1D337;TETRAGRAM FOR VASTNESS OR WASTING;So;0;ON;;;;;N;;;;;
+1D338;TETRAGRAM FOR CONSTANCY;So;0;ON;;;;;N;;;;;
+1D339;TETRAGRAM FOR MEASURE;So;0;ON;;;;;N;;;;;
+1D33A;TETRAGRAM FOR ETERNITY;So;0;ON;;;;;N;;;;;
+1D33B;TETRAGRAM FOR UNITY;So;0;ON;;;;;N;;;;;
+1D33C;TETRAGRAM FOR DIMINISHMENT;So;0;ON;;;;;N;;;;;
+1D33D;TETRAGRAM FOR CLOSED MOUTH;So;0;ON;;;;;N;;;;;
+1D33E;TETRAGRAM FOR GUARDEDNESS;So;0;ON;;;;;N;;;;;
+1D33F;TETRAGRAM FOR GATHERING IN;So;0;ON;;;;;N;;;;;
+1D340;TETRAGRAM FOR MASSING;So;0;ON;;;;;N;;;;;
+1D341;TETRAGRAM FOR ACCUMULATION;So;0;ON;;;;;N;;;;;
+1D342;TETRAGRAM FOR EMBELLISHMENT;So;0;ON;;;;;N;;;;;
+1D343;TETRAGRAM FOR DOUBT;So;0;ON;;;;;N;;;;;
+1D344;TETRAGRAM FOR WATCH;So;0;ON;;;;;N;;;;;
+1D345;TETRAGRAM FOR SINKING;So;0;ON;;;;;N;;;;;
+1D346;TETRAGRAM FOR INNER;So;0;ON;;;;;N;;;;;
+1D347;TETRAGRAM FOR DEPARTURE;So;0;ON;;;;;N;;;;;
+1D348;TETRAGRAM FOR DARKENING;So;0;ON;;;;;N;;;;;
+1D349;TETRAGRAM FOR DIMMING;So;0;ON;;;;;N;;;;;
+1D34A;TETRAGRAM FOR EXHAUSTION;So;0;ON;;;;;N;;;;;
+1D34B;TETRAGRAM FOR SEVERANCE;So;0;ON;;;;;N;;;;;
+1D34C;TETRAGRAM FOR STOPPAGE;So;0;ON;;;;;N;;;;;
+1D34D;TETRAGRAM FOR HARDNESS;So;0;ON;;;;;N;;;;;
+1D34E;TETRAGRAM FOR COMPLETION;So;0;ON;;;;;N;;;;;
+1D34F;TETRAGRAM FOR CLOSURE;So;0;ON;;;;;N;;;;;
+1D350;TETRAGRAM FOR FAILURE;So;0;ON;;;;;N;;;;;
+1D351;TETRAGRAM FOR AGGRAVATION;So;0;ON;;;;;N;;;;;
+1D352;TETRAGRAM FOR COMPLIANCE;So;0;ON;;;;;N;;;;;
+1D353;TETRAGRAM FOR ON THE VERGE;So;0;ON;;;;;N;;;;;
+1D354;TETRAGRAM FOR DIFFICULTIES;So;0;ON;;;;;N;;;;;
+1D355;TETRAGRAM FOR LABOURING;So;0;ON;;;;;N;;;;;
+1D356;TETRAGRAM FOR FOSTERING;So;0;ON;;;;;N;;;;;
+1D360;COUNTING ROD UNIT DIGIT ONE;No;0;L;;;;1;N;;;;;
+1D361;COUNTING ROD UNIT DIGIT TWO;No;0;L;;;;2;N;;;;;
+1D362;COUNTING ROD UNIT DIGIT THREE;No;0;L;;;;3;N;;;;;
+1D363;COUNTING ROD UNIT DIGIT FOUR;No;0;L;;;;4;N;;;;;
+1D364;COUNTING ROD UNIT DIGIT FIVE;No;0;L;;;;5;N;;;;;
+1D365;COUNTING ROD UNIT DIGIT SIX;No;0;L;;;;6;N;;;;;
+1D366;COUNTING ROD UNIT DIGIT SEVEN;No;0;L;;;;7;N;;;;;
+1D367;COUNTING ROD UNIT DIGIT EIGHT;No;0;L;;;;8;N;;;;;
+1D368;COUNTING ROD UNIT DIGIT NINE;No;0;L;;;;9;N;;;;;
+1D369;COUNTING ROD TENS DIGIT ONE;No;0;L;;;;10;N;;;;;
+1D36A;COUNTING ROD TENS DIGIT TWO;No;0;L;;;;20;N;;;;;
+1D36B;COUNTING ROD TENS DIGIT THREE;No;0;L;;;;30;N;;;;;
+1D36C;COUNTING ROD TENS DIGIT FOUR;No;0;L;;;;40;N;;;;;
+1D36D;COUNTING ROD TENS DIGIT FIVE;No;0;L;;;;50;N;;;;;
+1D36E;COUNTING ROD TENS DIGIT SIX;No;0;L;;;;60;N;;;;;
+1D36F;COUNTING ROD TENS DIGIT SEVEN;No;0;L;;;;70;N;;;;;
+1D370;COUNTING ROD TENS DIGIT EIGHT;No;0;L;;;;80;N;;;;;
+1D371;COUNTING ROD TENS DIGIT NINE;No;0;L;;;;90;N;;;;;
+1D400;MATHEMATICAL BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D401;MATHEMATICAL BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D402;MATHEMATICAL BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D403;MATHEMATICAL BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D404;MATHEMATICAL BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D405;MATHEMATICAL BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D406;MATHEMATICAL BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D407;MATHEMATICAL BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D408;MATHEMATICAL BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D409;MATHEMATICAL BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D40A;MATHEMATICAL BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D40B;MATHEMATICAL BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D40C;MATHEMATICAL BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D40D;MATHEMATICAL BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D40E;MATHEMATICAL BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D40F;MATHEMATICAL BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D410;MATHEMATICAL BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D411;MATHEMATICAL BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D412;MATHEMATICAL BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D413;MATHEMATICAL BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D414;MATHEMATICAL BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D415;MATHEMATICAL BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D416;MATHEMATICAL BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D417;MATHEMATICAL BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D418;MATHEMATICAL BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D419;MATHEMATICAL BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D41A;MATHEMATICAL BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D41B;MATHEMATICAL BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D41C;MATHEMATICAL BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D41D;MATHEMATICAL BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D41E;MATHEMATICAL BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D41F;MATHEMATICAL BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D420;MATHEMATICAL BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D421;MATHEMATICAL BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D422;MATHEMATICAL BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D423;MATHEMATICAL BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D424;MATHEMATICAL BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D425;MATHEMATICAL BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D426;MATHEMATICAL BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D427;MATHEMATICAL BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D428;MATHEMATICAL BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D429;MATHEMATICAL BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D42A;MATHEMATICAL BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D42B;MATHEMATICAL BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D42C;MATHEMATICAL BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D42D;MATHEMATICAL BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D42E;MATHEMATICAL BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D42F;MATHEMATICAL BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D430;MATHEMATICAL BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D431;MATHEMATICAL BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D432;MATHEMATICAL BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D433;MATHEMATICAL BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D434;MATHEMATICAL ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D435;MATHEMATICAL ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D436;MATHEMATICAL ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D437;MATHEMATICAL ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D438;MATHEMATICAL ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D439;MATHEMATICAL ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D43A;MATHEMATICAL ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D43B;MATHEMATICAL ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D43C;MATHEMATICAL ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D43D;MATHEMATICAL ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D43E;MATHEMATICAL ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D43F;MATHEMATICAL ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D440;MATHEMATICAL ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D441;MATHEMATICAL ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D442;MATHEMATICAL ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D443;MATHEMATICAL ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D444;MATHEMATICAL ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D445;MATHEMATICAL ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D446;MATHEMATICAL ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D447;MATHEMATICAL ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D448;MATHEMATICAL ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D449;MATHEMATICAL ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D44A;MATHEMATICAL ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D44B;MATHEMATICAL ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D44C;MATHEMATICAL ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D44D;MATHEMATICAL ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D44E;MATHEMATICAL ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D44F;MATHEMATICAL ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D450;MATHEMATICAL ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D451;MATHEMATICAL ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D452;MATHEMATICAL ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D453;MATHEMATICAL ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D454;MATHEMATICAL ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D456;MATHEMATICAL ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D457;MATHEMATICAL ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D458;MATHEMATICAL ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D459;MATHEMATICAL ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D45A;MATHEMATICAL ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D45B;MATHEMATICAL ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D45C;MATHEMATICAL ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D45D;MATHEMATICAL ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D45E;MATHEMATICAL ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D45F;MATHEMATICAL ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D460;MATHEMATICAL ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D461;MATHEMATICAL ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D462;MATHEMATICAL ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D463;MATHEMATICAL ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D464;MATHEMATICAL ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D465;MATHEMATICAL ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D466;MATHEMATICAL ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D467;MATHEMATICAL ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D468;MATHEMATICAL BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D469;MATHEMATICAL BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D46A;MATHEMATICAL BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D46B;MATHEMATICAL BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D46C;MATHEMATICAL BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D46D;MATHEMATICAL BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D46E;MATHEMATICAL BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D46F;MATHEMATICAL BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D470;MATHEMATICAL BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D471;MATHEMATICAL BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D472;MATHEMATICAL BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D473;MATHEMATICAL BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D474;MATHEMATICAL BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D475;MATHEMATICAL BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D476;MATHEMATICAL BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D477;MATHEMATICAL BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D478;MATHEMATICAL BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D479;MATHEMATICAL BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D47A;MATHEMATICAL BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D47B;MATHEMATICAL BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D47C;MATHEMATICAL BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D47D;MATHEMATICAL BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D47E;MATHEMATICAL BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D47F;MATHEMATICAL BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D480;MATHEMATICAL BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D481;MATHEMATICAL BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D482;MATHEMATICAL BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D483;MATHEMATICAL BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D484;MATHEMATICAL BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D485;MATHEMATICAL BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D486;MATHEMATICAL BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D487;MATHEMATICAL BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D488;MATHEMATICAL BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D489;MATHEMATICAL BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D48A;MATHEMATICAL BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D48B;MATHEMATICAL BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D48C;MATHEMATICAL BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D48D;MATHEMATICAL BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D48E;MATHEMATICAL BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D48F;MATHEMATICAL BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D490;MATHEMATICAL BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D491;MATHEMATICAL BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D492;MATHEMATICAL BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D493;MATHEMATICAL BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D494;MATHEMATICAL BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D495;MATHEMATICAL BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D496;MATHEMATICAL BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D497;MATHEMATICAL BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D498;MATHEMATICAL BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D499;MATHEMATICAL BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D49A;MATHEMATICAL BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D49B;MATHEMATICAL BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D49C;MATHEMATICAL SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D49E;MATHEMATICAL SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D49F;MATHEMATICAL SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4A2;MATHEMATICAL SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4A5;MATHEMATICAL SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4A6;MATHEMATICAL SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4A9;MATHEMATICAL SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4AA;MATHEMATICAL SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4AB;MATHEMATICAL SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4AC;MATHEMATICAL SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4AE;MATHEMATICAL SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4AF;MATHEMATICAL SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4B0;MATHEMATICAL SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4B1;MATHEMATICAL SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4B2;MATHEMATICAL SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4B3;MATHEMATICAL SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4B4;MATHEMATICAL SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4B5;MATHEMATICAL SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4B6;MATHEMATICAL SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4B7;MATHEMATICAL SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4B8;MATHEMATICAL SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4B9;MATHEMATICAL SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4BB;MATHEMATICAL SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4BD;MATHEMATICAL SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4BE;MATHEMATICAL SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4BF;MATHEMATICAL SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4C0;MATHEMATICAL SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4C1;MATHEMATICAL SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4C2;MATHEMATICAL SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4C3;MATHEMATICAL SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4C5;MATHEMATICAL SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4C6;MATHEMATICAL SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4C7;MATHEMATICAL SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4C8;MATHEMATICAL SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4C9;MATHEMATICAL SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4CA;MATHEMATICAL SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4CB;MATHEMATICAL SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D4CC;MATHEMATICAL SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D4CD;MATHEMATICAL SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D4CE;MATHEMATICAL SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D4CF;MATHEMATICAL SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D4D0;MATHEMATICAL BOLD SCRIPT CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D4D1;MATHEMATICAL BOLD SCRIPT CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D4D2;MATHEMATICAL BOLD SCRIPT CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D4D3;MATHEMATICAL BOLD SCRIPT CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D4D4;MATHEMATICAL BOLD SCRIPT CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D4D5;MATHEMATICAL BOLD SCRIPT CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D4D6;MATHEMATICAL BOLD SCRIPT CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D4D7;MATHEMATICAL BOLD SCRIPT CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D4D8;MATHEMATICAL BOLD SCRIPT CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D4D9;MATHEMATICAL BOLD SCRIPT CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D4DA;MATHEMATICAL BOLD SCRIPT CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D4DB;MATHEMATICAL BOLD SCRIPT CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D4DC;MATHEMATICAL BOLD SCRIPT CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D4DD;MATHEMATICAL BOLD SCRIPT CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D4DE;MATHEMATICAL BOLD SCRIPT CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D4DF;MATHEMATICAL BOLD SCRIPT CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D4E0;MATHEMATICAL BOLD SCRIPT CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D4E1;MATHEMATICAL BOLD SCRIPT CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D4E2;MATHEMATICAL BOLD SCRIPT CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D4E3;MATHEMATICAL BOLD SCRIPT CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D4E4;MATHEMATICAL BOLD SCRIPT CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D4E5;MATHEMATICAL BOLD SCRIPT CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D4E6;MATHEMATICAL BOLD SCRIPT CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D4E7;MATHEMATICAL BOLD SCRIPT CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D4E8;MATHEMATICAL BOLD SCRIPT CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D4E9;MATHEMATICAL BOLD SCRIPT CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D4EA;MATHEMATICAL BOLD SCRIPT SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D4EB;MATHEMATICAL BOLD SCRIPT SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D4EC;MATHEMATICAL BOLD SCRIPT SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D4ED;MATHEMATICAL BOLD SCRIPT SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D4EE;MATHEMATICAL BOLD SCRIPT SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D4EF;MATHEMATICAL BOLD SCRIPT SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D4F0;MATHEMATICAL BOLD SCRIPT SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D4F1;MATHEMATICAL BOLD SCRIPT SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D4F2;MATHEMATICAL BOLD SCRIPT SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D4F3;MATHEMATICAL BOLD SCRIPT SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D4F4;MATHEMATICAL BOLD SCRIPT SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D4F5;MATHEMATICAL BOLD SCRIPT SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D4F6;MATHEMATICAL BOLD SCRIPT SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D4F7;MATHEMATICAL BOLD SCRIPT SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D4F8;MATHEMATICAL BOLD SCRIPT SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D4F9;MATHEMATICAL BOLD SCRIPT SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D4FA;MATHEMATICAL BOLD SCRIPT SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D4FB;MATHEMATICAL BOLD SCRIPT SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D4FC;MATHEMATICAL BOLD SCRIPT SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D4FD;MATHEMATICAL BOLD SCRIPT SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D4FE;MATHEMATICAL BOLD SCRIPT SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D4FF;MATHEMATICAL BOLD SCRIPT SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D500;MATHEMATICAL BOLD SCRIPT SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D501;MATHEMATICAL BOLD SCRIPT SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D502;MATHEMATICAL BOLD SCRIPT SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D503;MATHEMATICAL BOLD SCRIPT SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D504;MATHEMATICAL FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D505;MATHEMATICAL FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D507;MATHEMATICAL FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D508;MATHEMATICAL FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D509;MATHEMATICAL FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D50A;MATHEMATICAL FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D50D;MATHEMATICAL FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D50E;MATHEMATICAL FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D50F;MATHEMATICAL FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D510;MATHEMATICAL FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D511;MATHEMATICAL FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D512;MATHEMATICAL FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D513;MATHEMATICAL FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D514;MATHEMATICAL FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D516;MATHEMATICAL FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D517;MATHEMATICAL FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D518;MATHEMATICAL FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D519;MATHEMATICAL FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D51A;MATHEMATICAL FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D51B;MATHEMATICAL FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D51C;MATHEMATICAL FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D51E;MATHEMATICAL FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D51F;MATHEMATICAL FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D520;MATHEMATICAL FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D521;MATHEMATICAL FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D522;MATHEMATICAL FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D523;MATHEMATICAL FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D524;MATHEMATICAL FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D525;MATHEMATICAL FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D526;MATHEMATICAL FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D527;MATHEMATICAL FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D528;MATHEMATICAL FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D529;MATHEMATICAL FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D52A;MATHEMATICAL FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D52B;MATHEMATICAL FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D52C;MATHEMATICAL FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D52D;MATHEMATICAL FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D52E;MATHEMATICAL FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D52F;MATHEMATICAL FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D530;MATHEMATICAL FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D531;MATHEMATICAL FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D532;MATHEMATICAL FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D533;MATHEMATICAL FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D534;MATHEMATICAL FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D535;MATHEMATICAL FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D536;MATHEMATICAL FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D537;MATHEMATICAL FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D538;MATHEMATICAL DOUBLE-STRUCK CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D539;MATHEMATICAL DOUBLE-STRUCK CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D53B;MATHEMATICAL DOUBLE-STRUCK CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D53C;MATHEMATICAL DOUBLE-STRUCK CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D53D;MATHEMATICAL DOUBLE-STRUCK CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D53E;MATHEMATICAL DOUBLE-STRUCK CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D540;MATHEMATICAL DOUBLE-STRUCK CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D541;MATHEMATICAL DOUBLE-STRUCK CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D542;MATHEMATICAL DOUBLE-STRUCK CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D543;MATHEMATICAL DOUBLE-STRUCK CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D544;MATHEMATICAL DOUBLE-STRUCK CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D546;MATHEMATICAL DOUBLE-STRUCK CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D54A;MATHEMATICAL DOUBLE-STRUCK CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D54B;MATHEMATICAL DOUBLE-STRUCK CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D54C;MATHEMATICAL DOUBLE-STRUCK CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D54D;MATHEMATICAL DOUBLE-STRUCK CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D54E;MATHEMATICAL DOUBLE-STRUCK CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D54F;MATHEMATICAL DOUBLE-STRUCK CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D550;MATHEMATICAL DOUBLE-STRUCK CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D552;MATHEMATICAL DOUBLE-STRUCK SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D553;MATHEMATICAL DOUBLE-STRUCK SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D554;MATHEMATICAL DOUBLE-STRUCK SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D555;MATHEMATICAL DOUBLE-STRUCK SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D556;MATHEMATICAL DOUBLE-STRUCK SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D557;MATHEMATICAL DOUBLE-STRUCK SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D558;MATHEMATICAL DOUBLE-STRUCK SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D559;MATHEMATICAL DOUBLE-STRUCK SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D55A;MATHEMATICAL DOUBLE-STRUCK SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D55B;MATHEMATICAL DOUBLE-STRUCK SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D55C;MATHEMATICAL DOUBLE-STRUCK SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D55D;MATHEMATICAL DOUBLE-STRUCK SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D55E;MATHEMATICAL DOUBLE-STRUCK SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D55F;MATHEMATICAL DOUBLE-STRUCK SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D560;MATHEMATICAL DOUBLE-STRUCK SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D561;MATHEMATICAL DOUBLE-STRUCK SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D562;MATHEMATICAL DOUBLE-STRUCK SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D563;MATHEMATICAL DOUBLE-STRUCK SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D564;MATHEMATICAL DOUBLE-STRUCK SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D565;MATHEMATICAL DOUBLE-STRUCK SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D566;MATHEMATICAL DOUBLE-STRUCK SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D567;MATHEMATICAL DOUBLE-STRUCK SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D568;MATHEMATICAL DOUBLE-STRUCK SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D569;MATHEMATICAL DOUBLE-STRUCK SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D56A;MATHEMATICAL DOUBLE-STRUCK SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D56B;MATHEMATICAL DOUBLE-STRUCK SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D56C;MATHEMATICAL BOLD FRAKTUR CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D56D;MATHEMATICAL BOLD FRAKTUR CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D56E;MATHEMATICAL BOLD FRAKTUR CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D56F;MATHEMATICAL BOLD FRAKTUR CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D570;MATHEMATICAL BOLD FRAKTUR CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D571;MATHEMATICAL BOLD FRAKTUR CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D572;MATHEMATICAL BOLD FRAKTUR CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D573;MATHEMATICAL BOLD FRAKTUR CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D574;MATHEMATICAL BOLD FRAKTUR CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D575;MATHEMATICAL BOLD FRAKTUR CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D576;MATHEMATICAL BOLD FRAKTUR CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D577;MATHEMATICAL BOLD FRAKTUR CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D578;MATHEMATICAL BOLD FRAKTUR CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D579;MATHEMATICAL BOLD FRAKTUR CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D57A;MATHEMATICAL BOLD FRAKTUR CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D57B;MATHEMATICAL BOLD FRAKTUR CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D57C;MATHEMATICAL BOLD FRAKTUR CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D57D;MATHEMATICAL BOLD FRAKTUR CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D57E;MATHEMATICAL BOLD FRAKTUR CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D57F;MATHEMATICAL BOLD FRAKTUR CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D580;MATHEMATICAL BOLD FRAKTUR CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D581;MATHEMATICAL BOLD FRAKTUR CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D582;MATHEMATICAL BOLD FRAKTUR CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D583;MATHEMATICAL BOLD FRAKTUR CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D584;MATHEMATICAL BOLD FRAKTUR CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D585;MATHEMATICAL BOLD FRAKTUR CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D586;MATHEMATICAL BOLD FRAKTUR SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D587;MATHEMATICAL BOLD FRAKTUR SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D588;MATHEMATICAL BOLD FRAKTUR SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D589;MATHEMATICAL BOLD FRAKTUR SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D58A;MATHEMATICAL BOLD FRAKTUR SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D58B;MATHEMATICAL BOLD FRAKTUR SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D58C;MATHEMATICAL BOLD FRAKTUR SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D58D;MATHEMATICAL BOLD FRAKTUR SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D58E;MATHEMATICAL BOLD FRAKTUR SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D58F;MATHEMATICAL BOLD FRAKTUR SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D590;MATHEMATICAL BOLD FRAKTUR SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D591;MATHEMATICAL BOLD FRAKTUR SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D592;MATHEMATICAL BOLD FRAKTUR SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D593;MATHEMATICAL BOLD FRAKTUR SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D594;MATHEMATICAL BOLD FRAKTUR SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D595;MATHEMATICAL BOLD FRAKTUR SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D596;MATHEMATICAL BOLD FRAKTUR SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D597;MATHEMATICAL BOLD FRAKTUR SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D598;MATHEMATICAL BOLD FRAKTUR SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D599;MATHEMATICAL BOLD FRAKTUR SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D59A;MATHEMATICAL BOLD FRAKTUR SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D59B;MATHEMATICAL BOLD FRAKTUR SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D59C;MATHEMATICAL BOLD FRAKTUR SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D59D;MATHEMATICAL BOLD FRAKTUR SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D59E;MATHEMATICAL BOLD FRAKTUR SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D59F;MATHEMATICAL BOLD FRAKTUR SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5A0;MATHEMATICAL SANS-SERIF CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5A1;MATHEMATICAL SANS-SERIF CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5A2;MATHEMATICAL SANS-SERIF CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5A3;MATHEMATICAL SANS-SERIF CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5A4;MATHEMATICAL SANS-SERIF CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5A5;MATHEMATICAL SANS-SERIF CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5A6;MATHEMATICAL SANS-SERIF CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5A7;MATHEMATICAL SANS-SERIF CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5A8;MATHEMATICAL SANS-SERIF CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5A9;MATHEMATICAL SANS-SERIF CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5AA;MATHEMATICAL SANS-SERIF CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5AB;MATHEMATICAL SANS-SERIF CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5AC;MATHEMATICAL SANS-SERIF CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5AD;MATHEMATICAL SANS-SERIF CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5AE;MATHEMATICAL SANS-SERIF CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5AF;MATHEMATICAL SANS-SERIF CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5B0;MATHEMATICAL SANS-SERIF CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5B1;MATHEMATICAL SANS-SERIF CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5B2;MATHEMATICAL SANS-SERIF CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5B3;MATHEMATICAL SANS-SERIF CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5B4;MATHEMATICAL SANS-SERIF CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5B5;MATHEMATICAL SANS-SERIF CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5B6;MATHEMATICAL SANS-SERIF CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5B7;MATHEMATICAL SANS-SERIF CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5B8;MATHEMATICAL SANS-SERIF CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5B9;MATHEMATICAL SANS-SERIF CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5BA;MATHEMATICAL SANS-SERIF SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5BB;MATHEMATICAL SANS-SERIF SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5BC;MATHEMATICAL SANS-SERIF SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5BD;MATHEMATICAL SANS-SERIF SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5BE;MATHEMATICAL SANS-SERIF SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5BF;MATHEMATICAL SANS-SERIF SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5C0;MATHEMATICAL SANS-SERIF SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5C1;MATHEMATICAL SANS-SERIF SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5C2;MATHEMATICAL SANS-SERIF SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5C3;MATHEMATICAL SANS-SERIF SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5C4;MATHEMATICAL SANS-SERIF SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5C5;MATHEMATICAL SANS-SERIF SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5C6;MATHEMATICAL SANS-SERIF SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5C7;MATHEMATICAL SANS-SERIF SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5C8;MATHEMATICAL SANS-SERIF SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5C9;MATHEMATICAL SANS-SERIF SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5CA;MATHEMATICAL SANS-SERIF SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5CB;MATHEMATICAL SANS-SERIF SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D5CC;MATHEMATICAL SANS-SERIF SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D5CD;MATHEMATICAL SANS-SERIF SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D5CE;MATHEMATICAL SANS-SERIF SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D5CF;MATHEMATICAL SANS-SERIF SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D5D0;MATHEMATICAL SANS-SERIF SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D5D1;MATHEMATICAL SANS-SERIF SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D5D2;MATHEMATICAL SANS-SERIF SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D5D3;MATHEMATICAL SANS-SERIF SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D5D4;MATHEMATICAL SANS-SERIF BOLD CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D5D5;MATHEMATICAL SANS-SERIF BOLD CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D5D6;MATHEMATICAL SANS-SERIF BOLD CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D5D7;MATHEMATICAL SANS-SERIF BOLD CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D5D8;MATHEMATICAL SANS-SERIF BOLD CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D5D9;MATHEMATICAL SANS-SERIF BOLD CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D5DA;MATHEMATICAL SANS-SERIF BOLD CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D5DB;MATHEMATICAL SANS-SERIF BOLD CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D5DC;MATHEMATICAL SANS-SERIF BOLD CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D5DD;MATHEMATICAL SANS-SERIF BOLD CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D5DE;MATHEMATICAL SANS-SERIF BOLD CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D5DF;MATHEMATICAL SANS-SERIF BOLD CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D5E0;MATHEMATICAL SANS-SERIF BOLD CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D5E1;MATHEMATICAL SANS-SERIF BOLD CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D5E2;MATHEMATICAL SANS-SERIF BOLD CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D5E3;MATHEMATICAL SANS-SERIF BOLD CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D5E4;MATHEMATICAL SANS-SERIF BOLD CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D5E5;MATHEMATICAL SANS-SERIF BOLD CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D5E6;MATHEMATICAL SANS-SERIF BOLD CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D5E7;MATHEMATICAL SANS-SERIF BOLD CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D5E8;MATHEMATICAL SANS-SERIF BOLD CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D5E9;MATHEMATICAL SANS-SERIF BOLD CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D5EA;MATHEMATICAL SANS-SERIF BOLD CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D5EB;MATHEMATICAL SANS-SERIF BOLD CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D5EC;MATHEMATICAL SANS-SERIF BOLD CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D5ED;MATHEMATICAL SANS-SERIF BOLD CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D5EE;MATHEMATICAL SANS-SERIF BOLD SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D5EF;MATHEMATICAL SANS-SERIF BOLD SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D5F0;MATHEMATICAL SANS-SERIF BOLD SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D5F1;MATHEMATICAL SANS-SERIF BOLD SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D5F2;MATHEMATICAL SANS-SERIF BOLD SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D5F3;MATHEMATICAL SANS-SERIF BOLD SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D5F4;MATHEMATICAL SANS-SERIF BOLD SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D5F5;MATHEMATICAL SANS-SERIF BOLD SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D5F6;MATHEMATICAL SANS-SERIF BOLD SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D5F7;MATHEMATICAL SANS-SERIF BOLD SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D5F8;MATHEMATICAL SANS-SERIF BOLD SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D5F9;MATHEMATICAL SANS-SERIF BOLD SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D5FA;MATHEMATICAL SANS-SERIF BOLD SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D5FB;MATHEMATICAL SANS-SERIF BOLD SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D5FC;MATHEMATICAL SANS-SERIF BOLD SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D5FD;MATHEMATICAL SANS-SERIF BOLD SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D5FE;MATHEMATICAL SANS-SERIF BOLD SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D5FF;MATHEMATICAL SANS-SERIF BOLD SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D600;MATHEMATICAL SANS-SERIF BOLD SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D601;MATHEMATICAL SANS-SERIF BOLD SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D602;MATHEMATICAL SANS-SERIF BOLD SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D603;MATHEMATICAL SANS-SERIF BOLD SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D604;MATHEMATICAL SANS-SERIF BOLD SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D605;MATHEMATICAL SANS-SERIF BOLD SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D606;MATHEMATICAL SANS-SERIF BOLD SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D607;MATHEMATICAL SANS-SERIF BOLD SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D608;MATHEMATICAL SANS-SERIF ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D609;MATHEMATICAL SANS-SERIF ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D60A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D60B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D60C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D60D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D60E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D60F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D610;MATHEMATICAL SANS-SERIF ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D611;MATHEMATICAL SANS-SERIF ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D612;MATHEMATICAL SANS-SERIF ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D613;MATHEMATICAL SANS-SERIF ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D614;MATHEMATICAL SANS-SERIF ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D615;MATHEMATICAL SANS-SERIF ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D616;MATHEMATICAL SANS-SERIF ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D617;MATHEMATICAL SANS-SERIF ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D618;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D619;MATHEMATICAL SANS-SERIF ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D61A;MATHEMATICAL SANS-SERIF ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D61B;MATHEMATICAL SANS-SERIF ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D61C;MATHEMATICAL SANS-SERIF ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D61D;MATHEMATICAL SANS-SERIF ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D61E;MATHEMATICAL SANS-SERIF ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D61F;MATHEMATICAL SANS-SERIF ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D620;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D621;MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D622;MATHEMATICAL SANS-SERIF ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D623;MATHEMATICAL SANS-SERIF ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D624;MATHEMATICAL SANS-SERIF ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D625;MATHEMATICAL SANS-SERIF ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D626;MATHEMATICAL SANS-SERIF ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D627;MATHEMATICAL SANS-SERIF ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D628;MATHEMATICAL SANS-SERIF ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D629;MATHEMATICAL SANS-SERIF ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D62A;MATHEMATICAL SANS-SERIF ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D62B;MATHEMATICAL SANS-SERIF ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D62C;MATHEMATICAL SANS-SERIF ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D62D;MATHEMATICAL SANS-SERIF ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D62E;MATHEMATICAL SANS-SERIF ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D62F;MATHEMATICAL SANS-SERIF ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D630;MATHEMATICAL SANS-SERIF ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D631;MATHEMATICAL SANS-SERIF ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D632;MATHEMATICAL SANS-SERIF ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D633;MATHEMATICAL SANS-SERIF ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D634;MATHEMATICAL SANS-SERIF ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D635;MATHEMATICAL SANS-SERIF ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D636;MATHEMATICAL SANS-SERIF ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D637;MATHEMATICAL SANS-SERIF ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D638;MATHEMATICAL SANS-SERIF ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D639;MATHEMATICAL SANS-SERIF ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D63A;MATHEMATICAL SANS-SERIF ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D63B;MATHEMATICAL SANS-SERIF ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D63C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D63D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D63E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D63F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D640;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D641;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D642;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D643;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D644;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D645;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D646;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D647;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D648;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D649;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D64A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D64B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D64C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D64D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D64E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D64F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D650;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D651;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D652;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D653;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D654;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D655;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D656;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D657;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D658;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D659;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D65A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D65B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D65C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D65D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D65E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D65F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D660;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D661;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D662;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D663;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D664;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D665;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D666;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D667;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D668;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D669;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D66A;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D66B;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D66C;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D66D;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D66E;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D66F;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D670;MATHEMATICAL MONOSPACE CAPITAL A;Lu;0;L;<font> 0041;;;;N;;;;;
+1D671;MATHEMATICAL MONOSPACE CAPITAL B;Lu;0;L;<font> 0042;;;;N;;;;;
+1D672;MATHEMATICAL MONOSPACE CAPITAL C;Lu;0;L;<font> 0043;;;;N;;;;;
+1D673;MATHEMATICAL MONOSPACE CAPITAL D;Lu;0;L;<font> 0044;;;;N;;;;;
+1D674;MATHEMATICAL MONOSPACE CAPITAL E;Lu;0;L;<font> 0045;;;;N;;;;;
+1D675;MATHEMATICAL MONOSPACE CAPITAL F;Lu;0;L;<font> 0046;;;;N;;;;;
+1D676;MATHEMATICAL MONOSPACE CAPITAL G;Lu;0;L;<font> 0047;;;;N;;;;;
+1D677;MATHEMATICAL MONOSPACE CAPITAL H;Lu;0;L;<font> 0048;;;;N;;;;;
+1D678;MATHEMATICAL MONOSPACE CAPITAL I;Lu;0;L;<font> 0049;;;;N;;;;;
+1D679;MATHEMATICAL MONOSPACE CAPITAL J;Lu;0;L;<font> 004A;;;;N;;;;;
+1D67A;MATHEMATICAL MONOSPACE CAPITAL K;Lu;0;L;<font> 004B;;;;N;;;;;
+1D67B;MATHEMATICAL MONOSPACE CAPITAL L;Lu;0;L;<font> 004C;;;;N;;;;;
+1D67C;MATHEMATICAL MONOSPACE CAPITAL M;Lu;0;L;<font> 004D;;;;N;;;;;
+1D67D;MATHEMATICAL MONOSPACE CAPITAL N;Lu;0;L;<font> 004E;;;;N;;;;;
+1D67E;MATHEMATICAL MONOSPACE CAPITAL O;Lu;0;L;<font> 004F;;;;N;;;;;
+1D67F;MATHEMATICAL MONOSPACE CAPITAL P;Lu;0;L;<font> 0050;;;;N;;;;;
+1D680;MATHEMATICAL MONOSPACE CAPITAL Q;Lu;0;L;<font> 0051;;;;N;;;;;
+1D681;MATHEMATICAL MONOSPACE CAPITAL R;Lu;0;L;<font> 0052;;;;N;;;;;
+1D682;MATHEMATICAL MONOSPACE CAPITAL S;Lu;0;L;<font> 0053;;;;N;;;;;
+1D683;MATHEMATICAL MONOSPACE CAPITAL T;Lu;0;L;<font> 0054;;;;N;;;;;
+1D684;MATHEMATICAL MONOSPACE CAPITAL U;Lu;0;L;<font> 0055;;;;N;;;;;
+1D685;MATHEMATICAL MONOSPACE CAPITAL V;Lu;0;L;<font> 0056;;;;N;;;;;
+1D686;MATHEMATICAL MONOSPACE CAPITAL W;Lu;0;L;<font> 0057;;;;N;;;;;
+1D687;MATHEMATICAL MONOSPACE CAPITAL X;Lu;0;L;<font> 0058;;;;N;;;;;
+1D688;MATHEMATICAL MONOSPACE CAPITAL Y;Lu;0;L;<font> 0059;;;;N;;;;;
+1D689;MATHEMATICAL MONOSPACE CAPITAL Z;Lu;0;L;<font> 005A;;;;N;;;;;
+1D68A;MATHEMATICAL MONOSPACE SMALL A;Ll;0;L;<font> 0061;;;;N;;;;;
+1D68B;MATHEMATICAL MONOSPACE SMALL B;Ll;0;L;<font> 0062;;;;N;;;;;
+1D68C;MATHEMATICAL MONOSPACE SMALL C;Ll;0;L;<font> 0063;;;;N;;;;;
+1D68D;MATHEMATICAL MONOSPACE SMALL D;Ll;0;L;<font> 0064;;;;N;;;;;
+1D68E;MATHEMATICAL MONOSPACE SMALL E;Ll;0;L;<font> 0065;;;;N;;;;;
+1D68F;MATHEMATICAL MONOSPACE SMALL F;Ll;0;L;<font> 0066;;;;N;;;;;
+1D690;MATHEMATICAL MONOSPACE SMALL G;Ll;0;L;<font> 0067;;;;N;;;;;
+1D691;MATHEMATICAL MONOSPACE SMALL H;Ll;0;L;<font> 0068;;;;N;;;;;
+1D692;MATHEMATICAL MONOSPACE SMALL I;Ll;0;L;<font> 0069;;;;N;;;;;
+1D693;MATHEMATICAL MONOSPACE SMALL J;Ll;0;L;<font> 006A;;;;N;;;;;
+1D694;MATHEMATICAL MONOSPACE SMALL K;Ll;0;L;<font> 006B;;;;N;;;;;
+1D695;MATHEMATICAL MONOSPACE SMALL L;Ll;0;L;<font> 006C;;;;N;;;;;
+1D696;MATHEMATICAL MONOSPACE SMALL M;Ll;0;L;<font> 006D;;;;N;;;;;
+1D697;MATHEMATICAL MONOSPACE SMALL N;Ll;0;L;<font> 006E;;;;N;;;;;
+1D698;MATHEMATICAL MONOSPACE SMALL O;Ll;0;L;<font> 006F;;;;N;;;;;
+1D699;MATHEMATICAL MONOSPACE SMALL P;Ll;0;L;<font> 0070;;;;N;;;;;
+1D69A;MATHEMATICAL MONOSPACE SMALL Q;Ll;0;L;<font> 0071;;;;N;;;;;
+1D69B;MATHEMATICAL MONOSPACE SMALL R;Ll;0;L;<font> 0072;;;;N;;;;;
+1D69C;MATHEMATICAL MONOSPACE SMALL S;Ll;0;L;<font> 0073;;;;N;;;;;
+1D69D;MATHEMATICAL MONOSPACE SMALL T;Ll;0;L;<font> 0074;;;;N;;;;;
+1D69E;MATHEMATICAL MONOSPACE SMALL U;Ll;0;L;<font> 0075;;;;N;;;;;
+1D69F;MATHEMATICAL MONOSPACE SMALL V;Ll;0;L;<font> 0076;;;;N;;;;;
+1D6A0;MATHEMATICAL MONOSPACE SMALL W;Ll;0;L;<font> 0077;;;;N;;;;;
+1D6A1;MATHEMATICAL MONOSPACE SMALL X;Ll;0;L;<font> 0078;;;;N;;;;;
+1D6A2;MATHEMATICAL MONOSPACE SMALL Y;Ll;0;L;<font> 0079;;;;N;;;;;
+1D6A3;MATHEMATICAL MONOSPACE SMALL Z;Ll;0;L;<font> 007A;;;;N;;;;;
+1D6A4;MATHEMATICAL ITALIC SMALL DOTLESS I;Ll;0;L;<font> 0131;;;;N;;;;;
+1D6A5;MATHEMATICAL ITALIC SMALL DOTLESS J;Ll;0;L;<font> 0237;;;;N;;;;;
+1D6A8;MATHEMATICAL BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6A9;MATHEMATICAL BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6AA;MATHEMATICAL BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6AB;MATHEMATICAL BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6AC;MATHEMATICAL BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6AD;MATHEMATICAL BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6AE;MATHEMATICAL BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6AF;MATHEMATICAL BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6B0;MATHEMATICAL BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6B1;MATHEMATICAL BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6B2;MATHEMATICAL BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6B3;MATHEMATICAL BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6B4;MATHEMATICAL BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6B5;MATHEMATICAL BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6B6;MATHEMATICAL BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6B7;MATHEMATICAL BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6B8;MATHEMATICAL BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6B9;MATHEMATICAL BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6BA;MATHEMATICAL BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6BB;MATHEMATICAL BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6BC;MATHEMATICAL BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6BD;MATHEMATICAL BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6BE;MATHEMATICAL BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6BF;MATHEMATICAL BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6C0;MATHEMATICAL BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6C1;MATHEMATICAL BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6C2;MATHEMATICAL BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6C3;MATHEMATICAL BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6C4;MATHEMATICAL BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6C5;MATHEMATICAL BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D6C6;MATHEMATICAL BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D6C7;MATHEMATICAL BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D6C8;MATHEMATICAL BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D6C9;MATHEMATICAL BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D6CA;MATHEMATICAL BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D6CB;MATHEMATICAL BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D6CC;MATHEMATICAL BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D6CD;MATHEMATICAL BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D6CE;MATHEMATICAL BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D6CF;MATHEMATICAL BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D6D0;MATHEMATICAL BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D6D1;MATHEMATICAL BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D6D2;MATHEMATICAL BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D6D3;MATHEMATICAL BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D6D4;MATHEMATICAL BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D6D5;MATHEMATICAL BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D6D6;MATHEMATICAL BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D6D7;MATHEMATICAL BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D6D8;MATHEMATICAL BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D6D9;MATHEMATICAL BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D6DA;MATHEMATICAL BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D6DB;MATHEMATICAL BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D6DC;MATHEMATICAL BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D6DD;MATHEMATICAL BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D6DE;MATHEMATICAL BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D6DF;MATHEMATICAL BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D6E0;MATHEMATICAL BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D6E1;MATHEMATICAL BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D6E2;MATHEMATICAL ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D6E3;MATHEMATICAL ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D6E4;MATHEMATICAL ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D6E5;MATHEMATICAL ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D6E6;MATHEMATICAL ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D6E7;MATHEMATICAL ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D6E8;MATHEMATICAL ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D6E9;MATHEMATICAL ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D6EA;MATHEMATICAL ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D6EB;MATHEMATICAL ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D6EC;MATHEMATICAL ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D6ED;MATHEMATICAL ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D6EE;MATHEMATICAL ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D6EF;MATHEMATICAL ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D6F0;MATHEMATICAL ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D6F1;MATHEMATICAL ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D6F2;MATHEMATICAL ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D6F3;MATHEMATICAL ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D6F4;MATHEMATICAL ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D6F5;MATHEMATICAL ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D6F6;MATHEMATICAL ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D6F7;MATHEMATICAL ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D6F8;MATHEMATICAL ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D6F9;MATHEMATICAL ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D6FA;MATHEMATICAL ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D6FB;MATHEMATICAL ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D6FC;MATHEMATICAL ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D6FD;MATHEMATICAL ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D6FE;MATHEMATICAL ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D6FF;MATHEMATICAL ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D700;MATHEMATICAL ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D701;MATHEMATICAL ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D702;MATHEMATICAL ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D703;MATHEMATICAL ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D704;MATHEMATICAL ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D705;MATHEMATICAL ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D706;MATHEMATICAL ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D707;MATHEMATICAL ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D708;MATHEMATICAL ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D709;MATHEMATICAL ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D70A;MATHEMATICAL ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D70B;MATHEMATICAL ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D70C;MATHEMATICAL ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D70D;MATHEMATICAL ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D70E;MATHEMATICAL ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D70F;MATHEMATICAL ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D710;MATHEMATICAL ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D711;MATHEMATICAL ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D712;MATHEMATICAL ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D713;MATHEMATICAL ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D714;MATHEMATICAL ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D715;MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D716;MATHEMATICAL ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D717;MATHEMATICAL ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D718;MATHEMATICAL ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D719;MATHEMATICAL ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D71A;MATHEMATICAL ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D71B;MATHEMATICAL ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D71C;MATHEMATICAL BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D71D;MATHEMATICAL BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D71E;MATHEMATICAL BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D71F;MATHEMATICAL BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D720;MATHEMATICAL BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D721;MATHEMATICAL BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D722;MATHEMATICAL BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D723;MATHEMATICAL BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D724;MATHEMATICAL BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D725;MATHEMATICAL BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D726;MATHEMATICAL BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D727;MATHEMATICAL BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D728;MATHEMATICAL BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D729;MATHEMATICAL BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D72A;MATHEMATICAL BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D72B;MATHEMATICAL BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D72C;MATHEMATICAL BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D72D;MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D72E;MATHEMATICAL BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D72F;MATHEMATICAL BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D730;MATHEMATICAL BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D731;MATHEMATICAL BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D732;MATHEMATICAL BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D733;MATHEMATICAL BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D734;MATHEMATICAL BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D735;MATHEMATICAL BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D736;MATHEMATICAL BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D737;MATHEMATICAL BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D738;MATHEMATICAL BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D739;MATHEMATICAL BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D73A;MATHEMATICAL BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D73B;MATHEMATICAL BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D73C;MATHEMATICAL BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D73D;MATHEMATICAL BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D73E;MATHEMATICAL BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D73F;MATHEMATICAL BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D740;MATHEMATICAL BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D741;MATHEMATICAL BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D742;MATHEMATICAL BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D743;MATHEMATICAL BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D744;MATHEMATICAL BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D745;MATHEMATICAL BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D746;MATHEMATICAL BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D747;MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D748;MATHEMATICAL BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D749;MATHEMATICAL BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D74A;MATHEMATICAL BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D74B;MATHEMATICAL BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D74C;MATHEMATICAL BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D74D;MATHEMATICAL BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D74E;MATHEMATICAL BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D74F;MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D750;MATHEMATICAL BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D751;MATHEMATICAL BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D752;MATHEMATICAL BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D753;MATHEMATICAL BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D754;MATHEMATICAL BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D755;MATHEMATICAL BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D756;MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D757;MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D758;MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D759;MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D75A;MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D75B;MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D75C;MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D75D;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D75E;MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D75F;MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D760;MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D761;MATHEMATICAL SANS-SERIF BOLD CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D762;MATHEMATICAL SANS-SERIF BOLD CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D763;MATHEMATICAL SANS-SERIF BOLD CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D764;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D765;MATHEMATICAL SANS-SERIF BOLD CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D766;MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D767;MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D768;MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D769;MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D76A;MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D76B;MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D76C;MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D76D;MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D76E;MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D76F;MATHEMATICAL SANS-SERIF BOLD NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D770;MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D771;MATHEMATICAL SANS-SERIF BOLD SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D772;MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D773;MATHEMATICAL SANS-SERIF BOLD SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D774;MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D775;MATHEMATICAL SANS-SERIF BOLD SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D776;MATHEMATICAL SANS-SERIF BOLD SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D777;MATHEMATICAL SANS-SERIF BOLD SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D778;MATHEMATICAL SANS-SERIF BOLD SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D779;MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D77A;MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D77B;MATHEMATICAL SANS-SERIF BOLD SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D77C;MATHEMATICAL SANS-SERIF BOLD SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D77D;MATHEMATICAL SANS-SERIF BOLD SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D77E;MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D77F;MATHEMATICAL SANS-SERIF BOLD SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D780;MATHEMATICAL SANS-SERIF BOLD SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D781;MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D782;MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D783;MATHEMATICAL SANS-SERIF BOLD SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D784;MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D785;MATHEMATICAL SANS-SERIF BOLD SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D786;MATHEMATICAL SANS-SERIF BOLD SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D787;MATHEMATICAL SANS-SERIF BOLD SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D788;MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D789;MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D78A;MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D78B;MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D78C;MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D78D;MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D78E;MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D78F;MATHEMATICAL SANS-SERIF BOLD PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D790;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA;Lu;0;L;<font> 0391;;;;N;;;;;
+1D791;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA;Lu;0;L;<font> 0392;;;;N;;;;;
+1D792;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA;Lu;0;L;<font> 0393;;;;N;;;;;
+1D793;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA;Lu;0;L;<font> 0394;;;;N;;;;;
+1D794;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON;Lu;0;L;<font> 0395;;;;N;;;;;
+1D795;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA;Lu;0;L;<font> 0396;;;;N;;;;;
+1D796;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA;Lu;0;L;<font> 0397;;;;N;;;;;
+1D797;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA;Lu;0;L;<font> 0398;;;;N;;;;;
+1D798;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA;Lu;0;L;<font> 0399;;;;N;;;;;
+1D799;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA;Lu;0;L;<font> 039A;;;;N;;;;;
+1D79A;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA;Lu;0;L;<font> 039B;;;;N;;;;;
+1D79B;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU;Lu;0;L;<font> 039C;;;;N;;;;;
+1D79C;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU;Lu;0;L;<font> 039D;;;;N;;;;;
+1D79D;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI;Lu;0;L;<font> 039E;;;;N;;;;;
+1D79E;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON;Lu;0;L;<font> 039F;;;;N;;;;;
+1D79F;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI;Lu;0;L;<font> 03A0;;;;N;;;;;
+1D7A0;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO;Lu;0;L;<font> 03A1;;;;N;;;;;
+1D7A1;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL;Lu;0;L;<font> 03F4;;;;N;;;;;
+1D7A2;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA;Lu;0;L;<font> 03A3;;;;N;;;;;
+1D7A3;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU;Lu;0;L;<font> 03A4;;;;N;;;;;
+1D7A4;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON;Lu;0;L;<font> 03A5;;;;N;;;;;
+1D7A5;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI;Lu;0;L;<font> 03A6;;;;N;;;;;
+1D7A6;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI;Lu;0;L;<font> 03A7;;;;N;;;;;
+1D7A7;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI;Lu;0;L;<font> 03A8;;;;N;;;;;
+1D7A8;MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA;Lu;0;L;<font> 03A9;;;;N;;;;;
+1D7A9;MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA;Sm;0;L;<font> 2207;;;;N;;;;;
+1D7AA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA;Ll;0;L;<font> 03B1;;;;N;;;;;
+1D7AB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA;Ll;0;L;<font> 03B2;;;;N;;;;;
+1D7AC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA;Ll;0;L;<font> 03B3;;;;N;;;;;
+1D7AD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA;Ll;0;L;<font> 03B4;;;;N;;;;;
+1D7AE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON;Ll;0;L;<font> 03B5;;;;N;;;;;
+1D7AF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA;Ll;0;L;<font> 03B6;;;;N;;;;;
+1D7B0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA;Ll;0;L;<font> 03B7;;;;N;;;;;
+1D7B1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA;Ll;0;L;<font> 03B8;;;;N;;;;;
+1D7B2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA;Ll;0;L;<font> 03B9;;;;N;;;;;
+1D7B3;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA;Ll;0;L;<font> 03BA;;;;N;;;;;
+1D7B4;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA;Ll;0;L;<font> 03BB;;;;N;;;;;
+1D7B5;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU;Ll;0;L;<font> 03BC;;;;N;;;;;
+1D7B6;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU;Ll;0;L;<font> 03BD;;;;N;;;;;
+1D7B7;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI;Ll;0;L;<font> 03BE;;;;N;;;;;
+1D7B8;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON;Ll;0;L;<font> 03BF;;;;N;;;;;
+1D7B9;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI;Ll;0;L;<font> 03C0;;;;N;;;;;
+1D7BA;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO;Ll;0;L;<font> 03C1;;;;N;;;;;
+1D7BB;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA;Ll;0;L;<font> 03C2;;;;N;;;;;
+1D7BC;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA;Ll;0;L;<font> 03C3;;;;N;;;;;
+1D7BD;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU;Ll;0;L;<font> 03C4;;;;N;;;;;
+1D7BE;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON;Ll;0;L;<font> 03C5;;;;N;;;;;
+1D7BF;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI;Ll;0;L;<font> 03C6;;;;N;;;;;
+1D7C0;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI;Ll;0;L;<font> 03C7;;;;N;;;;;
+1D7C1;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI;Ll;0;L;<font> 03C8;;;;N;;;;;
+1D7C2;MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA;Ll;0;L;<font> 03C9;;;;N;;;;;
+1D7C3;MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL;Sm;0;L;<font> 2202;;;;Y;;;;;
+1D7C4;MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL;Ll;0;L;<font> 03F5;;;;N;;;;;
+1D7C5;MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL;Ll;0;L;<font> 03D1;;;;N;;;;;
+1D7C6;MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL;Ll;0;L;<font> 03F0;;;;N;;;;;
+1D7C7;MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL;Ll;0;L;<font> 03D5;;;;N;;;;;
+1D7C8;MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL;Ll;0;L;<font> 03F1;;;;N;;;;;
+1D7C9;MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL;Ll;0;L;<font> 03D6;;;;N;;;;;
+1D7CA;MATHEMATICAL BOLD CAPITAL DIGAMMA;Lu;0;L;<font> 03DC;;;;N;;;;;
+1D7CB;MATHEMATICAL BOLD SMALL DIGAMMA;Ll;0;L;<font> 03DD;;;;N;;;;;
+1D7CE;MATHEMATICAL BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7CF;MATHEMATICAL BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7D0;MATHEMATICAL BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7D1;MATHEMATICAL BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7D2;MATHEMATICAL BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7D3;MATHEMATICAL BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7D4;MATHEMATICAL BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7D5;MATHEMATICAL BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7D6;MATHEMATICAL BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7D7;MATHEMATICAL BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7D8;MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7D9;MATHEMATICAL DOUBLE-STRUCK DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7DA;MATHEMATICAL DOUBLE-STRUCK DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7DB;MATHEMATICAL DOUBLE-STRUCK DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7DC;MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7DD;MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7DE;MATHEMATICAL DOUBLE-STRUCK DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7DF;MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7E0;MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7E1;MATHEMATICAL DOUBLE-STRUCK DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7E2;MATHEMATICAL SANS-SERIF DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7E3;MATHEMATICAL SANS-SERIF DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7E4;MATHEMATICAL SANS-SERIF DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7E5;MATHEMATICAL SANS-SERIF DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7E6;MATHEMATICAL SANS-SERIF DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7E7;MATHEMATICAL SANS-SERIF DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7E8;MATHEMATICAL SANS-SERIF DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7E9;MATHEMATICAL SANS-SERIF DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7EA;MATHEMATICAL SANS-SERIF DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7EB;MATHEMATICAL SANS-SERIF DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7EC;MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7ED;MATHEMATICAL SANS-SERIF BOLD DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7EE;MATHEMATICAL SANS-SERIF BOLD DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7EF;MATHEMATICAL SANS-SERIF BOLD DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7F0;MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7F1;MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7F2;MATHEMATICAL SANS-SERIF BOLD DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7F3;MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7F4;MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7F5;MATHEMATICAL SANS-SERIF BOLD DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+1D7F6;MATHEMATICAL MONOSPACE DIGIT ZERO;Nd;0;EN;<font> 0030;0;0;0;N;;;;;
+1D7F7;MATHEMATICAL MONOSPACE DIGIT ONE;Nd;0;EN;<font> 0031;1;1;1;N;;;;;
+1D7F8;MATHEMATICAL MONOSPACE DIGIT TWO;Nd;0;EN;<font> 0032;2;2;2;N;;;;;
+1D7F9;MATHEMATICAL MONOSPACE DIGIT THREE;Nd;0;EN;<font> 0033;3;3;3;N;;;;;
+1D7FA;MATHEMATICAL MONOSPACE DIGIT FOUR;Nd;0;EN;<font> 0034;4;4;4;N;;;;;
+1D7FB;MATHEMATICAL MONOSPACE DIGIT FIVE;Nd;0;EN;<font> 0035;5;5;5;N;;;;;
+1D7FC;MATHEMATICAL MONOSPACE DIGIT SIX;Nd;0;EN;<font> 0036;6;6;6;N;;;;;
+1D7FD;MATHEMATICAL MONOSPACE DIGIT SEVEN;Nd;0;EN;<font> 0037;7;7;7;N;;;;;
+1D7FE;MATHEMATICAL MONOSPACE DIGIT EIGHT;Nd;0;EN;<font> 0038;8;8;8;N;;;;;
+1D7FF;MATHEMATICAL MONOSPACE DIGIT NINE;Nd;0;EN;<font> 0039;9;9;9;N;;;;;
+20000;<CJK Ideograph Extension B, First>;Lo;0;L;;;;;N;;;;;
+2A6D6;<CJK Ideograph Extension B, Last>;Lo;0;L;;;;;N;;;;;
+2F800;CJK COMPATIBILITY IDEOGRAPH-2F800;Lo;0;L;4E3D;;;;N;;;;;
+2F801;CJK COMPATIBILITY IDEOGRAPH-2F801;Lo;0;L;4E38;;;;N;;;;;
+2F802;CJK COMPATIBILITY IDEOGRAPH-2F802;Lo;0;L;4E41;;;;N;;;;;
+2F803;CJK COMPATIBILITY IDEOGRAPH-2F803;Lo;0;L;20122;;;;N;;;;;
+2F804;CJK COMPATIBILITY IDEOGRAPH-2F804;Lo;0;L;4F60;;;;N;;;;;
+2F805;CJK COMPATIBILITY IDEOGRAPH-2F805;Lo;0;L;4FAE;;;;N;;;;;
+2F806;CJK COMPATIBILITY IDEOGRAPH-2F806;Lo;0;L;4FBB;;;;N;;;;;
+2F807;CJK COMPATIBILITY IDEOGRAPH-2F807;Lo;0;L;5002;;;;N;;;;;
+2F808;CJK COMPATIBILITY IDEOGRAPH-2F808;Lo;0;L;507A;;;;N;;;;;
+2F809;CJK COMPATIBILITY IDEOGRAPH-2F809;Lo;0;L;5099;;;;N;;;;;
+2F80A;CJK COMPATIBILITY IDEOGRAPH-2F80A;Lo;0;L;50E7;;;;N;;;;;
+2F80B;CJK COMPATIBILITY IDEOGRAPH-2F80B;Lo;0;L;50CF;;;;N;;;;;
+2F80C;CJK COMPATIBILITY IDEOGRAPH-2F80C;Lo;0;L;349E;;;;N;;;;;
+2F80D;CJK COMPATIBILITY IDEOGRAPH-2F80D;Lo;0;L;2063A;;;;N;;;;;
+2F80E;CJK COMPATIBILITY IDEOGRAPH-2F80E;Lo;0;L;514D;;;;N;;;;;
+2F80F;CJK COMPATIBILITY IDEOGRAPH-2F80F;Lo;0;L;5154;;;;N;;;;;
+2F810;CJK COMPATIBILITY IDEOGRAPH-2F810;Lo;0;L;5164;;;;N;;;;;
+2F811;CJK COMPATIBILITY IDEOGRAPH-2F811;Lo;0;L;5177;;;;N;;;;;
+2F812;CJK COMPATIBILITY IDEOGRAPH-2F812;Lo;0;L;2051C;;;;N;;;;;
+2F813;CJK COMPATIBILITY IDEOGRAPH-2F813;Lo;0;L;34B9;;;;N;;;;;
+2F814;CJK COMPATIBILITY IDEOGRAPH-2F814;Lo;0;L;5167;;;;N;;;;;
+2F815;CJK COMPATIBILITY IDEOGRAPH-2F815;Lo;0;L;518D;;;;N;;;;;
+2F816;CJK COMPATIBILITY IDEOGRAPH-2F816;Lo;0;L;2054B;;;;N;;;;;
+2F817;CJK COMPATIBILITY IDEOGRAPH-2F817;Lo;0;L;5197;;;;N;;;;;
+2F818;CJK COMPATIBILITY IDEOGRAPH-2F818;Lo;0;L;51A4;;;;N;;;;;
+2F819;CJK COMPATIBILITY IDEOGRAPH-2F819;Lo;0;L;4ECC;;;;N;;;;;
+2F81A;CJK COMPATIBILITY IDEOGRAPH-2F81A;Lo;0;L;51AC;;;;N;;;;;
+2F81B;CJK COMPATIBILITY IDEOGRAPH-2F81B;Lo;0;L;51B5;;;;N;;;;;
+2F81C;CJK COMPATIBILITY IDEOGRAPH-2F81C;Lo;0;L;291DF;;;;N;;;;;
+2F81D;CJK COMPATIBILITY IDEOGRAPH-2F81D;Lo;0;L;51F5;;;;N;;;;;
+2F81E;CJK COMPATIBILITY IDEOGRAPH-2F81E;Lo;0;L;5203;;;;N;;;;;
+2F81F;CJK COMPATIBILITY IDEOGRAPH-2F81F;Lo;0;L;34DF;;;;N;;;;;
+2F820;CJK COMPATIBILITY IDEOGRAPH-2F820;Lo;0;L;523B;;;;N;;;;;
+2F821;CJK COMPATIBILITY IDEOGRAPH-2F821;Lo;0;L;5246;;;;N;;;;;
+2F822;CJK COMPATIBILITY IDEOGRAPH-2F822;Lo;0;L;5272;;;;N;;;;;
+2F823;CJK COMPATIBILITY IDEOGRAPH-2F823;Lo;0;L;5277;;;;N;;;;;
+2F824;CJK COMPATIBILITY IDEOGRAPH-2F824;Lo;0;L;3515;;;;N;;;;;
+2F825;CJK COMPATIBILITY IDEOGRAPH-2F825;Lo;0;L;52C7;;;;N;;;;;
+2F826;CJK COMPATIBILITY IDEOGRAPH-2F826;Lo;0;L;52C9;;;;N;;;;;
+2F827;CJK COMPATIBILITY IDEOGRAPH-2F827;Lo;0;L;52E4;;;;N;;;;;
+2F828;CJK COMPATIBILITY IDEOGRAPH-2F828;Lo;0;L;52FA;;;;N;;;;;
+2F829;CJK COMPATIBILITY IDEOGRAPH-2F829;Lo;0;L;5305;;;;N;;;;;
+2F82A;CJK COMPATIBILITY IDEOGRAPH-2F82A;Lo;0;L;5306;;;;N;;;;;
+2F82B;CJK COMPATIBILITY IDEOGRAPH-2F82B;Lo;0;L;5317;;;;N;;;;;
+2F82C;CJK COMPATIBILITY IDEOGRAPH-2F82C;Lo;0;L;5349;;;;N;;;;;
+2F82D;CJK COMPATIBILITY IDEOGRAPH-2F82D;Lo;0;L;5351;;;;N;;;;;
+2F82E;CJK COMPATIBILITY IDEOGRAPH-2F82E;Lo;0;L;535A;;;;N;;;;;
+2F82F;CJK COMPATIBILITY IDEOGRAPH-2F82F;Lo;0;L;5373;;;;N;;;;;
+2F830;CJK COMPATIBILITY IDEOGRAPH-2F830;Lo;0;L;537D;;;;N;;;;;
+2F831;CJK COMPATIBILITY IDEOGRAPH-2F831;Lo;0;L;537F;;;;N;;;;;
+2F832;CJK COMPATIBILITY IDEOGRAPH-2F832;Lo;0;L;537F;;;;N;;;;;
+2F833;CJK COMPATIBILITY IDEOGRAPH-2F833;Lo;0;L;537F;;;;N;;;;;
+2F834;CJK COMPATIBILITY IDEOGRAPH-2F834;Lo;0;L;20A2C;;;;N;;;;;
+2F835;CJK COMPATIBILITY IDEOGRAPH-2F835;Lo;0;L;7070;;;;N;;;;;
+2F836;CJK COMPATIBILITY IDEOGRAPH-2F836;Lo;0;L;53CA;;;;N;;;;;
+2F837;CJK COMPATIBILITY IDEOGRAPH-2F837;Lo;0;L;53DF;;;;N;;;;;
+2F838;CJK COMPATIBILITY IDEOGRAPH-2F838;Lo;0;L;20B63;;;;N;;;;;
+2F839;CJK COMPATIBILITY IDEOGRAPH-2F839;Lo;0;L;53EB;;;;N;;;;;
+2F83A;CJK COMPATIBILITY IDEOGRAPH-2F83A;Lo;0;L;53F1;;;;N;;;;;
+2F83B;CJK COMPATIBILITY IDEOGRAPH-2F83B;Lo;0;L;5406;;;;N;;;;;
+2F83C;CJK COMPATIBILITY IDEOGRAPH-2F83C;Lo;0;L;549E;;;;N;;;;;
+2F83D;CJK COMPATIBILITY IDEOGRAPH-2F83D;Lo;0;L;5438;;;;N;;;;;
+2F83E;CJK COMPATIBILITY IDEOGRAPH-2F83E;Lo;0;L;5448;;;;N;;;;;
+2F83F;CJK COMPATIBILITY IDEOGRAPH-2F83F;Lo;0;L;5468;;;;N;;;;;
+2F840;CJK COMPATIBILITY IDEOGRAPH-2F840;Lo;0;L;54A2;;;;N;;;;;
+2F841;CJK COMPATIBILITY IDEOGRAPH-2F841;Lo;0;L;54F6;;;;N;;;;;
+2F842;CJK COMPATIBILITY IDEOGRAPH-2F842;Lo;0;L;5510;;;;N;;;;;
+2F843;CJK COMPATIBILITY IDEOGRAPH-2F843;Lo;0;L;5553;;;;N;;;;;
+2F844;CJK COMPATIBILITY IDEOGRAPH-2F844;Lo;0;L;5563;;;;N;;;;;
+2F845;CJK COMPATIBILITY IDEOGRAPH-2F845;Lo;0;L;5584;;;;N;;;;;
+2F846;CJK COMPATIBILITY IDEOGRAPH-2F846;Lo;0;L;5584;;;;N;;;;;
+2F847;CJK COMPATIBILITY IDEOGRAPH-2F847;Lo;0;L;5599;;;;N;;;;;
+2F848;CJK COMPATIBILITY IDEOGRAPH-2F848;Lo;0;L;55AB;;;;N;;;;;
+2F849;CJK COMPATIBILITY IDEOGRAPH-2F849;Lo;0;L;55B3;;;;N;;;;;
+2F84A;CJK COMPATIBILITY IDEOGRAPH-2F84A;Lo;0;L;55C2;;;;N;;;;;
+2F84B;CJK COMPATIBILITY IDEOGRAPH-2F84B;Lo;0;L;5716;;;;N;;;;;
+2F84C;CJK COMPATIBILITY IDEOGRAPH-2F84C;Lo;0;L;5606;;;;N;;;;;
+2F84D;CJK COMPATIBILITY IDEOGRAPH-2F84D;Lo;0;L;5717;;;;N;;;;;
+2F84E;CJK COMPATIBILITY IDEOGRAPH-2F84E;Lo;0;L;5651;;;;N;;;;;
+2F84F;CJK COMPATIBILITY IDEOGRAPH-2F84F;Lo;0;L;5674;;;;N;;;;;
+2F850;CJK COMPATIBILITY IDEOGRAPH-2F850;Lo;0;L;5207;;;;N;;;;;
+2F851;CJK COMPATIBILITY IDEOGRAPH-2F851;Lo;0;L;58EE;;;;N;;;;;
+2F852;CJK COMPATIBILITY IDEOGRAPH-2F852;Lo;0;L;57CE;;;;N;;;;;
+2F853;CJK COMPATIBILITY IDEOGRAPH-2F853;Lo;0;L;57F4;;;;N;;;;;
+2F854;CJK COMPATIBILITY IDEOGRAPH-2F854;Lo;0;L;580D;;;;N;;;;;
+2F855;CJK COMPATIBILITY IDEOGRAPH-2F855;Lo;0;L;578B;;;;N;;;;;
+2F856;CJK COMPATIBILITY IDEOGRAPH-2F856;Lo;0;L;5832;;;;N;;;;;
+2F857;CJK COMPATIBILITY IDEOGRAPH-2F857;Lo;0;L;5831;;;;N;;;;;
+2F858;CJK COMPATIBILITY IDEOGRAPH-2F858;Lo;0;L;58AC;;;;N;;;;;
+2F859;CJK COMPATIBILITY IDEOGRAPH-2F859;Lo;0;L;214E4;;;;N;;;;;
+2F85A;CJK COMPATIBILITY IDEOGRAPH-2F85A;Lo;0;L;58F2;;;;N;;;;;
+2F85B;CJK COMPATIBILITY IDEOGRAPH-2F85B;Lo;0;L;58F7;;;;N;;;;;
+2F85C;CJK COMPATIBILITY IDEOGRAPH-2F85C;Lo;0;L;5906;;;;N;;;;;
+2F85D;CJK COMPATIBILITY IDEOGRAPH-2F85D;Lo;0;L;591A;;;;N;;;;;
+2F85E;CJK COMPATIBILITY IDEOGRAPH-2F85E;Lo;0;L;5922;;;;N;;;;;
+2F85F;CJK COMPATIBILITY IDEOGRAPH-2F85F;Lo;0;L;5962;;;;N;;;;;
+2F860;CJK COMPATIBILITY IDEOGRAPH-2F860;Lo;0;L;216A8;;;;N;;;;;
+2F861;CJK COMPATIBILITY IDEOGRAPH-2F861;Lo;0;L;216EA;;;;N;;;;;
+2F862;CJK COMPATIBILITY IDEOGRAPH-2F862;Lo;0;L;59EC;;;;N;;;;;
+2F863;CJK COMPATIBILITY IDEOGRAPH-2F863;Lo;0;L;5A1B;;;;N;;;;;
+2F864;CJK COMPATIBILITY IDEOGRAPH-2F864;Lo;0;L;5A27;;;;N;;;;;
+2F865;CJK COMPATIBILITY IDEOGRAPH-2F865;Lo;0;L;59D8;;;;N;;;;;
+2F866;CJK COMPATIBILITY IDEOGRAPH-2F866;Lo;0;L;5A66;;;;N;;;;;
+2F867;CJK COMPATIBILITY IDEOGRAPH-2F867;Lo;0;L;36EE;;;;N;;;;;
+2F868;CJK COMPATIBILITY IDEOGRAPH-2F868;Lo;0;L;36FC;;;;N;;;;;
+2F869;CJK COMPATIBILITY IDEOGRAPH-2F869;Lo;0;L;5B08;;;;N;;;;;
+2F86A;CJK COMPATIBILITY IDEOGRAPH-2F86A;Lo;0;L;5B3E;;;;N;;;;;
+2F86B;CJK COMPATIBILITY IDEOGRAPH-2F86B;Lo;0;L;5B3E;;;;N;;;;;
+2F86C;CJK COMPATIBILITY IDEOGRAPH-2F86C;Lo;0;L;219C8;;;;N;;;;;
+2F86D;CJK COMPATIBILITY IDEOGRAPH-2F86D;Lo;0;L;5BC3;;;;N;;;;;
+2F86E;CJK COMPATIBILITY IDEOGRAPH-2F86E;Lo;0;L;5BD8;;;;N;;;;;
+2F86F;CJK COMPATIBILITY IDEOGRAPH-2F86F;Lo;0;L;5BE7;;;;N;;;;;
+2F870;CJK COMPATIBILITY IDEOGRAPH-2F870;Lo;0;L;5BF3;;;;N;;;;;
+2F871;CJK COMPATIBILITY IDEOGRAPH-2F871;Lo;0;L;21B18;;;;N;;;;;
+2F872;CJK COMPATIBILITY IDEOGRAPH-2F872;Lo;0;L;5BFF;;;;N;;;;;
+2F873;CJK COMPATIBILITY IDEOGRAPH-2F873;Lo;0;L;5C06;;;;N;;;;;
+2F874;CJK COMPATIBILITY IDEOGRAPH-2F874;Lo;0;L;5F53;;;;N;;;;;
+2F875;CJK COMPATIBILITY IDEOGRAPH-2F875;Lo;0;L;5C22;;;;N;;;;;
+2F876;CJK COMPATIBILITY IDEOGRAPH-2F876;Lo;0;L;3781;;;;N;;;;;
+2F877;CJK COMPATIBILITY IDEOGRAPH-2F877;Lo;0;L;5C60;;;;N;;;;;
+2F878;CJK COMPATIBILITY IDEOGRAPH-2F878;Lo;0;L;5C6E;;;;N;;;;;
+2F879;CJK COMPATIBILITY IDEOGRAPH-2F879;Lo;0;L;5CC0;;;;N;;;;;
+2F87A;CJK COMPATIBILITY IDEOGRAPH-2F87A;Lo;0;L;5C8D;;;;N;;;;;
+2F87B;CJK COMPATIBILITY IDEOGRAPH-2F87B;Lo;0;L;21DE4;;;;N;;;;;
+2F87C;CJK COMPATIBILITY IDEOGRAPH-2F87C;Lo;0;L;5D43;;;;N;;;;;
+2F87D;CJK COMPATIBILITY IDEOGRAPH-2F87D;Lo;0;L;21DE6;;;;N;;;;;
+2F87E;CJK COMPATIBILITY IDEOGRAPH-2F87E;Lo;0;L;5D6E;;;;N;;;;;
+2F87F;CJK COMPATIBILITY IDEOGRAPH-2F87F;Lo;0;L;5D6B;;;;N;;;;;
+2F880;CJK COMPATIBILITY IDEOGRAPH-2F880;Lo;0;L;5D7C;;;;N;;;;;
+2F881;CJK COMPATIBILITY IDEOGRAPH-2F881;Lo;0;L;5DE1;;;;N;;;;;
+2F882;CJK COMPATIBILITY IDEOGRAPH-2F882;Lo;0;L;5DE2;;;;N;;;;;
+2F883;CJK COMPATIBILITY IDEOGRAPH-2F883;Lo;0;L;382F;;;;N;;;;;
+2F884;CJK COMPATIBILITY IDEOGRAPH-2F884;Lo;0;L;5DFD;;;;N;;;;;
+2F885;CJK COMPATIBILITY IDEOGRAPH-2F885;Lo;0;L;5E28;;;;N;;;;;
+2F886;CJK COMPATIBILITY IDEOGRAPH-2F886;Lo;0;L;5E3D;;;;N;;;;;
+2F887;CJK COMPATIBILITY IDEOGRAPH-2F887;Lo;0;L;5E69;;;;N;;;;;
+2F888;CJK COMPATIBILITY IDEOGRAPH-2F888;Lo;0;L;3862;;;;N;;;;;
+2F889;CJK COMPATIBILITY IDEOGRAPH-2F889;Lo;0;L;22183;;;;N;;;;;
+2F88A;CJK COMPATIBILITY IDEOGRAPH-2F88A;Lo;0;L;387C;;;;N;;;;;
+2F88B;CJK COMPATIBILITY IDEOGRAPH-2F88B;Lo;0;L;5EB0;;;;N;;;;;
+2F88C;CJK COMPATIBILITY IDEOGRAPH-2F88C;Lo;0;L;5EB3;;;;N;;;;;
+2F88D;CJK COMPATIBILITY IDEOGRAPH-2F88D;Lo;0;L;5EB6;;;;N;;;;;
+2F88E;CJK COMPATIBILITY IDEOGRAPH-2F88E;Lo;0;L;5ECA;;;;N;;;;;
+2F88F;CJK COMPATIBILITY IDEOGRAPH-2F88F;Lo;0;L;2A392;;;;N;;;;;
+2F890;CJK COMPATIBILITY IDEOGRAPH-2F890;Lo;0;L;5EFE;;;;N;;;;;
+2F891;CJK COMPATIBILITY IDEOGRAPH-2F891;Lo;0;L;22331;;;;N;;;;;
+2F892;CJK COMPATIBILITY IDEOGRAPH-2F892;Lo;0;L;22331;;;;N;;;;;
+2F893;CJK COMPATIBILITY IDEOGRAPH-2F893;Lo;0;L;8201;;;;N;;;;;
+2F894;CJK COMPATIBILITY IDEOGRAPH-2F894;Lo;0;L;5F22;;;;N;;;;;
+2F895;CJK COMPATIBILITY IDEOGRAPH-2F895;Lo;0;L;5F22;;;;N;;;;;
+2F896;CJK COMPATIBILITY IDEOGRAPH-2F896;Lo;0;L;38C7;;;;N;;;;;
+2F897;CJK COMPATIBILITY IDEOGRAPH-2F897;Lo;0;L;232B8;;;;N;;;;;
+2F898;CJK COMPATIBILITY IDEOGRAPH-2F898;Lo;0;L;261DA;;;;N;;;;;
+2F899;CJK COMPATIBILITY IDEOGRAPH-2F899;Lo;0;L;5F62;;;;N;;;;;
+2F89A;CJK COMPATIBILITY IDEOGRAPH-2F89A;Lo;0;L;5F6B;;;;N;;;;;
+2F89B;CJK COMPATIBILITY IDEOGRAPH-2F89B;Lo;0;L;38E3;;;;N;;;;;
+2F89C;CJK COMPATIBILITY IDEOGRAPH-2F89C;Lo;0;L;5F9A;;;;N;;;;;
+2F89D;CJK COMPATIBILITY IDEOGRAPH-2F89D;Lo;0;L;5FCD;;;;N;;;;;
+2F89E;CJK COMPATIBILITY IDEOGRAPH-2F89E;Lo;0;L;5FD7;;;;N;;;;;
+2F89F;CJK COMPATIBILITY IDEOGRAPH-2F89F;Lo;0;L;5FF9;;;;N;;;;;
+2F8A0;CJK COMPATIBILITY IDEOGRAPH-2F8A0;Lo;0;L;6081;;;;N;;;;;
+2F8A1;CJK COMPATIBILITY IDEOGRAPH-2F8A1;Lo;0;L;393A;;;;N;;;;;
+2F8A2;CJK COMPATIBILITY IDEOGRAPH-2F8A2;Lo;0;L;391C;;;;N;;;;;
+2F8A3;CJK COMPATIBILITY IDEOGRAPH-2F8A3;Lo;0;L;6094;;;;N;;;;;
+2F8A4;CJK COMPATIBILITY IDEOGRAPH-2F8A4;Lo;0;L;226D4;;;;N;;;;;
+2F8A5;CJK COMPATIBILITY IDEOGRAPH-2F8A5;Lo;0;L;60C7;;;;N;;;;;
+2F8A6;CJK COMPATIBILITY IDEOGRAPH-2F8A6;Lo;0;L;6148;;;;N;;;;;
+2F8A7;CJK COMPATIBILITY IDEOGRAPH-2F8A7;Lo;0;L;614C;;;;N;;;;;
+2F8A8;CJK COMPATIBILITY IDEOGRAPH-2F8A8;Lo;0;L;614E;;;;N;;;;;
+2F8A9;CJK COMPATIBILITY IDEOGRAPH-2F8A9;Lo;0;L;614C;;;;N;;;;;
+2F8AA;CJK COMPATIBILITY IDEOGRAPH-2F8AA;Lo;0;L;617A;;;;N;;;;;
+2F8AB;CJK COMPATIBILITY IDEOGRAPH-2F8AB;Lo;0;L;618E;;;;N;;;;;
+2F8AC;CJK COMPATIBILITY IDEOGRAPH-2F8AC;Lo;0;L;61B2;;;;N;;;;;
+2F8AD;CJK COMPATIBILITY IDEOGRAPH-2F8AD;Lo;0;L;61A4;;;;N;;;;;
+2F8AE;CJK COMPATIBILITY IDEOGRAPH-2F8AE;Lo;0;L;61AF;;;;N;;;;;
+2F8AF;CJK COMPATIBILITY IDEOGRAPH-2F8AF;Lo;0;L;61DE;;;;N;;;;;
+2F8B0;CJK COMPATIBILITY IDEOGRAPH-2F8B0;Lo;0;L;61F2;;;;N;;;;;
+2F8B1;CJK COMPATIBILITY IDEOGRAPH-2F8B1;Lo;0;L;61F6;;;;N;;;;;
+2F8B2;CJK COMPATIBILITY IDEOGRAPH-2F8B2;Lo;0;L;6210;;;;N;;;;;
+2F8B3;CJK COMPATIBILITY IDEOGRAPH-2F8B3;Lo;0;L;621B;;;;N;;;;;
+2F8B4;CJK COMPATIBILITY IDEOGRAPH-2F8B4;Lo;0;L;625D;;;;N;;;;;
+2F8B5;CJK COMPATIBILITY IDEOGRAPH-2F8B5;Lo;0;L;62B1;;;;N;;;;;
+2F8B6;CJK COMPATIBILITY IDEOGRAPH-2F8B6;Lo;0;L;62D4;;;;N;;;;;
+2F8B7;CJK COMPATIBILITY IDEOGRAPH-2F8B7;Lo;0;L;6350;;;;N;;;;;
+2F8B8;CJK COMPATIBILITY IDEOGRAPH-2F8B8;Lo;0;L;22B0C;;;;N;;;;;
+2F8B9;CJK COMPATIBILITY IDEOGRAPH-2F8B9;Lo;0;L;633D;;;;N;;;;;
+2F8BA;CJK COMPATIBILITY IDEOGRAPH-2F8BA;Lo;0;L;62FC;;;;N;;;;;
+2F8BB;CJK COMPATIBILITY IDEOGRAPH-2F8BB;Lo;0;L;6368;;;;N;;;;;
+2F8BC;CJK COMPATIBILITY IDEOGRAPH-2F8BC;Lo;0;L;6383;;;;N;;;;;
+2F8BD;CJK COMPATIBILITY IDEOGRAPH-2F8BD;Lo;0;L;63E4;;;;N;;;;;
+2F8BE;CJK COMPATIBILITY IDEOGRAPH-2F8BE;Lo;0;L;22BF1;;;;N;;;;;
+2F8BF;CJK COMPATIBILITY IDEOGRAPH-2F8BF;Lo;0;L;6422;;;;N;;;;;
+2F8C0;CJK COMPATIBILITY IDEOGRAPH-2F8C0;Lo;0;L;63C5;;;;N;;;;;
+2F8C1;CJK COMPATIBILITY IDEOGRAPH-2F8C1;Lo;0;L;63A9;;;;N;;;;;
+2F8C2;CJK COMPATIBILITY IDEOGRAPH-2F8C2;Lo;0;L;3A2E;;;;N;;;;;
+2F8C3;CJK COMPATIBILITY IDEOGRAPH-2F8C3;Lo;0;L;6469;;;;N;;;;;
+2F8C4;CJK COMPATIBILITY IDEOGRAPH-2F8C4;Lo;0;L;647E;;;;N;;;;;
+2F8C5;CJK COMPATIBILITY IDEOGRAPH-2F8C5;Lo;0;L;649D;;;;N;;;;;
+2F8C6;CJK COMPATIBILITY IDEOGRAPH-2F8C6;Lo;0;L;6477;;;;N;;;;;
+2F8C7;CJK COMPATIBILITY IDEOGRAPH-2F8C7;Lo;0;L;3A6C;;;;N;;;;;
+2F8C8;CJK COMPATIBILITY IDEOGRAPH-2F8C8;Lo;0;L;654F;;;;N;;;;;
+2F8C9;CJK COMPATIBILITY IDEOGRAPH-2F8C9;Lo;0;L;656C;;;;N;;;;;
+2F8CA;CJK COMPATIBILITY IDEOGRAPH-2F8CA;Lo;0;L;2300A;;;;N;;;;;
+2F8CB;CJK COMPATIBILITY IDEOGRAPH-2F8CB;Lo;0;L;65E3;;;;N;;;;;
+2F8CC;CJK COMPATIBILITY IDEOGRAPH-2F8CC;Lo;0;L;66F8;;;;N;;;;;
+2F8CD;CJK COMPATIBILITY IDEOGRAPH-2F8CD;Lo;0;L;6649;;;;N;;;;;
+2F8CE;CJK COMPATIBILITY IDEOGRAPH-2F8CE;Lo;0;L;3B19;;;;N;;;;;
+2F8CF;CJK COMPATIBILITY IDEOGRAPH-2F8CF;Lo;0;L;6691;;;;N;;;;;
+2F8D0;CJK COMPATIBILITY IDEOGRAPH-2F8D0;Lo;0;L;3B08;;;;N;;;;;
+2F8D1;CJK COMPATIBILITY IDEOGRAPH-2F8D1;Lo;0;L;3AE4;;;;N;;;;;
+2F8D2;CJK COMPATIBILITY IDEOGRAPH-2F8D2;Lo;0;L;5192;;;;N;;;;;
+2F8D3;CJK COMPATIBILITY IDEOGRAPH-2F8D3;Lo;0;L;5195;;;;N;;;;;
+2F8D4;CJK COMPATIBILITY IDEOGRAPH-2F8D4;Lo;0;L;6700;;;;N;;;;;
+2F8D5;CJK COMPATIBILITY IDEOGRAPH-2F8D5;Lo;0;L;669C;;;;N;;;;;
+2F8D6;CJK COMPATIBILITY IDEOGRAPH-2F8D6;Lo;0;L;80AD;;;;N;;;;;
+2F8D7;CJK COMPATIBILITY IDEOGRAPH-2F8D7;Lo;0;L;43D9;;;;N;;;;;
+2F8D8;CJK COMPATIBILITY IDEOGRAPH-2F8D8;Lo;0;L;6717;;;;N;;;;;
+2F8D9;CJK COMPATIBILITY IDEOGRAPH-2F8D9;Lo;0;L;671B;;;;N;;;;;
+2F8DA;CJK COMPATIBILITY IDEOGRAPH-2F8DA;Lo;0;L;6721;;;;N;;;;;
+2F8DB;CJK COMPATIBILITY IDEOGRAPH-2F8DB;Lo;0;L;675E;;;;N;;;;;
+2F8DC;CJK COMPATIBILITY IDEOGRAPH-2F8DC;Lo;0;L;6753;;;;N;;;;;
+2F8DD;CJK COMPATIBILITY IDEOGRAPH-2F8DD;Lo;0;L;233C3;;;;N;;;;;
+2F8DE;CJK COMPATIBILITY IDEOGRAPH-2F8DE;Lo;0;L;3B49;;;;N;;;;;
+2F8DF;CJK COMPATIBILITY IDEOGRAPH-2F8DF;Lo;0;L;67FA;;;;N;;;;;
+2F8E0;CJK COMPATIBILITY IDEOGRAPH-2F8E0;Lo;0;L;6785;;;;N;;;;;
+2F8E1;CJK COMPATIBILITY IDEOGRAPH-2F8E1;Lo;0;L;6852;;;;N;;;;;
+2F8E2;CJK COMPATIBILITY IDEOGRAPH-2F8E2;Lo;0;L;6885;;;;N;;;;;
+2F8E3;CJK COMPATIBILITY IDEOGRAPH-2F8E3;Lo;0;L;2346D;;;;N;;;;;
+2F8E4;CJK COMPATIBILITY IDEOGRAPH-2F8E4;Lo;0;L;688E;;;;N;;;;;
+2F8E5;CJK COMPATIBILITY IDEOGRAPH-2F8E5;Lo;0;L;681F;;;;N;;;;;
+2F8E6;CJK COMPATIBILITY IDEOGRAPH-2F8E6;Lo;0;L;6914;;;;N;;;;;
+2F8E7;CJK COMPATIBILITY IDEOGRAPH-2F8E7;Lo;0;L;3B9D;;;;N;;;;;
+2F8E8;CJK COMPATIBILITY IDEOGRAPH-2F8E8;Lo;0;L;6942;;;;N;;;;;
+2F8E9;CJK COMPATIBILITY IDEOGRAPH-2F8E9;Lo;0;L;69A3;;;;N;;;;;
+2F8EA;CJK COMPATIBILITY IDEOGRAPH-2F8EA;Lo;0;L;69EA;;;;N;;;;;
+2F8EB;CJK COMPATIBILITY IDEOGRAPH-2F8EB;Lo;0;L;6AA8;;;;N;;;;;
+2F8EC;CJK COMPATIBILITY IDEOGRAPH-2F8EC;Lo;0;L;236A3;;;;N;;;;;
+2F8ED;CJK COMPATIBILITY IDEOGRAPH-2F8ED;Lo;0;L;6ADB;;;;N;;;;;
+2F8EE;CJK COMPATIBILITY IDEOGRAPH-2F8EE;Lo;0;L;3C18;;;;N;;;;;
+2F8EF;CJK COMPATIBILITY IDEOGRAPH-2F8EF;Lo;0;L;6B21;;;;N;;;;;
+2F8F0;CJK COMPATIBILITY IDEOGRAPH-2F8F0;Lo;0;L;238A7;;;;N;;;;;
+2F8F1;CJK COMPATIBILITY IDEOGRAPH-2F8F1;Lo;0;L;6B54;;;;N;;;;;
+2F8F2;CJK COMPATIBILITY IDEOGRAPH-2F8F2;Lo;0;L;3C4E;;;;N;;;;;
+2F8F3;CJK COMPATIBILITY IDEOGRAPH-2F8F3;Lo;0;L;6B72;;;;N;;;;;
+2F8F4;CJK COMPATIBILITY IDEOGRAPH-2F8F4;Lo;0;L;6B9F;;;;N;;;;;
+2F8F5;CJK COMPATIBILITY IDEOGRAPH-2F8F5;Lo;0;L;6BBA;;;;N;;;;;
+2F8F6;CJK COMPATIBILITY IDEOGRAPH-2F8F6;Lo;0;L;6BBB;;;;N;;;;;
+2F8F7;CJK COMPATIBILITY IDEOGRAPH-2F8F7;Lo;0;L;23A8D;;;;N;;;;;
+2F8F8;CJK COMPATIBILITY IDEOGRAPH-2F8F8;Lo;0;L;21D0B;;;;N;;;;;
+2F8F9;CJK COMPATIBILITY IDEOGRAPH-2F8F9;Lo;0;L;23AFA;;;;N;;;;;
+2F8FA;CJK COMPATIBILITY IDEOGRAPH-2F8FA;Lo;0;L;6C4E;;;;N;;;;;
+2F8FB;CJK COMPATIBILITY IDEOGRAPH-2F8FB;Lo;0;L;23CBC;;;;N;;;;;
+2F8FC;CJK COMPATIBILITY IDEOGRAPH-2F8FC;Lo;0;L;6CBF;;;;N;;;;;
+2F8FD;CJK COMPATIBILITY IDEOGRAPH-2F8FD;Lo;0;L;6CCD;;;;N;;;;;
+2F8FE;CJK COMPATIBILITY IDEOGRAPH-2F8FE;Lo;0;L;6C67;;;;N;;;;;
+2F8FF;CJK COMPATIBILITY IDEOGRAPH-2F8FF;Lo;0;L;6D16;;;;N;;;;;
+2F900;CJK COMPATIBILITY IDEOGRAPH-2F900;Lo;0;L;6D3E;;;;N;;;;;
+2F901;CJK COMPATIBILITY IDEOGRAPH-2F901;Lo;0;L;6D77;;;;N;;;;;
+2F902;CJK COMPATIBILITY IDEOGRAPH-2F902;Lo;0;L;6D41;;;;N;;;;;
+2F903;CJK COMPATIBILITY IDEOGRAPH-2F903;Lo;0;L;6D69;;;;N;;;;;
+2F904;CJK COMPATIBILITY IDEOGRAPH-2F904;Lo;0;L;6D78;;;;N;;;;;
+2F905;CJK COMPATIBILITY IDEOGRAPH-2F905;Lo;0;L;6D85;;;;N;;;;;
+2F906;CJK COMPATIBILITY IDEOGRAPH-2F906;Lo;0;L;23D1E;;;;N;;;;;
+2F907;CJK COMPATIBILITY IDEOGRAPH-2F907;Lo;0;L;6D34;;;;N;;;;;
+2F908;CJK COMPATIBILITY IDEOGRAPH-2F908;Lo;0;L;6E2F;;;;N;;;;;
+2F909;CJK COMPATIBILITY IDEOGRAPH-2F909;Lo;0;L;6E6E;;;;N;;;;;
+2F90A;CJK COMPATIBILITY IDEOGRAPH-2F90A;Lo;0;L;3D33;;;;N;;;;;
+2F90B;CJK COMPATIBILITY IDEOGRAPH-2F90B;Lo;0;L;6ECB;;;;N;;;;;
+2F90C;CJK COMPATIBILITY IDEOGRAPH-2F90C;Lo;0;L;6EC7;;;;N;;;;;
+2F90D;CJK COMPATIBILITY IDEOGRAPH-2F90D;Lo;0;L;23ED1;;;;N;;;;;
+2F90E;CJK COMPATIBILITY IDEOGRAPH-2F90E;Lo;0;L;6DF9;;;;N;;;;;
+2F90F;CJK COMPATIBILITY IDEOGRAPH-2F90F;Lo;0;L;6F6E;;;;N;;;;;
+2F910;CJK COMPATIBILITY IDEOGRAPH-2F910;Lo;0;L;23F5E;;;;N;;;;;
+2F911;CJK COMPATIBILITY IDEOGRAPH-2F911;Lo;0;L;23F8E;;;;N;;;;;
+2F912;CJK COMPATIBILITY IDEOGRAPH-2F912;Lo;0;L;6FC6;;;;N;;;;;
+2F913;CJK COMPATIBILITY IDEOGRAPH-2F913;Lo;0;L;7039;;;;N;;;;;
+2F914;CJK COMPATIBILITY IDEOGRAPH-2F914;Lo;0;L;701E;;;;N;;;;;
+2F915;CJK COMPATIBILITY IDEOGRAPH-2F915;Lo;0;L;701B;;;;N;;;;;
+2F916;CJK COMPATIBILITY IDEOGRAPH-2F916;Lo;0;L;3D96;;;;N;;;;;
+2F917;CJK COMPATIBILITY IDEOGRAPH-2F917;Lo;0;L;704A;;;;N;;;;;
+2F918;CJK COMPATIBILITY IDEOGRAPH-2F918;Lo;0;L;707D;;;;N;;;;;
+2F919;CJK COMPATIBILITY IDEOGRAPH-2F919;Lo;0;L;7077;;;;N;;;;;
+2F91A;CJK COMPATIBILITY IDEOGRAPH-2F91A;Lo;0;L;70AD;;;;N;;;;;
+2F91B;CJK COMPATIBILITY IDEOGRAPH-2F91B;Lo;0;L;20525;;;;N;;;;;
+2F91C;CJK COMPATIBILITY IDEOGRAPH-2F91C;Lo;0;L;7145;;;;N;;;;;
+2F91D;CJK COMPATIBILITY IDEOGRAPH-2F91D;Lo;0;L;24263;;;;N;;;;;
+2F91E;CJK COMPATIBILITY IDEOGRAPH-2F91E;Lo;0;L;719C;;;;N;;;;;
+2F91F;CJK COMPATIBILITY IDEOGRAPH-2F91F;Lo;0;L;243AB;;;;N;;;;;
+2F920;CJK COMPATIBILITY IDEOGRAPH-2F920;Lo;0;L;7228;;;;N;;;;;
+2F921;CJK COMPATIBILITY IDEOGRAPH-2F921;Lo;0;L;7235;;;;N;;;;;
+2F922;CJK COMPATIBILITY IDEOGRAPH-2F922;Lo;0;L;7250;;;;N;;;;;
+2F923;CJK COMPATIBILITY IDEOGRAPH-2F923;Lo;0;L;24608;;;;N;;;;;
+2F924;CJK COMPATIBILITY IDEOGRAPH-2F924;Lo;0;L;7280;;;;N;;;;;
+2F925;CJK COMPATIBILITY IDEOGRAPH-2F925;Lo;0;L;7295;;;;N;;;;;
+2F926;CJK COMPATIBILITY IDEOGRAPH-2F926;Lo;0;L;24735;;;;N;;;;;
+2F927;CJK COMPATIBILITY IDEOGRAPH-2F927;Lo;0;L;24814;;;;N;;;;;
+2F928;CJK COMPATIBILITY IDEOGRAPH-2F928;Lo;0;L;737A;;;;N;;;;;
+2F929;CJK COMPATIBILITY IDEOGRAPH-2F929;Lo;0;L;738B;;;;N;;;;;
+2F92A;CJK COMPATIBILITY IDEOGRAPH-2F92A;Lo;0;L;3EAC;;;;N;;;;;
+2F92B;CJK COMPATIBILITY IDEOGRAPH-2F92B;Lo;0;L;73A5;;;;N;;;;;
+2F92C;CJK COMPATIBILITY IDEOGRAPH-2F92C;Lo;0;L;3EB8;;;;N;;;;;
+2F92D;CJK COMPATIBILITY IDEOGRAPH-2F92D;Lo;0;L;3EB8;;;;N;;;;;
+2F92E;CJK COMPATIBILITY IDEOGRAPH-2F92E;Lo;0;L;7447;;;;N;;;;;
+2F92F;CJK COMPATIBILITY IDEOGRAPH-2F92F;Lo;0;L;745C;;;;N;;;;;
+2F930;CJK COMPATIBILITY IDEOGRAPH-2F930;Lo;0;L;7471;;;;N;;;;;
+2F931;CJK COMPATIBILITY IDEOGRAPH-2F931;Lo;0;L;7485;;;;N;;;;;
+2F932;CJK COMPATIBILITY IDEOGRAPH-2F932;Lo;0;L;74CA;;;;N;;;;;
+2F933;CJK COMPATIBILITY IDEOGRAPH-2F933;Lo;0;L;3F1B;;;;N;;;;;
+2F934;CJK COMPATIBILITY IDEOGRAPH-2F934;Lo;0;L;7524;;;;N;;;;;
+2F935;CJK COMPATIBILITY IDEOGRAPH-2F935;Lo;0;L;24C36;;;;N;;;;;
+2F936;CJK COMPATIBILITY IDEOGRAPH-2F936;Lo;0;L;753E;;;;N;;;;;
+2F937;CJK COMPATIBILITY IDEOGRAPH-2F937;Lo;0;L;24C92;;;;N;;;;;
+2F938;CJK COMPATIBILITY IDEOGRAPH-2F938;Lo;0;L;7570;;;;N;;;;;
+2F939;CJK COMPATIBILITY IDEOGRAPH-2F939;Lo;0;L;2219F;;;;N;;;;;
+2F93A;CJK COMPATIBILITY IDEOGRAPH-2F93A;Lo;0;L;7610;;;;N;;;;;
+2F93B;CJK COMPATIBILITY IDEOGRAPH-2F93B;Lo;0;L;24FA1;;;;N;;;;;
+2F93C;CJK COMPATIBILITY IDEOGRAPH-2F93C;Lo;0;L;24FB8;;;;N;;;;;
+2F93D;CJK COMPATIBILITY IDEOGRAPH-2F93D;Lo;0;L;25044;;;;N;;;;;
+2F93E;CJK COMPATIBILITY IDEOGRAPH-2F93E;Lo;0;L;3FFC;;;;N;;;;;
+2F93F;CJK COMPATIBILITY IDEOGRAPH-2F93F;Lo;0;L;4008;;;;N;;;;;
+2F940;CJK COMPATIBILITY IDEOGRAPH-2F940;Lo;0;L;76F4;;;;N;;;;;
+2F941;CJK COMPATIBILITY IDEOGRAPH-2F941;Lo;0;L;250F3;;;;N;;;;;
+2F942;CJK COMPATIBILITY IDEOGRAPH-2F942;Lo;0;L;250F2;;;;N;;;;;
+2F943;CJK COMPATIBILITY IDEOGRAPH-2F943;Lo;0;L;25119;;;;N;;;;;
+2F944;CJK COMPATIBILITY IDEOGRAPH-2F944;Lo;0;L;25133;;;;N;;;;;
+2F945;CJK COMPATIBILITY IDEOGRAPH-2F945;Lo;0;L;771E;;;;N;;;;;
+2F946;CJK COMPATIBILITY IDEOGRAPH-2F946;Lo;0;L;771F;;;;N;;;;;
+2F947;CJK COMPATIBILITY IDEOGRAPH-2F947;Lo;0;L;771F;;;;N;;;;;
+2F948;CJK COMPATIBILITY IDEOGRAPH-2F948;Lo;0;L;774A;;;;N;;;;;
+2F949;CJK COMPATIBILITY IDEOGRAPH-2F949;Lo;0;L;4039;;;;N;;;;;
+2F94A;CJK COMPATIBILITY IDEOGRAPH-2F94A;Lo;0;L;778B;;;;N;;;;;
+2F94B;CJK COMPATIBILITY IDEOGRAPH-2F94B;Lo;0;L;4046;;;;N;;;;;
+2F94C;CJK COMPATIBILITY IDEOGRAPH-2F94C;Lo;0;L;4096;;;;N;;;;;
+2F94D;CJK COMPATIBILITY IDEOGRAPH-2F94D;Lo;0;L;2541D;;;;N;;;;;
+2F94E;CJK COMPATIBILITY IDEOGRAPH-2F94E;Lo;0;L;784E;;;;N;;;;;
+2F94F;CJK COMPATIBILITY IDEOGRAPH-2F94F;Lo;0;L;788C;;;;N;;;;;
+2F950;CJK COMPATIBILITY IDEOGRAPH-2F950;Lo;0;L;78CC;;;;N;;;;;
+2F951;CJK COMPATIBILITY IDEOGRAPH-2F951;Lo;0;L;40E3;;;;N;;;;;
+2F952;CJK COMPATIBILITY IDEOGRAPH-2F952;Lo;0;L;25626;;;;N;;;;;
+2F953;CJK COMPATIBILITY IDEOGRAPH-2F953;Lo;0;L;7956;;;;N;;;;;
+2F954;CJK COMPATIBILITY IDEOGRAPH-2F954;Lo;0;L;2569A;;;;N;;;;;
+2F955;CJK COMPATIBILITY IDEOGRAPH-2F955;Lo;0;L;256C5;;;;N;;;;;
+2F956;CJK COMPATIBILITY IDEOGRAPH-2F956;Lo;0;L;798F;;;;N;;;;;
+2F957;CJK COMPATIBILITY IDEOGRAPH-2F957;Lo;0;L;79EB;;;;N;;;;;
+2F958;CJK COMPATIBILITY IDEOGRAPH-2F958;Lo;0;L;412F;;;;N;;;;;
+2F959;CJK COMPATIBILITY IDEOGRAPH-2F959;Lo;0;L;7A40;;;;N;;;;;
+2F95A;CJK COMPATIBILITY IDEOGRAPH-2F95A;Lo;0;L;7A4A;;;;N;;;;;
+2F95B;CJK COMPATIBILITY IDEOGRAPH-2F95B;Lo;0;L;7A4F;;;;N;;;;;
+2F95C;CJK COMPATIBILITY IDEOGRAPH-2F95C;Lo;0;L;2597C;;;;N;;;;;
+2F95D;CJK COMPATIBILITY IDEOGRAPH-2F95D;Lo;0;L;25AA7;;;;N;;;;;
+2F95E;CJK COMPATIBILITY IDEOGRAPH-2F95E;Lo;0;L;25AA7;;;;N;;;;;
+2F95F;CJK COMPATIBILITY IDEOGRAPH-2F95F;Lo;0;L;7AEE;;;;N;;;;;
+2F960;CJK COMPATIBILITY IDEOGRAPH-2F960;Lo;0;L;4202;;;;N;;;;;
+2F961;CJK COMPATIBILITY IDEOGRAPH-2F961;Lo;0;L;25BAB;;;;N;;;;;
+2F962;CJK COMPATIBILITY IDEOGRAPH-2F962;Lo;0;L;7BC6;;;;N;;;;;
+2F963;CJK COMPATIBILITY IDEOGRAPH-2F963;Lo;0;L;7BC9;;;;N;;;;;
+2F964;CJK COMPATIBILITY IDEOGRAPH-2F964;Lo;0;L;4227;;;;N;;;;;
+2F965;CJK COMPATIBILITY IDEOGRAPH-2F965;Lo;0;L;25C80;;;;N;;;;;
+2F966;CJK COMPATIBILITY IDEOGRAPH-2F966;Lo;0;L;7CD2;;;;N;;;;;
+2F967;CJK COMPATIBILITY IDEOGRAPH-2F967;Lo;0;L;42A0;;;;N;;;;;
+2F968;CJK COMPATIBILITY IDEOGRAPH-2F968;Lo;0;L;7CE8;;;;N;;;;;
+2F969;CJK COMPATIBILITY IDEOGRAPH-2F969;Lo;0;L;7CE3;;;;N;;;;;
+2F96A;CJK COMPATIBILITY IDEOGRAPH-2F96A;Lo;0;L;7D00;;;;N;;;;;
+2F96B;CJK COMPATIBILITY IDEOGRAPH-2F96B;Lo;0;L;25F86;;;;N;;;;;
+2F96C;CJK COMPATIBILITY IDEOGRAPH-2F96C;Lo;0;L;7D63;;;;N;;;;;
+2F96D;CJK COMPATIBILITY IDEOGRAPH-2F96D;Lo;0;L;4301;;;;N;;;;;
+2F96E;CJK COMPATIBILITY IDEOGRAPH-2F96E;Lo;0;L;7DC7;;;;N;;;;;
+2F96F;CJK COMPATIBILITY IDEOGRAPH-2F96F;Lo;0;L;7E02;;;;N;;;;;
+2F970;CJK COMPATIBILITY IDEOGRAPH-2F970;Lo;0;L;7E45;;;;N;;;;;
+2F971;CJK COMPATIBILITY IDEOGRAPH-2F971;Lo;0;L;4334;;;;N;;;;;
+2F972;CJK COMPATIBILITY IDEOGRAPH-2F972;Lo;0;L;26228;;;;N;;;;;
+2F973;CJK COMPATIBILITY IDEOGRAPH-2F973;Lo;0;L;26247;;;;N;;;;;
+2F974;CJK COMPATIBILITY IDEOGRAPH-2F974;Lo;0;L;4359;;;;N;;;;;
+2F975;CJK COMPATIBILITY IDEOGRAPH-2F975;Lo;0;L;262D9;;;;N;;;;;
+2F976;CJK COMPATIBILITY IDEOGRAPH-2F976;Lo;0;L;7F7A;;;;N;;;;;
+2F977;CJK COMPATIBILITY IDEOGRAPH-2F977;Lo;0;L;2633E;;;;N;;;;;
+2F978;CJK COMPATIBILITY IDEOGRAPH-2F978;Lo;0;L;7F95;;;;N;;;;;
+2F979;CJK COMPATIBILITY IDEOGRAPH-2F979;Lo;0;L;7FFA;;;;N;;;;;
+2F97A;CJK COMPATIBILITY IDEOGRAPH-2F97A;Lo;0;L;8005;;;;N;;;;;
+2F97B;CJK COMPATIBILITY IDEOGRAPH-2F97B;Lo;0;L;264DA;;;;N;;;;;
+2F97C;CJK COMPATIBILITY IDEOGRAPH-2F97C;Lo;0;L;26523;;;;N;;;;;
+2F97D;CJK COMPATIBILITY IDEOGRAPH-2F97D;Lo;0;L;8060;;;;N;;;;;
+2F97E;CJK COMPATIBILITY IDEOGRAPH-2F97E;Lo;0;L;265A8;;;;N;;;;;
+2F97F;CJK COMPATIBILITY IDEOGRAPH-2F97F;Lo;0;L;8070;;;;N;;;;;
+2F980;CJK COMPATIBILITY IDEOGRAPH-2F980;Lo;0;L;2335F;;;;N;;;;;
+2F981;CJK COMPATIBILITY IDEOGRAPH-2F981;Lo;0;L;43D5;;;;N;;;;;
+2F982;CJK COMPATIBILITY IDEOGRAPH-2F982;Lo;0;L;80B2;;;;N;;;;;
+2F983;CJK COMPATIBILITY IDEOGRAPH-2F983;Lo;0;L;8103;;;;N;;;;;
+2F984;CJK COMPATIBILITY IDEOGRAPH-2F984;Lo;0;L;440B;;;;N;;;;;
+2F985;CJK COMPATIBILITY IDEOGRAPH-2F985;Lo;0;L;813E;;;;N;;;;;
+2F986;CJK COMPATIBILITY IDEOGRAPH-2F986;Lo;0;L;5AB5;;;;N;;;;;
+2F987;CJK COMPATIBILITY IDEOGRAPH-2F987;Lo;0;L;267A7;;;;N;;;;;
+2F988;CJK COMPATIBILITY IDEOGRAPH-2F988;Lo;0;L;267B5;;;;N;;;;;
+2F989;CJK COMPATIBILITY IDEOGRAPH-2F989;Lo;0;L;23393;;;;N;;;;;
+2F98A;CJK COMPATIBILITY IDEOGRAPH-2F98A;Lo;0;L;2339C;;;;N;;;;;
+2F98B;CJK COMPATIBILITY IDEOGRAPH-2F98B;Lo;0;L;8201;;;;N;;;;;
+2F98C;CJK COMPATIBILITY IDEOGRAPH-2F98C;Lo;0;L;8204;;;;N;;;;;
+2F98D;CJK COMPATIBILITY IDEOGRAPH-2F98D;Lo;0;L;8F9E;;;;N;;;;;
+2F98E;CJK COMPATIBILITY IDEOGRAPH-2F98E;Lo;0;L;446B;;;;N;;;;;
+2F98F;CJK COMPATIBILITY IDEOGRAPH-2F98F;Lo;0;L;8291;;;;N;;;;;
+2F990;CJK COMPATIBILITY IDEOGRAPH-2F990;Lo;0;L;828B;;;;N;;;;;
+2F991;CJK COMPATIBILITY IDEOGRAPH-2F991;Lo;0;L;829D;;;;N;;;;;
+2F992;CJK COMPATIBILITY IDEOGRAPH-2F992;Lo;0;L;52B3;;;;N;;;;;
+2F993;CJK COMPATIBILITY IDEOGRAPH-2F993;Lo;0;L;82B1;;;;N;;;;;
+2F994;CJK COMPATIBILITY IDEOGRAPH-2F994;Lo;0;L;82B3;;;;N;;;;;
+2F995;CJK COMPATIBILITY IDEOGRAPH-2F995;Lo;0;L;82BD;;;;N;;;;;
+2F996;CJK COMPATIBILITY IDEOGRAPH-2F996;Lo;0;L;82E6;;;;N;;;;;
+2F997;CJK COMPATIBILITY IDEOGRAPH-2F997;Lo;0;L;26B3C;;;;N;;;;;
+2F998;CJK COMPATIBILITY IDEOGRAPH-2F998;Lo;0;L;82E5;;;;N;;;;;
+2F999;CJK COMPATIBILITY IDEOGRAPH-2F999;Lo;0;L;831D;;;;N;;;;;
+2F99A;CJK COMPATIBILITY IDEOGRAPH-2F99A;Lo;0;L;8363;;;;N;;;;;
+2F99B;CJK COMPATIBILITY IDEOGRAPH-2F99B;Lo;0;L;83AD;;;;N;;;;;
+2F99C;CJK COMPATIBILITY IDEOGRAPH-2F99C;Lo;0;L;8323;;;;N;;;;;
+2F99D;CJK COMPATIBILITY IDEOGRAPH-2F99D;Lo;0;L;83BD;;;;N;;;;;
+2F99E;CJK COMPATIBILITY IDEOGRAPH-2F99E;Lo;0;L;83E7;;;;N;;;;;
+2F99F;CJK COMPATIBILITY IDEOGRAPH-2F99F;Lo;0;L;8457;;;;N;;;;;
+2F9A0;CJK COMPATIBILITY IDEOGRAPH-2F9A0;Lo;0;L;8353;;;;N;;;;;
+2F9A1;CJK COMPATIBILITY IDEOGRAPH-2F9A1;Lo;0;L;83CA;;;;N;;;;;
+2F9A2;CJK COMPATIBILITY IDEOGRAPH-2F9A2;Lo;0;L;83CC;;;;N;;;;;
+2F9A3;CJK COMPATIBILITY IDEOGRAPH-2F9A3;Lo;0;L;83DC;;;;N;;;;;
+2F9A4;CJK COMPATIBILITY IDEOGRAPH-2F9A4;Lo;0;L;26C36;;;;N;;;;;
+2F9A5;CJK COMPATIBILITY IDEOGRAPH-2F9A5;Lo;0;L;26D6B;;;;N;;;;;
+2F9A6;CJK COMPATIBILITY IDEOGRAPH-2F9A6;Lo;0;L;26CD5;;;;N;;;;;
+2F9A7;CJK COMPATIBILITY IDEOGRAPH-2F9A7;Lo;0;L;452B;;;;N;;;;;
+2F9A8;CJK COMPATIBILITY IDEOGRAPH-2F9A8;Lo;0;L;84F1;;;;N;;;;;
+2F9A9;CJK COMPATIBILITY IDEOGRAPH-2F9A9;Lo;0;L;84F3;;;;N;;;;;
+2F9AA;CJK COMPATIBILITY IDEOGRAPH-2F9AA;Lo;0;L;8516;;;;N;;;;;
+2F9AB;CJK COMPATIBILITY IDEOGRAPH-2F9AB;Lo;0;L;273CA;;;;N;;;;;
+2F9AC;CJK COMPATIBILITY IDEOGRAPH-2F9AC;Lo;0;L;8564;;;;N;;;;;
+2F9AD;CJK COMPATIBILITY IDEOGRAPH-2F9AD;Lo;0;L;26F2C;;;;N;;;;;
+2F9AE;CJK COMPATIBILITY IDEOGRAPH-2F9AE;Lo;0;L;455D;;;;N;;;;;
+2F9AF;CJK COMPATIBILITY IDEOGRAPH-2F9AF;Lo;0;L;4561;;;;N;;;;;
+2F9B0;CJK COMPATIBILITY IDEOGRAPH-2F9B0;Lo;0;L;26FB1;;;;N;;;;;
+2F9B1;CJK COMPATIBILITY IDEOGRAPH-2F9B1;Lo;0;L;270D2;;;;N;;;;;
+2F9B2;CJK COMPATIBILITY IDEOGRAPH-2F9B2;Lo;0;L;456B;;;;N;;;;;
+2F9B3;CJK COMPATIBILITY IDEOGRAPH-2F9B3;Lo;0;L;8650;;;;N;;;;;
+2F9B4;CJK COMPATIBILITY IDEOGRAPH-2F9B4;Lo;0;L;865C;;;;N;;;;;
+2F9B5;CJK COMPATIBILITY IDEOGRAPH-2F9B5;Lo;0;L;8667;;;;N;;;;;
+2F9B6;CJK COMPATIBILITY IDEOGRAPH-2F9B6;Lo;0;L;8669;;;;N;;;;;
+2F9B7;CJK COMPATIBILITY IDEOGRAPH-2F9B7;Lo;0;L;86A9;;;;N;;;;;
+2F9B8;CJK COMPATIBILITY IDEOGRAPH-2F9B8;Lo;0;L;8688;;;;N;;;;;
+2F9B9;CJK COMPATIBILITY IDEOGRAPH-2F9B9;Lo;0;L;870E;;;;N;;;;;
+2F9BA;CJK COMPATIBILITY IDEOGRAPH-2F9BA;Lo;0;L;86E2;;;;N;;;;;
+2F9BB;CJK COMPATIBILITY IDEOGRAPH-2F9BB;Lo;0;L;8779;;;;N;;;;;
+2F9BC;CJK COMPATIBILITY IDEOGRAPH-2F9BC;Lo;0;L;8728;;;;N;;;;;
+2F9BD;CJK COMPATIBILITY IDEOGRAPH-2F9BD;Lo;0;L;876B;;;;N;;;;;
+2F9BE;CJK COMPATIBILITY IDEOGRAPH-2F9BE;Lo;0;L;8786;;;;N;;;;;
+2F9BF;CJK COMPATIBILITY IDEOGRAPH-2F9BF;Lo;0;L;45D7;;;;N;;;;;
+2F9C0;CJK COMPATIBILITY IDEOGRAPH-2F9C0;Lo;0;L;87E1;;;;N;;;;;
+2F9C1;CJK COMPATIBILITY IDEOGRAPH-2F9C1;Lo;0;L;8801;;;;N;;;;;
+2F9C2;CJK COMPATIBILITY IDEOGRAPH-2F9C2;Lo;0;L;45F9;;;;N;;;;;
+2F9C3;CJK COMPATIBILITY IDEOGRAPH-2F9C3;Lo;0;L;8860;;;;N;;;;;
+2F9C4;CJK COMPATIBILITY IDEOGRAPH-2F9C4;Lo;0;L;8863;;;;N;;;;;
+2F9C5;CJK COMPATIBILITY IDEOGRAPH-2F9C5;Lo;0;L;27667;;;;N;;;;;
+2F9C6;CJK COMPATIBILITY IDEOGRAPH-2F9C6;Lo;0;L;88D7;;;;N;;;;;
+2F9C7;CJK COMPATIBILITY IDEOGRAPH-2F9C7;Lo;0;L;88DE;;;;N;;;;;
+2F9C8;CJK COMPATIBILITY IDEOGRAPH-2F9C8;Lo;0;L;4635;;;;N;;;;;
+2F9C9;CJK COMPATIBILITY IDEOGRAPH-2F9C9;Lo;0;L;88FA;;;;N;;;;;
+2F9CA;CJK COMPATIBILITY IDEOGRAPH-2F9CA;Lo;0;L;34BB;;;;N;;;;;
+2F9CB;CJK COMPATIBILITY IDEOGRAPH-2F9CB;Lo;0;L;278AE;;;;N;;;;;
+2F9CC;CJK COMPATIBILITY IDEOGRAPH-2F9CC;Lo;0;L;27966;;;;N;;;;;
+2F9CD;CJK COMPATIBILITY IDEOGRAPH-2F9CD;Lo;0;L;46BE;;;;N;;;;;
+2F9CE;CJK COMPATIBILITY IDEOGRAPH-2F9CE;Lo;0;L;46C7;;;;N;;;;;
+2F9CF;CJK COMPATIBILITY IDEOGRAPH-2F9CF;Lo;0;L;8AA0;;;;N;;;;;
+2F9D0;CJK COMPATIBILITY IDEOGRAPH-2F9D0;Lo;0;L;8AED;;;;N;;;;;
+2F9D1;CJK COMPATIBILITY IDEOGRAPH-2F9D1;Lo;0;L;8B8A;;;;N;;;;;
+2F9D2;CJK COMPATIBILITY IDEOGRAPH-2F9D2;Lo;0;L;8C55;;;;N;;;;;
+2F9D3;CJK COMPATIBILITY IDEOGRAPH-2F9D3;Lo;0;L;27CA8;;;;N;;;;;
+2F9D4;CJK COMPATIBILITY IDEOGRAPH-2F9D4;Lo;0;L;8CAB;;;;N;;;;;
+2F9D5;CJK COMPATIBILITY IDEOGRAPH-2F9D5;Lo;0;L;8CC1;;;;N;;;;;
+2F9D6;CJK COMPATIBILITY IDEOGRAPH-2F9D6;Lo;0;L;8D1B;;;;N;;;;;
+2F9D7;CJK COMPATIBILITY IDEOGRAPH-2F9D7;Lo;0;L;8D77;;;;N;;;;;
+2F9D8;CJK COMPATIBILITY IDEOGRAPH-2F9D8;Lo;0;L;27F2F;;;;N;;;;;
+2F9D9;CJK COMPATIBILITY IDEOGRAPH-2F9D9;Lo;0;L;20804;;;;N;;;;;
+2F9DA;CJK COMPATIBILITY IDEOGRAPH-2F9DA;Lo;0;L;8DCB;;;;N;;;;;
+2F9DB;CJK COMPATIBILITY IDEOGRAPH-2F9DB;Lo;0;L;8DBC;;;;N;;;;;
+2F9DC;CJK COMPATIBILITY IDEOGRAPH-2F9DC;Lo;0;L;8DF0;;;;N;;;;;
+2F9DD;CJK COMPATIBILITY IDEOGRAPH-2F9DD;Lo;0;L;208DE;;;;N;;;;;
+2F9DE;CJK COMPATIBILITY IDEOGRAPH-2F9DE;Lo;0;L;8ED4;;;;N;;;;;
+2F9DF;CJK COMPATIBILITY IDEOGRAPH-2F9DF;Lo;0;L;8F38;;;;N;;;;;
+2F9E0;CJK COMPATIBILITY IDEOGRAPH-2F9E0;Lo;0;L;285D2;;;;N;;;;;
+2F9E1;CJK COMPATIBILITY IDEOGRAPH-2F9E1;Lo;0;L;285ED;;;;N;;;;;
+2F9E2;CJK COMPATIBILITY IDEOGRAPH-2F9E2;Lo;0;L;9094;;;;N;;;;;
+2F9E3;CJK COMPATIBILITY IDEOGRAPH-2F9E3;Lo;0;L;90F1;;;;N;;;;;
+2F9E4;CJK COMPATIBILITY IDEOGRAPH-2F9E4;Lo;0;L;9111;;;;N;;;;;
+2F9E5;CJK COMPATIBILITY IDEOGRAPH-2F9E5;Lo;0;L;2872E;;;;N;;;;;
+2F9E6;CJK COMPATIBILITY IDEOGRAPH-2F9E6;Lo;0;L;911B;;;;N;;;;;
+2F9E7;CJK COMPATIBILITY IDEOGRAPH-2F9E7;Lo;0;L;9238;;;;N;;;;;
+2F9E8;CJK COMPATIBILITY IDEOGRAPH-2F9E8;Lo;0;L;92D7;;;;N;;;;;
+2F9E9;CJK COMPATIBILITY IDEOGRAPH-2F9E9;Lo;0;L;92D8;;;;N;;;;;
+2F9EA;CJK COMPATIBILITY IDEOGRAPH-2F9EA;Lo;0;L;927C;;;;N;;;;;
+2F9EB;CJK COMPATIBILITY IDEOGRAPH-2F9EB;Lo;0;L;93F9;;;;N;;;;;
+2F9EC;CJK COMPATIBILITY IDEOGRAPH-2F9EC;Lo;0;L;9415;;;;N;;;;;
+2F9ED;CJK COMPATIBILITY IDEOGRAPH-2F9ED;Lo;0;L;28BFA;;;;N;;;;;
+2F9EE;CJK COMPATIBILITY IDEOGRAPH-2F9EE;Lo;0;L;958B;;;;N;;;;;
+2F9EF;CJK COMPATIBILITY IDEOGRAPH-2F9EF;Lo;0;L;4995;;;;N;;;;;
+2F9F0;CJK COMPATIBILITY IDEOGRAPH-2F9F0;Lo;0;L;95B7;;;;N;;;;;
+2F9F1;CJK COMPATIBILITY IDEOGRAPH-2F9F1;Lo;0;L;28D77;;;;N;;;;;
+2F9F2;CJK COMPATIBILITY IDEOGRAPH-2F9F2;Lo;0;L;49E6;;;;N;;;;;
+2F9F3;CJK COMPATIBILITY IDEOGRAPH-2F9F3;Lo;0;L;96C3;;;;N;;;;;
+2F9F4;CJK COMPATIBILITY IDEOGRAPH-2F9F4;Lo;0;L;5DB2;;;;N;;;;;
+2F9F5;CJK COMPATIBILITY IDEOGRAPH-2F9F5;Lo;0;L;9723;;;;N;;;;;
+2F9F6;CJK COMPATIBILITY IDEOGRAPH-2F9F6;Lo;0;L;29145;;;;N;;;;;
+2F9F7;CJK COMPATIBILITY IDEOGRAPH-2F9F7;Lo;0;L;2921A;;;;N;;;;;
+2F9F8;CJK COMPATIBILITY IDEOGRAPH-2F9F8;Lo;0;L;4A6E;;;;N;;;;;
+2F9F9;CJK COMPATIBILITY IDEOGRAPH-2F9F9;Lo;0;L;4A76;;;;N;;;;;
+2F9FA;CJK COMPATIBILITY IDEOGRAPH-2F9FA;Lo;0;L;97E0;;;;N;;;;;
+2F9FB;CJK COMPATIBILITY IDEOGRAPH-2F9FB;Lo;0;L;2940A;;;;N;;;;;
+2F9FC;CJK COMPATIBILITY IDEOGRAPH-2F9FC;Lo;0;L;4AB2;;;;N;;;;;
+2F9FD;CJK COMPATIBILITY IDEOGRAPH-2F9FD;Lo;0;L;29496;;;;N;;;;;
+2F9FE;CJK COMPATIBILITY IDEOGRAPH-2F9FE;Lo;0;L;980B;;;;N;;;;;
+2F9FF;CJK COMPATIBILITY IDEOGRAPH-2F9FF;Lo;0;L;980B;;;;N;;;;;
+2FA00;CJK COMPATIBILITY IDEOGRAPH-2FA00;Lo;0;L;9829;;;;N;;;;;
+2FA01;CJK COMPATIBILITY IDEOGRAPH-2FA01;Lo;0;L;295B6;;;;N;;;;;
+2FA02;CJK COMPATIBILITY IDEOGRAPH-2FA02;Lo;0;L;98E2;;;;N;;;;;
+2FA03;CJK COMPATIBILITY IDEOGRAPH-2FA03;Lo;0;L;4B33;;;;N;;;;;
+2FA04;CJK COMPATIBILITY IDEOGRAPH-2FA04;Lo;0;L;9929;;;;N;;;;;
+2FA05;CJK COMPATIBILITY IDEOGRAPH-2FA05;Lo;0;L;99A7;;;;N;;;;;
+2FA06;CJK COMPATIBILITY IDEOGRAPH-2FA06;Lo;0;L;99C2;;;;N;;;;;
+2FA07;CJK COMPATIBILITY IDEOGRAPH-2FA07;Lo;0;L;99FE;;;;N;;;;;
+2FA08;CJK COMPATIBILITY IDEOGRAPH-2FA08;Lo;0;L;4BCE;;;;N;;;;;
+2FA09;CJK COMPATIBILITY IDEOGRAPH-2FA09;Lo;0;L;29B30;;;;N;;;;;
+2FA0A;CJK COMPATIBILITY IDEOGRAPH-2FA0A;Lo;0;L;9B12;;;;N;;;;;
+2FA0B;CJK COMPATIBILITY IDEOGRAPH-2FA0B;Lo;0;L;9C40;;;;N;;;;;
+2FA0C;CJK COMPATIBILITY IDEOGRAPH-2FA0C;Lo;0;L;9CFD;;;;N;;;;;
+2FA0D;CJK COMPATIBILITY IDEOGRAPH-2FA0D;Lo;0;L;4CCE;;;;N;;;;;
+2FA0E;CJK COMPATIBILITY IDEOGRAPH-2FA0E;Lo;0;L;4CED;;;;N;;;;;
+2FA0F;CJK COMPATIBILITY IDEOGRAPH-2FA0F;Lo;0;L;9D67;;;;N;;;;;
+2FA10;CJK COMPATIBILITY IDEOGRAPH-2FA10;Lo;0;L;2A0CE;;;;N;;;;;
+2FA11;CJK COMPATIBILITY IDEOGRAPH-2FA11;Lo;0;L;4CF8;;;;N;;;;;
+2FA12;CJK COMPATIBILITY IDEOGRAPH-2FA12;Lo;0;L;2A105;;;;N;;;;;
+2FA13;CJK COMPATIBILITY IDEOGRAPH-2FA13;Lo;0;L;2A20E;;;;N;;;;;
+2FA14;CJK COMPATIBILITY IDEOGRAPH-2FA14;Lo;0;L;2A291;;;;N;;;;;
+2FA15;CJK COMPATIBILITY IDEOGRAPH-2FA15;Lo;0;L;9EBB;;;;N;;;;;
+2FA16;CJK COMPATIBILITY IDEOGRAPH-2FA16;Lo;0;L;4D56;;;;N;;;;;
+2FA17;CJK COMPATIBILITY IDEOGRAPH-2FA17;Lo;0;L;9EF9;;;;N;;;;;
+2FA18;CJK COMPATIBILITY IDEOGRAPH-2FA18;Lo;0;L;9EFE;;;;N;;;;;
+2FA19;CJK COMPATIBILITY IDEOGRAPH-2FA19;Lo;0;L;9F05;;;;N;;;;;
+2FA1A;CJK COMPATIBILITY IDEOGRAPH-2FA1A;Lo;0;L;9F0F;;;;N;;;;;
+2FA1B;CJK COMPATIBILITY IDEOGRAPH-2FA1B;Lo;0;L;9F16;;;;N;;;;;
+2FA1C;CJK COMPATIBILITY IDEOGRAPH-2FA1C;Lo;0;L;9F3B;;;;N;;;;;
+2FA1D;CJK COMPATIBILITY IDEOGRAPH-2FA1D;Lo;0;L;2A600;;;;N;;;;;
+E0001;LANGUAGE TAG;Cf;0;BN;;;;;N;;;;;
+E0020;TAG SPACE;Cf;0;BN;;;;;N;;;;;
+E0021;TAG EXCLAMATION MARK;Cf;0;BN;;;;;N;;;;;
+E0022;TAG QUOTATION MARK;Cf;0;BN;;;;;N;;;;;
+E0023;TAG NUMBER SIGN;Cf;0;BN;;;;;N;;;;;
+E0024;TAG DOLLAR SIGN;Cf;0;BN;;;;;N;;;;;
+E0025;TAG PERCENT SIGN;Cf;0;BN;;;;;N;;;;;
+E0026;TAG AMPERSAND;Cf;0;BN;;;;;N;;;;;
+E0027;TAG APOSTROPHE;Cf;0;BN;;;;;N;;;;;
+E0028;TAG LEFT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E0029;TAG RIGHT PARENTHESIS;Cf;0;BN;;;;;N;;;;;
+E002A;TAG ASTERISK;Cf;0;BN;;;;;N;;;;;
+E002B;TAG PLUS SIGN;Cf;0;BN;;;;;N;;;;;
+E002C;TAG COMMA;Cf;0;BN;;;;;N;;;;;
+E002D;TAG HYPHEN-MINUS;Cf;0;BN;;;;;N;;;;;
+E002E;TAG FULL STOP;Cf;0;BN;;;;;N;;;;;
+E002F;TAG SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E0030;TAG DIGIT ZERO;Cf;0;BN;;;;;N;;;;;
+E0031;TAG DIGIT ONE;Cf;0;BN;;;;;N;;;;;
+E0032;TAG DIGIT TWO;Cf;0;BN;;;;;N;;;;;
+E0033;TAG DIGIT THREE;Cf;0;BN;;;;;N;;;;;
+E0034;TAG DIGIT FOUR;Cf;0;BN;;;;;N;;;;;
+E0035;TAG DIGIT FIVE;Cf;0;BN;;;;;N;;;;;
+E0036;TAG DIGIT SIX;Cf;0;BN;;;;;N;;;;;
+E0037;TAG DIGIT SEVEN;Cf;0;BN;;;;;N;;;;;
+E0038;TAG DIGIT EIGHT;Cf;0;BN;;;;;N;;;;;
+E0039;TAG DIGIT NINE;Cf;0;BN;;;;;N;;;;;
+E003A;TAG COLON;Cf;0;BN;;;;;N;;;;;
+E003B;TAG SEMICOLON;Cf;0;BN;;;;;N;;;;;
+E003C;TAG LESS-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003D;TAG EQUALS SIGN;Cf;0;BN;;;;;N;;;;;
+E003E;TAG GREATER-THAN SIGN;Cf;0;BN;;;;;N;;;;;
+E003F;TAG QUESTION MARK;Cf;0;BN;;;;;N;;;;;
+E0040;TAG COMMERCIAL AT;Cf;0;BN;;;;;N;;;;;
+E0041;TAG LATIN CAPITAL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0042;TAG LATIN CAPITAL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0043;TAG LATIN CAPITAL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0044;TAG LATIN CAPITAL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0045;TAG LATIN CAPITAL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0046;TAG LATIN CAPITAL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0047;TAG LATIN CAPITAL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0048;TAG LATIN CAPITAL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0049;TAG LATIN CAPITAL LETTER I;Cf;0;BN;;;;;N;;;;;
+E004A;TAG LATIN CAPITAL LETTER J;Cf;0;BN;;;;;N;;;;;
+E004B;TAG LATIN CAPITAL LETTER K;Cf;0;BN;;;;;N;;;;;
+E004C;TAG LATIN CAPITAL LETTER L;Cf;0;BN;;;;;N;;;;;
+E004D;TAG LATIN CAPITAL LETTER M;Cf;0;BN;;;;;N;;;;;
+E004E;TAG LATIN CAPITAL LETTER N;Cf;0;BN;;;;;N;;;;;
+E004F;TAG LATIN CAPITAL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0050;TAG LATIN CAPITAL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0051;TAG LATIN CAPITAL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0052;TAG LATIN CAPITAL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0053;TAG LATIN CAPITAL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0054;TAG LATIN CAPITAL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0055;TAG LATIN CAPITAL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0056;TAG LATIN CAPITAL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0057;TAG LATIN CAPITAL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0058;TAG LATIN CAPITAL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0059;TAG LATIN CAPITAL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E005A;TAG LATIN CAPITAL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E005B;TAG LEFT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005C;TAG REVERSE SOLIDUS;Cf;0;BN;;;;;N;;;;;
+E005D;TAG RIGHT SQUARE BRACKET;Cf;0;BN;;;;;N;;;;;
+E005E;TAG CIRCUMFLEX ACCENT;Cf;0;BN;;;;;N;;;;;
+E005F;TAG LOW LINE;Cf;0;BN;;;;;N;;;;;
+E0060;TAG GRAVE ACCENT;Cf;0;BN;;;;;N;;;;;
+E0061;TAG LATIN SMALL LETTER A;Cf;0;BN;;;;;N;;;;;
+E0062;TAG LATIN SMALL LETTER B;Cf;0;BN;;;;;N;;;;;
+E0063;TAG LATIN SMALL LETTER C;Cf;0;BN;;;;;N;;;;;
+E0064;TAG LATIN SMALL LETTER D;Cf;0;BN;;;;;N;;;;;
+E0065;TAG LATIN SMALL LETTER E;Cf;0;BN;;;;;N;;;;;
+E0066;TAG LATIN SMALL LETTER F;Cf;0;BN;;;;;N;;;;;
+E0067;TAG LATIN SMALL LETTER G;Cf;0;BN;;;;;N;;;;;
+E0068;TAG LATIN SMALL LETTER H;Cf;0;BN;;;;;N;;;;;
+E0069;TAG LATIN SMALL LETTER I;Cf;0;BN;;;;;N;;;;;
+E006A;TAG LATIN SMALL LETTER J;Cf;0;BN;;;;;N;;;;;
+E006B;TAG LATIN SMALL LETTER K;Cf;0;BN;;;;;N;;;;;
+E006C;TAG LATIN SMALL LETTER L;Cf;0;BN;;;;;N;;;;;
+E006D;TAG LATIN SMALL LETTER M;Cf;0;BN;;;;;N;;;;;
+E006E;TAG LATIN SMALL LETTER N;Cf;0;BN;;;;;N;;;;;
+E006F;TAG LATIN SMALL LETTER O;Cf;0;BN;;;;;N;;;;;
+E0070;TAG LATIN SMALL LETTER P;Cf;0;BN;;;;;N;;;;;
+E0071;TAG LATIN SMALL LETTER Q;Cf;0;BN;;;;;N;;;;;
+E0072;TAG LATIN SMALL LETTER R;Cf;0;BN;;;;;N;;;;;
+E0073;TAG LATIN SMALL LETTER S;Cf;0;BN;;;;;N;;;;;
+E0074;TAG LATIN SMALL LETTER T;Cf;0;BN;;;;;N;;;;;
+E0075;TAG LATIN SMALL LETTER U;Cf;0;BN;;;;;N;;;;;
+E0076;TAG LATIN SMALL LETTER V;Cf;0;BN;;;;;N;;;;;
+E0077;TAG LATIN SMALL LETTER W;Cf;0;BN;;;;;N;;;;;
+E0078;TAG LATIN SMALL LETTER X;Cf;0;BN;;;;;N;;;;;
+E0079;TAG LATIN SMALL LETTER Y;Cf;0;BN;;;;;N;;;;;
+E007A;TAG LATIN SMALL LETTER Z;Cf;0;BN;;;;;N;;;;;
+E007B;TAG LEFT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007C;TAG VERTICAL LINE;Cf;0;BN;;;;;N;;;;;
+E007D;TAG RIGHT CURLY BRACKET;Cf;0;BN;;;;;N;;;;;
+E007E;TAG TILDE;Cf;0;BN;;;;;N;;;;;
+E007F;CANCEL TAG;Cf;0;BN;;;;;N;;;;;
+E0100;VARIATION SELECTOR-17;Mn;0;NSM;;;;;N;;;;;
+E0101;VARIATION SELECTOR-18;Mn;0;NSM;;;;;N;;;;;
+E0102;VARIATION SELECTOR-19;Mn;0;NSM;;;;;N;;;;;
+E0103;VARIATION SELECTOR-20;Mn;0;NSM;;;;;N;;;;;
+E0104;VARIATION SELECTOR-21;Mn;0;NSM;;;;;N;;;;;
+E0105;VARIATION SELECTOR-22;Mn;0;NSM;;;;;N;;;;;
+E0106;VARIATION SELECTOR-23;Mn;0;NSM;;;;;N;;;;;
+E0107;VARIATION SELECTOR-24;Mn;0;NSM;;;;;N;;;;;
+E0108;VARIATION SELECTOR-25;Mn;0;NSM;;;;;N;;;;;
+E0109;VARIATION SELECTOR-26;Mn;0;NSM;;;;;N;;;;;
+E010A;VARIATION SELECTOR-27;Mn;0;NSM;;;;;N;;;;;
+E010B;VARIATION SELECTOR-28;Mn;0;NSM;;;;;N;;;;;
+E010C;VARIATION SELECTOR-29;Mn;0;NSM;;;;;N;;;;;
+E010D;VARIATION SELECTOR-30;Mn;0;NSM;;;;;N;;;;;
+E010E;VARIATION SELECTOR-31;Mn;0;NSM;;;;;N;;;;;
+E010F;VARIATION SELECTOR-32;Mn;0;NSM;;;;;N;;;;;
+E0110;VARIATION SELECTOR-33;Mn;0;NSM;;;;;N;;;;;
+E0111;VARIATION SELECTOR-34;Mn;0;NSM;;;;;N;;;;;
+E0112;VARIATION SELECTOR-35;Mn;0;NSM;;;;;N;;;;;
+E0113;VARIATION SELECTOR-36;Mn;0;NSM;;;;;N;;;;;
+E0114;VARIATION SELECTOR-37;Mn;0;NSM;;;;;N;;;;;
+E0115;VARIATION SELECTOR-38;Mn;0;NSM;;;;;N;;;;;
+E0116;VARIATION SELECTOR-39;Mn;0;NSM;;;;;N;;;;;
+E0117;VARIATION SELECTOR-40;Mn;0;NSM;;;;;N;;;;;
+E0118;VARIATION SELECTOR-41;Mn;0;NSM;;;;;N;;;;;
+E0119;VARIATION SELECTOR-42;Mn;0;NSM;;;;;N;;;;;
+E011A;VARIATION SELECTOR-43;Mn;0;NSM;;;;;N;;;;;
+E011B;VARIATION SELECTOR-44;Mn;0;NSM;;;;;N;;;;;
+E011C;VARIATION SELECTOR-45;Mn;0;NSM;;;;;N;;;;;
+E011D;VARIATION SELECTOR-46;Mn;0;NSM;;;;;N;;;;;
+E011E;VARIATION SELECTOR-47;Mn;0;NSM;;;;;N;;;;;
+E011F;VARIATION SELECTOR-48;Mn;0;NSM;;;;;N;;;;;
+E0120;VARIATION SELECTOR-49;Mn;0;NSM;;;;;N;;;;;
+E0121;VARIATION SELECTOR-50;Mn;0;NSM;;;;;N;;;;;
+E0122;VARIATION SELECTOR-51;Mn;0;NSM;;;;;N;;;;;
+E0123;VARIATION SELECTOR-52;Mn;0;NSM;;;;;N;;;;;
+E0124;VARIATION SELECTOR-53;Mn;0;NSM;;;;;N;;;;;
+E0125;VARIATION SELECTOR-54;Mn;0;NSM;;;;;N;;;;;
+E0126;VARIATION SELECTOR-55;Mn;0;NSM;;;;;N;;;;;
+E0127;VARIATION SELECTOR-56;Mn;0;NSM;;;;;N;;;;;
+E0128;VARIATION SELECTOR-57;Mn;0;NSM;;;;;N;;;;;
+E0129;VARIATION SELECTOR-58;Mn;0;NSM;;;;;N;;;;;
+E012A;VARIATION SELECTOR-59;Mn;0;NSM;;;;;N;;;;;
+E012B;VARIATION SELECTOR-60;Mn;0;NSM;;;;;N;;;;;
+E012C;VARIATION SELECTOR-61;Mn;0;NSM;;;;;N;;;;;
+E012D;VARIATION SELECTOR-62;Mn;0;NSM;;;;;N;;;;;
+E012E;VARIATION SELECTOR-63;Mn;0;NSM;;;;;N;;;;;
+E012F;VARIATION SELECTOR-64;Mn;0;NSM;;;;;N;;;;;
+E0130;VARIATION SELECTOR-65;Mn;0;NSM;;;;;N;;;;;
+E0131;VARIATION SELECTOR-66;Mn;0;NSM;;;;;N;;;;;
+E0132;VARIATION SELECTOR-67;Mn;0;NSM;;;;;N;;;;;
+E0133;VARIATION SELECTOR-68;Mn;0;NSM;;;;;N;;;;;
+E0134;VARIATION SELECTOR-69;Mn;0;NSM;;;;;N;;;;;
+E0135;VARIATION SELECTOR-70;Mn;0;NSM;;;;;N;;;;;
+E0136;VARIATION SELECTOR-71;Mn;0;NSM;;;;;N;;;;;
+E0137;VARIATION SELECTOR-72;Mn;0;NSM;;;;;N;;;;;
+E0138;VARIATION SELECTOR-73;Mn;0;NSM;;;;;N;;;;;
+E0139;VARIATION SELECTOR-74;Mn;0;NSM;;;;;N;;;;;
+E013A;VARIATION SELECTOR-75;Mn;0;NSM;;;;;N;;;;;
+E013B;VARIATION SELECTOR-76;Mn;0;NSM;;;;;N;;;;;
+E013C;VARIATION SELECTOR-77;Mn;0;NSM;;;;;N;;;;;
+E013D;VARIATION SELECTOR-78;Mn;0;NSM;;;;;N;;;;;
+E013E;VARIATION SELECTOR-79;Mn;0;NSM;;;;;N;;;;;
+E013F;VARIATION SELECTOR-80;Mn;0;NSM;;;;;N;;;;;
+E0140;VARIATION SELECTOR-81;Mn;0;NSM;;;;;N;;;;;
+E0141;VARIATION SELECTOR-82;Mn;0;NSM;;;;;N;;;;;
+E0142;VARIATION SELECTOR-83;Mn;0;NSM;;;;;N;;;;;
+E0143;VARIATION SELECTOR-84;Mn;0;NSM;;;;;N;;;;;
+E0144;VARIATION SELECTOR-85;Mn;0;NSM;;;;;N;;;;;
+E0145;VARIATION SELECTOR-86;Mn;0;NSM;;;;;N;;;;;
+E0146;VARIATION SELECTOR-87;Mn;0;NSM;;;;;N;;;;;
+E0147;VARIATION SELECTOR-88;Mn;0;NSM;;;;;N;;;;;
+E0148;VARIATION SELECTOR-89;Mn;0;NSM;;;;;N;;;;;
+E0149;VARIATION SELECTOR-90;Mn;0;NSM;;;;;N;;;;;
+E014A;VARIATION SELECTOR-91;Mn;0;NSM;;;;;N;;;;;
+E014B;VARIATION SELECTOR-92;Mn;0;NSM;;;;;N;;;;;
+E014C;VARIATION SELECTOR-93;Mn;0;NSM;;;;;N;;;;;
+E014D;VARIATION SELECTOR-94;Mn;0;NSM;;;;;N;;;;;
+E014E;VARIATION SELECTOR-95;Mn;0;NSM;;;;;N;;;;;
+E014F;VARIATION SELECTOR-96;Mn;0;NSM;;;;;N;;;;;
+E0150;VARIATION SELECTOR-97;Mn;0;NSM;;;;;N;;;;;
+E0151;VARIATION SELECTOR-98;Mn;0;NSM;;;;;N;;;;;
+E0152;VARIATION SELECTOR-99;Mn;0;NSM;;;;;N;;;;;
+E0153;VARIATION SELECTOR-100;Mn;0;NSM;;;;;N;;;;;
+E0154;VARIATION SELECTOR-101;Mn;0;NSM;;;;;N;;;;;
+E0155;VARIATION SELECTOR-102;Mn;0;NSM;;;;;N;;;;;
+E0156;VARIATION SELECTOR-103;Mn;0;NSM;;;;;N;;;;;
+E0157;VARIATION SELECTOR-104;Mn;0;NSM;;;;;N;;;;;
+E0158;VARIATION SELECTOR-105;Mn;0;NSM;;;;;N;;;;;
+E0159;VARIATION SELECTOR-106;Mn;0;NSM;;;;;N;;;;;
+E015A;VARIATION SELECTOR-107;Mn;0;NSM;;;;;N;;;;;
+E015B;VARIATION SELECTOR-108;Mn;0;NSM;;;;;N;;;;;
+E015C;VARIATION SELECTOR-109;Mn;0;NSM;;;;;N;;;;;
+E015D;VARIATION SELECTOR-110;Mn;0;NSM;;;;;N;;;;;
+E015E;VARIATION SELECTOR-111;Mn;0;NSM;;;;;N;;;;;
+E015F;VARIATION SELECTOR-112;Mn;0;NSM;;;;;N;;;;;
+E0160;VARIATION SELECTOR-113;Mn;0;NSM;;;;;N;;;;;
+E0161;VARIATION SELECTOR-114;Mn;0;NSM;;;;;N;;;;;
+E0162;VARIATION SELECTOR-115;Mn;0;NSM;;;;;N;;;;;
+E0163;VARIATION SELECTOR-116;Mn;0;NSM;;;;;N;;;;;
+E0164;VARIATION SELECTOR-117;Mn;0;NSM;;;;;N;;;;;
+E0165;VARIATION SELECTOR-118;Mn;0;NSM;;;;;N;;;;;
+E0166;VARIATION SELECTOR-119;Mn;0;NSM;;;;;N;;;;;
+E0167;VARIATION SELECTOR-120;Mn;0;NSM;;;;;N;;;;;
+E0168;VARIATION SELECTOR-121;Mn;0;NSM;;;;;N;;;;;
+E0169;VARIATION SELECTOR-122;Mn;0;NSM;;;;;N;;;;;
+E016A;VARIATION SELECTOR-123;Mn;0;NSM;;;;;N;;;;;
+E016B;VARIATION SELECTOR-124;Mn;0;NSM;;;;;N;;;;;
+E016C;VARIATION SELECTOR-125;Mn;0;NSM;;;;;N;;;;;
+E016D;VARIATION SELECTOR-126;Mn;0;NSM;;;;;N;;;;;
+E016E;VARIATION SELECTOR-127;Mn;0;NSM;;;;;N;;;;;
+E016F;VARIATION SELECTOR-128;Mn;0;NSM;;;;;N;;;;;
+E0170;VARIATION SELECTOR-129;Mn;0;NSM;;;;;N;;;;;
+E0171;VARIATION SELECTOR-130;Mn;0;NSM;;;;;N;;;;;
+E0172;VARIATION SELECTOR-131;Mn;0;NSM;;;;;N;;;;;
+E0173;VARIATION SELECTOR-132;Mn;0;NSM;;;;;N;;;;;
+E0174;VARIATION SELECTOR-133;Mn;0;NSM;;;;;N;;;;;
+E0175;VARIATION SELECTOR-134;Mn;0;NSM;;;;;N;;;;;
+E0176;VARIATION SELECTOR-135;Mn;0;NSM;;;;;N;;;;;
+E0177;VARIATION SELECTOR-136;Mn;0;NSM;;;;;N;;;;;
+E0178;VARIATION SELECTOR-137;Mn;0;NSM;;;;;N;;;;;
+E0179;VARIATION SELECTOR-138;Mn;0;NSM;;;;;N;;;;;
+E017A;VARIATION SELECTOR-139;Mn;0;NSM;;;;;N;;;;;
+E017B;VARIATION SELECTOR-140;Mn;0;NSM;;;;;N;;;;;
+E017C;VARIATION SELECTOR-141;Mn;0;NSM;;;;;N;;;;;
+E017D;VARIATION SELECTOR-142;Mn;0;NSM;;;;;N;;;;;
+E017E;VARIATION SELECTOR-143;Mn;0;NSM;;;;;N;;;;;
+E017F;VARIATION SELECTOR-144;Mn;0;NSM;;;;;N;;;;;
+E0180;VARIATION SELECTOR-145;Mn;0;NSM;;;;;N;;;;;
+E0181;VARIATION SELECTOR-146;Mn;0;NSM;;;;;N;;;;;
+E0182;VARIATION SELECTOR-147;Mn;0;NSM;;;;;N;;;;;
+E0183;VARIATION SELECTOR-148;Mn;0;NSM;;;;;N;;;;;
+E0184;VARIATION SELECTOR-149;Mn;0;NSM;;;;;N;;;;;
+E0185;VARIATION SELECTOR-150;Mn;0;NSM;;;;;N;;;;;
+E0186;VARIATION SELECTOR-151;Mn;0;NSM;;;;;N;;;;;
+E0187;VARIATION SELECTOR-152;Mn;0;NSM;;;;;N;;;;;
+E0188;VARIATION SELECTOR-153;Mn;0;NSM;;;;;N;;;;;
+E0189;VARIATION SELECTOR-154;Mn;0;NSM;;;;;N;;;;;
+E018A;VARIATION SELECTOR-155;Mn;0;NSM;;;;;N;;;;;
+E018B;VARIATION SELECTOR-156;Mn;0;NSM;;;;;N;;;;;
+E018C;VARIATION SELECTOR-157;Mn;0;NSM;;;;;N;;;;;
+E018D;VARIATION SELECTOR-158;Mn;0;NSM;;;;;N;;;;;
+E018E;VARIATION SELECTOR-159;Mn;0;NSM;;;;;N;;;;;
+E018F;VARIATION SELECTOR-160;Mn;0;NSM;;;;;N;;;;;
+E0190;VARIATION SELECTOR-161;Mn;0;NSM;;;;;N;;;;;
+E0191;VARIATION SELECTOR-162;Mn;0;NSM;;;;;N;;;;;
+E0192;VARIATION SELECTOR-163;Mn;0;NSM;;;;;N;;;;;
+E0193;VARIATION SELECTOR-164;Mn;0;NSM;;;;;N;;;;;
+E0194;VARIATION SELECTOR-165;Mn;0;NSM;;;;;N;;;;;
+E0195;VARIATION SELECTOR-166;Mn;0;NSM;;;;;N;;;;;
+E0196;VARIATION SELECTOR-167;Mn;0;NSM;;;;;N;;;;;
+E0197;VARIATION SELECTOR-168;Mn;0;NSM;;;;;N;;;;;
+E0198;VARIATION SELECTOR-169;Mn;0;NSM;;;;;N;;;;;
+E0199;VARIATION SELECTOR-170;Mn;0;NSM;;;;;N;;;;;
+E019A;VARIATION SELECTOR-171;Mn;0;NSM;;;;;N;;;;;
+E019B;VARIATION SELECTOR-172;Mn;0;NSM;;;;;N;;;;;
+E019C;VARIATION SELECTOR-173;Mn;0;NSM;;;;;N;;;;;
+E019D;VARIATION SELECTOR-174;Mn;0;NSM;;;;;N;;;;;
+E019E;VARIATION SELECTOR-175;Mn;0;NSM;;;;;N;;;;;
+E019F;VARIATION SELECTOR-176;Mn;0;NSM;;;;;N;;;;;
+E01A0;VARIATION SELECTOR-177;Mn;0;NSM;;;;;N;;;;;
+E01A1;VARIATION SELECTOR-178;Mn;0;NSM;;;;;N;;;;;
+E01A2;VARIATION SELECTOR-179;Mn;0;NSM;;;;;N;;;;;
+E01A3;VARIATION SELECTOR-180;Mn;0;NSM;;;;;N;;;;;
+E01A4;VARIATION SELECTOR-181;Mn;0;NSM;;;;;N;;;;;
+E01A5;VARIATION SELECTOR-182;Mn;0;NSM;;;;;N;;;;;
+E01A6;VARIATION SELECTOR-183;Mn;0;NSM;;;;;N;;;;;
+E01A7;VARIATION SELECTOR-184;Mn;0;NSM;;;;;N;;;;;
+E01A8;VARIATION SELECTOR-185;Mn;0;NSM;;;;;N;;;;;
+E01A9;VARIATION SELECTOR-186;Mn;0;NSM;;;;;N;;;;;
+E01AA;VARIATION SELECTOR-187;Mn;0;NSM;;;;;N;;;;;
+E01AB;VARIATION SELECTOR-188;Mn;0;NSM;;;;;N;;;;;
+E01AC;VARIATION SELECTOR-189;Mn;0;NSM;;;;;N;;;;;
+E01AD;VARIATION SELECTOR-190;Mn;0;NSM;;;;;N;;;;;
+E01AE;VARIATION SELECTOR-191;Mn;0;NSM;;;;;N;;;;;
+E01AF;VARIATION SELECTOR-192;Mn;0;NSM;;;;;N;;;;;
+E01B0;VARIATION SELECTOR-193;Mn;0;NSM;;;;;N;;;;;
+E01B1;VARIATION SELECTOR-194;Mn;0;NSM;;;;;N;;;;;
+E01B2;VARIATION SELECTOR-195;Mn;0;NSM;;;;;N;;;;;
+E01B3;VARIATION SELECTOR-196;Mn;0;NSM;;;;;N;;;;;
+E01B4;VARIATION SELECTOR-197;Mn;0;NSM;;;;;N;;;;;
+E01B5;VARIATION SELECTOR-198;Mn;0;NSM;;;;;N;;;;;
+E01B6;VARIATION SELECTOR-199;Mn;0;NSM;;;;;N;;;;;
+E01B7;VARIATION SELECTOR-200;Mn;0;NSM;;;;;N;;;;;
+E01B8;VARIATION SELECTOR-201;Mn;0;NSM;;;;;N;;;;;
+E01B9;VARIATION SELECTOR-202;Mn;0;NSM;;;;;N;;;;;
+E01BA;VARIATION SELECTOR-203;Mn;0;NSM;;;;;N;;;;;
+E01BB;VARIATION SELECTOR-204;Mn;0;NSM;;;;;N;;;;;
+E01BC;VARIATION SELECTOR-205;Mn;0;NSM;;;;;N;;;;;
+E01BD;VARIATION SELECTOR-206;Mn;0;NSM;;;;;N;;;;;
+E01BE;VARIATION SELECTOR-207;Mn;0;NSM;;;;;N;;;;;
+E01BF;VARIATION SELECTOR-208;Mn;0;NSM;;;;;N;;;;;
+E01C0;VARIATION SELECTOR-209;Mn;0;NSM;;;;;N;;;;;
+E01C1;VARIATION SELECTOR-210;Mn;0;NSM;;;;;N;;;;;
+E01C2;VARIATION SELECTOR-211;Mn;0;NSM;;;;;N;;;;;
+E01C3;VARIATION SELECTOR-212;Mn;0;NSM;;;;;N;;;;;
+E01C4;VARIATION SELECTOR-213;Mn;0;NSM;;;;;N;;;;;
+E01C5;VARIATION SELECTOR-214;Mn;0;NSM;;;;;N;;;;;
+E01C6;VARIATION SELECTOR-215;Mn;0;NSM;;;;;N;;;;;
+E01C7;VARIATION SELECTOR-216;Mn;0;NSM;;;;;N;;;;;
+E01C8;VARIATION SELECTOR-217;Mn;0;NSM;;;;;N;;;;;
+E01C9;VARIATION SELECTOR-218;Mn;0;NSM;;;;;N;;;;;
+E01CA;VARIATION SELECTOR-219;Mn;0;NSM;;;;;N;;;;;
+E01CB;VARIATION SELECTOR-220;Mn;0;NSM;;;;;N;;;;;
+E01CC;VARIATION SELECTOR-221;Mn;0;NSM;;;;;N;;;;;
+E01CD;VARIATION SELECTOR-222;Mn;0;NSM;;;;;N;;;;;
+E01CE;VARIATION SELECTOR-223;Mn;0;NSM;;;;;N;;;;;
+E01CF;VARIATION SELECTOR-224;Mn;0;NSM;;;;;N;;;;;
+E01D0;VARIATION SELECTOR-225;Mn;0;NSM;;;;;N;;;;;
+E01D1;VARIATION SELECTOR-226;Mn;0;NSM;;;;;N;;;;;
+E01D2;VARIATION SELECTOR-227;Mn;0;NSM;;;;;N;;;;;
+E01D3;VARIATION SELECTOR-228;Mn;0;NSM;;;;;N;;;;;
+E01D4;VARIATION SELECTOR-229;Mn;0;NSM;;;;;N;;;;;
+E01D5;VARIATION SELECTOR-230;Mn;0;NSM;;;;;N;;;;;
+E01D6;VARIATION SELECTOR-231;Mn;0;NSM;;;;;N;;;;;
+E01D7;VARIATION SELECTOR-232;Mn;0;NSM;;;;;N;;;;;
+E01D8;VARIATION SELECTOR-233;Mn;0;NSM;;;;;N;;;;;
+E01D9;VARIATION SELECTOR-234;Mn;0;NSM;;;;;N;;;;;
+E01DA;VARIATION SELECTOR-235;Mn;0;NSM;;;;;N;;;;;
+E01DB;VARIATION SELECTOR-236;Mn;0;NSM;;;;;N;;;;;
+E01DC;VARIATION SELECTOR-237;Mn;0;NSM;;;;;N;;;;;
+E01DD;VARIATION SELECTOR-238;Mn;0;NSM;;;;;N;;;;;
+E01DE;VARIATION SELECTOR-239;Mn;0;NSM;;;;;N;;;;;
+E01DF;VARIATION SELECTOR-240;Mn;0;NSM;;;;;N;;;;;
+E01E0;VARIATION SELECTOR-241;Mn;0;NSM;;;;;N;;;;;
+E01E1;VARIATION SELECTOR-242;Mn;0;NSM;;;;;N;;;;;
+E01E2;VARIATION SELECTOR-243;Mn;0;NSM;;;;;N;;;;;
+E01E3;VARIATION SELECTOR-244;Mn;0;NSM;;;;;N;;;;;
+E01E4;VARIATION SELECTOR-245;Mn;0;NSM;;;;;N;;;;;
+E01E5;VARIATION SELECTOR-246;Mn;0;NSM;;;;;N;;;;;
+E01E6;VARIATION SELECTOR-247;Mn;0;NSM;;;;;N;;;;;
+E01E7;VARIATION SELECTOR-248;Mn;0;NSM;;;;;N;;;;;
+E01E8;VARIATION SELECTOR-249;Mn;0;NSM;;;;;N;;;;;
+E01E9;VARIATION SELECTOR-250;Mn;0;NSM;;;;;N;;;;;
+E01EA;VARIATION SELECTOR-251;Mn;0;NSM;;;;;N;;;;;
+E01EB;VARIATION SELECTOR-252;Mn;0;NSM;;;;;N;;;;;
+E01EC;VARIATION SELECTOR-253;Mn;0;NSM;;;;;N;;;;;
+E01ED;VARIATION SELECTOR-254;Mn;0;NSM;;;;;N;;;;;
+E01EE;VARIATION SELECTOR-255;Mn;0;NSM;;;;;N;;;;;
+E01EF;VARIATION SELECTOR-256;Mn;0;NSM;;;;;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;;;;;
Binary file srctools/readtype/documentation/Unicode Character Data and Line Break data Update History.doc has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/group/bld.inf	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,31 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Base tools (e.g. petran)
+// 
+//
+
+/**
+ @file
+*/
+
+
+PRJ_PLATFORMS
+TOOLS2
+
+
+PRJ_MMPFILES
+readtype.mmp
+
+PRJ_TESTMMPFILES
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/group/readtype.mmp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,23 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+//
+
+
+TARGET			readtype.exe
+TARGETTYPE		exe
+SOURCEPATH	../../readtype
+SOURCE			 readtype.cpp
+OS_LAYER_SYSTEMINCLUDE_SYMBIAN
+
+VENDORID 0x70000001
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/group/readtype.mrp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10 @@
+component       dev_build_srctools_readtype
+
+source          /src/tools/build/srctools/readtype
+exports         /src/tools/build/srctools/readtype/group
+binary          /src/tools/build/srctools/readtype/group all
+
+notes_source \component_defs\release.src
+
+ipr T
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/readtype.cpp	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,868 @@
+// 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 "Eclipse Public License v1.0"
+// which accompanies this distribution, and is available
+// at the URL "http://www.eclipse.org/legal/epl-v10.html".
+//
+// Initial Contributors:
+// Nokia Corporation - initial contribution.
+//
+// Contributors:
+//
+// Description:
+// Reads a Unicode character type data file (such as UnicodeData-3.0.0.txt or a file containing locale-specific overrides)
+// and writes C++ definitions of tables containing the information.
+// Usage: readtype <input-file> <output-file> { <locale-name> }.
+// <input-file>: either the standard Unicode character data file (e.g., UnicodeData-3.0.0.txt) or a file containing
+// overriding information for a certain locale, in the same format as the standard file, but with ranges for which
+// there is no data given in the form:
+// 0041;;;;;;;;;;;;;;
+// 006A;<No Data First>;;;;;;;;;;;;;
+// FFFF;<No Data Last>;;;;;;;;;;;;;
+// (in this example, these entries show that there is no overriding data for the character 0041 and range
+// 006A..FFFF inclusive).
+// Both single entries with no data and ranges with no data must have nothing in the third field (category).
+// <output-file>: the C++ source file to be output: this file becomes \e32\unicode\unitable.cpp, or an overriding
+// file in \e32\lsrc; there are none of these yet.
+// <locale-name>: a an optional name to be inserted into identifiers in the output file: omit this for the standard
+// data set; use names like 'Turkish', 'Japanese', etc., for locales.
+// 
+//
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifndef _UNICODE
+#define _UNICODE
+#endif
+
+#include <unicode.h>
+
+// don't use unicode.h::TUnicodeDataRange, since its for 16-bit, and deprecated
+struct TUnicodeDataRange32	// Only used inside this cpp.
+	{
+	TUint32 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)
+	};
+
+const int PlaneCount = 17;
+TUnicodePlane ThePlanesInReadType[PlaneCount];
+
+// Tables to convert names used in the data file to categories defined in TChar.
+struct CatInfo
+	{
+	const char* iName;
+	TChar::TCategory iCat;
+	};
+
+static const CatInfo TheCatInfo[] =
+	{
+	{ "Lu", TChar::ELuCategory },
+	{ "Ll", TChar::ELlCategory },
+	{ "Lt", TChar::ELtCategory },
+	{ "Lo", TChar::ELoCategory },
+	{ "Lm", TChar::ELmCategory },
+	{ "Mn", TChar::EMnCategory },
+	{ "Mc", TChar::EMcCategory },
+	{ "Me", TChar::EMeCategory },
+	{ "Nd", TChar::ENdCategory },
+	{ "Nl", TChar::ENlCategory },
+	{ "No", TChar::ENoCategory },
+	{ "Pc", TChar::EPcCategory },
+	{ "Pd", TChar::EPdCategory },
+	{ "Ps", TChar::EPsCategory },
+	{ "Pe", TChar::EPeCategory },
+	{ "Pi", TChar::EPiCategory },
+	{ "Pf", TChar::EPfCategory },
+	{ "Po", TChar::EPoCategory },
+	{ "Sm", TChar::ESmCategory },
+	{ "Sc", TChar::EScCategory },
+	{ "Sk", TChar::ESkCategory },
+	{ "So", TChar::ESoCategory },
+	{ "Zs", TChar::EZsCategory },
+	{ "Zl", TChar::EZlCategory },
+	{ "Zp", TChar::EZpCategory },
+	{ "Cc", TChar::ECcCategory },
+	{ "Cf", TChar::ECfCategory },
+	{ "Cs", TChar::ECsCategory },
+	{ "Co", TChar::ECoCategory },
+	{ "Cn", TChar::ECnCategory }
+	};
+const int TheCategories = sizeof(TheCatInfo) / sizeof(TheCatInfo[0]);
+
+struct BdCatInfo
+	{
+	const char* iName;
+	TChar::TBdCategory iBdCat;
+	};
+
+static const BdCatInfo TheBdCatInfo[] =
+	{
+	{ "L", TChar::ELeftToRight },
+	{ "LRE", TChar::ELeftToRightEmbedding },
+	{ "LRO", TChar::ELeftToRightOverride },
+	{ "R", TChar::ERightToLeft },
+	{ "AL", TChar::ERightToLeftArabic }, 
+	{ "RLE", TChar::ERightToLeftEmbedding },
+	{ "RLO", TChar::ERightToLeftOverride },
+	{ "PDF", TChar::EPopDirectionalFormat },
+	{ "EN", TChar::EEuropeanNumber }, 
+	{ "ES", TChar::EEuropeanNumberSeparator }, 
+	{ "ET", TChar::EEuropeanNumberTerminator },  
+	{ "AN", TChar::EArabicNumber }, 
+	{ "CS", TChar::ECommonNumberSeparator }, 
+	{ "NSM", TChar::ENonSpacingMark },
+	{ "BN", TChar::EBoundaryNeutral }, 
+	{ "B", TChar::EParagraphSeparator },
+	{ "S", TChar::ESegmentSeparator },
+	{ "WS", TChar::EWhitespace }, 
+	{ "ON", TChar::EOtherNeutral }, 
+	};
+const int TheBdCategories = sizeof(TheBdCatInfo) / sizeof(TheBdCatInfo[0]);
+
+// Class derived from TUnicodeData to provide constructor etc.
+class Data: public TUnicodeData
+	{
+	public:
+	Data();
+	TBool operator==(const Data& c) const;
+	TBool operator!=(const Data& c) const { return !(*this == c); }
+	void Write();
+	};
+
+// The character information table.
+const int MaxDatas = 1000;
+Data TheData[MaxDatas];
+int Datas = 0;
+
+// The range table, containing indices to the character information table.
+const int MaxRanges = 4000;
+TUnicodeDataRange32 TheRange[MaxRanges];
+int Ranges = 0;
+
+// The exhaustive index table, containing indices from every 16-bit value to the character information table.
+int TheIndex[0x110000];
+
+// The special tables for characters in the range 0..255.
+TUint16 LowerCaseTable[256];
+TUint16 FoldTable[256];
+
+// The special table for characters in the range 0xFF00..0xFFFF
+TUint16 CjkWidthFoldTable[256];
+
+/*
+The composition table. The compositions are stored as a word made up from the composition tag (high byte) and
+the number of components (low byte), the Unicode value of the composed character, then the Unicode values of
+the components.
+
+Two tables are created containing the indices of compositions. One of these is sorted by
+composed character, one by decomposition. This enables quick conversions to be made in both directions.
+*/
+const int MaxCompositionWords = 14000;
+TUint32 CompositionBuffer[MaxCompositionWords];
+int CompositionWords = 0;
+const int MaxCompositions = 8000;
+TInt16 Compose[MaxCompositions];		// composition buffer indices, sorted by composed character
+TInt16 Decompose[MaxCompositions];		// composition buffer indices, sorted by decomposition
+int Compositions = 0;
+int trie_data[0x110000];					// used to build the trie
+
+FILE *input_file;
+FILE *output_file;
+const char *input_filename;
+const char *output_filename;
+
+// Convert a hex string to an integer.
+static int hex(const char *s)
+	{
+	int x = 0;
+	while (*s)
+		{
+		int n = *s;
+		if (n >= '0' && n <= '9')
+			n -= '0';
+		else if (n >= 'A' && n <= 'F')
+			n -= 'A' - 10;
+		else if (n >= 'a' && n <= 'f')
+			n -= 'a' - 10;
+		else
+			break;
+		x = x * 16 + n;
+
+		s++;
+		}
+	return x;
+	}
+
+static TChar::TCategory Category(const char* aName,bool aWarn)
+	{
+	for (int i = 0; i < TheCategories; i++)
+		if (!strcmp(aName,TheCatInfo[i].iName))
+			return TheCatInfo[i].iCat;
+	if (aWarn)
+		fprintf(stderr,"unknown category %s\n",aName);
+	return (TChar::TCategory)(-1);
+	}
+
+static TChar::TBdCategory BdCategory(const char* aName,bool aWarn)
+	{
+	for (int i = 0; i < TheBdCategories; i++)
+		if (!strcmp(aName,TheBdCatInfo[i].iName))
+			return TheBdCatInfo[i].iBdCat;
+	if (aWarn)
+		fprintf(stderr,"unknown bidirectional category %s\n",aName);
+	return (TChar::TBdCategory)(-1);
+	}
+
+// Write an aggregate initialiser for a Data object to the output file.
+void Data::Write()
+	{
+	fprintf(output_file,"{ %d, %d, %d, %d, %d, %d }",
+			(int)iCategory,
+			(int)iBdCategory,
+			(int)iCombiningClass,
+			(int)iDigitOffset,
+			(int)iCaseOffset,
+			(int)iFlags);
+	}
+
+/*
+Add a new entry to the range table. If the category is the illegal value -1 store -1 as the
+index; this feature is used when creating character data for specific locales, which mostly
+consists of ranges for which the data is held in the main table, and is marked in this way
+as unspecified in the locale table.
+*/
+void add_range(Data& info,TInt code)
+	{
+	// Get an index to the character info; add a new entry if necessary.
+	int index = -1;
+	if (info.iCategory != TChar::TCategory(0xFF))
+		{
+		for (int i = 0; i < Datas && index == -1; i++)
+			if (TheData[i] == info)
+				index = i;
+		if (index == -1)
+			{
+			if (Datas >= MaxDatas)
+				{
+				fprintf(stderr,"too many Datas: > %d\n",MaxDatas);
+				exit(1);
+				}
+			TheData[index = Datas++] = info;
+			}
+		}
+
+	// Add the entry to the range table.
+	if (Ranges >= MaxRanges)
+		{
+		fprintf(stderr,"too many Ranges: > %d, when processing U+%x\n", MaxRanges, code);
+		exit(1);
+		}
+	TheRange[Ranges].iRangeStart = code;
+	TheRange[Ranges].iIndex = (TInt16)index;
+	Ranges++;
+	}
+
+// Write a table of "entries" integers each of "entry_size" bytes.
+int write_table(const void *table,const char *name,
+				int entries,int input_entry_size,int output_entry_size,
+				int entry_signed,int entries_per_row,int write_array_size)
+	{
+	const char *type = entry_signed ? "TInt" : "TUint";
+	const int bits = output_entry_size * 8;
+
+	/*
+	There is a choice here whether or not the number of entries in the array is written:
+	either <name>[<size>] or <name>[] is written. The latter method is used where the header
+	says <name>[] so that compilers like GCC don't moan about type mismatches.
+	*/
+	if (entries == 0)
+		{
+		// In case that given plane has no character.
+		fprintf(output_file,"const %s%d * const %s = NULL;\n",type,bits,name);
+		return 0;
+		}
+	if (write_array_size)
+		fprintf(output_file,"const %s%d %s[%d] = \n\t{",type,bits,name,entries);
+	else
+		fprintf(output_file,"const %s%d %s[] = \n\t{ // %d entries",type,bits,name,entries);
+
+	const unsigned char *p = (const unsigned char *)table;
+	for (int i = 0; i < entries; i++, p += input_entry_size)
+		{
+		if (i % entries_per_row == 0)
+			fprintf(output_file,"\n\t");
+		if (output_entry_size == 1)
+			fprintf(output_file,"0x%02x",(int)(*p));
+		else if (output_entry_size == 2)
+			fprintf(output_file,"0x%04x",(int)(*((TUint16 *)p)));
+		else if (output_entry_size == 4)
+			fprintf(output_file,"0x%08x",(int)(*((TUint32 *)p)));
+		else
+			{
+			fprintf(stderr,"illegal output entry size: %d\n",output_entry_size);
+			exit(1);
+			}
+		if (i < entries - 1)
+			fputc(',',output_file);
+		// comment for easy read
+		//if ((i+1) % entries_per_row == 0)
+		//	fprintf(output_file, "\t// U+%X-U+%X (%d-%d)", i+1-entries_per_row, i, i+1-entries_per_row, i);
+		}
+	fprintf(output_file,"\n\t};\n");
+
+	return entries * output_entry_size;
+	}
+
+/*
+Create and write a trie representing the data in 'aTheIndex'
+The trie is of two levels, the first level indexed by the high 'aBlockBits' bits of the
+character code, the second by the low bits. There is one wrinkle; if the index value, which is 16 bits,
+has its top bit set, it is not an index but the actual data value for all entries in that block.
+
+Thus the way to get the value for a code is:
+
+int index = trie_index[code >> aBlockBits];
+if (index & 0x8000)
+	value = index & ~0x8000;
+else
+	value = aTrieData[code & (1 << (16 - aBlockBits))];
+
+The data size in bytes is returned.
+The argument 'aWrite' determines whether the data is written or not.
+The arguments 'aTrie1Name' and 'aTrie2Name' are used as variable names in generated unitable.cpp.
+*/
+int write_trie(int aOutputEntrySize,int aBlockBits,bool aWrite, int *aTheIndex, int *aTrieData, char *aTrie1Name, char *aTrie2Name)
+	{
+	int n = 0; // number of entries used in trie_data
+
+	int block_size = 1 << aBlockBits;
+	int blocks = 1 << (16 - aBlockBits);
+
+	int* trie_index = new int[blocks];
+	int* block = new int[block_size];
+
+	for (int block_index = 0; block_index < blocks; block_index++)
+		{
+		// Write the data for the current block.
+		int block_start = block_index * block_size;
+		bool all_the_same = true;
+		for (int code = 0; code < block_size; code++)
+			{
+			block[code] = aTheIndex[block_start + code];
+			if (block[code] != block[0])
+				all_the_same = false;
+			}
+
+		// Try to find a match for it.
+		int insert_at;
+		if (all_the_same)
+			trie_index[block_index] = block[0] | 0x8000;
+		else
+			{
+			for (insert_at = 0; insert_at < n; insert_at++)
+				{
+				int entries = n - insert_at;
+				if (entries > block_size)
+					entries = block_size;
+				int bytes = entries * sizeof(int);
+				if (memcmp(block,aTrieData + insert_at,bytes) == 0)
+					break;
+				}
+
+			memcpy(aTrieData + insert_at,block,block_size * sizeof(int));
+			if (insert_at + block_size > n)
+				n = insert_at + block_size;
+			trie_index[block_index] = insert_at;
+			}
+		}
+
+	if (aWrite)
+		{
+		write_table(trie_index,aTrie1Name,blocks,4,2,false,16,true);
+		write_table(aTrieData,aTrie2Name,n,4,aOutputEntrySize,false,32,true);
+		}
+
+	delete [] trie_index;
+	delete [] block;
+
+	return blocks * 2 + n * aOutputEntrySize;
+	}
+
+// Write the best possible 2-level trie for all planes, trying block sizes of 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096 and 8192
+// @return Data size in bytes.
+int write_trie()
+	{
+	int byteCount = 0;
+	for (int plane=0; plane<PlaneCount; plane++)
+		{
+		int best_data_size = 1 << 30;
+		int best_bits = 0;
+
+		int outputEntrySize = 2;
+		char trie1Name[255];
+		char trie2Name[255];
+		sprintf(trie1Name, "ThePlane%02dTrieIndex1", plane);
+		sprintf(trie2Name, "ThePlane%02dTrieIndex2", plane);
+		int *theIndex = TheIndex + plane * 0x10000;
+		int *trieData = trie_data + plane * 0x10000;
+
+		for (int cur_bits = 3; cur_bits < 14; cur_bits++)
+			{
+			int cur_data_size = write_trie(outputEntrySize, cur_bits, false, theIndex, trieData, trie1Name, trie2Name);
+			if (cur_data_size < best_data_size)
+				{
+				best_bits = cur_bits;
+				best_data_size = cur_data_size;
+				}
+			}
+
+		byteCount += write_trie(outputEntrySize, best_bits, true, theIndex, trieData, trie1Name, trie2Name);
+		ThePlanesInReadType[plane].iCodesPerBlock = (TUint8) best_bits;
+		ThePlanesInReadType[plane].iMaskForCodePoint = (TUint16) ((1 << (best_bits)) - 1);
+		ThePlanesInReadType[plane].iMaskForBlock = (TUint16) (~(ThePlanesInReadType[plane].iMaskForCodePoint));
+		}
+	return byteCount;
+	}
+
+/*
+Compare entries in the decompose table for the purpose of sorting them. The entries are indices
+into the starting words of compositions stored in the composition buffer.
+*/
+int compare_decompositions(const void *p,const void *q)
+	{
+	// Get the indexes.
+	TInt16 index1 = *((const TInt16 *)p);
+	TInt16 index2 = *((const TInt16 *)q);
+
+	// Compare the two composition strings.
+	return TUnicode::Compare((TUint16 *)&CompositionBuffer[index1 + 2], CompositionBuffer[index1 + 1]*2,
+							 (TUint16 *)&CompositionBuffer[index2 + 2], CompositionBuffer[index2 + 1]*2);
+	}
+ 
+// Write the output file.
+void write_output()
+	{
+	int data_bytes = 0;
+
+	// Write the comment at the top of the file
+	fprintf(output_file, "// Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies).\n");
+	fprintf(output_file, "// All rights reserved.\n");
+	fprintf(output_file, "// This component and the accompanying materials are made available\n");
+	fprintf(output_file, "// under the terms of the License \"Eclipse Public License v1.0\"\n");
+	fprintf(output_file, "// which accompanies this distribution, and is available\n");
+	fprintf(output_file, "// at the URL \"http://www.eclipse.org/legal/epl-v10.html\".\n");
+	fprintf(output_file, "//\n");
+	fprintf(output_file, "// Initial Contributors:\n");
+	fprintf(output_file, "// Nokia Corporation - initial contribution.\n");
+	fprintf(output_file, "//\n");
+	fprintf(output_file, "// Contributors:\n");
+	fprintf(output_file, "//\n");
+	fprintf(output_file, "// Description:\n");
+
+	fprintf(output_file,
+			"// Unicode character information tables.\n"
+			"// Written by the READTYPE program.\n"
+			"// Please read the 'Unicode Character Data and Line Break data Update History.doc' file for detailed history of updates to this file.\n"
+			"// This file was generated by the READTYPE tool using UCD 5.0.\n"
+			"// The contents of this file were generated automatically. Please do not edit this manually.\n"
+			"//\n"
+			"//\n"
+			"\n");
+
+	// Write the directive to include the header file.
+	fprintf(output_file,"#include <unicode.h>\n\n");
+
+	// Export two variables for unicode.cpp.
+	fprintf(output_file, "\n");
+	fprintf(output_file, "// Declarations for tables held in unitable.cpp and used by unicode.cpp.\n");
+	fprintf(output_file, "extern const TStandardUnicodeDataSet TheStandardUnicodeDataSet[];\n");
+	fprintf(output_file, "extern const TUnicodePlane ThePlanes[17];\n\n\n");
+
+	// Write the trie data.
+	data_bytes += write_trie();
+
+	// Write the character information table.
+	fprintf(output_file,"static const TUnicodeData TheUnicodeData[] =\n\t{ // %d entries\n", Datas);
+	int i;
+	for (i = 0; i < Datas; i++)
+		{
+		fputc('\t',output_file);
+		TheData[i].Write();
+		if (i < Datas - 1)
+			fputc(',',output_file);
+		fprintf(output_file, "\t// 0x%X (%d)", i, i);
+		fputc('\n',output_file);
+		}
+	fprintf(output_file,"\t};\n\n");
+	data_bytes += Datas * sizeof(Data);
+
+	// write plane properties
+	fprintf(output_file, "const TUnicodePlane ThePlanes[%d] =\n\t{\n", PlaneCount);
+	int plane;
+	for (plane=0; plane<=16; plane++)
+		{
+		fprintf(output_file, "\t{%d, 0x%04X, 0x%04X }",
+			ThePlanesInReadType[plane].iCodesPerBlock, ThePlanesInReadType[plane].iMaskForBlock, ThePlanesInReadType[plane].iMaskForCodePoint);
+		if (plane < 16)
+			fprintf(output_file, ",\n");
+		}
+	fprintf(output_file, "\n\t};\n\n");
+	data_bytes += 5*PlaneCount;
+
+	// Write a data structure referring to the trie data.
+	fprintf(output_file,"const TStandardUnicodeDataSet TheStandardUnicodeDataSet[] =\n\t{ // %d entries\n", PlaneCount);
+	for (plane=0; plane<=16; plane++)
+		{
+		fprintf(output_file,"\t{ ThePlane%02dTrieIndex1, ThePlane%02dTrieIndex2, TheUnicodeData }", plane, plane);
+		if (plane < 16)
+			fprintf(output_file, ",\n");
+		}
+	fprintf(output_file, "\n\t};\n\n");
+	data_bytes += 12*PlaneCount;
+
+	// Convert the fold table to lower case.
+	for (i = 0; i < 256; i++)
+		FoldTable[i] = LowerCaseTable[FoldTable[i]];
+
+	// Make 00A0 (non-break space) fold to space.
+	FoldTable[0xA0] = 0x20;
+
+	// Make unassigned characters in the CJK width fold table fold to themselves.
+	for (i = 0; i < 256; i++)
+		if (CjkWidthFoldTable[i] == 0)
+			CjkWidthFoldTable[i] = (TUint16)(0xFF00 + i);
+
+	// Write the special tables
+	data_bytes += write_table(FoldTable,"TUnicode::FoldTable",256,2,2,false,16,true);
+	data_bytes += write_table(CjkWidthFoldTable,"TUnicode::CjkWidthFoldTable",256,2,2,false,16,true);
+
+	// Write the number of data bytes at the end of the file.
+	fprintf(output_file,"\n// The tables and structures contain %d bytes of data.\n",data_bytes);
+	}
+
+int main(int argc,char **argv)
+	{
+	if (argc < 2)
+		{
+		fputs("usage: readtype <input-file> <output-file>",stderr);
+		exit(1);
+		}
+
+	input_filename = argv[1];
+	output_filename = argv[2];
+
+	// Locale support in previous version is deprecated.
+
+	input_file = fopen(input_filename,"r");
+	if (!input_file)
+		{
+		fprintf(stderr,"cannot open input file %s\n",input_filename);
+		exit(1);
+		}
+	output_file = fopen(output_filename,"w");
+	if (!output_file)
+		{
+		fprintf(stderr,"cannot open output file %s\n",output_filename);
+		exit(1);
+		}
+
+	Data range_info;		// attributes of the current range
+	Data unassigned_info;	// attributes used for unassigned characters; the default constructor
+							// sets the category to Cn, bidirectional category to L, everything else to 0.
+	TBool first = true;
+	
+	char line[1024];
+	const int Fields = 15;
+	char *field[Fields];
+	TInt prev_code = 0;
+	while (fgets(line,sizeof(line),input_file))
+		{
+		// Strip trailing newline if any.
+		int length = strlen(line);
+		if (length && line[length - 1] == '\n')
+			line[length - 1] = 0;
+
+		// Parse into fields.
+		int n = 1;
+		field[0] = line;
+		for (char *p = line; *p; p++)
+			if (*p == ';' && n < Fields)
+				{
+				*p = 0;
+				field[n++] = p + 1;
+				}
+
+		// Ignore the line if there is only one field.
+		if (n == 1)
+			continue;
+
+		// Extract fields of interest.
+
+		// Field 0: Unicode value in hexadecimal.
+		int code = hex(field[0]);
+
+		// Field 2: Category.
+		Data cur_info;
+		cur_info.iCategory = (TUint8)Category(field[2], true);
+
+		// Field 3: Combining class.
+		cur_info.iCombiningClass = (TUint8)atoi(field[3]);
+		
+		// Field 4: Bidirectional category.
+		cur_info.iBdCategory = (TUint8)BdCategory(field[4], true);
+
+		// Prepare to determine the folded version (converted to lower case, stripped of accents).
+		int folded_code = code;
+
+		// Field 5: Character decomposition.
+		if (field[5][0])
+			{
+			int components = 0;
+			const int MaxComponents = 18;		// FDFA; ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM has 18 components!
+			TUint32 component[MaxComponents];
+
+			// Extract the tag if any.
+			char *p = field[5];
+			const char *tag = NULL;
+			if (field[5][0] == '<')
+				{
+				tag = ++p;
+				while (*p && *p != '>')
+					p++;
+				if (!*p)
+					{
+					fprintf(stderr,"syntax error: missing > on the line for code %x\n",code);
+					exit(1);
+					}
+				*p++ = 0;
+				}
+
+			// Read the components.
+			while (*p)
+				{
+				while (*p == ' ')
+					p++;
+				if (components >= MaxComponents)
+					{
+					fprintf(stderr,"decomposition of %x has too many components: increase MaxComponents\n",code);
+					exit(1);
+					}
+				component[components++] = hex(p);
+				while (*p && *p != ' ')
+					p++;
+				}
+
+			// Store the composition if it has a null tag and is therefore canonical.
+			if (tag == NULL)
+				{
+				// Put its index into the tables.
+				if (Compositions >= MaxCompositions)
+					{
+					fprintf(stderr,"too many compositions (at code %x): increase MaxCompositions\n",code);
+					exit(1);
+					}
+				if (CompositionWords >= 65535)
+					{
+					fprintf(stderr, "too many compositions (at code %x): need 32 bit!?\n", code);
+					exit(1);
+					}
+				Compose[Compositions] = Decompose[Compositions] = (TInt16)CompositionWords;
+				Compositions++;
+
+				// Put it into the composition buffer.
+				if (CompositionWords + 2 + components >= MaxCompositionWords)
+					{
+					fprintf(stderr,"too many compositions (at code %x): increase MaxCompositionWords\n",code);
+					exit(1);
+					}
+				CompositionBuffer[CompositionWords++] = code;
+				CompositionBuffer[CompositionWords++] = components;
+				for (int i = 0; i < components; i++)
+					CompositionBuffer[CompositionWords++] = component[i];
+				}
+			
+			// Store the code used in the ordinary and CJK fold tables.
+			if (components > 0)
+				{
+				if (code < 256)
+					{
+					if (tag == NULL)
+						folded_code = component[0];
+					}
+				else if (code >= 0xFF00 && code <= 0xFFEE)	// tag will always be <wide> or <narrow>
+					folded_code = component[0];
+				}
+			}
+
+		// Field 8. Numeric value.
+		if (field[8][0])
+			{
+			if (field[8][1] == '/' || field[8][2] == '/')		// fractions
+				cur_info.iFlags |= TUnicodeData::EFraction;
+			else
+				{
+				int value = atoi(field[8]);
+				if (value >= 0 && value <= 255)
+					{
+					cur_info.iDigitOffset = (TUint8)((value - (code & 255)) & 255);
+					cur_info.iFlags |= TUnicodeData::ESmallNumeric;
+					}
+				else if (value == 500)
+					cur_info.iFlags |= TUnicodeData::EFiveHundred;
+				else if (value == 1000)
+					cur_info.iFlags |= TUnicodeData::EOneThousand;
+				else if (value == 5000)
+					cur_info.iFlags |= TUnicodeData::EFiveThousand;
+				else if (value == 10000)
+					cur_info.iFlags |= TUnicodeData::ETenThousand;
+				else if (value == 100000)
+					cur_info.iFlags |= TUnicodeData::EHundredThousand;
+				else
+					fprintf(stderr,"Warning: U+%X has a large numeric property with unrepresentable value %d. Ignored.\n",code,value);
+				}
+			}
+
+		// Field 9: Mirrored property.
+		if (field[9][0] == 'Y')
+			cur_info.iFlags |= TUnicodeData::EMirrored;
+
+		// Fields 12, 13, 14: Case variants.
+		int uc = code, lc = code, tc = code;
+		if (field[12][0])
+			{
+			uc = hex(field[12]);
+			int uc_offset = uc - code;
+			if (abs(uc_offset) > 32767)
+				{
+				fprintf(stderr, "Warning: offset to upper case is too large: code %X, upper case %X, offset %X. Ignored!\n", code, uc, uc_offset);
+				}
+			else
+				{
+				cur_info.iFlags |= TUnicodeData::EHasUpperCase;
+				cur_info.iCaseOffset = (TInt16)(-uc_offset);
+				if (code<0x10000 && uc>0x10000 || code>0x10000 && uc<0x10000)
+					fprintf(stderr, "Info: %X and its upper case %X locate at different planes.\n");
+				}
+			}
+		if (field[13][0])
+			{
+			lc = hex(field[13]);
+			int lc_offset = lc - code;
+			if (abs(lc_offset) > 32767)
+				{
+				fprintf(stderr, "Warning: offset to lower case is too large: code %X, lower case %X, offset %X. Ignored!\n", code, lc, lc_offset);
+				}
+			else
+				{
+				cur_info.iFlags |= TUnicodeData::EHasLowerCase;
+				cur_info.iCaseOffset = (TInt16)lc_offset;
+				if (code<0x10000 && lc>0x10000 || code>0x10000 && lc<0x10000)
+					fprintf(stderr, "Info: %X and its lower case %X locate at different planes.\n");
+				}
+			}
+		if (field[14][0])
+			tc = hex(field[14]);
+		if (tc != lc && tc != uc)
+			cur_info.iFlags |= TUnicodeData::EHasTitleCase;
+
+		// If this code is < 256 fill in the entries in the special tables.
+		if (code < 256)
+			{
+			LowerCaseTable[code] = (TUint16)lc;
+			FoldTable[code] = (TUint16)folded_code;
+			}
+
+		// If the code is >= 0xFF00 fill in the entry in the CJK width folding table.
+		else if (code >= 0xFF00 && code <= 0xFFFF)
+			CjkWidthFoldTable[code & 0xFF] = (TUint16)folded_code;
+
+		/*
+		If there was a gap between this code and the previous one, write an 'unassigned' range,
+		unless this character is actually the end of a range not fully listed (like the CJK ideographs
+		from 4E00 to 9FA5 inclusive), in which case the character name will end in ' Last>'.
+		*/
+		if (code - prev_code > 1)
+			{
+			TBool last_in_range = false;
+			int name_length = strlen(field[1]);
+			if (name_length >= 6 && !strcmp(field[1] + name_length - 6," Last>"))
+				last_in_range = TRUE;
+			if (!last_in_range)
+				{
+				add_range(unassigned_info,prev_code + 1);
+				range_info = unassigned_info;
+				}
+			}
+
+		// Write the range.
+		if (first || cur_info != range_info)
+			{
+			add_range(cur_info,code);
+			range_info = cur_info;
+			}
+
+		first = false;
+		prev_code = code;
+		}
+
+	/*
+	If there was a gap at the end of the encoding (there is at present; FFFE and FFFF are not Unicode characters)
+	write an 'unassigned' range.
+	*/
+	if (prev_code < 0xFFFF)
+		add_range(unassigned_info,prev_code + 1);
+
+	// Write an array of indices from Unicode character values to character data sets.
+	for (int i = 0; i < Ranges; i++)
+		{
+		TUint32 end = i < Ranges - 1 ? TheRange[i + 1].iRangeStart : 0x110000;
+		for (TUint32 j = TheRange[i].iRangeStart; j < end; j++)
+			TheIndex[j] = TheRange[i].iIndex;
+		}
+
+	// Write the output file.
+	write_output();
+	printf("\nDone.\n");
+
+	return 0;
+	}
+
+Data::Data()
+	{
+	iCategory = TChar::ECnCategory;
+	iBdCategory = TChar::ELeftToRight;
+	iCombiningClass = 0;
+	iDigitOffset = 0;
+	iCaseOffset = 0;
+	iFlags = 0;
+	}
+
+TBool Data::operator==(const Data& c) const
+	{
+	return iCategory == c.iCategory &&
+		   iBdCategory == c.iBdCategory &&
+		   iCombiningClass == c.iCombiningClass &&
+		   iDigitOffset == c.iDigitOffset &&
+		   iCaseOffset == c.iCaseOffset &&
+		   iFlags == c.iFlags;
+	}
+
+/*
+This function is copied from unicode.cpp: having it here saves me having to link in unicode.cpp and
+unitable.cpp, which is probably the file we're trying to write!
+*/
+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/srctools/readtype/unicodedata-3.0.0.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10618 @@
+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;INDEX;;;;
+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;;;;;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;;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;;;;;
+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;;;;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;;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;;;;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;;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;;;;;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/unicodedata-3.0.0_IndicCharsFrom_5.0.txt	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,10651 @@
+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;INDEX;;;;
+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;;;;;
+0904;DEVANAGARI LETTER SHORT A;Lo;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;;;;;
+097B;DEVANAGARI LETTER GGA;Lo;0;L;;;;;N;;;;;
+097C;DEVANAGARI LETTER JJA;Lo;0;L;;;;;N;;;;;
+097D;DEVANAGARI LETTER GLOTTAL STOP;Lo;0;L;;;;;N;;;;;
+097E;DEVANAGARI LETTER DDDA;Lo;0;L;;;;;N;;;;;
+097F;DEVANAGARI LETTER BBA;Lo;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;;;;;
+09BD;BENGALI SIGN AVAGRAHA;Lo;0;L;;;;;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;;;;;
+09CE;BENGALI LETTER KHANDA TA;Lo;0;L;;;;;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;;;;;
+0A01;GURMUKHI SIGN ADAK BINDI;Mn;0;NSM;;;;;N;;;;;
+0A02;GURMUKHI SIGN BINDI;Mn;0;NSM;;;;;N;;;;;
+0A03;GURMUKHI SIGN VISARGA;Mc;0;L;;;;;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;;;;;
+0A8C;GUJARATI LETTER VOCALIC L;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;;;;;
+0AE1;GUJARATI LETTER VOCALIC LL;Lo;0;L;;;;;N;;;;;
+0AE2;GUJARATI VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0AE3;GUJARATI VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;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;;;;;
+0AF1;GUJARATI RUPEE SIGN;Sc;0;ET;;;;;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;;;;;
+0B35;ORIYA LETTER VA;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;;;;;
+0B71;ORIYA LETTER WA;Lo;0;L;;;;;N;;;;;
+0B82;TAMIL SIGN ANUSVARA;Mn;0;NSM;;;;;N;;;;;
+0B83;TAMIL SIGN VISARGA;Lo;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;;;;;
+0BB6;TAMIL LETTER SHA;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;;;;;
+0BE6;TAMIL DIGIT ZERO;Nd;0;L;;0;0;0;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;;;;;
+0BF3;TAMIL DAY SIGN;So;0;ON;;;;;N;;Naal;;;
+0BF4;TAMIL MONTH SIGN;So;0;ON;;;;;N;;Maatham;;;
+0BF5;TAMIL YEAR SIGN;So;0;ON;;;;;N;;Varudam;;;
+0BF6;TAMIL DEBIT SIGN;So;0;ON;;;;;N;;Patru;;;
+0BF7;TAMIL CREDIT SIGN;So;0;ON;;;;;N;;Varavu;;;
+0BF8;TAMIL AS ABOVE SIGN;So;0;ON;;;;;N;;Merpadi;;;
+0BF9;TAMIL RUPEE SIGN;Sc;0;ET;;;;;N;;Rupai;;;
+0BFA;TAMIL NUMBER SIGN;So;0;ON;;;;;N;;Enn;;;
+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;;;;;
+0CBC;KANNADA SIGN NUKTA;Mn;7;NSM;;;;;N;;;;;
+0CBD;KANNADA SIGN AVAGRAHA;Lo;0;L;;;;;N;;;;;
+0CBE;KANNADA VOWEL SIGN AA;Mc;0;L;;;;;N;;;;;
+0CBF;KANNADA VOWEL SIGN I;Mn;0;L;;;;;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;L;;;;;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;;;;;
+0CE2;KANNADA VOWEL SIGN VOCALIC L;Mn;0;NSM;;;;;N;;;;;
+0CE3;KANNADA VOWEL SIGN VOCALIC LL;Mn;0;NSM;;;;;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;;;;;
+0CF1;KANNADA SIGN JIHVAMULIYA;So;0;ON;;;;;N;;;;;
+0CF2;KANNADA SIGN UPADHMANIYA;So;0;ON;;;;;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;;;;;N;;;;;
+0F2B;TIBETAN DIGIT HALF TWO;No;0;L;;;;;N;;;;;
+0F2C;TIBETAN DIGIT HALF THREE;No;0;L;;;;;N;;;;;
+0F2D;TIBETAN DIGIT HALF FOUR;No;0;L;;;;;N;;;;;
+0F2E;TIBETAN DIGIT HALF FIVE;No;0;L;;;;;N;;;;;
+0F2F;TIBETAN DIGIT HALF SIX;No;0;L;;;;;N;;;;;
+0F30;TIBETAN DIGIT HALF SEVEN;No;0;L;;;;;N;;;;;
+0F31;TIBETAN DIGIT HALF EIGHT;No;0;L;;;;;N;;;;;
+0F32;TIBETAN DIGIT HALF NINE;No;0;L;;;;;N;;;;;
+0F33;TIBETAN DIGIT HALF ZERO;No;0;L;;;;;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;;;;;
+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;;;;N;KAERITEN ITI;Kaeriten;;;
+3193;IDEOGRAPHIC ANNOTATION TWO MARK;No;0;L;<super> 4E8C;;;;N;KAERITEN NI;Kaeriten;;;
+3194;IDEOGRAPHIC ANNOTATION THREE MARK;No;0;L;<super> 4E09;;;;N;KAERITEN SAN;Kaeriten;;;
+3195;IDEOGRAPHIC ANNOTATION FOUR MARK;No;0;L;<super> 56DB;;;;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;;;;N;;;;;
+3221;PARENTHESIZED IDEOGRAPH TWO;No;0;L;<compat> 0028 4E8C 0029;;;;N;;;;;
+3222;PARENTHESIZED IDEOGRAPH THREE;No;0;L;<compat> 0028 4E09 0029;;;;N;;;;;
+3223;PARENTHESIZED IDEOGRAPH FOUR;No;0;L;<compat> 0028 56DB 0029;;;;N;;;;;
+3224;PARENTHESIZED IDEOGRAPH FIVE;No;0;L;<compat> 0028 4E94 0029;;;;N;;;;;
+3225;PARENTHESIZED IDEOGRAPH SIX;No;0;L;<compat> 0028 516D 0029;;;;N;;;;;
+3226;PARENTHESIZED IDEOGRAPH SEVEN;No;0;L;<compat> 0028 4E03 0029;;;;N;;;;;
+3227;PARENTHESIZED IDEOGRAPH EIGHT;No;0;L;<compat> 0028 516B 0029;;;;N;;;;;
+3228;PARENTHESIZED IDEOGRAPH NINE;No;0;L;<compat> 0028 4E5D 0029;;;;N;;;;;
+3229;PARENTHESIZED IDEOGRAPH TEN;No;0;L;<compat> 0028 5341 0029;;;;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;;;;;
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/readtype/unicodedata.html	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,1988 @@
+<html>
+
+
+
+<head>
+
+<meta NAME="GENERATOR" CONTENT="Microsoft FrontPage 4.0">
+
+<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
+
+<link REL="stylesheet" HREF="http://www.unicode.org/unicode.css" TYPE="text/css">
+
+<title>UnicodeData File Format</title>
+
+</head>
+
+
+
+<body>
+
+
+
+<h1>UnicodeData File Format<br> 
+Version 3.0.0</h1>
+
+
+
+<table BORDER="1" CELLSPACING="2" CELLPADDING="0" HEIGHT="87" WIDTH="100%">
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">Revision</td>
+
+    <td VALIGN="TOP">3.0.0</td>
+
+  </tr>
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">Authors</td>
+
+    <td VALIGN="TOP">Mark Davis and Ken Whistler</td>
+
+  </tr>
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">Date</td>
+
+    <td VALIGN="TOP">1999-09-12</td>
+
+  </tr>
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">This Version</td>
+
+    <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+
+  </tr>
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">Previous Version</td>
+
+    <td VALIGN="TOP">n/a</td>
+
+  </tr>
+
+  <tr>
+
+    <td VALIGN="TOP" width="144">Latest Version</td>
+
+    <td VALIGN="TOP"><a href="ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html">ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html</a></td>
+
+  </tr>
+
+</table>
+
+
+
+<p align="center">Copyright © 1995-1999 Unicode, Inc. All Rights reserved.<br>    
+    
+<i>For more information, including Disclamer and Limitations, see <a HREF="UnicodeCharacterDatabase-3.0.0.html">UnicodeCharacterDatabase-3.0.0.html</a> </i></p>   
+   
+   
+   
+<p>This document describes the format of the UnicodeData.txt file, which is one of the    
+   
+files in the Unicode Character Database. The document is divided into the following    
+   
+sections:    
+   
+   
+   
+<ul>   
+   
+  <li><a HREF="#Field Formats">Field Formats</a> <ul>   
+   
+      <li><a HREF="#General Category">General Category</a> </li>   
+   
+      <li><a HREF="#Bidirectional Category">Bidirectional Category</a> </li>   
+   
+      <li><a HREF="#Character Decomposition">Character Decomposition Mapping</a> </li>  
+  
+      <li><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </li>  
+  
+      <li><a HREF="#Decompositions and Normalization">Decompositions and Normalization</a> </li>  
+  
+      <li><a HREF="#Case Mappings">Case Mappings</a> </li>  
+  
+    </ul>  
+  
+  </li>  
+  
+  <li><a HREF="#Property Invariants">Property Invariants</a> </li>  
+  
+  <li><a HREF="#Modification History">Modification History</a> </li>  
+  
+</ul>  
+  
+  
+  
+<p><b>Warning: </b>the information in this file does not completely describe the use and   
+  
+interpretation of Unicode character properties and behavior. It must be used in   
+  
+conjunction with the data in the other files in the Unicode Character Database, and relies   
+  
+on the notation and definitions supplied in <i><a href="http://www.unicode.org/unicode/standard/versions/Unicode3.0.html"> The Unicode 
+Standard</a></i>. All chapter references   
+  
+are to Version 3.0 of the standard.</p>  
+  
+  
+  
+<h2><a NAME="Field Formats"></a>Field Formats</h2>    
+    
+    
+    
+<p>The file consists of lines containing fields terminated by semicolons. Each line     
+    
+represents the data for one encoded character in the Unicode Standard. Every encoded     
+    
+character has a data entry, with the exception of certain special ranges, as detailed     
+    
+below.     
+    
+    
+    
+<ul>    
+    
+  <li>There are six special ranges of characters that are represented only by their start and     
+    
+    end characters, since the properties in the file are uniform, except for code values     
+    
+    (which are all sequential and assigned). </li>    
+    
+  <li>The names of CJK ideograph characters and the names and decompositions of Hangul     
+    
+    syllable characters are algorithmically derivable. (See the Unicode Standard and <a    
+    
+    HREF="http://www.unicode.org/unicode/reports/tr15/">Unicode Technical Report #15</a> for     
+    
+    more information). </li>    
+    
+  <li>Surrogate code values and private use characters have no names. </li>    
+    
+  <li>The Private Use character outside of the BMP (U+F0000..U+FFFFD, U+100000..U+10FFFD) are     
+    
+    not listed. These correspond to surrogate pairs where the first surrogate is in the High     
+    
+    Surrogate Private Use section. </li>    
+    
+</ul>    
+    
+    
+    
+<p>The exact ranges represented by start and end characters are:     
+    
+    
+    
+<ul>    
+    
+  <li>CJK Ideographs Extension A (U+3400 - U+4DB5) </li>    
+    
+  <li>CJK Ideographs (U+4E00 - U+9FA5) </li>    
+    
+  <li>Hangul Syllables (U+AC00 - U+D7A3) </li>    
+    
+  <li>Non-Private Use High Surrogates (U+D800 - U+DB7F) </li>    
+    
+  <li>Private Use High Surrogates (U+DB80 - U+DBFF) </li>    
+    
+  <li>Low Surrogates (U+DC00 - U+DFFF) </li>    
+    
+  <li>The Private Use Area (U+E000 - U+F8FF) </li>    
+    
+</ul>    
+    
+    
+    
+<p>The following table describes the format and meaning of each field in a data entry in     
+    
+the UnicodeData file. Fields which contain normative information are so indicated.</p>    
+    
+    
+    
+<table BORDER="1" CELLSPACING="2" CELLPADDING="2">    
+    
+  <tr>    
+    
+    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Field</th>    
+    
+    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Name</th>    
+    
+    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Status</th>    
+    
+    <th VALIGN="top" ALIGN="LEFT"><p ALIGN="LEFT">Explanation</th>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">0</th>    
+    
+    <td VALIGN="top">Code value</td>    
+    
+    <td VALIGN="top">normative</td>    
+    
+    <td VALIGN="top">Code value in 4-digit hexadecimal format.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">1</th>    
+    
+    <td VALIGN="top">Character name</td>    
+    
+    <td VALIGN="top">normative</td>    
+    
+    <td VALIGN="top">These names match exactly the names published in Chapter 14 of the     
+    
+    Unicode Standard, Version 3.0.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">2</th>    
+    
+    <td VALIGN="top"><a HREF="#General Category">General Category</a> </td>    
+    
+    <td VALIGN="top">normative / informative<br>    
+    
+    (see below)</td>    
+    
+    <td VALIGN="top">This is a useful breakdown into various &quot;character types&quot; which     
+    
+    can be used as a default categorization in implementations. See below for a brief     
+    
+    explanation.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">3</th>    
+    
+    <td VALIGN="top"><a HREF="#Canonical Combining Classes">Canonical Combining Classes</a> </td>    
+    
+    <td VALIGN="top">normative</td>    
+    
+    <td VALIGN="top">The classes used for the Canonical Ordering Algorithm in the Unicode     
+    
+    Standard. These classes are also printed in Chapter 4 of the Unicode Standard.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">4</th>    
+    
+    <td VALIGN="top"><a HREF="#Bidirectional Category">Bidirectional Category</a> </td>    
+    
+    <td VALIGN="top">normative</td>    
+    
+    <td VALIGN="top">See the list below for an explanation of the abbreviations used in this     
+    
+    field. These are the categories required by the Bidirectional Behavior Algorithm in the     
+    
+    Unicode Standard. These categories are summarized in Chapter 3 of the Unicode Standard.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">5</th>    
+    
+    <td VALIGN="top"><a HREF="#Character Decomposition">Character Decomposition  
+      Mapping</a></td>   
+   
+    <td VALIGN="top">normative</td>   
+   
+    <td VALIGN="top">In the Unicode Standard, not all of the mappings are full (maximal)    
+   
+    decompositions. Recursive application of look-up for decompositions will, in all cases,    
+   
+    lead to a maximal decomposition. The decomposition mappings match exactly the    
+   
+    decomposition mappings published with the character names in the Unicode Standard.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">6</th>   
+   
+    <td VALIGN="top">Decimal digit value</td>   
+   
+    <td VALIGN="top">normative</td>   
+   
+    <td VALIGN="top">This is a numeric field. If the character has the decimal digit property,    
+   
+    as specified in Chapter 4 of the Unicode Standard, the value of that digit is represented    
+   
+    with an integer value in this field</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">7</th>   
+   
+    <td VALIGN="top">Digit value</td>   
+   
+    <td VALIGN="top">normative</td>   
+   
+    <td VALIGN="top">This is a numeric field. If the character represents a digit, not    
+   
+    necessarily a decimal digit, the value is here. This covers digits which do not form    
+   
+    decimal radix forms, such as the compatibility superscript digits</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">8</th>   
+   
+    <td VALIGN="top">Numeric value</td>   
+   
+    <td VALIGN="top">normative</td>   
+   
+    <td VALIGN="top">This is a numeric field. If the character has the numeric property, as    
+   
+    specified in Chapter 4 of the Unicode Standard, the value of that character is represented    
+   
+    with an integer or rational number in this field. This includes fractions as, e.g.,    
+   
+    &quot;1/5&quot; for U+2155 VULGAR FRACTION ONE FIFTH Also included are numerical values    
+   
+    for compatibility characters such as circled numbers.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">8</th>   
+   
+    <td VALIGN="top">Mirrored</td>   
+   
+    <td VALIGN="top">normative</td>   
+   
+    <td VALIGN="top">If the character has been identified as a &quot;mirrored&quot; character    
+   
+    in bidirectional text, this field has the value &quot;Y&quot;; otherwise &quot;N&quot;.    
+   
+    The list of mirrored characters is also printed in Chapter 4 of the Unicode Standard.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">10</th>   
+   
+    <td VALIGN="top">Unicode 1.0 Name</td>   
+   
+    <td VALIGN="top">informative</td>   
+   
+    <td VALIGN="top">This is the old name as published in Unicode 1.0. This name is only    
+   
+    provided when it is significantly different from the Unicode 3.0 name for the character.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">11</th>   
+   
+    <td VALIGN="top">10646 comment field</td>   
+   
+    <td VALIGN="top">informative</td>   
+   
+    <td VALIGN="top">This is the ISO 10646 comment field. It is in parantheses in the 10646    
+   
+    names list.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">12</th>   
+   
+    <td VALIGN="top"><a HREF="#Case Mappings">Uppercase Mapping</a></td>   
+   
+    <td VALIGN="top">informative</td>   
+   
+    <td VALIGN="top">Upper case equivalent mapping. If a character is part of an alphabet with    
+   
+    case distinctions, and has an upper case equivalent, then the upper case equivalent is in    
+   
+    this field. See the explanation below on case distinctions. These mappings are always    
+   
+    one-to-one, not one-to-many or many-to-one. This field is informative.</td>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <th VALIGN="top">13</th>   
+   
+    <td VALIGN="top"><a HREF="#Case Mappings">Lowercase Mapping</a></td>   
+   
+    <td VALIGN="top">informative</td>   
+   
+    <td VALIGN="top">Similar to Uppercase mapping</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <th VALIGN="top">14</th>    
+    
+    <td VALIGN="top"><a HREF="#Case Mappings">Titlecase Mapping</a></td>   
+   
+    <td VALIGN="top">informative</td>   
+   
+    <td VALIGN="top">Similar to Uppercase mapping</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<h3><a NAME="General Category"></a>General Category</h3>    
+    
+    
+    
+<p>The values in this field are abbreviations for the following. Some of the values are     
+    
+normative, and some are informative. For more information, see the Unicode Standard.</p>    
+    
+    
+    
+<p><b>Note:</b> the standard does not assign information to control characters (except for     
+    
+certain cases in the Bidirectional Algorithm). Implementations will generally also assign     
+    
+categories to certain control characters, notably CR and LF, according to platform     
+    
+conventions.</p>    
+    
+    
+    
+<h4>Normative Categories</h4>    
+    
+    
+    
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
+    
+  <tr>    
+    
+    <th><p ALIGN="LEFT">Abbr.</th>    
+    
+    <th><p ALIGN="LEFT">Description</th>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Lu</td>    
+    
+    <td>Letter, Uppercase</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Ll</td>    
+    
+    <td>Letter, Lowercase</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Lt</td>    
+    
+    <td>Letter, Titlecase</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Mn</td>    
+    
+    <td>Mark, Non-Spacing</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Mc</td>    
+    
+    <td>Mark, Spacing Combining</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Me</td>    
+    
+    <td>Mark, Enclosing</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Nd</td>    
+    
+    <td>Number, Decimal Digit</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Nl</td>    
+    
+    <td>Number, Letter</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">No</td>    
+    
+    <td>Number, Other</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Zs</td>    
+    
+    <td>Separator, Space</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Zl</td>    
+    
+    <td>Separator, Line</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Zp</td>    
+    
+    <td>Separator, Paragraph</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Cc</td>    
+    
+    <td>Other, Control</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Cf</td>    
+    
+    <td>Other, Format</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Cs</td>    
+    
+    <td>Other, Surrogate</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Co</td>    
+    
+    <td>Other, Private Use</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Cn</td>    
+    
+    <td>Other, Not Assigned (no characters in the file have this property)</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<h4>Informative Categories</h4>    
+    
+    
+    
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
+    
+  <tr>    
+    
+    <th><p ALIGN="LEFT">Abbr.</th>    
+    
+    <th><p ALIGN="LEFT">Description</th>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Lm</td>    
+    
+    <td>Letter, Modifier</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Lo</td>    
+    
+    <td>Letter, Other</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Pc</td>    
+    
+    <td>Punctuation, Connector</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Pd</td>    
+    
+    <td>Punctuation, Dash</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Ps</td>    
+    
+    <td>Punctuation, Open</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Pe</td>    
+    
+    <td>Punctuation, Close</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Pi</td>    
+    
+    <td>Punctuation, Initial quote (may behave like Ps or Pe depending on usage)</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Pf</td>    
+    
+    <td>Punctuation, Final quote (may behave like Ps or Pe depending on usage)</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Po</td>    
+    
+    <td>Punctuation, Other</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Sm</td>    
+    
+    <td>Symbol, Math</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Sc</td>    
+    
+    <td>Symbol, Currency</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">Sk</td>    
+    
+    <td>Symbol, Modifier</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">So</td>    
+    
+    <td>Symbol, Other</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<h3><a NAME="Bidirectional Category"></a>Bidirectional Category</h3>    
+    
+    
+    
+<p>Please refer to Chapter 3 for an explanation of the algorithm for Bidirectional     
+    
+Behavior and an explanation of the significance of these categories. An up-to-date version     
+    
+can be found on <a HREF="http://www.unicode.org/unicode/reports/tr9/">Unicode Technical     
+    
+Report #9: The Bidirectional Algorithm</a>. These values are normative.</p>    
+    
+    
+    
+<table BORDER="0" CELLPADDING="2">    
+    
+  <tr>    
+    
+    <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Type</th>    
+    
+    <th VALIGN="TOP" ALIGN="LEFT"><p ALIGN="LEFT">Description</th>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>L</b></td>    
+    
+    <td VALIGN="TOP">Left-to-Right</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>LRE</b></td>    
+    
+    <td VALIGN="TOP">Left-to-Right Embedding</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>LRO</b></td>    
+    
+    <td VALIGN="TOP">Left-to-Right Override</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>R</b></td>    
+    
+    <td VALIGN="TOP">Right-to-Left</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>AL</b></td>    
+    
+    <td VALIGN="TOP">Right-to-Left Arabic</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>RLE</b></td>    
+    
+    <td VALIGN="TOP">Right-to-Left Embedding</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>RLO</b></td>    
+    
+    <td VALIGN="TOP">Right-to-Left Override</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>PDF</b></td>    
+    
+    <td VALIGN="TOP">Pop Directional Format</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>EN</b></td>    
+    
+    <td VALIGN="TOP">European Number</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>ES</b></td>    
+    
+    <td VALIGN="TOP">European Number Separator</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>ET</b></td>    
+    
+    <td VALIGN="TOP">European Number Terminator</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>AN</b></td>    
+    
+    <td VALIGN="TOP">Arabic Number</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>CS</b></td>    
+    
+    <td VALIGN="TOP">Common Number Separator</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>NSM</b></td>    
+    
+    <td VALIGN="TOP">Non-Spacing Mark</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>BN</b></td>    
+    
+    <td VALIGN="TOP">Boundary Neutral</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>B</b></td>    
+    
+    <td VALIGN="TOP">Paragraph Separator</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>S</b></td>    
+    
+    <td VALIGN="TOP">Segment Separator</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>WS</b></td>    
+    
+    <td VALIGN="TOP">Whitespace</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td VALIGN="TOP"><b>ON</b></td>    
+    
+    <td VALIGN="TOP">Other Neutrals</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<h3><a NAME="Character Decomposition"></a>Character Decomposition Mapping</h3>   
+   
+   
+   
+<p>The decomposition is a normative property of a character. The tags supplied with    
+   
+certain decomposition mappings generally indicate formatting information. Where no such    
+   
+tag is given, the mapping is designated as canonical. Conversely, the presence of a    
+   
+formatting tag also indicates that the mapping is a compatibility mapping and not a    
+   
+canonical mapping. In the absence of other formatting information in a compatibility    
+   
+mapping, the tag is used to distinguish it from canonical mappings.</p>   
+   
+   
+   
+<p>In some instances a canonical mapping or a compatibility mapping may consist of a    
+   
+single character. For a canonical mapping, this indicates that the character is a    
+   
+canonical equivalent of another single character. For a compatibility mapping, this    
+   
+indicates that the character is a compatibility equivalent of another single character.    
+   
+The compatibility formatting tags used are:</p>   
+   
+   
+   
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">   
+   
+  <tr>   
+   
+    <th>Tag</th>   
+   
+    <th><p ALIGN="LEFT">Description</th>   
+   
+  </tr>   
+   
+  <tr>   
+   
+    <td ALIGN="CENTER">&lt;font&gt;&nbsp;&nbsp;</td>   
+   
+    <td>A font variant (e.g. a blackletter form).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;noBreak&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A no-break version of a space or hyphen.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;initial&gt;&nbsp;&nbsp;</td>    
+    
+    <td>An initial presentation form (Arabic).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;medial&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A medial presentation form (Arabic).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;final&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A final presentation form (Arabic).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;isolated&gt;&nbsp;&nbsp;</td>    
+    
+    <td>An isolated presentation form (Arabic).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;circle&gt;&nbsp;&nbsp;</td>    
+    
+    <td>An encircled form.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;super&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A superscript form.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;sub&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A subscript form.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;vertical&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A vertical layout presentation form.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;wide&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A wide (or zenkaku) compatibility character.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;narrow&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A narrow (or hankaku) compatibility character.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;small&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A small variant form (CNS compatibility).</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;square&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A CJK squared font variant.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;fraction&gt;&nbsp;&nbsp;</td>    
+    
+    <td>A vulgar fraction form.</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="CENTER">&lt;compat&gt;&nbsp;&nbsp;</td>    
+    
+    <td>Otherwise unspecified compatibility character.</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<p><b>Reminder: </b>There is a difference between decomposition and decomposition mapping.     
+    
+The decomposition mappings are defined in the UnicodeData, while the decomposition (also     
+    
+termed &quot;full decomposition&quot;) is defined in Chapter 3 to use those mappings  
+<i>    
+   
+recursively.</i>    
+   
+   
+   
+<ul>   
+   
+  <li>The canonical decomposition is formed by recursively applying the canonical mappings,    
+   
+    then applying the canonical reordering algorithm. </li>   
+   
+  <li>The compatibility decomposition is formed by recursively applying the canonical <em>and</em>    
+   
+    compatibility mappings, then applying the canonical reordering algorithm. </li>   
+   
+</ul>   
+   
+   
+   
+<h3><a NAME="Canonical Combining Classes"></a>Canonical Combining Classes</h3>    
+    
+    
+    
+<table BORDER="0" CELLSPACING="2" CELLPADDING="0">    
+    
+  <tr>    
+    
+    <th><p ALIGN="LEFT">Value</th>    
+    
+    <th><p ALIGN="LEFT">Description</th>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">0:</td>    
+    
+    <td>Spacing, split, enclosing, reordrant, and Tibetan subjoined</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">1:</td>    
+    
+    <td>Overlays and interior</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">7:</td>    
+    
+    <td>Nuktas</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">8:</td>    
+    
+    <td>Hiragana/Katakana voicing marks</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">9:</td>    
+    
+    <td>Viramas</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">10:</td>    
+    
+    <td>Start of fixed position classes</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">199:</td>    
+    
+    <td>End of fixed position classes</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">200:</td>    
+    
+    <td>Below left attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">202:</td>    
+    
+    <td>Below attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">204:</td>    
+    
+    <td>Below right attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">208:</td>    
+    
+    <td>Left attached (reordrant around single base character)</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">210:</td>    
+    
+    <td>Right attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">212:</td>    
+    
+    <td>Above left attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">214:</td>    
+    
+    <td>Above attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">216:</td>    
+    
+    <td>Above right attached</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">218:</td>    
+    
+    <td>Below left</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">220:</td>    
+    
+    <td>Below</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">222:</td>    
+    
+    <td>Below right</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">224:</td>    
+    
+    <td>Left (reordrant around single base character)</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">226:</td>    
+    
+    <td>Right</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">228:</td>    
+    
+    <td>Above left</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">230:</td>    
+    
+    <td>Above</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">232:</td>    
+    
+    <td>Above right</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">233:</td>    
+    
+    <td>Double below</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">234:</td>    
+    
+    <td>Double above</td>    
+    
+  </tr>    
+    
+  <tr>    
+    
+    <td ALIGN="RIGHT">240:</td>    
+    
+    <td>Below (iota subscript)</td>    
+    
+  </tr>    
+    
+</table>    
+    
+    
+    
+<p><strong>Note: </strong>some of the combining classes in this list do not currently have     
+    
+members but are specified here for completeness.</p>    
+    
+    
+    
+<h3><a NAME="Decompositions and Normalization"></a>Decompositions and Normalization</h3>    
+    
+    
+    
+<p>Decomposition is specified in Chapter 3. <a href="http://www.unicode.org/unicode/reports/tr15/"><i>Unicode Technical Report #15:     
+    
+Normalization Forms</i></a> specifies the interaction between decomposition and normalization. The     
+    
+most up-to-date version is found on <a HREF="http://www.unicode.org/unicode/reports/tr15/">http://www.unicode.org/unicode/reports/tr15/</a>.     
+    
+That report specifies how the decompositions defined in UnicodeData.txt are used to derive     
+    
+normalized forms of Unicode text.</p>    
+    
+    
+    
+<p>Note that as of the 2.1.9 update of the Unicode Character Database, the decompositions     
+    
+in the UnicodeData.txt file can be used to recursively derive the full decomposition in     
+    
+canonical order, without the need to separately apply canonical reordering. However,     
+    
+canonical reordering of combining character sequences must still be applied in     
+    
+decomposition when normalizing source text which contains any combining marks.</p>    
+    
+    
+    
+<h3><a NAME="Case Mappings"></a>Case Mappings</h3>    
+    
+    
+    
+<p>The case mapping is an informative, default mapping. Case itself, on the other hand,     
+    
+has normative status. Thus, for example, 0041 LATIN CAPITAL LETTER A is normatively     
+    
+uppercase, but its lowercase mapping the 0061 LATIN SMALL LETTER A is informative. The     
+    
+reason for this is that case can be considered to be an inherent property of a particular     
+    
+character (and is usually, but not always, derivable from the presence of the terms     
+    
+&quot;CAPITAL&quot; or &quot;SMALL&quot; in the character name), but case mappings between     
+    
+characters are occasionally influenced by local conventions. For example, certain     
+    
+languages, such as Turkish, German, French, or Greek may have small deviations from the     
+    
+default mappings listed in UnicodeData.</p>    
+    
+    
+    
+<p>In addition to uppercase and lowercase, because of the inclusion of certain composite     
+    
+characters for compatibility, such as 01F1 LATIN CAPITAL LETTER DZ, there is a third case,     
+    
+called <i>titlecase</i>, which is used where the first letter of a word is to be     
+    
+capitalized (e.g. UPPERCASE, Titlecase, lowercase). An example of such a titlecase letter     
+    
+is 01F2 LATIN CAPITAL LETTER D WITH SMALL LETTER Z.</p>    
+    
+    
+    
+<p>The uppercase, titlecase and lowercase fields are only included for characters that     
+    
+have a single corresponding character of that type. Composite characters (such as     
+    
+&quot;339D SQUARE CM&quot;) that do not have a single corresponding character of that type     
+    
+can be cased by decomposition.</p>    
+    
+    
+    
+<p>For compatibility with existing parsers, UnicodeData only contains case mappings for     
+    
+characters where they are one-to-one mappings; it also omits information about     
+    
+context-sensitive case mappings. Information about these special cases can be found in a     
+    
+separate data file, SpecialCasing.txt,     
+    
+which has been added starting with the 2.1.8 update to the Unicode data files.     
+    
+SpecialCasing.txt contains additional informative case mappings that are either not     
+    
+one-to-one or which are context-sensitive.</p>    
+    
+    
+    
+<h2><a NAME="Property Invariants"></a>Property Invariants</h2>    
+    
+    
+    
+<p>Values in UnicodeData.txt are subject to correction as errors are found; however, some     
+    
+characteristics of the categories themselves can be considered invariants. Applications     
+    
+may wish to take these invariants into account when choosing how to implement character     
+    
+properties. The following is a partial list of known invariants for the Unicode Character     
+    
+Database.</p>    
+    
+    
+    
+<h4>Database Fields</h4>    
+    
+    
+    
+<ul>    
+    
+  <li>The number of fields in UnicodeData.txt is fixed. </li>    
+    
+  <li>The order of the fields is also fixed. <ul>    
+    
+      <li>Any additional information about character properties to be added in the future will     
+    
+        appear in separate data tables, rather than being added on to the existing table or by     
+    
+        subdivision or reinterpretation of existing fields. </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+</ul>    
+    
+    
+    
+<h4>General Category</h4>    
+    
+    
+    
+<ul>    
+    
+  <li>There will never be more than 32 General Category values. <ul>    
+    
+      <li>It is very unlikely that the Unicode Technical Committee will subdivide the General     
+    
+        Category partition any further, since that can cause implementations to misbehave. Because     
+    
+        the General Category is limited to 32 values, 5 bits can be used to represent the     
+    
+        information, and a 32-bit integer can be used as a bitmask to represent arbitrary sets of     
+    
+        categories. </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+</ul>    
+    
+    
+    
+<h4>Combining Classes</h4>    
+    
+    
+    
+<ul>    
+    
+  <li>Combining classes are limited to the values 0 to 255. <ul>    
+    
+      <li>In practice, there are far fewer than 256 values used. Implementations may take     
+    
+        advantage of this fact for compression, since only the ordering of the non-zero values     
+    
+        matters for the Canonical Reordering Algorithm. It is possible for up to 256 values to be     
+    
+        used in the future; however, UTC decisions in the future may restrict the number of values     
+    
+        to 128, since this has implementation advantages. [Signed bytes can be used without     
+    
+        widening to ints in Java, for example.] </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+  <li>All characters other than those of General Category M* have the combining class 0. <ul>    
+    
+      <li>Currently, all characters other than those of General Category Mn have the value 0.     
+    
+        However, some characters of General Category Me or Mc may be given non-zero values in the     
+    
+        future. </li>    
+    
+      <li>The precise values above the value 0 are not invariant--only the relative ordering is     
+    
+        considered normative. For example, it is not guaranteed in future versions that the class     
+    
+        of U+05B4 will be precisely 14. </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+</ul>    
+    
+    
+    
+<h4>Case</h4>    
+    
+    
+    
+<ul>    
+    
+  <li>Characters of type Lu, Lt, or Ll are called <i>cased</i>. All characters with an Upper,     
+    
+    Lower, or Titlecase mapping are cased characters. <ul>    
+    
+      <li>However, characters with the General Categories of Lu, Ll, or Lt may not always have     
+    
+        case mappings, and case mappings may vary by locale. (See     
+    
+        ftp://ftp.unicode.org/Public/UNIDATA/SpecialCasing.txt). </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+</ul>    
+    
+    
+    
+<h4>Canonical Decomposition</h4>    
+    
+    
+    
+<ul>    
+    
+  <li>Canonical mappings are always in canonical order. </li>    
+    
+  <li>Canonical mappings have only the first of a pair possibly further decomposing. </li>    
+    
+  <li>Canonical decompositions are &quot;transparent&quot; to other character data: <ul>    
+    
+      <li><tt>BIDI(a) = BIDI(principal(canonicalDecomposition(a))</tt> </li>    
+    
+      <li><tt>Category(a) = Category(principal(canonicalDecomposition(a))</tt> </li>    
+    
+      <li><tt>CombiningClass(a) = CombiningClass(principal(canonicalDecomposition(a))</tt><br>    
+    
+        where principal(a) is the first character not of type Mn, or the first character if all     
+    
+        characters are of type Mn. </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+  <li>However, because there are sometimes missing case pairs, and because of some legacy     
+    
+    characters, it is only generally true that: <ul>    
+    
+      <li><tt>upper(canonicalDecomposition(a)) = canonicalDecomposition(upper(a))</tt> </li>    
+    
+      <li><tt>lower(canonicalDecomposition(a)) = canonicalDecomposition(lower(a))</tt> </li>    
+    
+      <li><tt>title(canonicalDecomposition(a)) = canonicalDecomposition(title(a))</tt> </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+</ul>    
+    
+    
+    
+<h2><a NAME="Modification History"></a>Modification History</h2>    
+    
+    
+    
+<p>This section provides a summary of the changes between update versions of the Unicode     
+    
+Standard.</p>    
+    
+    
+    
+<h3><a href="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 3.0.0"> Unicode 3.0.0</a></h3>    
+    
+    
+    
+<p>Modifications made for Version 3.0.0 of UnicodeData.txt include many new characters and     
+    
+a number of property changes. These are summarized in Appendex D of <em>The Unicode     
+    
+Standard, Version 3.0.</em></p>    
+    
+    
+    
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.9">Unicode 2.1.9</a> </h3>    
+    
+    
+    
+<p>Modifications made for Version 2.1.9 of UnicodeData.txt include:     
+    
+    
+    
+<ul>    
+    
+  <li>Corrected combining class for U+05AE HEBREW ACCENT ZINOR. </li>    
+    
+  <li>Corrected combining class for U+20E1 COMBINING LEFT RIGHT ARROW ABOVE </li>    
+    
+  <li>Corrected combining class for U+0F35 and U+0F37 to 220. </li>    
+    
+  <li>Corrected combining class for U+0F71 to 129. </li>    
+    
+  <li>Added a decomposition for U+0F0C TIBETAN MARK DELIMITER TSHEG BSTAR. </li>    
+    
+  <li>Added&nbsp; decompositions for several Greek symbol letters: U+03D0..U+03D2, U+03D5,     
+    
+    U+03D6, U+03F0..U+03F2. </li>    
+    
+  <li>Removed&nbsp; decompositions from the conjoining jamo block: U+1100..U+11F8. </li>    
+    
+  <li>Changes to decomposition mappings for some Tibetan vowels for consistency in     
+    
+    normalization. (U+0F71, U+0F73, U+0F77, U+0F79, U+0F81) </li>    
+    
+  <li>Updated the decomposition mappings for several Vietnamese characters with two diacritics     
+    
+    (U+1EAC, U+1EAD, U+1EB6, U+1EB7, U+1EC6, U+1EC7, U+1ED8, U+1ED9), so that the recursive     
+    
+    decomposition can be generated directly in canonically reordered form (not a normative     
+    
+    change). </li>    
+    
+  <li>Updated the decomposition mappings for several Arabic compatibility characters involving     
+    
+    shadda (U+FC5E..U+FC62, U+FCF2..U+FCF4), and two Latin characters (U+1E1C, U+1E1D), so     
+    
+    that the decompositions are generated directly in canonically reordered form (not a     
+    
+    normative change). </li>    
+    
+  <li>Changed BIDI category for: U+00A0 NO-BREAK SPACE, U+2007 FIGURE SPACE, U+2028 LINE     
+    
+    SEPARATOR. </li>    
+    
+  <li>Changed BIDI category for extenders of General Category Lm: U+3005, U+3021..U+3035,     
+    
+    U+FF9E, U+FF9F. </li>    
+    
+  <li>Changed General Category and BIDI category for the Greek numeral signs: U+0374, U+0375. </li>    
+    
+  <li>Corrected General Category for U+FFE8 HALFWIDTH FORMS LIGHT VERTICAL. </li>    
+    
+  <li>Added Unicode 1.0 names for many Tibetan characters (informative). </li>    
+    
+</ul>    
+    
+    
+    
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.8">Unicode 2.1.8</a> </h3>    
+    
+    
+    
+<p>Modifications made for Version 2.1.8 of UnicodeData.txt include:     
+    
+    
+    
+<ul>    
+    
+  <li>Added combining class 240 for U+0345 COMBINING GREEK YPOGEGRAMMENI so that     
+    
+    decompositions involving iota subscript are derivable directly in canonically reordered     
+    
+    form; this also has a bearing on simplification of casing of polytonic Greek. </li>    
+    
+  <li>Changes in decompositions related to Greek tonos. These result from the clarification     
+    
+    that monotonic Greek &quot;tonos&quot; should be equated with U+0301 COMBINING ACUTE,     
+    
+    rather than with U+030D COMBINING VERTICAL LINE ABOVE. (All Greek characters in the Greek     
+    
+    block involving &quot;tonos&quot;; some Greek characters in the polytonic Greek in the     
+    
+    1FXX block.) </li>    
+    
+  <li>Changed decompositions involving dialytika tonos. (U+0390, U+03B0) </li>    
+    
+  <li>Changed ternary decompositions to binary. (U+0CCB, U+FB2C, U+FB2D) These changes     
+    
+    simplify normalization. </li>    
+    
+  <li>Removed canonical decomposition for Latin Candrabindu. (U+0310) </li>    
+    
+  <li>Corrected error in canonical decomposition for U+1FF4. </li>    
+    
+  <li>Added compatibility decompositions to clarify collation tables. (U+2100, U+2101, U+2105,     
+    
+    U+2106, U+1E9A) </li>    
+    
+  <li>A series of general category changes to assist the convergence of of Unicode definition     
+    
+    of identifier with ISO TR 10176: <ul>    
+    
+      <li>So &gt; Lo: U+0950, U+0AD0, U+0F00, U+0F88..U+0F8B </li>    
+    
+      <li>Po &gt; Lo: U+0E2F, U+0EAF, U+3006 </li>    
+    
+      <li>Lm &gt; Sk: U+309B, U+309C </li>    
+    
+      <li>Po &gt; Pc: U+30FB, U+FF65 </li>    
+    
+      <li>Ps/Pe &gt; Mn: U+0F3E, U+0F3F </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+  <li>A series of bidi property changes for consistency. <ul>    
+    
+      <li>L &gt; ET: U+09F2, U+09F3 </li>    
+    
+      <li>ON &gt; L: U+3007 </li>    
+    
+      <li>L &gt; ON: U+0F3A..U+0F3D, U+037E, U+0387 </li>    
+    
+    </ul>    
+    
+  </li>    
+    
+  <li>Add case mapping: U+01A6 &lt;-&gt; U+0280 </li>    
+    
+  <li>Updated symmetric swapping value for guillemets: U+00AB, U+00BB, U+2039, U+203A. </li>    
+    
+  <li>Changes to combining class values. Most Indic fixed position class non-spacing marks     
+    
+    were changed to combining class 0. This fixes some inconsistencies in how canonical     
+    
+    reordering would apply to Indic scripts, including Tibetan. Indic interacting top/bottom     
+    
+    fixed position classes were merged into single (non-zero) classes as part of this change.     
+    
+    Tibetan subjoined consonants are changed from combining class 6 to combining class 0. Thai     
+    
+    pinthu (U+0E3A) moved to combining class 9. Moved two Devanagari stress marks into generic     
+    
+    above and below combining classes (U+0951, U+0952). </li>    
+    
+  <li>Corrected placement of semicolon near symmetric swapping field. (U+FA0E, etc., scattered     
+    
+    positions to U+FA29) </li>    
+    
+</ul>    
+    
+    
+    
+<h3>Version 2.1.7</h3>    
+    
+    
+    
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
+    
+    
+    
+<h3>Version 2.1.6</h3>    
+    
+    
+    
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
+    
+    
+    
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.5">Unicode 2.1.5</a> </h3>    
+    
+    
+    
+<p>Modifications made for Version 2.1.5 of UnicodeData.txt include:     
+    
+    
+    
+<ul>    
+    
+  <li>Changed decomposition for U+FF9E and U+FF9F so that correct collation weighting will     
+    
+    automatically result from the canonical equivalences. </li>    
+    
+  <li>Removed canonical decompositions for U+04D4, U+04D5, U+04D8, U+04D9, U+04E0, U+04E1,     
+    
+    U+04E8, U+04E9 (the implication being that no canonical equivalence is claimed between     
+    
+    these 8 characters and similar Latin letters), and updated 4 canonical decompositions for     
+    
+    U+04DB, U+04DC, U+04EA, U+04EB to reflect the implied difference in the base character. </li>    
+    
+  <li>Added Pi, and Pf categories and assigned the relevant quotation marks to those     
+    
+    categories, based on the Unicode Technical Corrigendum on Quotation Characters. </li>    
+    
+  <li>Updating of many bidi properties, following the advice of the ad hoc committee on bidi,     
+    
+    and to make the bidi properties of compatibility characters more consistent. </li>    
+    
+  <li>Changed category of several Tibetan characters: U+0F3E, U+0F3F, U+0F88..U+0F8B to make     
+    
+    them non-combining, reflecting the combined opinion of Tibetan experts. </li>    
+    
+  <li>Added case mapping for U+03F2. </li>    
+    
+  <li>Corrected case mapping for U+0275. </li>    
+    
+  <li>Added titlecase mappings for U+03D0, U+03D1, U+03D5, U+03D6, U+03F0.. U+03F2. </li>    
+    
+  <li>Corrected compatibility label for U+2121. </li>    
+    
+  <li>Add specific entries for all the CJK compatibility ideographs, U+F900..U+FA2D, so the     
+    
+    canonical decomposition for each (the URO character it is equivalent to) can be carried in     
+    
+    the database. </li>    
+    
+</ul>    
+    
+    
+    
+<h3>Version 2.1.4</h3>    
+    
+    
+    
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
+    
+    
+    
+<h3>Version 2.1.3</h3>    
+    
+    
+    
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
+    
+    
+    
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.1.2">Unicode 2.1.2</a> </h3>    
+    
+    
+    
+<p>Modifications made in updating UnicodeData.txt to Version 2.1.2 for the Unicode     
+    
+Standard, Version 2.1 (from Version 2.0) include:     
+    
+    
+    
+<ul>    
+    
+  <li>Added two characters (U+20AC and U+FFFC). </li>    
+    
+  <li>Amended bidi properties for U+0026, U+002E, U+0040, U+2007. </li>    
+    
+  <li>Corrected case mappings for U+018E, U+019F, U+01DD, U+0258, U+0275, U+03C2, U+1E9B. </li>    
+    
+  <li>Changed combining order class for U+0F71. </li>    
+    
+  <li>Corrected canonical decompositions for U+0F73, U+1FBE. </li>    
+    
+  <li>Changed decomposition for U+FB1F from compatibility to canonical. </li>    
+    
+  <li>Added compatibility decompositions for U+FBE8, U+FBE9, U+FBF9..U+FBFB. </li>    
+    
+  <li>Corrected compatibility decompositions for U+2469, U+246A, U+3358. </li>    
+    
+</ul>    
+    
+    
+    
+<h3>Version 2.1.1</h3>    
+    
+    
+    
+<p><i>This version was for internal change tracking only, and never publicly released.</i></p>    
+    
+    
+    
+<h3><a HREF="http://www.unicode.org/unicode/standard/versions/enumeratedversions.html#Unicode 2.0.0">Unicode 2.0.0</a> </h3>    
+    
+    
+    
+<p>The modifications made in updating UnicodeData.txt for the Unicode     
+    
+Standard, Version 2.0 include:     
+    
+    
+    
+<ul>    
+    
+  <li>Fixed decompositions with TONOS to use correct NSM: 030D. </li>    
+    
+  <li>Removed old Hangul Syllables; mapping to new characters are in a separate table. </li>    
+    
+  <li>Marked compatibility decompositions with additional tags. </li>    
+    
+  <li>Changed old tag names for clarity. </li>    
+    
+  <li>Revision of decompositions to use first-level decomposition, instead of maximal     
+    
+    decomposition. </li>    
+    
+  <li>Correction of all known errors in decompositions from earlier versions. </li>    
+    
+  <li>Added control code names (as old Unicode names). </li>    
+    
+  <li>Added Hangul Jamo decompositions. </li>    
+    
+  <li>Added Number category to match properties list in book. </li>    
+    
+  <li>Fixed categories of Koranic Arabic marks. </li>    
+    
+  <li>Fixed categories of precomposed characters to match decomposition where possible. </li>    
+    
+  <li>Added Hebrew cantillation marks and the Tibetan script. </li>    
+    
+  <li>Added place holders for ranges such as CJK Ideographic Area and the Private Use Area. </li>    
+    
+  <li>Added categories Me, Sk, Pc, Nl, Cs, Cf, and rectified a number of mistakes in the     
+    
+    database. </li>    
+    
+</ul>    
+    
+</body>    
+    
+</html>    
+    
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/srctools/tranasm/tranasm	Wed Jun 30 11:35:58 2010 +0800
@@ -0,0 +1,4 @@
+#!/bin/sh
+PATH=.:$PATH
+perl -S tranasm.pl $@
+